ソースを参照

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java
大数据与最优化研究所 1 ヶ月 前
コミット
2e8890709e
27 ファイル変更867 行追加6 行削除
  1. 18 0
      src/main/java/com/xjrsoft/common/enums/ArchivesStatusEnum.java
  2. 36 0
      src/main/java/com/xjrsoft/common/enums/StudentChangeTypeEnum.java
  3. 15 0
      src/main/java/com/xjrsoft/common/enums/StudyStatusEnum.java
  4. 6 0
      src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java
  5. 7 1
      src/main/java/com/xjrsoft/module/liteflow/node/StudentChangeClassNode.java
  6. 20 0
      src/main/java/com/xjrsoft/module/liteflow/node/StudentDropOutNode.java
  7. 4 0
      src/main/java/com/xjrsoft/module/liteflow/node/StudentTransferNode.java
  8. 6 0
      src/main/java/com/xjrsoft/module/liteflow/node/TemporaryChangeClassNode.java
  9. 8 0
      src/main/java/com/xjrsoft/module/liteflow/node/WfRoomApplicantNode.java
  10. 3 0
      src/main/java/com/xjrsoft/module/liteflow/node/WfSchoolRollStudentNode.java
  11. 2 2
      src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java
  12. 117 0
      src/main/java/com/xjrsoft/module/student/controller/StudentChangeRecordController.java
  13. 47 0
      src/main/java/com/xjrsoft/module/student/dto/AddStudentChangeRecordDto.java
  14. 0 1
      src/main/java/com/xjrsoft/module/student/dto/MajorGradeClassDto.java
  15. 41 0
      src/main/java/com/xjrsoft/module/student/dto/StudentChangeRecordPageDto.java
  16. 24 0
      src/main/java/com/xjrsoft/module/student/dto/UpdateStudentChangeRecordDto.java
  17. 106 0
      src/main/java/com/xjrsoft/module/student/entity/StudentChangeRecord.java
  18. 21 0
      src/main/java/com/xjrsoft/module/student/mapper/StudentChangeRecordMapper.java
  19. 30 0
      src/main/java/com/xjrsoft/module/student/service/IStudentChangeRecordService.java
  20. 19 0
      src/main/java/com/xjrsoft/module/student/service/impl/SchoolRollStudentServiceImpl.java
  21. 156 0
      src/main/java/com/xjrsoft/module/student/service/impl/StudentChangeRecordServiceImpl.java
  22. 4 0
      src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java
  23. 0 2
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentAssessmentInspectionMobileVo.java
  24. 72 0
      src/main/java/com/xjrsoft/module/student/vo/StudentChangeRecordPageVo.java
  25. 48 0
      src/main/java/com/xjrsoft/module/student/vo/StudentChangeRecordVo.java
  26. 31 0
      src/main/resources/mapper/student/StudentChangeRecordMapper.xml
  27. 26 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 18 - 0
src/main/java/com/xjrsoft/common/enums/ArchivesStatusEnum.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.common.enums;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @author dzx
  * @date 2023/12/1
@@ -51,6 +54,16 @@ public enum ArchivesStatusEnum {
     final String code;
     final String value;
 
+    private static final Map<String, String> lookup = new HashMap<>();
+
+    static {
+        for (ArchivesStatusEnum s : ArchivesStatusEnum.values()) {
+            lookup.put(s.getCode(), s.getValue());
+        }
+    }
+
+
+
     public String getCode() {
         return this.code;
     }
@@ -63,4 +76,9 @@ public enum ArchivesStatusEnum {
         this.code = code;
         this.value = message;
     }
+
+    public static String fromCode(String code) {
+        return lookup.get(code);
+    }
+
 }

