Переглянути джерело

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

大数据与最优化研究所 9 місяців тому
батько
коміт
4124d2e47d

+ 13 - 0
src/main/java/com/xjrsoft/common/utils/LocalDateTimeUtil.java

@@ -134,4 +134,17 @@ public final class LocalDateTimeUtil {
         String[] array = timeStr.split(StringPool.COLON);
         return LocalTime.of(Integer.parseInt(array[0]), Integer.parseInt(array[1]), Integer.parseInt(array[2]));
     }
+
+
+    /**
+     * 检查是否targetDateTime是否在时间段内(包含开始时间和结束时间)
+     * @param targetDateTime 需要检查的时间
+     * @param startDateTime 时间段开始时间
+     * @param endDateTime 时间段结束时间
+     * @return true:包含在该时间段内,false:不包含在该时间段内
+     */
+    public static boolean isDateTimeInRange(LocalDateTime targetDateTime, LocalDateTime startDateTime, LocalDateTime endDateTime) {
+        // 检查目标日期是否在开始日期和结束日期之间(包含边界)
+        return !targetDateTime.isBefore(startDateTime) && !targetDateTime.isAfter(endDateTime);
+    }
 }

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

@@ -0,0 +1,22 @@
+package com.xjrsoft.common.utils;
+
+import java.time.LocalDate;
+
+/**
+ * @author dzx
+ * @date 2025/2/11
+ */
+public class LocalDateUtil {
+
+    /**
+     * 检查是否targetDate是否在时间段内(包含开始日期和结束日期)
+     * @param targetDate 需要检查的日期
+     * @param startDate 时间段开始日期
+     * @param endDate 时间段结束日期
+     * @return true:包含在该时间段内,false:不包含在该时间段内
+     */
+    public static boolean isDateInRange(LocalDate targetDate, LocalDate startDate, LocalDate endDate) {
+        // 检查目标日期是否在开始日期和结束日期之间(包含边界)
+        return !targetDate.isBefore(startDate) && !targetDate.isAfter(endDate);
+    }
+}

+ 7 - 10
src/main/java/com/xjrsoft/module/job/StudentReportPlanTask.java

@@ -3,10 +3,13 @@ package com.xjrsoft.module.job;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.module.student.entity.StudentReportPlan;
+import com.xjrsoft.module.student.entity.StudentReportPlanClassRelation;
 import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.service.IStudentReportPlanService;
 import lombok.extern.slf4j.Slf4j;
