Browse Source

Merge branch 'pre'

dzx 1 week ago
parent
commit
85d6b3aab5
39 changed files with 589 additions and 174 deletions
  1. 1 1
      src/main/java/com/xjrsoft/common/xss/XssHttpServletRequestWrapper.java
  2. 5 1
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java
  3. 43 25
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java
  4. 1 0
      src/main/java/com/xjrsoft/module/base/controller/BaseGradeController.java
  5. 3 1
      src/main/java/com/xjrsoft/module/courseTable/service/impl/CourseTableServiceImpl.java
  6. 6 4
      src/main/java/com/xjrsoft/module/databoard/controller/DatadetailController.java
  7. 5 0
      src/main/java/com/xjrsoft/module/form/service/impl/FormReleaseServiceImpl.java
  8. 7 4
      src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java
  9. 1 0
      src/main/java/com/xjrsoft/module/job/WfCourseAdjustTask.java
  10. 1 3
      src/main/java/com/xjrsoft/module/liteflow/node/WfRoomApplicantNode.java
  11. 3 4
      src/main/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNode.java
  12. 3 1
      src/main/java/com/xjrsoft/module/oa/controller/WfMeetingApplyController.java
  13. 8 1
      src/main/java/com/xjrsoft/module/oa/dto/UpdateMeetingSummaryDto.java
  14. 60 2
      src/main/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImpl.java
  15. 5 0
      src/main/java/com/xjrsoft/module/oa/vo/MeetingConfereeOpinionListVo.java
  16. 14 1
      src/main/java/com/xjrsoft/module/oa/vo/MeetingMobileInfoVo.java
  17. 6 0
      src/main/java/com/xjrsoft/module/oa/vo/TodayMeetingMobilePageVo.java
  18. 1 2
      src/main/java/com/xjrsoft/module/personnel/controller/CarMessageApplyController.java
  19. 2 0
      src/main/java/com/xjrsoft/module/personnel/mapper/CarMessageApplyMapper.java
  20. 6 0
      src/main/java/com/xjrsoft/module/personnel/service/ICarMessageApplyService.java
  21. 23 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/CarMessageApplyServiceImpl.java
  22. 1 1
      src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java
  23. 1 0
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentSchoolRollService.java
  24. 8 3
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java
  25. 0 1
      src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java
  26. 7 5
      src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java
  27. 10 4
      src/main/java/com/xjrsoft/module/student/vo/BaseNewStudentPageVo.java
  28. 8 71
      src/main/java/com/xjrsoft/module/system/controller/MenuController.java
  29. 7 1
      src/main/java/com/xjrsoft/module/system/mapper/MenuMapper.java
  30. 11 0
      src/main/java/com/xjrsoft/module/system/service/IMenuService.java
  31. 151 19
      src/main/java/com/xjrsoft/module/system/service/impl/MenuServiceImpl.java
  32. 3 0
      src/main/java/com/xjrsoft/module/system/vo/MenuVo.java
  33. 1 0
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookStudentClaimServiceImpl.java
  34. 0 5
      src/main/resources/application-dev.yml
  35. 9 0
      src/main/resources/mapper/personnel/CarMessageApplyMapper.xml
  36. 7 3
      src/main/resources/mapper/student/BaseNewStudentMapper.xml
  37. 18 0
      src/main/resources/mapper/system/MenuMapper.xml
  38. 15 11
      src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest.java
  39. 128 0
      src/test/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNodeTest.java

+ 1 - 1
src/main/java/com/xjrsoft/common/xss/XssHttpServletRequestWrapper.java

@@ -34,7 +34,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
 
     private String method;
 
-    private final List<String> ignoreXssUrl = ListUtil.toList("/magic-api/**", "/magic/web/**","/workflow/execute/*");
+    private final List<String> ignoreXssUrl = ListUtil.toList("/magic-api/**", "/magic/web/**", "/workflow/execute/*", "/oa/wfMeetingApply/update_meetingSummary");
     //html过滤
     private final static HTMLFilter HTML_FILTER = new HTMLFilter();
 

+ 5 - 1
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -101,7 +101,11 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
             return true;
         } catch (Exception e) {
             Log.error(e.getMessage(), e);
-            throw new MyException("添加报错,请联系管理员");
+            if(e.getClass().equals(MyException.class)){
+                throw new MyException(e.getMessage());
+            }else{
+                throw new MyException("添加报错,请联系管理员");
+            }
         }
     }
 

+ 43 - 25
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java

@@ -117,36 +117,36 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                         .in(BandingTaskClassStudent::getNewStudentId, dto.getNewStudentIds())
         );
 
-        BaseClass aClass = classService.getById(dto.getBandingTaskClassId());
+        List<BaseNewStudent> list = newStudentService.list(
+                new QueryWrapper<BaseNewStudent>().lambda()
+                        .in(BaseNewStudent::getId, dto.getNewStudentIds())
+        );
 
         List<BandingTaskClassStudent> dataList = new ArrayList<>();
         long createUserId = StpUtil.getLoginIdAsLong();
 
-        for (Long newStudentId : dto.getNewStudentIds()) {
-            dataList.add(
-                    new BandingTaskClassStudent(){{
-                        setCreateDate(new Date());
-                        setNewStudentId(newStudentId);
-                        setBandingTaskClassId(dto.getBandingTaskClassId());
-                        setCreateUserId(createUserId);
-                        setStatus(0);
-                        if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
-                            setStatus(1);
-                        }
-                    }}
-            );
-        }
-        if(!dataList.isEmpty()){
-            this.saveBatch(dataList);
-        }
+        if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
+            BaseClass aClass = classService.getById(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)
-        );
+            BandingTaskClass taskClass = taskClassMapper.selectOne(
+                    new QueryWrapper<BandingTaskClass>().lambda()
+                            .eq(BandingTaskClass::getBaseClassId, aClass.getId())
+            );
 
-        if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
+            for (Long newStudentId : dto.getNewStudentIds()) {
+                dataList.add(
+                        new BandingTaskClassStudent(){{
+                            setCreateDate(new Date());
+                            setNewStudentId(newStudentId);
+                            setBandingTaskClassId(taskClass.getId());
+                            setCreateUserId(createUserId);
+                            setStatus(0);
+                            if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
+                                setStatus(1);
+                            }
+                        }}
+                );
+            }
             //新增报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
             BaseSemester semester = semesterService.getCurrentSemester();
             List<StudentReportPlan> planList = reportPlanService.list(
@@ -158,7 +158,7 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
             );
 
             for (StudentReportPlan plan : planList) {
-                for (Long newStudentId : studentIds) {
+                for (Long newStudentId : dto.getNewStudentIds()) {
                     StudentReportRecord record = new StudentReportRecord();
                     record.setCreateDate(new Date());
                     record.setCreateUserId(StpUtil.getLoginIdAsLong());
@@ -291,6 +291,24 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
             if(!updateList.isEmpty()){
                 newStudentService.updateBatchById(updateList);
             }
+            for (Long newStudentId : dto.getNewStudentIds()) {
+                dataList.add(
+                        new BandingTaskClassStudent(){{
+                            setCreateDate(new Date());
+                            setNewStudentId(newStudentId);
+                            setBandingTaskClassId(dto.getBandingTaskClassId());
+                            setCreateUserId(createUserId);
+                            setStatus(0);
+                            if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
+                                setStatus(1);
+                            }
+                        }}
+                );
+            }
+        }
+
+        if(!dataList.isEmpty()){
+            this.saveBatch(dataList);
         }
         return true;
     }

+ 1 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseGradeController.java

@@ -47,6 +47,7 @@ public class BaseGradeController {
                         .eq(BaseGrade::getStatus, dto.getStatus())
                         .like(StrUtil.isNotEmpty(dto.getName()), BaseGrade::getName, dto.getName())
                         .like(StrUtil.isNotEmpty(dto.getTitle()), BaseGrade::getTitle, dto.getTitle())
+                        .orderByDesc(BaseGrade::getTitle)
         );
 
         return RT.ok(BeanUtil.copyToList(list, BaseGradeVo.class));

+ 3 - 1
src/main/java/com/xjrsoft/module/courseTable/service/impl/CourseTableServiceImpl.java

@@ -391,7 +391,9 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
                     }
 
                     CourseTable swapCourseTable = courseMap.get(bakKeyInfoMap.get(Long.parseLong(exchangeCourseId)));
