ソースを参照

先缓存删除后无法持久化的BUG

wangliang 2 年 前
コミット
4e4f96d6e1

+ 8 - 11
themis-business/src/main/java/com/qmth/themis/business/service/impl/CommonServiceImpl.java

@@ -7,6 +7,7 @@ import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.entity.TOeExamBreakHistory;
+import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
 import com.qmth.themis.business.service.CommonService;
@@ -69,21 +70,17 @@ public class CommonServiceImpl implements CommonService {
 
         try {
             ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(recordId);
+            Double score = ExamRecordCacheUtil.getObjectiveScore(recordId);
             if (Objects.isNull(status)) {
-                if (Objects.equals(recordId, ExamingDataCacheUtil.getUnFinishedRecordId(studentId))) {
-                    ExamingDataCacheUtil.deleteUnFinishedRecordId(studentId);
-                }
-                if (Objects.equals(recordId, ExamingDataCacheUtil.getExamingRecordId(studentId))) {
-                    ExamingDataCacheUtil.deleteExamingRecordId(studentId);
-                }
-                return;
+                TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
+                status = tOeExamRecord.getStatus();
+                score = tOeExamRecord.getObjectiveScore();
             }
-            if (!ExamRecordStatusEnum.FINISHED.equals(status)) {
-                log.info("status error ,status:" + status.name() + " recordId:" + recordId);
+            if (Objects.isNull(status) || !ExamRecordStatusEnum.FINISHED.equals(status)) {
+                log.info("status error ,status:" + status + " recordId:" + recordId);
                 return;
             }
-            Double score = ExamRecordCacheUtil.getObjectiveScore(recordId);
-            if (score == null) {
+            if (Objects.isNull(score)) {
                 log.info("score is null ,recordId:" + recordId);
                 //算分未完成的 发送10秒延迟消息
                 Map<String, Object> propMap = mqDtoService.buildMqDelayMsg("10s");

+ 46 - 40
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -19,7 +19,6 @@ import com.qmth.themis.business.dao.TOeExamRecordMapper;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.response.MarkResultDto;
 import com.qmth.themis.business.dto.response.TEStudentMonitorRecordDto;
-import com.qmth.themis.business.entity.TEExamStudent;
 import com.qmth.themis.business.entity.TOeExamAnswer;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.entity.TSyncExamStudentScore;
@@ -30,7 +29,6 @@ import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.FileUtil;
-import com.qmth.themis.common.util.GsonUtil;
 import com.qmth.themis.common.util.IpUtil;
 import com.qmth.themis.common.util.SimpleBeanUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -382,45 +380,50 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
                     .get(RedisKeyHelper.studentPaperStructKey(recordId));
 
             //保存考试记录
+            TOeExamRecord er = null;
             Map<String, Object> record = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
-            Object o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.status.getCode());
-            if (Objects.nonNull(o) && o instanceof ExamStatusBean) {
-                record.put(ExamRecordFieldEnum.status.getCode(), ((ExamStatusBean) o).getExamRecordStatusEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.client_websocket_status.getCode());
-            if (Objects.nonNull(o) && o instanceof ClientWebsocketStatusBean) {
-                record.put(ExamRecordFieldEnum.client_websocket_status.getCode(), ((ClientWebsocketStatusBean) o).getWebsocketStatusEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_websocket_status.getCode());
-            if (Objects.nonNull(o) && o instanceof MobileWebsocketStatusBean) {
-                record.put(ExamRecordFieldEnum.mobile_first_websocket_status.getCode(), ((MobileWebsocketStatusBean) o).getWebsocketStatusEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_websocket_status.getCode());
-            if (Objects.nonNull(o) && o instanceof MobileWebsocketStatusBean) {
-                record.put(ExamRecordFieldEnum.mobile_second_websocket_status.getCode(), ((MobileWebsocketStatusBean) o).getWebsocketStatusEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.camera_monitor_status.getCode());
-            if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
-                record.put(ExamRecordFieldEnum.camera_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.screen_monitor_status.getCode());
-            if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
-                record.put(ExamRecordFieldEnum.screen_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_monitor_status.getCode());
-            if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
-                record.put(ExamRecordFieldEnum.mobile_first_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_monitor_status.getCode());
-            if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
-                record.put(ExamRecordFieldEnum.mobile_second_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
-            }
-            o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.breach_status.getCode());
-            if (Objects.nonNull(o) && o instanceof BreachStatusBean) {
-                record.put(ExamRecordFieldEnum.breach_status.getCode(), ((BreachStatusBean) o).getStatus());
+            if (!CollectionUtils.isEmpty(record)) {
+                Object o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.status.getCode());
+                if (Objects.nonNull(o) && o instanceof ExamStatusBean) {
+                    record.put(ExamRecordFieldEnum.status.getCode(), ((ExamStatusBean) o).getExamRecordStatusEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.client_websocket_status.getCode());
+                if (Objects.nonNull(o) && o instanceof ClientWebsocketStatusBean) {
+                    record.put(ExamRecordFieldEnum.client_websocket_status.getCode(), ((ClientWebsocketStatusBean) o).getWebsocketStatusEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_websocket_status.getCode());
+                if (Objects.nonNull(o) && o instanceof MobileWebsocketStatusBean) {
+                    record.put(ExamRecordFieldEnum.mobile_first_websocket_status.getCode(), ((MobileWebsocketStatusBean) o).getWebsocketStatusEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_websocket_status.getCode());
+                if (Objects.nonNull(o) && o instanceof MobileWebsocketStatusBean) {
+                    record.put(ExamRecordFieldEnum.mobile_second_websocket_status.getCode(), ((MobileWebsocketStatusBean) o).getWebsocketStatusEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.camera_monitor_status.getCode());
+                if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
+                    record.put(ExamRecordFieldEnum.camera_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.screen_monitor_status.getCode());
+                if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
+                    record.put(ExamRecordFieldEnum.screen_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_monitor_status.getCode());
+                if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
+                    record.put(ExamRecordFieldEnum.mobile_first_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_monitor_status.getCode());
+                if (Objects.nonNull(o) && o instanceof MonitorStatusBean) {
+                    record.put(ExamRecordFieldEnum.mobile_second_monitor_status.getCode(), ((MonitorStatusBean) o).getMonitorStatusSourceEnum());
+                }
+                o = redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.breach_status.getCode());
+                if (Objects.nonNull(o) && o instanceof BreachStatusBean) {
+                    record.put(ExamRecordFieldEnum.breach_status.getCode(), ((BreachStatusBean) o).getStatus());
+                }
+                Gson gson = new Gson();
+                er = gson.fromJson(gson.toJson(record), TOeExamRecord.class);
+            }else{
+                er = SystemConstant.getExamRecord(recordId);
             }
-            Gson gson = new Gson();
-            TOeExamRecord er = gson.fromJson(gson.toJson(record), TOeExamRecord.class);
             er.setStatus(ExamRecordStatusEnum.PERSISTED);
             er.setUpdateTime(System.currentTimeMillis());
             if (struct != null) {
@@ -428,6 +431,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             }
             er.setPaperStructUpload(1);
             saveOrUpdate(er);
+
             //保存作答
             Map<String, ExamStudentAnswerCacheBean> answerMap = redisUtil
                     .getHashEntries(RedisKeyHelper.examAnswerKey(recordId));
@@ -443,7 +447,9 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
                 examAnswerService.saveOrUpdateBatch(tOeExamAnswerList);
             }
             //更新考生信息
-            teExamStudentService.updateExamStudentByCache(er.getExamStudentId());
+            if (Objects.nonNull(er)) {
+                teExamStudentService.updateExamStudentByCache(er.getExamStudentId());
+            }
             //上传个人试卷结构
             if (struct != null) {
                 ossUtil.upload(false, structFilePath, struct.getContent());