diff --git a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/dal/dataobject/monitor/MonitorDO.java b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/dal/dataobject/monitor/MonitorDO.java index 437c1330..397efaea 100644 --- a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/dal/dataobject/monitor/MonitorDO.java +++ b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/dal/dataobject/monitor/MonitorDO.java @@ -1,9 +1,12 @@ package pc.exam.pp.module.exam.dal.dataobject.monitor; + import lombok.*; + import java.util.*; import java.time.LocalDateTime; import java.time.LocalDateTime; import java.time.LocalDateTime; + import com.baomidou.mybatisplus.annotation.*; import pc.exam.pp.framework.mybatis.core.dataobject.BaseDO; @@ -22,49 +25,49 @@ import pc.exam.pp.framework.mybatis.core.dataobject.BaseDO; @AllArgsConstructor public class MonitorDO extends BaseDO { -/** - * 主键id - */ -@TableId(type = IdType.INPUT) -private String monitorId; + /** + * 主键id + */ + @TableId(type = IdType.INPUT) + private String monitorId; -private String stuId; -/** - * 用户账号 - */ -private String username; -/** - * 用户姓名 - */ -private String nickname; -/** - * 班级 - */ -private String className; -/** - * 考试状态 - */ -private String examStatus; -/** - * 成绩 - */ -private String score; -/** - * 试卷编号 - */ -private String paperNum; + private String stuId; + /** + * 用户账号 + */ + private String username; + /** + * 用户姓名 + */ + private String nickname; + /** + * 班级 + */ + private String className; + /** + * 考试状态 + */ + private String examStatus; + /** + * 成绩 + */ + private String score; + /** + * 试卷编号 + */ + private String paperNum; -private String taskId; -private String taskName; + private String taskId; + private String taskName; -private String taskType; -/** - * 机器ip - */ -private String ip; -/** - * 剩余时间 - */ -private Long remainingTime; + private String taskType; + /** + * 机器ip + */ + private String ip; + /** + * 剩余时间 + */ + private Long remainingTime; } diff --git a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/job/QuestionDownJob.java b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/job/QuestionDownJob.java index df0484e5..a51a1322 100644 --- a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/job/QuestionDownJob.java +++ b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/job/QuestionDownJob.java @@ -68,12 +68,6 @@ public class QuestionDownJob implements JobHandler { System.out.println("不走定时任务测试=========================="); } - - - - - - return null; } } diff --git a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/monitor/MonitorServiceImpl.java b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/monitor/MonitorServiceImpl.java index 8563e410..7adacb11 100644 --- a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/monitor/MonitorServiceImpl.java +++ b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/monitor/MonitorServiceImpl.java @@ -265,7 +265,7 @@ public class MonitorServiceImpl implements MonitorService { EducationPaperSession educationPaperSession = educationPaperSessionMapper.selectEducationPaperSessionBySessionId(educationPaperPerson.getSessionId()); if (educationPaperSession == null) { - throw new MonitorSpecialtyException("未分配考场,请练习教师!"); + throw new MonitorSpecialtyException("未分配考场,请联系教师!"); } //结束时间 Date endTime = educationPaperSession.getEndTime(); diff --git a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/question/ExamQuestionServiceImpl.java b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/question/ExamQuestionServiceImpl.java index e2c4cbc0..d3c12e04 100644 --- a/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/question/ExamQuestionServiceImpl.java +++ b/exam-module-exam/exam-module-exam-biz/src/main/java/pc/exam/pp/module/exam/service/question/ExamQuestionServiceImpl.java @@ -598,7 +598,6 @@ public class ExamQuestionServiceImpl implements IExamQuestionService { // TODO 1、拉取数据,保存至数据库 2、回调服务器是否拉取成功(中心服务器) // 1、获取上传的rabbit的试题数组 List examQuestions = null; - List insertExam = new ArrayList<>(); try { examQuestions = rabbitMqService.receiveAllMessages(queueName); } catch (Exception e) { @@ -614,19 +613,21 @@ public class ExamQuestionServiceImpl implements IExamQuestionService { // 判断试题归属于中心服务器还是考点服务器 if (examQuestion.getSchoolId() == null || examQuestion.getSchoolId().isEmpty()) { examQuestion.setSchoolId("1"); + examQuestion.setAudit(String.valueOf(0)); } else { examQuestion.setSchoolId(examQuestion.getSchoolId()); + examQuestion.setAudit(String.valueOf(1)); } examQuestion.setCreator(examQuestion.getCreator()); examQuestion.setCreateTime(LocalDateTime.now()); examQuestion.setUpdateTime(LocalDateTime.now()); - // 判断上传的试题类型是需要审核还是不需要审核的 - if (queueName.split("_")[0].equals("1")) { - // 中心服務器推送到考點服務器,默認審核是通過的 - examQuestion.setAudit(String.valueOf(0)); - } else { - examQuestion.setAudit(String.valueOf(1)); - } + // 判断上传的试题类型是需要审核还是不需要审核的 TODO +// if (queueName.split("_")[0].equals("1")) { +// // 中心服務器推送到考點服務器,默認審核是通過的 +// examQuestion.setAudit(String.valueOf(0)); +// } else { +// examQuestion.setAudit(String.valueOf(1)); +// } Long loginTenantId = SecurityFrameworkUtils.getLoginTenantId(); int count = examQuestionMapper.selectCountQu(); // 读取系统创建试题位数设置 @@ -640,7 +641,6 @@ public class ExamQuestionServiceImpl implements IExamQuestionService { List fileUploads = examQuestion.getFileUploads(); ExamQuestionScore questionScores = examQuestion.getQuestionScores(); List questionKeywords = examQuestion.getQuestionKeywords(); - if (answerList != null && answerList.size() > 0) { answerList.replaceAll(answer -> { answer.setAnswerId(IdUtils.simpleUUID()); @@ -650,7 +650,6 @@ public class ExamQuestionServiceImpl implements IExamQuestionService { //examQuestionAnswerMapper.insert(answerList); examQuestionAnswerMapper.insertExamQuestionAnswerList(answerList); } - if (fileUploads != null && fileUploads.size() > 0) { fileUploads.replaceAll(fileUpload -> { // 设置 fileId 和 quId @@ -660,9 +659,7 @@ public class ExamQuestionServiceImpl implements IExamQuestionService { return fileUpload; }); sysFileMapper.insertSysFileList(fileUploads); - } - if (questionScores != null) { questionScores.setScoreId(IdUtils.simpleUUID()); questionScores.setQuId(quId); @@ -676,7 +673,7 @@ public class ExamQuestionServiceImpl implements IExamQuestionService { }); examQuestionKeywordMapper.insertExamQuestionKeywordList(questionKeywords); } - examQuestionMapper.insert(insertExam); + examQuestionMapper.insert(examQuestion); } //有就是覆盖 else { diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/AutoToolsController.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/AutoToolsController.java index 82a77a21..3f0f7c66 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/AutoToolsController.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/AutoToolsController.java @@ -6,20 +6,24 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import pc.exam.pp.framework.common.pojo.CommonResult; +import pc.exam.pp.framework.common.util.json.JsonUtils; import pc.exam.pp.framework.common.util.servlet.ServletUtils; import pc.exam.pp.framework.security.config.SecurityProperties; +import pc.exam.pp.framework.security.core.LoginUser; import pc.exam.pp.framework.security.core.util.SecurityFrameworkUtils; -import pc.exam.pp.module.exam.dal.dataobject.EducationPaperParam; -import pc.exam.pp.module.exam.dal.dataobject.EducationPaperTask; -import pc.exam.pp.module.exam.dal.dataobject.ExamQuestion; +import pc.exam.pp.module.exam.dal.dataobject.*; import pc.exam.pp.module.exam.dal.dataobject.student.StuPaperScoreDO; +import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperPersonMapper; import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperQuMapper; +import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperSessionMapper; import pc.exam.pp.module.exam.dal.mysql.question.ExamQuestionMapper; import pc.exam.pp.module.exam.dal.mysql.student.StuScoreVo; import pc.exam.pp.module.exam.service.paper.IEducationPaperParamService; +import pc.exam.pp.module.exam.service.paper.IEducationPaperSessionService; import pc.exam.pp.module.exam.service.paper.IEducationPaperTaskService; import pc.exam.pp.module.exam.service.stuPaperScore.StuPaperScoreService; import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuInTheExam; @@ -27,7 +31,11 @@ import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuPaperReqVo; import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuPaperScoreInfoVo; import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuTheExamInfo; import pc.exam.pp.module.judgement.service.TaskManager; +import pc.exam.pp.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import java.time.Duration; +import java.time.Instant; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @@ -54,9 +62,13 @@ public class AutoToolsController { @Resource SecurityProperties securityProperties; @Autowired - IEducationPaperTaskService educationPaperTaskService; + EducationPaperPersonMapper educationPaperPersonMapper; + @Resource + EducationPaperSessionMapper educationPaperSessionMapper; @Autowired IEducationPaperParamService educationPaperParamService; + @Resource + StringRedisTemplate stringRedisTemplate; @GetMapping("/getStuScoreInfo") @Operation(summary = "通过学生ID、试卷ID获取") @@ -96,31 +108,71 @@ public class AutoToolsController { * @return true */ @PostMapping("/startExam") - public CommonResult startExam(@RequestBody StuInTheExam stuInTheExam) { + public CommonResult startExam(@RequestBody StuInTheExam stuInTheExam) { HttpServletRequest request = ServletUtils.getRequest(); + // 获取登录token String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); - // 查找对应的task - EducationPaperParam educationPaperParam = educationPaperParamService.selectEducationPaperParamByTaskId(stuInTheExam.getTaskId()); - // 定时上传文件时间 - String time = educationPaperParam.getUploadTime(); - // 将分钟继续转换成秒 - stuInTheExam.setTimes(Integer.parseInt(time) * 60); - // 倒计时 - AtomicInteger countdown = new AtomicInteger(stuInTheExam.getStartTimes()); - // 创建初始返回数据 - StuTheExamInfo stuTheExamInfo = new StuTheExamInfo(); - // 返回数据-剩余时间 - stuTheExamInfo.setTime(formatLongDuration(countdown.get())); - // 返回数据-上传文件状态 0:上传;1:不上传 - stuTheExamInfo.setUpload(1); - // 返回数据-上传文件状态 0:结束;1:不结束 - stuTheExamInfo.setEndStatus(1); - // 返回数据-网络状态 - stuTheExamInfo.setNetwork("强"); - // 创建对应的线程池 - taskManager.startTask(stuInTheExam, stuTheExamInfo, token, countdown, new AtomicInteger(0)); - return CommonResult.success(true); + // 获取登录用户 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + // 通过token获取用户redis信息,获取refreshToken + OAuth2AccessTokenDO oAuth2AccessTokenDO = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("oauth2_access_token:"+token), OAuth2AccessTokenDO.class); + int startTime = 0; + if (oAuth2AccessTokenDO != null) { + String refreshToken = oAuth2AccessTokenDO.getRefreshToken(); + // 查找对应的task + EducationPaperParam educationPaperParam = educationPaperParamService.selectEducationPaperParamByTaskId(stuInTheExam.getTaskId()); + String isSession = educationPaperParam.getIsSession(); + if (isSession.equals("0")) { + // 设置了场次 + // 剩余时间需要继续计算 + EducationPaperPerson educationPaperPerson = educationPaperPersonMapper.selectByTaskIdAndPersonId(stuInTheExam.getTaskId(), String.valueOf(loginUser.getId())); + EducationPaperSession educationPaperSession = educationPaperSessionMapper.selectEducationPaperSessionBySessionId(educationPaperPerson.getSessionId()); + //结束时间 + Date endTime = educationPaperSession.getEndTime(); + Date nowTime = new Date(); + // 将 Date 转换为 Instant + Instant endInstant = endTime.toInstant(); + Instant nowInstant = nowTime.toInstant(); + // 计算秒数差 + long diffInSeconds = Duration.between(nowInstant, endInstant).getSeconds(); + startTime = (int) diffInSeconds; + } else { + // 没有设置场次 + // 剩余时间直接读取数据 + String isTime = educationPaperParam.getIsTime(); + if (isTime.equals("0")) { + // 设置了时间 + // 剩余时间直接读取数据 + long seconds = educationPaperParam.getExamTime().toLocalTime().toSecondOfDay(); + startTime = (int) seconds; + } else { + // 没有设置时间 默认1小时 = 3600秒 + startTime = 3600; + } + } + // 判断是否存在对应的场次 + // 定时上传文件时间 + String time = educationPaperParam.getUploadTime(); + // 将分钟继续转换成秒 + stuInTheExam.setTimes(Integer.parseInt(time) * 60); + // 倒计时 + AtomicInteger countdown = new AtomicInteger(startTime); + // 创建初始返回数据 + StuTheExamInfo stuTheExamInfo = new StuTheExamInfo(); + // 返回数据-剩余时间 + stuTheExamInfo.setTime(formatLongDuration(countdown.get())); + // 返回数据-上传文件状态 0:上传;1:不上传 + stuTheExamInfo.setUpload(1); + // 返回数据-上传文件状态 0:结束;1:不结束 + stuTheExamInfo.setEndStatus(1); + // 返回数据-网络状态 + stuTheExamInfo.setNetwork("强"); + // 创建对应的线程池 + taskManager.startTask(stuInTheExam, stuTheExamInfo, refreshToken, countdown, new AtomicInteger(0)); + return CommonResult.success(refreshToken); + } + return CommonResult.success("未登录"); } /** @@ -132,9 +184,14 @@ public class AutoToolsController { HttpServletRequest request = ServletUtils.getRequest(); String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); - // 删除对应的线程池 - taskManager.stopTask(token); - return CommonResult.success(true); + OAuth2AccessTokenDO oAuth2AccessTokenDO = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("oauth2_access_token:"+token), OAuth2AccessTokenDO.class); + if (oAuth2AccessTokenDO != null) { + // 删除对应的线程池 + String refreshToken = oAuth2AccessTokenDO.getRefreshToken(); + taskManager.stopTask(refreshToken); + return CommonResult.success(true); + } + return CommonResult.success(false); } public static String formatLongDuration(int totalSeconds) { diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/vo/StuInTheExam.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/vo/StuInTheExam.java index 4daf22b2..ede6f20c 100644 --- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/vo/StuInTheExam.java +++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/controller/admin/autoTools/vo/StuInTheExam.java @@ -13,6 +13,6 @@ public class StuInTheExam { private int times; // 任务ID private String taskId; - // 延迟时间 min + // 延迟时间 单位min private Integer delayTime; }