+import org.hamcrest.core.Is;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -27,7 +30,7 @@ public class StudentReportPlanTask {
     private IStudentReportPlanService planService;
 
 
-    @Scheduled(cron = "0 */15 * * * ?")
+    @Scheduled(cron = "0 */5 * * * ?")
     public void execute() {
         doExecute();
     }
@@ -35,17 +38,11 @@ public class StudentReportPlanTask {
     public void doExecute(){
         //查询已发布未开始的,自动开始
         LocalDateTime now = LocalDateTime.now();
-        List<StudentReportPlan> list = planService.list(
-                new QueryWrapper<StudentReportPlan>().lambda()
-                        .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
-                        .eq(StudentReportPlan::getStatus, 1)
-                        .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
-                        .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
-                        .le(StudentReportPlan::getStartTime, now)
-                        .ge(StudentReportPlan::getEndTime, now)
-        );
+        List<StudentReportPlan> list = planService.getWillBeginData();
 
         for (StudentReportPlan studentReportPlan : list) {
+            List<StudentReportPlanClassRelation> classRelationList = planService.getStudentReportPlanClassRelationList(studentReportPlan.getId());
+            studentReportPlan.setStudentReportPlanClassRelationList(classRelationList);
             planService.release(studentReportPlan);
         }
 

+ 123 - 0
src/main/java/com/xjrsoft/module/liteflow/node/StudentResumeSchoolingNode.java

@@ -0,0 +1,123 @@
+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.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.StudentChangeTypeEnum;
+import com.xjrsoft.common.enums.WorkflowApproveType;
+import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
+import com.xjrsoft.module.workflow.entity.WorkflowRecord;
+import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
+import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
+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.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * 学生复学
+ */
+@Component("student_resume_schooling_node")
+public class StudentResumeSchoolingNode extends NodeComponent {
+    @Autowired
+    private IBaseStudentSchoolRollService studentSchoolRollService;
+
+    @Autowired
+    private IWorkflowExecuteService workflowExecuteService;
+
+    @Autowired
+    private WorkflowRecordMapper workflowRecordMapper;
+
+    @Autowired
+    private IStudentChangeRecordService changeRecordService;
+
+
+    @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)) {
+                            // 获取流程记录中的非正常结束
+                            LambdaQueryWrapper<WorkflowRecord> workflowRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                            workflowRecordLambdaQueryWrapper
+                                    .and(wq -> wq.eq(WorkflowRecord::getWorkflowApproveType, WorkflowApproveType.DISAGREE.getCode())
+                                            .or()
+                                            .eq(WorkflowRecord::getWorkflowApproveType, WorkflowApproveType.WITHDRAW.getCode())
+                                    )
+                                    .eq(WorkflowRecord::getProcessId, processInstanceId)
+                            ;
+                            List<WorkflowRecord> workflowRecordList = workflowRecordMapper.selectList(workflowRecordLambdaQueryWrapper);
+
+                            if (!workflowRecordList.isEmpty()) {
+                                return;
+                            }
+                        }
+
+                        //查询出数据
+                        String tableName = "wf_student_resume_schooling";
+                        Entity where = Entity.create(tableName);
+                        where.set("id", formId);
+                        Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(tableName, where);
+                        long studentUserId = Long.parseLong(objectMap.get("user_id").toString());
+                        //跟新学籍信息
+                        BaseStudentSchoolRoll schoolRoll = studentSchoolRollService.getOne(
+                                new QueryWrapper<BaseStudentSchoolRoll>().lambda()
+                                        .eq(BaseStudentSchoolRoll::getClassId, Long.parseLong(objectMap.get("class_id").toString()))
+                                        .eq(BaseStudentSchoolRoll::getUserId, studentUserId)
+                                        .eq(BaseStudentSchoolRoll::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        );
+
+                        //记录异动
+                        changeRecordService.insertData(
+                                schoolRoll.getArchivesStatus(),
+                                ArchivesStatusEnum.fromCode(schoolRoll.getArchivesStatus()),
+                                ArchivesStatusEnum.FB2904.getCode(),
+                                ArchivesStatusEnum.FB2904.getValue(),
+                                studentUserId,
+                                Long.parseLong(objectMap.get("create_user_id").toString()),
+                                StudentChangeTypeEnum.ArchivesStatus.getCode(),
+                                2
+                        );
+
+
+
+                        schoolRoll.setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
+                        studentSchoolRollService.updateById(schoolRoll);
+                    });
+                }
+            });
+        }
+    }
+}

+ 5 - 1
src/main/java/com/xjrsoft/module/student/controller/StudentReportRecordController.java

