diff --git a/safety-cedu-service/pom.xml b/safety-cedu-service/pom.xml
index 00e5ad1a..38468576 100644
--- a/safety-cedu-service/pom.xml
+++ b/safety-cedu-service/pom.xml
@@ -36,6 +36,10 @@
io.swagger
swagger-annotations
+
+ com.jjb.saas
+ jjb-saas-framework-job
+
diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/CourseManagementServiceImpl.java b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/CourseManagementServiceImpl.java
index 7c9f2e9b..200a8d4e 100644
--- a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/CourseManagementServiceImpl.java
+++ b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/CourseManagementServiceImpl.java
@@ -62,7 +62,7 @@ public class CourseManagementServiceImpl extends ServiceImpl convert = page.convert(courseManagementConvertor::convertEToVo);
Map collectMap = classCourseMapper.selectList(new LambdaQueryWrapper()
.in(ClassCourseDO::getCourseId, convert.getRecords().stream().map(CourseManagementVO::getId)))
- .stream().collect(Collectors.toMap(ClassCourseDO::getCourseId, v -> 1));
+ .stream().map(ClassCourseDO::getCourseId).distinct().collect(Collectors.toMap(v -> v, v -> 1));
convert.getRecords().forEach(vo -> {
vo.setCourseRelCoursewareVOList(courseRelCoursewareConvertor.convertEListToVoList(
courseRelCoursewareMapper.selectList(new LambdaQueryWrapper()
@@ -81,11 +81,15 @@ public class CourseManagementServiceImpl extends ServiceImpl collectMap = classCourseMapper.selectList(new LambdaQueryWrapper()
+ .eq(ClassCourseDO::getCourseId, courseManagementVO.getId()))
+ .stream().map(ClassCourseDO::getCourseId).distinct().collect(Collectors.toMap(v -> v, v -> 1));
courseManagementVO.setCourseRelCoursewareVOList(courseRelCoursewareConvertor.convertEListToVoList(
courseRelCoursewareMapper.selectList(new LambdaQueryWrapper()
.eq(CourseRelCoursewareDO::getCourseId, courseManagementVO.getId())
.orderByAsc(CourseRelCoursewareDO::getSort))
));
+ courseManagementVO.setUsed(Math.toIntExact(collectMap.getOrDefault(Long.valueOf(courseManagementVO.getId()), 0)));
return courseManagementVO;
}
diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/service/support/job/ClassManagementStateJob.java b/safety-cedu-service/src/main/java/org/qinan/cedu/service/support/job/ClassManagementStateJob.java
new file mode 100644
index 00000000..968735ab
--- /dev/null
+++ b/safety-cedu-service/src/main/java/org/qinan/cedu/service/support/job/ClassManagementStateJob.java
@@ -0,0 +1,79 @@
+package org.qinan.cedu.service.support.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.jjb.saas.framework.job.Job;
+import com.jjb.saas.framework.job.annotation.JobRegister;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.qinan.cedu.enums.ClassStatusEnum;
+import org.qinan.cedu.enums.DeleteEnum;
+import org.qinan.cedu.mapper.ClassManagementMapper;
+import org.qinan.cedu.model.entity.ClassManagementDO;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 过程控制签字完成,超过3天未归档
+ *
+ * @author ltq
+ * @since 2026/08/13
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class ClassManagementStateJob implements Job {
+
+ private final ClassManagementMapper classManagementMapper;
+
+ /**
+ * 班级管理状态检查
+ */
+ @Override
+ @XxlJob("classManagementStateTask")
+ @JobRegister(cron = "0 7 0 * * ?",
+ jobDesc = "班级管理状态检查",
+ author = "ltq",
+ triggerStatus = 1)
+ public ReturnT execute(String param) {
+ param = XxlJobHelper.getJobParam();
+ log.info("班级管理状态检查开始, param: {}", param);
+ List classManagementDOS = classManagementMapper.selectList(new LambdaQueryWrapper()
+ .ne(ClassManagementDO::getStatus, 1));
+ LocalDate now = LocalDate.now();
+ for (ClassManagementDO classManagementDO : classManagementDOS) {
+ log.info("班级管理状态检查 {}", classManagementDO.getClassName());
+ LocalDate start = classManagementDO.getStartDate().toLocalDate();
+ LocalDate end = classManagementDO.getDelayTime().toLocalDate();
+ if (Objects.isNull(end)) {
+ end = classManagementDO.getEndDate().toLocalDate();
+ }
+ ClassStatusEnum pendingStart;
+ if (now.isBefore(start)) {
+ pendingStart = ClassStatusEnum.PENDING_START;
+ } else if (now.isAfter(start) && now.isBefore(end)) {
+ pendingStart = ClassStatusEnum.IN_PROGRESS;
+ } else if (now.isAfter(end)) {
+ pendingStart = ClassStatusEnum.FINISHED;
+ } else {
+ pendingStart = ClassStatusEnum.NOT_APPLIED;
+ }
+ log.info("班级管理状态检查结束 {}, 状态: {}", classManagementDO.getClassName(), pendingStart.getDesc());
+ classManagementMapper.update(new LambdaUpdateWrapper()
+ .set(ClassManagementDO::getStatus, pendingStart.getCode())
+ .set(ClassManagementDO::getUpdateTime, LocalDateTime.now())
+ .eq(ClassManagementDO::getId, classManagementDO.getId())
+ .eq(ClassManagementDO::getDeleteEnum, DeleteEnum.FALSE.getCode()));
+
+ }
+ log.info("班级管理状态检查完成");
+ return ReturnT.SUCCESS;
+ }
+}