Ver código fonte

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

大数据与最优化研究所 1 semana atrás
pai
commit
098b70d80b
42 arquivos alterados com 1128 adições e 164 exclusões
  1. 60 0
      src/main/java/com/xjrsoft/common/utils/CredentialNumberUtil.java
  2. 5 1
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java
  3. 68 129
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java
  4. 54 0
      src/main/java/com/xjrsoft/module/base/controller/BaseGradeController.java
  5. 53 0
      src/main/java/com/xjrsoft/module/base/controller/BaseMajorSetController.java
  6. 46 0
      src/main/java/com/xjrsoft/module/base/controller/BaseSystemConfigController.java
  7. 24 0
      src/main/java/com/xjrsoft/module/base/dto/BaseGradePageDto.java
  8. 21 0
      src/main/java/com/xjrsoft/module/base/dto/BaseMajorSetPageDto.java
  9. 38 0
      src/main/java/com/xjrsoft/module/base/entity/BaseSystemConfig.java
  10. 19 0
      src/main/java/com/xjrsoft/module/base/mapper/BaseSystemConfigMapper.java
  11. 16 0
      src/main/java/com/xjrsoft/module/base/service/IBaseSystemConfigService.java
  12. 20 0
      src/main/java/com/xjrsoft/module/base/service/impl/BaseSystemConfigServiceImpl.java
  13. 50 0
      src/main/java/com/xjrsoft/module/base/vo/BaseGradeVo.java
  14. 50 0
      src/main/java/com/xjrsoft/module/base/vo/BaseMajorSetVo.java
  15. 32 0
      src/main/java/com/xjrsoft/module/base/vo/BaseSystemConfigVo.java
  16. 8 0
      src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java
  17. 158 0
      src/main/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNode.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. 19 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/CarMessageApplyServiceImpl.java
  22. 3 3
      src/main/java/com/xjrsoft/module/schedule/controller/TodayScheduleController.java
  23. 2 0
      src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java
  24. 3 0
      src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java
  25. 3 0
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentSchoolRollService.java
  26. 3 1
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentService.java
  27. 13 3
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java
  28. 95 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentServiceImpl.java
  29. 0 1
      src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java
  30. 7 5
      src/main/java/com/xjrsoft/module/student/service/impl/PbVXsxxsfytbServiceImpl.java
  31. 10 4
      src/main/java/com/xjrsoft/module/student/vo/BaseNewStudentPageVo.java
  32. 11 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentSompleInfoVo.java
  33. 7 0
      src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java
  34. 2 0
      src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailListDto.java
  35. 42 0
      src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java
  36. 5 0
      src/main/resources/application-dev.yml
  37. 3 1
      src/main/resources/mapper/organization/UserMapper.xml
  38. 9 0
      src/main/resources/mapper/personnel/CarMessageApplyMapper.xml
  39. 7 3
      src/main/resources/mapper/student/BaseNewStudentMapper.xml
  40. 1 1
      src/main/resources/mapper/student/PbVXsxxsfytbMapper.xml
  41. 23 10
      src/main/resources/sqlScript/今日安排视图.sql
  42. 129 0
      src/test/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNodeTest.java

+ 60 - 0
src/main/java/com/xjrsoft/common/utils/CredentialNumberUtil.java

@@ -0,0 +1,60 @@
+package com.xjrsoft.common.utils;
+
+import com.xjrsoft.common.exception.MyException;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * 身份证号相关处理
+ * @author dzx
+ * @date 2025/4/1
+ */
+public class CredentialNumberUtil {
+
+    /**
+     * 根据身份证号获取出生日期
+     * @param idCardNumber 身份证号
+     * @return 出生日期
+     */
+    public static LocalDate getBirthDate(String idCardNumber){
+        // 获取出生日期前6位,即yyyyMM
+        String birthdayString = idCardNumber.substring(6, 14);
+
+        // 将字符串解析为LocalDate对象
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+        try {
+            LocalDate parse = LocalDate.parse(birthdayString, formatter);
+            return parse;
+        }catch (Exception e){
+            throw new MyException("身份证号填写错误,无法提取出生日期");
+        }
+    }
+
+    /**
+     * 根据身份证号判断性别
+     * @param idCard 身份证号码
+     * @return "男""女"
+     * @throws IllegalArgumentException 如果身份证号长度不正确
+     */
+    public static String getGenderByIdCard(String idCard) {
+        if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
+            throw new IllegalArgumentException("身份证号长度不正确");
+        }
+
+        // 15位身份证号:最后一位是性别位
+        // 18位身份证号:第17位是性别位
+        char genderChar;
+        if (idCard.length() == 15) {
+            genderChar = idCard.charAt(14);
+        } else {
+            genderChar = idCard.charAt(16);
+        }
+
+        // 将字符转换为数字
+        int genderNum = Character.getNumericValue(genderChar);
+
+        // 奇数男性,偶数女性
+        return genderNum % 2 == 1 ? "男" : "女";
+    }
+}

+ 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("添加报错,请联系管理员");
+            }
         }
     }
 

+ 68 - 129
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java

@@ -11,24 +11,19 @@ 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.LocalDateUtil;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
-import com.xjrsoft.module.banding.dto.BandingTaskClassStudentPageDto;
 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.entity.BaseSemester;
 import com.xjrsoft.module.base.mapper.BaseMajorSetMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
@@ -38,7 +33,6 @@ 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.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;
@@ -58,8 +52,8 @@ 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.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -123,74 +117,60 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                         .in(BandingTaskClassStudent::getNewStudentId, dto.getNewStudentIds())
         );
 
