Forráskód Böngészése

职位体系变更记录

lizhenhao 2 éve
szülő
commit
c1e59d0af5
17 módosított fájl, 741 hozzáadás és 22 törlés
  1. 11 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/annotation/ForUpdate.java
  2. 137 12
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/JobPositionController.java
  3. 57 4
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/PositionCategoryController.java
  4. 87 5
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/PositionController.java
  5. 78 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/PositionLogController.java
  6. 9 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/JobPosition.java
  7. 4 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/Position.java
  8. 2 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/PositionCategory.java
  9. 62 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/PositionLog.java
  10. 38 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/enums/PositionTypeEnum.java
  11. 16 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/mapper/PositionLogMapper.java
  12. 63 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/mapper/xml/PositionLogMapper.xml
  13. 54 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/service/PositionLogService.java
  14. 66 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/service/dto/PositionLogDTO.java
  15. 13 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/service/mapstruct/PositionLogWrapper.java
  16. 40 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/utils/BeanUtils.java
  17. 4 1
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/constant/enums/LogTypeEnum.java

+ 11 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/annotation/ForUpdate.java

@@ -0,0 +1,11 @@
+package com.jeeplus.test.jobPosion.annotation;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ForUpdate {
+    //需要记录变化的字段,需添加注解@ForUpdate。例:@ForUpdate(fieldName = "姓名")
+    String fieldName() default "";
+}

+ 137 - 12
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/JobPositionController.java

@@ -12,14 +12,19 @@ import com.jeeplus.core.excel.ExcelOptions;
 import com.jeeplus.core.excel.ExportMode;
 import com.jeeplus.core.excel.utils.EasyPoiUtil;
 import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.sys.constant.enums.LogTypeEnum;
 import com.jeeplus.sys.domain.Office;
 import com.jeeplus.sys.service.OfficeService;
 import com.jeeplus.test.jobPosion.domain.JobPosition;
 import com.jeeplus.test.jobPosion.domain.Position;
+import com.jeeplus.test.jobPosion.enums.PositionTypeEnum;
 import com.jeeplus.test.jobPosion.service.JobPositionService;
+import com.jeeplus.test.jobPosion.service.PositionLogService;
 import com.jeeplus.test.jobPosion.service.PositionService;
 import com.jeeplus.test.jobPosion.service.dto.JobPositionDTO;
+import com.jeeplus.test.jobPosion.service.dto.PositionLogDTO;
 import com.jeeplus.test.jobPosion.service.mapstruct.JobPositionWrapper;
+import com.jeeplus.test.jobPosion.utils.BeanUtils;
 import com.jeeplus.test.projectRecords.constant.enums.ProjectStatusEnum;
 import com.jeeplus.test.projectRecords.constant.enums.ProjectTypeEnum;
 import com.jeeplus.test.projectRecords.constant.enums.YesOrNoEnum;