@@ -382,7 +382,7 @@ public class StudentReportRecordController {
     @SaCheckPermission("studentreportrecord:detail")
     public RT<PageOutput<StudentReportRecordPlanPageVo>> planPage(@Valid StudentReportRecordPageDto dto){
         List<String> roleList = StpUtil.getRoleList();
-        if(roleList.size() == 2 && roleList.contains(RoleCodeEnum.TEACHER.getCode()) && roleList.contains(RoleCodeEnum.CLASSTE.getCode())){
+        if(roleList.contains(RoleCodeEnum.TEACHER.getCode()) && roleList.contains(RoleCodeEnum.CLASSTE.getCode())){
             Long classId = classService.getIdByTeacherId(StpUtil.getLoginIdAsLong());
             if(ObjectUtil.isNull(classId) && dto.getClassId() == null){
                 return RT.ok(new PageOutput<>());
@@ -466,6 +466,10 @@ public class StudentReportRecordController {
             if(pageVo.getReportTime() != null){
                 excelVo.setReportTime(sdf.format(pageVo.getReportTime()));
             }
+            excelVo.setIsReport("否");
+            if(pageVo.getIsReport() != null && pageVo.getIsReport() == 1){
+                excelVo.setIsReport("是");
+            }
 
             dataList.add(excelVo);
         }

+ 3 - 2
src/main/java/com/xjrsoft/module/student/entity/StudentReportPlan.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
@@ -96,12 +97,12 @@ public class StudentReportPlan implements Serializable {
     * 数据修改开始时间
     */
     @ApiModelProperty("数据修改开始时间")
-    private Date updateStartTime;
+    private LocalDate updateStartTime;
     /**
     * 数据修改结束时间
     */
     @ApiModelProperty("数据修改结束时间")
-    private Date updateEndTime;
+    private LocalDate updateEndTime;
     /**
     * 状态(0:草稿 1:进行中 2:已结束)
     */

+ 2 - 0
src/main/java/com/xjrsoft/module/student/mapper/StudentReportPlanMapper.java

@@ -24,4 +24,6 @@ public interface StudentReportPlanMapper extends MPJBaseMapper<StudentReportPlan
 
 
     List<BaseClass> validateClass(@Param("id") Long id, @Param("semesterId") Long semesterId, @Param("classIds") List<Long> classIds);
+
+    List<StudentReportPlan> getWillBeginData();
 }

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

@@ -5,6 +5,7 @@ import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.student.dto.StudentReportPlanPageDto;
 import com.xjrsoft.module.student.entity.StudentReportPlan;
+import com.xjrsoft.module.student.entity.StudentReportPlanClassRelation;
 import com.xjrsoft.module.student.vo.StudentReportPlanPageVo;
 
 import java.util.List;
@@ -48,4 +49,9 @@ public interface IStudentReportPlanService extends MPJBaseService<StudentReportP
     Boolean release(StudentReportPlan studentReportPlan);
 
     Long getEffectivePlanId(Long teacherId, Long classId);
+
+
+    List<StudentReportPlan> getWillBeginData();
+
+    List<StudentReportPlanClassRelation> getStudentReportPlanClassRelationList(Long id);
 }

+ 63 - 45
src/main/java/com/xjrsoft/module/student/service/impl/StudentReportPlanServiceImpl.java

@@ -26,6 +26,7 @@ import com.xjrsoft.module.student.service.IStudentReportRecordService;
 import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
 import com.xjrsoft.module.student.vo.StudentReportPlanPageVo;
 import lombok.AllArgsConstructor;
+import me.zhyd.oauth.log.Log;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -137,57 +138,61 @@ public class StudentReportPlanServiceImpl extends MPJBaseServiceImpl<StudentRepo
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean release(StudentReportPlan studentReportPlan) {
-        List<Long> classIds = studentReportPlan.getStudentReportPlanClassRelationList().stream().map(StudentReportPlanClassRelation::getClassId).collect(Collectors.toList());
-        //1、查询选择的学生
-        List<BaseStudentUserPageVo> studentList = studentService.getStudentList(new BaseStudentUserPageDto() {{
-            setClassIds(classIds);
-        }});
-        if(studentList.isEmpty()){
-            throw new MyException("未能查询到学生,请联系管理员");
-        }
-
-        Date createDate = new Date();
-        List<StudentReportRecord> insertList = new ArrayList<>();
-        for (BaseStudentUserPageVo student : studentList) {
-            insertList.add(
-                    new StudentReportRecord(){{
-                        setCreateDate(createDate);
-                        setCreateUserId(StpUtil.getLoginIdAsLong());
-                        setUserId(Long.parseLong(student.getId()));
-                        setBaseSemesterId(studentReportPlan.getSemesterId());
-                        setStudentReportPlanId(studentReportPlan.getId());
-                    }}
-            );
-        }
+        try {
+            List<Long> classIds = studentReportPlan.getStudentReportPlanClassRelationList().stream().map(StudentReportPlanClassRelation::getClassId).collect(Collectors.toList());
+            //1、查询选择的学生
+            List<BaseStudentUserPageVo> studentList = studentService.getStudentList(new BaseStudentUserPageDto() {{
+                setClassIds(classIds);
+            }});
+            if(studentList.isEmpty()){
+                return true;
+            }
 
-        if(!insertList.isEmpty()){
-            reportRecordService.remove(
-                    new QueryWrapper<StudentReportRecord>().lambda()
-                            .eq(StudentReportRecord::getStudentReportPlanId, studentReportPlan.getId())
-            );
-
-            reportRecordService.saveBatch(insertList);
-            Set<String> studentUserIds = studentList.stream().map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
-            //发布后,将学生的状态改为不正常
-            List<BaseStudent> baseStudents = studentService.list(
-                    new QueryWrapper<BaseStudent>().lambda()
-                            .in(BaseStudent::getUserId, studentUserIds)
-            );
-
-            for (BaseStudent baseStudent : baseStudents) {
-                baseStudent.setIsNormal(0);
+            Date createDate = new Date();
+            List<StudentReportRecord> insertList = new ArrayList<>();
+            for (BaseStudentUserPageVo student : studentList) {
+                insertList.add(
+                        new StudentReportRecord(){{
+                            setCreateDate(createDate);
+                            setCreateUserId(studentReportPlan.getCreateUserId());
+                            setUserId(Long.parseLong(student.getId()));
+                            setBaseSemesterId(studentReportPlan.getSemesterId());
+                            setStudentReportPlanId(studentReportPlan.getId());
+                        }}
+                );
             }
 
-            studentService.updateBatchById(baseStudents);
+            if(!insertList.isEmpty()){
+                reportRecordService.remove(
+                        new QueryWrapper<StudentReportRecord>().lambda()
+                                .eq(StudentReportRecord::getStudentReportPlanId, studentReportPlan.getId())
+                );
+
+                reportRecordService.saveBatch(insertList);
+                Set<String> studentUserIds = studentList.stream().map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
+                //发布后,将学生的状态改为不正常
+                List<BaseStudent> baseStudents = studentService.list(
+                        new QueryWrapper<BaseStudent>().lambda()
+                                .in(BaseStudent::getUserId, studentUserIds)
+                );
+
+                for (BaseStudent baseStudent : baseStudents) {
+                    baseStudent.setIsNormal(0);
+                }
 
-            //修改用户的状态
-            List<User> userList = userService.listByIds(studentUserIds);
+                studentService.updateBatchById(baseStudents);
 
-            for (User user : userList) {
-                user.setEnabledMark(EnabledMark.DISABLED.getCode());
-            }
+                //修改用户的状态
+                List<User> userList = userService.listByIds(studentUserIds);
+
+                for (User user : userList) {
+                    user.setEnabledMark(EnabledMark.DISABLED.getCode());
+                }
 
-            userService.updateBatchById(userList);
+                userService.updateBatchById(userList);
+            }
+        }catch (Exception e){
+            Log.error(e.getMessage(), e);
         }
         return true;
     }
@@ -218,4 +223,17 @@ public class StudentReportPlanServiceImpl extends MPJBaseServiceImpl<StudentRepo
         }
         return null;
     }
+
+    @Override
+    public List<StudentReportPlan> getWillBeginData() {
+        return baseMapper.getWillBeginData();
+    }
+
+    @Override
+    public List<StudentReportPlanClassRelation> getStudentReportPlanClassRelationList(Long id) {
+        return relationMapper.selectList(
+                new QueryWrapper<StudentReportPlanClassRelation>().lambda()
+                        .eq(StudentReportPlanClassRelation::getStudentReportPlanId, id)
+        );
+    }
 }

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

@@ -9,6 +9,8 @@ import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.StudentChangeTypeEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.LocalDateUtil;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.student.dto.StudentReportRecordPageDto;
@@ -16,11 +18,14 @@ import com.xjrsoft.module.student.dto.StudentReportRecordStatisticsDto;
 import com.xjrsoft.module.student.dto.StudentReportSignDto;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.entity.StudentReportPlan;
 import com.xjrsoft.module.student.entity.StudentReportRecord;
+import com.xjrsoft.module.student.mapper.StudentReportPlanMapper;
 import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
 import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.service.IStudentChangeRecordService;
+import com.xjrsoft.module.student.service.IStudentReportPlanService;
 import com.xjrsoft.module.student.service.IStudentReportRecordService;
 import com.xjrsoft.module.student.vo.StudentReportRecordPageVo;
 import com.xjrsoft.module.student.vo.StudentReportRecordPlanPageVo;
@@ -30,6 +35,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
 
@@ -47,6 +53,7 @@ public class StudentReportRecordServiceImpl extends MPJBaseServiceImpl<StudentRe
     private final IUserService userService;
     private final IBaseStudentSchoolRollService rollService;
     private final IStudentChangeRecordService changeRecordService;
+    private final StudentReportPlanMapper planMapper;
     @Override
     public StudentReportRecordStatisticsVo getClassStatistics(StudentReportRecordStatisticsDto dto) {
         return this.baseMapper.getClassStatistics(dto);
@@ -96,6 +103,20 @@ public class StudentReportRecordServiceImpl extends MPJBaseServiceImpl<StudentRe
             updateWrapper.eq("id", dto.getId());
             updateWrapper.setSql("report_time = null");
             this.update(record, updateWrapper);
+
+            BaseStudent student = studentService.getOne(
+                    new QueryWrapper<BaseStudent>().lambda()
+                            .eq(BaseStudent::getUserId, record.getUserId())
+                            .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+            );
+            student.setIsNormal(0);
+            studentService.updateById(student);
+
+            User user = userService.getById(record.getUserId());
+            user.setEnabledMark(EnabledMark.DISABLED.getCode());
+            userService.updateById(user);
+
+
         }else{
             record.setReportTime(new Date());
             this.updateById(record);
@@ -154,7 +175,14 @@ public class StudentReportRecordServiceImpl extends MPJBaseServiceImpl<StudentRe
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateStduyStatus(StudentReportSignDto dto) {
+        LocalDate now = LocalDate.now();
         StudentReportRecord record = this.getById(dto.getId());
+        StudentReportPlan reportPlan = planMapper.selectById(record.getStudentReportPlanId());
+        if(!LocalDateUtil.isDateInRange(now, reportPlan.getUpdateStartTime(), reportPlan.getUpdateEndTime())){
+            throw new MyException("不在修改时间内,无法修改");
+        }
+
+
         BaseStudentSchoolRoll roll = rollService.getOne(
                 new QueryWrapper<BaseStudentSchoolRoll>().lambda()
                         .eq(BaseStudentSchoolRoll::getUserId, record.getUserId())

+ 5 - 0
src/main/java/com/xjrsoft/module/student/vo/StudentReportRecordExcelVo.java

@@ -62,6 +62,11 @@ public class StudentReportRecordExcelVo {
     @ApiModelProperty("报到时间")
     private String reportTime;
 
+    @ExcelProperty("报到状态")
+    @ApiModelProperty("是否已报到(1:是 0:否)")
+    private String isReport;
+
+    @ExcelProperty("家长电话")
     @ApiModelProperty("家长电话")
     private String parentMobile;
 

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

@@ -48,7 +48,7 @@
         LEFT JOIN room t15 ON t14.room_id = t15.id
         LEFT JOIN base_office_build t16 ON t15.office_build_id = t16.id
         WHERE t2.delete_mark = 0
-        AND t1.delete_mark = 0
+        AND t1.delete_mark = 0 and t1.is_normal = 1
         AND t3.archives_status = 'FB2901'
         <if test="dto.gradeId != null">
             AND t4.grade_id = #{dto.gradeId}
@@ -137,7 +137,7 @@
         LEFT JOIN xjr_user t5 ON t4.teacher_id = t5.id
         LEFT JOIN base_student_family_member t6 ON t6.user_id = t2.id AND t6.delete_mark = 0 AND t6.is_guardian = 1
         WHERE t2.delete_mark = 0
-        AND t1.delete_mark = 0
+        AND t1.delete_mark = 0 and t1.is_normal = 1
         and t3.archives_status = 'FB2901'
         <if test="dto.gradeId != null">
             and t4.grade_id = #{dto.gradeId}
@@ -170,7 +170,7 @@
         LEFT JOIN xjr_user t5 ON t4.teacher_id = t5.id
         LEFT JOIN base_student_family_member t6 ON t6.user_id = t2.id AND t6.delete_mark = 0 AND t6.is_guardian = 1
         WHERE t2.delete_mark = 0
-        AND t1.delete_mark = 0
+        AND t1.delete_mark = 0 and t1.is_normal = 1
         and t3.archives_status = 'FB2901'
         <if test="dto.gradeId != null">
             and t4.grade_id = #{dto.gradeId}

+ 5 - 0
src/main/resources/mapper/student/StudentReportPlanMapper.xml

@@ -32,4 +32,9 @@
             #{classId}
         </foreach>
     </select>
+
+    <select id="getWillBeginData" resultType="com.xjrsoft.module.student.entity.StudentReportPlan">
+        SELECT * FROM student_report_plan WHERE delete_mark = 0 AND enabled_mark = 1 AND status = 1
+        AND DATE_FORMAT(start_time,'%Y-%m-%d %H:00:00') = DATE_FORMAT(now(),'%Y-%m-%d %H:00:00')
+    </select>
 </mapper>

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

@@ -10,19 +10,21 @@
         SELECT COUNT(*) FROM xjr_user a1
         INNER JOIN base_student_school_roll a2 ON a1.id = a2.user_id
         WHERE a1.delete_mark = 0 AND a2.delete_mark = 0
-        AND a2.class_id = t1.id
+        AND a2.class_id = t1.id AND a2.archives_status = 'FB2901'
         ) AS all_count,
         (
         SELECT COUNT(*) FROM xjr_user a1
         INNER JOIN base_student_school_roll a2 ON a1.id = a2.user_id
         WHERE a1.delete_mark = 0 AND a2.delete_mark = 0
         AND a1.gender = 'SB10001' AND a2.class_id = t1.id
+        AND a2.archives_status = 'FB2901'
         ) AS male_count,
         (
         SELECT COUNT(*) FROM xjr_user a1
         INNER JOIN base_student_school_roll a2 ON a1.id = a2.user_id
         WHERE a1.delete_mark = 0 AND a2.delete_mark = 0
         AND a1.gender = 'SB10002' AND a2.class_id = t1.id
+        AND a2.archives_status = 'FB2901'
         ) AS female_count,
         (
         SELECT COUNT(distinct(a1.id)) FROM xjr_user a1
@@ -84,9 +86,7 @@
         LEFT JOIN xjr_dictionary_detail t9 ON t2.stduy_status = t9.code
         LEFT JOIN xjr_dictionary_detail t10 ON t2.archives_status = t10.code
         WHERE t1.delete_mark = 0 AND t1.enabled_mark = 1
-        <if test="dto.studentReportPlanId != null">
             and t1.student_report_plan_id = #{dto.studentReportPlanId}
-        </if>
         <if test="dto.keyword != null and dto.keyword != ''">
             and t1.name like concat('%', #{dto.keyword},'%')
         </if>
@@ -103,7 +103,7 @@
             and t5.name like concat('%', #{dto.className}, '%')
         </if>
         <if test="dto.credentialNumber != null and dto.credentialNumber != ''">
-            and t3.credentialNumber like concat('%', #{dto.credentialNumber}, '%')
+            and t3.credential_number like concat('%', #{dto.credentialNumber}, '%')
         </if>
         <if test="dto.archivesStatus != null and dto.archivesStatus != ''">
             and t2.archives_status = #{dto.archivesStatus}
@@ -135,7 +135,7 @@
         t3.name,t7.name AS gender,t3.credential_number,t3.mobile,t8.name AS student_type_cn,
         t9.name AS stduy_status_cn,t10.name AS archives_status_cn,
         t1.report_time,IF(t1.report_time IS NULL, 0, 1) as is_report,
-        (SELECT mobile FROM base_student_family_member WHERE delete_mark = 0 AND user_id = t1.user_id ORDER BY create_date ASC LIMIT 0,1) as parent_mobile
+        (SELECT telephone FROM base_student_family WHERE delete_mark = 0 AND user_id = t1.user_id ORDER BY create_date ASC LIMIT 0,1) as parent_mobile
         FROM student_report_record t1
         INNER JOIN base_student_school_roll t2 ON t1.user_id = t2.user_id
         INNER JOIN xjr_user t3 ON t3.id = t1.user_id
@@ -164,7 +164,7 @@
             and t5.name like concat('%', #{dto.className}, '%')
         </if>
         <if test="dto.credentialNumber != null and dto.credentialNumber != ''">
-            and t3.credentialNumber like concat('%', #{dto.credentialNumber}, '%')
+            and t3.credential_number like concat('%', #{dto.credentialNumber}, '%')
         </if>
         <if test="dto.archivesStatus != null and dto.archivesStatus != ''">
             and t2.archives_status = #{dto.archivesStatus}

+ 23 - 22
src/test/java/com/xjrsoft/module/job/JianyuekbBaseDataTaskTest.java

@@ -352,7 +352,9 @@ class JianyuekbBaseDataTaskTest {
             paramJson.addProperty("semesterSerialNo", currenSemeter);
             paramJson.addProperty("eduYearSerialNo", gradeMap.get(baseClass.getOrgId() + "_" + baseClass.getGradeId().toString()));
             paramJson.addProperty("extendId", baseClass.getId());
-            paramJson.addProperty("classRoomSerialNo", classroomMap.get(baseClass.getClassroomId().toString()));
+            if(baseClass.getClassroomId() != null){
+                paramJson.addProperty("classRoomSerialNo", classroomMap.get(baseClass.getClassroomId().toString()));
+            }
             paramJson.addProperty("serialNo", classMap3.get(baseClass.getId().toString()));
             paramJson.addProperty("teacherSerialNo", teacherMap.get(baseClass.getTeacherId().toString()));
 
@@ -565,13 +567,12 @@ class JianyuekbBaseDataTaskTest {
             jianyueIds.add("'" + object.get("serialNo").getAsString() + "'");
         }
 
-        DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
-        Db use = Db.use(datasource);
+
         String sql = "SELECT * FROM jianyue_data WHERE table_name = 'base_class' and jianyue_id in (" + jianyueIds.toString().replace("[","").replace("]","") + ")";
-        List<JianyueData> classList = use.query(sql, JianyueData.class);
+        List<Map<String, Object>> classList = SqlRunnerAdapter.db().selectList(sql);
         Map<String, String> classJianyueSourceMap = new HashMap<>();
-        for (JianyueData jianyueData : classList) {
-            classJianyueSourceMap.put(jianyueData.getJianyueId(), jianyueData.getSourceId());
+        for (Map<String, Object> jianyueData : classList) {
+            classJianyueSourceMap.put(jianyueData.get("jianyue_id").toString(), jianyueData.get("source_id").toString());
         }
 
         url  = ScheduleUtil.apiUrl + "class/update";
@@ -586,49 +587,49 @@ class JianyuekbBaseDataTaskTest {
         doPost = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
 
         sql = "SELECT * FROM base_class WHERE delete_mark = 0 and is_graduate = 1";
-        List<BaseClass> dataList = use.query(sql, BaseClass.class);
-        Map<String, BaseClass> classMap = new HashMap<>();
-        for (BaseClass baseClass : dataList) {
-            classMap.put(baseClass.getId().toString(), baseClass);
+        List<Map<String, Object>> dataList = SqlRunnerAdapter.db().selectList(sql);
+        Map<String, Map<String, Object>> classMap = new HashMap<>();
+        for (Map<String, Object> baseClass : dataList) {
+            classMap.put(baseClass.get("id").toString(), baseClass);
         }
 
         sql = "SELECT * FROM jianyue_data WHERE table_name = 'base_classroom'";
-        List<JianyueData> classroomList = use.query(sql, JianyueData.class);
+        List<Map<String, Object>> classroomList = SqlRunnerAdapter.db().selectList(sql);
         Map<String, String> classroomMap = new HashMap<>();
-        for (JianyueData jianyueData : classroomList) {
-            classroomMap.put(jianyueData.getSourceId(), jianyueData.getJianyueId());
+        for (Map<String, Object> jianyueData : classroomList) {
+            classroomMap.put(jianyueData.get("source_id").toString(), jianyueData.get("jianyue_id").toString());
         }
 
         sql = "SELECT * FROM jianyue_data WHERE table_name = 'base_teacher'";
-        List<JianyueData> teacherList = use.query(sql, JianyueData.class);
+        List<Map<String, Object>> teacherList = SqlRunnerAdapter.db().selectList(sql);
         Map<String, String> teacherMap = new HashMap<>();
-        for (JianyueData jianyueData : teacherList) {
-            teacherMap.put(jianyueData.getSourceId(), jianyueData.getJianyueId());
+        for (Map<String, Object> jianyueData : teacherList) {
+            teacherMap.put(jianyueData.get("source_id").toString(), jianyueData.get("jianyue_id").toString());
         }
 
         url  = ScheduleUtil.apiUrl + "class/update";
 
 
         for (String jianyueId : classJianyueSourceMap.keySet()) {
-            BaseClass baseClass = classMap.get(classJianyueSourceMap.get(jianyueId));
+            Map<String, Object> baseClass = classMap.get(classJianyueSourceMap.get(jianyueId));
             if(baseClass == null){
                 continue;
             }
             paramJson = new JsonObject();
-            paramJson.addProperty("name", baseClass.getName());
+            paramJson.addProperty("name", baseClass.get("name").toString());
 
             paramJson.addProperty("semesterSerialNo", currenSemeter);
-            paramJson.addProperty("extendId", baseClass.getId());
-            paramJson.addProperty("classRoomSerialNo", classroomMap.get(baseClass.getClassroomId().toString()));
+            paramJson.addProperty("extendId", baseClass.get("id").toString());
+            paramJson.addProperty("classRoomSerialNo", classroomMap.get(baseClass.get("classroom_id").toString()));
             paramJson.addProperty("serialNo", jianyueId);
-            paramJson.addProperty("teacherSerialNo", teacherMap.get(baseClass.getTeacherId().toString()));
+            paramJson.addProperty("teacherSerialNo", teacherMap.get(baseClass.get("teacher_id").toString()));
 
             timestamp = System.currentTimeMillis();
             //生成签名
             sign = ScheduleUtil.createSign(timestamp);
             String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
 
-            System.out.println(baseClass.getName() + " -> " + result);
+            System.out.println(baseClass.get("name").toString() + " -> " + result);
         }
     }
 }

+ 57 - 0
src/test/java/com/xjrsoft/module/job/StudentReportPlanTaskTest.java

@@ -0,0 +1,57 @@
+package com.xjrsoft.module.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.module.student.entity.StudentReportPlan;
+import com.xjrsoft.module.student.service.IStudentReportPlanService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+/**
+ * @author dzx
+ * @date 2025/2/10
+ */
+
+@SpringBootTest
+class StudentReportPlanTaskTest {
+
+    @Autowired
+    private IStudentReportPlanService planService;
+
+
+    @Test
+    public void execute() {
+        doExecute();
+    }
+
+
+    public void doExecute(){
+        //查询已发布未开始的,自动开始
+        LocalDateTime now = LocalDateTime.now();
+        List<StudentReportPlan> list = planService.getWillBeginData();
+
+        for (StudentReportPlan studentReportPlan : list) {
+            planService.release(planService.getByIdDeep(studentReportPlan.getId()));
+        }
+
+        //查询已发布已结束的,自动结束
+        List<StudentReportPlan> endList = planService.list(
+                new QueryWrapper<StudentReportPlan>().lambda()
+                        .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(StudentReportPlan::getStatus, 1)
+                        .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
+                        .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .le(StudentReportPlan::getEndTime, now)
+        );
+        for (StudentReportPlan studentReportPlan : endList) {
+            studentReportPlan.setStatus(2);
+            planService.updateById(studentReportPlan);
+        }
+    }
+}