Bladeren bron

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

大数据与最优化研究所 9 maanden geleden
bovenliggende
commit
f281c7a16e
22 gewijzigde bestanden met toevoegingen van 1450 en 251 verwijderingen
  1. 2 0
      src/main/java/com/xjrsoft/module/banding/service/IBandingTaskClassStudentService.java
  2. 231 220
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java
  3. 43 14
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskServiceImpl.java
  4. 27 0
      src/main/java/com/xjrsoft/module/organization/dto/GetUserByParamDto.java
  5. 3 0
      src/main/java/com/xjrsoft/module/organization/service/IUserService.java
  6. 25 0
      src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java
  7. 429 0
      src/main/java/com/xjrsoft/module/student/controller/BaseNewStudentReportController.java
  8. 30 0
      src/main/java/com/xjrsoft/module/student/controller/StudentReportPlanController.java
  9. 158 0
      src/main/java/com/xjrsoft/module/student/controller/StudentTryReadingReportController.java
  10. 3 0
      src/main/java/com/xjrsoft/module/student/dto/StudentReportRecordPageDto.java
  11. 4 0
      src/main/java/com/xjrsoft/module/student/dto/StudentReportSignDto.java
  12. 7 0
      src/main/java/com/xjrsoft/module/student/entity/StudentReportPlan.java
  13. 0 4
      src/main/java/com/xjrsoft/module/student/entity/StudentReportRecord.java
  14. 4 0
      src/main/java/com/xjrsoft/module/student/mapper/StudentReportRecordMapper.java
  15. 2 0
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentSchoolRollService.java
  16. 11 0
      src/main/java/com/xjrsoft/module/student/service/IStudentReportRecordService.java
  17. 49 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java
  18. 7 6
      src/main/java/com/xjrsoft/module/student/service/impl/StudentReportPlanServiceImpl.java
  19. 271 1
      src/main/java/com/xjrsoft/module/student/service/impl/StudentReportRecordServiceImpl.java
  20. 120 6
      src/main/resources/mapper/student/StudentReportRecordMapper.xml
  21. 14 0
      src/main/resources/sqlScript/20250307_sql.sql
  22. 10 0
      src/main/resources/sqlScript/20250310_sql.sql

+ 2 - 0
src/main/java/com/xjrsoft/module/banding/service/IBandingTaskClassStudentService.java

@@ -45,6 +45,8 @@ public interface IBandingTaskClassStudentService extends MPJBaseService<BandingT
 
     Boolean removeStudent(ChangeClassDto dto);
 
+    Boolean removeStudent(List<Long> studentIds, Long bandingTaskId);
+
 
     List<BaseNewStudentPageDto> satisfyStudent(StudentDto dto);
 

+ 231 - 220
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java

@@ -1,63 +1,36 @@
 package com.xjrsoft.module.banding.service.impl;
 
-import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
-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.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
-import com.xjrsoft.common.utils.RedisUtil;
-import com.xjrsoft.config.CommonPropertiesConfig;
-import com.xjrsoft.module.banding.dto.BandingTaskClassStudentPageDto;
+import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.banding.dto.ChangeClassDto;
 import com.xjrsoft.module.banding.dto.StudentDto;
-import com.xjrsoft.module.banding.entity.BandingTask;
 import com.xjrsoft.module.banding.entity.BandingTaskClass;
 import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
 import com.xjrsoft.module.banding.mapper.BandingTaskClassMapper;
 import com.xjrsoft.module.banding.mapper.BandingTaskClassStudentMapper;
-import com.xjrsoft.module.banding.mapper.BandingTaskMapper;
 import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
-import com.xjrsoft.module.banding.vo.BandingTaskClassSureListVo;
-import com.xjrsoft.module.base.entity.BaseClass;
-import com.xjrsoft.module.base.entity.BaseMajorSet;
-import com.xjrsoft.module.base.mapper.BaseMajorSetMapper;
-import com.xjrsoft.module.base.service.IBaseClassService;
-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.base.entity.BaseSemester;
+import com.xjrsoft.module.base.service.IBaseSemesterService;
 import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