@@ -69,6 +74,9 @@ public class JobPositionController {
     @Autowired
     private OfficeService officeService;
 
+    @Autowired
+    private PositionLogService positionLogService;
+
     /**
      * 查询职位列表
      * @param jobPosition
@@ -103,15 +111,79 @@ public class JobPositionController {
      * @param jobPositionDTO
      * @return
      */
-    @ApiLog("添加职位")
+    @ApiLog(value = "修改/新增职位", type = LogTypeEnum.SAVE)
     @PreAuthorize("hasAnyAuthority('job:job_position:save','job:job_position:edit')")
     @PostMapping("save")
-    public ResponseEntity save(@Valid @RequestBody JobPositionDTO jobPositionDTO) {
+    public ResponseEntity save(@Valid @RequestBody JobPositionDTO jobPositionDTO,HttpServletRequest request) {
         JobPosition jobPosition = JobPositionWrapper.INSTANCE.toEntity(jobPositionDTO);
-        if(StrUtil.isEmpty(jobPosition.getId())){
+        JobPosition oldPosition = null;
+        PositionLogDTO positionLogDTO = new PositionLogDTO();
+        if(StrUtil.isEmpty(jobPositionDTO.getId())){
             jobPosition.setUseFlag("1");
+            positionLogDTO.setType(PositionTypeEnum.JOB_POSITION.getValue());
+            positionLogDTO.setOperationType("新建职位");
+            positionLogDTO.setOperationContent("新建职位: "+jobPositionDTO.getName());
+        }else{
+            oldPosition = jobPositionService.getById(jobPosition.getId());
+            if(ObjectUtil.isNotEmpty(oldPosition)){
+                if(StrUtil.isNotEmpty(oldPosition.getPositionId())){
+                    Position byId = positionService.getById(oldPosition.getPositionId());
+                    if (ObjectUtil.isNotEmpty(byId)) {
+                        if(StrUtil.isNotEmpty(byId.getName())){
+                            oldPosition.setPositionId(byId.getName());
+                        }
+                    }
+                }
+                if(StrUtil.isNotEmpty(oldPosition.getOfficeId())){
+                    Office office = officeService.getById(oldPosition.getOfficeId());
+                    if (ObjectUtil.isNotEmpty(office)) {
+                        if(StrUtil.isNotEmpty(office.getName())){
+                            oldPosition.setOfficeId(office.getName());
+                        }
+                    }
+                }
+            }
+            positionLogDTO.setType(PositionTypeEnum.JOB_POSITION.getValue());
+            positionLogDTO.setOperationType("修改职位");
+        }
+        try{
+            jobPositionService.saveOrUpdate(jobPosition);
+        }catch (Exception e){
+            if (StrUtil.isNotEmpty(jobPosition.getId())){
+                String changedFields = BeanUtils.getChangedFields(jobPosition, new JobPosition());
+                positionLogDTO.setOperationContent(changedFields);
+            }
+            positionLogDTO.setOperationResult("失败");
+            positionLogService.saveLog(positionLogDTO,request);
+            return ResponseEntity.badRequest().body  ("职位保存失败");
         }
-        jobPositionService.saveOrUpdate(jobPosition);
+
+        if (StrUtil.isNotEmpty(jobPositionDTO.getId())){
+            JobPosition byId = jobPositionService.getById(jobPosition.getId());
+            if(ObjectUtil.isNotEmpty(byId)){
+                if(StrUtil.isNotEmpty(byId.getPositionId())){
+                    Position byId1 = positionService.getById(byId.getPositionId());
+                    if (ObjectUtil.isNotEmpty(byId1)) {
+                        if(StrUtil.isNotEmpty(byId1.getName())){
+                            byId.setPositionId(byId1.getName());
+                        }
+                    }
+                }
+                if(StrUtil.isNotEmpty(byId.getOfficeId())){
+                    Office office = officeService.getById(byId.getOfficeId());
+                    if (ObjectUtil.isNotEmpty(office)) {
+                        if(StrUtil.isNotEmpty(office.getName())){
+                            byId.setOfficeId(office.getName());
+                        }
+                    }
+                }
+            }
+            String changedFields = BeanUtils.getChangedFields(byId, oldPosition);
+            positionLogDTO.setOperationContent(changedFields);
+        }
+        positionLogDTO.setOperationResult("成功");
+        positionLogService.saveLog(positionLogDTO,request);
+
         return ResponseEntity.ok ("保存职位成功");
     }
 
@@ -120,12 +192,36 @@ public class JobPositionController {
      * @param ids
      * @return
      */
-    @ApiLog("删除职位")
+    @ApiLog(value = "删除职位", type = LogTypeEnum.SAVE)
     @PreAuthorize ("hasAuthority('job:job_position:del')")
     @DeleteMapping("delete")
-    public ResponseEntity delete(String ids) {
+    public ResponseEntity delete(String ids,HttpServletRequest request) {
+        List<PositionLogDTO> positionLogDTOList = new ArrayList<>();
+
         String idArray[] =ids.split(",");
-        jobPositionService.removeByIds (Lists.newArrayList (idArray));
+        List<JobPosition> jobPositions = jobPositionService.listByIds(Lists.newArrayList(idArray));
+        jobPositions.stream().forEach(item->{
+            PositionLogDTO positionLogDTO = new PositionLogDTO();
+            positionLogDTO.setType(PositionTypeEnum.JOB_POSITION.getValue());
+            positionLogDTO.setOperationType("删除职位");
+            positionLogDTO.setOperationContent("删除职位: "+item.getName());
+            positionLogDTOList.add(positionLogDTO);
+        });
+        try{
+            jobPositionService.removeByIds (Lists.newArrayList (idArray));
+        }catch (Exception e) {
+            positionLogDTOList.stream().forEach(item->{
+                item.setOperationResult("失败");
+            });
+            positionLogService.saveLogBatch(positionLogDTOList,request);
+            return ResponseEntity.badRequest().body  ("职位删除失败");
+        }
+
+        positionLogDTOList.stream().forEach(item->{
+            item.setOperationResult("成功");
+        });
+        positionLogService.saveLogBatch(positionLogDTOList,request);
+
         return ResponseEntity.ok ("删除职位成功");
     }
 
@@ -134,13 +230,42 @@ public class JobPositionController {
      * @param ids
      * @return
      */
-    @ApiLog("修改职位启动状态")
+    @ApiLog(value = "修改职位启用状态", type = LogTypeEnum.SAVE)
     @PreAuthorize ("hasAnyAuthority('job:job_position:del','job:job_position:edit','job:job_position:add')")
     @PostMapping("changeUseFlag/{useFlag}")
-    public ResponseEntity changeUseFlag(String ids,@PathVariable("useFlag") String useFlag) {
+    public ResponseEntity changeUseFlag(String ids,@PathVariable("useFlag") String useFlag,HttpServletRequest request) {
         String idArray[] =ids.split(",");
         ArrayList<String> strings = Lists.newArrayList(idArray);
-        jobPositionService.updateUseFlagById(strings,useFlag);
+
+        List<PositionLogDTO> positionLogDTOList = new ArrayList<>();
+
+        List<JobPosition> jobPositions = jobPositionService.listByIds(strings);
+        jobPositions.stream().forEach(item->{
+            PositionLogDTO positionLogDTO = new PositionLogDTO();
+            positionLogDTO.setType(PositionTypeEnum.JOB_POSITION.getValue());
+            positionLogDTO.setOperationType("修改职位启用状态");
+            if("1".equals(useFlag)){
+                positionLogDTO.setOperationContent("修改职位“"+item.getName()+"”的启用状态为:启用");
+            }else{
+                positionLogDTO.setOperationContent("修改职位“"+item.getName()+"”的启用状态为:停用");
+            }
+            positionLogDTOList.add(positionLogDTO);
+        });
+        try{
+            jobPositionService.updateUseFlagById(strings,useFlag);
+        }catch (Exception e){
+            positionLogDTOList.stream().forEach(item->{
+                item.setOperationResult("失败");
+            });
+            positionLogService.saveLogBatch(positionLogDTOList,request);
+            return ResponseEntity.badRequest().body  ("修改职位状态失败");
+        }
+
+        positionLogDTOList.stream().forEach(item->{
+            item.setOperationResult("成功");
+        });
+        positionLogService.saveLogBatch(positionLogDTOList,request);
+
         return ResponseEntity.ok ("修改职位状态成功");
     }
 
@@ -209,7 +334,7 @@ public class JobPositionController {
     @DemoMode
     @PreAuthorize("hasAnyAuthority('job:job_position:import')")
     @PostMapping("import")
-    @ApiOperation(value = "导入职位数据excel")
+    @ApiLog(value = "导入职位数据excel", type = LogTypeEnum.IMPORT)
     public ResponseEntity importFile(MultipartFile file) throws IOException{
 
         ArrayList<JobPosition> arrayList = new ArrayList<>();
@@ -366,7 +491,7 @@ public class JobPositionController {
      * @param response
      * @throws Exception
      */
-    @ApiLog("导出职位数据")
+    @ApiLog(value = "导出职位数据", type = LogTypeEnum.EXPORT)
     @PreAuthorize("hasAnyAuthority('job:job_position:export')")
     @GetMapping("export")
     @ApiOperation(value = "导出职位excel")

+ 57 - 4
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/PositionCategoryController.java

@@ -1,5 +1,6 @@
 package com.jeeplus.test.jobPosion.controller;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -7,17 +8,25 @@ import com.google.common.collect.Lists;
 import com.jeeplus.aop.logging.annotation.ApiLog;
 import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.test.jobPosion.domain.PositionCategory;
+import com.jeeplus.test.jobPosion.enums.PositionTypeEnum;
 import com.jeeplus.test.jobPosion.service.PositionCategoryService;
+import com.jeeplus.test.jobPosion.service.PositionLogService;
+import com.jeeplus.test.jobPosion.service.PositionService;
 import com.jeeplus.test.jobPosion.service.dto.PositionCategoryDTO;
+import com.jeeplus.test.jobPosion.service.dto.PositionLogDTO;
 import com.jeeplus.test.jobPosion.service.mapstruct.PositionCategoryWrapper;
 import com.jeeplus.test.projectRecords.domain.Project;
 import io.swagger.annotations.Api;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 @Api("职务分类管理")
 @RestController
@@ -27,6 +36,9 @@ public class PositionCategoryController {
     @Autowired
     private PositionCategoryService positionCategoryService;
 
+    @Autowired
+    private PositionLogService positionLogService;
+
     /**
      * 查询职务分类列表
      * @param positionCategory
@@ -65,9 +77,28 @@ public class PositionCategoryController {
     @ApiLog("添加职务分类")
     @PreAuthorize("hasAnyAuthority('job:position_category:save','job:position_category:edit')")
     @PostMapping("save")
-    public ResponseEntity save(@Valid @RequestBody PositionCategoryDTO positionCategoryDTO) {
+    public ResponseEntity save(@Valid @RequestBody PositionCategoryDTO positionCategoryDTO, HttpServletRequest request) {
+        PositionLogDTO positionLogDTO = new PositionLogDTO();
         PositionCategory positionCategory = PositionCategoryWrapper.INSTANCE.toEntity(positionCategoryDTO);
-        positionCategoryService.saveOrUpdate(positionCategory);
+        if(StrUtil.isNotEmpty(positionCategoryDTO.getId())){
+            PositionCategory byId = positionCategoryService.getById(positionCategoryDTO.getId());
+            positionLogDTO.setType(PositionTypeEnum.POSITION_CATEGORY.getValue());
+            positionLogDTO.setOperationType("编辑职务分类");
+            positionLogDTO.setOperationContent("编辑职务分类: 职务分类名称由“"+byId.getName()+"”变更为“"+positionCategoryDTO.getName()+"”");
+        }else{
+            positionLogDTO.setType(PositionTypeEnum.POSITION_CATEGORY.getValue());
+            positionLogDTO.setOperationType("创建职务分类");
+            positionLogDTO.setOperationContent("创建职务分类: "+positionCategoryDTO.getName());
+        }
+        try{
+            positionCategoryService.saveOrUpdate(positionCategory);
+        }catch (Exception e){
+            positionLogDTO.setOperationResult("失败");
+            positionLogService.saveLog(positionLogDTO,request);
+            return ResponseEntity.badRequest().body  ("保存职务分类失败");
+        }
+        positionLogDTO.setOperationResult("成功");
+        positionLogService.saveLog(positionLogDTO,request);
         return ResponseEntity.ok ("保存职务分类成功");
     }
 
@@ -79,9 +110,31 @@ public class PositionCategoryController {
     @ApiLog("删除职务分类")
     @PreAuthorize ("hasAuthority('job:position_category:del')")
     @DeleteMapping("delete")
-    public ResponseEntity delete(String ids) {
+    public ResponseEntity delete(String ids,HttpServletRequest request) {
+        List<PositionLogDTO> positionLogDTOList = new ArrayList<>();
         String idArray[] =ids.split(",");
-        positionCategoryService.removeByIds (Lists.newArrayList (idArray));
+        List<PositionCategory> positionCategories = positionCategoryService.listByIds(Lists.newArrayList(idArray));
+        positionCategories.stream().forEach(item->{
+            PositionLogDTO positionLogDTO = new PositionLogDTO();
+            positionLogDTO.setType(PositionTypeEnum.POSITION_CATEGORY.getValue());
+            positionLogDTO.setOperationType("删除职务分类");
+            positionLogDTO.setOperationContent("删除职务分类: "+item.getName());
+            positionLogDTOList.add(positionLogDTO);
+        });
+        try{
+            positionCategoryService.removeByIds (Lists.newArrayList (idArray));
+        }catch (Exception e){
+            positionLogDTOList.stream().forEach(item->{
+                item.setOperationResult("失败");
+            });
+            positionLogService.saveLogBatch(positionLogDTOList,request);
+            return ResponseEntity.badRequest().body  ("删除职务分类失败");
+        }
+
+        positionLogDTOList.stream().forEach(item->{
+            item.setOperationResult("成功");
+        });
+        positionLogService.saveLogBatch(positionLogDTOList,request);
         return ResponseEntity.ok ("删除职务分类成功");
     }
 

+ 87 - 5
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/PositionController.java

@@ -8,19 +8,26 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.jeeplus.aop.logging.annotation.ApiLog;
 import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.test.jobPosion.domain.JobPosition;
 import com.jeeplus.test.jobPosion.domain.Position;
 import com.jeeplus.test.jobPosion.domain.PositionCategory;
+import com.jeeplus.test.jobPosion.enums.PositionTypeEnum;
 import com.jeeplus.test.jobPosion.service.PositionCategoryService;
+import com.jeeplus.test.jobPosion.service.PositionLogService;
 import com.jeeplus.test.jobPosion.service.PositionService;
 import com.jeeplus.test.jobPosion.service.dto.PositionDTO;
+import com.jeeplus.test.jobPosion.service.dto.PositionLogDTO;
 import com.jeeplus.test.jobPosion.service.mapstruct.PositionWrapper;
+import com.jeeplus.test.jobPosion.utils.BeanUtils;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 
 @Api("职务管理")
@@ -34,6 +41,9 @@ public class PositionController {
     @Autowired
     private PositionCategoryService positionCategoryService;
 
+    @Autowired
+    private PositionLogService positionLogService;
+
     /**
      * 查询职务列表
      * @param position
@@ -83,10 +93,60 @@ public class PositionController {
     @ApiLog("添加职务")
     @PreAuthorize("hasAnyAuthority('job:position:save','job:position:edit')")
     @PostMapping("save")
-    public ResponseEntity save(@Valid @RequestBody PositionDTO positionDTO) {
+    public ResponseEntity save(@Valid @RequestBody PositionDTO positionDTO, HttpServletRequest request) {
+        PositionLogDTO positionLogDTO = new PositionLogDTO();
         Position position = PositionWrapper.INSTANCE.toEntity(positionDTO);
-        positionService.saveOrUpdate(position);
-        return ResponseEntity.ok ("保存职务分类成功");
+        Position oldPosition = null;
+        if(StrUtil.isNotEmpty(positionDTO.getId())){
+            oldPosition = positionService.getById(positionDTO.getId());
+            if(ObjectUtil.isNotEmpty(oldPosition)){
+                if(StrUtil.isNotEmpty(oldPosition.getCategoryId())){
+                    PositionCategory byId = positionCategoryService.getById(oldPosition.getCategoryId());
+                    if(ObjectUtil.isNotEmpty(byId)){
+                        if(StrUtil.isNotEmpty(byId.getName())){
+                            oldPosition.setCategoryId(byId.getName());
+                        }
+                    }
+                }
+            }
+            positionLogDTO.setType(PositionTypeEnum.POSITION.getValue());
+            positionLogDTO.setOperationType("修改职务");
+
+        }else{
+            positionLogDTO.setType(PositionTypeEnum.POSITION.getValue());
+            positionLogDTO.setOperationType("新建职务");
+            positionLogDTO.setOperationContent("新建职务: "+positionDTO.getName());
+        }
+        try{
+            positionService.saveOrUpdate(position);
+        }catch (Exception e){
+            if(StrUtil.isNotEmpty(positionDTO.getId())){
+                String changedFields = BeanUtils.getChangedFields(position, new Position());
+                positionLogDTO.setOperationContent(changedFields);
+            }
+            positionLogDTO.setOperationResult("失败");
+            positionLogService.saveLog(positionLogDTO,request);
+            return ResponseEntity.badRequest().body  ("职务保存失败");
+        }
+
+        if (StrUtil.isNotEmpty(positionDTO.getId())){
+            Position byId = positionService.getById(positionDTO.getId());
+            if(ObjectUtil.isNotEmpty(byId)){
+                if(StrUtil.isNotEmpty(byId.getCategoryId())){
+                    PositionCategory byId1 = positionCategoryService.getById(byId.getCategoryId());
+                    if(ObjectUtil.isNotEmpty(byId1)){
+                        byId.setCategoryId(byId1.getName());
+                    }
+                }
+            }
+
+            String changedFields = BeanUtils.getChangedFields(byId, oldPosition);
+            positionLogDTO.setOperationContent(changedFields);
+        }
+        positionLogDTO.setOperationResult("成功");
+        positionLogService.saveLog(positionLogDTO,request);
+
+        return ResponseEntity.ok ("保存职务成功");
     }
 
     /**
@@ -97,9 +157,31 @@ public class PositionController {
     @ApiLog("删除职务")
     @PreAuthorize ("hasAuthority('job:position:del')")
     @DeleteMapping("delete")
-    public ResponseEntity delete(String ids) {
+    public ResponseEntity delete(String ids,HttpServletRequest request) {
+        List<PositionLogDTO> positionLogDTOList = new ArrayList<>();
         String idArray[] =ids.split(",");
-        positionService.removeByIds (Lists.newArrayList (idArray));
+        List<Position> positions = positionService.listByIds(Lists.newArrayList(idArray));
+        positions.stream().forEach(item->{
+            PositionLogDTO positionLogDTO = new PositionLogDTO();
+            positionLogDTO.setType(PositionTypeEnum.POSITION.getValue());
+            positionLogDTO.setOperationType("删除职务");
+            positionLogDTO.setOperationContent("删除职务: "+item.getName());
+            positionLogDTOList.add(positionLogDTO);
+        });
+        try{
+            positionService.removeByIds (Lists.newArrayList (idArray));
+        }catch (Exception e){
+            positionLogDTOList.stream().forEach(item->{
+                item.setOperationResult("失败");
+            });
+            positionLogService.saveLogBatch(positionLogDTOList,request);
+            return ResponseEntity.badRequest().body  ("职务删除失败");
+        }
+        positionLogDTOList.stream().forEach(item->{
+            item.setOperationResult("成功");
+        });
+        positionLogService.saveLogBatch(positionLogDTOList,request);
+
         return ResponseEntity.ok ("删除职务成功");
     }
 

+ 78 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/controller/PositionLogController.java

@@ -0,0 +1,78 @@
+package com.jeeplus.test.jobPosion.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Lists;
+import com.jeeplus.aop.demo.annotation.DemoMode;
+import com.jeeplus.aop.logging.annotation.ApiLog;
+import com.jeeplus.core.excel.ExcelOptions;
+import com.jeeplus.core.excel.ExportMode;
+import com.jeeplus.core.excel.utils.EasyPoiUtil;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.sys.constant.enums.LogTypeEnum;
+import com.jeeplus.sys.domain.Office;
+import com.jeeplus.sys.service.OfficeService;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.test.jobPosion.domain.JobPosition;
+import com.jeeplus.test.jobPosion.domain.Position;
+import com.jeeplus.test.jobPosion.domain.PositionLog;
+import com.jeeplus.test.jobPosion.service.JobPositionService;
+import com.jeeplus.test.jobPosion.service.PositionLogService;
+import com.jeeplus.test.jobPosion.service.PositionService;
+import com.jeeplus.test.jobPosion.service.dto.JobPositionDTO;
+import com.jeeplus.test.jobPosion.service.dto.PositionLogDTO;
+import com.jeeplus.test.jobPosion.service.mapstruct.JobPositionWrapper;
+import com.jeeplus.test.jobPosion.service.mapstruct.PositionLogWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Api("职位体系变更记录管理")
+@RestController
+@RequestMapping(value = "/job/position_log")
+public class PositionLogController {
+
+    @Autowired
+    private PositionLogService positionLogService;
+
+    /**
+     * 查询职位列表
+     * @param positionLogDTO
+     * @param page
+     * @return
+     * @throws Exception
+     */
+    @ApiLog("查询变更记录列表")
+    @GetMapping("list")
+    public ResponseEntity<IPage<PositionLog>> data(PositionLogDTO positionLogDTO, Page<PositionLog> page) throws Exception {
+        PositionLog positionLog = PositionLogWrapper.INSTANCE.toEntity(positionLogDTO);
+        QueryWrapper<PositionLog> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( positionLog, PositionLog.class );
+        queryWrapper.like(StrUtil.isNotEmpty(positionLog.getCreateBy()),"su.login_name",positionLog.getCreateBy());
+        if(ObjectUtil.isNotEmpty(positionLogDTO.getCreateDateStart())&&ObjectUtil.isNotEmpty(positionLogDTO.getCreateDateEnd())){
+            queryWrapper.ge("pl.create_date",positionLogDTO.getCreateDateStart()).le("pl.create_date",positionLogDTO.getCreateDateEnd());
+        }
+        IPage<PositionLog> result = positionLogService.findList (page,queryWrapper);
+        return ResponseEntity.ok (result);
+    }
+
+}

+ 9 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/JobPosition.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.core.query.Query;
+import com.jeeplus.test.jobPosion.annotation.ForUpdate;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -25,42 +26,50 @@ public class JobPosition extends BaseEntity {
     /**
      * 职位名称
      */
+    @ForUpdate(fieldName = "职位名称")
     @Query(tableColumn = "jp.name")
     private String name;
 
     /**
      * 职位编码
      */
+    @ForUpdate(fieldName = "职位编码")
     private String no;
 
     /**
      * 所属部门
      */
+    @ForUpdate(fieldName = "所属部门")
     private String officeId;
 
     /**
      * 编制人数
      */
+    @ForUpdate(fieldName = "编制人数")
     private Integer staffNum;
 
     /**
      * 对应职务
      */
+    @ForUpdate(fieldName = "对应职务")
     private String positionId;
 
     /**
      * 任职资格
      */
+    @ForUpdate(fieldName = "任职资格")
     private String qualification;
 
     /**
      * 责任描述
      */
+    @ForUpdate(fieldName = "责任描述")
     private String obligation;
 
     /**
      * 启用停用 1启用 2停用
      */
+    @ForUpdate(fieldName = "启用状态")
     @Query(tableColumn = "jp.use_flag")
     private String useFlag;
 

+ 4 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/Position.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.core.query.Query;
+import com.jeeplus.test.jobPosion.annotation.ForUpdate;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -26,16 +27,19 @@ public class Position extends BaseEntity {
      * 职务名称
      */
     @Query
+    @ForUpdate(fieldName = "职务名称")
     private String name;
 
     /**
      * 描述
      */
+    @ForUpdate(fieldName = "描述")
     private String description;
 
     /**
      * 职务类型
      */
+    @ForUpdate(fieldName = "职务类型")
     private String categoryId;
 
     private static final long serialVersionUID = 1L;

+ 2 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/PositionCategory.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.core.query.Query;
+import com.jeeplus.test.jobPosion.annotation.ForUpdate;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -26,6 +27,7 @@ public class PositionCategory extends BaseEntity {
      * 职务分类名称
      */
     @Query
+    @ForUpdate(fieldName = "职务分类名称")
     private String name;
 
     private static final long serialVersionUID = 1L;

+ 62 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/domain/PositionLog.java

@@ -0,0 +1,62 @@
+package com.jeeplus.test.jobPosion.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import com.jeeplus.sys.service.dto.UserDTO;
+import lombok.Data;
+
+/**
+ * position_log
+ * @author 
+ */
+@Data
+public class PositionLog extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+
+    /**
+     * 操作模块
+     */
+    @Query(type = QueryType.EQ)
+    private String type;
+
+    /**
+     * 操作类型
+     */
+    @Query
+    private String operationType;
+
+    /**
+     * 操作内容
+     */
+    @Query
+    private String operationContent;
+
+    /**
+     * 操作结果
+     */
+    @Query(type = QueryType.EQ)
+    private String operationResult;
+
+    /**
+     * 访问ip
+     */
+    @Query
+    private String remoteAddr;
+
+    /**
+     * 访问位置
+     */
+    @Query
+    private String accessLocation;
+
+    private static final long serialVersionUID = 1L;
+}

+ 38 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/enums/PositionTypeEnum.java

@@ -0,0 +1,38 @@
+package com.jeeplus.test.jobPosion.enums;
+
+/**
+ * 职务体系模块枚举
+ */
+public enum PositionTypeEnum {
+    POSITION_CATEGORY ("1", "职务类型"),
+    POSITION ("2", "职务"),
+    JOB_POSITION ("3", "职位");
+
+    /**
+     *  模块值
+     */
+    private String value;
+
+    /**
+     * 模块标签
+     */
+    private String label;
+
+    private PositionTypeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    @Override
+    public String toString() {
+        return this.value;
+    }
+}

+ 16 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/mapper/PositionLogMapper.java

@@ -0,0 +1,16 @@
+package com.jeeplus.test.jobPosion.mapper;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.test.jobPosion.domain.JobPosition;
+import com.jeeplus.test.jobPosion.domain.PositionLog;
+import org.apache.ibatis.annotations.Param;
+
+public interface PositionLogMapper extends BaseMapper<PositionLog> {
+
+    public IPage<PositionLog> findList(Page<PositionLog> page, @Param(Constants.WRAPPER) QueryWrapper<PositionLog> queryWrapper);
+}

+ 63 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/mapper/xml/PositionLogMapper.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.test.jobPosion.mapper.PositionLogMapper">
+  <resultMap id="BaseResultMap" type="com.jeeplus.test.jobPosion.domain.PositionLog">
+    <id column="id" jdbcType="VARCHAR" property="id" />
+    <result column="create_by" jdbcType="VARCHAR" property="createBy" />
+    <result column="create_date" jdbcType="TIMESTAMP" property="createDate" />
+    <result column="update_by" jdbcType="VARCHAR" property="updateBy" />
+    <result column="update_date" jdbcType="TIMESTAMP" property="updateDate" />
+    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
+    <result column="del_flag" jdbcType="INTEGER" property="delFlag" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="operation_type" jdbcType="VARCHAR" property="operationType" />
+    <result column="operation_content" jdbcType="VARCHAR" property="operationContent" />
+    <result column="operation_result" jdbcType="VARCHAR" property="operationResult" />
+    <result column="remote_addr" jdbcType="VARCHAR" property="remoteAddr" />
+    <result column="access_location" jdbcType="VARCHAR" property="accessLocation" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    pl.id,
+    pl.create_by,
+    pl.create_date,
+    pl.update_by,
+    pl.update_date,
+    pl.remarks,
+    pl.del_flag,
+    pl.`type`,
+    pl.operation_type,
+    pl.operation_content,
+    pl.operation_result,
+    pl.remote_addr,
+    pl.access_location
+  </sql>
+
+  <sql id="Sql">
+    pl.id,
+    pl.create_date,
+    pl.update_by,
+    pl.update_date,
+    pl.remarks,
+    pl.del_flag,
+    pl.operation_type,
+    pl.operation_content,
+    pl.operation_result,
+    pl.remote_addr,
+    pl.access_location
+  </sql>
+
+  <select id="findList" resultType="com.jeeplus.test.jobPosion.domain.PositionLog">
+    select
+    <include refid="Sql"></include>,
+    CASE
+        WHEN pl.`type` = '1' THEN '职务类型'
+        WHEN pl.`type` = '2' THEN '职务'
+        WHEN pl.`type` = '3' THEN '职位'
+    END `type`,
+    su.login_name as create_by
+    from position_log pl
+    left join sys_user su on su.id = pl.create_by
+    ${ew.customSqlSegment}
+    order by pl.create_date desc
+  </select>
+</mapper>

+ 54 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/service/PositionLogService.java

@@ -0,0 +1,54 @@
+package com.jeeplus.test.jobPosion.service;
+
+import cn.hutool.extra.servlet.ServletUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.test.jobPosion.domain.JobPosition;
+import com.jeeplus.test.jobPosion.domain.PositionLog;
+import com.jeeplus.test.jobPosion.mapper.PositionLogMapper;
+import com.jeeplus.test.jobPosion.service.dto.PositionLogDTO;
+import com.jeeplus.test.jobPosion.service.mapstruct.PositionLogWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Transactional
+public class PositionLogService extends ServiceImpl<PositionLogMapper, PositionLog> {
+
+    @Autowired
+    private PositionLogMapper positionLogMapper;
+
+    public void saveLog(PositionLogDTO positionLogDTO, HttpServletRequest request){
+        PositionLog positionLog = PositionLogWrapper.INSTANCE.toEntity(positionLogDTO);
+        //ip地址
+        positionLog.setRemoteAddr(ServletUtil.getClientIP ( request ));
+
+        positionLogMapper.insert(positionLog);
+    }
+
+    public void saveLogBatch(List<PositionLogDTO> positionLogDTOList, HttpServletRequest request){
+        List<PositionLog> positionLogList = new ArrayList<>();
+        positionLogDTOList.stream().forEach(item->{
+            PositionLog positionLog = PositionLogWrapper.INSTANCE.toEntity(item);
+            //ip地址
+            positionLog.setRemoteAddr(ServletUtil.getClientIP ( request ));
+            positionLogList.add(positionLog);
+        });
+        this.saveBatch(positionLogList);
+    }
+
+    public IPage<PositionLog> findList(Page<PositionLog> page, QueryWrapper<PositionLog> queryWrapper){
+        queryWrapper.eq("pl.del_flag","0");
+        return positionLogMapper.findList(page,queryWrapper);
+    }
+
+}

+ 66 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/service/dto/PositionLogDTO.java

@@ -0,0 +1,66 @@
+package com.jeeplus.test.jobPosion.service.dto;
+
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * position_log
+ * @author 
+ */
+@Data
+public class PositionLogDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+
+    /**
+     * 操作模块
+     */
+    private String type;
+
+    /**
+     * 操作类型
+     */
+    private String operationType;
+
+    /**
+     * 操作内容
+     */
+    private String operationContent;
+
+    /**
+     * 操作结果
+     */
+    private String operationResult;
+
+    /**
+     * 访问ip
+     */
+    private String remoteAddr;
+
+    /**
+     * 访问位置
+     */
+    private String accessLocation;
+
+    /**
+     * 开始时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDateStart;
+
+    /**
+     * 结束时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDateEnd;
+
+    private static final long serialVersionUID = 1L;
+}

+ 13 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/service/mapstruct/PositionLogWrapper.java

@@ -0,0 +1,13 @@
+package com.jeeplus.test.jobPosion.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.test.jobPosion.domain.PositionLog;
+import com.jeeplus.test.jobPosion.service.dto.PositionLogDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface PositionLogWrapper extends EntityWrapper<PositionLogDTO, PositionLog> {
+    PositionLogWrapper INSTANCE = Mappers.getMapper(PositionLogWrapper.class);
+}

+ 40 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/jobPosion/utils/BeanUtils.java

@@ -0,0 +1,40 @@
+package com.jeeplus.test.jobPosion.utils;
+
+import com.jeeplus.test.jobPosion.annotation.ForUpdate;
+
+import java.lang.reflect.Field;
+import java.util.Objects;
+
+public class BeanUtils {
+    /**
+     * 获取变更内容
+     * @param newBean 更改后的Bean
+     * @param oldBean 更改前的Bean
+     * @param <T>
+     * @return
+     */
+    public static <T> String getChangedFields(T newBean, T oldBean){
+        Field[] fields = newBean.getClass().getDeclaredFields();
+        StringBuilder builder = new StringBuilder();
+        for(Field field : fields) {
+            field.setAccessible(true);
+            if (field.isAnnotationPresent(ForUpdate.class)) {
+                try {
+                    Object newValue = field.get(newBean);
+                    Object oldValue = field.get(oldBean);
+                    if(!Objects.equals(newValue, oldValue)) {
+                        builder.append(field.getAnnotation(ForUpdate.class).fieldName()); //获取字段名称
+                        builder.append(": 【更改前:");
+                        builder.append(oldValue);
+                        builder.append(", 更改后:");
+                        builder.append(newValue);
+                        builder.append("】\n");
+                    }
+                } catch (Exception e) {
+                    System.out.println(e);
+                }
+            }
+        }
+        return builder.toString();
+    }
+}

+ 4 - 1
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/constant/enums/LogTypeEnum.java

@@ -6,7 +6,10 @@ package com.jeeplus.sys.constant.enums;
 public enum LogTypeEnum {
     LOGIN ("1", "登录日志"),
     ACCESS ("2", "访问日志"),
-    EXCEPTION ("3", "异常日志");
+    EXCEPTION ("3", "异常日志"),
+    SAVE ("4", "修改或新增数据日志"),
+    EXPORT ("5", "导出日志"),
+    IMPORT ("6", "导入日志");
 
     /**
      *  类型值