-        BandingTaskClass taskClass = taskClassMapper.selectById(dto.getBandingTaskClassId());
-
-        //新增报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
-        BaseSemester semester = semesterService.getCurrentSemester();
-        StudentReportPlan plan = reportPlanService.getOne(
-                new QueryWrapper<StudentReportPlan>().lambda()
-                        .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
-                        .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
-                        .eq(StudentReportPlan::getSemesterId, semester.getId())
-                        .eq(StudentReportPlan::getCategory, 2)
-                        .eq(StudentReportPlan::getBandingTaskId, taskClass.getBandingTaskId())
+        List<BaseNewStudent> list = newStudentService.list(
+                new QueryWrapper<BaseNewStudent>().lambda()
+                        .in(BaseNewStudent::getId, dto.getNewStudentIds())
         );
-        if(plan == null){
-            plan = new StudentReportPlan();
-            plan.setStatus(0);
-            plan.setCategory(2);
-            plan.setBandingTaskId(taskClass.getBandingTaskId());
-            plan.setDeleteMark(DeleteMark.NODELETE.getCode());
-            plan.setEnabledMark(EnabledMark.ENABLED.getCode());
-            plan.setCreateDate(new Date());
-            plan.setCreateUserId(StpUtil.getLoginIdAsLong());
-            reportPlanService.save(plan);
-        }
 
         List<BandingTaskClassStudent> dataList = new ArrayList<>();
         long createUserId = StpUtil.getLoginIdAsLong();
 
-        List<StudentReportRecord> insertList = new ArrayList<>();
-        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(dto.getIsHandle() != null && dto.getIsHandle() == 1){
+            BaseClass aClass = classService.getById(dto.getBandingTaskClassId());
+
+            BandingTaskClass taskClass = taskClassMapper.selectOne(
+                    new QueryWrapper<BandingTaskClass>().lambda()
+                            .eq(BandingTaskClass::getBaseClassId, aClass.getId())
             );
-            if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
-                StudentReportRecord record = new StudentReportRecord();
-                record.setCreateDate(new Date());
-                record.setCreateUserId(StpUtil.getLoginIdAsLong());
-                record.setUserId(newStudentId);
-                record.setStudentReportPlanId(plan.getId());
-                record.setDeleteMark(DeleteMark.NODELETE.getCode());
-                record.setEnabledMark(EnabledMark.ENABLED.getCode());
-                insertList.add(record);
+
+            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);
+                            }
+                        }}
+                );
             }
-        }
-        if(!dataList.isEmpty()){
-            this.saveBatch(dataList);
-        }
+            //新增报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
+            BaseSemester semester = semesterService.getCurrentSemester();
+            List<StudentReportPlan> planList = reportPlanService.list(
+                    new QueryWrapper<StudentReportPlan>().lambda()
+                            .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .eq(StudentReportPlan::getSemesterId, semester.getId())
+                            .in(StudentReportPlan::getCategory, Arrays.asList(2, 3))
+            );
 
-        if(!insertList.isEmpty()){
-            for (StudentReportRecord studentReportRecord : insertList) {
-                reportRecordMapper.insert(studentReportRecord);
+            for (StudentReportPlan plan : planList) {
+                for (Long newStudentId : dto.getNewStudentIds()) {
+                    StudentReportRecord record = new StudentReportRecord();
+                    record.setCreateDate(new Date());
+                    record.setCreateUserId(StpUtil.getLoginIdAsLong());
+                    record.setUserId(newStudentId);
+                    record.setStudentReportPlanId(plan.getId());
+                    record.setDeleteMark(DeleteMark.NODELETE.getCode());
+                    record.setEnabledMark(EnabledMark.ENABLED.getCode());
+                    reportRecordMapper.insert(record);
+                }
             }
-        }
 
-        List<Long> studentIds = dataList.stream().map(BandingTaskClassStudent::getNewStudentId).collect(Collectors.toList());
-        List<BaseNewStudent> list = newStudentService.list(
-                new QueryWrapper<BaseNewStudent>().lambda()
-                        .in(BaseNewStudent::getId, studentIds)
-        );
-        if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
+
             List<BaseNewStudent> updateList = new ArrayList<>();
             for (BaseNewStudent student : list) {
                 student.setStatus(1);
@@ -202,64 +182,6 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                 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,需要先查询用户信息是否已经存在
@@ -282,10 +204,9 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                     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()));
+                        schoolRollService.updateStudentClass(dto.getBandingTaskClassId(), userSet.get(student.getCredentialNumber()));
                         Integer deleteMark = userDeleteMarkMap.get(student.getCredentialNumber());
                         if(deleteMark != null && deleteMark == 1){
                             userService.recoveryStudentInfo(userSet.get(student.getCredentialNumber()));
@@ -334,12 +255,12 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
                         }
 
                         setGraduatedUniversity(student.getGraduateSchool());
-                        setClassId(classMap.get(studentClassRelation.get(student.getId())));
-                        setMajorSetId(taskClassMajorMap.get(studentClassRelation.get(student.getId())));
+                        setClassId(dto.getBandingTaskClassId());
+                        setMajorSetId(aClass.getMajorSetId());
                         setStduyStatus(student.getStduyStatus());
-                        setEnrollType(bandingTask.getEnrollType());
+                        setEnrollType(aClass.getEnrollType());
                         setStudentSource(student.getSource());
-                        setGradeId(bandingTask.getGradeId());
+                        setGradeId(aClass.getGradeId());
                         setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
                         setCreateDate(now);
                     }};
