فهرست منبع

新增考试记录更新时间和违纪状态更新时间

wangliang 3 سال پیش
والد
کامیت
2c496ae971

+ 6 - 4
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateController.java

@@ -509,8 +509,9 @@ public class TIeInvigilateController {
                     teExamBreachLog.setCreateId(tbUser.getId());
                     finalTeExamBreachLogList.add(teExamBreachLog);
                     if (Objects.nonNull(ExamRecordCacheUtil.getId(l))) {
-                        ExamRecordCacheUtil.setBreachStatus(l, status);
-                        tOeExamRecordService.sendExamRecordDataSaveMq(l, System.currentTimeMillis());
+                        Long timestamp = System.currentTimeMillis();
+                        ExamRecordCacheUtil.setBreachStatus(l, status, timestamp);
+                        tOeExamRecordService.sendExamRecordDataSaveMq(l, timestamp);
                     } else {
                         tOeExamRecord.setBreachStatus(status);
                         tOeExamRecordList.add(tOeExamRecord);
@@ -533,8 +534,9 @@ public class TIeInvigilateController {
                         tOeExamRecord.setBreachStatus(status);
                         tOeExamRecordList.add(tOeExamRecord);
                     } else {
-                        ExamRecordCacheUtil.setBreachStatus(s.getExamRecordId(), status);
-                        tOeExamRecordService.sendExamRecordDataSaveMq(s.getExamRecordId(), System.currentTimeMillis());
+                        Long timestamp = System.currentTimeMillis();
+                        ExamRecordCacheUtil.setBreachStatus(s.getExamRecordId(), status, timestamp);
+                        tOeExamRecordService.sendExamRecordDataSaveMq(s.getExamRecordId(), timestamp);
                     }
                 });
             }

+ 41 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/status/BreachStatusBean.java

@@ -0,0 +1,41 @@
+package com.qmth.themis.business.bean.status;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 违纪状态bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/5
+ */
+public class BreachStatusBean implements Serializable {
+
+    Integer status;
+    Long timestamp;//时间戳
+
+    public BreachStatusBean() {
+
+    }
+
+    public BreachStatusBean(Integer status, Long timestamp) {
+        this.status = status;
+        this.timestamp = timestamp;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Long timestamp) {
+        this.timestamp = timestamp;
+    }
+}

+ 44 - 12
themis-business/src/main/java/com/qmth/themis/business/cache/ExamRecordCacheUtil.java

@@ -261,6 +261,14 @@ public class ExamRecordCacheUtil {
                 null;
     }
 