-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.mapper.BaseClassMajorSetMapper;
-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.IBaseStudentService;
+import com.xjrsoft.module.student.entity.StudentReportPlan;
+import com.xjrsoft.module.student.entity.StudentReportRecord;
+import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
+import com.xjrsoft.module.student.service.IStudentReportPlanService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
 
 /**
 * @title: 新生分班任务
@@ -69,19 +42,11 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<BandingTaskClassStudentMapper, BandingTaskClassStudent> implements IBandingTaskClassStudentService {
     private final BandingTaskClassMapper taskClassMapper;
-    private final BandingTaskMapper bandingTaskMapper;
-    private final IBaseNewStudentService newStudentService;
 
-    private final IBaseClassService classService;
-    private final BaseClassMajorSetMapper classMajorSetMapper;
-    private final CommonPropertiesConfig propertiesConfig;
-    private final IUserService userService;
-    private final IUserRoleRelationService roleRelationService;
-    private final IBaseStudentSchoolRollService schoolRollService;
-    private final IBaseStudentService studentService;
-    private final IBaseStudentFamilyService familyService;
-    private final BaseMajorSetMapper majorSetMapper;
-    private final RedisUtil redisUtil;
+    private final IStudentReportPlanService reportPlanService;
+    private final IBaseSemesterService semesterService;
+    private final StudentReportRecordMapper reportRecordMapper;
+
     @Override
     public Boolean add(BandingTaskClassStudent bandingTaskClass) {
         bandingTaskClass.setCreateDate(new Date());
@@ -110,8 +75,21 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                 new QueryWrapper<BandingTaskClassStudent>().lambda()
                         .in(BandingTaskClassStudent::getNewStudentId, dto.getNewStudentIds())
         );
+
+        //新增报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
+        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)
+        );
+
         List<BandingTaskClassStudent> dataList = new ArrayList<>();
         long createUserId = StpUtil.getLoginIdAsLong();
+
+        List<StudentReportRecord> insertList = new ArrayList<>();
         for (Long newStudentId : dto.getNewStudentIds()) {
             dataList.add(
                     new BandingTaskClassStudent(){{
@@ -125,187 +103,205 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                         }
                     }}
             );
+            insertList.add(
+                    new StudentReportRecord(){{
+                        setCreateDate(new Date());
+                        setCreateUserId(StpUtil.getLoginIdAsLong());
+                        setUserId(newStudentId);
+                        setStudentReportPlanId(plan.getId());
+                        setDeleteMark(DeleteMark.NODELETE.getCode());
+                        setEnabledMark(EnabledMark.ENABLED.getCode());
+                    }}
+            );
         }
         if(!dataList.isEmpty()){
             this.saveBatch(dataList);
         }
-        if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
-            BandingTaskClass taskClass = taskClassMapper.selectById(dto.getBandingTaskClassId());
-            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);
-                student.setOperateMode(2);
-                updateList.add(student);
-            }
-            if(!updateList.isEmpty()){
-                newStudentService.updateBatchById(updateList);
-            }
-            {
-                Date createDate = new Date();
-                BandingTask bandingTask = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
-                List<BandingTaskClassSureListVo> classSure = taskClassMapper.getClassSure(new BandingTaskClassStudentPageDto() {{
-                    setBandingTaskId(taskClass.getBandingTaskId());
-                }});
-
-                Map<Long, Integer> classTotal = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getNumber));
-                Map<Long, Integer> classBoy = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getMaleCount));
-                Map<Long, Integer> classGirl = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getFemaleCount));
-
-
-                //生成班级数据
-                Map<Long, Long> classMap = new HashMap<>();
-                Map<Long, Long> taskClassMajorMap = new HashMap<>();
-                //查询出需要新增的班级信息
-                Map<Long, Long> majorDeptMap = majorSetMapper.selectList(
-                        new QueryWrapper<BaseMajorSet>()
-                ).stream().collect(Collectors.toMap(BaseMajorSet::getId, BaseMajorSet::getDepartmentId));
-                //先查询是否已经存在这个班级,如果存在就更新,不存在就新增
-                BaseClass baseClass = classService.getOne(
-                        new QueryWrapper<BaseClass>().lambda()
-                                .eq(BaseClass::getName, taskClass.getName())
-                                .eq(BaseClass::getGradeId, bandingTask.getGradeId())
-                                .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
-                );
-                if(baseClass == null){
-                    baseClass = new BaseClass() {{
-                        setName(taskClass.getName());
-                        setClassroomId(taskClass.getClassroomId());
-                        setTeacherId(taskClass.getTeacherId());
-                        setIsGraduate(1);
-                        setMajorSetId(taskClass.getMajorSetId());
-                        setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
-                        setIsOrderClass(taskClass.getIsOrderClass()==null?0:taskClass.getIsOrderClass().intValue());
-                        setGradeId(bandingTask.getGradeId());
-                        setDeleteMark(DeleteMark.NODELETE.getCode());
-                        setEnrollType(bandingTask.getEnrollType());
-                        setCreateDate(new Date());
-                    }};
-
-                    classService.save(baseClass);
-
-                    BaseClassMajorSet majorSet = new BaseClassMajorSet() {{
-                        setCreateDate(createDate);
-                        setMajorSetId(taskClass.getMajorSetId());
-                        setPlanTotalStudent(taskClass.getNumber());
-                        setTotalStudent(classTotal.get(taskClass.getId()));
-                        setBoyNum(classBoy.get(taskClass.getId()));
-                        setGirlNum(classGirl.get(taskClass.getId()));
-                    }};
-                    majorSet.setClassId(baseClass.getId());
-                    classMajorSetMapper.insert(majorSet);
-                }
-
 
-                classMap.put(taskClass.getId(), baseClass.getId());
-                taskClassMajorMap.put(taskClass.getId(), taskClass.getMajorSetId());
-
-                /**
-                 * 新增学生数据
-                 * 1、新增用户xjr_user,需要先查询用户信息是否已经存在
-                 * 2、新增用户与角色的关系xjr_user_role_relation
-                 * 3、新增学生基本信息base_student
-                 * 4、新增学籍信息表base_student_school_roll
-                 * 5、新增家庭信息表base_student_family
-                 */
-                LocalDateTime now = LocalDateTime.now();
-                List<String> idNumbers = updateList.stream().map(BaseNewStudent::getCredentialNumber).collect(Collectors.toList());
-                List<User> students = userService.list(
-                        new MPJLambdaWrapper<User>()
-                                .disableLogicDel()
-                                .in(User::getCredentialNumber, idNumbers)
-                                .orderByAsc(User::getCreateDate)
-                );
-                Map<String, Long> userSet = new HashMap<>();
-                Map<String, Integer> userDeleteMarkMap = new HashMap<>();
-                for (User student : students) {
-                    userSet.put(student.getCredentialNumber(), student.getId());
-                    userDeleteMarkMap.put(student.getCredentialNumber(), student.getDeleteMark());
-                }
-                Map<Long, Long> studentClassRelation = dataList.stream().collect(Collectors.toMap(BandingTaskClassStudent::getNewStudentId, BandingTaskClassStudent::getBandingTaskClassId));
-                for (BaseNewStudent student : updateList) {
-                    if(userSet.containsKey(student.getCredentialNumber())){
-                        schoolRollService.updateStudentClass(classMap.get(studentClassRelation.get(student.getId())), userSet.get(student.getCredentialNumber()));
-                        Integer deleteMark = userDeleteMarkMap.get(student.getCredentialNumber());
-                        if(deleteMark != null && deleteMark == 1){
-                            userService.recoveryStudentInfo(userSet.get(student.getCredentialNumber()));
-                        }
-                        continue;
-                    }
-                    LocalDate birthDate = getBirthDate(student.getCredentialNumber());
-                    User xjrUser = new User() {{
-                        setCreateDate(now);
-                        setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
-                        setName(student.getName());
-                        setUserName(student.getCredentialNumber());
-                        setCredentialNumber(student.getCredentialNumber());
-                        setCredentialType("ZZLS10007");
-                        setMobile(student.getMobile());
-                        setEnabledMark(EnabledMark.DISABLED.getCode());
-                        setGender(student.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(student.getCredentialNumber());
-                        if(student.getHeight() != null){
-                            setHeight(student.getHeight().doubleValue());
-                        }
-                        if(student.getWeight() != null){
-                            setWeight(student.getWeight().doubleValue());
-                        }
-                    }};
-                    studentService.save(baseStudent);
-
-                    BaseStudentSchoolRoll schoolRoll = new BaseStudentSchoolRoll() {{
-                        setUserId(xjrUser.getId());
-                        if(student.getScore() != null){
-                            setGraduatedScore(student.getScore().doubleValue());
-                        }
-
-                        setGraduatedUniversity(student.getGraduateSchool());
-                        setClassId(classMap.get(studentClassRelation.get(student.getId())));
-                        setMajorSetId(taskClassMajorMap.get(studentClassRelation.get(student.getId())));
-                        setStduyStatus(student.getStduyStatus());
-                        setEnrollType(bandingTask.getEnrollType());
-                        setStudentSource(student.getSource());
-                        setGradeId(bandingTask.getGradeId());
-                        setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
-                        setCreateDate(now);
-                    }};
-                    schoolRollService.save(schoolRoll);
-
-                    BaseStudentFamily studentFamily = new BaseStudentFamily() {{
-                        setCreateDate(now);
-                        setUserId(xjrUser.getId());
-                        setTelephone(student.getFamilyMobile());
-                        setAddress(student.getFamilyAddress());
-                    }};
-                    familyService.save(studentFamily);
-                }
+        if(!insertList.isEmpty()){
+            for (StudentReportRecord studentReportRecord : insertList) {
+                reportRecordMapper.insert(studentReportRecord);
             }
-            CompletableFuture.runAsync(() -> {
-                List<User> userList = userService.list();
-                redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
-
-                List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
-                redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
-            });
         }
+
+
+//        if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
+//            BandingTaskClass taskClass = taskClassMapper.selectById(dto.getBandingTaskClassId());
+//            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);
+//                student.setOperateMode(2);
+//                updateList.add(student);
+//            }
+//            if(!updateList.isEmpty()){
+//                newStudentService.updateBatchById(updateList);
+//            }
+//            {
+//                Date createDate = new Date();
+//                BandingTask bandingTask = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
+//                List<BandingTaskClassSureListVo> classSure = taskClassMapper.getClassSure(new BandingTaskClassStudentPageDto() {{
+//                    setBandingTaskId(taskClass.getBandingTaskId());
+//                }});
+//
+//                Map<Long, Integer> classTotal = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getNumber));
+//                Map<Long, Integer> classBoy = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getMaleCount));
+//                Map<Long, Integer> classGirl = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getFemaleCount));
+//
+//
+//                //生成班级数据
+//                Map<Long, Long> classMap = new HashMap<>();
+//                Map<Long, Long> taskClassMajorMap = new HashMap<>();
+//                //查询出需要新增的班级信息
+//                Map<Long, Long> majorDeptMap = majorSetMapper.selectList(
+//                        new QueryWrapper<BaseMajorSet>()
+//                ).stream().collect(Collectors.toMap(BaseMajorSet::getId, BaseMajorSet::getDepartmentId));
+//                //先查询是否已经存在这个班级,如果存在就更新,不存在就新增
+//                BaseClass baseClass = classService.getOne(
+//                        new QueryWrapper<BaseClass>().lambda()
+//                                .eq(BaseClass::getName, taskClass.getName())
+//                                .eq(BaseClass::getGradeId, bandingTask.getGradeId())
+//                                .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
+//                );
+//                if(baseClass == null){
+//                    baseClass = new BaseClass() {{
+//                        setName(taskClass.getName());
+//                        setClassroomId(taskClass.getClassroomId());
+//                        setTeacherId(taskClass.getTeacherId());
+//                        setIsGraduate(1);
+//                        setMajorSetId(taskClass.getMajorSetId());
+//                        setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
+//                        setIsOrderClass(taskClass.getIsOrderClass()==null?0:taskClass.getIsOrderClass().intValue());
+//                        setGradeId(bandingTask.getGradeId());
+//                        setDeleteMark(DeleteMark.NODELETE.getCode());
+//                        setEnrollType(bandingTask.getEnrollType());
+//                        setCreateDate(new Date());
+//                    }};
+//
+//                    classService.save(baseClass);
+//
+//                    BaseClassMajorSet majorSet = new BaseClassMajorSet() {{
+//                        setCreateDate(createDate);
+//                        setMajorSetId(taskClass.getMajorSetId());
+//                        setPlanTotalStudent(taskClass.getNumber());
+//                        setTotalStudent(classTotal.get(taskClass.getId()));
+//                        setBoyNum(classBoy.get(taskClass.getId()));
+//                        setGirlNum(classGirl.get(taskClass.getId()));
+//                    }};
+//                    majorSet.setClassId(baseClass.getId());
+//                    classMajorSetMapper.insert(majorSet);
+//                }
+//
+//
+//                classMap.put(taskClass.getId(), baseClass.getId());
+//                taskClassMajorMap.put(taskClass.getId(), taskClass.getMajorSetId());
+//
+//                /**
+//                 * 新增学生数据
+//                 * 1、新增用户xjr_user,需要先查询用户信息是否已经存在
+//                 * 2、新增用户与角色的关系xjr_user_role_relation
+//                 * 3、新增学生基本信息base_student
+//                 * 4、新增学籍信息表base_student_school_roll
+//                 * 5、新增家庭信息表base_student_family
+//                 */
+//                LocalDateTime now = LocalDateTime.now();
+//                List<String> idNumbers = updateList.stream().map(BaseNewStudent::getCredentialNumber).collect(Collectors.toList());
+//                List<User> students = userService.list(
+//                        new MPJLambdaWrapper<User>()
+//                                .disableLogicDel()
+//                                .in(User::getCredentialNumber, idNumbers)
+//                                .orderByAsc(User::getCreateDate)
+//                );
+//                Map<String, Long> userSet = new HashMap<>();
+//                Map<String, Integer> userDeleteMarkMap = new HashMap<>();
+//                for (User student : students) {
+//                    userSet.put(student.getCredentialNumber(), student.getId());
+//                    userDeleteMarkMap.put(student.getCredentialNumber(), student.getDeleteMark());
+//                }
+//                Map<Long, Long> studentClassRelation = dataList.stream().collect(Collectors.toMap(BandingTaskClassStudent::getNewStudentId, BandingTaskClassStudent::getBandingTaskClassId));
+//                for (BaseNewStudent student : updateList) {
+//                    if(userSet.containsKey(student.getCredentialNumber())){
+//                        schoolRollService.updateStudentClass(classMap.get(studentClassRelation.get(student.getId())), userSet.get(student.getCredentialNumber()));
+//                        Integer deleteMark = userDeleteMarkMap.get(student.getCredentialNumber());
+//                        if(deleteMark != null && deleteMark == 1){
+//                            userService.recoveryStudentInfo(userSet.get(student.getCredentialNumber()));
+//                        }
+//                        continue;
+//                    }
+//                    LocalDate birthDate = getBirthDate(student.getCredentialNumber());
+//                    User xjrUser = new User() {{
+//                        setCreateDate(now);
+//                        setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+//                        setName(student.getName());
+//                        setUserName(student.getCredentialNumber());
+//                        setCredentialNumber(student.getCredentialNumber());
+//                        setCredentialType("ZZLS10007");
+//                        setMobile(student.getMobile());
+//                        setEnabledMark(EnabledMark.DISABLED.getCode());
+//                        setGender(student.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(student.getCredentialNumber());
+//                        if(student.getHeight() != null){
+//                            setHeight(student.getHeight().doubleValue());
+//                        }
+//                        if(student.getWeight() != null){
+//                            setWeight(student.getWeight().doubleValue());
+//                        }
+//                    }};
+//                    studentService.save(baseStudent);
+//
+//                    BaseStudentSchoolRoll schoolRoll = new BaseStudentSchoolRoll() {{
+//                        setUserId(xjrUser.getId());
+//                        if(student.getScore() != null){
+//                            setGraduatedScore(student.getScore().doubleValue());
+//                        }
+//
+//                        setGraduatedUniversity(student.getGraduateSchool());
+//                        setClassId(classMap.get(studentClassRelation.get(student.getId())));
+//                        setMajorSetId(taskClassMajorMap.get(studentClassRelation.get(student.getId())));
+//                        setStduyStatus(student.getStduyStatus());
+//                        setEnrollType(bandingTask.getEnrollType());
+//                        setStudentSource(student.getSource());
+//                        setGradeId(bandingTask.getGradeId());
+//                        setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+//                        setCreateDate(now);
+//                    }};
+//                    schoolRollService.save(schoolRoll);
+//
+//                    BaseStudentFamily studentFamily = new BaseStudentFamily() {{
+//                        setCreateDate(now);
+//                        setUserId(xjrUser.getId());
+//                        setTelephone(student.getFamilyMobile());
+//                        setAddress(student.getFamilyAddress());
+//                    }};
+//                    familyService.save(studentFamily);
+//                }
+//            }
+//            CompletableFuture.runAsync(() -> {
+//                List<User> userList = userService.list();
+//                redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
+//
+//                List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
+//                redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
+//            });
+//        }
         return true;
     }
 