@@ -370,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;
     }

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

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.base.dto.BaseGradePageDto;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.service.IBaseGradeService;
+import com.xjrsoft.module.base.vo.BaseGradeVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @title: 年级管理
+ * @Author dzx
+ * @Date: 2025331
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/baseGrade")
+@Api(value = "/baseGrade", tags = "年级管理")
+@AllArgsConstructor
+public class BaseGradeController {
+    private final IBaseGradeService gradeService;
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value = "年级列表")
+    @SaCheckPermission("basegrade:detail")
+    @XjrLog(value = "年级列表")
+    public RT<List<BaseGradeVo>> noTokenList(@Valid BaseGradePageDto dto) {
+        List<BaseGrade> list = gradeService.list(
+                new QueryWrapper<BaseGrade>().lambda()
+                        .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseGrade::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .eq(BaseGrade::getStatus, dto.getStatus())
+                        .like(StrUtil.isNotEmpty(dto.getName()), BaseGrade::getName, dto.getName())
+                        .like(StrUtil.isNotEmpty(dto.getTitle()), BaseGrade::getTitle, dto.getTitle())
+        );
+
+        return RT.ok(BeanUtil.copyToList(list, BaseGradeVo.class));
+    }
+}

+ 53 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseMajorSetController.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.base.dto.BaseMajorSetPageDto;
+import com.xjrsoft.module.base.entity.BaseMajorSet;
+import com.xjrsoft.module.base.service.IBaseMajorSetService;
+import com.xjrsoft.module.base.vo.BaseMajorSetVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @title: 年级管理
+ * @Author dzx
+ * @Date: 2025331
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/baseMajorSet")
+@Api(value = "/baseMajorSet", tags = "专业管理")
+@AllArgsConstructor
+public class BaseMajorSetController {
+    private final IBaseMajorSetService majorSetService;
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value = "专业列表")
+    @SaCheckPermission("basemajorset:detail")
+    @XjrLog(value = "专业列表")
+    public RT<List<BaseMajorSetVo>> noTokenList(@Valid BaseMajorSetPageDto dto) {
+        List<BaseMajorSet> list = majorSetService.list(
+                new QueryWrapper<BaseMajorSet>().lambda()
+                        .eq(BaseMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseMajorSet::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .like(StrUtil.isNotEmpty(dto.getName()), BaseMajorSet::getName, dto.getName())
+                        .like(StrUtil.isNotEmpty(dto.getCode()), BaseMajorSet::getCode, dto.getCode())
+        );
+
+        return RT.ok(BeanUtil.copyToList(list, BaseMajorSetVo.class));
+    }
+}

+ 46 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseSystemConfigController.java

@@ -0,0 +1,46 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+import com.xjrsoft.module.base.service.IBaseSystemConfigService;
+import com.xjrsoft.module.base.vo.BaseSystemConfigVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @title: 年级管理
+ * @Author dzx
+ * @Date: 2025331
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("/baseSystemConfig")
+@Api(value = "/baseSystemConfig", tags = "系统参数配置")
+@AllArgsConstructor
+public class BaseSystemConfigController {
+    private final IBaseSystemConfigService systemConfigService;
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value = "获取系统配置")
+    @SaCheckPermission("baseSystemConfig:detail")
+    @XjrLog(value = "年级列表")
+    public RT<List<BaseSystemConfigVo>> noTokenList(@RequestParam String code) {
+        List<BaseSystemConfig> list = systemConfigService.list(
+                new QueryWrapper<BaseSystemConfig>().lambda()
+                        .eq(BaseSystemConfig::getCode, code)
+        );
+
+        return RT.ok(BeanUtil.copyToList(list, BaseSystemConfigVo.class));
+    }
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseGradePageDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.base.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author dzx
+ * @date 2025331
+ */
+@Data
+public class BaseGradePageDto extends PageInput {
+
+    @ApiModelProperty("年级名称")
+    private String name;
+
+    @ApiModelProperty("年份")
+    private String title;
+
+    @ApiModelProperty("在读状态(1:在读 0:毕业)")
+    private Integer status = 1;
+
+
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseMajorSetPageDto.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.base.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author dzx
+ * @date 2025331
+ */
+@Data
+public class BaseMajorSetPageDto extends PageInput {
+
+    @ApiModelProperty("专业方向名称")
+    private String name;
+
+    @ApiModelProperty("专业方向代码")
+    private String code;
+
+
+}

+ 38 - 0
src/main/java/com/xjrsoft/module/base/entity/BaseSystemConfig.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.base.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 202541
+ */
+@Data
+@TableName("base_system_config")
+@ApiModel(value = "base_system_config", description = "系统参数配置")
+public class BaseSystemConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("编号")
+    private String code;
+
+    @ApiModelProperty("值")
+    private String value;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/base/mapper/BaseSystemConfigMapper.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.base.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 202541
+ */
+@Mapper
+public interface BaseSystemConfigMapper extends MPJBaseMapper<BaseSystemConfig> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/base/service/IBaseSystemConfigService.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.base.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 202541
+ */
+public interface IBaseSystemConfigService extends IService<BaseSystemConfig> {
+
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/base/service/impl/BaseSystemConfigServiceImpl.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.base.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xjrsoft.module.base.entity.BaseSystemConfig;
+import com.xjrsoft.module.base.mapper.BaseSystemConfigMapper;
+import com.xjrsoft.module.base.service.IBaseSystemConfigService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统参数配置
+ * </p>
+ *
+ * @author dzx
+ * @since 202541
+ */
+@Service
+public class BaseSystemConfigServiceImpl extends ServiceImpl<BaseSystemConfigMapper, BaseSystemConfig> implements IBaseSystemConfigService {
+
+}

+ 50 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseGradeVo.java

@@ -0,0 +1,50 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @title: 年级
+ * @Author dzx
+ * @Date: 2025331
+ * @Version 1.0
+ */
+@Data
+public class BaseGradeVo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+
+    @ApiModelProperty("年级名称")
+    private String name;
+
+    @ApiModelProperty("年份")
+    private String title;
+
+    @ApiModelProperty("在读状态(1:在读 0:毕业)")
+    private Integer status;
+
+}

+ 50 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseMajorSetVo.java

@@ -0,0 +1,50 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @title: 年级
+ * @Author dzx
+ * @Date: 2025331
+ * @Version 1.0
+ */
+@Data
+public class BaseMajorSetVo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+
+    @ApiModelProperty("年级名称")
+    private String name;
+
+    @ApiModelProperty("年份")
+    private String title;
+
+    @ApiModelProperty("在读状态(1:在读 0:毕业)")
+    private Integer status;
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseSystemConfigVo.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @title: 系统参数配置
+ * @Author dzx
+ * @Date: 202541
+ * @Version 1.0
+ */
+@Data
+public class BaseSystemConfigVo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @ApiModelProperty("编号")
+    private String code;
+
+    @ApiModelProperty("值")
+    private String value;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 8 - 0
src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java

@@ -256,6 +256,13 @@ public class DataboardController {
                 .map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
         result.setStudentNotStayFemaleCount(studentNotStayFemaleSet.size());
 
+        List<String> jobStates = new ArrayList<>();
+        jobStates.add("JOB_DDSX");
+        jobStates.add("JOB_WCPX");
+        jobStates.add("ZZZT10009");
+        jobStates.add("ZZZT10004");
+
+
         MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
                 .disableSubLogicDel()
                 .orderByDesc(XjrUser::getId)
@@ -265,6 +272,7 @@ public class DataboardController {
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, BaseTeacher::getJobState, ext -> ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getJobState))
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, XjrUser::getCredentialType, ext -> ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getCredentialType))
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, BaseTeacher::getEmployType, ext -> ext.selectAs(DictionaryDetail::getName, XjrUserPageVo::getEmployWay))
+                .in(BaseTeacher::getJobState, jobStates)
                 .selectAsClass(BaseTeacher.class, XjrUserPageVo.class);
 
         List<XjrUserPageVo> teacherList = teacherService.selectJoinList(XjrUserPageVo.class, queryWrapper);

