【修改】 ws连接方式,新增自动判断剩余时间

This commit is contained in:
dlaren
2025-08-14 15:14:28 +08:00
parent 33f561b444
commit 7de8565e8e
6 changed files with 142 additions and 91 deletions

View File

@@ -1,9 +1,12 @@
package pc.exam.pp.module.exam.dal.dataobject.monitor; package pc.exam.pp.module.exam.dal.dataobject.monitor;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import pc.exam.pp.framework.mybatis.core.dataobject.BaseDO; import pc.exam.pp.framework.mybatis.core.dataobject.BaseDO;
@@ -22,49 +25,49 @@ import pc.exam.pp.framework.mybatis.core.dataobject.BaseDO;
@AllArgsConstructor @AllArgsConstructor
public class MonitorDO extends BaseDO { public class MonitorDO extends BaseDO {
/** /**
* 主键id * 主键id
*/ */
@TableId(type = IdType.INPUT) @TableId(type = IdType.INPUT)
private String monitorId; private String monitorId;
private String stuId; private String stuId;
/** /**
* 用户账号 * 用户账号
*/ */
private String username; private String username;
/** /**
* 用户姓名 * 用户姓名
*/ */
private String nickname; private String nickname;
/** /**
* 班级 * 班级
*/ */
private String className; private String className;
/** /**
* 考试状态 * 考试状态
*/ */
private String examStatus; private String examStatus;
/** /**
* 成绩 * 成绩
*/ */
private String score; private String score;
/** /**
* 试卷编号 * 试卷编号
*/ */
private String paperNum; private String paperNum;
private String taskId; private String taskId;
private String taskName; private String taskName;
private String taskType; private String taskType;
/** /**
* 机器ip * 机器ip
*/ */
private String ip; private String ip;
/** /**
* 剩余时间 * 剩余时间
*/ */
private Long remainingTime; private Long remainingTime;
} }

View File

@@ -68,12 +68,6 @@ public class QuestionDownJob implements JobHandler {
System.out.println("不走定时任务测试=========================="); System.out.println("不走定时任务测试==========================");
} }
return null; return null;
} }
} }

View File