@@ -324,6 +320,7 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
     }
 
     @Override
+    @Transactional
     public Boolean removeStudent(ChangeClassDto dto) {
         this.baseMapper.delete(
                 new QueryWrapper<BandingTaskClassStudent>().lambda()
@@ -333,6 +330,20 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
         return true;
     }
 
+    @Override
+    @Transactional
+    public Boolean removeStudent(List<Long> studentIds, Long bandingTaskId) {
+        this.baseMapper.delete(
+                new MPJLambdaWrapper<BandingTaskClassStudent>()
+                        .select(BandingTaskClassStudent::getId)
+                        .select(BandingTaskClassStudent.class, x -> VoToColumnUtil.fieldsToColumns(BandingTaskClassStudent.class).contains(x.getProperty()))
+                        .innerJoin(BandingTaskClass.class, BandingTaskClass::getId, BandingTaskClassStudent::getBandingTaskClassId)
+                        .in(BandingTaskClassStudent::getNewStudentId, studentIds)
+                        .eq(BandingTaskClass::getBandingTaskId, bandingTaskId)
+        );
+        return true;
+    }
+
     @Override
     public List<BaseNewStudentPageDto> satisfyStudent(StudentDto dto) {
         BandingTaskClass taskClass = taskClassMapper.selectById(dto.getBandingTaskClassId());

+ 43 - 14
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskServiceImpl.java

@@ -40,9 +40,11 @@ import com.xjrsoft.module.banding.vo.IdManyCountVo;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.entity.BaseMajorSet;
+import com.xjrsoft.module.base.entity.BaseSemester;
 import com.xjrsoft.module.base.mapper.BaseMajorSetMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseGradeService;
+import com.xjrsoft.module.base.service.IBaseSemesterService;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserRoleRelation;
 import com.xjrsoft.module.organization.service.IUserRoleRelationService;
@@ -54,14 +56,15 @@ 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.EnrollmentPlan;
+import com.xjrsoft.module.student.entity.StudentReportPlan;
 import com.xjrsoft.module.student.entity.StudentReportRecord;
 import com.xjrsoft.module.student.mapper.BaseClassMajorSetMapper;
+import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
 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.IBaseStudentService;
-import com.xjrsoft.module.student.service.IStudentChangeRecordService;
-import com.xjrsoft.module.student.service.IStudentReportRecordService;
+import com.xjrsoft.module.student.service.IStudentReportPlanService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -109,7 +112,10 @@ public class BandingTaskServiceImpl extends MPJBaseServiceImpl<BandingTaskMapper
     private final IBaseGradeService gradeService;
     private final BaseMajorSetMapper majorSetMapper;
     private final RedisUtil redisUtil;
-    private final IStudentReportRecordService reportRecordService;
+    private final StudentReportRecordMapper reportRecordMapper;
+
+    private final IStudentReportPlanService reportPlanService;
+    private final IBaseSemesterService semesterService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -734,6 +740,8 @@ public class BandingTaskServiceImpl extends MPJBaseServiceImpl<BandingTaskMapper
         if(studentIds.isEmpty()){
             throw new MyException("未能查询到学生,无法确认");
         }
+        BandingTask bandingTask = this.getById(dto.getId());
+
         List<BaseNewStudent> list = newStudentService.list(
                 new QueryWrapper<BaseNewStudent>().lambda()
                         .in(BaseNewStudent::getId, studentIds)
@@ -749,21 +757,42 @@ 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::getBandingTaskId, dto.getBandingTaskId())
+                        .eq(StudentReportPlan::getCategory, 2)
+        );
+        if(plan == null){
+            plan = new StudentReportPlan() {{
+                setName(bandingTask.getName());
+                setCategory(2);
+                setSemesterId(semester.getId());
+                setBandingTaskId(dto.getBandingTaskId());
+            }};
+
+            reportPlanService.save(plan);
+        }
+
+
         //将新生数据初始化到报到表中
-        List<StudentReportRecord> insertList = new ArrayList<>();
         for (BaseNewStudent student : updateList) {
-            insertList.add(
-                    new StudentReportRecord(){{
-                        setCreateDate(new Date());
-                        setCreateUserId(StpUtil.getLoginIdAsLong());
-                        setUserId(student.getId());
-                        setBandingTaskId(dto.getBandingTaskId());
-                    }}
-            );
+            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);
         }
-        reportRecordService.saveBatch(insertList);
 
-        BandingTask bandingTask = this.getById(dto.getId());
+
+
         bandingTask.setStatus(1);
         bandingTask.setModifyDate(new Date());
         return this.update(bandingTask);

+ 27 - 0
src/main/java/com/xjrsoft/module/organization/dto/GetUserByParamDto.java

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.organization.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @title: AddPostDto
+ * @Author tzx
+ * @Date: 2022/4/4 17:59
+ * @Version 1.0
+ */
+@Data
+public class GetUserByParamDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/organization/service/IUserService.java

@@ -5,6 +5,7 @@ import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.module.organization.dto.AddUserDto;
 import com.xjrsoft.module.organization.dto.BindOpenidDto;
+import com.xjrsoft.module.organization.dto.GetUserByParamDto;
 import com.xjrsoft.module.organization.dto.PersonPageDto;
 import com.xjrsoft.module.organization.dto.ResetPasswordDto;
 import com.xjrsoft.module.organization.dto.UpdatePasswordDto;
@@ -88,4 +89,6 @@ public interface IUserService extends MPJBaseService<User> {
 
     List<UserIdDeptNameVo> getTeacherDeptName();
 
+    User getUserByParam(GetUserByParamDto dto);
+
 }

+ 25 - 0
src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java

@@ -17,6 +17,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.page.ConventPage;
@@ -29,6 +31,7 @@ import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.DataUtil;
 import com.xjrsoft.module.organization.dto.AddUserDto;
 import com.xjrsoft.module.organization.dto.BindOpenidDto;
