Эх сурвалжийг харах

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

wangliang 2 жил өмнө
parent
commit
b26f7ad942

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

@@ -593,4 +593,15 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
      * @return
      */
     TOeExamRecord getCacheExamRecord(Long recordId);
+
+    /**
+     * 从数据库查询考试记录
+     *
+     * @param examId
+     * @param activityId
+     * @param examStudentId
+     * @param examRecordStatusEnum
+     * @return
+     */
+    TOeExamRecord getExamRecordForDb(Long examId, Long activityId, Long examStudentId, ExamRecordStatusEnum examRecordStatusEnum);
 }

+ 4 - 6
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -4,7 +4,6 @@ import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.common.utils.BinaryUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -255,12 +254,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         TOeExamRecord tOeExamRecord = null;
         if (Objects.nonNull(currentRecordId)) {
             tOeExamRecord = toeExamRecordService.getCacheExamRecord(currentRecordId);
+            if (Objects.isNull(tOeExamRecord)) {
+                tOeExamRecord = toeExamRecordService.getExamRecordForDb(examId, activityId, examStudentId, ExamRecordStatusEnum.FIRST_PREPARE);
+            }
         } 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);
+            tOeExamRecord = toeExamRecordService.getExamRecordForDb(examId, activityId, examStudentId, ExamRecordStatusEnum.FIRST_PREPARE);
         }
         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);

+ 19 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -474,6 +474,25 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         return er;
     }
 
+    /**
+     * 从数据库查询考试记录
+     *
+     * @param examId
+     * @param activityId
+     * @param examStudentId
+     * @param examRecordStatusEnum
+     * @return
+     */
+    @Override
+    public TOeExamRecord getExamRecordForDb(Long examId, Long activityId, Long examStudentId, ExamRecordStatusEnum examRecordStatusEnum) {
+        QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+        tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamId, examId)
+                .eq(TOeExamRecord::getExamActivityId, activityId)
+                .eq(TOeExamRecord::getExamStudentId, examStudentId)
+                .eq(TOeExamRecord::getStatus, examRecordStatusEnum);
+        return this.getOne(tOeExamRecordQueryWrapper);
+    }
+
     @Override
     public void saveFaceVerify(ExamTypeEnum type, Long recordId, Long entryAuthenticationId,
                                VerifyExceptionEnum entryAuthenticationResult) {