+ 158 - 0
src/main/java/com/xjrsoft/module/liteflow/node/WfStudentRepeatStudyNode.java

@@ -0,0 +1,158 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.db.Entity;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.StudentTypeEnum;
+import com.xjrsoft.common.enums.WorkflowApproveType;
+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.IBaseStudentService;
+import com.xjrsoft.module.student.service.IStudentManagerService;
+import com.xjrsoft.module.workflow.entity.WorkflowRecord;
+import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
+import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.apache.commons.lang.StringUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * 学生复读流程规则
+ */
+@Component("wf_student_repeat_study_node")
+public class WfStudentRepeatStudyNode extends NodeComponent {
+
+    @Autowired
+    private IStudentManagerService studentService;
+
+    @Autowired
+    private IWorkflowExecuteService workflowExecuteService;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private IBaseStudentSchoolRollService schoolRollService;
+
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params, "id");
+        Long formId = Convert.toLong(value);
+        Object processInstanceId = params.get("processInstanceId");
+        if (processInstanceId == null) {
+            return;
+        }
+        String processInstanceIdStr = Convert.toStr(processInstanceId);
+        if (formId != null && StringUtils.isNotEmpty(processInstanceIdStr)) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    CompletableFuture.runAsync(() -> {
+                        Optional<HistoricProcessInstance> historicProcessInstanceOptional = workflowExecuteService.getHistoricProcessInstance(processInstanceId.toString());
+
+                        if (historicProcessInstanceOptional.isEmpty()) {
+                            return;
+                        }
+                        HistoricProcessInstance historicProcessInstance = historicProcessInstanceOptional.get();
+                        if (!historicProcessInstance.getState().equals(HistoricProcessInstance.STATE_ACTIVE)) {
+                            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<>();
+                                baseStudentFamilyMemberList.add(new AddBaseStudentFamilyMemberDto());
+                                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()
+                                );
+                            }
+                        }
+                    });
+                }
+            });
+        }
+    }
+}

+ 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);
+
+
 }

+ 19 - 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,17 @@ public class CarMessageApplyServiceImpl extends MPJBaseServiceImpl<CarMessageApp
 //        }
         return true;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(AddCarMessageApplyDto dto) {
+        Integer countByCarNumber = this.baseMapper.getCountByCarNumber(dto.getCarNumber());
+        if(countByCarNumber > 0){
+            throw new MyException("已存在该车牌号");
+        }
+        CarMessageApply carMessageApply = BeanUtil.toBean(dto, CarMessageApply.class);
+        this.save(carMessageApply);
+        return true;
+    }
+
 }

+ 3 - 3
src/main/java/com/xjrsoft/module/schedule/controller/TodayScheduleController.java