+import com.xjrsoft.module.organization.dto.GetUserByParamDto;
 import com.xjrsoft.module.organization.dto.PersonPageDto;
 import com.xjrsoft.module.organization.dto.ResetPasswordDto;
 import com.xjrsoft.module.organization.dto.UpdatePasswordDto;
@@ -432,4 +435,26 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         return userMapper.getTeacherDeptName();
     }
 
+    /**
+     * 根据条件查询单个的用户信息
+     * @param dto 身份证号、姓名等
+     * @return 未被删除且启用的用户信息
+     */
+    @Override
+    public User getUserByParam(GetUserByParamDto dto) {
+        List<User> userList = this.list(
+                new QueryWrapper<User>().lambda()
+                        .eq(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
+                        .eq(User::getCredentialNumber, dto.getCredentialNumber())
+                        .eq(User::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(User::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .orderByDesc(User::getId)
+        );
+        if(userList.isEmpty()){
+            return null;
+        }
+        return userList.get(0);
+
+    }
+
 }

+ 429 - 0
src/main/java/com/xjrsoft/module/student/controller/BaseNewStudentReportController.java

@@ -0,0 +1,429 @@
+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.constant.GlobalConstant;
+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;
+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.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.organization.service.IUserService;
+import com.xjrsoft.module.student.dto.ActiveAccountDto;
+import com.xjrsoft.module.student.dto.AddBaseNewStudentDto;
+import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
+import com.xjrsoft.module.student.dto.ChangeBandingStatusDto;
+import com.xjrsoft.module.student.dto.DeleteNewStudentDto;
+import com.xjrsoft.module.student.dto.UpdateBaseNewStudentDto;
+import com.xjrsoft.module.student.entity.BaseNewStudent;
+import com.xjrsoft.module.student.entity.BaseStudentFamilyMember;
+import com.xjrsoft.module.student.service.IBaseNewStudentService;
+import com.xjrsoft.module.student.service.IBaseStudentFamilyMemberService;
+import com.xjrsoft.module.student.vo.BaseNewStudentExportVo;
+import com.xjrsoft.module.student.vo.BaseNewStudentPageVo;
+import com.xjrsoft.module.student.vo.BaseNewStudentScoreExcelVo;
+import com.xjrsoft.module.student.vo.BaseNewStudentTreeVo;
+import com.xjrsoft.module.student.vo.BaseNewStudentVo;
+import com.xjrsoft.module.student.vo.EnrollmentPlanGradeVo;
+import com.xjrsoft.module.student.vo.EnrollmentPlanTreeVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+* @title: 新生维护信息
+* @Author dzx
+* @Date: 2024-06-27
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/student" + "/baseNewStudentReport")
+@Api(value = "/student"  + "/baseNewStudent",tags = "新生报到模块代码")
+@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 IBaseSemesterService semesterService;
+    @GetMapping(value = "/page")
+    @ApiOperation(value="新生维护信息列表(分页)")
+    @SaCheckPermission("basenewstudent:detail")
+    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")
+    public RT<PageOutput<BaseNewStudentPageVo>> reportPage(@Valid BaseNewStudentPageDto dto){
+        List<String> roleList = StpUtil.getRoleList();
+        if(roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getTeacherId() == null){
+            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());
+            }
+        }
+        Page<BaseNewStudentPageVo> page = baseNewStudentService.getReportPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<BaseNewStudentPageVo> pageOutput = ConventPage.getPageOutput(page, BaseNewStudentPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/tree")
+    @ApiOperation(value="新生维护信息树")
+    @SaCheckPermission("basenewstudent:detail")
+    public RT<List<BaseNewStudentTreeVo>> tree(){
+
+        List<EnrollmentPlanGradeVo> gradeList = baseNewStudentService.getGradeList();
+        List<EnrollmentPlanTreeVo> list = baseNewStudentService.getEnrollmentPlanList();
+
+        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);
+                    }});
+                }
+            }
+
+            treeVo.setChildren(children);
+            result.add(treeVo);
+        }
+
+        return RT.ok(result);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询新生维护信息信息")
+    @SaCheckPermission("basenewstudent:detail")
+    public RT<BaseNewStudentVo> info(@RequestParam Long id){
+        BaseNewStudent baseNewStudent = baseNewStudentService.getById(id);
+        if (baseNewStudent == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(baseNewStudent, BaseNewStudentVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增新生维护信息")
+    @SaCheckPermission("basenewstudent:add")
+    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")
+    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")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(baseNewStudentService.removeBatchByIds(ids));
+    }
+
+    @DeleteMapping("deleteByUserIds")
+    @ApiOperation(value = "删除新生(保留新生信息,删除基础信息)")
+    @SaCheckPermission("basenewstudent:delete")
+    public RT<Boolean> deleteByUserIds(@Valid @RequestBody DeleteNewStudentDto dto){
+        return RT.ok(baseNewStudentService.deleteByUserIds(dto));
+    }
+
+
+    @PostMapping("/import")
+    @ApiOperation(value = "导入")
+    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);
+        }
+        return RT.ok(result);
+    }
+
+    @PostMapping("/score-import")
+    @ApiOperation(value = "成绩导入")
+    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<>();
+
+        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);
+        }
+        return RT.ok(result);
+    }
+
+    @PostMapping("/active-account")
+    @ApiOperation(value = "激活账号")
+    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())
+            );
+            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())
+            );
+            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);
+            }
+        }
+
+
+        //新增白名单信息
+        List<WhitelistManagement> managementList = whitelistManagementService.list(
+                new QueryWrapper<WhitelistManagement>().lambda()
+                        .eq(WhitelistManagement::getUserId, dto.getId())
+        );
+        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);
+        }
+
+        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);
+    }
+
+    @PostMapping("/report-export-query")
+    @ApiOperation(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());
+            }
+        }
+        List<String> roleList = StpUtil.getRoleList();
+        if(roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getTeacherId() == 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("否");
+            }
+            if(el.getReportTime() != null){
+                vo.setReportTime(el.getReportTime().format(formatter));
+            }
+            exportVos.add(vo);
+        }
+        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());
+    }
+
+    @PostMapping("/change-banding-status")
+    @ApiOperation(value = "修改分班状态")
+    @SaCheckPermission("basenewstudent:add")
+    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");
+            }
+            baseNewStudentService.update(newStudent, updateWrapper);
+        }
+
+        return RT.ok(true);
+    }
+
+}

+ 30 - 0
src/main/java/com/xjrsoft/module/student/controller/StudentReportPlanController.java

@@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.exception.MyException;
@@ -12,6 +13,8 @@ import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.TreeUtil;
+import com.xjrsoft.module.banding.entity.BandingTask;
+import com.xjrsoft.module.banding.service.IBandingTaskService;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseSemester;
 import com.xjrsoft.module.base.service.IBaseClassService;
@@ -64,10 +67,12 @@ public class StudentReportPlanController {
     private final IStudentReportPlanService studentReportPlanService;
     private final IBaseSemesterService semesterService;
     private final IBaseClassService classService;
+    private final IBandingTaskService taskService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value="学生报到计划列表(分页)")
     @SaCheckPermission("studentreportplan:detail")
