Browse Source

新增mobile websocket状态和id

wangliang 4 years ago
parent
commit
fc876f6b14

+ 43 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/status/MobileWebsocketStatusBean.java

@@ -0,0 +1,43 @@
+package com.qmth.themis.business.bean.status;
+
+import com.qmth.themis.business.enums.WebsocketStatusEnum;
+
+import java.io.Serializable;
+
+/**
+ * @Description: mobile websocket状态bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/11/25
+ */
+public class MobileWebsocketStatusBean implements Serializable {
+
+    WebsocketStatusEnum websocketStatusEnum;
+    Long timestamp;//时间戳
+
+    public MobileWebsocketStatusBean() {
+
+    }
+
+    public MobileWebsocketStatusBean(WebsocketStatusEnum websocketStatusEnum, Long timestamp) {
+        this.websocketStatusEnum = websocketStatusEnum;
+        this.timestamp = timestamp;
+    }
+
+    public WebsocketStatusEnum getWebsocketStatusEnum() {
+        return websocketStatusEnum;
+    }
+
+    public void setWebsocketStatusEnum(WebsocketStatusEnum websocketStatusEnum) {
+        this.websocketStatusEnum = websocketStatusEnum;
+    }
+
+    public Long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Long timestamp) {
+        this.timestamp = timestamp;
+    }
+}

+ 69 - 8
themis-business/src/main/java/com/qmth/themis/business/cache/ExamRecordCacheUtil.java

@@ -1,9 +1,6 @@
 package com.qmth.themis.business.cache;
 
-import com.qmth.themis.business.bean.status.ClientWebsocketStatusBean;
-import com.qmth.themis.business.bean.status.ExamStatusBean;
-import com.qmth.themis.business.bean.status.MonitorCallStatusBean;
-import com.qmth.themis.business.bean.status.MonitorStatusBean;
+import com.qmth.themis.business.bean.status.*;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.constant.SpringContextHolder;
@@ -296,6 +293,32 @@ public class ExamRecordCacheUtil {
         }
     }
 
+    public static MobileWebsocketStatusBean getMobileFirstWebsocketStatusBean(Long recordId) {
+        return Objects.nonNull(redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_websocket_status.getCode())) ? (MobileWebsocketStatusBean) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_websocket_status.getCode()) : null;
+    }
+
+    public static WebsocketStatusEnum getMobileFirstWebsocketStatus(Long recordId) {
+        MobileWebsocketStatusBean mobileFirstWebsocketStatusBean = getMobileFirstWebsocketStatusBean(recordId);
+        if (Objects.isNull(mobileFirstWebsocketStatusBean)) {
+            return null;
+        } else {
+            return mobileFirstWebsocketStatusBean.getWebsocketStatusEnum();
+        }
+    }
+
+    public static MobileWebsocketStatusBean getMobileSecondWebsocketStatusBean(Long recordId) {
+        return Objects.nonNull(redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_websocket_status.getCode())) ? (MobileWebsocketStatusBean) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_websocket_status.getCode()) : null;
+    }
+
+    public static WebsocketStatusEnum getMobileSecondWebsocketStatus(Long recordId) {
+        MobileWebsocketStatusBean mobileSecondWebsocketStatusBean = getMobileSecondWebsocketStatusBean(recordId);
+        if (Objects.isNull(mobileSecondWebsocketStatusBean)) {
+            return null;
+        } else {
+            return mobileSecondWebsocketStatusBean.getWebsocketStatusEnum();
+        }
+    }
+
     public static ClientWebsocketStatusBean getClientWebsocketStatusBean(Long recordId) {
         return Objects.nonNull(redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.client_websocket_status.getCode())) ? (ClientWebsocketStatusBean) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.client_websocket_status.getCode()) : null;
     }
@@ -313,8 +336,12 @@ public class ExamRecordCacheUtil {
         return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.client_websocket_id.getCode());
     }
 
-    public static String getMobileWebsocketId(Long recordId, MonitorVideoSourceEnum monitorVideoSourceEnum) {
-        return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_websocket_id.getCode() + "_" + monitorVideoSourceEnum.name());
+    public static String getMobileFirstWebsocketId(Long recordId) {
+        return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_websocket_id.getCode());
+    }
+
+    public static String getMobileSecondWebsocketId(Long recordId) {
+        return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_websocket_id.getCode());
     }
 
     public static void setClientWebsocketStatus(Long recordId, WebsocketStatusEnum websocketStatusEnum, Long timestamp) {
@@ -340,8 +367,42 @@ public class ExamRecordCacheUtil {
         redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.client_websocket_id.getCode(), id);
     }
 