@@ -50,7 +50,7 @@ public class TodayScheduleController {
         Map<Long, LocalDateTime> startTimeMap = list.stream().collect(Collectors.toMap(TodayScheduleVo::getId, x -> LocalDateTime.parse(x.getStartTime(), formatter)));
         Map<Long, LocalDateTime> endTimeMap = list.stream().collect(Collectors.toMap(TodayScheduleVo::getId, x -> LocalDateTime.parse(x.getEndTime(), formatter)));
         for (TodayScheduleVo todayScheduleVo : list) {
-            String title = null;
+            String adjustType = null;
             LocalDateTime startDateTime = LocalDateTime.parse(todayScheduleVo.getStartTime(), formatter);
             LocalDateTime endDateTime = LocalDateTime.parse(todayScheduleVo.getEndTime(), formatter);
             for (Long id : startTimeMap.keySet()) {
@@ -60,10 +60,10 @@ public class TodayScheduleController {
                 LocalDateTime startTime = startTimeMap.get(id);
                 LocalDateTime endTime = endTimeMap.get(id);
                 if(LocalDateTimeUtil.isDateTimeInRange(startDateTime, startTime, endTime) || LocalDateTimeUtil.isDateTimeInRange(endDateTime, startTime, endTime)){
-                    title = "冲突";
+                    adjustType = "冲突";
                 }
             }
-            todayScheduleVo.setTitle(title);
+            todayScheduleVo.setAdjustType(adjustType);
         }
 
         return RT.ok(list);

+ 2 - 0
src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java

@@ -733,6 +733,8 @@ public class DataUtil {
             entity.set("jianyue_id", asJsonObject.get("id").getAsString());
             entity.set("key_info", keyInfo);
             entity.set("course_receive_msg_id", courseReceiveMsgId);
+            entity.set("start_time", asJsonObject.get("startTime").getAsString());
+            entity.set("end_time", asJsonObject.get("endTime").getAsString());
             entityList.add(entity);
         }
         if (!entityList.isEmpty()) {

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

@@ -53,6 +53,9 @@ 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}")
+    Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId);
+
 
     String getClassNameByUserId(@Param("userId") Long userId);
 

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

@@ -50,6 +50,8 @@ public interface IBaseStudentSchoolRollService extends MPJBaseService<BaseStuden
     Boolean updateStudentClass(Long classId, Long userId);
 
     Boolean updateStudentClass(Long classId, Long majorSetId, Long userId);
+    Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId);
+
 
     List<BaseStudentSompleInfoVo> getInfosByParam(BaseStudentSimpleInfoDto dto);
 
@@ -58,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);
 

+ 3 - 1
src/main/java/com/xjrsoft/module/student/service/IBaseStudentService.java

@@ -9,7 +9,7 @@ import com.xjrsoft.module.student.vo.StudentPersonalInfoVo;
 import java.util.List;
 
 /**
- * @title: 奖学金申请
+ * @title: 学生基本信息
  * @Author dzx
  * @Date: 2023-11-23
  * @Version 1.0
@@ -21,4 +21,6 @@ public interface IBaseStudentService extends MPJBaseService<BaseStudent> {
     List<BaseStudentUserPageVo> getStudentList(BaseStudentUserPageDto dto);
 
     void changeIsNormal(String archivesStatus, Integer isNormal);
+
+    Boolean createStudent(String name, String credentialNumber, String mobile, String stduyStatus, Long classId, Long majorId);
 }

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

@@ -242,6 +242,11 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
         return baseStudentSchoolRollMapper.updateStudentClass1(classId, majorSetId, userId);
     }
 
+    @Override
+    public Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId) {
+        return this.baseMapper.updateStudentClassGradeMajorStduyStatus(classId, gradeId, majorSetId, stduyStatus, userId);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateStudentClass(Long classId, Long userId) {
@@ -270,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);
 
@@ -289,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);
 
@@ -299,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);
 

+ 95 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentServiceImpl.java

@@ -1,17 +1,32 @@
 package com.xjrsoft.module.student.service.impl;
 
+import cn.dev33.satoken.secure.BCrypt;
+import cn.dev33.satoken.stp.StpUtil;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+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.utils.VoToColumnUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.common.utils.CredentialNumberUtil;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.mapper.UserMapper;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
 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.service.IBaseStudentService;
 import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
 import com.xjrsoft.module.student.vo.StudentPersonalInfoVo;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -24,6 +39,9 @@ import java.util.List;
 @AllArgsConstructor
 public class BaseStudentServiceImpl extends MPJBaseServiceImpl<BaseStudentMapper, BaseStudent> implements IBaseStudentService {
     private final BaseStudentMapper studentMapper;
+    private final UserMapper userMapper;
+    private final BaseStudentSchoolRollMapper schoolRollMapper;
+    private final CommonPropertiesConfig propertiesConfig;
 
     @Override
     public StudentPersonalInfoVo getPersonalInfo(Long userId) {
@@ -47,4 +65,81 @@ public class BaseStudentServiceImpl extends MPJBaseServiceImpl<BaseStudentMapper
             baseMapper.updateById(baseTeacher);
         }
     }
+
+    /**
+     * 创建学生
+     * @param name 姓名
+     * @param credentialNumber 身份证号
+     * @param mobile 手机号
+     * @param stduyStatus 就读方式
+     * @param classId 班级id
+     * @param majorId 专业方向id
+     */
+    @Override
+    @Transactional
+    public Boolean createStudent(String name, String credentialNumber, String mobile, String stduyStatus, Long classId, Long majorId) {
+        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)
+        );
+        LocalDate birthDate = CredentialNumberUtil.getBirthDate(credentialNumber);
+        if(user != null){
+            user.setDeleteMark(DeleteMark.NODELETE.getCode());
+            user.setEnabledMark(EnabledMark.ENABLED.getCode());
+            user.setName(name);
+            user.setBirthDate(birthDate.atStartOfDay());
+            user.setMobile(mobile);
+            userMapper.updateById(user);
+
+            BaseStudent student = this.getOne(
+                    new MPJLambdaWrapper<BaseStudent>()
+                            .disableLogicDel()
+                            .select(BaseStudent::getId)
+                            .select(BaseStudent.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudent.class).contains(x.getProperty()))
+                            .eq(BaseStudent::getUserId, user.getId())
+            );
+            student.setDeleteMark(DeleteMark.NODELETE.getCode());
+            student.setEnabledMark(EnabledMark.ENABLED.getCode());
+            student.setIsNormal(1);
+            this.updateById(student);
+
+            BaseStudentSchoolRoll schoolRoll = schoolRollMapper.selectOne(
+                    new MPJLambdaWrapper<BaseStudentSchoolRoll>()
+                            .disableLogicDel()
+                            .select(BaseStudentSchoolRoll::getId)
+                            .select(BaseStudentSchoolRoll.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentSchoolRoll.class).contains(x.getProperty()))
+                            .eq(BaseStudentSchoolRoll::getUserId, user.getId())
+            );
+            schoolRoll.setDeleteMark(DeleteMark.NODELETE.getCode());
+            schoolRoll.setEnabledMark(EnabledMark.ENABLED.getCode());
+            schoolRoll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+            schoolRoll.setStduyStatus(stduyStatus);
+            schoolRoll.setClassId(classId);
+            schoolRoll.setMajorSetId(majorId);
+            schoolRoll.setModifyUserId(StpUtil.getLoginIdAsLong());
+            schoolRoll.setModifyDate(LocalDateTime.now());
+            schoolRollMapper.updateById(schoolRoll);
+        }else{
+            String gender = CredentialNumberUtil.getGenderByIdCard(credentialNumber);
+
+            user = new User() {{
+                setName(name);
+                setCreateDate(LocalDateTime.now());
+                setDeleteMark(DeleteMark.NODELETE.getCode());
+                setEnabledMark(EnabledMark.ENABLED.getCode());
+                setBirthDate(birthDate.atStartOfDay());
+                setMobile(mobile);
+                setCredentialNumber(credentialNumber);
+                setCredentialType("ZZLS10007");
+                setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+                setGender(GenderDictionaryEnum.getCode(gender));
+                setIsChangePassword(1);
+            }};
+            userMapper.insert(user);
+        }
+        return true;
+    }
 }

