|
@@ -508,27 +508,32 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
ret.setPaperDecryptSecret(ep.getDecryptSecret());
|
|
|
ret.setPaperDecryptVector(ep.getDecryptVector());
|
|
|
|
|
|
- if (!ExamRecordStatusEnum.RESUME_PREPARE.equals(sta)) {//非断点进入的
|
|
|
- // 写入次数
|
|
|
- es.setAlreadyExamCount(es.getAlreadyExamCount() + 1);
|
|
|
- // 更新考生缓存
|
|
|
- redisUtil.set(RedisKeyHelper.examStudentCacheKey(examStudentId), es);
|
|
|
- updateExamStudent(examStudentId, es.getAlreadyExamCount(), recordId);
|
|
|
- }
|
|
|
- // 更新考试记录缓存
|
|
|
- Long firstStartTime = System.currentTimeMillis();
|
|
|
- ExamRecordCacheUtil.setFirstStartTime(recordId, firstStartTime, false);
|
|
|
- ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.ANSWERING, false);
|
|
|
- Long lastStartTime = System.currentTimeMillis();
|
|
|
- ExamRecordCacheUtil.setLastStartTime(recordId, lastStartTime, false);
|
|
|
- String[] columns = new String[] { ExamRecordFieldEnum.first_start_time.name(),
|
|
|
- ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_start_time.name() };
|
|
|
- Object[] values = new Object[] { firstStartTime, ExamRecordStatusEnum.ANSWERING, lastStartTime };
|
|
|
- toeExamRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
- //更新场次-考试记录缓存
|
|
|
- ExamActivityRecordCacheUtil.setExamRecordStatus(activityId, recordId,
|
|
|
- new ExamActivityRecordCacheBean(ExamRecordCacheUtil.getExamStudentId(recordId),
|
|
|
- ExamRecordCacheUtil.getStatus(recordId)));
|
|
|
+ boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_EXAM_STATUS_PREFIX + recordId,
|
|
|
+ SystemConstant.REDIS_LOCK_EXAM_STATUS_TIME_OUT);
|
|
|
+ if (lock) {
|
|
|
+ try {
|
|
|
+ // 更新考试记录缓存
|
|
|
+ Long firstStartTime = System.currentTimeMillis();
|
|
|
+ ExamRecordCacheUtil.setFirstStartTime(recordId, firstStartTime, false);
|
|
|
+ ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.ANSWERING, false);
|
|
|
+ Long lastStartTime = System.currentTimeMillis();
|
|
|
+ ExamRecordCacheUtil.setLastStartTime(recordId, lastStartTime, false);
|
|
|
+ String[] columns = new String[]{ExamRecordFieldEnum.first_start_time.name(),
|
|
|
+ ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_start_time.name()};
|
|
|
+ Object[] values = new Object[]{firstStartTime, ExamRecordStatusEnum.ANSWERING, lastStartTime};
|
|
|
+ toeExamRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
+ //更新场次-考试记录缓存
|
|
|
+ ExamActivityRecordCacheUtil.setExamRecordStatus(activityId, recordId,
|
|
|
+ new ExamActivityRecordCacheBean(ExamRecordCacheUtil.getExamStudentId(recordId),
|
|
|
+ ExamRecordCacheUtil.getStatus(recordId)));
|
|
|
+ } finally {
|
|
|
+ if (Objects.nonNull(recordId)) {
|
|
|
+ redisUtil.releaseLock(SystemConstant.REDIS_LOCK_EXAM_STATUS_PREFIX + recordId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_UPDATE_ERROR);
|
|
|
+ }
|
|
|
|
|
|
//非强制交卷,换算最终交卷时间并生成一次性延时任务
|
|
|
if (Objects.nonNull(exam.getForceFinish()) && exam.getForceFinish().intValue() == 0) {
|
|
@@ -851,17 +856,29 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
ret.setAudioLeftPlayCount(audioLeftPlayCounts);
|
|
|
}
|
|
|
|
|
|
- Long lastPrepareTime = System.currentTimeMillis();
|
|
|
- ExamRecordCacheUtil.setLastPrepareTime(recordId, lastPrepareTime, false);
|
|
|
- ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.RESUME_PREPARE, false);
|
|
|
- String[] columns = new String[] { ExamRecordFieldEnum.last_prepare_time.name(),
|
|
|
- ExamRecordFieldEnum.status.name() };
|
|
|
- Object[] values = new Object[] { lastPrepareTime, ExamRecordStatusEnum.RESUME_PREPARE };
|
|
|
- toeExamRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
- //更新场次-考试记录缓存
|
|
|
- ExamActivityRecordCacheUtil.setExamRecordStatus(es.getExamActivityId(), recordId,
|
|
|
- new ExamActivityRecordCacheBean(ExamRecordCacheUtil.getExamStudentId(recordId),
|
|
|
- ExamRecordCacheUtil.getStatus(recordId)));
|
|
|
+ boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_EXAM_STATUS_PREFIX + recordId,
|
|
|
+ SystemConstant.REDIS_LOCK_EXAM_STATUS_TIME_OUT);
|
|
|
+ if (lock) {
|
|
|
+ try {
|
|
|
+ Long lastPrepareTime = System.currentTimeMillis();
|
|
|
+ ExamRecordCacheUtil.setLastPrepareTime(recordId, lastPrepareTime, false);
|
|
|
+ ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.RESUME_PREPARE, false);
|
|
|
+ String[] columns = new String[]{ExamRecordFieldEnum.last_prepare_time.name(),
|
|
|
+ ExamRecordFieldEnum.status.name()};
|
|
|
+ Object[] values = new Object[]{lastPrepareTime, ExamRecordStatusEnum.RESUME_PREPARE};
|
|
|
+ toeExamRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
+ //更新场次-考试记录缓存
|
|
|
+ ExamActivityRecordCacheUtil.setExamRecordStatus(es.getExamActivityId(), recordId,
|
|
|
+ new ExamActivityRecordCacheBean(ExamRecordCacheUtil.getExamStudentId(recordId),
|
|
|
+ ExamRecordCacheUtil.getStatus(recordId)));
|
|
|
+ } finally {
|
|
|
+ if (Objects.nonNull(recordId)) {
|
|
|
+ redisUtil.releaseLock(SystemConstant.REDIS_LOCK_EXAM_STATUS_PREFIX + recordId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_UPDATE_ERROR);
|
|
|
+ }
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -911,7 +928,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
*/
|
|
|
@Override
|
|
|
public ExamFinishBean finish(Long studentId, Long recordId, String type, Integer durationSeconds) {
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_FINISH_EXXAM_PREFIX + recordId;
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_FINISH_EXAM_PREFIX + recordId;
|
|
|
Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
if (!lock) {
|
|
|
Date now = new Date();
|
|
@@ -1001,21 +1018,33 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
} else {
|
|
|
ret.setStatus(FinishExamResultEnum.NORMAL);
|
|
|
}
|
|
|
- Long finishTime = System.currentTimeMillis();
|
|
|
- ExamRecordCacheUtil.setFinishTime(recordId, finishTime, false);
|
|
|
- ExamRecordCacheUtil.setDurationSeconds(recordId, durationSeconds, false);
|
|
|
- ExamRecordCacheUtil.setFinishType(recordId, FinishTypeEnum.valueOf(type), false);
|
|
|
- ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.FINISHED, false);
|
|
|
- String[] columns = new String[] { ExamRecordFieldEnum.finish_time.name(),
|
|
|
- ExamRecordFieldEnum.duration_seconds.name(), ExamRecordFieldEnum.finish_type.name(),
|
|
|
- ExamRecordFieldEnum.status.name() };
|
|
|
- Object[] values = new Object[] { finishTime, durationSeconds, FinishTypeEnum.valueOf(type),
|
|
|
- ExamRecordStatusEnum.FINISHED };
|
|
|
- toeExamRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
- //更新场次-考试记录缓存
|
|
|
- ExamActivityRecordCacheUtil.setExamRecordStatus(es.getExamActivityId(), recordId,
|
|
|
- new ExamActivityRecordCacheBean(ExamRecordCacheUtil.getExamStudentId(recordId),
|
|
|
- ExamRecordCacheUtil.getStatus(recordId)));
|
|
|
+ boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_EXAM_STATUS_PREFIX + recordId,
|
|
|
+ SystemConstant.REDIS_LOCK_EXAM_STATUS_TIME_OUT);
|
|
|
+ if (lock) {
|
|
|
+ try {
|
|
|
+ Long finishTime = System.currentTimeMillis();
|
|
|
+ ExamRecordCacheUtil.setFinishTime(recordId, finishTime, false);
|
|
|
+ ExamRecordCacheUtil.setDurationSeconds(recordId, durationSeconds, false);
|
|
|
+ ExamRecordCacheUtil.setFinishType(recordId, FinishTypeEnum.valueOf(type), false);
|
|
|
+ ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.FINISHED, false);
|
|
|
+ String[] columns = new String[]{ExamRecordFieldEnum.finish_time.name(),
|
|
|
+ ExamRecordFieldEnum.duration_seconds.name(), ExamRecordFieldEnum.finish_type.name(),
|
|
|
+ ExamRecordFieldEnum.status.name()};
|
|
|
+ Object[] values = new Object[]{finishTime, durationSeconds, FinishTypeEnum.valueOf(type),
|
|
|
+ ExamRecordStatusEnum.FINISHED};
|
|
|
+ toeExamRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
+ //更新场次-考试记录缓存
|
|
|
+ ExamActivityRecordCacheUtil.setExamRecordStatus(es.getExamActivityId(), recordId,
|
|
|
+ new ExamActivityRecordCacheBean(ExamRecordCacheUtil.getExamStudentId(recordId),
|
|
|
+ ExamRecordCacheUtil.getStatus(recordId)));
|
|
|
+ } finally {
|
|
|
+ if (Objects.nonNull(recordId)) {
|
|
|
+ redisUtil.releaseLock(SystemConstant.REDIS_LOCK_EXAM_STATUS_PREFIX + recordId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_UPDATE_ERROR);
|
|
|
+ }
|
|
|
//更新未完成考试记录id
|
|
|
TEStudentCacheDto teStudentCacheDto = (TEStudentCacheDto) redisUtil.getStudent(es.getStudentId());
|
|
|
ExamingDataCacheUtil.deleteUnFinishedRecordId(studentId);
|