+    public static BreachStatusBean getBreachStatusBean(Long recordId) {
+        return Objects.nonNull(
+                redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.breach_status.getCode())) ?
+                (BreachStatusBean) redisUtil
+                        .get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.breach_status.getCode()) :
+                null;
+    }
+
     public static ExamRecordStatusEnum getStatus(Long recordId) {
         ExamStatusBean examStatusBean = getStatusBean(recordId);
         if (Objects.isNull(examStatusBean) || Objects.isNull(examStatusBean.getExamRecordStatusEnum())) {
@@ -304,16 +312,27 @@ public class ExamRecordCacheUtil {
                 .get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_count.getCode());
     }
 
-    public static void setBreachStatus(Long recordId, Integer breachStatus) {
-        if (Objects.nonNull(getId(recordId))) {
-            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.breach_status.getCode(),
-                    breachStatus);
+    public static void setBreachStatus(Long recordId, Integer breachStatus, Long timestamp) {
+        BreachStatusBean breachStatusBean = getBreachStatusBean(recordId);
+        if (Objects.isNull(breachStatusBean)) {
+            breachStatusBean = new BreachStatusBean(breachStatus, timestamp);
+        } else {
+            if (Objects.nonNull(breachStatusBean.getTimestamp()) && breachStatusBean.getTimestamp().longValue() < timestamp
+                    .longValue()) {
+                breachStatusBean.setStatus(breachStatus);
+                breachStatusBean.setTimestamp(timestamp);
+            }
         }
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.breach_status.getCode(), breachStatusBean);
     }
 
     public static Integer getBreachStatus(Long recordId) {
-        return (Integer) redisUtil
-                .get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.breach_status.getCode());
+        BreachStatusBean breachStatusBean = getBreachStatusBean(recordId);
+        if (Objects.isNull(breachStatusBean) || Objects.isNull(breachStatusBean.getStatus())) {
+            return null;
+        } else {
+            return breachStatusBean.getStatus();
+        }
     }
 
     public static void setInProcessLivenessVerifyCount(Long recordId, Integer inProcessLivenessVerifyCount) {
@@ -363,7 +382,7 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setMonitorStatus(Long recordId, MonitorVideoSourceEnum source,
-            MonitorStatusSourceEnum statusSourceEnum, Long timestamp) {
+                                        MonitorStatusSourceEnum statusSourceEnum, Long timestamp) {
         MonitorStatusBean monitorStatusBean = getMonitorStatusBean(recordId, source);
         if (Objects.isNull(monitorStatusBean)) {
             monitorStatusBean = new MonitorStatusBean(statusSourceEnum, timestamp);
@@ -398,7 +417,7 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setMonitorCallStatus(Long recordId, MonitorVideoSourceEnum source,
-            MonitorCallStatusSourceEnum callStatusSourceEnum, Long timestamp) {
+                                            MonitorCallStatusSourceEnum callStatusSourceEnum, Long timestamp) {
         MonitorCallStatusBean monitorCallStatusBean = getMonitorCallStatusBean(recordId, source);
         if (Objects.isNull(monitorCallStatusBean)) {
             monitorCallStatusBean = new MonitorCallStatusBean(callStatusSourceEnum, timestamp);
@@ -492,7 +511,7 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setClientWebsocketStatus(Long recordId, WebsocketStatusEnum websocketStatusEnum,
-            Long timestamp) {
+                                                Long timestamp) {
         ClientWebsocketStatusBean clientWebsocketStatusBean = getClientWebsocketStatusBean(recordId);
         if (Objects.isNull(clientWebsocketStatusBean)) {
             clientWebsocketStatusBean = new ClientWebsocketStatusBean(websocketStatusEnum, timestamp);
@@ -539,7 +558,7 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setMobileWebsocketStatus(Long record, MonitorVideoSourceEnum source, WebsocketStatusEnum status,
-            Long timestamp) {
+                                                Long timestamp) {
         if (MonitorVideoSourceEnum.MOBILE_FIRST.equals(source)) {
             setMobileFirstWebsocketStatus(record, status, timestamp);
         } else if (MonitorVideoSourceEnum.MOBILE_SECOND.equals(source)) {
@@ -548,7 +567,7 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setMobileFirstWebsocketStatus(Long recordId, WebsocketStatusEnum websocketStatusEnum,
-            Long timestamp) {
+                                                     Long timestamp) {
         MobileWebsocketStatusBean mobileFirstWebsocketStatusBean = getMobileFirstWebsocketStatusBean(recordId);
         if (Objects.isNull(mobileFirstWebsocketStatusBean)) {
             mobileFirstWebsocketStatusBean = new MobileWebsocketStatusBean(websocketStatusEnum, timestamp);
@@ -566,7 +585,7 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setMobileSecondWebsocketStatus(Long recordId, WebsocketStatusEnum websocketStatusEnum,
-            Long timestamp) {
+                                                      Long timestamp) {
         MobileWebsocketStatusBean mobileSecondWebsocketStatusBean = getMobileSecondWebsocketStatusBean(recordId);
         if (Objects.isNull(mobileSecondWebsocketStatusBean)) {
             mobileSecondWebsocketStatusBean = new MobileWebsocketStatusBean(websocketStatusEnum, timestamp);
@@ -995,6 +1014,19 @@ public class ExamRecordCacheUtil {
                 .get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.tencent_video_url.getCode());
     }
 
+    public static void setUpdateTime(Long recordId, Long date) {
+        if (Objects.nonNull(getId(recordId))) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.update_time.getCode(),
+                    date);
+        }
+    }
+
+    public static Long getUpdateTime(Long recordId) {
+        return (Long) redisUtil
+                .get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.update_time.getCode());
+    }
+
+
     /**
      * 更新考试记录缓存
      *

+ 11 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamRecord.java

@@ -277,6 +277,17 @@ public class TOeExamRecord implements Serializable {
     @ApiModelProperty(name = "转录视频地址")
     private String tencentVideoUrl;
 
+    @ApiModelProperty(value = "更新时间")
+    private Long updateTime;
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
     public String getTencentVideoUrl() {
         return tencentVideoUrl;
     }

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/enums/ExamRecordFieldEnum.java

@@ -133,7 +133,9 @@ public enum ExamRecordFieldEnum {
 
     monitor_record("monitorRecord"),
 
-    tencent_video_url("tencentVideoUrl");
+    tencent_video_url("tencentVideoUrl"),
+
+    update_time("updateTime"),;
 
     private String code;
 

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

@@ -68,8 +68,9 @@ public class TEExamBreachLogServiceImpl extends ServiceImpl<TEExamBreachLogMappe
                 TEExamBreachLog teExamBreachLog = new TEExamBreachLog(examId, examActivityId, l, examStudentId, type.name(), String.valueOf(mapParameter.get("description")), status);
                 teExamBreachLog.setCreateId(tbUser.getId());
                 finalTeExamBreachLogList.add(teExamBreachLog);
-                ExamRecordCacheUtil.setBreachStatus(l, 0);
-                tOeExamRecordService.sendExamRecordDataSaveMq(l, System.currentTimeMillis());
+                Long timestamp = System.currentTimeMillis();
+                ExamRecordCacheUtil.setBreachStatus(l, 0, timestamp);
+                tOeExamRecordService.sendExamRecordDataSaveMq(l, timestamp);
             }
         } else {//撤销违纪
             BreachCancelTypeEnum type = BreachCancelTypeEnum.valueOf(String.valueOf(mapParameter.get(SystemConstant.TYPE)));
@@ -82,8 +83,9 @@ public class TEExamBreachLogServiceImpl extends ServiceImpl<TEExamBreachLogMappe
                 s.setDescription(String.valueOf(mapParameter.get("description")));
                 s.setStatus(status);
                 s.setUpdateId(tbUser.getId());
-                ExamRecordCacheUtil.setBreachStatus(s.getExamRecordId(), 1);
-                tOeExamRecordService.sendExamRecordDataSaveMq(s.getExamRecordId(), System.currentTimeMillis());
+                Long timestamp = System.currentTimeMillis();
+                ExamRecordCacheUtil.setBreachStatus(s.getExamRecordId(), 1, timestamp);
+                tOeExamRecordService.sendExamRecordDataSaveMq(s.getExamRecordId(), timestamp);
             });
         }
     }

+ 9 - 4
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -8,10 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
 import com.qmth.themis.business.bean.admin.*;
-import com.qmth.themis.business.bean.status.ClientWebsocketStatusBean;
-import com.qmth.themis.business.bean.status.ExamStatusBean;
-import com.qmth.themis.business.bean.status.MobileWebsocketStatusBean;
-import com.qmth.themis.business.bean.status.MonitorStatusBean;
+import com.qmth.themis.business.bean.status.*;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.ExamingDataCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
@@ -465,9 +462,14 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             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();
             TOeExamRecord er = gson.fromJson(gson.toJson(record), TOeExamRecord.class);
             er.setStatus(ExamRecordStatusEnum.PERSISTED);
+            er.setUpdateTime(System.currentTimeMillis());
             if (struct != null) {
                 er.setPaperStructPath(structFilePath);
             }
@@ -589,6 +591,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             MonitorStatusSourceEnum screenMonitorStatus = ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_SCREEN);
             MonitorStatusSourceEnum mobileFirstMonitorStatus = ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_FIRST);
             MonitorStatusSourceEnum mobileSecondMonitorStatus = ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_SECOND);
+            Long updateTime = ExamRecordCacheUtil.getUpdateTime(recordId);
 
             TOeExamRecord er = new TOeExamRecord();
             er.setId(recordId);
@@ -651,6 +654,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             er.setScreenMonitorStatus(screenMonitorStatus);
             er.setMobileFirstMonitorStatus(mobileFirstMonitorStatus);
             er.setMobileSecondMonitorStatus(mobileSecondMonitorStatus);
+            er.setUpdateTime(updateTime);
             this.saveOrUpdate(er);
         }
     }
@@ -663,6 +667,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
      */
     @Override
     public void sendExamRecordDataSaveMq(Long recordId, Long timestamp) {
+        ExamRecordCacheUtil.setUpdateTime(recordId, timestamp);
         MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_RECORD_UPDATE.name(), recordId.toString(), timestamp);
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }

+ 5 - 1
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -702,7 +702,11 @@ public class MqLogicServiceImpl implements MqLogicService {
     @Transactional
     public void execMqRecordUpdateLogic(MqDto mqDto, String key) {
         Long recordId = Long.parseLong(mqDto.getObjId());
-        examRecordService.examRecordDataSave(recordId);
+        Long updateTime = ExamRecordCacheUtil.getUpdateTime(recordId);
+        if (Objects.isNull(updateTime) || (Objects.nonNull(updateTime) &&
+                mqDto.getTimestamp().longValue() >= updateTime.longValue())) {
+            examRecordService.examRecordDataSave(recordId);
+        }
         tmRocketMessageService.saveMqMessageSuccess(mqDto, key);
     }