+ 36 - 0
src/main/java/com/xjrsoft/common/enums/StudentChangeTypeEnum.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description: 学生异动类型
+ * @author: dzx
+ * @create: 2025年1月20日10:54:34
+ * @Version 1.0
+ */
+public enum StudentChangeTypeEnum {
+
+    ChangeClass("change_class", "转班"),
+
+    StduyStatus("stduy_status", "就读方式"),
+
+    StudentType("student_type", "学生类别"),
+
+    LearnStatus("learn_status", "学习形式"),
+
+    ArchivesStatus("archives_status", "在读状态");
+
+    final String code;
+    final String value;
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    StudentChangeTypeEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 15 - 0
src/main/java/com/xjrsoft/common/enums/StudyStatusEnum.java

@@ -1,5 +1,8 @@
 package com.xjrsoft.common.enums;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @description: 就读方式stduy_status
  * @author: phoenix
@@ -30,6 +33,14 @@ public enum StudyStatusEnum {
     final String code;
     final String value;
 
+    private static final Map<String, String> lookup = new HashMap<>();
+
+    static {
+        for (ArchivesStatusEnum s : ArchivesStatusEnum.values()) {
+            lookup.put(s.getCode(), s.getValue());
+        }
+    }
+
     public String getCode() {
         return this.code;
     }
@@ -42,4 +53,8 @@ public enum StudyStatusEnum {
         this.code = code;
         this.value = message;
     }
+
+    public static String fromCode(String code) {
+        return lookup.get(code);
+    }
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/ledger/controller/LedgerStatisticsController.java

@@ -114,6 +114,12 @@ public class LedgerStatisticsController {
         if(!userIdList.isEmpty()){
             dto.setUserIds(userIdList);
         }
+
+        if(dto.getStartDate() != null && dto.getEndDate() != null){
+            dto.setStartTime(dto.getStartDate().atTime(0,0,0));
+            dto.setEndTime(dto.getEndDate().atTime(23,59,59));
+        }
+
         List<LedgerStatisticsLeaveVo> list = teacherleaveService.getStatisticsList(dto);
         List<LedgerStatisticsLeaveExcelVo> dataList = new ArrayList<>();
         int sortCode = 1;

+ 7 - 1
src/main/java/com/xjrsoft/module/liteflow/node/StudentChangeClassNode.java

@@ -8,6 +8,7 @@ import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.student.entity.StudentChangeClass;
 import com.xjrsoft.module.student.mapper.StudentChangeClassMapper;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
 import com.xjrsoft.module.workflow.entity.WorkflowRecord;
 import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
@@ -42,6 +43,9 @@ public class StudentChangeClassNode extends NodeComponent {
     @Autowired
     private WorkflowRecordMapper workflowRecordMapper;
 
+    @Autowired
+    private IStudentChangeRecordService changeRecordService;
+
     @Override
     public void process() throws Exception {
         // 获取表单中数据编号
@@ -84,9 +88,11 @@ public class StudentChangeClassNode extends NodeComponent {
                         //查询出数据
                         StudentChangeClass changeClass = studentChangeClassMapper.selectById(formId);
 
-                        BaseClass baseClass =baseClassService.getById(changeClass.getAfterClassId());
+                        BaseClass baseClass = baseClassService.getById(changeClass.getAfterClassId());
                         //修改学生班级
                         studentSchoolRollService.updateStudentClass(changeClass.getAfterClassId(),baseClass.getMajorSetId(), changeClass.getStudentUserId());
+
+                        changeRecordService.insertDataByChangeClass(formId);
                     });
                 }
             });

+ 20 - 0
src/main/java/com/xjrsoft/module/liteflow/node/StudentDropOutNode.java

@@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.StudentChangeTypeEnum;
 import com.xjrsoft.common.enums.WorkflowApproveType;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.StudentDropOut;
 import com.xjrsoft.module.student.mapper.StudentDropOutMapper;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
 import com.xjrsoft.module.workflow.entity.WorkflowRecord;
 import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
@@ -42,6 +44,9 @@ public class StudentDropOutNode extends NodeComponent {
     @Autowired
     private WorkflowRecordMapper workflowRecordMapper;
 
+    @Autowired
+    private IStudentChangeRecordService changeRecordService;
+
 
     @Override
     public void process() throws Exception {
@@ -91,6 +96,21 @@ public class StudentDropOutNode extends NodeComponent {
                                         .eq(BaseStudentSchoolRoll::getUserId, studentDropOut.getStudentUserId())
                                         .eq(BaseStudentSchoolRoll::getDeleteMark, DeleteMark.NODELETE.getCode())
                         );
+
+                        //记录异动
+                        changeRecordService.insertData(
+                                schoolRoll.getArchivesStatus(),
+                                ArchivesStatusEnum.fromCode(schoolRoll.getArchivesStatus()),
+                                ArchivesStatusEnum.FB2904.getCode(),
+                                ArchivesStatusEnum.FB2904.getValue(),
+                                studentDropOut.getStudentUserId(),
+                                studentDropOut.getCreateUserId(),
+                                StudentChangeTypeEnum.ArchivesStatus.getCode(),
+                                2
+                        );
+
+
+
                         schoolRoll.setArchivesStatus(ArchivesStatusEnum.FB2904.getCode());
                         studentSchoolRollService.updateById(schoolRoll);
                     });

+ 4 - 0
src/main/java/com/xjrsoft/module/liteflow/node/StudentTransferNode.java

@@ -12,6 +12,7 @@ import com.xjrsoft.module.student.entity.StudentTransfer;
 import com.xjrsoft.module.student.mapper.BaseClassMajorSetMapper;
 import com.xjrsoft.module.student.mapper.StudentTransferMapper;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
 import com.yomahub.liteflow.core.NodeComponent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -35,6 +36,9 @@ public class StudentTransferNode extends NodeComponent {
     @Autowired
     private BaseClassMajorSetMapper baseClassMajorSetMapper;
 
+    @Autowired
+    private IStudentChangeRecordService changeRecordService;
+
     @Override
     public void process() throws Exception {
         // 获取表单中数据编号

+ 6 - 0
src/main/java/com/xjrsoft/module/liteflow/node/TemporaryChangeClassNode.java

@@ -10,6 +10,7 @@ import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.student.entity.StudentChangeClass;
 import com.xjrsoft.module.student.mapper.StudentChangeClassMapper;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
 import com.xjrsoft.module.workflow.entity.WorkflowRecord;
 import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
@@ -42,6 +43,9 @@ public class TemporaryChangeClassNode extends NodeComponent {
     @Autowired
     private WorkflowRecordMapper workflowRecordMapper;
 
+    @Autowired
+    private IStudentChangeRecordService changeRecordService;
+
     @Override
     public void process() throws Exception {
         // 获取表单中数据编号
@@ -91,6 +95,8 @@ public class TemporaryChangeClassNode extends NodeComponent {
                         BaseClass baseClass = baseClassService.getById(afterClassId);
                         //修改学生班级
                         studentSchoolRollService.updateStudentClass(afterClassId, baseClass.getMajorSetId(), studentUserId);
+
+                        changeRecordService.insertDataByTemporaryChangeClass(formId);
                     });
                 }
             });

+ 8 - 0
src/main/java/com/xjrsoft/module/liteflow/node/WfRoomApplicantNode.java

@@ -13,6 +13,7 @@ import com.xjrsoft.module.room.entity.WfRoomApplicant;
 import com.xjrsoft.module.room.service.IWfRoomApplicantService;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
 import com.xjrsoft.module.workflow.entity.WorkflowRecord;
 import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
 import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
@@ -45,6 +46,9 @@ public class WfRoomApplicantNode extends NodeComponent {
     private IWorkflowExecuteService workflowExecuteService;
     @Autowired
     private WorkflowRecordMapper workflowRecordMapper;
+    @Autowired
+    private IStudentChangeRecordService changeRecordService;
+
 
     @Override
     public void process() throws Exception {
@@ -86,10 +90,14 @@ public class WfRoomApplicantNode extends NodeComponent {
                         }
                         //查询出数据
                         WfRoomApplicant wfRoomApplicant = wfRoomApplicantService.getById(formId);
+
                         BaseStudentSchoolRoll schoolRoll = studentSchoolRollService.getOne(
                                 new QueryWrapper<BaseStudentSchoolRoll>().lambda()
                                         .eq(BaseStudentSchoolRoll::getUserId, wfRoomApplicant.getApplicantUserId())
                         );
+
+                        changeRecordService.insertDataByWfRoomApplicant(wfRoomApplicant, schoolRoll);
+
                         if(RoomApplicantTypeEnum.ToBeBoarder.getCode().equals(wfRoomApplicant.getRecedeType())){
                             schoolRoll.setStduyStatus(StudyStatusEnum.InResidence.getCode());
                         }else if(RoomApplicantTypeEnum.ToBeDayPupil.getCode().equals(wfRoomApplicant.getRecedeType())){

+ 3 - 0
src/main/java/com/xjrsoft/module/liteflow/node/WfSchoolRollStudentNode.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.liteflow.node;
 import cn.hutool.core.convert.Convert;
 import com.xjrsoft.module.student.service.ISchoolRollStudentService;
 import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -13,6 +14,8 @@ import java.util.Map;
  */
 @Component("wf_school_roll_student_node")
 public class WfSchoolRollStudentNode extends NodeComponent {
+
+    @Autowired
     private ISchoolRollStudentService schoolRollStudentService;
 
     @Override

+ 2 - 2
src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java

@@ -161,7 +161,7 @@ public class ScheduleController {
     public RT<Integer> currentWeek(CourseTableDto dto){
         BaseSemester baseSemester = semesterService.getCurrentSemester();
         if(baseSemester == null){
-            return RT.ok();
+            return RT.ok(0);
         }
         LocalDateTime now = LocalDateTime.now();
         if(dto.getScheduleDate() != null){
@@ -183,7 +183,7 @@ public class ScheduleController {
             }
         }
 
-        return RT.ok();
+        return RT.ok(0);
     }
 
 

+ 117 - 0
src/main/java/com/xjrsoft/module/student/controller/StudentChangeRecordController.java

@@ -0,0 +1,117 @@
+package com.xjrsoft.module.student.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.student.dto.AddStudentChangeRecordDto;
+import com.xjrsoft.module.student.dto.StudentChangeRecordPageDto;
+import com.xjrsoft.module.student.dto.UpdateStudentChangeRecordDto;
+import com.xjrsoft.module.student.entity.StudentChangeRecord;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
+import com.xjrsoft.module.student.vo.StudentChangeRecordPageVo;
+import com.xjrsoft.module.student.vo.StudentChangeRecordVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @title: 学生异动记录表
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/student" + "/studentChangeRecord")
+@Api(value = "/student"  + "/studentChangeRecord",tags = "学生异动记录表代码")
+@AllArgsConstructor
+public class StudentChangeRecordController {
+
+
+    private final IStudentChangeRecordService studentChangeRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="学生异动记录表列表(分页)")
+    @SaCheckPermission("studentchangerecord:detail")
+    public RT<PageOutput<StudentChangeRecordPageVo>> page(@Valid StudentChangeRecordPageDto dto){
+        Page<StudentChangeRecordPageVo> page = studentChangeRecordService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<StudentChangeRecordPageVo> pageOutput = ConventPage.getPageOutput(page, StudentChangeRecordPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询学生异动记录表信息")
+    @SaCheckPermission("studentchangerecord:detail")
+    public RT<StudentChangeRecordVo> info(@RequestParam Long id){
+        StudentChangeRecord studentChangeRecord = studentChangeRecordService.getById(id);
+        if (studentChangeRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(studentChangeRecord, StudentChangeRecordVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增学生异动记录表")
+    @SaCheckPermission("studentchangerecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddStudentChangeRecordDto dto){
+        StudentChangeRecord studentChangeRecord = BeanUtil.toBean(dto, StudentChangeRecord.class);
+        boolean isSuccess = studentChangeRecordService.save(studentChangeRecord);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改学生异动记录表")
+    @SaCheckPermission("studentchangerecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateStudentChangeRecordDto dto){
+
+        StudentChangeRecord studentChangeRecord = BeanUtil.toBean(dto, StudentChangeRecord.class);
+        return RT.ok(studentChangeRecordService.updateById(studentChangeRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除学生异动记录表")
+    @SaCheckPermission("studentchangerecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(studentChangeRecordService.removeBatchByIds(ids));
+
+    }
+    @PostMapping("/import")
+    @ApiOperation(value = "导入")
+    public RT<Boolean> importData(@RequestParam MultipartFile file) throws IOException {
+        List<StudentChangeRecordPageVo> savedDataList = EasyExcel.read(file.getInputStream()).head(StudentChangeRecordPageVo.class).sheet().doReadSync();
+        Boolean result = studentChangeRecordService.saveBatch(BeanUtil.copyToList(savedDataList, StudentChangeRecord.class));
+        return RT.ok(result);
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid StudentChangeRecordPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<StudentChangeRecordPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<StudentChangeRecordPageVo>) page(dto).getData()).getList();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, StudentChangeRecordPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "StudentChangeRecord" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 47 - 0
src/main/java/com/xjrsoft/module/student/dto/AddStudentChangeRecordDto.java

@@ -0,0 +1,47 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 学生异动记录表
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Data
+public class AddStudentChangeRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 学生id(xjr_user)
+    */
+    @ApiModelProperty("学生id(xjr_user)")
+    private Long userId;
+    /**
+    * 异动类型
+    */
+    @ApiModelProperty("异动类型")
+    private String changeType;
+    /**
+    * 异动前数据
+    */
+    @ApiModelProperty("异动前数据")
+    private String beforeData;
+    /**
+    * 异动后数据
+    */
+    @ApiModelProperty("异动后数据")
+    private String afterData;
+    /**
+    * 操作方式(1:系统 2:流程 3:人为)
+    */
+    @ApiModelProperty("操作方式(1:系统 2:流程 3:人为)")
+    private Integer operateMode;
+
+}

+ 0 - 1
src/main/java/com/xjrsoft/module/student/dto/MajorGradeClassDto.java

@@ -2,7 +2,6 @@ package com.xjrsoft.module.student.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.simpleframework.xml.Default;
 
 /**
  * @author dzx

+ 41 - 0
src/main/java/com/xjrsoft/module/student/dto/StudentChangeRecordPageDto.java

@@ -0,0 +1,41 @@
+package com.xjrsoft.module.student.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+
+/**
+* @title: 学生异动记录表分页查询入参
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class StudentChangeRecordPageDto extends PageInput {
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
+    @ApiModelProperty("异动类型")
+    private String changeType;
+
+    @ApiModelProperty("操作人姓名")
+    private String operateUserName;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty("操作开始时间")
+    private LocalDateTime operateTimeStart;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty("操作结束时间")
+    private LocalDateTime operateTimeEnd;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/student/dto/UpdateStudentChangeRecordDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 学生异动记录表
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Data
+public class UpdateStudentChangeRecordDto extends AddStudentChangeRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 106 - 0
src/main/java/com/xjrsoft/module/student/entity/StudentChangeRecord.java

@@ -0,0 +1,106 @@
+package com.xjrsoft.module.student.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 学生异动记录表
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Data
+@TableName("student_change_record")
+@ApiModel(value = "student_change_record", description = "学生异动记录表")
+public class StudentChangeRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记(0:未删除 1:已删除)
+    */
+    @ApiModelProperty("删除标记(0:未删除 1:已删除)")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Object deleteMark;
+    /**
+    * 有效标记(0:未启用 1:已启用)
+    */
+    @ApiModelProperty("有效标记(0:未启用 1:已启用)")
+    @TableField(fill = FieldFill.INSERT)
+    private Object enabledMark;
+    /**
+    * 学生id(xjr_user)
+    */
+    @ApiModelProperty("学生id(xjr_user)")
+    private Long userId;
+    /**
+    * 异动类型
+    */
+    @ApiModelProperty("异动类型")
+    private String changeType;
+    /**
+    * 异动前数据
+    */
+    @ApiModelProperty("异动前数据")
+    private String beforeData;
+
+    @ApiModelProperty("异动前数据Code")
+    private String beforeDataCode;
+
+    /**
+    * 异动后数据
+    */
+    @ApiModelProperty("异动后数据")
+    private String afterData;
+
+    @ApiModelProperty("异动后数据Code")
+    private String afterDataCode;
+    /**
+    * 操作方式(1:系统 2:流程 3:人为)
+    */
+    @ApiModelProperty("操作方式(1:系统 2:流程 3:人为)")
+    private Integer operateMode;
+
+
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/student/mapper/StudentChangeRecordMapper.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.student.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.student.dto.StudentChangeRecordPageDto;
+import com.xjrsoft.module.student.entity.StudentChangeRecord;
+import com.xjrsoft.module.student.vo.StudentChangeRecordPageVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @title: 学生异动记录表
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Mapper
+public interface StudentChangeRecordMapper extends MPJBaseMapper<StudentChangeRecord> {
+
+    Page<StudentChangeRecordPageVo> getPage(Page<StudentChangeRecordPageVo> page, @Param("dto") StudentChangeRecordPageDto dto);
+}

+ 30 - 0
src/main/java/com/xjrsoft/module/student/service/IStudentChangeRecordService.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.student.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.room.entity.WfRoomApplicant;
+import com.xjrsoft.module.student.dto.StudentChangeRecordPageDto;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.entity.StudentChangeRecord;
+import com.xjrsoft.module.student.vo.StudentChangeRecordPageVo;
+
+/**
+* @title: 学生异动记录表
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+
+public interface IStudentChangeRecordService extends MPJBaseService<StudentChangeRecord> {
+
+    Boolean insertDataByChangeClass(Long formId);
+
+    Boolean insertDataByTemporaryChangeClass(Long formId);
+
+    Boolean insertDataByWfRoomApplicant(WfRoomApplicant wfRoomApplicant, BaseStudentSchoolRoll schoolRoll);
+
+    Boolean insertData(String beforeData, String beforeDataCode, String afterData, String afterDataCode, Long userId, Long createUserId, String changeType, Integer operateMode);
+
+    Page<StudentChangeRecordPageVo> getPage(Page<StudentChangeRecordPageVo> page, StudentChangeRecordPageDto dto);
+
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/student/service/impl/SchoolRollStudentServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.student.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -7,12 +8,14 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.SchoolChangeType;
+import com.xjrsoft.common.enums.StudentChangeTypeEnum;
 import com.xjrsoft.module.student.dto.SchoolRollStudentPageDto;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.SchoolRollStudent;
 import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
 import com.xjrsoft.module.student.mapper.SchoolRollStudentMapper;
 import com.xjrsoft.module.student.service.ISchoolRollStudentService;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
 import com.xjrsoft.module.student.vo.SchoolRollStudentPageVo;
 import com.xjrsoft.module.student.vo.SchoolRollStudentVo;
 import com.xjrsoft.module.teacher.entity.XjrUser;
@@ -33,6 +36,8 @@ public class SchoolRollStudentServiceImpl extends MPJBaseServiceImpl<SchoolRollS
     private final XjrUserMapper xjrUserMapper;
     private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
 
+    private final IStudentChangeRecordService changeRecordService;
+
 
     @Override
     public Boolean dataHandle(Long dataId) {
@@ -79,6 +84,20 @@ public class SchoolRollStudentServiceImpl extends MPJBaseServiceImpl<SchoolRollS
             Wrappers.lambdaQuery(BaseStudentSchoolRoll.class).eq(BaseStudentSchoolRoll::getUserId, schoolRollStudent.getStudentId())
         );
         if(ObjectUtil.isNotNull(studentSchoolRoll)){
+
+            //记录异动
+            changeRecordService.insertData(
+                    studentSchoolRoll.getArchivesStatus(),
+                    ArchivesStatusEnum.fromCode(studentSchoolRoll.getArchivesStatus()),
+                    ArchivesStatusEnum.FB2902.getCode(),
+                    ArchivesStatusEnum.FB2902.getValue(),
+                    studentSchoolRoll.getUserId(),
+                    StpUtil.getLoginIdAsLong(),
+                    StudentChangeTypeEnum.ArchivesStatus.getCode(),
+                    2
+            );
+
+
             studentSchoolRoll.setArchivesStatus(ArchivesStatusEnum.FB2902.getCode());
             baseStudentSchoolRollMapper.updateById(studentSchoolRoll);
         }

+ 156 - 0
src/main/java/com/xjrsoft/module/student/service/impl/StudentChangeRecordServiceImpl.java

@@ -0,0 +1,156 @@
+package com.xjrsoft.module.student.service.impl;
+
+import cn.hutool.db.Entity;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.enums.RoomApplicantTypeEnum;
+import com.xjrsoft.common.enums.StudentChangeTypeEnum;
+import com.xjrsoft.common.enums.StudyStatusEnum;
+import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.room.entity.WfRoomApplicant;
+import com.xjrsoft.module.student.dto.StudentChangeRecordPageDto;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.entity.StudentChangeClass;
+import com.xjrsoft.module.student.entity.StudentChangeRecord;
+import com.xjrsoft.module.student.mapper.StudentChangeClassMapper;
+import com.xjrsoft.module.student.mapper.StudentChangeRecordMapper;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
+import com.xjrsoft.module.student.vo.StudentChangeRecordPageVo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+* @title: 学生异动记录表
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class StudentChangeRecordServiceImpl extends MPJBaseServiceImpl<StudentChangeRecordMapper, StudentChangeRecord> implements IStudentChangeRecordService {
+
+    private final StudentChangeClassMapper studentChangeClassMapper;
+    private final IBaseClassService classService;
+    /**
+     * 记录转班异动数据
+     * @param formId 转班流程表的id
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertDataByChangeClass(Long formId) {
+        StudentChangeClass changeClass = studentChangeClassMapper.selectById(formId);
+
+        BaseClass afterClass = classService.getById(changeClass.getAfterClassId());
+        BaseClass beforeClass = classService.getById(changeClass.getBeforeClassId());
+
+        StudentChangeRecord record = new StudentChangeRecord() {{
+            setAfterData(afterClass.getName());
+            setAfterDataCode(changeClass.getAfterClassId().toString());
+            setBeforeData(beforeClass.getName());
+            setBeforeDataCode(changeClass.getBeforeClassId().toString());
+            setChangeType(StudentChangeTypeEnum.ChangeClass.getCode());
+            setUserId(changeClass.getStudentUserId());
+            setCreateDate(new Date());
+            setCreateUserId(changeClass.getCreateUserId());
+            setOperateMode(2);
+        }};
+
+        return this.save(record);
+    }
+
+    /**
+     * 临时转班异动数据记录
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertDataByTemporaryChangeClass(Long formId) {
+        String tableName = "temporary_change_class";
+        Entity entity = Entity.create(tableName);
+        entity.set("id", formId);
+        Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(tableName, entity);
+
+        BaseClass afterClass = classService.getById(objectMap.get("after_class_id").toString());
+        BaseClass beforeClass = classService.getById(objectMap.get("before_class_id").toString());
+
+        StudentChangeRecord record = new StudentChangeRecord() {{
+            setAfterData(afterClass.getName());
+            setAfterDataCode(afterClass.getId().toString());
+            setBeforeData(beforeClass.getName());
+            setBeforeDataCode(beforeClass.getId().toString());
+            setChangeType(StudentChangeTypeEnum.ChangeClass.getCode());
+            setUserId(Long.parseLong(objectMap.get("student_user_id").toString()));
+            setCreateDate(new Date());
+            setCreateUserId(Long.parseLong(objectMap.get("create_user_id").toString()));
+            setOperateMode(2);
+        }};
+
+        return this.save(record);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertDataByWfRoomApplicant(WfRoomApplicant wfRoomApplicant, BaseStudentSchoolRoll schoolRoll) {
+
+        StudentChangeRecord record = new StudentChangeRecord() {{
+
+            if(RoomApplicantTypeEnum.ToBeBoarder.getCode().equals(wfRoomApplicant.getRecedeType())){
+                setAfterData(StudyStatusEnum.InResidence.getValue());
+                setAfterDataCode(StudyStatusEnum.InResidence.getCode());
+            }else if(RoomApplicantTypeEnum.ToBeDayPupil.getCode().equals(wfRoomApplicant.getRecedeType())){
+                setAfterData(StudyStatusEnum.AttendDaySchool.getValue());
+                setAfterDataCode(StudyStatusEnum.AttendDaySchool.getCode());
+            }
+
+            setBeforeData(schoolRoll.getStduyStatus());
+            setBeforeDataCode(StudyStatusEnum.fromCode(schoolRoll.getStduyStatus()));
+            setChangeType(StudentChangeTypeEnum.StduyStatus.getCode());
+            setUserId(schoolRoll.getUserId());
+            setCreateDate(new Date());
+            setCreateUserId(wfRoomApplicant.getCreateUserId());
+            setOperateMode(2);
+        }};
+
+        return this.save(record);
+    }
+
+    /**
+     *
+     * @param beforeData 变更之前的数据
+     * @param beforeDataCode 变更之前的数据code
+     * @param afterData 变更之后的数据
+     * @param afterDataCode 变更之后的数据code
+     * @param userId 学生id
+     * @param createUserId 操作人id
+     * @param changeType 变更类型
+     * @param operateMode 操作方式
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertData(String beforeData, String beforeDataCode, String afterData, String afterDataCode, Long userId, Long createUserId, String changeType, Integer operateMode) {
+        StudentChangeRecord record = new StudentChangeRecord() {{
+            setAfterData(afterData);
+            setAfterDataCode(afterDataCode);
+            setBeforeData(beforeData);
+            setBeforeDataCode(beforeDataCode);
+            setChangeType(changeType);
+            setUserId(userId);
+            setCreateDate(new Date());
+            setCreateUserId(createUserId);
+            setOperateMode(operateMode);
+        }};
+
+        return this.save(record);
+    }
+
+    @Override
+    public Page<StudentChangeRecordPageVo> getPage(Page<StudentChangeRecordPageVo> page, StudentChangeRecordPageDto dto) {
+        return this.baseMapper.getPage(page, dto);
+    }
+
+}

+ 4 - 0
src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java

@@ -52,6 +52,7 @@ import com.xjrsoft.module.student.entity.BaseStudentFamilyMember;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.BaseStudentSubsidize;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
+import com.xjrsoft.module.student.entity.StudentChangeRecord;
 import com.xjrsoft.module.student.mapper.BaseStudentFamilyMapper;
 import com.xjrsoft.module.student.mapper.BaseStudentFamilyMemberMapper;
 import com.xjrsoft.module.student.mapper.BaseStudentMapper;
@@ -608,6 +609,9 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
         List<BaseStudentFamily> insertFamilyList = new ArrayList();
         List<BaseStudentContact> insertContactList = new ArrayList();
 
+        //异动记录
+        List<StudentChangeRecord> changeRecordList = new ArrayList();
+
         long createUserId = StpUtil.getLoginIdAsLong();
 //        long createUserId = 1000000000000000000L;
         int row = 3;

+ 0 - 2
src/main/java/com/xjrsoft/module/student/vo/BaseStudentAssessmentInspectionMobileVo.java

@@ -1,7 +1,5 @@
 package com.xjrsoft.module.student.vo;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.xjrsoft.module.student.entity.BaseStudentAssessmentStudentRelation;
 import com.xjrsoft.module.system.entity.File;
 import io.swagger.annotations.ApiModelProperty;

+ 72 - 0
src/main/java/com/xjrsoft/module/student/vo/StudentChangeRecordPageVo.java

@@ -0,0 +1,72 @@
+package com.xjrsoft.module.student.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 学生异动记录表分页列表出参
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Data
+public class StudentChangeRecordPageVo {
+
+    /**
+    * 主键
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键")
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("操作时间")
+    @ApiModelProperty("操作时间")
+    private Date operateDate;
+    /**
+    * 学生id(xjr_user)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("姓名")
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
+    @ApiModelProperty("操作人姓名")
+    private String operateUserName;
+
+    @ApiModelProperty("性别")
+    private String gender;
+
+    /**
+    * 异动类型
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("异动类型")
+    @ApiModelProperty("异动类型")
+    private String changeType;
+    /**
+    * 异动前数据
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("异动前数据")
+    @ApiModelProperty("异动前数据")
+    private String beforeData;
+    /**
+    * 异动后数据
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("异动后数据")
+    @ApiModelProperty("异动后数据")
+    private String afterData;
+
+}

+ 48 - 0
src/main/java/com/xjrsoft/module/student/vo/StudentChangeRecordVo.java

@@ -0,0 +1,48 @@
+package com.xjrsoft.module.student.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 学生异动记录表表单出参
+* @Author dzx
+* @Date: 2025-01-20
+* @Version 1.0
+*/
+@Data
+public class StudentChangeRecordVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 学生id(xjr_user)
+    */
+    @ApiModelProperty("学生id(xjr_user)")
+    private Long userId;
+    /**
+    * 异动类型
+    */
+    @ApiModelProperty("异动类型")
+    private String changeType;
+    /**
+    * 异动前数据
+    */
+    @ApiModelProperty("异动前数据")
+    private String beforeData;
+    /**
+    * 异动后数据
+    */
+    @ApiModelProperty("异动后数据")
+    private String afterData;
+    /**
+    * 操作方式(1:系统 2:流程 3:人为)
+    */
+    @ApiModelProperty("操作方式(1:系统 2:流程 3:人为)")
+    private Integer operateMode;
+
+
+
+}

+ 31 - 0
src/main/resources/mapper/student/StudentChangeRecordMapper.xml

@@ -0,0 +1,31 @@
+<?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.xjrsoft.module.student.mapper.StudentChangeRecordMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.student.dto.StudentChangeRecordPageDto" resultType="com.xjrsoft.module.student.vo.StudentChangeRecordPageVo">
+        SELECT t1.id,t2.name, t5.name AS gender, t2.credential_number,t1.create_date as operate_date,t4.name AS operate_user_name,
+        t3.name AS change_type, t1.after_data,t1.before_data FROM student_change_record t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN xjr_dictionary_detail t3 ON t1.change_type = t3.code AND t3.item_id = 1881186538301730818
+        LEFT JOIN xjr_user t4 ON t1.create_user_id = t4.id
+        LEFT JOIN xjr_dictionary_detail t5 ON t2.gender = t5.code AND t5.item_id = 2023000000000000004
+        WHERE t1.delete_mark = 0
+        <if test="dto.name != null and dto.name != '' ">
+            and t2.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.credentialNumber != null and dto.credentialNumber != '' ">
+            and t2.credential_number like concat('%', #{dto.credentialNumber}, '%')
+        </if>
+        <if test="dto.changeType != null and dto.changeType != '' ">
+            and t1.change_type = #{dto.changeType}
+        </if>
+        <if test="dto.operateUserName != null and dto.operateUserName != '' ">
+            and t4.name like concat('%', #{dto.operateUserName}, '%')
+        </if>
+        <if test="dto.operateTimeStart != null and dto.operateTimeEnd != null ">
+            and t1.create_date between #{dto.operateTimeStart} and #{dto.operateTimeEnd}
+        </if>
+        ORDER BY t1.id DESC
+    </select>
+</mapper>

+ 26 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -4247,4 +4247,30 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+
+    @Test
+    public void gcStudentChangeRecord() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("student_change_record");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("student");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }