浏览代码

Merge branch 'pre'

dzx 8 月之前
父节点
当前提交
79989f1d7e
共有 31 个文件被更改,包括 894 次插入436 次删除
  1. 15 0
      src/main/java/com/xjrsoft/common/enums/EnrollTypeEnum.java
  2. 18 0
      src/main/java/com/xjrsoft/common/utils/LocalDateUtil.java
  3. 2 1
      src/main/java/com/xjrsoft/module/banding/service/IBandingTaskClassService.java
  4. 4 5
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassServiceImpl.java
  5. 16 21
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java
  6. 72 31
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskServiceImpl.java
  7. 2 0
      src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeStatisticsController.java
  8. 3 3
      src/main/java/com/xjrsoft/module/form/service/impl/FormExecuteServiceImpl.java
  9. 2 0
      src/main/java/com/xjrsoft/module/job/BaseNewStudentTask.java
  10. 114 19
      src/main/java/com/xjrsoft/module/liteflow/node/StudentTransferNode.java
  11. 11 0
      src/main/java/com/xjrsoft/module/oa/controller/NewsController.java
  12. 59 0
      src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java
  13. 32 0
      src/main/java/com/xjrsoft/module/schedule/vo/CourseNamesVo.java
  14. 319 337
      src/main/java/com/xjrsoft/module/student/controller/BaseNewStudentReportController.java
  15. 29 3
      src/main/java/com/xjrsoft/module/student/controller/StudentReportPlanController.java
  16. 9 2
      src/main/java/com/xjrsoft/module/student/controller/StudentTryReadingReportController.java
  17. 5 0
      src/main/java/com/xjrsoft/module/student/dto/StudentReportSignDto.java
  18. 5 0
      src/main/java/com/xjrsoft/module/student/dto/StudentTryReadingReportPageDto.java
  19. 2 1
      src/main/java/com/xjrsoft/module/student/entity/PbCseFeeobjupdate.java
  20. 0 5
      src/main/java/com/xjrsoft/module/student/entity/StudentTransfer.java
  21. 2 0
      src/main/java/com/xjrsoft/module/student/service/IStudentReportPlanService.java
  22. 14 0
      src/main/java/com/xjrsoft/module/student/service/impl/StudentReportPlanServiceImpl.java
  23. 2 2
      src/main/java/com/xjrsoft/module/student/service/impl/StudentReportRecordServiceImpl.java
  24. 3 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoDetailVo.java
  25. 3 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageVo.java
  26. 5 4
      src/main/java/com/xjrsoft/module/workflow/dto/MyExaminePageDto.java
  27. 1 1
      src/main/resources/mapper/oa/NewsMapper.xml
  28. 3 1
      src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml
  29. 8 0
      src/main/resources/mapper/student/StudentReportRecordMapper.xml
  30. 9 0
      src/main/resources/mapper/workflow/WorkflowExtraMapper.xml
  31. 125 0
      src/test/java/com/xjrsoft/module/liteflow/node/StudentTransferNodeTest.java

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

@@ -1,5 +1,8 @@
 package com.xjrsoft.common.enums;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @description: 招生类型
  * @Author: SZS
@@ -19,6 +22,14 @@ public enum EnrollTypeEnum {
     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;
     }
@@ -31,4 +42,8 @@ public enum EnrollTypeEnum {
         this.code = code;
         this.value = message;
     }
+
+    public static String fromCode(String code) {
+        return lookup.get(code);
+    }
 }

+ 18 - 0
src/main/java/com/xjrsoft/common/utils/LocalDateUtil.java

@@ -1,6 +1,9 @@
 package com.xjrsoft.common.utils;
 
+import com.xjrsoft.common.exception.MyException;
+
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 /**
  * @author dzx
@@ -19,4 +22,19 @@ public class LocalDateUtil {
         // 检查目标日期是否在开始日期和结束日期之间(包含边界)
         return !targetDate.isBefore(startDate) && !targetDate.isAfter(endDate);
     }
+
+
+    public static LocalDate getBirthDate(String idCardNumber){
+        // 获取出生日期前6位,即yyyyMM
+        String birthdayString = idCardNumber.substring(6, 14);
+
+        // 将字符串解析为LocalDate对象
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+        try {
+            LocalDate parse = LocalDate.parse(birthdayString, formatter);
+            return parse;
+        }catch (Exception e){
+            throw new MyException("身份证号填写错误,无法提取出生日期");
+        }
+    }
 }

+ 2 - 1
src/main/java/com/xjrsoft/module/banding/service/IBandingTaskClassService.java

@@ -11,6 +11,7 @@ import com.xjrsoft.module.banding.vo.BandingTaskClassReportStatisticsVo;
 import com.xjrsoft.module.banding.vo.BandingTaskClassStudentListVo;
 import com.xjrsoft.module.banding.vo.BandingTaskClassSureListVo;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.student.dto.StudentTryReadingReportPageDto;
 
 import java.util.List;
 import java.util.Map;
@@ -69,7 +70,7 @@ public interface IBandingTaskClassService extends MPJBaseService<BandingTaskClas
 
     Boolean deleteClass(List<Long> ids);
 
-    BandingTaskClassReportStatisticsVo getTryReadingReportClassStatistics(Long classId);
+    BandingTaskClassReportStatisticsVo getTryReadingReportClassStatistics(StudentTryReadingReportPageDto dto);
 
     Boolean removeByBaseClass(BaseClass baseClass);
 }

+ 4 - 5
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassServiceImpl.java

@@ -553,10 +553,9 @@ public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskC
     }
 
     @Override
-    public BandingTaskClassReportStatisticsVo getTryReadingReportClassStatistics(Long classId) {
+    public BandingTaskClassReportStatisticsVo getTryReadingReportClassStatistics(StudentTryReadingReportPageDto dto) {
         BandingTaskClassReportStatisticsVo result = new BandingTaskClassReportStatisticsVo();
-        StudentTryReadingReportPageDto dto = new StudentTryReadingReportPageDto();
-        if(classId == 0L){
+        if(dto.getClassId() == 0L){
             StudentReportPlan plan = reportPlanService.getLastTryReadingPlan();
             BandingTask bandingTask = bandingTaskMapper.selectById(plan.getBandingTaskId());
             List<EnrollmentPlan> enrollmentPlans = enrollmentPlanMapper.selectList(
@@ -571,7 +570,7 @@ public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskC
                 dto.setEnrollmentPlanId(enrollmentPlans.get(0).getId());
             }
         }else{
-            BandingTaskClass taskClass = this.getById(classId);
+            BandingTaskClass taskClass = this.getById(dto.getClassId());
             BandingTask task = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
             List<EnrollmentPlan> enrollmentPlanList = enrollmentPlanMapper.selectList(
                     new QueryWrapper<EnrollmentPlan>().lambda()
@@ -586,7 +585,7 @@ public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskC
             }
         }
 
-        dto.setClassId(classId);
+        dto.setClassId(dto.getClassId());
         List<StudentReportRecordPlanPageVo> tryReadingList = reportRecordMapper.getTryReadingList(dto);
 
         result.setAllCount(tryReadingList.size());

+ 16 - 21
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java

@@ -12,6 +12,7 @@ import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.LocalDateUtil;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
@@ -184,13 +185,12 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
             }
         }
 
-
+        List<Long> studentIds = dataList.stream().map(BandingTaskClassStudent::getNewStudentId).collect(Collectors.toList());
+        List<BaseNewStudent> list = newStudentService.list(
+                new QueryWrapper<BaseNewStudent>().lambda()
+                        .in(BaseNewStudent::getId, studentIds)
+        );
         if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
-            List<Long> studentIds = dataList.stream().map(BandingTaskClassStudent::getNewStudentId).collect(Collectors.toList());
-            List<BaseNewStudent> list = newStudentService.list(
-                    new QueryWrapper<BaseNewStudent>().lambda()
-                            .in(BaseNewStudent::getId, studentIds)
-            );
             List<BaseNewStudent> updateList = new ArrayList<>();
             for (BaseNewStudent student : list) {
                 student.setStatus(1);
@@ -292,7 +292,7 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                         }
                         continue;
                     }
-                    LocalDate birthDate = getBirthDate(student.getCredentialNumber());
+                    LocalDate birthDate = LocalDateUtil.getBirthDate(student.getCredentialNumber());
                     User xjrUser = new User() {{
                         setCreateDate(now);
                         setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
@@ -361,24 +361,19 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                 List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
                 redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
             });
+        }else{
+            List<BaseNewStudent> updateList = new ArrayList<>();
+            for (BaseNewStudent student : list) {
+                student.setRemarks(dto.getRemarks());
+                updateList.add(student);
+            }
+            if(!updateList.isEmpty()){
+                newStudentService.updateBatchById(updateList);
+            }
         }
         return true;
     }
 
-    LocalDate getBirthDate(String idCardNumber){
-        // 获取出生日期前6位,即yyyyMM
-        String birthdayString = idCardNumber.substring(6, 14);
-
-        // 将字符串解析为LocalDate对象
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
-        try {
-            LocalDate parse = LocalDate.parse(birthdayString, formatter);
-            return parse;
-        }catch (Exception e){
-            throw new MyException("身份证号填写错误,无法提取出生日期");
-        }
-    }
-
     @Override
     @Transactional
     public Boolean removeStudent(ChangeClassDto dto) {

+ 72 - 31
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskServiceImpl.java

@@ -11,6 +11,7 @@ import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.enums.EnrollTypeEnum;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
@@ -763,43 +764,83 @@ public class BandingTaskServiceImpl extends MPJBaseServiceImpl<BandingTaskMapper
             newStudentService.updateBatchById(updateList);
         }
 
-        //新增报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
-        BaseSemester semester = semesterService.getCurrentSemester();
-        StudentReportPlan plan = reportPlanService.getOne(
-                new QueryWrapper<StudentReportPlan>().lambda()
-                        .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
-                        .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
-                        .eq(StudentReportPlan::getSemesterId, semester.getId())
-                        .eq(StudentReportPlan::getCategory, 2)
-                        .eq(StudentReportPlan::getBandingTaskId, dto.getId())
-        );
-        if(plan == null){
-            plan = new StudentReportPlan() {{
-                setName(bandingTask.getName());
-                setCategory(2);
-                setSemesterId(semester.getId());
-                setBandingTaskId(dto.getId());
-                setCreateDate(new Date());
-                setCreateUserId(StpUtil.getLoginIdAsLong());
-            }};
+        //新增试读报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
+        {
+            BaseSemester semester = semesterService.getCurrentSemester();
+            StudentReportPlan plan = reportPlanService.getOne(
+                    new QueryWrapper<StudentReportPlan>().lambda()
+                            .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .eq(StudentReportPlan::getSemesterId, semester.getId())
+                            .eq(StudentReportPlan::getCategory, 2)
+                            .eq(StudentReportPlan::getBandingTaskId, dto.getId())
+            );
+            if(plan == null){
+                BaseGrade grade = gradeService.getById(bandingTask.getGradeId());
+                plan = new StudentReportPlan() {{
+                    setCategory(2);
+                    setName(grade.getName() + EnrollTypeEnum.fromCode(bandingTask.getEnrollType()) + "试读报到");
+                    setSemesterId(semester.getId());
+                    setBandingTaskId(dto.getId());
+                    setCreateDate(new Date());
+                    setCreateUserId(StpUtil.getLoginIdAsLong());
+                }};
 
-            reportPlanService.save(plan);
-        }
+                reportPlanService.save(plan);
+            }
 
 
-        //将新生数据初始化到报到表中
-        for (BaseNewStudent student : updateList) {
-            StudentReportRecord record = new StudentReportRecord();
-            record.setCreateDate(new Date());
-            record.setCreateUserId(StpUtil.getLoginIdAsLong());
-            record.setUserId(student.getId());
-            record.setStudentReportPlanId(plan.getId());
-            record.setDeleteMark(DeleteMark.NODELETE.getCode());
-            record.setEnabledMark(EnabledMark.ENABLED.getCode());
-            reportRecordMapper.insert(record);
+            //将新生数据初始化到报到表中
+            for (BaseNewStudent student : updateList) {
+                StudentReportRecord record = new StudentReportRecord();
+                record.setCreateDate(new Date());
+                record.setCreateUserId(StpUtil.getLoginIdAsLong());
+                record.setUserId(student.getId());
+                record.setStudentReportPlanId(plan.getId());
+                record.setDeleteMark(DeleteMark.NODELETE.getCode());
+                record.setEnabledMark(EnabledMark.ENABLED.getCode());
+                reportRecordMapper.insert(record);
+            }
         }
 
+        //新增新生报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
+        {
+            BaseSemester semester = semesterService.getCurrentSemester();
+            StudentReportPlan plan = reportPlanService.getOne(
+                    new QueryWrapper<StudentReportPlan>().lambda()
+                            .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .eq(StudentReportPlan::getSemesterId, semester.getId())
+                            .eq(StudentReportPlan::getCategory, 3)
+                            .eq(StudentReportPlan::getBandingTaskId, dto.getId())
+            );
+            if(plan == null){
+                BaseGrade grade = gradeService.getById(bandingTask.getGradeId());
+                plan = new StudentReportPlan() {{
+                    setCategory(3);
+                    setName(grade.getName() + EnrollTypeEnum.fromCode(bandingTask.getEnrollType()) + "新生报到");
+                    setSemesterId(semester.getId());
+                    setBandingTaskId(dto.getId());
+                    setCreateDate(new Date());
+                    setCreateUserId(StpUtil.getLoginIdAsLong());
+                }};
+
+                reportPlanService.save(plan);
+            }
+
 
+            //将新生数据初始化到报到表中
+            for (BaseNewStudent student : updateList) {
+                StudentReportRecord record = new StudentReportRecord();
+                record.setCreateDate(new Date());
+                record.setCreateUserId(StpUtil.getLoginIdAsLong());
+                record.setUserId(student.getId());
+                record.setStudentReportPlanId(plan.getId());
+                record.setDeleteMark(DeleteMark.NODELETE.getCode());
+                record.setEnabledMark(EnabledMark.ENABLED.getCode());
+                reportRecordMapper.insert(record);
+            }
+        }
 
         bandingTask.setStatus(1);
         bandingTask.setModifyDate(new Date());

+ 2 - 0
src/main/java/com/xjrsoft/module/classtime/controller/ClassTimeStatisticsController.java

@@ -144,6 +144,8 @@ public class ClassTimeStatisticsController {
             throw new MyException("未能查到数据");
         }
         statistics.setStatus(dto.getStatus());
+        statistics.setModifyDate(new Date());
+        statistics.setModifyUserId(StpUtil.getLoginIdAsLong());
         classTimeStatisticsService.updateById(statistics);
         if (dto.getStatus() != null && dto.getStatus() == 3) {
             classTimeStatisticsService.lockData(dto.getId());

+ 3 - 3
src/main/java/com/xjrsoft/module/form/service/impl/FormExecuteServiceImpl.java

@@ -1351,16 +1351,16 @@ public class FormExecuteServiceImpl implements IFormExecuteService {
                 formData.put(pk.getName(), keyValue);
                 //此时的formData 已经是剔除了子表单数据了
                 where.putAll(toSaveFormData);
-                System.out.println("insertOrUpdateFormDataByWorkflow 3.3");
+//                System.out.println("insertOrUpdateFormDataByWorkflow 3.3");
                 //如果有审计字段  默认填充值
                 putAuditEntityInsertData(where, columns);
-                System.out.println("insertOrUpdateFormDataByWorkflow 4");
+//                System.out.println("insertOrUpdateFormDataByWorkflow 4");
                 // 保存主表数据
                 Boolean result = SqlRunnerAdapter.db().dynamicInsert(tableName, where);
                 if (!result) {
                     throw new MyException("添加数据失败");
                 }
-                System.out.println("insertOrUpdateFormDataByWorkflow 5");
+//                System.out.println("insertOrUpdateFormDataByWorkflow 5");
 
                 // 保存子表数据
                 for (Map.Entry<String, List<Entity>> tableMap : childMaps.entrySet()) {

+ 2 - 0
src/main/java/com/xjrsoft/module/job/BaseNewStudentTask.java

@@ -141,6 +141,7 @@ public class BaseNewStudentTask {
                     }
                 }
                 existsNewStudent.setGraduateSchool(feeobjupdate.getGraduations());
+                existsNewStudent.setGraduateClass(feeobjupdate.getGradclass());
                 existsNewStudent.setStduyStatus(StudyStatusEnum.getCode(feeobjupdate.getQuartername()));
                 existsNewStudent.setSource(StudentTypeEnum.getCode(feeobjupdate.getResourcename()));
                 existsNewStudent.setMobile(feeobjupdate.getTelephone());
@@ -180,6 +181,7 @@ public class BaseNewStudentTask {
                             }
                         }
                         setGraduateSchool(feeobjupdate.getGraduations());
+                        setGraduateClass(feeobjupdate.getGradclass());
                         setStduyStatus(StudyStatusEnum.getCode(feeobjupdate.getQuartername()));
                         setSource(StudentTypeEnum.getCode(feeobjupdate.getResourcename()));
                         setMobile(feeobjupdate.getTelephone());

+ 114 - 19
src/main/java/com/xjrsoft/module/liteflow/node/StudentTransferNode.java

@@ -1,22 +1,38 @@
 package com.xjrsoft.module.liteflow.node;
 
+import cn.dev33.satoken.secure.BCrypt;
 import cn.hutool.core.convert.Convert;
 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.EnabledMark;
+import com.xjrsoft.common.enums.RoleEnum;
+import com.xjrsoft.common.utils.LocalDateUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
+import com.xjrsoft.module.organization.dto.GetUserByParamDto;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.service.IUserRoleRelationService;
+import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.student.entity.BaseClassMajorSet;
+import com.xjrsoft.module.student.entity.BaseNewStudent;
+import com.xjrsoft.module.student.entity.BaseStudent;
+import com.xjrsoft.module.student.entity.BaseStudentFamily;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 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.IBaseNewStudentService;
+import com.xjrsoft.module.student.service.IBaseStudentFamilyService;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
-import com.xjrsoft.module.student.service.IStudentChangeRecordService;
+import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.yomahub.liteflow.core.NodeComponent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.Map;
 
@@ -37,7 +53,22 @@ public class StudentTransferNode extends NodeComponent {
     private BaseClassMajorSetMapper baseClassMajorSetMapper;
 
     @Autowired
-    private IStudentChangeRecordService changeRecordService;
+    private IBaseNewStudentService newStudentService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private CommonPropertiesConfig propertiesConfig;
+
+    @Autowired
+    private IBaseStudentService studentService;
+
+    @Autowired
+    private IBaseStudentFamilyService familyService;
+
+    @Autowired
+    private IUserRoleRelationService roleRelationService;
 
     @Override
     public void process() throws Exception {
@@ -48,24 +79,88 @@ public class StudentTransferNode extends NodeComponent {
         if (formId != null) {
             //查询出数据
             StudentTransfer studentTransfer = studentTransferMapper.selectById(formId);
-            BaseClass baseClass = baseClassMapper.selectById(studentTransfer.getClassId());
-            BaseClassMajorSet majorSet = baseClassMajorSetMapper.selectOne(
-                    new QueryWrapper<BaseClassMajorSet>().lambda()
-                            .eq(BaseClassMajorSet::getClassId, studentTransfer.getClassId())
-                            .eq(BaseClassMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
+
+            BaseNewStudent newStudent = newStudentService.getById(studentTransfer.getStudentUserId());
+            User user = userService.getUserByParam(
+                    new GetUserByParamDto() {{
+                        setCredentialNumber(newStudent.getCredentialNumber());
+                    }}
             );
-            BaseStudentSchoolRoll roll = new BaseStudentSchoolRoll();
-            roll.setStduyStatus(studentTransfer.getStudyStatus());
-            roll.setClassId(studentTransfer.getClassId());
-            roll.setEnrollType(baseClass.getEnrollType());
-            roll.setCreateDate(LocalDateTime.now());
-            roll.setGradeId(baseClass.getGradeId());
-            roll.setMajorSetId(majorSet.getMajorSetId());
-            roll.setCreateUserId(studentTransfer.getCreateUserId());
-            roll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
-            roll.setUserId(studentTransfer.getStudentUserId());
-            //新增学籍信息
-            studentSchoolRollService.save(roll);
+            LocalDate birthDate = LocalDateUtil.getBirthDate(newStudent.getCredentialNumber());
+            BaseClass baseClass = baseClassMapper.selectById(studentTransfer.getClassId());
+            LocalDateTime now = LocalDateTime.now();
+            if(user == null){
+                User xjrUser = new User() {{
+                    setCreateDate(now);
+                    setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+                    setName(newStudent.getName());
+                    setUserName(newStudent.getCredentialNumber());
+                    setCredentialNumber(newStudent.getCredentialNumber());
+                    setCredentialType("ZZLS10007");
+                    setMobile(newStudent.getMobile());
+                    setEnabledMark(EnabledMark.ENABLED.getCode());
+                    setGender(newStudent.getGender());
+                    setIsChangePassword(1);
+                    setBirthDate(birthDate.atStartOfDay());
+                }};
+                userService.save(xjrUser);
+
+                UserRoleRelation userRoleRelation = new UserRoleRelation() {{
+                    setRoleId(RoleEnum.STUDENT.getCode());
+                    setUserId(xjrUser.getId());
+                }};
+                roleRelationService.save(userRoleRelation);
+
+                BaseStudent baseStudent = new BaseStudent() {{
+                    setUserId(xjrUser.getId());
+                    setCreateDate(now);
+                    setStudentId(newStudent.getCredentialNumber());
+                    if(newStudent.getHeight() != null){
+                        setHeight(newStudent.getHeight().doubleValue());
+                    }
+                    if(newStudent.getWeight() != null){
+                        setWeight(newStudent.getWeight().doubleValue());
+                    }
+                }};
+                studentService.save(baseStudent);
+
+                BaseClassMajorSet majorSet = baseClassMajorSetMapper.selectOne(
+                        new QueryWrapper<BaseClassMajorSet>().lambda()
+                                .eq(BaseClassMajorSet::getClassId, studentTransfer.getClassId())
+                                .eq(BaseClassMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+                BaseStudentSchoolRoll roll = new BaseStudentSchoolRoll();
+                roll.setStduyStatus(studentTransfer.getStudyStatus());
+                roll.setClassId(studentTransfer.getClassId());
+                roll.setEnrollType(baseClass.getEnrollType());
+                roll.setCreateDate(LocalDateTime.now());
+                roll.setGradeId(baseClass.getGradeId());
+                roll.setMajorSetId(majorSet.getMajorSetId());
+                roll.setCreateUserId(studentTransfer.getCreateUserId());
+                roll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+                roll.setUserId(xjrUser.getId());
+                roll.setDeleteMark(DeleteMark.NODELETE.getCode());
+                roll.setEnabledMark(EnabledMark.ENABLED.getCode());
+                //新增学籍信息
+                studentSchoolRollService.save(roll);
+
+
+                BaseStudentFamily studentFamily = new BaseStudentFamily() {{
+                    setCreateDate(now);
+                    setUserId(xjrUser.getId());
+                    setTelephone(newStudent.getFamilyMobile());
+                    setAddress(newStudent.getFamilyAddress());
+                }};
+                familyService.save(studentFamily);
+
+            }else{
+                studentSchoolRollService.updateStudentClass(studentTransfer.getClassId(), user.getId());
+            }
+
+            newStudent.setRemarks("通过插班进入" + baseClass.getName());
+            newStudent.setStatus(1);
+            newStudent.setOperateMode(2);
+            newStudentService.updateById(newStudent);
         }
     }
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/oa/controller/NewsController.java

@@ -13,6 +13,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -365,6 +366,8 @@ public class NewsController {
                                 .eq(News::getStatus, 2)
                                 .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
                                 .eq(News::getTypeId, typeId)
+                                .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
                                 .eq(NewsRelation::getReadMark, 0)
                                 .gt(News::getSendEndDate, LocalDateTime.now())
                 );
@@ -375,6 +378,8 @@ public class NewsController {
                         .eq(News::getTypeId, typeId)
                         .eq(News::getStatus, 2)
                         .gt(News::getSendEndDate, LocalDateTime.now())
+                        .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
                         .eq(News::getWfStatus, 1)
                         //.notInSql(News::getId, "select distinct news_id from xjr_oa_news_relation where read_mark = 1 and user_id = " + StpUtil.getLoginIdAsLong())
                         .orderByDesc(News::getReleaseTime)
@@ -390,6 +395,8 @@ public class NewsController {
                                 .eq(News::getStatus, 2)
                                 .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
                                 .eq(News::getTypeId, typeId)
+                                .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
                                 .gt(News::getSendEndDate, LocalDateTime.now())
                                 .eq(NewsRelation::getReadMark, 0)
                 );
@@ -487,6 +494,8 @@ public class NewsController {
                         .eq(News::getStatus, 2)
                         .eq(NewsRelation::getUserId, StpUtil.getLoginIdAsLong())
                         .eq(NewsRelation::getReadMark, 0)
+                        .eq(News::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(News::getEnabledMark, EnabledMark.ENABLED.getCode())
         );
 
         //公告发给非全体的
@@ -497,6 +506,8 @@ public class NewsController {
                         .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())
                         .eq(SystemUpdateMessage::getStatus, 1)
                         .eq(SystemUpdateMessageNotice::getStatus, 0)
+                        .eq(SystemUpdateMessageNotice::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(SystemUpdateMessageNotice::getEnabledMark, EnabledMark.ENABLED.getCode())
         );
 
         Long notReadCount = notReadCountNews + systemUpdateMessageCount;

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

@@ -26,6 +26,7 @@ import com.xjrsoft.module.schedule.service.IWfCourseAdjustService;
 import com.xjrsoft.module.schedule.util.ScheduleUtil;
 import com.xjrsoft.module.schedule.vo.ClassOptionVo;
 import com.xjrsoft.module.schedule.vo.CourseListVo;
+import com.xjrsoft.module.schedule.vo.CourseNamesVo;
 import com.xjrsoft.module.schedule.vo.CourseTableVo;
 import com.xjrsoft.module.schedule.vo.ScheduleWeekVo;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
@@ -50,7 +51,10 @@ import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @title: 课表
@@ -264,6 +268,61 @@ public class ScheduleController {
     }
 
 
+    @GetMapping(value = "/getCourseInfo")
+    @ApiOperation(value = "根据课程id获取课程相关信息")
+    @SaCheckPermission("schedule:detail")
+    @XjrLog(value = "根据课程id获取课程相关信息", saveResponseData = true)
+    public RT<CourseNamesVo> getCourseInfo(String id) {
+        String[] split = id.split(",");
+        List<CourseTable> list = courseTableService.list(
+                new QueryWrapper<CourseTable>().lambda()
+                        .in(CourseTable::getId, Arrays.asList(split))
+        );
+        CourseNamesVo resultVo = new CourseNamesVo();
+
+        Set<Long> classSets = list.stream().map(CourseTable::getClassId).collect(Collectors.toSet());
+        if(classSets.size() > 1){
+            resultVo.setStatus(0);
+            return RT.ok(resultVo);
+        }
+
+        List<ClassTime> classTimeList = classTimeService.list();
+        String courseNames = "";
+        String timeNumbers = "";
+        Set<Long> classIdSet = new HashSet<>();
+        Set<String> classNameSet = new HashSet<>();
+        for (int i = 0; i < list.size(); i++) {
+            if (i > 0) {
+                courseNames += ",";
+                timeNumbers += ",";
+            }
+            CourseTable courseTable = list.get(i);
+
+            String courseName = courseTable.getCourseName();
+
+            ClassTime classTime = classTimeList.stream().filter(u -> u.getNumber().equals(courseTable.getTimeNumber())).findAny().orElse(null);
+
+            if (classTime != null) {
+                courseName += "(" + classTime.getShortName() + ")";
+            }
+
+            courseNames += courseName;
+            timeNumbers += courseTable.getTimeNumber();
+            classIdSet.add(courseTable.getClassId());
+            classNameSet.add(courseTable.getClassName());
+        }
+        resultVo.setCourseNames(courseNames);
+        resultVo.setTimeNumbers(timeNumbers);
+        resultVo.setClassIds(classIdSet.toString().replace("[", "").replace("]", "").replace(" ", ""));
+        resultVo.setClassNames(classNameSet.toString().replace("[", "").replace("]", "").replace(" ", ""));
+        resultVo.setStatus(1);
+
+        return RT.ok(resultVo);
+    }
+
+
+
+
     /**
      * 顶课预检查
      *

+ 32 - 0
src/main/java/com/xjrsoft/module/schedule/vo/CourseNamesVo.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.schedule.vo;
+
+import com.xjrsoft.module.courseTable.entity.ClassTime;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @author dzx
+ * @date 2024/1/29
+ */
+@Data
+public class CourseNamesVo {
+
+    @ApiModelProperty("课程名称")
+    private String courseNames;
+
+    @ApiModelProperty("节次数字")
+    private String timeNumbers;
+
+    @ApiModelProperty("班级ids")
+    private String classIds;
+
+    @ApiModelProperty("班级名称")
+    private String classNames;
+
+    @ApiModelProperty("是否同一个班级(1:是 0:否)")
+    private Integer status;
+
+}

