From 1e0fb9883bf99807804d16f66176e5c32ca642f3 Mon Sep 17 00:00:00 2001 From: Lqc Date: Tue, 14 Oct 2025 00:22:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=91=E7=9A=84=E8=80=83=E8=AF=95=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=80=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiol/controller/AiolExamController.java | 159 +++++++++++++++++- .../jeecg/modules/aiol/entity/MyExamDTO.java | 23 +++ 2 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/MyExamDTO.java diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java index 0bc01687..3ab60d65 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolExamController.java @@ -20,14 +20,19 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.apache.poi.ss.usermodel.Workbook; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.system.util.JwtUtil; +import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.aiol.dto.ExaminationResult; import org.jeecg.modules.aiol.dto.QuestionAnswerDTO; import org.jeecg.modules.aiol.dto.QuestionAnswerUser; import org.jeecg.modules.aiol.dto.QuestionExcelDTO; import org.jeecg.modules.aiol.entity.*; +import org.jeecg.modules.aiol.mapper.AiolCourseSignupMapper; import org.jeecg.modules.aiol.service.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -35,6 +40,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.system.service.ISysUserService; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -43,6 +49,7 @@ import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.jeecg.common.system.base.controller.JeecgController; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -66,6 +73,16 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; public class AiolExamController extends JeecgController { @Autowired private IAiolExamService aiolExamService; + @Autowired + private IAiolCourseSectionService aiolCourseSectionService; + @Autowired + private ISysBaseAPI sysBaseApi; + @Autowired + private IAiolEntityLinkService aiolEntityLinkService; + @Autowired + private AiolCourseSignupMapper aiolCourseSignupMapper; + @Autowired + private IAiolExamRecordService aiolExamRecordService; /** * 分页列表查询 @@ -1423,4 +1440,144 @@ public class AiolExamController extends JeecgController queryMyExamList(HttpServletRequest request,@RequestParam(name = "type" , defaultValue = "4" , required = false) Integer type) { + // 尝试获取token,判断用户id + String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN); + List myExamDTOList = new ArrayList<>(); + if (token != null && !token.trim().isEmpty()) { + try { + String username = JwtUtil.getUsername(token); + LoginUser sysUser = sysBaseApi.getUserByName(username); + if (sysUser != null) { + + //获取课程id列表 + List courseSignupList = aiolCourseSignupMapper.selectList( + new QueryWrapper() + .eq("user_id", sysUser.getId()) + .select("course_id") + ); + + // 获取课程章节id列表 + List courseId = aiolCourseSectionService.list( + new QueryWrapper() + .in("course_id", courseSignupList.stream().map(AiolCourseSignup::getCourseId).collect(Collectors.toList())) + .select("id")); + List courseIdList = courseId.stream() + .map(AiolCourseSection::getId) + .collect(Collectors.toList()); + + //获取实体列表里的考试 + List list = new ArrayList<>(); + if (!courseIdList.isEmpty()) { + list = aiolEntityLinkService.list(new QueryWrapper() + .eq("source_type", "course_section") + .in("source_id", courseIdList) + .eq("target_type", "exam") + .select("target_id")).stream().map(AiolEntityLink::getTargetId).collect(Collectors.toList()); + } else return Result.ok(); + + // 查询考试 + QueryWrapper queryWrapper = new QueryWrapper<>(); + //正式考试 + queryWrapper.eq("type",1); + if (type != 4) { + queryWrapper.eq("status", type); + } + if (!list.isEmpty()) { + queryWrapper.in("id", list); + } else return Result.ok(); + + // 查询考试列表并去重 + List examList = aiolExamService.list(queryWrapper) + .stream() + .distinct() + .collect(Collectors.toList()); + + // 查询考试关联的考试记录 + if(examList.isEmpty()){ + return Result.ok(); + } + List examRecordList = aiolExamRecordService. + list( + new QueryWrapper(). + in("exam_id", examList.stream().map(AiolExam::getId).collect(Collectors.toList())) + ); + // 预先构建examId到examRecord的Map + Map examRecordMap = examRecordList.stream() + .collect(Collectors.toMap( + AiolExamRecord::getExamId, + record -> record, + (existing, replacement) -> existing // 如果有重复key,保留第一个 + )); + for (AiolExam exam : examList) { + MyExamDTO myExamDTO = new MyExamDTO(); + myExamDTO.setExamId(exam.getId()); + myExamDTO.setExamName(exam.getName()); + long currentTime = new Date().getTime(); + long startTime = 0 ; + long endTime = 0 ; + if (exam.getStartTime()!= null){ + startTime = exam.getStartTime().getTime(); + } + if (exam.getEndTime()!= null){ + endTime = exam.getEndTime().getTime(); + } + if(startTime==0||endTime==0){ + myExamDTO.setExamStatus("未设置起始时间或结束时间,请联系教师"); // 未开始 + } else if ( startTime > currentTime ) { + myExamDTO.setExamStatus("未开始"); // 未开始 + } else if ( currentTime <= endTime ) { + myExamDTO.setExamStatus("进行中"); // 进行中 + } else { + myExamDTO.setExamStatus("已结束"); // 已结束 + } + myExamDTO.setExamStartTime(exam.getStartTime()); + myExamDTO.setExamTime(exam.getTotalTime()); + AiolExamRecord examRecord = examRecordMap.get(exam.getId()); + if (examRecord != null) { + myExamDTO.setExamScore(examRecord.getTotalScore()); + } + myExamDTOList.add(myExamDTO); + } + } + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + return Result.ok(myExamDTOList); + } + + @Scheduled(cron = "0 */5 * * * ?") // 每5分钟执行一次 + public void updateExamStatus() { + // 获取当前时间 + Date now = new Date(); + log.info("\u001B[32m执行更新试卷状态------------开始\u001B[0m"); + // 查询所有需要更新的考试 + List examsToUpdate = aiolExamService.list(new LambdaQueryWrapper() + .in(AiolExam::getStatus, Arrays.asList(1, 2)) + .and(wrapper -> wrapper + .lt(AiolExam::getStartTime, now) + .or() + .lt(AiolExam::getEndTime, now) + )); + + // 批量更新 + for (AiolExam exam : examsToUpdate) { + if (exam.getStatus() == 1 && now.after(exam.getStartTime())) { + exam.setStatus(2); + } else if (exam.getStatus() == 2 && now.after(exam.getEndTime())) { + exam.setStatus(3); + } + } + + if (!examsToUpdate.isEmpty()) { + aiolExamService.updateBatchById(examsToUpdate); + } + + log.info("\u001B[32m执行更新试卷状态------------结束\u001B[0m"); + } + + } diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/MyExamDTO.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/MyExamDTO.java new file mode 100644 index 00000000..de239160 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/MyExamDTO.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.aiol.entity; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +public class MyExamDTO { + @Schema(description = "试卷id") + private String examId; + @Schema(description = "试卷名") + private String examName; + @Schema(description = "试卷状态") + private String examStatus; + @Schema(description = "试卷开始时间") + private Date examStartTime; + @Schema(description = "试卷时长") + private Integer examTime; + @Schema(description = "试卷得分") + private Double examScore; + +}