+ 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;
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentSompleInfoVo.java

@@ -67,4 +67,15 @@ public class BaseStudentSompleInfoVo {
     @ContentStyle(dataFormat = 49)
     @ApiModelProperty("教师名称")
     private String classroomName;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("学籍状态")
+    private String archivesStatus;
+
+    @ApiModelProperty("年级id")
+    private Long gradeId;
+
+    @ContentStyle(dataFormat = 49)
+    @ApiModelProperty("年级名称")
+    private String gradeName;
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java

@@ -64,6 +64,13 @@ public class DictionarydetailController {
             }
         }
 
+        if (StrUtil.isNotEmpty(dto.getItemCode())) {
+            DictionaryItem dictionaryItem = dictionaryitemService.getOne(Wrappers.lambdaQuery(DictionaryItem.class).eq(DictionaryItem::getCode, dto.getItemCode()));
+            if (dictionaryItem != null) {
+                queryWrapper.eq(DictionaryDetail::getItemId, dictionaryItem.getId());
+            }
+        }
+
         queryWrapper.eq(ObjectUtil.isNotEmpty(dto.getItemId()) && dto.getItemId() != 0, DictionaryDetail::getItemId, dto.getItemId());
         queryWrapper.select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetailListVo.class).contains(x.getProperty()));
         queryWrapper.orderByAsc(DictionaryDetail::getSortCode);

+ 2 - 0
src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailListDto.java

@@ -19,4 +19,6 @@ public class DictionaryDetailListDto {
     private Long itemId;
 
     private String pCode;
+
+    private String itemCode;
 }

+ 42 - 0
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -13,6 +13,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.db.Session;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
+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.metadata.IPage;
@@ -33,8 +34,10 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.LocalDateTimeUtil;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.common.utils.WeChatUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.form.dto.FormExecuteWorkflowAddDto;
 import com.xjrsoft.module.form.dto.FormExecuteWorkflowUpdateDto;
@@ -5492,6 +5495,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 //            addProcessRecord(task, schemaId, message);
         } else {
             List<WorkflowCirculated> newList = new ArrayList<>();
+
             for (Long userId : appendUserTaskCirculated) {
                 WorkflowCirculated workflowCirculated = BeanUtil.toBean(circulatedList.get(0), WorkflowCirculated.class);
                 workflowCirculated.setCirculatedUserId(userId);
@@ -5511,6 +5515,44 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 circulateMessage = "【" + user.getName() + "】添加了传阅人【" + circulatedName + "】,当前传阅人【" + addCirculatedName + "】";
             }
         }