+    @XjrLog(value="学生报到计划列表(分页)")
     public RT<PageOutput<StudentReportPlanPageVo>> page(@Valid StudentReportPlanPageDto dto){
         Page<StudentReportPlanPageVo> page = studentReportPlanService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         PageOutput<StudentReportPlanPageVo> pageOutput = ConventPage.getPageOutput(page, StudentReportPlanPageVo.class);
@@ -77,6 +82,7 @@ public class StudentReportPlanController {
     @GetMapping(value = "/info")
     @ApiOperation(value="根据id查询学生报到计划信息")
     @SaCheckPermission("studentreportplan:detail")
+    @XjrLog(value="根据id查询学生报到计划信息")
     public RT<StudentReportPlanVo> info(@RequestParam Long id){
         StudentReportPlan studentReportPlan = studentReportPlanService.getByIdDeep(id);
         if (studentReportPlan == null) {
@@ -99,6 +105,7 @@ public class StudentReportPlanController {
     @PostMapping
     @ApiOperation(value = "新增学生报到计划")
     @SaCheckPermission("studentreportplan:add")
+    @XjrLog(value="新增学生报到计划")
     public RT<Boolean> add(@Valid @RequestBody AddStudentReportPlanDto dto){
         StudentReportPlan studentReportPlan = BeanUtil.toBean(dto, StudentReportPlan.class);
         boolean isSuccess = studentReportPlanService.add(studentReportPlan);
@@ -108,6 +115,7 @@ public class StudentReportPlanController {
     @PutMapping
     @ApiOperation(value = "修改学生报到计划")
     @SaCheckPermission("studentreportplan:edit")
+    @XjrLog(value="修改学生报到计划")
     public RT<Boolean> update(@Valid @RequestBody UpdateStudentReportPlanDto dto){
 
         StudentReportPlan studentReportPlan = BeanUtil.toBean(dto, StudentReportPlan.class);
@@ -118,6 +126,7 @@ public class StudentReportPlanController {
     @DeleteMapping
     @ApiOperation(value = "删除学生报到计划")
     @SaCheckPermission("studentreportplan:delete")
+    @XjrLog(value="删除学生报到计划")
     public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
         return RT.ok(studentReportPlanService.delete(ids));
 
@@ -126,6 +135,7 @@ public class StudentReportPlanController {
     @PostMapping(value = "/change-status")
     @ApiOperation(value="修改状态")
     @SaCheckPermission("classroom:detail")
+    @XjrLog(value="修改状态")
     public RT<Boolean> changeStatus(@Valid @RequestBody StudentReportPlanStatusDto dto) throws Exception {
         StudentReportPlan reportPlan = studentReportPlanService.getByIdDeep(dto.getId());
         if(reportPlan == null){
@@ -180,6 +190,7 @@ public class StudentReportPlanController {
     @GetMapping(value = "/tree")
     @ApiOperation(value="学期计划树")
     @SaCheckPermission("studentreportplan:detail")
+    @XjrLog(value="学期计划树")
     public RT<List<StudentReportPlanTreeVo>> tree(){
         List<Integer> statusList = new ArrayList<>();
         statusList.add(1);statusList.add(2);
@@ -224,4 +235,23 @@ public class StudentReportPlanController {
         List<StudentReportPlanTreeVo> treeVoList = TreeUtil.build(resultList);
         return RT.ok(treeVoList);
     }
+
+    @GetMapping(value = "/try-reading-plan")
+    @ApiOperation(value="根据分班任务id查询试读报到计划信息")
+    @SaCheckPermission("bandingrule:try-reading-plan")
+    @XjrLog(value="根据分班任务id查询试读报到计划信息")
+    public RT<StudentReportPlanVo> tryReadingPlan(@RequestParam Long bandingTaskId){
+        BandingTask bandingTask = taskService.getById(bandingTaskId);
+        BaseSemester semester = semesterService.getCurrentSemester();
+        StudentReportPlan plan = studentReportPlanService.getOne(
+                new QueryWrapper<StudentReportPlan>().lambda()
+                        .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(StudentReportPlan::getSemesterId, semester.getId())
+                        .eq(StudentReportPlan::getName, bandingTask.getName())
+        );
+        if (plan == null) {
+            return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(plan, StudentReportPlanVo.class));
+    }
 }

+ 158 - 0
src/main/java/com/xjrsoft/module/student/controller/StudentTryReadingReportController.java

@@ -0,0 +1,158 @@
+package com.xjrsoft.module.student.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.RoleCodeEnum;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
+import com.xjrsoft.module.student.dto.ChangeBandingStatusDto;
+import com.xjrsoft.module.student.dto.StudentReportRecordPageDto;
+import com.xjrsoft.module.student.dto.StudentReportSignDto;
+import com.xjrsoft.module.student.entity.StudentReportPlan;
+import com.xjrsoft.module.student.entity.StudentReportRecord;
+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.StudentReportRecordPlanPageVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+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.RestController;
+
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @title: 新生维护信息
+* @Author dzx
+* @Date: 2024-06-27
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/student" + "/tryReadingReport")
+@Api(value = "/student"  + "/tryReadingReport",tags = "试读报到模块代码")
+@AllArgsConstructor
+public class StudentTryReadingReportController {
+
+    private final IStudentReportRecordService recordService;
+    private final IBandingTaskClassStudentService classStudentService;
+    private final IStudentReportPlanService reportPlanService;
+
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="试读报到(分页)")
+    @SaCheckPermission("tryreadingreport:detail")
+    @XjrLog(value="试读报到(分页)")
+    public RT<PageOutput<StudentReportRecordPlanPageVo>> page(@Valid StudentReportRecordPageDto dto){
+        List<String> roleList = StpUtil.getRoleList();
+        if(roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
+            dto.setTeacherId(StpUtil.getLoginIdAsLong());
+        }
+        Page<StudentReportRecordPlanPageVo> page = recordService.getTryReadingPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<StudentReportRecordPlanPageVo> pageOutput = ConventPage.getPageOutput(page, StudentReportRecordPlanPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @PostMapping("/clear-class")
+    @ApiOperation(value = "非本班学生")
+    @SaCheckPermission("tryreadingreport:add")
+    @XjrLog(value="非本班学生")
+    public RT<Boolean> clearClass(@Valid @RequestBody ChangeBandingStatusDto dto){
+        StudentReportRecord record = recordService.getById(dto.getId());
+        StudentReportPlan reportPlan = reportPlanService.getById(record.getStudentReportPlanId());
+        List<Long> list = new ArrayList<>();
+        list.add(record.getUserId());
+        classStudentService.removeStudent(list, reportPlan.getBandingTaskId());
+        return RT.ok(true);
+    }
+
+    @PostMapping(value = "/sign")
+    @ApiOperation(value="试读报到")
+    @SaCheckPermission("tryreadingreport:detail")
+    @XjrLog(value="试读报到")
+    public RT<Boolean> sign(@Valid @RequestBody StudentReportSignDto dto){
+        return RT.ok(recordService.tryReadingSign(dto));
+    }
+
+    @PostMapping(value = "/all-sign")
+    @ApiOperation(value="变更为已报到")
+    @SaCheckPermission("tryreadingreport:detail")
+    @XjrLog(value="试读报到")
+    public RT<Boolean> sign(@Valid @RequestBody List<Long> ids){
+        for (Long id : ids) {
+            recordService.tryReadingSign(new StudentReportSignDto(){{
+                setId(id);
+            }});
+        }
+        return RT.ok(true);
+    }
+
+    @PostMapping("/change-class")
+    @ApiOperation(value = "调整班级")
+    @SaCheckPermission("tryreadingreport:change-class")
+    @XjrLog(value = "调整班级")
+    public RT<Boolean> changeClass(@Valid @RequestBody StudentReportSignDto dto){
+        boolean isSuccess = recordService.changeClass(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @PostMapping(value = "/update-stduyStatus")
+    @ApiOperation(value="切换就读方式")
+    @SaCheckPermission("tryreadingreport:update-stduyStatus")
+    @XjrLog(value = "切换就读方式")
+    public RT<Boolean> updateStduyStatus(@Valid @RequestBody StudentReportSignDto dto){
+        boolean isSuccess = recordService.updateStduyStatusByTryReading(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @PostMapping(value = "/export-query")
+    @ApiOperation(value="导出")
+    @SaCheckPermission("studentreportrecord:detail")
+    public ResponseEntity<byte[]> exportQuerty(@Valid @RequestBody StudentReportRecordPageDto dto){
+        List<StudentReportRecordExcelVo> dataList = new ArrayList<>();
+
+        List<String> roleList = StpUtil.getRoleList();
+        if(roleList.contains(RoleCodeEnum.TEACHER.getCode()) && roleList.contains(RoleCodeEnum.CLASSTE.getCode())){
+            if(dto.getClassId() == null){
+                dto.setTeacherId(StpUtil.getLoginIdAsLong());
+            }
+        }
+        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()));
+            }
+            excelVo.setIsReport("否");
+            if(pageVo.getIsReport() != null && pageVo.getIsReport() == 1){
+                excelVo.setIsReport("是");
+            }
+
+            dataList.add(excelVo);
+        }
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        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);
+    }
+
+
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/student/dto/StudentReportRecordPageDto.java

@@ -65,4 +65,7 @@ public class StudentReportRecordPageDto extends PageInput {
     @ApiModelProperty("报到时间结束")
     private LocalDate reportTimeEnd;
 
+    @ApiModelProperty("招生计划id(enrollment_plan)")
+    private Long enrollmentPlanId;
+
 }

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

@@ -15,4 +15,8 @@ public class StudentReportSignDto {
 
     @ApiModelProperty("主键id")
     private Long id;
+
+
+    @ApiModelProperty("班级id")
+    private Long classId;
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/student/entity/StudentReportPlan.java

@@ -117,4 +117,11 @@ public class StudentReportPlan implements Serializable {
     @EntityMapping(thisField = "id", joinField = "studentReportPlanId")
     private List<StudentReportPlanClassRelation> studentReportPlanClassRelationList;
 
+
+    @ApiModelProperty("类别(1:开学报到 2:试读报到 3:新生报到)")
+    private Integer category;
+
+    @ApiModelProperty("分班任务id")
+    private Long bandingTaskId;
+
 }

+ 0 - 4
src/main/java/com/xjrsoft/module/student/entity/StudentReportRecord.java

@@ -88,8 +88,4 @@ public class StudentReportRecord implements Serializable {
     @ApiModelProperty("报到计划id")
     private Long studentReportPlanId;
 
-    @ApiModelProperty("分班任务id")
-    private Long bandingTaskId;
-
-
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/student/mapper/StudentReportRecordMapper.java

@@ -36,4 +36,8 @@ public interface StudentReportRecordMapper extends MPJBaseMapper<StudentReportRe
 
     List<StudentReportRecordStatisticsListVo> getStatisticsPlanDataList(@Param("dto") StudentReportRecordStatisticsDto dto);
 
+    Page<StudentReportRecordPlanPageVo> getTryReadingPage(Page<StudentReportRecordPlanPageVo> page, @Param("dto") StudentReportRecordPageDto dto);
+
+    List<StudentReportRecordPlanPageVo> getTryReadingList(@Param("dto") StudentReportRecordPageDto dto);
+
 }

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

@@ -56,4 +56,6 @@ public interface IBaseStudentSchoolRollService extends MPJBaseService<BaseStuden
     String getClassNameByUserId(Long userId);
 
     Long getClassIdByUserId(Long userId);
+
+    Boolean activateStudent(Long userId);
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/student/service/IStudentReportRecordService.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.student.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.banding.dto.ChangeClassDto;
 import com.xjrsoft.module.student.dto.StudentReportRecordPageDto;
 import com.xjrsoft.module.student.dto.StudentReportRecordStatisticsDto;
 import com.xjrsoft.module.student.dto.StudentReportSignDto;
@@ -45,4 +46,14 @@ public interface IStudentReportRecordService extends MPJBaseService<StudentRepor
     Boolean allSgin(List<StudentReportSignDto> dtoList);
 
     Boolean updateStduyStatus(StudentReportSignDto dto);
+
+    Boolean updateStduyStatusByTryReading(StudentReportSignDto dto);
+
+    Page<StudentReportRecordPlanPageVo> getTryReadingPage(Page<StudentReportRecordPlanPageVo> page, StudentReportRecordPageDto dto);
+
+    List<StudentReportRecordPlanPageVo> getTryReadingList(StudentReportRecordPageDto dto);
+
+    Boolean tryReadingSign(StudentReportSignDto dto);
+
+    Boolean changeClass(StudentReportSignDto dto);
 }

+ 49 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java

@@ -7,12 +7,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.enums.RollModalityEnum;
 import com.xjrsoft.common.enums.StudentChangeTypeEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
+import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.mapper.UserMapper;
 import com.xjrsoft.module.room.mapper.RoomBedMapper;
 import com.xjrsoft.module.room.vo.RoomBedInfoVo;
@@ -21,7 +23,9 @@ import com.xjrsoft.module.student.dto.BaseStudentInfoPageDto;
 import com.xjrsoft.module.student.dto.BaseStudentSimpleInfoDto;
 import com.xjrsoft.module.student.dto.PbVXsxxsfytbDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto;
+import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.mapper.BaseStudentMapper;
 import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
 import com.xjrsoft.module.student.mapper.PbSemesterConfigMapper;
 import com.xjrsoft.module.student.mapper.PbVXsxxsfytbMapper;
@@ -36,7 +40,9 @@ import com.xjrsoft.module.student.vo.MobileClassStatisticsVo;
 import com.xjrsoft.module.student.vo.PbVXsxxsfytbVo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -59,6 +65,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
     private final PbVXsxxsfytbMapper pbVXsxxsfytbMapper;
     private final UserMapper userMapper;
     private final IStudentChangeRecordService recordService;
+    private final BaseStudentMapper baseStudentMapper;
 
 
     @Override
@@ -243,11 +250,13 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateStudentClass(Long classId,Long majorSetId, Long userId) {
         return baseStudentSchoolRollMapper.updateStudentClass1(classId,majorSetId, userId);
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateStudentClass(Long classId, Long userId) {
         return baseStudentSchoolRollMapper.updateStudentClass(classId, userId);
     }
@@ -265,4 +274,44 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
     public Long getClassIdByUserId(Long userId){
         return baseStudentSchoolRollMapper.getClassIdByUserId(userId);
     }
+
+    /**
+     * 激活学生信息
+     * @param userId 学生用户信息
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean activateStudent(Long userId) {
+        //激活用户信息
+        User user = userMapper.selectById(userId);
+        user.setDeleteMark(DeleteMark.NODELETE.getCode());
+        user.setEnabledMark(EnabledMark.ENABLED.getCode());
+        user.setModifyUserId(StpUtil.getLoginIdAsLong());
+        user.setModifyDate(LocalDateTime.now());
+        userMapper.updateById(user);
+
+        //将学籍信息改为在读
+        BaseStudentSchoolRoll schoolRoll = this.getOne(
+                new QueryWrapper<BaseStudentSchoolRoll>().lambda()
+                        .eq(BaseStudentSchoolRoll::getUserId, userId)
+        );
+        schoolRoll.setDeleteMark(DeleteMark.NODELETE.getCode());
+        schoolRoll.setEnabledMark(EnabledMark.ENABLED.getCode());
+        schoolRoll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+        schoolRoll.setModifyUserId(StpUtil.getLoginIdAsLong());
+        schoolRoll.setModifyDate(LocalDateTime.now());
+        this.updateById(schoolRoll);
+
+        //将学生基本信息中状态改为正常
+        BaseStudent baseStudent = baseStudentMapper.selectOne(
+                new QueryWrapper<BaseStudent>().lambda()
+                        .eq(BaseStudent::getUserId, userId)
+        );
+        baseStudent.setIsNormal(1);
+        baseStudent.setModifyUserId(StpUtil.getLoginIdAsLong());
+        baseStudent.setModifyDate(LocalDateTime.now());
+        baseStudentMapper.updateById(baseStudent);
+
+        return true;
+    }
 }

+ 7 - 6
src/main/java/com/xjrsoft/module/student/service/impl/StudentReportPlanServiceImpl.java

@@ -1,6 +1,5 @@
 package com.xjrsoft.module.student.service.impl;
 
-import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,7 +7,6 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
-import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
@@ -20,9 +18,9 @@ import com.xjrsoft.module.student.entity.StudentReportPlanClassRelation;
 import com.xjrsoft.module.student.entity.StudentReportRecord;
 import com.xjrsoft.module.student.mapper.StudentReportPlanClassRelationMapper;
 import com.xjrsoft.module.student.mapper.StudentReportPlanMapper;
+import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
 import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.service.IStudentReportPlanService;
-import com.xjrsoft.module.student.service.IStudentReportRecordService;
 import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
 import com.xjrsoft.module.student.vo.StudentReportPlanPageVo;
 import lombok.AllArgsConstructor;
@@ -53,7 +51,7 @@ public class StudentReportPlanServiceImpl extends MPJBaseServiceImpl<StudentRepo
 
     private final IBaseStudentService studentService;
 
-    private final IStudentReportRecordService reportRecordService;
+    private final StudentReportRecordMapper reportRecordMapper;
 
     private final IUserService userService;
 
@@ -162,13 +160,16 @@ public class StudentReportPlanServiceImpl extends MPJBaseServiceImpl<StudentRepo
                 );
             }
 
-            long count = reportRecordService.count(
+            long count = reportRecordMapper.selectCount(
                     new QueryWrapper<StudentReportRecord>().lambda()
                             .eq(StudentReportRecord::getStudentReportPlanId, studentReportPlan.getId())
             );
 
             if(!insertList.isEmpty() && count == 0){
-                reportRecordService.saveBatch(insertList);
+                for (StudentReportRecord studentReportRecord : insertList) {
+                    reportRecordMapper.insert(studentReportRecord);
+                }
+
                 Set<String> studentUserIds = studentList.stream().map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
                 //发布后,将学生的状态改为不正常
                 List<BaseStudent> baseStudents = studentService.list(

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

@@ -1,31 +1,53 @@
 package com.xjrsoft.module.student.service.impl;
 
+import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
 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.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+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.RoleEnum;
 import com.xjrsoft.common.enums.StudentChangeTypeEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
 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;
+import com.xjrsoft.module.banding.entity.BandingTaskClass;
+import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
+import com.xjrsoft.module.banding.service.IBandingTaskClassService;
+import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
+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.dto.StudentReportRecordPageDto;
 import com.xjrsoft.module.student.dto.StudentReportRecordStatisticsDto;
 import com.xjrsoft.module.student.dto.StudentReportSignDto;
+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.StudentReportPlan;
 import com.xjrsoft.module.student.entity.StudentReportRecord;
+import com.xjrsoft.module.student.mapper.BaseNewStudentMapper;
 import com.xjrsoft.module.student.mapper.StudentReportPlanMapper;
 import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
+import com.xjrsoft.module.student.service.IBaseStudentFamilyService;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
 import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.service.IStudentChangeRecordService;
-import com.xjrsoft.module.student.service.IStudentReportPlanService;
 import com.xjrsoft.module.student.service.IStudentReportRecordService;
 import com.xjrsoft.module.student.vo.StudentReportRecordPageVo;
 import com.xjrsoft.module.student.vo.StudentReportRecordPlanPageVo;
@@ -36,8 +58,12 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 /**
 * @title: 学生报到记录表
@@ -54,6 +80,16 @@ public class StudentReportRecordServiceImpl extends MPJBaseServiceImpl<StudentRe
     private final IBaseStudentSchoolRollService rollService;
     private final IStudentChangeRecordService changeRecordService;
     private final StudentReportPlanMapper planMapper;
+    private final BaseNewStudentMapper newStudentMapper;
+    private final BaseClassMapper classMapper;
+    private final CommonPropertiesConfig propertiesConfig;
+    private final IUserRoleRelationService roleRelationService;
+    private final IBaseStudentFamilyService familyService;
+    private final RedisUtil redisUtil;
+    private final IBandingTaskClassStudentService taskClassStudentService;
+    private final IBandingTaskClassService taskClassService;
+
+
     @Override
     public StudentReportRecordStatisticsVo getClassStatistics(StudentReportRecordStatisticsDto dto) {
         return this.baseMapper.getClassStatistics(dto);
@@ -212,4 +248,238 @@ public class StudentReportRecordServiceImpl extends MPJBaseServiceImpl<StudentRe
 
         return true;
     }
+
+    /**
+     * 试读报到,把新生和学生基本信息中的数据都进行修改
+     * 不用记录异动信息
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateStduyStatusByTryReading(StudentReportSignDto dto) {
+        LocalDate now = LocalDate.now();
+        StudentReportRecord record = this.getById(dto.getId());
+        StudentReportPlan reportPlan = planMapper.selectById(record.getStudentReportPlanId());
+        if(!LocalDateUtil.isDateInRange(now, reportPlan.getUpdateStartTime(), reportPlan.getUpdateEndTime())){
+            throw new MyException("不在修改时间内,无法修改");
+        }
+        BaseNewStudent student = newStudentMapper.selectById(record.getUserId());
+
+        if(StudyStatusEnum.InResidence.getCode().equals(student.getStduyStatus())){
+            student.setStduyStatus(StudyStatusEnum.AttendDaySchool.getCode());
+        }else if(StudyStatusEnum.AttendDaySchool.getCode().equals(student.getStduyStatus())){
+            student.setStduyStatus(StudyStatusEnum.InResidence.getCode());
+        }
+        newStudentMapper.updateById(student);
+
+        User user = userService.getUserByParam(new GetUserByParamDto() {{
+            setCredentialNumber(student.getCredentialNumber());
+        }});
+
+        if(record.getReportTime() != null){
+
+            BaseStudentSchoolRoll roll = rollService.getOne(
+                    new QueryWrapper<BaseStudentSchoolRoll>().lambda()
+                            .eq(BaseStudentSchoolRoll::getUserId, user.getId())
+                            .eq(BaseStudentSchoolRoll::getDeleteMark, DeleteMark.NODELETE.getCode())
+            );
+            roll.setStduyStatus(student.getStduyStatus());
+            roll.setModifyDate(LocalDateTime.now());
+            roll.setModifyUserId(StpUtil.getLoginIdAsLong());
+
+            rollService.updateById(roll);
+        }
+        return true;
+    }
+
+    @Override
+    public Page<StudentReportRecordPlanPageVo> getTryReadingPage(Page<StudentReportRecordPlanPageVo> page, StudentReportRecordPageDto dto) {
+        return this.baseMapper.getTryReadingPage(page, dto);
+    }
+
+    @Override
+    public List<StudentReportRecordPlanPageVo> getTryReadingList(StudentReportRecordPageDto dto) {
+        return this.baseMapper.getTryReadingList(dto);
+    }
+
+    /**
+     * 试读报到
+     * @param dto
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean tryReadingSign(StudentReportSignDto dto) {
+        StudentReportRecord record = this.getById(dto.getId());
+        record.setReportTime(new Date());
+        record.setModifyUserId(StpUtil.getLoginIdAsLong());
+        record.setModifyDate(new Date());
+        this.updateById(record);
+
+        BaseNewStudent student = newStudentMapper.selectById(record.getUserId());
+
+        //先查询是否已经存在这个班级,如果存在就更新,不存在就新增
+        BaseClass baseClass = classMapper.selectById(
+                new MPJLambdaWrapper<BaseClass>()
+                        .select(BaseClass::getId)
+                        .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseClass.class).contains(x.getProperty()))
+                        .innerJoin(BandingTaskClass.class, BandingTaskClass::getName, BaseClass::getName)
+                        .innerJoin(BandingTaskClassStudent.class, BandingTaskClassStudent::getBandingTaskClassId, BandingTaskClass::getId)
+                        .eq(BandingTaskClassStudent::getNewStudentId, student.getId())
+                        .eq(BandingTaskClassStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BandingTaskClassStudent::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .eq(BandingTaskClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BandingTaskClass::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseClass::getEnabledMark, EnabledMark.ENABLED.getCode())
+        );
+        //根据身份证号查询这个学生是否存在
+        User user = userService.getOne(
+                new QueryWrapper<User>().lambda()
+                        .eq(User::getCredentialNumber, student.getCredentialNumber())
+        );
+        if(user != null){
+            //学生已存在,则修改班级信息
+            rollService.updateStudentClass(baseClass.getId(), user.getId());
+            rollService.activateStudent(user.getId());
+        }else{
+            LocalDate birthDate = getBirthDate(student.getCredentialNumber());
+            LocalDateTime now = LocalDateTime.now();
+            User xjrUser = new User() {{
+                setCreateDate(now);
+                setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+                setName(student.getName());
+                setUserName(student.getCredentialNumber());
+                setCredentialNumber(student.getCredentialNumber());
+                setCredentialType("ZZLS10007");
+                setMobile(student.getMobile());
+                setEnabledMark(EnabledMark.DISABLED.getCode());
+                setGender(student.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(student.getCredentialNumber());
+                if(student.getHeight() != null){
+                    setHeight(student.getHeight().doubleValue());
+                }
+                if(student.getWeight() != null){
+                    setWeight(student.getWeight().doubleValue());
+                }
+            }};
+            studentService.save(baseStudent);
+
+            BaseStudentSchoolRoll schoolRoll = new BaseStudentSchoolRoll() {{
+                setUserId(xjrUser.getId());
+                if(student.getScore() != null){
+                    setGraduatedScore(student.getScore().doubleValue());
+                }
+
+                setGraduatedUniversity(student.getGraduateSchool());
+                setClassId(baseClass.getId());
+                setMajorSetId(baseClass.getMajorSetId());
+                setStduyStatus(student.getStduyStatus());
+                setEnrollType(baseClass.getEnrollType());
+                setStudentSource(student.getSource());
+                setGradeId(baseClass.getGradeId());
+                setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+                setCreateDate(now);
+            }};
+            rollService.save(schoolRoll);
+
+            BaseStudentFamily studentFamily = new BaseStudentFamily() {{
+                setCreateDate(now);
+                setUserId(xjrUser.getId());
+                setTelephone(student.getFamilyMobile());
+                setAddress(student.getFamilyAddress());
+            }};
+            familyService.save(studentFamily);
+
+            CompletableFuture.runAsync(() -> {
+                List<User> userList = userService.list();
+                redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
+
+                List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
+                redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
+            });
+        }
+        return true;
+    }
+
+    /**
+     * 试读报到/新生报到调整班级,
+     * @param dto
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean changeClass(StudentReportSignDto dto) {
+        StudentReportRecord record = this.getById(dto.getId());
+        record.setReportTime(new Date());
+        this.updateById(record);
+
+        BaseNewStudent student = newStudentMapper.selectById(record.getUserId());
+        if(student == null){
+            throw new MyException("未能找到该学生");
+        }
+        //找到后,先清除该学生原来的新生班级
+        BandingTaskClass taskClass = taskClassService.getById(dto.getClassId());
+        List<Long> studentIds = new ArrayList<>();
+        studentIds.add(student.getId());
+        taskClassStudentService.removeStudent(studentIds, taskClass.getBandingTaskId());
+
+        //绑定到新的班级上
+        taskClassStudentService.save(
+                new BandingTaskClassStudent(){{
+                    setNewStudentId(student.getId());
+                    setCreateDate(new Date());
+                    setCreateUserId(StpUtil.getLoginIdAsLong());
+                    setBandingTaskClassId(taskClass.getId());
+                    setStatus(1);
+                    setDeleteMark(DeleteMark.NODELETE.getCode());
+                    setEnabledMark(EnabledMark.ENABLED.getCode());
+                }}
+        );
+        //如果已经报到了,根据身份证号查询是否已经添加到基础心中
+        if(record.getReportTime() != null){
+            User userByParam = userService.getUserByParam(
+                    new GetUserByParamDto() {{
+                        setCredentialNumber(student.getCredentialNumber());
+                    }}
+            );
+            //根据班级名字查询班级管理中的班级信息
+            BaseClass baseClass = classMapper.selectOne(
+                    new QueryWrapper<BaseClass>().lambda()
+                            .eq(BaseClass::getName, taskClass.getName())
+            );
+            if(userByParam != null && baseClass != null){
+                rollService.updateStudentClass(baseClass.getId(), userByParam.getId());
+                rollService.activateStudent(userByParam.getId());
+            }
+        }
+        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("身份证号填写错误,无法提取出生日期");
+        }
+    }
 }

+ 120 - 6
src/main/resources/mapper/student/StudentReportRecordMapper.xml

@@ -114,9 +114,6 @@
         <if test="dto.studentType != null and dto.studentType != ''">
             and t2.student_type = #{dto.studentType}
         </if>
-        <if test="dto.studentType != null and dto.studentType != ''">
-            and t2.student_type = #{dto.studentType}
-        </if>
         <if test="dto.isReport != null">
             <if test="dto.isReport == 1">
                 and t1.report_time is not null
@@ -175,9 +172,6 @@
         <if test="dto.studentType != null and dto.studentType != ''">
             and t2.student_type = #{dto.studentType}
         </if>
-        <if test="dto.studentType != null and dto.studentType != ''">
-            and t2.student_type = #{dto.studentType}
-        </if>
         <if test="dto.isReport != null">
             <if test="dto.isReport == 1">
                 and t1.report_time is not null
@@ -225,4 +219,124 @@
         </if>
         AND t10.semester_id = #{dto.baseSemesterId}
     </select>
+
+
+    <select id="getTryReadingPage" parameterType="com.xjrsoft.module.student.dto.StudentReportRecordPageDto" resultType="com.xjrsoft.module.student.vo.StudentReportRecordPlanPageVo">
+        SELECT t1.id, t1.user_id, t4.name AS grade_name,t5.name AS class_name,t6.name AS teacher_name,
+        t3.name,t7.name AS gender,t3.credential_number,t3.mobile,t8.name AS student_type_cn,
+        t9.name AS stduy_status_cn,
+        t1.report_time,IF(t1.report_time IS NULL, 0, 1) AS is_report,
+        t3.family_mobile AS parent_mobile
+        FROM student_report_record t1
+        INNER JOIN banding_task_class_student t2 ON t1.user_id = t2.new_student_id
+        INNER JOIN base_new_student t3 ON t3.id = t1.user_id
+        LEFT JOIN banding_task_class t5 ON t2.banding_task_class_id = t5.id
+        LEFT JOIN xjr_user t6 ON t5.teacher_id = t6.id
+        LEFT JOIN xjr_dictionary_detail t7 ON t3.gender = t7.code
+        LEFT JOIN xjr_dictionary_detail t8 ON t3.source = t8.code
+        LEFT JOIN xjr_dictionary_detail t9 ON t3.stduy_status = t9.code
+        LEFT JOIN banding_task t10 ON t5.banding_task_id = t10.id
+        LEFT JOIN base_grade t4 ON t10.grade_id = t4.id
+        LEFT JOIN enrollment_plan t11 ON t11.id = t3.enrollment_plan_id
+        WHERE t1.delete_mark = 0 AND t1.enabled_mark = 1
+        and t11.status = 1
+        and t3.enrollment_plan_id = #{dto.enrollmentPlanId}
+        <if test="dto.keyword != null and dto.keyword != ''">
+            and t1.name like concat('%', #{dto.keyword},'%')
+        </if>
+        <if test="dto.classId != null">
+            and t5.id = #{dto.classId}
+        </if>
+        <if test="dto.gradeId != null">
+            and t4.id = #{dto.gradeId}
+        </if>
+        <if test="dto.name != null and dto.name != ''">
+            and t3.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.className != null and dto.className != ''">
+            and t5.name like concat('%', #{dto.className}, '%')
+        </if>
+        <if test="dto.credentialNumber != null and dto.credentialNumber != ''">
+            and t3.credential_number like concat('%', #{dto.credentialNumber}, '%')
+        </if>
+        <if test="dto.archivesStatus != null and dto.archivesStatus != ''">
+            and t1.archives_status = #{dto.archivesStatus}
+        </if>
+        <if test="dto.stduyStatus != null and dto.stduyStatus != ''">
+            and t1.stduy_status = #{dto.stduyStatus}
+        </if>
+        <if test="dto.studentType != null and dto.studentType != ''">
+            and t1.student_type = #{dto.studentType}
+        </if>
+        <if test="dto.isReport != null">
+            <if test="dto.isReport == 1">
+                and t1.report_time is not null
+            </if>
+            <if test="dto.isReport == 0">
+                and t1.report_time is null
+            </if>
+        </if>
+        <if test="dto.reportTimeStart != null and dto.reportTimeEnd != null">
+            and t1.report_time between #{dto.reportTimeStart} and #{dto.reportTimeEnd}
+        </if>
+        ORDER BY t1.report_time IS NULL DESC, t1.report_time DESC,t5.name
+    </select>
+    <select id="getTryReadingList" parameterType="com.xjrsoft.module.student.dto.StudentReportRecordPageDto" resultType="com.xjrsoft.module.student.vo.StudentReportRecordPlanPageVo">
+        SELECT t1.id, t1.user_id, t4.name AS grade_name,t5.name AS class_name,t6.name AS teacher_name,
+        t3.name,t7.name AS gender,t3.credential_number,t3.mobile,t8.name AS student_type_cn,
+        t9.name AS stduy_status_cn,
+        t1.report_time,IF(t1.report_time IS NULL, 0, 1) AS is_report,
+        t3.family_mobile AS parent_mobile
+        FROM student_report_record t1
+        INNER JOIN banding_task_class_student t2 ON t1.user_id = t2.new_student_id
+        INNER JOIN base_new_student t3 ON t3.id = t1.user_id
+        LEFT JOIN banding_task_class t5 ON t2.banding_task_class_id = t5.id
+        LEFT JOIN xjr_user t6 ON t5.teacher_id = t6.id
+        LEFT JOIN xjr_dictionary_detail t7 ON t3.gender = t7.code
+        LEFT JOIN xjr_dictionary_detail t8 ON t3.source = t8.code
+        LEFT JOIN xjr_dictionary_detail t9 ON t3.stduy_status = t9.code
+        LEFT JOIN banding_task t10 ON t5.banding_task_id = t10.id
+        LEFT JOIN base_grade t4 ON t10.grade_id = t4.id
+        WHERE t1.delete_mark = 0 AND t1.enabled_mark = 1
+        and t3.enrollment_plan_id = #{dto.enrollmentPlanId}
+        <if test="dto.keyword != null and dto.keyword != ''">
+            and t1.name like concat('%', #{dto.keyword},'%')
+        </if>
+        <if test="dto.classId != null">
+            and t5.id = #{dto.classId}
+        </if>
+        <if test="dto.gradeId != null">
+            and t4.id = #{dto.gradeId}
+        </if>
+        <if test="dto.name != null and dto.name != ''">
+            and t3.name like concat('%', #{dto.name}, '%')
+        </if>
+        <if test="dto.className != null and dto.className != ''">
+            and t5.name like concat('%', #{dto.className}, '%')
+        </if>
+        <if test="dto.credentialNumber != null and dto.credentialNumber != ''">
+            and t3.credential_number like concat('%', #{dto.credentialNumber}, '%')
+        </if>
+        <if test="dto.archivesStatus != null and dto.archivesStatus != ''">
+            and t3.archives_status = #{dto.archivesStatus}
+        </if>
+        <if test="dto.stduyStatus != null and dto.stduyStatus != ''">
+            and t3.stduy_status = #{dto.stduyStatus}
+        </if>
+        <if test="dto.studentType != null and dto.studentType != ''">
+            and t3.student_type = #{dto.studentType}
+        </if>
+        <if test="dto.isReport != null">
+            <if test="dto.isReport == 1">
+                and t1.report_time is not null
+            </if>
+            <if test="dto.isReport == 0">
+                and t1.report_time is null
+            </if>
+        </if>
+        <if test="dto.reportTimeStart != null and dto.reportTimeEnd != null">
+            and t1.report_time between #{dto.reportTimeStart} and #{dto.reportTimeEnd}
+        </if>
+        ORDER BY t1.report_time IS NULL DESC, t1.report_time DESC,t5.name is null desc,t5.name
+    </select>
 </mapper>

+ 14 - 0
src/main/resources/sqlScript/20250307_sql.sql

@@ -0,0 +1,14 @@
+ALTER TABLE `banding_task_class_student`   
+  ADD COLUMN `is_report` INT NULL AFTER `status`;
+
+
+ALTER TABLE `base_new_student`   
+  ADD COLUMN `is_report` INT COMMENT '是否可以分班(0:否,1:是)';
+ALTER TABLE `base_new_student`   
+  ADD COLUMN `remarks` VARCHAR(250) COMMENT '备注';
+ALTER TABLE `base_new_student`   
+  ADD COLUMN `operate_mode` INT COMMENT '分班类型(1:自动分班 2:手动分班)';
+  
+ALTER TABLE `base_new_student`   
+  CHANGE `status` `status` INT DEFAULT 0  NULL   COMMENT '班级状态(0:未分配, 1:已分配)',
+  CHANGE `is_can_banding` `is_can_banding` INT DEFAULT 1  NULL   COMMENT '是否可以分班(0:否,1:是)';

+ 10 - 0
src/main/resources/sqlScript/20250310_sql.sql

@@ -0,0 +1,10 @@
+ALTER TABLE `student_report_record`   
+  ADD INDEX (`student_report_plan_id`);
+
+ALTER TABLE `student_report_record`   
+  CHANGE `user_id` `user_id` BIGINT NULL   COMMENT '学生id(banding_task_id不为空时则为新生id)';
+ALTER TABLE `student_report_plan`   
+  ADD COLUMN `category` INT DEFAULT 1  NULL   COMMENT '类别(1:开学报到 2:试读报到 3:新生报到)' AFTER `status`;
+  
+ALTER TABLE `student_report_plan`   
+  ADD COLUMN `banding_task_id` BIGINT NULL   COMMENT '分班任务id';