Browse Source

修复FIRST_PREPARE状态下并发数量大时优先从缓存里取考试记录

wangliang 2 years ago
parent
commit
c5f2f11073

+ 8 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TOeExamRecordService.java

@@ -585,4 +585,12 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
      * @return
      */
     List<MapDataCountBean> mapDataCount();
+
+    /**
+     * 从缓存里获取考试记录
+     *
+     * @param recordId
+     * @return
+     */
+    TOeExamRecord getCacheExamRecord(Long recordId);
 }

+ 12 - 5
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -248,13 +248,20 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             throw new BusinessException(ExceptionResultEnum.EXAM_RECORD_UNFINISHED);
         }
         checkIp(examCache);
+
         Long activityId = es.getExamActivityId();
         Long examId = es.getExamId();
-        QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
-        tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamId, examId)
-                .eq(TOeExamRecord::getExamActivityId, activityId).eq(TOeExamRecord::getExamStudentId, examStudentId)
-                .eq(TOeExamRecord::getStatus, ExamRecordStatusEnum.FIRST_PREPARE);
-        TOeExamRecord tOeExamRecord = toeExamRecordService.getOne(tOeExamRecordQueryWrapper);
+        Long currentRecordId = es.getCurrentRecordId();
+        TOeExamRecord tOeExamRecord = null;
+        if (Objects.nonNull(currentRecordId)) {
+            tOeExamRecord = toeExamRecordService.getCacheExamRecord(currentRecordId);
+        } else {
+            QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+            tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamId, examId)
+                    .eq(TOeExamRecord::getExamActivityId, activityId).eq(TOeExamRecord::getExamStudentId, examStudentId)
+                    .eq(TOeExamRecord::getStatus, ExamRecordStatusEnum.FIRST_PREPARE);
+            tOeExamRecord = toeExamRecordService.getOne(tOeExamRecordQueryWrapper);
+        }
         if (Objects.nonNull(tOeExamRecord) && Objects.nonNull(tOeExamRecord.getStatus()) && (ExamRecordStatusEnum.FINISHED == tOeExamRecord.getStatus() || ExamRecordStatusEnum.PERSISTED == tOeExamRecord.getStatus() || tOeExamRecord.getStatus() == ExamRecordStatusEnum.JUNK)) {
             throw new BusinessException(ExceptionResultEnum.EXAM_FINISH);
         }

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -428,7 +428,8 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
      * @param recordId
      * @return
      */
-    private TOeExamRecord getCacheExamRecord(Long recordId) {
+    @Override
+    public TOeExamRecord getCacheExamRecord(Long recordId) {
         TOeExamRecord er = null;
         Map<String, Object> record = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
         if (!CollectionUtils.isEmpty(record)) {