+ 319 - 337
src/main/java/com/xjrsoft/module/student/controller/BaseNewStudentReportController.java

@@ -1,61 +1,77 @@
 package com.xjrsoft.module.student.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xjrsoft.common.annotation.XjrLog;
-import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.enums.EnrollTypeEnum;
+import com.xjrsoft.common.enums.GenderDictionaryEnum;
+import com.xjrsoft.common.enums.RoleCodeEnum;
+import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.config.CommonPropertiesConfig;
-import com.xjrsoft.module.base.entity.BaseSemester;
-import com.xjrsoft.module.base.entity.BaseUserStudent;
-import com.xjrsoft.module.base.entity.WhitelistManagement;
+import com.xjrsoft.module.banding.dto.BandingTaskClassPageDto;
+import com.xjrsoft.module.banding.entity.BandingTask;
+import com.xjrsoft.module.banding.service.IBandingTaskClassService;
+import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
+import com.xjrsoft.module.banding.service.IBandingTaskService;
+import com.xjrsoft.module.banding.vo.BandingTaskClassPageVo;
+import com.xjrsoft.module.banding.vo.BandingTaskClassReportStatisticsVo;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.service.IBaseGradeService;
 import com.xjrsoft.module.base.service.IBaseSemesterService;
-import com.xjrsoft.module.base.service.IBaseUserStudentService;
-import com.xjrsoft.module.base.service.IWhitelistManagementService;
-import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.organization.entity.UserRoleRelation;
-import com.xjrsoft.module.organization.service.IUserRoleRelationService;
+import com.xjrsoft.module.databoard.vo.ItemCountVo;
 import com.xjrsoft.module.organization.service.IUserService;
-import com.xjrsoft.module.student.dto.*;
-import com.xjrsoft.module.student.entity.BaseNewStudent;
-import com.xjrsoft.module.student.entity.BaseStudentFamilyMember;
+import com.xjrsoft.module.student.dto.StudentReportRecordPageDto;
+import com.xjrsoft.module.student.dto.StudentReportRecordStatisticsDto;
+import com.xjrsoft.module.student.dto.StudentTryReadingReportPageDto;
+import com.xjrsoft.module.student.entity.EnrollmentPlan;
+import com.xjrsoft.module.student.entity.StudentReportPlan;
 import com.xjrsoft.module.student.service.IBaseNewStudentService;