+        if(!appendUserTaskCirculated.isEmpty()){
+            WeChatUtil weChatUtil = SpringUtil.getBean(WeChatUtil.class);
+            CommonPropertiesConfig cpConfig = SpringUtil.getBean(CommonPropertiesConfig.class);
+            Map<Long, User> userMap = userService.listByIds(appendUserTaskCirculated).stream().filter(x -> StrUtil.isNotEmpty(x.getOpenId())).collect(Collectors.toMap(User::getId, x -> x));
+            for (Long userId : appendUserTaskCirculated) {
+                if(!userMap.containsKey(userId)){
+                    continue;
+                }
+
+                User appendUser = userMap.get(userId);
+                JSONObject data = new JSONObject();
+                // 任务名称
+                data.put("thing8", new JSONObject() {{
+                    put("value", "传阅消息");
+                }});
+                // 事项名称
+                data.put("thing2", new JSONObject() {{
+                    put("value", workflowSchemaConfig.getProcessConfig().getName());
+                }});
+                // 申请人
+                data.put("thing6", new JSONObject() {{
+                    put("value", appendUser.getName());
+                }});
+                // 时间
+                data.put("time3", new JSONObject() {{
+                    put("value", LocalDateTimeUtil.format(LocalDateTime.now(), LocalDateTimeUtil.LOCAL_DATE_TIME_FORMAT));
+                }});
+
+                JSONObject object = new JSONObject();
+                object.put("touser", appendUser.getOpenId());
+                object.put("template_id", "sHsmz7LRj7HLd7GSTS3r2jCLvK-4Wp19iGzEvYK8n_I");
+                object.put("url", StrUtil.format("{}/xjrsoft/pages/workflow/approval?taskId={}&processId={}&type=todo", cpConfig.getDomainApp(), task.getId(), task.getProcessInstanceId()));
+                object.put("client_msg_id", task.getId());
+                object.put("data", data);
+                weChatUtil.sendTemplateMessage(object);
+            }
+        }
+
         return circulateMessage;
     }
 

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

@@ -116,6 +116,11 @@ 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.<发件人邮箱后缀>

+ 3 - 1
src/main/resources/mapper/organization/UserMapper.xml

@@ -28,13 +28,15 @@
         SELECT t1.id, t1.name as student_name, t1.enabled_mark, t1.credential_number, t4.name AS class_name,t1.mobile,
         (SELECT name FROM base_student_family_member WHERE delete_mark = 0 AND user_id = t1.id ORDER BY create_date ASC LIMIT 0,1) as parent_name,
         (SELECT mobile FROM base_student_family_member WHERE delete_mark = 0 AND user_id = t1.id ORDER BY create_date ASC LIMIT 0,1) as parent_mobile,
-        t1.gender,t4.id as class_id, t4.teacher_id,t6.name as teacher_name,t6.user_name as teacher_user_name,t6.mobile as teacher_mobile,t5.name as classroom_name
+        t1.gender,t4.id as class_id, t4.teacher_id,t6.name as teacher_name,t6.user_name as teacher_user_name,t6.mobile as teacher_mobile,t5.name as classroom_name,
+        t3.archives_status,t7.id as grade_id,t7.name as grade_name
         FROM xjr_user t1
         INNER JOIN base_student t2 ON t1.id = t2.user_id
         INNER JOIN base_student_school_roll t3 ON t1.id = t3.user_id
         INNER JOIN base_class t4 ON t4.id = t3.class_id
         left join base_classroom t5 on t4.classroom_id = t5.id
         left join xjr_user t6 on t4.teacher_id = t6.id
+        left join base_grade t7 on t4.grade_id = t7.id
         WHERE t1.delete_mark = 0
         <if test="dto.keyword != null and dto.keyword != ''">
             AND (t1.name like concat('%', #{dto.keyword}, '%') OR t1.credential_number like concat('%', #{dto.keyword}, '%'))

+ 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.LaborManagementMapper">
+    <select id="getCountByCarNumber" 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}, '%')

+ 1 - 1
src/main/resources/mapper/student/PbVXsxxsfytbMapper.xml

@@ -24,7 +24,7 @@
         AND beltcode = #{dto.beltcode} and feeitemcode in (103042766003001, 999010604, 999010603)
     </select>
     <select id="getSpecnameCount" parameterType="com.xjrsoft.module.student.dto.EnrollmentStatisticsInfoDto" resultType="com.xjrsoft.module.student.vo.PbVXsxxsfytbSpecnameCountVo">