@@ -265,7 +265,7 @@ public class MonitorServiceImpl implements MonitorService {
EducationPaperSession educationPaperSession = educationPaperSessionMapper.selectEducationPaperSessionBySessionId(educationPaperPerson.getSessionId()); EducationPaperSession educationPaperSession = educationPaperSessionMapper.selectEducationPaperSessionBySessionId(educationPaperPerson.getSessionId());
if (educationPaperSession == null) { if (educationPaperSession == null) {
throw new MonitorSpecialtyException("未分配考场,请练习教师!"); throw new MonitorSpecialtyException("未分配考场,请联系教师!");
} }
//结束时间 //结束时间
Date endTime = educationPaperSession.getEndTime(); Date endTime = educationPaperSession.getEndTime();

View File

@@ -598,7 +598,6 @@ public class ExamQuestionServiceImpl implements IExamQuestionService {
// TODO 1、拉取数据保存至数据库 2、回调服务器是否拉取成功中心服务器 // TODO 1、拉取数据保存至数据库 2、回调服务器是否拉取成功中心服务器
// 1、获取上传的rabbit的试题数组 // 1、获取上传的rabbit的试题数组
List<ExamQuestion> examQuestions = null; List<ExamQuestion> examQuestions = null;
List<ExamQuestion> insertExam = new ArrayList<>();
try { try {
examQuestions = rabbitMqService.receiveAllMessages(queueName); examQuestions = rabbitMqService.receiveAllMessages(queueName);
} catch (Exception e) { } catch (Exception e) {
@@ -614,19 +613,21 @@ public class ExamQuestionServiceImpl implements IExamQuestionService {
// 判断试题归属于中心服务器还是考点服务器 // 判断试题归属于中心服务器还是考点服务器
if (examQuestion.getSchoolId() == null || examQuestion.getSchoolId().isEmpty()) { if (examQuestion.getSchoolId() == null || examQuestion.getSchoolId().isEmpty()) {
examQuestion.setSchoolId("1"); examQuestion.setSchoolId("1");
examQuestion.setAudit(String.valueOf(0));
} else { } else {
examQuestion.setSchoolId(examQuestion.getSchoolId()); examQuestion.setSchoolId(examQuestion.getSchoolId());
examQuestion.setAudit(String.valueOf(1));
} }
examQuestion.setCreator(examQuestion.getCreator()); examQuestion.setCreator(examQuestion.getCreator());
examQuestion.setCreateTime(LocalDateTime.now()); examQuestion.setCreateTime(LocalDateTime.now());
examQuestion.setUpdateTime(LocalDateTime.now()); examQuestion.setUpdateTime(LocalDateTime.now());
// 判断上传的试题类型是需要审核还是不需要审核的 // 判断上传的试题类型是需要审核还是不需要审核的 TODO
if (queueName.split("_")[0].equals("1")) { // if (queueName.split("_")[0].equals("1")) {
// 中心服務器推送到考點服務器,默認審核是通過的 // // 中心服務器推送到考點服務器,默認審核是通過的
examQuestion.setAudit(String.valueOf(0)); // examQuestion.setAudit(String.valueOf(0));
} else { // } else {
examQuestion.setAudit(String.valueOf(1)); // examQuestion.setAudit(String.valueOf(1));
} // }
Long loginTenantId = SecurityFrameworkUtils.getLoginTenantId(); Long loginTenantId = SecurityFrameworkUtils.getLoginTenantId();
int count = examQuestionMapper.selectCountQu(); int count = examQuestionMapper.selectCountQu();
// 读取系统创建试题位数设置 // 读取系统创建试题位数设置
@@ -640,7 +641,6 @@ public class ExamQuestionServiceImpl implements IExamQuestionService {
List<ExamQuestionFile> fileUploads = examQuestion.getFileUploads(); List<ExamQuestionFile> fileUploads = examQuestion.getFileUploads();
ExamQuestionScore questionScores = examQuestion.getQuestionScores(); ExamQuestionScore questionScores = examQuestion.getQuestionScores();
List<ExamQuestionKeyword> questionKeywords = examQuestion.getQuestionKeywords(); List<ExamQuestionKeyword> questionKeywords = examQuestion.getQuestionKeywords();
if (answerList != null && answerList.size() > 0) { if (answerList != null && answerList.size() > 0) {
answerList.replaceAll(answer -> { answerList.replaceAll(answer -> {
answer.setAnswerId(IdUtils.simpleUUID()); answer.setAnswerId(IdUtils.simpleUUID());
@@ -650,7 +650,6 @@ public class ExamQuestionServiceImpl implements IExamQuestionService {
//examQuestionAnswerMapper.insert(answerList); //examQuestionAnswerMapper.insert(answerList);
examQuestionAnswerMapper.insertExamQuestionAnswerList(answerList); examQuestionAnswerMapper.insertExamQuestionAnswerList(answerList);
} }
if (fileUploads != null && fileUploads.size() > 0) { if (fileUploads != null && fileUploads.size() > 0) {
fileUploads.replaceAll(fileUpload -> { fileUploads.replaceAll(fileUpload -> {
// 设置 fileId 和 quId // 设置 fileId 和 quId
@@ -660,9 +659,7 @@ public class ExamQuestionServiceImpl implements IExamQuestionService {
return fileUpload; return fileUpload;
}); });
sysFileMapper.insertSysFileList(fileUploads); sysFileMapper.insertSysFileList(fileUploads);
} }
if (questionScores != null) { if (questionScores != null) {
questionScores.setScoreId(IdUtils.simpleUUID()); questionScores.setScoreId(IdUtils.simpleUUID());
questionScores.setQuId(quId); questionScores.setQuId(quId);
@@ -676,7 +673,7 @@ public class ExamQuestionServiceImpl implements IExamQuestionService {
}); });
examQuestionKeywordMapper.insertExamQuestionKeywordList(questionKeywords); examQuestionKeywordMapper.insertExamQuestionKeywordList(questionKeywords);
} }
examQuestionMapper.insert(insertExam); examQuestionMapper.insert(examQuestion);
} }
//有就是覆盖 //有就是覆盖
else { else {

View File

@@ -6,20 +6,24 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import pc.exam.pp.framework.common.pojo.CommonResult; 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.common.util.servlet.ServletUtils;
import pc.exam.pp.framework.security.config.SecurityProperties; 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.framework.security.core.util.SecurityFrameworkUtils;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaperParam; import pc.exam.pp.module.exam.dal.dataobject.*;
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.student.StuPaperScoreDO; 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.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.question.ExamQuestionMapper;
import pc.exam.pp.module.exam.dal.mysql.student.StuScoreVo; 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.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.paper.IEducationPaperTaskService;
import pc.exam.pp.module.exam.service.stuPaperScore.StuPaperScoreService; import pc.exam.pp.module.exam.service.stuPaperScore.StuPaperScoreService;
import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuInTheExam; 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.StuPaperScoreInfoVo;
import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuTheExamInfo; import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuTheExamInfo;
import pc.exam.pp.module.judgement.service.TaskManager; 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.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -54,9 +62,13 @@ public class AutoToolsController {
@Resource @Resource
SecurityProperties securityProperties; SecurityProperties securityProperties;
@Autowired @Autowired
IEducationPaperTaskService educationPaperTaskService; EducationPaperPersonMapper educationPaperPersonMapper;
@Resource
EducationPaperSessionMapper educationPaperSessionMapper;
@Autowired @Autowired
IEducationPaperParamService educationPaperParamService; IEducationPaperParamService educationPaperParamService;
@Resource
StringRedisTemplate stringRedisTemplate;
@GetMapping("/getStuScoreInfo") @GetMapping("/getStuScoreInfo")
@Operation(summary = "通过学生ID、试卷ID获取") @Operation(summary = "通过学生ID、试卷ID获取")
@@ -96,31 +108,71 @@ public class AutoToolsController {
* @return true * @return true
*/ */
@PostMapping("/startExam") @PostMapping("/startExam")
public CommonResult<Boolean> startExam(@RequestBody StuInTheExam stuInTheExam) { public CommonResult<String> startExam(@RequestBody StuInTheExam stuInTheExam) {
HttpServletRequest request = ServletUtils.getRequest(); HttpServletRequest request = ServletUtils.getRequest();
// 获取登录token
String token = SecurityFrameworkUtils.obtainAuthorization(request, String token = SecurityFrameworkUtils.obtainAuthorization(request,
securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
// 查找对应的task // 获取登录用户
EducationPaperParam educationPaperParam = educationPaperParamService.selectEducationPaperParamByTaskId(stuInTheExam.getTaskId()); LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
// 定时上传文件时间 // 通过token获取用户redis信息获取refreshToken
String time = educationPaperParam.getUploadTime(); OAuth2AccessTokenDO oAuth2AccessTokenDO = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("oauth2_access_token:"+token), OAuth2AccessTokenDO.class);
// 将分钟继续转换成秒 int startTime = 0;
stuInTheExam.setTimes(Integer.parseInt(time) * 60); if (oAuth2AccessTokenDO != null) {
// 倒计时 String refreshToken = oAuth2AccessTokenDO.getRefreshToken();
AtomicInteger countdown = new AtomicInteger(stuInTheExam.getStartTimes()); // 查找对应的task
// 创建初始返回数据 EducationPaperParam educationPaperParam = educationPaperParamService.selectEducationPaperParamByTaskId(stuInTheExam.getTaskId());
StuTheExamInfo stuTheExamInfo = new StuTheExamInfo(); String isSession = educationPaperParam.getIsSession();
// 返回数据-剩余时间 if (isSession.equals("0")) {
stuTheExamInfo.setTime(formatLongDuration(countdown.get())); // 设置了场次
// 返回数据-上传文件状态 0上传1不上传 // 剩余时间需要继续计算
stuTheExamInfo.setUpload(1); EducationPaperPerson educationPaperPerson = educationPaperPersonMapper.selectByTaskIdAndPersonId(stuInTheExam.getTaskId(), String.valueOf(loginUser.getId()));
// 返回数据-上传文件状态 0结束1不结束 EducationPaperSession educationPaperSession = educationPaperSessionMapper.selectEducationPaperSessionBySessionId(educationPaperPerson.getSessionId());
stuTheExamInfo.setEndStatus(1); //结束时间
// 返回数据-网络状态 Date endTime = educationPaperSession.getEndTime();
stuTheExamInfo.setNetwork(""); Date nowTime = new Date();
// 创建对应的线程池 // 将 Date 转换为 Instant
taskManager.startTask(stuInTheExam, stuTheExamInfo, token, countdown, new AtomicInteger(0)); Instant endInstant = endTime.toInstant();
return CommonResult.success(true); 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(); HttpServletRequest request = ServletUtils.getRequest();
String token = SecurityFrameworkUtils.obtainAuthorization(request, String token = SecurityFrameworkUtils.obtainAuthorization(request,
securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
// 删除对应的线程池 OAuth2AccessTokenDO oAuth2AccessTokenDO = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("oauth2_access_token:"+token), OAuth2AccessTokenDO.class);
taskManager.stopTask(token); if (oAuth2AccessTokenDO != null) {
return CommonResult.success(true); // 删除对应的线程池
String refreshToken = oAuth2AccessTokenDO.getRefreshToken();
taskManager.stopTask(refreshToken);
return CommonResult.success(true);
}
return CommonResult.success(false);
} }
public static String formatLongDuration(int totalSeconds) { public static String formatLongDuration(int totalSeconds) {

View File

@@ -13,6 +13,6 @@ public class StuInTheExam {
private int times; private int times;
// 任务ID // 任务ID
private String taskId; private String taskId;
// 延迟时间 min // 延迟时间 单位min
private Integer delayTime; private Integer delayTime;
} }