【新增】 学生分数试卷绑定新增临时ID,方式同一学生同一试卷数据冲突

This commit is contained in:
dlaren
2025-08-14 23:12:46 +08:00
parent 513569e50d
commit c40f4a5f1a
8 changed files with 86 additions and 77 deletions

View File

@@ -23,8 +23,6 @@ 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;
import pc.exam.pp.module.judgement.controller.admin.autoTools.vo.StuPaperReqVo;
@@ -79,7 +77,7 @@ public class AutoToolsController {
StuScoreVo stuScoreVo = stuPaperScoreService.getStuScore(stuPaperReqVo.getStuId(),stuPaperReqVo.getPaperId());
stuPaperScoreInfoVos.setStuInfoReqVo(stuScoreVo);
// 3、查询学生试卷得分信息
stuPaperScoreInfoVos.setStuPaperScoreDOList(stuPaperScoreService.findByStuIDAndPaperId(stuPaperReqVo.getStuId(),stuPaperReqVo.getPaperId()));
stuPaperScoreInfoVos.setStuPaperScoreDOList(stuPaperScoreService.findByStuIDAndPaperId(stuPaperReqVo.getStuId(),stuPaperReqVo.getPaperId(), stuPaperReqVo.getTemporaryId()));
// 4、查询学生试卷内容信息
List<String> quIds = educationPaperQuMapper.selectPaperQuByPaperId(stuPaperReqVo.getPaperId());
List<ExamQuestion> examQuestionList = examQuestionMapper.selectExamQuestionListByQuIds(quIds);
@@ -92,7 +90,7 @@ public class AutoToolsController {
// 一条一条进行查询试题,防止顺序错乱
stuPaperScoreInfoVos.setExamQuestionList(examQuestionList);
// 5、查询学生试卷分析
List<StuPaperScoreDO> scoreDOS = stuPaperScoreService.findByStuIDAndPaperId(stuPaperReqVo.getStuId(),stuPaperReqVo.getPaperId());
List<StuPaperScoreDO> scoreDOS = stuPaperScoreService.findByStuIDAndPaperId(stuPaperReqVo.getStuId(),stuPaperReqVo.getPaperId(), stuPaperReqVo.getTemporaryId());
String judgementStr = "<p>试卷分析</p>";
for (StuPaperScoreDO scoreDO : scoreDOS) {
judgementStr += "<p>---------------------------------------</p>";
@@ -111,66 +109,69 @@ public class AutoToolsController {
public CommonResult<String> startExam(@RequestBody StuInTheExam stuInTheExam) {
HttpServletRequest request = ServletUtils.getRequest();
// 获取登录token
String token = SecurityFrameworkUtils.obtainAuthorization(request,
securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
// 获取登录用户
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;
String token = null;
if (request != null) {
token = SecurityFrameworkUtils.obtainAuthorization(request,
securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
// 获取登录用户
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 {
// 没有设置时间 默认1小时 = 3600秒
startTime = 3600;
// 没有设置场次
// 剩余时间直接读取数据
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);
}
// 判断是否存在对应的场次
// 定时上传文件时间
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("未登录");
}
@@ -182,14 +183,17 @@ public class AutoToolsController {
@GetMapping("/stopExam")
public CommonResult<Boolean> stopExam() {
HttpServletRequest request = ServletUtils.getRequest();
String token = SecurityFrameworkUtils.obtainAuthorization(request,
securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
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);
String token = null;
if (request != null) {
token = SecurityFrameworkUtils.obtainAuthorization(request,
securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
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);
}
@@ -199,6 +203,6 @@ public class AutoToolsController {
int minutes = (totalSeconds % 3600) / 60;
int seconds = totalSeconds % 60;
return String.format("%d:%02d:%02d", hours, minutes, seconds);
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
}
}

View File

@@ -13,5 +13,6 @@ public class StuPaperReqVo {
@Schema(description = "试卷号")
private String paperId;
@Schema(description = "临时ID")
private String temporaryId;
}

View File

@@ -101,7 +101,7 @@ public class TaskManager {
int minutes = (totalSeconds % 3600) / 60;
int seconds = totalSeconds % 60;
return String.format("%d:%02d:%02d", hours, minutes, seconds);
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
}
}