-        SELECT specname,COUNT(DISTINCT(Studentcode)) as student_count FROM pb_v_xsxxsfytb WHERE jfzt = '已缴费' AND enteryear = #{dto.year} GROUP BY specname
+        SELECT specname,COUNT(DISTINCT(personalid)) AS student_count FROM pb_cse_feeobjupdate WHERE paymnystate = '已缴费' AND enteryear = #{dto.year} GROUP BY specname
     </select>
     <select id="getStudentFeeInfo" parameterType="com.xjrsoft.module.student.dto.BaseStudentInfoDetailDto" resultType="com.xjrsoft.module.student.vo.PbVXsxxsfytbFeeitemVo">
         SELECT replace(IFNULL((SELECT jfzt FROM pb_v_xsxxsfytb WHERE Studentcode = #{dto.credentialNumber} AND feeitemcode LIKE '999010604%' AND beltcode = #{dto.beltcode}),'欠费'),'未缴费','欠费') AS jxf,

+ 23 - 10
src/main/resources/sqlScript/今日安排视图.sql

@@ -2,24 +2,37 @@
 -- id,开始时间,结束时间,右上角的类别,中间竖线左边内容,中间竖线右边地点,底部类别,名称,参与人id
 DROP VIEW IF EXISTS today_schedule;
 CREATE VIEW today_schedule AS
-SELECT t1.id,CONCAT(t1.schedule_date, ' ', t1.start_time) AS start_time,CONCAT(t1.schedule_date, ' ', t1.end_time) AS end_time,t1.adjust_type,t1.class_name AS title,t2.name AS place,t1.course_name AS schedule_name,'课程' AS category,t1.teacher_id AS user_id FROM course_table t1
-INNER JOIN base_classroom t2 ON t1.site_id = t2.id
-WHERE t1.schedule_date = DATE_FORMAT(NOW(), '%Y-%m-%d')
+SELECT t1.id,t1.start_date AS start_time,t1.end_date AS end_time,t1.type AS adjust_type,
+REPLACE(REPLACE(t1.category,1,'校企合作活动'),2,'赛事活动') AS title,t1.place,
+t1.name AS schedule_name,category,t2.user_id FROM activity_info t1
+INNER JOIN activity_enroll t2 ON t2.activity_info_id = t1.id
+WHERE DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(t1.start_date, '%Y-%m-%d') AND DATE_FORMAT(t1.end_date, '%Y-%m-%d')
 UNION ALL
-SELECT t1.id,CONCAT(t1.event_start_time, ' 00:00:00'),CONCAT(t1.event_end_time, ' 23:59:59'),NULL,t1.event_type,t1.event_address,t1.moral_event_name,'活动' AS category,t1.attend_teacher FROM moral_event t1
+SELECT t1.id,CONCAT(t1.event_start_time, ' 00:00:00'),CONCAT(t1.event_end_time, ' 23:59:59'),NULL,
+'思政德育活动',t1.event_address,t1.moral_event_name,4,t1.attend_teacher FROM moral_event t1
 WHERE DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(t1.event_start_time, '%Y-%m-%d') AND DATE_FORMAT(t1.event_end_time, '%Y-%m-%d')
 UNION ALL
-SELECT t1.id,CONCAT(t1.event_start_time, ' 00:00:00'),CONCAT(t1.event_end_time, ' 23:59:59'),NULL,t1.event_type,t1.event_address,t1.party_tissue_name,'活动' AS category,t1.participant_teacher_name FROM party_build_event t1
+
+SELECT t1.id,t1.start_time,t1.end_time,NULL,
+'教研培训',t1.training_address,t1.training_name,5,t2.participant_id FROM wf_teacher_training t1
+INNER JOIN wf_teacher_training_participant t2 ON t1.id = t2.wf_teacher_training_id
+WHERE DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(t1.start_time, '%Y-%m-%d') AND DATE_FORMAT(t1.end_time, '%Y-%m-%d')
+UNION ALL
+
+SELECT t1.id,CONCAT(t1.event_start_time, ' 00:00:00'),CONCAT(t1.event_end_time, ' 23:59:59'),NULL,
+t1.event_type,t1.event_address,t1.party_tissue_name,6,t1.participant_teacher_name FROM party_build_event t1
 WHERE DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(t1.event_start_time, '%Y-%m-%d') AND DATE_FORMAT(t1.event_end_time, '%Y-%m-%d')
 UNION ALL
-SELECT t1.id,t1.start_time,t1.end_time,NULL,t1.activity_type,t1.activity_location,t1.club_activities_name,'活动' AS category,t1.user_id FROM club_activities t1
+SELECT t1.id,t1.start_time,t1.end_time,NULL,t1.activity_type,t1.activity_location,t1.club_activities_name,3 AS category,t1.user_id FROM club_activities t1
 WHERE DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(t1.start_time, '%Y-%m-%d') AND DATE_FORMAT(t1.end_time, '%Y-%m-%d')
 UNION ALL
-SELECT t1.id,t1.start_date,t1.end_date,t1.type,REPLACE(REPLACE(t1.category,1,'校企合作活动'),2,'赛事活动'),t1.place,t1.name,'活动' AS category,t2.user_id FROM activity_info t1
-INNER JOIN activity_enroll t2 ON t2.activity_info_id = t1.id
-WHERE DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN DATE_FORMAT(t1.start_date, '%Y-%m-%d') AND DATE_FORMAT(t1.end_date, '%Y-%m-%d')
+SELECT t1.id,CONCAT(t1.schedule_date, ' ', t1.start_time),CONCAT(t1.schedule_date, ' ', t1.end_time),
+t1.adjust_type,t1.class_name,t2.name AS place,t1.course_name,7,t1.teacher_id AS user_id FROM course_table t1
+INNER JOIN base_classroom t2 ON t1.site_id = t2.id
+WHERE t1.schedule_date = DATE_FORMAT(NOW(), '%Y-%m-%d')
 UNION ALL
-SELECT t1.id,CONCAT(t1.meeting_apply_date, t1.meeting_apply_s),CONCAT(t1.meeting_apply_date,t1.meeting_apply_e),'会议',CONCAT(t4.name,t3.name) AS place,'会议',t1.meeting_apply_theme,'会议' AS category,t2.user_id FROM wf_meeting_apply t1
+SELECT t1.id,CONCAT(t1.meeting_apply_date, t1.meeting_apply_s),CONCAT(t1.meeting_apply_date,t1.meeting_apply_e),'会议',
+CONCAT(t4.name,t3.name) AS place,'会议',t1.meeting_apply_theme,8,t2.user_id FROM wf_meeting_apply t1
 INNER JOIN meeting_conferee t2 ON t2.wf_meeting_apply_id = t1.id
 LEFT JOIN meeting_room t3 ON t1.meeting_room_id = t3.id
 LEFT JOIN base_office_build t4 ON t3.office_build_id = t4.id

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

@@ -0,0 +1,129 @@
+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 = 1906987877859340288L;
+
+        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<>();
+            baseStudentFamilyMemberList.add(new AddBaseStudentFamilyMemberDto());
+            baseStudentUser.setBaseStudentFamilyMemberList(baseStudentFamilyMemberList);
+
+            List<AddBaseStudentSubsidizeDto> baseStudentSubsidizeList = new ArrayList<>();
+            baseStudentUser.setBaseStudentSubsidizeList(baseStudentSubsidizeList);
+
+            studentService.add(baseStudentUser);
+        }else{
+            schoolRollService.activateStudent(user.getId());
+            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()
+            );
+        }
+    }
+}