-import com.xjrsoft.module.student.service.IBaseStudentFamilyMemberService;
-import com.xjrsoft.module.student.vo.*;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IEnrollmentPlanService;
+import com.xjrsoft.module.student.service.IStudentReportPlanService;
+import com.xjrsoft.module.student.service.IStudentReportRecordService;
+import com.xjrsoft.module.student.vo.StudentReportRecordExcelVo;
+import com.xjrsoft.module.student.vo.StudentReportRecordItemVo;
+import com.xjrsoft.module.student.vo.StudentReportRecordPlanPageVo;
+import com.xjrsoft.module.student.vo.StudentReportRecordStatisticsVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+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 javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
- * @title: 新生维护信息
+ * @title: 新生报到信息
  * @Author dzx
- * @Date: 2024-06-27
+ * @Date: 2025年3月19日
  * @Version 1.0
  */
 @RestController
@@ -64,359 +80,325 @@ import java.util.concurrent.CompletableFuture;
 @AllArgsConstructor
 public class BaseNewStudentReportController {
 
-    private final IUserService userService;
-    private final IBaseNewStudentService baseNewStudentService;
-    private final IBaseStudentFamilyMemberService familyMemberService;
-    private final IWhitelistManagementService whitelistManagementService;
-    private final IUserRoleRelationService userRoleRelationService;
-    private final RedisUtil redisUtil;
-    private final IBaseUserStudentService userStudentService;
-    private final CommonPropertiesConfig propertiesConfig;
+    private final IStudentReportRecordService recordService;
+    private final IStudentReportPlanService reportPlanService;
+    private final IBandingTaskClassService bandingTaskClassService;
     private final IBaseSemesterService semesterService;
+    private final IBaseGradeService gradeService;
+    private final IEnrollmentPlanService enrollmentPlanService;
+    private final IBandingTaskService bandingTaskService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value = "新生维护信息列表(分页)")
     @SaCheckPermission("basenewstudent:detail")
     @XjrLog(value = "新生维护信息列表(分页)")