-    public static void setMobileWebsocketId(Long recordId, String id, MonitorVideoSourceEnum monitorVideoSourceEnum) {
-        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_websocket_id.getCode() + "_" + monitorVideoSourceEnum.name(), id);
+    public static void setMobileFirstWebsocketId(Long recordId, String id) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_websocket_id.getCode(), id);
+    }
+
+    public static void setMobileSecondWebsocketId(Long recordId, String id) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_websocket_id.getCode(), id);
+    }
+
+    public static void setMobileFirstWebsocketStatus(Long recordId, WebsocketStatusEnum websocketStatusEnum, Long timestamp) {
+        MobileWebsocketStatusBean mobileFirstWebsocketStatusBean = getMobileFirstWebsocketStatusBean(recordId);
+        if (Objects.isNull(mobileFirstWebsocketStatusBean)) {
+            mobileFirstWebsocketStatusBean = new MobileWebsocketStatusBean(websocketStatusEnum, timestamp);
+        } else {
+            if (Objects.nonNull(mobileFirstWebsocketStatusBean.getTimestamp()) && mobileFirstWebsocketStatusBean.getTimestamp().longValue() < timestamp.longValue()) {
+                mobileFirstWebsocketStatusBean.setWebsocketStatusEnum(websocketStatusEnum);
+                mobileFirstWebsocketStatusBean.setTimestamp(timestamp);
+            }
+        }
+        if (Objects.nonNull(getStatus(recordId))) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_first_websocket_status.getCode(), mobileFirstWebsocketStatusBean);
+        }
+    }
+
+    public static void setMobileSecondWebsocketStatus(Long recordId, WebsocketStatusEnum websocketStatusEnum, Long timestamp) {
+        MobileWebsocketStatusBean mobileSecondWebsocketStatusBean = getMobileSecondWebsocketStatusBean(recordId);
+        if (Objects.isNull(mobileSecondWebsocketStatusBean)) {
+            mobileSecondWebsocketStatusBean = new MobileWebsocketStatusBean(websocketStatusEnum, timestamp);
+        } else {
+            if (Objects.nonNull(mobileSecondWebsocketStatusBean.getTimestamp()) && mobileSecondWebsocketStatusBean.getTimestamp().longValue() < timestamp.longValue()) {
+                mobileSecondWebsocketStatusBean.setWebsocketStatusEnum(websocketStatusEnum);
+                mobileSecondWebsocketStatusBean.setTimestamp(timestamp);
+            }
+        }
+        if (Objects.nonNull(getStatus(recordId))) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_second_websocket_status.getCode(), mobileSecondWebsocketStatusBean);
+        }
     }
 
     public static void setClientLastSyncTime(Long recordId, Long date) {

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

@@ -238,6 +238,54 @@ public class TOeExamRecord implements Serializable {
     @TableField(value = "monitor_video_source", updateStrategy = FieldStrategy.IGNORED)
     private String monitorVideoSource;
 
+    @ApiModelProperty(value = "移动端第一机位websocket状态")
+    @TableField(value = "mobile_first_websocket_status")
+    private WebsocketStatusEnum mobileFirstWebsocketStatus;
+
+    @ApiModelProperty(value = "移动端第一机位websocket连接标识")
+    @TableField(value = "mobile_first_websocket_id")
+    private String mobileFirstWebsocketId;
+
+    @ApiModelProperty(value = "移动端第二机位websocket状态")
+    @TableField(value = "mobile_second_websocket_status")
+    private WebsocketStatusEnum mobileSecondWebsocketStatus;
+
+    @ApiModelProperty(value = "移动端第二机位websocket连接标识")
+    @TableField(value = "mobile_second_websocket_id")
+    private String mobileSecondWebsocketId;
+
+    public WebsocketStatusEnum getMobileFirstWebsocketStatus() {
+        return mobileFirstWebsocketStatus;
+    }
+
+    public void setMobileFirstWebsocketStatus(WebsocketStatusEnum mobileFirstWebsocketStatus) {
+        this.mobileFirstWebsocketStatus = mobileFirstWebsocketStatus;
+    }
+
+    public String getMobileFirstWebsocketId() {
+        return mobileFirstWebsocketId;
+    }
+
+    public void setMobileFirstWebsocketId(String mobileFirstWebsocketId) {
+        this.mobileFirstWebsocketId = mobileFirstWebsocketId;
+    }
+
+    public WebsocketStatusEnum getMobileSecondWebsocketStatus() {
+        return mobileSecondWebsocketStatus;
+    }
+
+    public void setMobileSecondWebsocketStatus(WebsocketStatusEnum mobileSecondWebsocketStatus) {
+        this.mobileSecondWebsocketStatus = mobileSecondWebsocketStatus;
+    }
+
+    public String getMobileSecondWebsocketId() {
+        return mobileSecondWebsocketId;
+    }
+
+    public void setMobileSecondWebsocketId(String mobileSecondWebsocketId) {
+        this.mobileSecondWebsocketId = mobileSecondWebsocketId;
+    }
+
     public Integer getCameraPhotoUpload() {
         return cameraPhotoUpload;
     }

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

@@ -113,7 +113,15 @@ public enum ExamRecordFieldEnum {
 
     monitor_video_source("monitorVideoSource"),
 
-    mobile_websocket_id("mobileWebsocketId");
+    mobile_websocket_id("mobileWebsocketId"),
+
+    mobile_first_websocket_status("mobileFirstWebsocketStatus"),
+
+    mobile_first_websocket_id("mobileFirstWebsocketId"),
+
+    mobile_second_websocket_status("mobileSecondWebsocketStatus"),
+
+    mobile_second_websocket_id("mobileSecondWebsocketId");
 
     private String code;
 

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

@@ -540,6 +540,10 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             VerifyExceptionEnum verifyExceptionEnum = ExamRecordCacheUtil.getEntryAuthenticationResult(recordId);
             Long entryAuthenticationId = ExamRecordCacheUtil.getEntryAuthenticationId(recordId);
             ScoreStatusEnum scoreStatusEnum = ExamRecordCacheUtil.getScoreStatus(recordId);
+            String mobileFirstWebsocketId = ExamRecordCacheUtil.getMobileFirstWebsocketId(recordId);
+            WebsocketStatusEnum mobileFirstWebsocketStatus = ExamRecordCacheUtil.getMobileFirstWebsocketStatus(recordId);
+            String mobileSecondWebsocketId = ExamRecordCacheUtil.getMobileSecondWebsocketId(recordId);
+            WebsocketStatusEnum mobileSecondWebsocketStatus = ExamRecordCacheUtil.getMobileSecondWebsocketStatus(recordId);
 
             TOeExamRecord er = new TOeExamRecord();
             er.setId(recordId);
@@ -558,6 +562,10 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             er.setClientWebsocketStatus(websocketStatusEnum);
             er.setClientWebsocketId(clientWebsocketId);
             er.setClientLastSyncTime(clientLastSyncTime);
+            er.setMobileFirstWebsocketId(mobileFirstWebsocketId);
+            er.setMobileFirstWebsocketStatus(mobileFirstWebsocketStatus);
+            er.setMobileSecondWebsocketId(mobileSecondWebsocketId);
+            er.setMobileSecondWebsocketStatus(mobileSecondWebsocketStatus);
             er.setAnswerProgress(answerProgress);
             er.setDurationSeconds(durationSeconds);
             er.setFinishTime(finishTime);

+ 30 - 3
themis-business/src/main/java/com/qmth/themis/business/util/WebsocketUtil.java

@@ -2,11 +2,8 @@ package com.qmth.themis.business.util;
 
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.constant.SpringContextHolder;
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.WebsocketStatusEnum;
 import com.qmth.themis.business.service.TOeExamRecordService;
-import com.qmth.themis.common.enums.ExceptionResultEnum;
-import com.qmth.themis.common.exception.BusinessException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -69,6 +66,36 @@ public class WebsocketUtil {
         tOeExamRecordService.sendExamRecordDataSaveMq(recordId, timestamp);
     }
 
+    /**
+     * 更新mobile first websocket状态
+     *
+     * @param recordId
+     * @param websocketSessionId
+     * @param websocketStatusEnum
+     */
+    public static void updateExamRecordMobileFirstWebsocketStatus(Long recordId, String websocketSessionId, WebsocketStatusEnum websocketStatusEnum) {
+        Long timestamp = System.currentTimeMillis();
+        ExamRecordCacheUtil.setMobileFirstWebsocketStatus(recordId, websocketStatusEnum, timestamp);
+        ExamRecordCacheUtil.setMobileFirstWebsocketId(recordId, websocketSessionId);
+        TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
+        tOeExamRecordService.sendExamRecordDataSaveMq(recordId, timestamp);
+    }
+
+    /**
+     * 更新mobile second websocket状态
+     *
+     * @param recordId
+     * @param websocketSessionId
+     * @param websocketStatusEnum
+     */
+    public static void updateExamRecordMobileSecondWebsocketStatus(Long recordId, String websocketSessionId, WebsocketStatusEnum websocketStatusEnum) {
+        Long timestamp = System.currentTimeMillis();
+        ExamRecordCacheUtil.setMobileSecondWebsocketStatus(recordId, websocketStatusEnum, timestamp);
+        ExamRecordCacheUtil.setMobileSecondWebsocketId(recordId, websocketSessionId);
+        TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
+        tOeExamRecordService.sendExamRecordDataSaveMq(recordId, timestamp);
+    }
+
     /**
      * 初始化websocket
      *

+ 2 - 2
themis-exam/src/main/java/com/qmth/themis/exam/listener/service/impl/MqOeLogicServiceImpl.java

@@ -259,7 +259,7 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
         if (Objects.equals(MqTagEnum.EXAM_STOP.name(), tag)//考试退出
                 || Objects.equals(MqTagEnum.EXAM_START.name(), tag)) {//考试开始
             Long recordId = Long.parseLong(String.valueOf(mqDto.getBody()));
-            String mobileWebsocketId = ExamRecordCacheUtil.getMobileWebsocketId(recordId, MonitorVideoSourceEnum.MOBILE_FIRST);
+            String mobileWebsocketId = ExamRecordCacheUtil.getMobileFirstWebsocketId(recordId);
             if (Objects.nonNull(mobileWebsocketId) && Objects.nonNull(webSocketMap.get(mobileWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_FIRST.name()))) {
                 WebSocketMobileServer webSocketMobileServer = webSocketMap.get(mobileWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_FIRST.name());
                 ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
@@ -284,7 +284,7 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     webSocketMobileServer.sendMessage(websocketDto);
                 }
             }
-            mobileWebsocketId = ExamRecordCacheUtil.getMobileWebsocketId(recordId, MonitorVideoSourceEnum.MOBILE_SECOND);
+            mobileWebsocketId = ExamRecordCacheUtil.getMobileSecondWebsocketId(recordId);
             if (Objects.nonNull(mobileWebsocketId) && Objects.nonNull(webSocketMap.get(mobileWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_SECOND.name()))) {
                 WebSocketMobileServer webSocketMobileServer = webSocketMap.get(mobileWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_SECOND.name());
                 ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);

+ 11 - 5
themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketMobileServer.java

@@ -8,10 +8,7 @@ import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.entity.TBSession;
-import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
-import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
-import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.WebsocketTypeEnum;
+import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.business.util.*;
@@ -94,7 +91,6 @@ public class WebSocketMobileServer implements Concurrently {
         session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
         this.sessionId = tbSession.getId();
         this.websocketSessionId = String.valueOf(UidUtil.nextId());
-        ExamRecordCacheUtil.setMobileWebsocketId(this.recordId, this.websocketSessionId, this.source);
         if (webSocketMap.containsKey(this.websocketSessionId + "-" + this.source.name())) {
             webSocketMap.remove(this.websocketSessionId + "-" + this.source.name());
             webSocketMap.put(this.websocketSessionId + "-" + this.source.name(), this);
@@ -107,6 +103,11 @@ public class WebSocketMobileServer implements Concurrently {
         InetSocketAddress addr = (InetSocketAddress) WebsocketUtil.getFieldInstance(this.session.getAsyncRemote(), "base#socketWrapper#socket#sc#remoteAddress");
         this.ip = addr.toString().replace("/", "").split(":")[0];
         log.info("ip[:{}]连接成功", this.ip);
+        if (this.source == MonitorVideoSourceEnum.MOBILE_FIRST) {
+            WebsocketUtil.updateExamRecordMobileFirstWebsocketStatus(this.recordId, this.websocketSessionId, WebsocketStatusEnum.ON_LINE);
+        } else if (this.source == MonitorVideoSourceEnum.MOBILE_SECOND) {
+            WebsocketUtil.updateExamRecordMobileSecondWebsocketStatus(this.recordId, this.websocketSessionId, WebsocketStatusEnum.ON_LINE);
+        }
         this.updateTime = System.currentTimeMillis();
         tranMap = WebsocketUtil.initWebsocket(recordId, null, deviceId, ip, updateTime);
     }
@@ -124,6 +125,11 @@ public class WebSocketMobileServer implements Concurrently {
             //判断是否是正常退出
             Long timestamp = System.currentTimeMillis();
             ExamRecordCacheUtil.setMonitorStatus(this.recordId, this.source, MonitorStatusSourceEnum.STOP, timestamp);
+            if (this.source == MonitorVideoSourceEnum.MOBILE_FIRST) {
+                ExamRecordCacheUtil.setMobileFirstWebsocketStatus(this.recordId, WebsocketStatusEnum.OFF_LINE, timestamp);
+            } else if (this.source == MonitorVideoSourceEnum.MOBILE_SECOND) {
+                ExamRecordCacheUtil.setMobileSecondWebsocketStatus(this.recordId, WebsocketStatusEnum.OFF_LINE, timestamp);
+            }
             TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
             tOeExamRecordService.sendExamRecordDataSaveMq(this.recordId, timestamp);
             MqUtil mqUtil = SpringContextHolder.getBean(MqUtil.class);