【修改】 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

@@ -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<Boolean> startExam(@RequestBody StuInTheExam stuInTheExam) {
public CommonResult<String> 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) {

View File

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