-    public RT<PageOutput<BaseNewStudentPageVo>> page(@Valid BaseNewStudentPageDto dto) {
-
-        Page<BaseNewStudentPageVo> page = baseNewStudentService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
-        PageOutput<BaseNewStudentPageVo> pageOutput = ConventPage.getPageOutput(page, BaseNewStudentPageVo.class);
-        return RT.ok(pageOutput);
-    }
-
-    @GetMapping(value = "/report-page")
-    @ApiOperation(value = "新生报到(分页)")
-    @SaCheckPermission("basenewstudent:detail")
-    @XjrLog(value = "新生报到(分页)")
-    public RT<PageOutput<BaseNewStudentPageVo>> reportPage(@Valid BaseNewStudentPageDto dto) {
+    public RT<PageOutput<StudentReportRecordPlanPageVo>> page(@Valid StudentTryReadingReportPageDto dto){
+        dto.setReportCategory(3);
         List<String> roleList = StpUtil.getRoleList();
-        if (roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getTeacherId() == null) {
+        if(roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
             dto.setTeacherId(StpUtil.getLoginIdAsLong());
         }
-        if (dto.getBaseSemesterId() == null) {
-            LambdaQueryWrapper<BaseSemester> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper
-                    .orderByDesc(BaseSemester::getStartDate)
-                    .select(BaseSemester.class, x -> VoToColumnUtil.fieldsToColumns(BaseSemester.class).contains(x.getProperty()));
-            List<BaseSemester> semesterList = semesterService.list(queryWrapper);
-            if (!semesterList.isEmpty()) {
-                dto.setBaseSemesterId(semesterList.get(0).getId());
+        if(dto.getIsMoible() != null && dto.getIsMoible() == 1){
+            StudentReportPlan plan = reportPlanService.getLastNewStudentReportPlan();
+            dto.setStudentReportPlanId(plan.getId());
+            BandingTask bandingTask = bandingTaskService.getById(plan.getBandingTaskId());
+            List<EnrollmentPlan> enrollmentPlans = enrollmentPlanService.list(
+                    new QueryWrapper<EnrollmentPlan>().lambda()
+                            .eq(EnrollmentPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(EnrollmentPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .eq(EnrollmentPlan::getEnrollType, bandingTask.getEnrollType())
+                            .eq(EnrollmentPlan::getEnrollType, bandingTask.getEnrollType())
+                            .eq(EnrollmentPlan::getGradeId, bandingTask.getGradeId())
+                            .orderByDesc(EnrollmentPlan::getId)
+            );
+            if(!enrollmentPlans.isEmpty()){
+                dto.setEnrollmentPlanId(enrollmentPlans.get(0).getId());
             }
         }
-        Page<BaseNewStudentPageVo> page = baseNewStudentService.getReportPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
-        PageOutput<BaseNewStudentPageVo> pageOutput = ConventPage.getPageOutput(page, BaseNewStudentPageVo.class);
+        Page<StudentReportRecordPlanPageVo> page = recordService.getTryReadingPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<StudentReportRecordPlanPageVo> pageOutput = ConventPage.getPageOutput(page, StudentReportRecordPlanPageVo.class);
         return RT.ok(pageOutput);
     }
 
-    @GetMapping(value = "/tree")
-    @ApiOperation(value = "新生维护信息树")
-    @SaCheckPermission("basenewstudent:detail")
-    @XjrLog(value = "新生维护信息树")
-    public RT<List<BaseNewStudentTreeVo>> tree() {
 
-        List<EnrollmentPlanGradeVo> gradeList = baseNewStudentService.getGradeList();
-        List<EnrollmentPlanTreeVo> list = baseNewStudentService.getEnrollmentPlanList();
+    @GetMapping(value = "/class-statistics")
+    @ApiOperation(value="班级数据统计")
+    @SaCheckPermission("studentreportrecord:detail")
+    @XjrLog(value = "班级数据统计")
+    public RT<BandingTaskClassReportStatisticsVo> classStatistics(@RequestParam Long classId){
+        return RT.ok(bandingTaskClassService.getTryReadingReportClassStatistics(new StudentTryReadingReportPageDto(){{
+            setClassId(classId);
+            setReportCategory(3);
+        }}));
+    }
 
-        List<BaseNewStudentTreeVo> result = new ArrayList<>();
-        for (EnrollmentPlanGradeVo gradeVo : gradeList) {
-            BaseNewStudentTreeVo treeVo = new BaseNewStudentTreeVo() {{
-                setId(gradeVo.getId());
-                setName(gradeVo.getName());
-                setTreeType(1);
-            }};
-            List<BaseNewStudentTreeVo> children = new ArrayList<>();
-            for (EnrollmentPlanTreeVo planTreeVo : list) {
-                if (planTreeVo.getGradeId().equals(gradeVo.getId())) {
-                    children.add(new BaseNewStudentTreeVo() {{
-                        setId(planTreeVo.getId());
-                        setName(planTreeVo.getEnrollTypeCn());
-                        setTreeType(2);
-                    }});
-                }
+    @GetMapping(value = "/statistics")
+    @ApiOperation(value="领导统计")
+    @SaCheckPermission("studentreportrecord:detail")
+    @XjrLog(value = "领导统计")
+    public RT<StudentReportRecordStatisticsVo> statistics(@Valid StudentReportRecordStatisticsDto dto){
+        if(dto.getGradeId() == null && (dto.getCategory() == null || dto.getCategory() == 1)){
+            LambdaQueryWrapper<BaseGrade> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper
+                    .orderByDesc(BaseGrade::getTitle)
+                    .select(BaseGrade.class,x -> VoToColumnUtil.fieldsToColumns(BaseGrade.class).contains(x.getProperty()));
+            List<BaseGrade> gradeList = gradeService.list(queryWrapper);
+            if(!gradeList.isEmpty()){
+                dto.setGradeId(gradeList.get(0).getId());
             }
-
-            treeVo.setChildren(children);
-            result.add(treeVo);
         }
-
-        return RT.ok(result);
-    }
-
-    @GetMapping(value = "/info")
-    @ApiOperation(value = "根据id查询新生维护信息信息")
-    @SaCheckPermission("basenewstudent:detail")
-    @XjrLog(value = "根据id查询新生维护信息信息", saveResponseData = true)
-    public RT<BaseNewStudentVo> info(@RequestParam Long id) {
-        BaseNewStudent baseNewStudent = baseNewStudentService.getById(id);
-        if (baseNewStudent == null) {
-            return RT.error("找不到此数据!");
+        if(dto.getEnrollType() == null || dto.getEnrollType().isEmpty()){
+            dto.setEnrollType(EnrollTypeEnum.AUTUMN_ENROLLMENT.getCode());
         }
-        return RT.ok(BeanUtil.toBean(baseNewStudent, BaseNewStudentVo.class));
-    }
-
-
-    @PostMapping
-    @ApiOperation(value = "新增新生维护信息")
-    @SaCheckPermission("basenewstudent:add")
-    @XjrLog(value = "新增新生维护信息", saveResponseData = true)
-    public RT<Boolean> add(@Valid @RequestBody AddBaseNewStudentDto dto) {
-        BaseNewStudent baseNewStudent = BeanUtil.toBean(dto, BaseNewStudent.class);
-        baseNewStudent.setFirstAmbitionId(Long.parseLong(dto.getFirstAmbition()));
-        baseNewStudent.setSecondAmbitionId(Long.parseLong(dto.getSecondAmbition()));
-        baseNewStudent.setCreateDate(new Date());
-        boolean isSuccess = baseNewStudentService.save(baseNewStudent);
-        return RT.ok(isSuccess);
-    }
-
-    @PutMapping
-    @ApiOperation(value = "修改新生维护信息")
-    @SaCheckPermission("basenewstudent:edit")
-    @XjrLog(value = "修改新生维护信息", saveResponseData = true)
-    public RT<Boolean> update(@Valid @RequestBody UpdateBaseNewStudentDto dto) {
-
-        BaseNewStudent baseNewStudent = BeanUtil.toBean(dto, BaseNewStudent.class);
-        return RT.ok(baseNewStudentService.updateById(baseNewStudent));
-
-    }
-
-    @DeleteMapping
-    @ApiOperation(value = "删除新生维护信息")
-    @SaCheckPermission("basenewstudent:delete")
-    @XjrLog(value = "删除新生维护信息", saveResponseData = true)
-    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids) {
-        return RT.ok(baseNewStudentService.removeBatchByIds(ids));
-    }
-
-    @DeleteMapping("deleteByUserIds")
-    @ApiOperation(value = "删除新生(保留新生信息,删除基础信息)")
-    @SaCheckPermission("basenewstudent:delete")
-    @XjrLog(value = "删除新生(保留新生信息,删除基础信息)", saveResponseData = true)
-    public RT<Boolean> deleteByUserIds(@Valid @RequestBody DeleteNewStudentDto dto) {
-        return RT.ok(baseNewStudentService.deleteByUserIds(dto));
-    }
-
-
-    @PostMapping("/import")
-    @ApiOperation(value = "导入")
-    @XjrLog(value = "导入", saveRequestData = false, saveResponseData = true)
-    public RT<List<Map<String, String>>> importData(@RequestParam Long treeId, @RequestParam MultipartFile file) throws IOException {
-        List<Map<Integer, Object>> errorList = baseNewStudentService.importData(treeId, file);
-        List<Map<String, String>> result = new ArrayList<>();
-
-        for (Map<Integer, Object> objectMap : errorList) {
-            Map<String, String> object = new LinkedHashMap<>();
-            object.put("毕业学校", objectMap.get(0) == null ? "" : objectMap.get(0).toString());
-            object.put("学生姓名", objectMap.get(1) == null ? "" : objectMap.get(1).toString());
-            object.put("性别", objectMap.get(2) == null ? "" : objectMap.get(2).toString());
-            object.put("身份证号", objectMap.get(3) == null ? "" : objectMap.get(3).toString());
-            object.put("身高(cm)", objectMap.get(4) == null ? "" : objectMap.get(4).toString());
-            object.put("体重(kg)", objectMap.get(5) == null ? "" : objectMap.get(5).toString());
-            object.put("毕业班级", objectMap.get(6) == null ? "" : objectMap.get(6).toString());
-            object.put("学生来源", objectMap.get(7) == null ? "" : objectMap.get(7).toString());
-            object.put("住宿类型", objectMap.get(8) == null ? "" : objectMap.get(8).toString());
-            object.put("手机号", objectMap.get(9) == null ? "" : objectMap.get(9).toString());
-            object.put("第一志愿", objectMap.get(10) == null ? "" : objectMap.get(10).toString());
-            object.put("第二志愿", objectMap.get(11) == null ? "" : objectMap.get(11).toString());
-            object.put("是否可调配", objectMap.get(12) == null ? "" : objectMap.get(12).toString());
-            object.put("家庭电话", objectMap.get(13) == null ? "" : objectMap.get(13).toString());
-            object.put("家庭地址", objectMap.get(14) == null ? "" : objectMap.get(14).toString());
-            object.put("错误信息", objectMap.get(15) == null ? "" : objectMap.get(15).toString());
-            result.add(object);
+        if(dto.getCategory() != null && dto.getCategory() == 2 && dto.getBaseSemesterId() == null){
+            dto.setBaseSemesterId(semesterService.getLastSemester());
         }
-        return RT.ok(result);
-    }
 
-    @PostMapping("/score-import")
-    @ApiOperation(value = "成绩导入")
-    @XjrLog(value = "成绩导入", saveRequestData = false, saveResponseData = true)
-    public RT<List<Map<String, String>>> scoreImport(@RequestParam MultipartFile file) throws IOException {
-        List<BaseNewStudentScoreExcelVo> errorList = baseNewStudentService.scoreImport(file);
-        List<Map<String, String>> result = new ArrayList<>();
+        List<EnrollmentPlan> enrollmentPlanList = enrollmentPlanService.list(
+                new QueryWrapper<EnrollmentPlan>().lambda()
+                        .eq(EnrollmentPlan::getEnrollType, dto.getEnrollType())
+                        .eq(EnrollmentPlan::getGradeId, dto.getGradeId())
+                        .eq(EnrollmentPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(EnrollmentPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .orderByDesc(EnrollmentPlan::getId)
+        );
+        if(enrollmentPlanList.isEmpty()){
+            return RT.ok(new StudentReportRecordStatisticsVo());
+        }
 
-        for (BaseNewStudentScoreExcelVo objectMap : errorList) {
-            Map<String, String> object = new LinkedHashMap<>();
-            object.put("毕业学校", objectMap.getGraduateSchool());
-            object.put("姓名", objectMap.getName());
-            object.put("性别", objectMap.getGender());
-            object.put("班级", objectMap.getGraduateClass());
-            object.put("总成绩", objectMap.getScore().intValue() + "");
-            object.put("错误信息", "未能查询到该学生或该学生存在多个");
-            result.add(object);
+        StudentTryReadingReportPageDto recordPageDto = new StudentTryReadingReportPageDto();
+        recordPageDto.setEnrollmentPlanId(enrollmentPlanList.get(0).getId());
+        recordPageDto.setReportCategory(3);
+        List<StudentReportRecordPlanPageVo> dataList = recordService.getTryReadingList(recordPageDto);
+        StudentReportRecordStatisticsVo statisticsVo = new StudentReportRecordStatisticsVo();
+        statisticsVo.setAllCount(dataList.stream().count());
+
+        statisticsVo.setArrivedCount(dataList.stream().filter(x -> x.getReportTime() != null).count());
+        statisticsVo.setNotArrivedCount(dataList.stream().filter(x -> x.getReportTime() == null).count());
+        statisticsVo.setArrivedMaleCount(dataList.stream().filter(x -> x.getReportTime() != null && GenderDictionaryEnum.MALE.getValue().equals(x.getGender())).count());
+        statisticsVo.setArrivedFemaleCount(dataList.stream().filter(x -> x.getReportTime() != null && GenderDictionaryEnum.FEMALE.getValue().equals(x.getGender())).count());
+
+        statisticsVo.setStayMaleCount(dataList.stream().filter(
+                x -> GenderDictionaryEnum.MALE.getValue().equals(x.getGender())
+                        && StudyStatusEnum.InResidence.getCode().equals(x.getStduyStatusCn())
+                        && x.getReportTime() != null
+        ).count());
+        statisticsVo.setStayFemaleCount(dataList.stream().filter(
+                x -> GenderDictionaryEnum.FEMALE.getValue().equals(x.getGender())
+                        && StudyStatusEnum.InResidence.getCode().equals(x.getStduyStatusCn())
+                        && x.getReportTime() != null
+        ).count());
+        statisticsVo.setNotStayMaleCount(dataList.stream().filter(
+                x -> GenderDictionaryEnum.MALE.getValue().equals(x.getGender())
+                        && StudyStatusEnum.AttendDaySchool.getCode().equals(x.getStduyStatusCn())
+                        && x.getReportTime() != null
+        ).count());
+        statisticsVo.setNotStayFemaleCount(dataList.stream().filter(
+                x -> GenderDictionaryEnum.FEMALE.getValue().equals(x.getGender())
+                        && StudyStatusEnum.AttendDaySchool.getCode().equals(x.getStduyStatusCn())
+                        && x.getReportTime() != null
+        ).count());
+
+        if(dto.getCategory() != null && dto.getCategory() == 3){
+            Map<String, List<StudentReportRecordPlanPageVo>> graduatedUniversityMap = dataList.stream().filter(x -> x.getReportTime() != null && x.getGraduateSchool() != null)
+                    .collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getGraduateSchool));
+            List<ItemCountVo> graduatedUniversityList = new ArrayList<>();
+            for (String graduatedUniversity : graduatedUniversityMap.keySet()) {
+                graduatedUniversityList.add(
+                        new ItemCountVo(){{
+                            setItem(graduatedUniversity);
+                            setCount(graduatedUniversityMap.get(graduatedUniversity).size());
+                        }}
+                );
+            }
+            statisticsVo.setGraduatedUniversityList(graduatedUniversityList);
         }
-        return RT.ok(result);
-    }
 
-    @PostMapping("/active-account")
-    @ApiOperation(value = "激活账号")
-    @XjrLog(value = "激活账号", saveResponseData = true)
-    public RT<Boolean> activeAccount(@Valid @RequestBody ActiveAccountDto dto) {
-        User user = userService.getById(dto.getId());
-        user.setMobile(dto.getMobile());
-        user.setEnabledMark(EnabledMark.ENABLED.getCode());
-        user.setModifyDate(LocalDateTime.now());
-        userService.updateById(user);
-        // 新增家庭成员信息
-        if (StrUtil.isNotEmpty(dto.getParentName()) && StrUtil.isNotEmpty(dto.getParentMobile())) {
-            List<BaseStudentFamilyMember> list = familyMemberService.list(
-                    new QueryWrapper<BaseStudentFamilyMember>().lambda()
-                            .eq(BaseStudentFamilyMember::getName, dto.getParentName())
-                            .eq(BaseStudentFamilyMember::getUserId, dto.getId())
-                            .eq(BaseStudentFamilyMember::getMobile, dto.getParentMobile())
+        Map<String, List<StudentReportRecordPlanPageVo>> classMap = dataList.stream().filter(x -> x.getReportTime() != null && x.getClassName() != null)
+                .collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getClassName));
+        Map<String, List<StudentReportRecordPlanPageVo>> classNotMap = dataList.stream().filter(x -> x.getReportTime() == null && x.getClassName() != null)
+                .collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getClassName));
+        List<StudentReportRecordItemVo> classList = new ArrayList<>();
+        for (String className : classMap.keySet()) {
+            classList.add(
+                    new StudentReportRecordItemVo(){{
+                        setItem(className);
+                        setCount(classMap.get(className).size());
+                        if(classNotMap.get(className) != null && !(classNotMap.get(className).isEmpty())){
+                            setCount2(classNotMap.get(className).size());
+                        }
+                    }}
             );
-            BaseStudentFamilyMember member;
-            if (list.isEmpty()) {
-                member = new BaseStudentFamilyMember();
-                member.setUserId(user.getId());
-                member.setName(dto.getParentName());
-                member.setMobile(dto.getParentMobile());
-                member.setCreateDate(LocalDateTime.now());
-                member.setCreateUserId(StpUtil.getLoginIdAsLong());
-                familyMemberService.save(member);
-            } else {
-                member = list.get(0);
-            }
-            List<User> parents = userService.list(
-                    new QueryWrapper<User>().lambda()
-                            .eq(User::getUserName, dto.getParentMobile())
-                            .or()
-                            .eq(User::getMobile, dto.getParentMobile())
+        }
+        statisticsVo.setClassList(classList);
+
+        Map<String, List<StudentReportRecordPlanPageVo>> classTypeMap = dataList.stream().filter(x -> x.getReportTime() != null && x.getClassType() != null)
+                .collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getClassType));
+        Map<String, List<StudentReportRecordPlanPageVo>> classTypeNotMap = dataList.stream().filter(x -> x.getReportTime() == null && x.getClassType() != null)
+                .collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getClassType));
+        List<StudentReportRecordItemVo> classTypeList = new ArrayList<>();
+        for (String classType : classTypeMap.keySet()) {
+            classTypeList.add(
+                    new StudentReportRecordItemVo(){{
+                        setItem(classType);
+                        setCount(classTypeMap.get(classType).size());
+                        if(classTypeNotMap.get(classType) != null && !(classTypeNotMap.get(classType).isEmpty())){
+                            setCount2(classTypeNotMap.get(classType).size());
+                        }
+                    }}
             );
-            if (parents.isEmpty()) {
-                User parentUser = new User() {{
-                    setUserName(dto.getParentMobile());
-                    setName(dto.getParentName());
-                    setIsChangePassword(1);
-                    setDeleteMark(0);
-                    setEnabledMark(1);
-                    setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
-                    setMobile(dto.getParentMobile());
-                }};
-                userService.save(parentUser);
-
-                userRoleRelationService.save(new UserRoleRelation() {{
-                    setUserId(parentUser.getId());
-                    setRoleId(4L);
-                }});
-
-                BaseUserStudent userStudent = new BaseUserStudent();
-                userStudent.setStudentId(user.getId());
-                userStudent.setStudentNane(user.getName());
-                userStudent.setStudentIdentity(user.getCredentialNumber());
-                userStudent.setCreateDate(new Date());
-                userStudent.setUserId(parentUser.getId());
-                userStudent.setStatus(1);
-                userStudentService.save(userStudent);
-            } else {
-                User parentUser = parents.get(0);
-                BaseUserStudent userStudent = new BaseUserStudent();
-                userStudent.setStudentId(user.getId());
-                userStudent.setStudentNane(user.getName());
-                userStudent.setStudentIdentity(user.getCredentialNumber());
-                userStudent.setCreateDate(new Date());
-                userStudent.setUserId(parentUser.getId());
-                userStudent.setStatus(1);
-                userStudentService.save(userStudent);
-            }
         }
+        statisticsVo.setClassTypeList(classTypeList);
+
+        Map<String, List<StudentReportRecordPlanPageVo>> majorMap = dataList.stream().filter(x -> x.getReportTime() != null && x.getMajorName() != null).collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getMajorName));
+        Map<String, List<StudentReportRecordPlanPageVo>> majorNotMap = dataList.stream().filter(x -> x.getReportTime() == null && x.getMajorName() != null).collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getMajorName));
+        List<StudentReportRecordItemVo> majorList = new ArrayList<>();
+        for (String majorName : majorMap.keySet()) {
+            majorList.add(
+                    new StudentReportRecordItemVo(){{
+                        setItem(majorName);
+                        setCount(majorMap.get(majorName).size());
+                        if(majorNotMap.get(majorName) != null && !(majorNotMap.get(majorName).isEmpty())){
+                            setCount2(majorNotMap.get(majorName).size());
+                        }
+                    }}
+            );
+        }
+        statisticsVo.setMajorList(majorList);
+
+        Map<String, List<StudentReportRecordPlanPageVo>> deptMap = dataList.stream().filter(x -> x.getReportTime() != null && x.getDeptName() != null).collect(Collectors.groupingBy(StudentReportRecordPlanPageVo::getDeptName));
+        List<ItemCountVo> deptList = new ArrayList<>();
+        for (String deptName : deptMap.keySet()) {
+            deptList.add(
+                    new ItemCountVo(){{
+                        setItem(deptName);
+                        setCount(deptMap.get(deptName).size());
+                    }}
+            );
+        }
+        statisticsVo.setDeptList(deptList);
 
-
-        //新增白名单信息
-        List<WhitelistManagement> managementList = whitelistManagementService.list(
-                new QueryWrapper<WhitelistManagement>().lambda()
-                        .eq(WhitelistManagement::getUserId, dto.getId())
+        BigDecimal divide = BigDecimal.ZERO;
+        if( statisticsVo.getAllCount() != 0){
+            divide = BigDecimal.valueOf(statisticsVo.getArrivedCount()).divide(BigDecimal.valueOf(statisticsVo.getAllCount()), 4, RoundingMode.HALF_UP);
+        }
+        statisticsVo.setReportRate(divide.doubleValue());
+
+        //查询年级趋势
+        List<BaseGrade> gradeList = gradeService.list(
+                new QueryWrapper<BaseGrade>().lambda()
+                        .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseGrade::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .eq(BaseGrade::getStatus, 1)
+                        .orderByDesc(BaseGrade::getTitle)
         );
-        if (managementList.isEmpty()) {
-            WhitelistManagement whitelistManagement = new WhitelistManagement() {{
-                setName(user.getName());
-                setUserId(user.getId());
-                setCreateDate(new Date());
-                setCredentialNumber(user.getCredentialNumber());
-                setPhone(user.getMobile());
-            }};
-            whitelistManagementService.save(whitelistManagement);
-        } else {
-            WhitelistManagement whitelistManagement = managementList.get(0);
-            whitelistManagement.setName(user.getName());
-            whitelistManagement.setUserId(user.getId());
-            whitelistManagement.setModifyDate(new Date());
-            whitelistManagement.setCredentialNumber(user.getCredentialNumber());
-            whitelistManagement.setPhone(user.getMobile());
-            whitelistManagementService.updateById(whitelistManagement);
+        List<ItemCountVo> gradeDataList = new ArrayList<>();
+        for (int i = 0; i < 3; i ++){
+            BaseGrade baseGrade = gradeList.get(i);
+
+            List<EnrollmentPlan> enrollmentPlans = enrollmentPlanService.list(
+                    new QueryWrapper<EnrollmentPlan>().lambda()
+                            .eq(EnrollmentPlan::getGradeId, baseGrade.getId())
+                            .eq(EnrollmentPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(EnrollmentPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .orderByDesc(EnrollmentPlan::getId)
+            );
+            int gradeCount = 0;
+            for (EnrollmentPlan enrollmentPlan : enrollmentPlans) {
+                StudentTryReadingReportPageDto gradeRecordPageDto = new StudentTryReadingReportPageDto();
+                gradeRecordPageDto.setEnrollmentPlanId(enrollmentPlan.getId());
+                gradeRecordPageDto.setIsReport(1);
+                gradeRecordPageDto.setReportCategory(3);
+                gradeCount += recordService.getTryReadingList(gradeRecordPageDto).size();
+            }
+            ItemCountVo itemCountVo = new ItemCountVo();
+            itemCountVo.setItem(baseGrade.getName());
+            itemCountVo.setCount(gradeCount);
+            gradeDataList.add(itemCountVo);
         }
+        Collections.sort(gradeDataList, Comparator.comparing(ItemCountVo::getItem));
+        statisticsVo.setGradeList(gradeDataList);
 
-        CompletableFuture.runAsync(() -> {
-            List<User> userList = userService.list();
-            redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
-
-            List<UserRoleRelation> userRoleRelationList = userRoleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
-            redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
-
-            whitelistManagementService.loadCaches();
-        });
-
-        return RT.ok(true);
+        return RT.ok(statisticsVo);
     }
 
-    @PostMapping("/report-export-query")
-    @ApiOperation(value = "导出")
+    @PostMapping(value = "/export-query")
+    @ApiOperation(value="导出")
+    @SaCheckPermission("studentreportrecord:detail")
     @XjrLog(value = "导出")
-    public ResponseEntity<byte[]> exportData(@Valid @RequestBody BaseNewStudentPageDto dto) {
-        if (dto.getBaseSemesterId() == null) {
-            LambdaQueryWrapper<BaseSemester> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper
-                    .orderByDesc(BaseSemester::getStartDate)
-                    .select(BaseSemester.class, x -> VoToColumnUtil.fieldsToColumns(BaseSemester.class).contains(x.getProperty()));
-            List<BaseSemester> semesterList = semesterService.list(queryWrapper);
-            if (!semesterList.isEmpty()) {
-                dto.setBaseSemesterId(semesterList.get(0).getId());
-            }
-        }
+    public ResponseEntity<byte[]> exportQuerty(@Valid @RequestBody StudentTryReadingReportPageDto dto){
+        List<StudentReportRecordExcelVo> dataList = new ArrayList<>();
+
         List<String> roleList = StpUtil.getRoleList();
-        if (roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getTeacherId() == null) {
-            dto.setTeacherId(StpUtil.getLoginIdAsLong());
+        if(roleList.contains(RoleCodeEnum.TEACHER.getCode()) && roleList.contains(RoleCodeEnum.CLASSTE.getCode())){
+            if(dto.getClassId() == null){
+                dto.setTeacherId(StpUtil.getLoginIdAsLong());
+            }
         }
-        List<BaseNewStudentPageVo> reportList = baseNewStudentService.getReportList(dto);
-        List<BaseNewStudentExportVo> exportVos = new ArrayList<>();
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
-        for (BaseNewStudentPageVo el : reportList) {
-            BaseNewStudentExportVo vo = BeanUtil.toBean(el, BaseNewStudentExportVo.class);
-            if (el.getIsReport() == 1) {
-                vo.setReportStatus("是");
-            } else if (el.getIsReport() == 0) {
-                vo.setReportStatus("否");
+        dto.setReportCategory(3);
+        List<StudentReportRecordPlanPageVo> planPageList = recordService.getTryReadingList(dto);
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        for (StudentReportRecordPlanPageVo pageVo : planPageList) {
+            StudentReportRecordExcelVo excelVo = BeanUtil.toBean(pageVo, StudentReportRecordExcelVo.class);
+            if(pageVo.getReportTime() != null){
+                excelVo.setReportTime(sdf.format(pageVo.getReportTime()));
             }
-            if (el.getReportTime() != null) {
-                vo.setReportTime(el.getReportTime().format(formatter));
+            excelVo.setIsReport("否");
+            if(pageVo.getIsReport() != null && pageVo.getIsReport() == 1){
+                excelVo.setIsReport("是");
             }
-            exportVos.add(vo);
+
+            dataList.add(excelVo);
         }
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, BaseNewStudentExportVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(exportVos);
-
-        return RT.fileStream(bot.toByteArray(), "RoomBed" + ExcelTypeEnum.XLSX.getValue());
+        EasyExcel.write(bot, StudentReportRecordExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
+        String fileName = "exportQuerty" + ExcelTypeEnum.XLSX.getValue();
+        return RT.fileStream(bot.toByteArray(), fileName);
     }
 
-    @PostMapping("/change-banding-status")
-    @ApiOperation(value = "修改分班状态")
-    @SaCheckPermission("basenewstudent:add")
-    @XjrLog(value = "修改分班状态", saveResponseData = true)
-    public RT<Boolean> changeBandingStatus(@Valid @RequestBody List<ChangeBandingStatusDto> dto) {
-        for (ChangeBandingStatusDto el : dto) {
-            BaseNewStudent newStudent = baseNewStudentService.getById(el.getId());
-
-            UpdateWrapper<BaseNewStudent> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.eq("id", newStudent.getId());
-            updateWrapper.setSql("is_can_banding = " + el.getIsCanBanding());
-            if (StrUtil.isNotEmpty(el.getRemarks())) {
-                updateWrapper.setSql("remarks = '" + el.getRemarks() + "'");
-            } else {
-                updateWrapper.setSql("remarks = null");
+    @GetMapping(value = "/class-list")
+    @ApiOperation(value="查询班级信息")
+    @SaCheckPermission("studentreportrecord:detail")
+    @XjrLog(value = "查询班级信息")
+    public RT<List<BandingTaskClassPageVo>> classList(@Valid StudentReportRecordPageDto dto){
+        BandingTaskClassPageDto classDto = new BandingTaskClassPageDto();
+        if(dto.getEnrollmentPlanId() == null){
+            if(dto.getTeacherId() != null){
+                classDto.setTeacherId(dto.getTeacherId());
+            }else{
+                classDto.setTeacherId(StpUtil.getLoginIdAsLong());
+            }
+            StudentReportPlan plan = reportPlanService.getLastNewStudentReportPlan();
+            if(plan == null){
+                return RT.ok(new ArrayList<>());
+            }
+            classDto.setBandingTaskId(plan.getBandingTaskId());
+        }else{
+            EnrollmentPlan enrollmentPlan = enrollmentPlanService.getById(dto.getEnrollmentPlanId());
+            if(enrollmentPlan != null){
+                List<BandingTask> list = bandingTaskService.list(
+                        new QueryWrapper<BandingTask>().lambda()
+                                .eq(BandingTask::getEnrollType, enrollmentPlan.getEnrollType())
+                                .eq(BandingTask::getGradeId, enrollmentPlan.getGradeId())
+                                .eq(BandingTask::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                .eq(BandingTask::getEnabledMark, EnabledMark.ENABLED.getCode())
+                                .orderByDesc(BandingTask::getId)
+                );
+                if(!list.isEmpty()){
+                    classDto.setBandingTaskId(list.get(0).getId());
+                }
+            }
+            List<String> roleList = StpUtil.getRoleList();
+            if(roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
+                classDto.setTeacherId(StpUtil.getLoginIdAsLong());
             }
-            baseNewStudentService.update(newStudent, updateWrapper);
         }
 
-        return RT.ok(true);
+        List<BandingTaskClassPageVo> list = bandingTaskClassService.getList(classDto);
+        return RT.ok(list);
     }
 
+
 }

+ 29 - 3
src/main/java/com/xjrsoft/module/student/controller/StudentReportPlanController.java

@@ -13,6 +13,7 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.LocalDateTimeUtil;
 import com.xjrsoft.common.utils.TreeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.banding.entity.BandingTask;
@@ -100,6 +101,7 @@ public class StudentReportPlanController {
     @XjrLog(value = "新增学生报到计划")
     public RT<Boolean> add(@Valid @RequestBody AddStudentReportPlanDto dto) {
         StudentReportPlan studentReportPlan = BeanUtil.toBean(dto, StudentReportPlan.class);
+        studentReportPlan.setCategory(1);
         boolean isSuccess = studentReportPlanService.add(studentReportPlan);
         return RT.ok(isSuccess);
     }
@@ -111,8 +113,10 @@ public class StudentReportPlanController {
     public RT<Boolean> update(@Valid @RequestBody UpdateStudentReportPlanDto dto) {
         StudentReportPlan reportPlan = studentReportPlanService.getById(dto.getId());
         BeanUtil.copyProperties(dto, reportPlan);
+        if((reportPlan.getCategory() == 2 || reportPlan.getCategory() == 3) && LocalDateTimeUtil.isDateTimeInRange(LocalDateTime.now(), reportPlan.getStartTime(), reportPlan.getEndTime())){
+            reportPlan.setStatus(1);
+        }
         return RT.ok(studentReportPlanService.update(reportPlan));
-
     }
 
     @DeleteMapping
@@ -230,9 +234,9 @@ public class StudentReportPlanController {
     }
 
     @GetMapping(value = "/try-reading-plan")
-    @ApiOperation(value = "根据分班任务id查询试读报到计划信息")
+    @ApiOperation(value = "根据招生计划id查询试读报到计划信息")
     @SaCheckPermission("bandingrule:try-reading-plan")
-    @XjrLog(value = "根据分班任务id查询试读报到计划信息")
+    @XjrLog(value = "根据招生计划id查询试读报到计划信息")
     public RT<StudentReportPlanVo> tryReadingPlan(@RequestParam Long id) {
         EnrollmentPlan enrollmentPlan = enrollmentPlanService.getById(id);
         StudentReportPlan plan = studentReportPlanService.getOne(
@@ -242,6 +246,28 @@ public class StudentReportPlanController {
                         .innerJoin(BandingTask.class, BandingTask::getId, StudentReportPlan::getBandingTaskId)
                         .eq(BandingTask::getEnrollType, enrollmentPlan.getEnrollType())
                         .eq(BandingTask::getGradeId, enrollmentPlan.getGradeId())
+                        .eq(StudentReportPlan::getCategory, 2)
+        );
+        if (plan == null) {
+            return RT.error("未能查询到有报到学生,无法设置");
+        }
+        return RT.ok(BeanUtil.toBean(plan, StudentReportPlanVo.class));
+    }
+
+    @GetMapping(value = "/new-student-plan")
+    @ApiOperation(value = "根据招生计划id查询新生报到计划信息")
+    @SaCheckPermission("bandingrule:new-student-plan")
+    @XjrLog(value = "根据招生计划id查询新生报到计划信息")
+    public RT<StudentReportPlanVo> newStudentPlan(@RequestParam Long id) {
+        EnrollmentPlan enrollmentPlan = enrollmentPlanService.getById(id);
+        StudentReportPlan plan = studentReportPlanService.getOne(
+                new MPJLambdaWrapper<StudentReportPlan>()
+                        .select(StudentReportPlan::getId)
+                        .select(StudentReportPlan.class, x -> VoToColumnUtil.fieldsToColumns(StudentReportPlan.class).contains(x.getProperty()))
+                        .innerJoin(BandingTask.class, BandingTask::getId, StudentReportPlan::getBandingTaskId)
+                        .eq(BandingTask::getEnrollType, enrollmentPlan.getEnrollType())
+                        .eq(BandingTask::getGradeId, enrollmentPlan.getGradeId())
+                        .eq(StudentReportPlan::getCategory, 3)
         );
         if (plan == null) {
             return RT.error("未能查询到有报到学生,无法设置");

+ 9 - 2
src/main/java/com/xjrsoft/module/student/controller/StudentTryReadingReportController.java

@@ -105,12 +105,14 @@ public class StudentTryReadingReportController {
     @SaCheckPermission("tryreadingreport:detail")
     @XjrLog(value="试读报到(分页)")
     public RT<PageOutput<StudentReportRecordPlanPageVo>> page(@Valid StudentTryReadingReportPageDto dto){
+        dto.setReportCategory(2);
         List<String> roleList = StpUtil.getRoleList();
         if(roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
             dto.setTeacherId(StpUtil.getLoginIdAsLong());
         }
         if(dto.getIsMoible() != null && dto.getIsMoible() == 1){
             StudentReportPlan plan = reportPlanService.getLastTryReadingPlan();
+            dto.setStudentReportPlanId(plan.getId());
             BandingTask bandingTask = bandingTaskService.getById(plan.getBandingTaskId());
             List<EnrollmentPlan> enrollmentPlans = enrollmentPlanService.list(
                     new QueryWrapper<EnrollmentPlan>().lambda()
@@ -169,6 +171,7 @@ public class StudentTryReadingReportController {
         for (Long id : ids) {
             recordService.tryReadingSign(new StudentReportSignDto(){{
                 setId(id);
+                setIsBatch(1);
             }});
         }
         return RT.ok(true);
@@ -214,6 +217,7 @@ public class StudentTryReadingReportController {
                 dto.setTeacherId(StpUtil.getLoginIdAsLong());
             }
         }
+        dto.setReportCategory(2);
         List<StudentReportRecordPlanPageVo> planPageList = recordService.getTryReadingList(dto);
 
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -283,7 +287,10 @@ public class StudentTryReadingReportController {
     @SaCheckPermission("studentreportrecord:detail")
     @XjrLog(value = "班级数据统计")
     public RT<BandingTaskClassReportStatisticsVo> classStatistics(@RequestParam Long classId){
-        return RT.ok(bandingTaskClassService.getTryReadingReportClassStatistics(classId));
+        return RT.ok(bandingTaskClassService.getTryReadingReportClassStatistics(new StudentTryReadingReportPageDto(){{
+            setClassId(classId);
+            setReportCategory(2);
+        }}));
     }
 
     @GetMapping(value = "/statistics")
@@ -322,7 +329,7 @@ public class StudentTryReadingReportController {
 
         StudentTryReadingReportPageDto recordPageDto = new StudentTryReadingReportPageDto();
         recordPageDto.setEnrollmentPlanId(enrollmentPlanList.get(0).getId());
-
+        recordPageDto.setReportCategory(2);
         List<StudentReportRecordPlanPageVo> dataList = recordService.getTryReadingList(recordPageDto);
         StudentReportRecordStatisticsVo statisticsVo = new StudentReportRecordStatisticsVo();
         statisticsVo.setAllCount(dataList.stream().count());

+ 5 - 0
src/main/java/com/xjrsoft/module/student/dto/StudentReportSignDto.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.student.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -19,4 +20,8 @@ public class StudentReportSignDto {
 
     @ApiModelProperty("班级id")
     private Long classId;
+
+    @JsonIgnore
+    @ApiModelProperty("是否批量")
+    private Integer isBatch = 0;
 }

+ 5 - 0
src/main/java/com/xjrsoft/module/student/dto/StudentTryReadingReportPageDto.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.student.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -72,4 +73,8 @@ public class StudentTryReadingReportPageDto extends PageInput {
     @ApiModelProperty("是否移动端(1:是 0:否)")
     private Integer isMoible;
 
+    @JsonIgnore
+    @ApiModelProperty("报到类别")
+    private Integer reportCategory;
+
 }

+ 2 - 1
src/main/java/com/xjrsoft/module/student/entity/PbCseFeeobjupdate.java

@@ -136,5 +136,6 @@ public class PbCseFeeobjupdate implements Serializable {
     @ApiModelProperty("更新时间")
     private String updatetime;
 
-
+    @ApiModelProperty("毕业班级")
+    private String gradclass;
 }

+ 0 - 5
src/main/java/com/xjrsoft/module/student/entity/StudentTransfer.java

@@ -65,11 +65,6 @@ public class StudentTransfer implements Serializable {
     @ApiModelProperty("有效标志")
     @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
-    /**
-     * 序号
-     */
-    @ApiModelProperty("序号")
-    private Integer sortCode;
 
     @ApiModelProperty("学生id")
     private Long studentUserId;

+ 2 - 0
src/main/java/com/xjrsoft/module/student/service/IStudentReportPlanService.java

@@ -56,4 +56,6 @@ public interface IStudentReportPlanService extends MPJBaseService<StudentReportP
     List<StudentReportPlanClassRelation> getStudentReportPlanClassRelationList(Long id);
 
     StudentReportPlan getLastTryReadingPlan();
+
+    StudentReportPlan getLastNewStudentReportPlan();
 }

+ 14 - 0
src/main/java/com/xjrsoft/module/student/service/impl/StudentReportPlanServiceImpl.java

@@ -257,4 +257,18 @@ public class StudentReportPlanServiceImpl extends MPJBaseServiceImpl<StudentRepo
         }
         return list.get(0);
     }
+
+    @Override
+    public StudentReportPlan getLastNewStudentReportPlan() {
+        List<StudentReportPlan> list = this.list(
+                new QueryWrapper<StudentReportPlan>().lambda()
+                        .eq(StudentReportPlan::getCategory, 3)
+                        .eq(StudentReportPlan::getStatus, 1)
+                        .orderByDesc(StudentReportPlan::getEndTime)
+        );
+        if (list.isEmpty()) {
+            return null;
+        }
+        return list.get(0);
+    }
 }

+ 2 - 2
src/main/java/com/xjrsoft/module/student/service/impl/StudentReportRecordServiceImpl.java

@@ -328,7 +328,7 @@ public class StudentReportRecordServiceImpl extends MPJBaseServiceImpl<StudentRe
         StudentReportRecord record = this.getById(dto.getId());
         LocalDateTime now = LocalDateTime.now();
         StudentReportPlan reportPlan = planMapper.selectById(record.getStudentReportPlanId());
-        if(!LocalDateTimeUtil.isDateTimeInRange(now, reportPlan.getStartTime(), reportPlan.getEndTime())){
+        if(dto.getIsBatch() == 0 && !LocalDateTimeUtil.isDateTimeInRange(now, reportPlan.getStartTime(), reportPlan.getEndTime())){
             throw new MyException("不在修改时间内,无法修改");
         }
 
@@ -406,7 +406,7 @@ public class StudentReportRecordServiceImpl extends MPJBaseServiceImpl<StudentRe
                     setCredentialNumber(student.getCredentialNumber());
                     setCredentialType("ZZLS10007");
                     setMobile(student.getMobile());
-                    setEnabledMark(EnabledMark.DISABLED.getCode());
+                    setEnabledMark(EnabledMark.ENABLED.getCode());
                     setGender(student.getGender());
                     setIsChangePassword(1);
                     setBirthDate(birthDate.atStartOfDay());

+ 3 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoDetailVo.java

@@ -126,4 +126,7 @@ public class BaseStudentInfoDetailVo {
 
     @ApiModelProperty("学生档案编号")
     private String archivesNumber;
+
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentInfoPageVo.java

@@ -120,4 +120,7 @@ public class BaseStudentInfoPageVo {
 
     @ApiModelProperty("学生类别")
     private String studentForm;
+
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
 }

+ 5 - 4
src/main/java/com/xjrsoft/module/workflow/dto/MyExaminePageDto.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
 
@@ -23,14 +24,14 @@ public class MyExaminePageDto extends PageInput {
      * 开始时间
      */
     @ApiModelProperty("开始时间")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date startTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startTime;
     /**
      * 结束时间
      */
     @ApiModelProperty("结束时间")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date endTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endTime;
     /**
      * 模板名称
      */

+ 1 - 1
src/main/resources/mapper/oa/NewsMapper.xml

@@ -34,7 +34,7 @@
         select t.*,t2.name as create_user_name from xjr_oa_news t
         left join xjr_user t2 on t.create_user_id = t2.id
         left join xjr_oa_news_relation t3 on t.id = t3.news_id
-        where t.delete_mark = 0
+        where t.delete_mark = 0 and t.enabled_mark = 1
         and (t.send_end_date > now() or t.send_end_date is null)
         and t.status = 2 and t3.user_id = #{dto.loginId}
         <if test="dto.type != null and dto.type == 1">

+ 3 - 1
src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml

@@ -31,7 +31,8 @@
             t8.name AS stduy_status,
             t13.name AS roll_modality,
             t11.name AS student_form,
-            CONCAT(t16.name, ' ', t15.room_name, ' ', t14.bed_number) AS bed_info
+            t2.credential_number,
+        CONCAT(t16.name, ' ', t15.room_name, ' ', t14.bed_number) AS bed_info
         FROM base_student t1
         INNER JOIN xjr_user t2 ON t1.user_id = t2.id
         INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
@@ -76,6 +77,7 @@
         SELECT t2.id,
                t2.name AS student_name,
                t2.mobile AS phone,
+               t2.credential_number,
                t2.gender,
                t11.name AS genderCn,
                t1.student_id,

+ 8 - 0
src/main/resources/mapper/student/StudentReportRecordMapper.xml

@@ -245,6 +245,10 @@
         WHERE t1.delete_mark = 0 AND t1.enabled_mark = 1
         and t12.status in(1,2)
         and t3.enrollment_plan_id = #{dto.enrollmentPlanId}
+        and t12.category = #{dto.reportCategory}
+        <if test="dto.studentReportPlanId != null">
+            and t1.student_report_plan_id = #{dto.studentReportPlanId}
+        </if>
         <if test="dto.keyword != null and dto.keyword != ''">
             and t1.name like concat('%', #{dto.keyword},'%')
         </if>
@@ -320,6 +324,10 @@
         WHERE t1.delete_mark = 0 AND t1.enabled_mark = 1
         and t12.status in(1,2)
         and t3.enrollment_plan_id = #{dto.enrollmentPlanId}
+        and t12.category = #{dto.reportCategory}
+        <if test="dto.studentReportPlanId != null">
+            and t1.student_report_plan_id = #{dto.studentReportPlanId}
+        </if>
         <if test="dto.keyword != null and dto.keyword != ''">
             and t1.name like concat('%', #{dto.keyword},'%')
         </if>

+ 9 - 0
src/main/resources/mapper/workflow/WorkflowExtraMapper.xml

@@ -35,6 +35,15 @@
             or t.start_user_name like concat('%',#{dto.keyword}, '%')
             )
         </if>
+        <if test="dto.name != null and dto.name != ''">
+            and (t.task_name like concat('%',#{dto.name}, '%')
+            or t.process_name like concat('%',#{dto.name}, '%')
+            or t.schema_name like concat('%',#{dto.name}, '%')
+            )
+        </if>
+        <if test="dto.startTime != null and dto.endTime != null">
+            and date_format(t.start_time, '%Y-%m-%d') between #{dto.startTime} and #{dto.endTime}
+        </if>
     order by t.start_time DESC
     </select>
 

+ 125 - 0
src/test/java/com/xjrsoft/module/liteflow/node/StudentTransferNodeTest.java

@@ -0,0 +1,125 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.dev33.satoken.secure.BCrypt;
+import cn.hutool.core.convert.Convert;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.utils.LocalDateUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.mapper.BaseClassMapper;
+import com.xjrsoft.module.organization.dto.GetUserByParamDto;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.student.entity.BaseClassMajorSet;
+import com.xjrsoft.module.student.entity.BaseNewStudent;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+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.IBaseNewStudentService;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author dzx
+ * @date 2025/3/21
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = XjrSoftApplication.class)
+class StudentTransferNodeTest {
+    @Autowired
+    private StudentTransferMapper studentTransferMapper;
+    @Autowired
+    private IBaseStudentSchoolRollService studentSchoolRollService;
+
+    @Autowired
+    private BaseClassMapper baseClassMapper;
+
+    @Autowired
+    private BaseClassMajorSetMapper baseClassMajorSetMapper;
+
+    @Autowired
+    private IBaseNewStudentService newStudentService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private CommonPropertiesConfig propertiesConfig;
+
+    @Test
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Long formId = 1902955784296742912L;
+        if (formId != null) {
+            //查询出数据
+            StudentTransfer studentTransfer = studentTransferMapper.selectById(formId);
+
+            BaseNewStudent newStudent = newStudentService.getById(studentTransfer.getStudentUserId());
+            User user = userService.getUserByParam(
+                    new GetUserByParamDto() {{
+                        setCredentialNumber(newStudent.getCredentialNumber());
+                    }}
+            );
+            LocalDate birthDate = LocalDateUtil.getBirthDate(newStudent.getCredentialNumber());
+            BaseClass baseClass = baseClassMapper.selectById(studentTransfer.getClassId());
+            if(user == null){
+                User xjrUser = new User() {{
+                    setCreateDate(LocalDateTime.now());
+                    setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+                    setName(newStudent.getName());
+                    setUserName(newStudent.getCredentialNumber());
+                    setCredentialNumber(newStudent.getCredentialNumber());
+                    setCredentialType("ZZLS10007");
+                    setMobile(newStudent.getMobile());
+                    setEnabledMark(EnabledMark.ENABLED.getCode());
+                    setGender(newStudent.getGender());
+                    setIsChangePassword(1);
+                    setBirthDate(birthDate.atStartOfDay());
+                }};
+                userService.save(xjrUser);
+
+                BaseClassMajorSet majorSet = baseClassMajorSetMapper.selectOne(
+                        new QueryWrapper<BaseClassMajorSet>().lambda()
+                                .eq(BaseClassMajorSet::getClassId, studentTransfer.getClassId())
+                                .eq(BaseClassMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+                BaseStudentSchoolRoll roll = new BaseStudentSchoolRoll();
+                roll.setStduyStatus(studentTransfer.getStudyStatus());
+                roll.setClassId(studentTransfer.getClassId());
+                roll.setEnrollType(baseClass.getEnrollType());
+                roll.setCreateDate(LocalDateTime.now());
+                roll.setGradeId(baseClass.getGradeId());
+                roll.setMajorSetId(majorSet.getMajorSetId());
+                roll.setCreateUserId(studentTransfer.getCreateUserId());
+                roll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+                roll.setUserId(xjrUser.getId());
+                roll.setDeleteMark(DeleteMark.NODELETE.getCode());
+                roll.setEnabledMark(EnabledMark.ENABLED.getCode());
+                //新增学籍信息
+                studentSchoolRollService.save(roll);
+            }else{
+                studentSchoolRollService.updateStudentClass(studentTransfer.getClassId(), user.getId());
+            }
+
+            newStudent.setRemarks("通过插班进入" + baseClass.getName());
+            newStudent.setStatus(1);
+            newStudent.setOperateMode(2);
+            newStudentService.updateById(newStudent);
+        }
+    }
+}