-
+                    if (swapCourseTable == null) {
+                        continue;
+                    }
                     CourseTableBak courseTableBak = bakCourseMap.get(Long.parseLong(courseId));
                     CourseTableBak swapCourseTableBak = bakCourseMap.get(Long.parseLong(exchangeCourseId));
 

+ 6 - 4
src/main/java/com/xjrsoft/module/databoard/controller/DatadetailController.java

@@ -295,8 +295,10 @@ public class DatadetailController {
     @XjrLog(value = "教职工详情数据统计", saveResponseData = true)
     public RT<TeacherStatisticsDetailVo> teahcerStatistics(@Valid StatisticsDetailDto dto) throws ParseException {
         String sql = "SELECT IFNULL(t2.name,'未填写') AS item ,ifnull(COUNT(*), 0) AS a_count FROM base_teacher_education t1" +
+                " left join base_teacher t3 on t1.user_id = t2.user_id" +
                 " LEFT JOIN xjr_dictionary_detail t2 ON t1.education  = t2.code" +
-                " WHERE t1.delete_mark = 0 GROUP BY t2.name";
+                " WHERE t1.delete_mark = 0 and t3.job_state in ('ZZZT10004','ZZZT10009','JOB_WCPX','JOB_DDSX')" +
+                " GROUP BY t2.name";
         List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
         TeacherStatisticsDetailVo result = new TeacherStatisticsDetailVo();
         List<ItemCountVo> educationList = new ArrayList<>();
@@ -313,7 +315,7 @@ public class DatadetailController {
         sql = "SELECT IFNULL(t3.name,'未填写') AS item ,ifnull(COUNT(*), 0) AS a_count FROM xjr_user t1" +
                 " INNER JOIN base_teacher t2 ON t1.id = t2.user_id" +
                 " LEFT JOIN xjr_dictionary_detail t3 ON t1.gender  = t3.code AND t3.item_id = 2023000000000000004" +
-                " WHERE t1.delete_mark = 0 GROUP BY t3.name";
+                " WHERE t1.delete_mark = 0 and t2.job_state in ('ZZZT10004','ZZZT10009','JOB_WCPX','JOB_DDSX') GROUP BY t3.name";
         list = SqlRunnerAdapter.db().selectList(sql);
         List<ItemCountVo> genderList = new ArrayList<>();
         for (Map<String, Object> objectMap : list) {
@@ -329,7 +331,7 @@ public class DatadetailController {
         sql = "SELECT IFNULL(t3.name,'未填写') AS item ,ifnull(COUNT(*), 0) AS a_count FROM xjr_user t1" +
                 " INNER JOIN base_teacher t2 ON t1.id = t2.user_id" +
                 " LEFT JOIN xjr_dictionary_detail t3 ON t2.employ_type  = t3.code AND t3.item_id = 2023000000000000016" +
-                " WHERE t1.delete_mark = 0 GROUP BY t3.name";
+                " WHERE t1.delete_mark = 0 and t2.job_state in ('ZZZT10004','ZZZT10009','JOB_WCPX','JOB_DDSX') GROUP BY t3.name";
         list = SqlRunnerAdapter.db().selectList(sql);
         List<ItemCountVo> employList = new ArrayList<>();
         for (Map<String, Object> objectMap : list) {
@@ -346,7 +348,7 @@ public class DatadetailController {
                 " INNER JOIN base_teacher t2 ON t1.id = t2.user_id" +
                 " LEFT JOIN xjr_user_dept_relation t3 ON t1.id  = t3.user_id" +
                 " LEFT JOIN xjr_department t4 ON t3.dept_id = t4.id" +
-                " WHERE t1.delete_mark = 0 AND t4.is_major = 1 GROUP BY t4.name";
+                " WHERE t1.delete_mark = 0 AND t4.is_major = 1 and t2.job_state in ('ZZZT10004','ZZZT10009','JOB_WCPX','JOB_DDSX') GROUP BY t4.name";
 
         list = SqlRunnerAdapter.db().selectList(sql);
         List<ItemCountVo> deptList = new ArrayList<>();

+ 5 - 0
src/main/java/com/xjrsoft/module/form/service/impl/FormReleaseServiceImpl.java

@@ -154,6 +154,11 @@ public class FormReleaseServiceImpl extends MPJBaseServiceImpl<FormReleaseMapper
         menu.setPath("/custom-form/" + Convert.toStr(releaseId));
         menu.setComponent("/form/template/index");
 
+        if (menu.getParentId() != 0L) {
+            Menu parentMenu = menuService.getById(menu.getParentId());
+            menu.setSystemId(parentMenu.getSystemId());
+        }
+
         //新增菜单
         menuService.saveOrUpdate(menu);
 

+ 7 - 4
src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java

@@ -420,10 +420,13 @@ public class JianyuekbScheduleTask {
                 courseCount += exchangeCourseIds.length;
             }
             //查询顶课老师在本条申请的课程中的节次是否包含课
-            Integer substituteTeacherCourseCount = courseTableService.getSubstituteTeacherCourseCountByParams(new ClassTeacherDto() {{
-                setWfCourseAdjustId(courseAdjust.getId());
-                setTeacherId(Long.parseLong(courseAdjust.getExchangeTeacherId()));
-            }});
+            Integer substituteTeacherCourseCount = 0;
+            if(CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseAdjust.getAdjustType())){
+                substituteTeacherCourseCount = courseTableService.getSubstituteTeacherCourseCountByParams(new ClassTeacherDto() {{
+                    setWfCourseAdjustId(courseAdjust.getId());
+                    setTeacherId(Long.parseLong(courseAdjust.getExchangeTeacherId()));
+                }});
+            }
             if (courseList.size() != courseCount || substituteTeacherCourseCount > 0) {
                 //表明课程变化了,需要重新申请,需要将原来的申请作废并进行微信消息通知
                 courseAdjust.setEnabledMark(EnabledMark.DISABLED.getCode());

+ 1 - 0
src/main/java/com/xjrsoft/module/job/WfCourseAdjustTask.java

@@ -57,6 +57,7 @@ public class WfCourseAdjustTask {
             if(SqlRunnerAdapter.db().selectList(sql).isEmpty()){
                 continue;
             }
+
             courseTableService.adjustCourse(wfCourseAdjust);
         }
     }

+ 1 - 3
src/main/java/com/xjrsoft/module/liteflow/node/WfRoomApplicantNode.java

@@ -120,9 +120,7 @@ public class WfRoomApplicantNode extends NodeComponent {
                         } catch (InterruptedException e) {
                             throw new RuntimeException(e);
                         }
-                        //wfRoomApplicantService.noticeParents(formId);
-
-
+                        wfRoomApplicantService.noticeParents(formId);
                     });
                 }
             });

+ 3 - 4
src/main/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNode.java

@@ -79,7 +79,7 @@ public class WfStudentRepeatStudyNode extends NodeComponent {
                             return;
                         }
                         HistoricProcessInstance historicProcessInstance = historicProcessInstanceOptional.get();
-                        if (historicProcessInstance.getState().equals(HistoricProcessInstance.STATE_COMPLETED)) {
+                        if (!historicProcessInstance.getState().equals(HistoricProcessInstance.STATE_ACTIVE)) {
                             String tableName = "wf_student_repeat_study";
                             Entity where = Entity.create(tableName);
                             where.set("id", formId);
@@ -107,7 +107,7 @@ public class WfStudentRepeatStudyNode extends NodeComponent {
                                 List<AddBaseStudentSchoolRollDto> baseStudentSchoolRollList = new ArrayList<>();
                                 AddBaseStudentSchoolRollDto rollDto = new AddBaseStudentSchoolRollDto();
                                 rollDto.setStduyStatus(objectMap.get("stduy_status").toString());
-                                rollDto.setStduyStatus(ArchivesStatusEnum.FB2901.getCode());
+                                rollDto.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
                                 rollDto.setMajorSetId(Long.parseLong(objectMap.get("major_set_id").toString()));
                                 rollDto.setStudentType(StudentTypeEnum.FB2801.getCode());
                                 rollDto.setClassId(Long.parseLong(objectMap.get("class_id").toString()));
@@ -132,7 +132,6 @@ public class WfStudentRepeatStudyNode extends NodeComponent {
                                 baseStudentUser.setBaseStudentFamilyList(baseStudentFamilyList);
 
                                 List<AddBaseStudentFamilyMemberDto> baseStudentFamilyMemberList = new ArrayList<>();
-                                baseStudentFamilyMemberList.add(new AddBaseStudentFamilyMemberDto());
                                 baseStudentUser.setBaseStudentFamilyMemberList(baseStudentFamilyMemberList);
 
                                 List<AddBaseStudentSubsidizeDto> baseStudentSubsidizeList = new ArrayList<>();
@@ -140,7 +139,7 @@ public class WfStudentRepeatStudyNode extends NodeComponent {
 
                                 studentService.add(baseStudentUser);
                             }else{
-                                schoolRollService.activateStudent(user.getId());
+                                schoolRollService.activateStudent(user.getId(), null);
                                 schoolRollService.updateStudentClassGradeMajorStduyStatus(
                                         Long.parseLong(objectMap.get("class_id").toString()),
                                         Long.parseLong(objectMap.get("grade_id").toString()),

+ 3 - 1
src/main/java/com/xjrsoft/module/oa/controller/WfMeetingApplyController.java

@@ -19,6 +19,7 @@ import com.xjrsoft.module.system.service.IFileService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -133,10 +134,11 @@ public class WfMeetingApplyController {
         return RT.ok(meetingConfereeOpinionListVos);
     }
 
-    @PutMapping(value = "/update_meetingSummary")
+    @PostMapping(value = "/update_meetingSummary")
     @ApiOperation(value = "编辑会议纪要")
     @SaCheckPermission("wfmeetingapply:edit")
     @XjrLog(value = "编辑会议纪要")
+    @Transactional(rollbackFor = Exception.class)
     public RT<Boolean> updateMeetingSummary(@Valid @RequestBody UpdateMeetingSummaryDto dto){
         WfMeetingApply wfMeetingApply = new WfMeetingApply();
         wfMeetingApply.setId(dto.getId());

+ 8 - 1
src/main/java/com/xjrsoft/module/oa/dto/UpdateMeetingSummaryDto.java

@@ -3,6 +3,8 @@ package com.xjrsoft.module.oa.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.io.Serializable;
+
 
 /**
 * @title: 编辑会议纪要
@@ -11,7 +13,7 @@ import lombok.Data;
 * @Version 1.0
 */
 @Data
-public class UpdateMeetingSummaryDto {
+public class UpdateMeetingSummaryDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -31,4 +33,9 @@ public class UpdateMeetingSummaryDto {
      */
     @ApiModelProperty("会议纪要附件")
     private Long meetingSummaryFileId;
+    /**
+     * 会议纪要附件
+     */
+    @ApiModelProperty("无用参数")
+    private Long fileId;
 }

+ 60 - 2
src/main/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImpl.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,6 +14,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.MeetingTypeEnum;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.LocalDateTimeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseOfficeBuild;
 import com.xjrsoft.module.ledger.vo.WorkflowRecordVo;
@@ -28,6 +30,7 @@ import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.schedule.vo.TodayScheduleVo;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.mapper.FileMapper;
@@ -288,6 +291,26 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
         IPage<TodayMeetingMobilePageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), TodayMeetingMobilePageVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
         List<TodayMeetingMobilePageVo> record = page.getRecords();
 
+        Map<String, LocalTime> startTimeMap = record.stream().collect(Collectors.toMap(TodayMeetingMobilePageVo::getId, TodayMeetingMobilePageVo::getMeetingApplyS));
+        Map<String, LocalTime> endTimeMap = record.stream().collect(Collectors.toMap(TodayMeetingMobilePageVo::getId, TodayMeetingMobilePageVo::getMeetingApplyE));
+        for (TodayMeetingMobilePageVo vo : record) {
+            int adjustType = 1;
+            LocalTime oneStartTime = vo.getMeetingApplyS();
+            LocalTime oneEndTime =  vo.getMeetingApplyE();
+            for (String id : startTimeMap.keySet()) {
+                if(vo.getId().equals(id)){
+                    continue;
+                }
+                LocalTime startTime = startTimeMap.get(id);
+                LocalTime endTime = endTimeMap.get(id);
+                if((oneStartTime.isAfter(startTime) && oneStartTime.isBefore(endTime))
+                        || (oneEndTime.isAfter(startTime) && oneEndTime.isBefore(endTime))){
+                    adjustType = 0;
+                }
+            }
+            vo.setConflictStatus(adjustType);
+        }
+
         // 分割并重组列表
         List<TodayMeetingMobilePageVo> futureVo = new ArrayList<>(); // 当前时间之后的事件
         List<TodayMeetingMobilePageVo> pastVo = new ArrayList<>();   // 当前时间之前的事件
@@ -315,6 +338,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                 futureVo.add(vo); // 未来的事件
             }
         }
+
         List<TodayMeetingMobilePageVo> result = new ArrayList<>();
         result.addAll(futureVo);
         result.addAll(pastVo);
@@ -442,6 +466,34 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
         if (ObjectUtils.isNotEmpty(info)) {
             List<File> fileList = fileMapper.selectList(Wrappers.<File>query().lambda().eq(File::getFolderId, info.getPreMeetingInfoFileId()));
             info.setFileInfos(fileList);
+
+            // 处理签到状态
+            LambdaQueryWrapper<MeetingConferee> meetingConfereeLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            meetingConfereeLambdaQueryWrapper
+                    .eq(MeetingConferee::getUserId, StpUtil.getLoginIdAsLong())
+                    .eq(MeetingConferee::getWfMeetingApplyId, id)
+                    ;
+            MeetingConferee meetingConferee = meetingConfereeMapper.selectOne(meetingConfereeLambdaQueryWrapper);
+            info.setCheckInStatus(meetingConferee.getCheckInStatus());
+
+            // 处理状态
+            LocalTime nowLocalTime = LocalTime.now();
+            LocalDate nowLocalDate = LocalDate.now();
+            if (info.getMeetingStatus() != 1) {
+                if (info.getMeetingApplyDate().isBefore(nowLocalDate)) {
+                    info.setMeetingStatus(2);
+                } else if (info.getMeetingApplyDate().isAfter(nowLocalDate)) {
+                    info.setMeetingStatus(0);
+                } else {
+                    if (info.getMeetingApplyE().isBefore(nowLocalTime)) {
+                        info.setMeetingStatus(2);
+                    } else if (info.getMeetingApplyS().isAfter(nowLocalTime)) {
+                        info.setMeetingStatus(0);
+                    } else {
+                        info.setMeetingStatus(3);
+                    }
+                }
+            }
         }
 
         return info;
@@ -537,6 +589,10 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                 .leftJoin(XjrUser.class, XjrUser::getId, MeetingConfereeOpinion::getUserId,
                         wrapper -> wrapper
                                 .selectAs(XjrUser::getName, MeetingConfereeOpinionListVo::getUserIdCn)
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, XjrUser::getGender,
+                                        wrap -> wrap
+                                                .selectAs(DictionaryDetail::getName, MeetingConfereeOpinionListVo::getGenderCn)
+                                )
                 )
                 .eq(MeetingConfereeOpinion::getWfMeetingApplyId, dto.getWfMeetingApplyId())
         ;
@@ -714,16 +770,18 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateMeetingCheckIn(UpdateMeetingCheckInDto dto) {
+        Long loginId = StpUtil.getLoginIdAsLong();
+
         LambdaUpdateWrapper<MeetingConferee> meetingConfereeLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
         meetingConfereeLambdaUpdateWrapper
                 .eq(MeetingConferee::getWfMeetingApplyId, dto.getId())
-                .eq(MeetingConferee::getUserId, StpUtil.getLoginIdAsLong())
+                .eq(MeetingConferee::getUserId, loginId)
                 ;
         MeetingConferee meetingConferee = new MeetingConferee();
         meetingConferee.setCheckInStatus(1);
         meetingConferee.setCheckInDate(new Date());
         meetingConferee.setModifyDate(new Date());
-        meetingConferee.setModifyUserId(StpUtil.getLoginIdAsLong());
+        meetingConferee.setModifyUserId(loginId);
         meetingConfereeMapper.update(meetingConferee, meetingConfereeLambdaUpdateWrapper);
         return true;
     }

+ 5 - 0
src/main/java/com/xjrsoft/module/oa/vo/MeetingConfereeOpinionListVo.java

@@ -37,6 +37,11 @@ public class MeetingConfereeOpinionListVo {
      */
     @ApiModelProperty("用户主键id(xjr_user)")
     private String userIdCn;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String genderCn;
     /**
     * 意见
     */

+ 14 - 1
src/main/java/com/xjrsoft/module/oa/vo/MeetingMobileInfoVo.java

@@ -4,6 +4,7 @@ import com.xjrsoft.module.system.entity.File;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDate;
 import java.time.LocalTime;
 import java.util.Date;
 import java.util.List;
@@ -36,7 +37,7 @@ public class MeetingMobileInfoVo {
     * 会议日期
     */
     @ApiModelProperty("会议日期")
-    private Date meetingApplyDate;
+    private LocalDate meetingApplyDate;
     /**
     * 会议开始时间
     */
@@ -115,4 +116,16 @@ public class MeetingMobileInfoVo {
 
     @ApiModelProperty("附件列表")
     private List<File> fileInfos;
+
+    /**
+     * 会议状态(0:未开始 1:已经撤销,2:已结束)
+     */
+    @ApiModelProperty("会议状态(0:未开始 1:已经撤销,2:已结束,3:进行中,4:未参与)")
+    private Integer meetingStatus;
+
+    /**
+     * 签到状态(0:未签到,1:已签到)
+     */
+    @ApiModelProperty("签到状态(0:未签到,1:已签到,2:请假)")
+    private Integer checkInStatus;
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/oa/vo/TodayMeetingMobilePageVo.java

@@ -70,4 +70,10 @@ public class TodayMeetingMobilePageVo {
      */
     @ApiModelProperty("签到状态(0:未签到,1:已签到)")
     private Integer checkInStatus;
+
+    /**
+     * 签到状态(0:未签到,1:已签到)
+     */
+    @ApiModelProperty("冲突状态(0:冲突,1:不冲突)")
+    private Integer conflictStatus;
 }

+ 1 - 2
src/main/java/com/xjrsoft/module/personnel/controller/CarMessageApplyController.java

@@ -115,8 +115,7 @@ public class CarMessageApplyController {
     @SaCheckPermission("carmessageapply:add")
     @XjrLog(value = "新增车辆信息审核", saveResponseData = true)
     public RT<Boolean> add(@Valid @RequestBody AddCarMessageApplyDto dto) {
-        CarMessageApply carMessageApply = BeanUtil.toBean(dto, CarMessageApply.class);
-        boolean isSuccess = carMessageApplyService.save(carMessageApply);
+        boolean isSuccess = carMessageApplyService.add(dto);
         return RT.ok(isSuccess);
     }
 

+ 2 - 0
src/main/java/com/xjrsoft/module/personnel/mapper/CarMessageApplyMapper.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.personnel.mapper;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @title: 车辆信息审核
@@ -13,4 +14,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface CarMessageApplyMapper extends MPJBaseMapper<CarMessageApply> {
 
+    Integer getCountByCarNumber(@Param("carNumber") String carNumber);
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/personnel/service/ICarMessageApplyService.java

@@ -1,6 +1,8 @@
 package com.xjrsoft.module.personnel.service;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.personnel.dto.AddCarMessageApplyDto;
+import com.xjrsoft.module.personnel.dto.UpdateCarMessageApplyDto;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
 
 import java.util.List;
@@ -15,4 +17,8 @@ import java.util.List;
 public interface ICarMessageApplyService extends MPJBaseService<CarMessageApply> {
 
     Boolean deleteBatchByIds(List<Long> ids);
+
+    Boolean add(AddCarMessageApplyDto dto);
+
+
 }

+ 23 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/CarMessageApplyServiceImpl.java

@@ -1,14 +1,19 @@
 package com.xjrsoft.module.personnel.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
+import com.xjrsoft.module.personnel.dto.AddCarMessageApplyDto;
+import com.xjrsoft.module.personnel.dto.UpdateCarMessageApplyDto;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.personnel.mapper.CarMessageApplyMapper;
 import com.xjrsoft.module.personnel.service.ICarMessageApplyService;
@@ -16,6 +21,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -69,4 +75,21 @@ public class CarMessageApplyServiceImpl extends MPJBaseServiceImpl<CarMessageApp
 //        }
         return true;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(AddCarMessageApplyDto dto) {
+        long countByCarNumber = this.count(
+                new QueryWrapper<CarMessageApply>().lambda()
+                        .eq(CarMessageApply::getCarNumber, dto.getCarNumber())
+                        .eq(CarMessageApply::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        if(countByCarNumber > 0){
+            throw new MyException("已存在该车牌号");
+        }
+        CarMessageApply carMessageApply = BeanUtil.toBean(dto, CarMessageApply.class);
+        this.save(carMessageApply);
+        return true;
+    }
+
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java

@@ -53,7 +53,7 @@ public interface BaseStudentSchoolRollMapper extends MPJBaseMapper<BaseStudentSc
     @Update("UPDATE base_student_school_roll SET class_id = #{classId} where user_id = #{userId}")
     Boolean updateStudentClass(Long classId, Long userId);
 
-    @Update("UPDATE base_student_school_roll SET class_id = #{classId},major_set_id=#{majorSetId},gradeId=#{gradeId},stduy_status=#{stduyStatus} where user_id = #{userId}")
+    @Update("UPDATE base_student_school_roll SET class_id = #{classId},major_set_id=#{majorSetId},grade_id=#{gradeId},stduy_status=#{stduyStatus} where user_id = #{userId}")
     Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId);
 
 

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

@@ -60,6 +60,7 @@ public interface IBaseStudentSchoolRollService extends MPJBaseService<BaseStuden
     Long getClassIdByUserId(Long userId);
 
     Boolean activateStudent(Long userId);
+    Boolean activateStudent(Long userId, Long modifyUserId);
 
     Boolean disableStudent(Long userId);
 

+ 8 - 3
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java

@@ -275,11 +275,16 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean activateStudent(Long userId) {
+        return activateStudent(userId, StpUtil.getLoginIdAsLong());
+    }
+
+    @Override
+    public Boolean activateStudent(Long userId, Long modifyUserId) {
         //激活用户信息
         User user = userMapper.selectById(userId);
         user.setDeleteMark(DeleteMark.NODELETE.getCode());
         user.setEnabledMark(EnabledMark.ENABLED.getCode());
-        user.setModifyUserId(StpUtil.getLoginIdAsLong());
+        user.setModifyUserId(modifyUserId);
         user.setModifyDate(LocalDateTime.now());
         userMapper.updateById(user);
 
@@ -294,7 +299,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
         schoolRoll.setDeleteMark(DeleteMark.NODELETE.getCode());
         schoolRoll.setEnabledMark(EnabledMark.ENABLED.getCode());
         schoolRoll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
-        schoolRoll.setModifyUserId(StpUtil.getLoginIdAsLong());
+        schoolRoll.setModifyUserId(modifyUserId);
         schoolRoll.setModifyDate(LocalDateTime.now());
         this.updateById(schoolRoll);
 
@@ -304,7 +309,7 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
                         .eq(BaseStudent::getUserId, userId)
         );
         baseStudent.setIsNormal(1);
-        baseStudent.setModifyUserId(StpUtil.getLoginIdAsLong());
+        baseStudent.setModifyUserId(modifyUserId);
         baseStudent.setModifyDate(LocalDateTime.now());
         baseStudentMapper.updateById(baseStudent);
 

+ 0 - 1
src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java

@@ -355,7 +355,6 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
                         .eq(EnrollmentStatisticsInfo::getDeleteMark, DeleteMark.NODELETE.getCode())
                         .eq(EnrollmentStatisticsInfo::getEnabledMark, EnabledMark.ENABLED.getCode())
                         .eq(EnrollmentStatisticsInfo::getDataType, 3)
-                        .eq(EnrollmentStatisticsInfo::getDataDay, LocalDate.now())
                         .eq(StrUtil.isNotEmpty(dto.getStartDay()), EnrollmentStatisticsInfo::getDataStartDay, dto.getStartDay())
                         .eq(StrUtil.isNotEmpty(dto.getEndDay()), EnrollmentStatisticsInfo::getDataEndDay, dto.getEndDay())
                         .orderByDesc(EnrollmentStatisticsInfo::getCreateDate)

+ 7 - 5
src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.StudentTypeEnum;
+import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
@@ -267,11 +269,11 @@ public class PbVXsxxsfytbServiceImpl extends MPJBaseServiceImpl<PbVXsxxsfytbMapp
         List<StringCountVo> countVoList = pbVXsxxsfytbMapper.studentCategoryStat(dto);
         PbStudentCategoryVo result = new PbStudentCategoryVo();
         for (StringCountVo stringCountVo : countVoList) {
-            if ("其他类型贫困".equals(stringCountVo.getName())) {
+            if (StudentTypeEnum.FB2803.getValue().equals(stringCountVo.getName())) {
                 result.setOtherPoorCount(stringCountVo.getCount());
-            } else if ("普通学生(非贫困)".equals(stringCountVo.getName())) {
+            } else if (StudentTypeEnum.FB2801.getValue().equals(stringCountVo.getName())) {
                 result.setInclusiveCount(stringCountVo.getCount());
-            } else if ("贫困生(建卡、低保、特困)".equals(stringCountVo.getName())) {
+            } else if (StudentTypeEnum.FB2802.getValue().equals(stringCountVo.getName())) {
                 result.setPoorCount(stringCountVo.getCount());
             }
         }
@@ -294,9 +296,9 @@ public class PbVXsxxsfytbServiceImpl extends MPJBaseServiceImpl<PbVXsxxsfytbMapp
         List<StringCountVo> countVoList = pbVXsxxsfytbMapper.stduyStatusStat(dto);
         PbStduyStatusVo result = new PbStduyStatusVo();
         for (StringCountVo stringCountVo : countVoList) {
-            if ("住宿".equals(stringCountVo.getName())) {
+            if ("住".equals(stringCountVo.getName())) {
                 result.setStayCount(stringCountVo.getCount());
-            } else if ("走读".equals(stringCountVo.getName())) {
+            } else if (StudyStatusEnum.AttendDaySchool.getValue().equals(stringCountVo.getName())) {
                 result.setNotStayCount(stringCountVo.getCount());
             }
         }

+ 10 - 4
src/main/java/com/xjrsoft/module/student/vo/BaseNewStudentPageVo.java

@@ -156,13 +156,13 @@ public class BaseNewStudentPageVo {
     @ApiModelProperty("家庭地址")
     private String familyAddress;
 
-    @ExcelProperty("班级名称")
-    @ApiModelProperty("班级名称")
+    @ExcelProperty("在读班级名称")
+    @ApiModelProperty("在读班级名称")
     private String className;
 
 
-    @ExcelProperty("班主任")
-    @ApiModelProperty("班主任")
+    @ExcelProperty("在读班级班主任")
+    @ApiModelProperty("在读班级班主任")
     private String teacherName;
 
     @ApiModelProperty("学生userId")
@@ -200,4 +200,10 @@ public class BaseNewStudentPageVo {
 
     @ApiModelProperty("分班类型(1:自动分班 2:手动分班)")
     private Integer operateMode;
+
+    @ApiModelProperty("分班班级")
+    private String bandingClassName;
+
+    @ApiModelProperty("分班班主任")
+    private String bandingTeacherName;
 }

+ 8 - 71
src/main/java/com/xjrsoft/module/system/controller/MenuController.java

@@ -129,7 +129,7 @@ public class MenuController {
         MPJLambdaWrapper<Menu> wrapper = MPJWrappers.<Menu>lambdaJoin()
                 .like(StrUtil.isNotEmpty(dto.getTitle()), Menu::getTitle, dto.getTitle())
                 .like(StrUtil.isNotEmpty(dto.getName()), Menu::getName, dto.getName())
-                .like(ObjectUtil.isNotNull(dto.getSystemId()) && dto.getSystemId() > 0, Menu::getSystemId, dto.getSystemId())
+                .eq(ObjectUtil.isNotNull(dto.getSystemId()) && dto.getSystemId() > 0, Menu::getSystemId, dto.getSystemId())
                 .eq(Menu::getSystemType, dto.getSystemType())
                 .select(Menu::getId)
                 .select(Menu.class, x -> VoToColumnUtil.fieldsToColumns(MenuTreeVo.class).contains(x.getProperty()))
@@ -221,6 +221,12 @@ public class MenuController {
         menu.setAllowDelete(YesOrNoEnum.YES.getCode());
         menu.setAllowModify(YesOrNoEnum.YES.getCode());
 
+        // 设置子系统id
+        Menu pMenu = menuService.getOne(Wrappers.<Menu>query().lambda().eq(Menu::getId, menu.getParentId()));
+        if (pMenu != null) {
+            menu.setSystemId(pMenu.getSystemId());
+        }
+
         boolean isSuccess = menuService.save(menu);
 
         //按钮保存
@@ -269,76 +275,7 @@ public class MenuController {
     @Transactional(rollbackFor = Exception.class)
     @XjrLog(value = "修改菜单", saveResponseData = true)
     public R edit(@Valid @RequestBody UpdateMenuDto dto) {
-        long count = menuService.count(Wrappers.<Menu>query().lambda()
-                .ne(Menu::getId, dto.getId()).and(wrapper ->
-                        wrapper.eq(Menu::getCode, dto.getCode())
-                )
-        );
-
-        if (count > 0) {
-            return R.error("菜单编码已经存在!");
-        }
-        Menu menu = BeanUtil.toBean(dto, Menu.class);
-
-        //判断是否为菜单
-        if (menu.getMenuType() == YesOrNoEnum.NO.getCode()) {
-            //如果是菜单 需要判断 path 第一个字符 是否为 /  菜单必须要 / 开头
-            if (!menu.getPath().startsWith(StringPool.SLASH)) {
-                menu.setPath(StringPool.SLASH + menu.getPath());
-            }
-        }
-
-        //判断是否为外链
-        if (menu.getOutLink() == YesOrNoEnum.YES.getCode()) {
-            //如果是外链 所有组件地址 改为 IFrame
-            menu.setComponent("IFrame");
-        }
-
-        menuService.updateById(menu);
-
-
-        List<MenuButton> menuButtons = BeanUtil.copyToList(dto.getButtonList(), MenuButton.class);
-        menuButtons.forEach(menuButton -> menuButton.setMenuId(menu.getId()));
-        //删除原按钮
-        menuButtonService.remove(Wrappers.<MenuButton>query().lambda().eq(MenuButton::getMenuId, menu.getId()));
-
-        // 列表字段保存
-        List<MenuColumn> columnList = BeanUtil.copyToList(dto.getColumnList(), MenuColumn.class);
-        columnList.forEach(menuColumn -> menuColumn.setMenuId(menu.getId()));
-        menuColumnService.remove(Wrappers.<MenuColumn>query().lambda().eq(MenuColumn::getMenuId, menu.getId()));
-
-        // 表单字段保存
-        List<MenuForm> formList = new ArrayList<>();
-        for (UpdateMenuFormDto updateMenuFormDto : dto.getFormList()) {
-            formList.add(BeanUtil.toBean(updateMenuFormDto, MenuForm.class));
-            List<UpdateMenuFormDto> children = updateMenuFormDto.getChildren();
-            if (org.apache.commons.collections.CollectionUtils.isNotEmpty(children)) {
-                formList.addAll(BeanUtil.copyToList(children, MenuForm.class));
-            }
-        }
-        formList.forEach(menuForm -> menuForm.setMenuId(menu.getId()));
-        menuFormService.remove(Wrappers.<MenuForm>query().lambda().eq(MenuForm::getMenuId, menu.getId()));
-
-        if (dto.getMenuDeptRelations() != null) {
-            List<XjrMenuDeptRelation> menuDeptRelations = BeanUtil.copyToList(dto.getMenuDeptRelations(), XjrMenuDeptRelation.class);
-            menuDeptRelations.forEach(XjrMenuDeptRelation -> XjrMenuDeptRelation.setMenuId(menu.getId()));
-            xjrMenuDeptRelationService.remove(Wrappers.<XjrMenuDeptRelation>query().lambda().eq(XjrMenuDeptRelation::getMenuId, menu.getId()));
-
-            if (CollectionUtils.isNotEmpty(menuDeptRelations)) {
-                xjrMenuDeptRelationService.saveBatch(menuDeptRelations);
-            }
-        }
-
-        if (CollectionUtils.isNotEmpty(menuButtons)) {
-            menuButtonService.saveBatch(menuButtons);
-        }
-        if (CollectionUtils.isNotEmpty(columnList)) {
-            menuColumnService.saveBatch(columnList);
-        }
-        if (CollectionUtils.isNotEmpty(formList)) {
-            menuFormService.saveBatch(formList);
-        }
-
+        menuService.edit(dto);
         return R.ok();
     }
 

+ 7 - 1
src/main/java/com/xjrsoft/module/system/mapper/MenuMapper.java

@@ -3,6 +3,9 @@ package com.xjrsoft.module.system.mapper;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.system.entity.Menu;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -14,5 +17,8 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface MenuMapper extends MPJBaseMapper<Menu> {
-
+    /**
+     * 获取所有子级菜单
+     */
+    List<Menu> getChileAll(@Param("id") Long id);
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/system/service/IMenuService.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.system.service;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.system.dto.MenuTreeDto;
 import com.xjrsoft.module.system.dto.RoleMenuServeListDto;
+import com.xjrsoft.module.system.dto.UpdateMenuDto;
 import com.xjrsoft.module.system.entity.Menu;
 import com.xjrsoft.module.system.vo.MenuAllServeVo;
 import com.xjrsoft.module.system.vo.MenuServeVo;
@@ -32,4 +33,14 @@ public interface IMenuService extends MPJBaseService<Menu> {
     List<Menu> getUserQuick(MenuTreeDto dto);
 
     List<MenuTreeVo> selectAllist(List<String> deptIdList);
+
+    /**
+     * 获取所有子级菜单
+     */
+    List<Menu> getChileAll(Long id);
+
+    /**
+     * 修改菜单
+     */
+    void edit(UpdateMenuDto dto);
 }

+ 151 - 19
src/main/java/com/xjrsoft/module/system/service/impl/MenuServiceImpl.java

@@ -1,19 +1,19 @@
 package com.xjrsoft.module.system.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.AuthorizeType;
-import com.xjrsoft.common.enums.DeleteMark;
-import com.xjrsoft.common.enums.EnabledMark;
-import com.xjrsoft.common.enums.RoleEnum;
+import com.xjrsoft.common.enums.*;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.WhitelistManagement;
 import com.xjrsoft.module.base.service.IWhitelistManagementService;
@@ -21,16 +21,18 @@ import com.xjrsoft.module.organization.entity.UserRoleRelation;
 import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
 import com.xjrsoft.module.system.dto.MenuTreeDto;
 import com.xjrsoft.module.system.dto.RoleMenuServeListDto;
+import com.xjrsoft.module.system.dto.UpdateMenuDto;
+import com.xjrsoft.module.system.dto.UpdateMenuFormDto;
 import com.xjrsoft.module.system.entity.*;
 import com.xjrsoft.module.system.mapper.AuthorizeMapper;
 import com.xjrsoft.module.system.mapper.MenuMapper;
 import com.xjrsoft.module.system.mapper.XjrMenuDeptRelationMapper;
 import com.xjrsoft.module.system.mapper.XjrMenuQuickMapper;
-import com.xjrsoft.module.system.service.IMenuService;
-import com.xjrsoft.module.system.service.IXjrMenuGroupSetService;
+import com.xjrsoft.module.system.service.*;
 import com.xjrsoft.module.system.vo.*;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.function.Function;
@@ -59,6 +61,110 @@ public class MenuServiceImpl extends MPJBaseServiceImpl<MenuMapper, Menu> implem
     private final IXjrMenuGroupSetService xjrMenuGroupSetService;
     private final IWhitelistManagementService whitelistManagementService;
 
+    private final MenuMapper menuMapper;
+
+    private final IMenuButtonService menuButtonService;
+
+    private final IMenuColumnService menuColumnService;
+
+    private final IMenuFormService menuFormService;
+
+    private final IXjrMenuDeptRelationService xjrMenuDeptRelationService;
+
+    /**
+     * 修改菜单
+     */
+    @Transactional
+    public void edit(UpdateMenuDto dto) {
+        long count = this.count(Wrappers.<Menu>query().lambda()
+                .ne(Menu::getId, dto.getId()).and(wrapper ->
+                        wrapper.eq(Menu::getCode, dto.getCode())
+                )
+        );
+
+        if (count > 0) {
+            throw new MyException("菜单编码已经存在!");
+        }
+        Menu menu = BeanUtil.toBean(dto, Menu.class);
+
+        //判断是否为菜单
+        if (menu.getMenuType() == YesOrNoEnum.NO.getCode()) {
+            //如果是菜单 需要判断 path 第一个字符 是否为 /  菜单必须要 / 开头
+            if (!menu.getPath().startsWith(StringPool.SLASH)) {
+                menu.setPath(StringPool.SLASH + menu.getPath());
+            }
+        }
+
+        //判断是否为外链
+        if (menu.getOutLink() == YesOrNoEnum.YES.getCode()) {
+            //如果是外链 所有组件地址 改为 IFrame
+            menu.setComponent("IFrame");
+        }
+
+        // 判断是否修改了子系统
+        if (menu.getParentId() == null) {
+            Menu obj = this.getById(dto.getId());
+            if (!obj.getSystemId().equals(dto.getSystemId())) {
+                List<Menu> chileAll = menuMapper.getChileAll(dto.getId());
+                List<Long> ids = chileAll.stream().map(Menu::getId).collect(Collectors.toList());
+                this.update(new Menu() {{
+                    setSystemId(dto.getSystemId());
+                    setComponentType(dto.getComponentType());
+                }}, Wrappers.<Menu>query().lambda().in(Menu::getId, ids));
+            }
+        }
+
+        this.updateById(menu);
+
+
+        List<MenuButton> menuButtons = BeanUtil.copyToList(dto.getButtonList(), MenuButton.class);
+        menuButtons.forEach(menuButton -> menuButton.setMenuId(menu.getId()));
+        //删除原按钮
+        menuButtonService.remove(Wrappers.<MenuButton>query().lambda().eq(MenuButton::getMenuId, menu.getId()));
+
+        // 列表字段保存
+        List<MenuColumn> columnList = BeanUtil.copyToList(dto.getColumnList(), MenuColumn.class);
+        columnList.forEach(menuColumn -> menuColumn.setMenuId(menu.getId()));
+        menuColumnService.remove(Wrappers.<MenuColumn>query().lambda().eq(MenuColumn::getMenuId, menu.getId()));
+
+        // 表单字段保存
+        List<MenuForm> formList = new ArrayList<>();
+        for (UpdateMenuFormDto updateMenuFormDto : dto.getFormList()) {
+            formList.add(BeanUtil.toBean(updateMenuFormDto, MenuForm.class));
+            List<UpdateMenuFormDto> children = updateMenuFormDto.getChildren();
+            if (org.apache.commons.collections.CollectionUtils.isNotEmpty(children)) {
+                formList.addAll(BeanUtil.copyToList(children, MenuForm.class));
+            }
+        }
+        formList.forEach(menuForm -> menuForm.setMenuId(menu.getId()));
+        menuFormService.remove(Wrappers.<MenuForm>query().lambda().eq(MenuForm::getMenuId, menu.getId()));
+
+        if (dto.getMenuDeptRelations() != null) {
+            List<XjrMenuDeptRelation> menuDeptRelations = BeanUtil.copyToList(dto.getMenuDeptRelations(), XjrMenuDeptRelation.class);
+            menuDeptRelations.forEach(XjrMenuDeptRelation -> XjrMenuDeptRelation.setMenuId(menu.getId()));
+            xjrMenuDeptRelationService.remove(Wrappers.<XjrMenuDeptRelation>query().lambda().eq(XjrMenuDeptRelation::getMenuId, menu.getId()));
+
+            if (CollectionUtils.isNotEmpty(menuDeptRelations)) {
+                xjrMenuDeptRelationService.saveBatch(menuDeptRelations);
+            }
+        }
+
+        if (CollectionUtils.isNotEmpty(menuButtons)) {
+            menuButtonService.saveBatch(menuButtons);
+        }
+        if (CollectionUtils.isNotEmpty(columnList)) {
+            menuColumnService.saveBatch(columnList);
+        }
+        if (CollectionUtils.isNotEmpty(formList)) {
+            menuFormService.saveBatch(formList);
+        }
+    }
+
+    /**
+     * 获取用户角色id
+     *
+     * @return
+     */
     @Override
     public List<MenuVo> getAuthMenuList(MenuTreeDto dto) {
         List<Long> roleIds = getUserRoleIds();
@@ -215,12 +321,8 @@ public class MenuServiceImpl extends MPJBaseServiceImpl<MenuMapper, Menu> implem
                         .select(Menu::getId)
                         .select("1 as authorized")
                         .selectAs(Subsystem::getName, MenuVo::getSystemName)
-//            .selectAs(Department::getName, MenuVo::getDeptName)
-//            .selectAs(Department::getId, MenuVo::getDeptId)
                         .select(Menu.class, x -> VoToColumnUtil.fieldsToColumns(MenuTreeVo.class).contains(x.getProperty()))
                         .leftJoin(Subsystem.class, Subsystem::getId, Menu::getSystemId)
-//            .leftJoin("xjr_menu_dept_relation t2 ON t2.menu_id = t.id AND t2.delete_mark = 0")
-//            .leftJoin("xjr_department t3 ON t3.id = t2.dept_id")
                         .eq(Menu::getEnabledMark, EnabledMark.ENABLED.getCode())
                         .orderByAscStr(orderList)
         );
@@ -312,10 +414,13 @@ public class MenuServiceImpl extends MPJBaseServiceImpl<MenuMapper, Menu> implem
      * @return
      */
     private List<MenuServeVo> getSubMenu(List<MenuVo> menuVos) {
-        Map<Long, MenuServeVo> menuVoMap = new HashMap<>();
+        Map<Long, MenuServeVo> menuVoMap = new LinkedHashMap<>();
 
         List<MenuVo> childMenus = new ArrayList<>();
 
+        Map<Long, MenuVo> menuMap = menuVos.stream()
+                .collect(Collectors.toMap(MenuVo::getId, menu -> menu));
+
         menuVos.forEach((node) -> {
             Long parentId = node.getParentId();
 
@@ -332,22 +437,49 @@ public class MenuServiceImpl extends MPJBaseServiceImpl<MenuMapper, Menu> implem
 
             if (!StrUtil.isEmptyIfStr(parentId) || !StrUtil.equals(String.valueOf(parentId), String.valueOf(GlobalConstant.FIRST_NODE_VALUE))) {
                 // 给每条数据设置子系统信息
-                menuVos.stream().filter(x -> StrUtil.equals(x.getId().toString(), String.valueOf(parentId)))
-                        .findAny()
-                        .ifPresent(parentNode -> {
-                            node.setSystemId(parentNode.getSystemId());
-                            node.setSystemName(parentNode.getSystemName());
-                        });
+//                menuVos.stream().filter(x -> StrUtil.equals(x.getId().toString(), String.valueOf(parentId)))
+//                        .findAny()
+//                        .ifPresent(parentNode -> {
+//                            node.setSystemId(parentNode.getSystemId());
+//                            node.setSystemName(parentNode.getSystemName());
+//                            node.setParentSortCode(parentNode.getSortCode());
+//                        });
                 Long number = menuVos.stream().filter(x -> x.getParentId().equals(node.getId())).count();
-                if (number == 0) {
+                if (number == 0 && !Objects.equals(parentId, GlobalConstant.FIRST_NODE_VALUE)) {
+                    MenuVo parentMenu = getParentMenu(parentId, menuMap);
+                    node.setSystemId(parentMenu.getSystemId());
+                    node.setSystemName(parentMenu.getSystemName());
+                    node.setParentSortCode(parentMenu.getSortCode());
                     childMenus.add(node);
                 }
             }
         });
         menuVoMap.values().forEach((node) -> {
-            List<MenuVo> childMenu = childMenus.stream().filter(x -> x.getSystemId().equals(node.getId())).collect(Collectors.toList());
+            List<MenuVo> childMenu = childMenus.stream().
+                    filter(x -> x.getSystemId().equals(node.getId())).
+                    collect(Collectors.toList());
+            childMenu.sort(Comparator.comparingInt(MenuVo::getParentSortCode).thenComparingInt(MenuVo::getSortCode));
             node.setMenuVoList(childMenu);
         });
         return new ArrayList<>(menuVoMap.values());
     }
+
+    /**
+     * 找到顶级菜单
+     */
+    private MenuVo getParentMenu(Long parentId, Map<Long, MenuVo> menuMap) {
+        MenuVo menuVo = menuMap.get(parentId);
+        if (menuVo.getParentId().equals(GlobalConstant.FIRST_NODE_VALUE)) {
+            return menuVo;
+        }
+        return getParentMenu(menuVo.getParentId(), menuMap);
+    }
+
+    /**
+     * 获取所有子级菜单
+     */
+    @Override
+    public List<Menu> getChileAll(Long id) {
+        return menuMapper.getChileAll(id);
+    }
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/system/vo/MenuVo.java

@@ -72,6 +72,9 @@ public class MenuVo implements Serializable {
     @ApiModelProperty("排序码")
     private Integer sortCode;
 
+    @ApiModelProperty("父级排序码")
+    private Integer parentSortCode;
+
     @ApiModelProperty("排序码")
     private String remark;
 

+ 1 - 0
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookStudentClaimServiceImpl.java

@@ -247,6 +247,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
         ;
         List<HeadTeaLookClassBookCategoryDetailVo> classList = wfTextbookClaimItemMapper.selectJoinList(HeadTeaLookClassBookCategoryDetailVo.class, classMPJLambdaWrapper);
 
+        // 班级申领教材
         MPJLambdaWrapper<WfTextbookClaimItem> personalMPJLambdaWrapper = new MPJLambdaWrapper<>();
         personalMPJLambdaWrapper
                 .disableSubLogicDel()

+ 0 - 5
src/main/resources/application-dev.yml

@@ -116,11 +116,6 @@ xjrsoft:
       - /system/findUserByCode
       - /system/imgcaptcha-answer
       - /student/basestudentinfo/studentinfoByKeyWord
-      - /workflow/execute/new-launch
-      - /system/dictionary-detail
-      - /workflow/execute/start-process-info
-      - /baseGrade/list
-      - /baseSystemConfig/list
     approval-time: 300 # 审核超时时间 目前设为5分钟
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>

+ 9 - 0
src/main/resources/mapper/personnel/CarMessageApplyMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.personnel.mapper.CarMessageApplyMapper">
+    <select id="getCountByCarNumber" parameterType="java.lang.String" resultType="java.lang.Integer">
+        SELECT count(*) FROM car_message_apply WHERE delete_mark = 0 and now() between start_time and end_time and car_number = #{carNumber}
+    </select>
+</mapper>

+ 7 - 3
src/main/resources/mapper/student/BaseNewStudentMapper.xml

@@ -5,9 +5,10 @@
 <mapper namespace="com.xjrsoft.module.student.mapper.BaseNewStudentMapper">
     <select id="getPage" parameterType="com.xjrsoft.module.student.dto.BaseNewStudentPageDto" resultType="com.xjrsoft.module.student.vo.BaseNewStudentPageVo">
         SELECT t1.id,t1.graduate_school,t1.name,t1.gender,t2.name AS gender_cn,t1.credential_number,t1.height,t1.weight,
-        t1.score,t1.graduate_class,t1.source,t5.name as source_cn,t1.stduy_status,t3.name AS stduy_status_cn,t1.mobile,t7.name as first_ambition,
-        t8.name as second_ambition,t1.is_adjust,t1.status,ifnull(t11.name,t1.delete_reason) AS class_name,t12.name AS teacher_name,
-        t1.paymnystate,t1.userdef6,t1.previous,t1.province,t1.city,t1.myarea,t1.remarks,t1.is_can_banding,t1.operate_mode FROM base_new_student t1
+        t1.score,t1.graduate_class,t1.source,t5.name AS source_cn,t1.stduy_status,t3.name AS stduy_status_cn,t1.mobile,t7.name AS first_ambition,
+        t8.name AS second_ambition,t1.is_adjust,t1.status,IFNULL(t11.name,t1.delete_reason) AS class_name,t12.name AS teacher_name,
+        t1.paymnystate,t1.userdef6,t1.previous,t1.province,t1.city,t1.myarea,t1.remarks,t1.is_can_banding,t1.operate_mode,
+        t14.name AS banding_class_name,t15.name AS banding_teacher_name FROM base_new_student t1
         LEFT JOIN xjr_dictionary_detail t2 ON t1.gender = t2.code AND t2.item_id = 2023000000000000004
         LEFT JOIN xjr_dictionary_detail t3 ON t1.stduy_status = t3.code AND t3.item_id = 2023000000000000030
         LEFT JOIN xjr_dictionary_detail t5 ON t1.source = t5.code AND t5.item_id = 2023000000000000028
@@ -18,6 +19,9 @@
         LEFT JOIN base_student_school_roll t10 ON t9.id = t10.user_id AND t10.delete_mark = 0
         LEFT JOIN base_class t11 ON t10.class_id = t11.id
         LEFT JOIN xjr_user t12 ON t11.teacher_id = t12.id
+        LEFT JOIN banding_task_class_student t13 ON t1.id = t13.new_student_id AND t13.delete_mark = 0 AND t13.status = 1
+        LEFT JOIN banding_task_class t14 ON t13.banding_task_class_id = t14.id AND t14.delete_mark = 0
+        LEFT JOIN xjr_user t15 ON t14.teacher_id = t15.id
         WHERE t1.delete_mark = 0
         <if test="dto.name != null and dto.name != ''">
             and t1.name like concat('%', #{dto.name}, '%')

+ 18 - 0
src/main/resources/mapper/system/MenuMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.system.mapper.MenuMapper">
+    <select id="getChileAll" resultType="com.xjrsoft.module.system.entity.Menu">
+        WITH RECURSIVE category_tree AS (
+            -- 初始层级:查找指定父级 ID(例如 id=1)
+            SELECT id,parent_id,name,title,code,component_type,delete_mark FROM xjr_menu WHERE id = #{id}
+            UNION ALL
+            -- 递归查找子级
+            SELECT c.id,c.parent_id,c.name,c.title,c.code,c.component_type,c.delete_mark
+            FROM xjr_menu c
+            INNER JOIN category_tree ct ON c.parent_id = ct.id
+        )
+        SELECT id,parent_id,name,title,code,component_type FROM category_tree where delete_mark=0 and id != #{id};
+    </select>
+</mapper>

+ 15 - 11
src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest.java

@@ -151,9 +151,9 @@ class JianyuekbScheduleTaskTest {
     }
     public void doExecute() {
         String active = SpringUtil.getActiveProfile();
-        if(!"prod".equals(active)){
-            return;
-        }
+//        if(!"prod".equals(active)){
+//            return;
+//        }
         String sql = "SELECT * FROM course_receive_msg WHERE delete_mark = 0 AND is_callback = -1";
         List<Map<String, Object>> receiveMsgs = SqlRunnerAdapter.db().selectList(sql);
         if(receiveMsgs.isEmpty()){
@@ -212,9 +212,9 @@ class JianyuekbScheduleTaskTest {
                 LocalDate startDateObj = LocalDate.parse(startDateStr);
                 String endDateStr = receiveMsg.get("end_date").toString();
                 LocalDate endDateObj = LocalDate.parse(endDateStr);
-                if(today.isAfter(startDateObj)){
-                    startDateStr = today.format(formatter);
-                }
+//                if(today.isAfter(startDateObj)){
+//                    startDateStr = today.format(formatter);
+//                }
 
                 //删除课表信息;
                 List<BaseClass> classList = gradeClassMaps.get(eduYearSerialNo);
@@ -286,7 +286,7 @@ class JianyuekbScheduleTaskTest {
 
         Set<String> techerIds = dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap,
                 teacherMap, classMap, String.valueOf(courseReceiveMsgId), startDate, endDate);
-        sendMsg(techerIds, courseReceiveMsgId);
+        //sendMsg(techerIds, courseReceiveMsgId);
         dataUtil.insertClassTime(scheduleInfo);
     }
 
@@ -419,10 +419,14 @@ class JianyuekbScheduleTaskTest {
                 courseCount += exchangeCourseIds.length;
             }
             //查询顶课老师在本条申请的课程中的节次是否包含课
-            Integer substituteTeacherCourseCount = courseTableService.getSubstituteTeacherCourseCountByParams(new ClassTeacherDto() {{
-                setWfCourseAdjustId(courseAdjust.getId());
-                setTeacherId(Long.parseLong(courseAdjust.getExchangeTeacherId()));
-            }});
+            Integer substituteTeacherCourseCount = 0;
+            if(CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseAdjust.getAdjustType())){
+                substituteTeacherCourseCount = courseTableService.getSubstituteTeacherCourseCountByParams(new ClassTeacherDto() {{
+                    setWfCourseAdjustId(courseAdjust.getId());
+                    setTeacherId(Long.parseLong(courseAdjust.getExchangeTeacherId()));
+                }});
+            }
+
             if(courseList.size() != courseCount || substituteTeacherCourseCount > 0){
                 //表明课程变化了,需要重新申请,需要将原来的申请作废并进行微信消息通知
                 courseAdjust.setEnabledMark(EnabledMark.DISABLED.getCode());

+ 128 - 0
src/test/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNodeTest.java

@@ -0,0 +1,128 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.db.Entity;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.StudentTypeEnum;
+import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.mapper.UserMapper;
+import com.xjrsoft.module.student.dto.AddBaseStudentContactDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentFamilyDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentFamilyMemberDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentSchoolRollDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentSubsidizeDto;
+import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentManagerService;
+import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author dzx
+ * @date 2025/4/1
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = XjrSoftApplication.class)
+class WfStudentRepeatStudyNodeTest {
+
+    @Autowired
+    private IStudentManagerService studentService;
+
+    @Autowired
+    private IWorkflowExecuteService workflowExecuteService;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private IBaseStudentSchoolRollService schoolRollService;
+
+    @Test
+    void test(){
+        Long formId = 1907636186804998144L;
+
+        String tableName = "wf_student_repeat_study";
+        Entity where = Entity.create(tableName);
+        where.set("id", formId);
+        Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(tableName, where);
+        int isOriginal = Integer.parseInt(objectMap.get("is_original").toString());
+
+        String credentialNumber = objectMap.get("credential_number").toString();
+
+        User user = userMapper.selectOne(
+                new MPJLambdaWrapper<User>()
+                        .disableLogicDel()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                        .eq(User::getCredentialNumber, credentialNumber)
+        );
+
+        if(isOriginal == 0 && user == null){
+            AddBaseStudentUserDto baseStudentUser = new AddBaseStudentUserDto();
+            baseStudentUser.setName(objectMap.get("name").toString());
+            baseStudentUser.setCredentialType("ZZLS10007");
+            baseStudentUser.setCredentialNumber(objectMap.get("credential_number").toString());
+            baseStudentUser.setMobile(objectMap.get("mobile").toString());
+            baseStudentUser.setUserName(objectMap.get("credential_number").toString());
+
+            List<AddBaseStudentSchoolRollDto> baseStudentSchoolRollList = new ArrayList<>();
+            AddBaseStudentSchoolRollDto rollDto = new AddBaseStudentSchoolRollDto();
+            rollDto.setStduyStatus(objectMap.get("stduy_status").toString());
+            rollDto.setStduyStatus(ArchivesStatusEnum.FB2901.getCode());
+            rollDto.setMajorSetId(Long.parseLong(objectMap.get("major_set_id").toString()));
+            rollDto.setStudentType(StudentTypeEnum.FB2801.getCode());
+            rollDto.setClassId(Long.parseLong(objectMap.get("class_id").toString()));
+            rollDto.setGradeId(Long.parseLong(objectMap.get("grade_id").toString()));
+            baseStudentSchoolRollList.add(rollDto);
+            baseStudentUser.setBaseStudentSchoolRollList(baseStudentSchoolRollList);
+
+            List<AddBaseStudentDto> baseStudentList = new ArrayList<>();
+            AddBaseStudentDto studentDto = new AddBaseStudentDto();
+            studentDto.setIsMigrateChildren(0);
+            studentDto.setStudentId(baseStudentUser.getCredentialNumber());
+            studentDto.setIsFloatingPopulation(0);
+            baseStudentList.add(studentDto);
+            baseStudentUser.setBaseStudentList(baseStudentList);
+
+            List<AddBaseStudentContactDto> baseStudentContactList = new ArrayList<>();
+            baseStudentContactList.add(new AddBaseStudentContactDto());
+            baseStudentUser.setBaseStudentContactList(baseStudentContactList);
+
+            List<AddBaseStudentFamilyDto> baseStudentFamilyList = new ArrayList<>();
+            baseStudentFamilyList.add(new AddBaseStudentFamilyDto());
+            baseStudentUser.setBaseStudentFamilyList(baseStudentFamilyList);
+
+            List<AddBaseStudentFamilyMemberDto> baseStudentFamilyMemberList = new ArrayList<>();
+            baseStudentUser.setBaseStudentFamilyMemberList(baseStudentFamilyMemberList);
+
+            List<AddBaseStudentSubsidizeDto> baseStudentSubsidizeList = new ArrayList<>();
+            baseStudentUser.setBaseStudentSubsidizeList(baseStudentSubsidizeList);
+
+            studentService.add(baseStudentUser);
+        }else{
+            schoolRollService.activateStudent(user.getId(), null);
+            schoolRollService.updateStudentClassGradeMajorStduyStatus(
+                    Long.parseLong(objectMap.get("class_id").toString()),
+                    Long.parseLong(objectMap.get("grade_id").toString()),
+                    Long.parseLong(objectMap.get("major_set_id").toString()),
+                    objectMap.get("stduy_status").toString(),
+                    user.getId()
+            );
+        }
+    }
+}