Selaa lähdekoodia

Merge branch 'dev_v1.1.1' into release_v1.1.1
merge

wangliang 3 vuotta sitten
vanhempi
commit
b5e45e68f0

+ 2 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -89,6 +89,8 @@ public class SystemConstant {
     /**
      * 系统相关
      */
+    public static final String WEB_SOCKET_OE_SERVER = "webSocketOeServer";
+
     public static final String WEBSOCKET_CLOSE = "服务器端关闭";
 
     public static final String LOG_ERROR = "请求出错:";

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

@@ -58,6 +58,189 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
+    /**
+     * 强制离线交卷持久化逻辑
+     *
+     * @param s
+     * @param webSocketMap
+     * @param gson
+     * @param mqDto
+     * @param key
+     * @return
+     */
+    @Transactional
+    protected Map<String, Object> oeMonitorFinishLogicPersisted(Object s,
+                                                                ConcurrentHashMap<String, WebSocketOeServer> webSocketMap,
+                                                                Gson gson,
+                                                                MqDto mqDto,
+                                                                String key) {
+        Map<String, Object> map = null;
+        Long recordId = Long.parseLong(String.valueOf(s));
+        //获取考试记录的客户端websocketId
+        String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
+        if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
+            map = new HashMap<>();
+            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+            WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
+            ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
+            if ((Objects.nonNull(examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
+                    && Objects.nonNull(webSocketOeServer.getRecordId())
+                    && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
+                map.put("form", mqDto.getObjName());
+                map.put(SystemConstant.WEB_SOCKET_OE_SERVER, webSocketOeServer);
+                map.put(SystemConstant.RECORD_ID, recordId);
+                map.put(SystemConstant.MESSAGE, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
+                TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
+                teExamStudentLogService.save(teExamStudentLog);
+
+                mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                redisUtil.delete(key, mqDto.getId());
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 预警交卷持久化逻辑
+     *
+     * @param s
+     * @param webSocketMap
+     * @param gson
+     * @param mqDto
+     * @param key
+     * @return
+     */
+    @Transactional
+    protected Map<String, Object> oeWarningFinishLogicPersisted(Object s,
+                                                                ConcurrentHashMap<String, WebSocketOeServer> webSocketMap,
+                                                                Gson gson,
+                                                                MqDto mqDto,
+                                                                String key) {
+        Map<String, Object> map = null;
+        Long recordId = Long.parseLong(String.valueOf(s));
+        String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
+        if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
+            map = new HashMap<>();
+            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+            WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
+            ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
+            if ((Objects.nonNull(examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
+                    && Objects.nonNull(webSocketOeServer.getRecordId())
+                    && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
+                map.put(SystemConstant.WEB_SOCKET_OE_SERVER, webSocketOeServer);
+                map.put(SystemConstant.RECORD_ID, recordId);
+                map.put(SystemConstant.BREACH_STATUS, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
+                TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
+                teExamStudentLogService.save(teExamStudentLog);
+                mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                redisUtil.delete(key, mqDto.getId());
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 点对点消息持久化逻辑
+     *
+     * @param webSocketMap
+     * @param gson
+     * @param mqDto
+     * @param key
+     * @return
+     */
+    @Transactional
+    protected Map<String, Object> oeImClusteringLogicPersisted(ConcurrentHashMap<String, WebSocketOeServer> webSocketMap,
+                                                               Gson gson,
+                                                               MqDto mqDto,
+                                                               String key) {
+        Map<String, Object> map = null;
+        Long recordId = Long.parseLong(String.valueOf(mqDto.getBody()));
+        String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
+        if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
+            map = new HashMap<>();
+            Long examId = ExamRecordCacheUtil.getExamId(recordId);
+            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+            Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
+            WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
+            ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
+            if ((Objects.nonNull(examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
+                    && Objects.nonNull(webSocketOeServer.getRecordId())
+                    && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
+                Map<String, Object> prop = mqDto.getProperties();
+                map.put(SystemConstant.RECORD_ID, recordId);
+                map.put("from", mqDto.getObjName());
+                map.put(SystemConstant.WEB_SOCKET_OE_SERVER, webSocketOeServer);
+                map.put("type", prop.get("type"));
+                map.put("content", prop.get("content"));
+                TIeExamInvigilateNotice tIeExamInvigilateNotice = new TIeExamInvigilateNotice(examId, examActivityId, recordId, Long.parseLong(String.valueOf(prop.get("formUserId"))), examStudentId, MessageTypeEnum.valueOf(String.valueOf(prop.get("type")).toUpperCase()), String.valueOf(prop.get("content")));
+                tIeExamInvigilateNoticeService.saveOrUpdate(tIeExamInvigilateNotice);
+
+                mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                redisUtil.delete(key, mqDto.getId());
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 监考强制活体验证持久化逻辑
+     *
+     * @param webSocketMap
+     * @param gson
+     * @param mqDto
+     * @param key
+     * @return
+     */
+    protected Map<String, Object> oeLivenessVerifyLogicPersisted(ConcurrentHashMap<String, WebSocketOeServer> webSocketMap,
+                                                                 Gson gson,
+                                                                 MqDto mqDto,
+                                                                 String key) {
+        Map<String, Object> map = null;
+        Long recordId = Long.parseLong(String.valueOf(mqDto.getBody()));
+        String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
+        if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
+            map = new HashMap<>();
+            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+            WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
+            ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
+            if ((Objects.nonNull(examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
+                    && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
+                    && Objects.nonNull(webSocketOeServer.getRecordId())
+                    && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
+                map.put(SystemConstant.RECORD_ID, recordId);
+                map.put(SystemConstant.WEB_SOCKET_OE_SERVER, webSocketOeServer);
+                TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
+                teExamStudentLogService.save(teExamStudentLog);
+
+                mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                redisUtil.delete(key, mqDto.getId());
+            }
+        }
+        return map;
+    }
+
     /**
      * oe逻辑
      *
@@ -65,7 +248,6 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
      * @param key
      */
     @Override
-    @Transactional
     public void execMqOeLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException, IOException {
         Gson gson = new Gson();
         ConcurrentHashMap<String, WebSocketOeServer> webSocketMap = WebSocketOeServer.getWebSocketMap();
@@ -73,126 +255,40 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
         if (Objects.equals(MqTagEnum.OE_MONITOR_FINISH.name(), tag)) {//强制离线交卷
             Set examRecordId = JacksonUtil.readJson(String.valueOf(mqDto.getBody()), Set.class);
             examRecordId.forEach(s -> {
-                Long recordId = Long.parseLong(String.valueOf(s));
-                //获取考试记录的客户端websocketId
-                String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
-                if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
-                    Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                    WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
-                    ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
-                    if ((Objects.nonNull(examRecordStatusEnum)
-                            && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
-                            && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
-                            && Objects.nonNull(webSocketOeServer.getRecordId())
-                            && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
-                        Map map = new HashMap<>();
-                        map.put("form", mqDto.getObjName());
-                        map.put(SystemConstant.RECORD_ID, recordId);
-                        map.put(SystemConstant.MESSAGE, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
-                        WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_STOP_EXAM.name(), map);
-                        webSocketOeServer.sendMessage(websocketDto);
-                        TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
-                        teExamStudentLogService.save(teExamStudentLog);
-
-                        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-                        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
-                        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
-                        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
-                        redisUtil.delete(key, mqDto.getId());
-                    }
+                Map<String, Object> map = oeMonitorFinishLogicPersisted(s, webSocketMap, gson, mqDto, key);
+                if (Objects.nonNull(map) && Objects.nonNull(map.get(SystemConstant.WEB_SOCKET_OE_SERVER))) {
+                    WebSocketOeServer webSocketOeServer = (WebSocketOeServer) map.get(SystemConstant.WEB_SOCKET_OE_SERVER);
+                    WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_STOP_EXAM.name(), map);
+                    webSocketOeServer.sendMessage(websocketDto);
                 }
             });
         } else if (Objects.equals(MqTagEnum.OE_WARNING_FINISH.name(), tag)) {//预警交卷
             Set examRecordId = JacksonUtil.readJson(String.valueOf(mqDto.getBody()), Set.class);
             examRecordId.forEach(s -> {
-                Long recordId = Long.parseLong(String.valueOf(s));
-                String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
-                if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
-                    Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                    WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
-                    ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
-                    if ((Objects.nonNull(examRecordStatusEnum)
-                            && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
-                            && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
-                            && Objects.nonNull(webSocketOeServer.getRecordId())
-                            && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
-                        Map map = new HashMap<>();
-                        map.put(SystemConstant.RECORD_ID, recordId);
-                        map.put(SystemConstant.BREACH_STATUS, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
-                        WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.BREACH_STOP_EXAM.name(), map);
-                        webSocketOeServer.sendMessage(websocketDto);
-                        TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
-                        teExamStudentLogService.save(teExamStudentLog);
-                        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-                        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
-                        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
-                        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
-                        redisUtil.delete(key, mqDto.getId());
-                    }
+                Map<String, Object> map = oeWarningFinishLogicPersisted(s, webSocketMap, gson, mqDto, key);
+                if (Objects.nonNull(map) && Objects.nonNull(map.get(SystemConstant.WEB_SOCKET_OE_SERVER))) {
+                    WebSocketOeServer webSocketOeServer = (WebSocketOeServer) map.get(SystemConstant.WEB_SOCKET_OE_SERVER);
+                    WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.BREACH_STOP_EXAM.name(), map);
+                    webSocketOeServer.sendMessage(websocketDto);
                 }
             });
         } else if (Objects.equals(MqTagEnum.OE_IM_CLUSTERING.name(), tag)) {//点对点消息
-            Long recordId = Long.parseLong(String.valueOf(mqDto.getBody()));
-            String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
-            if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
-                Long examId = ExamRecordCacheUtil.getExamId(recordId);
-                Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
-                WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
-                ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
-                if ((Objects.nonNull(examRecordStatusEnum)
-                        && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
-                        && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
-                        && Objects.nonNull(webSocketOeServer.getRecordId())
-                        && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
-                    Map<String, Object> prop = mqDto.getProperties();
-                    Map map = new HashMap<>();
-                    map.put(SystemConstant.RECORD_ID, recordId);
-                    map.put("from", mqDto.getObjName());
-                    map.put("type", prop.get("type"));
-                    map.put("content", prop.get("content"));
-                    WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_NOTICE.name(), map);
-                    webSocketOeServer.sendMessage(websocketDto);
-                    TIeExamInvigilateNotice tIeExamInvigilateNotice = new TIeExamInvigilateNotice(examId, examActivityId, recordId, Long.parseLong(String.valueOf(prop.get("formUserId"))), examStudentId, MessageTypeEnum.valueOf(String.valueOf(prop.get("type")).toUpperCase()), String.valueOf(prop.get("content")));
-                    tIeExamInvigilateNoticeService.saveOrUpdate(tIeExamInvigilateNotice);
-                    mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-                    TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
-                    tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
-                    tmRocketMessageService.saveOrUpdate(tmRocketMessage);
-                    redisUtil.delete(key, mqDto.getId());
-                }
+            Map<String, Object> map = oeImClusteringLogicPersisted(webSocketMap, gson, mqDto, key);
+            if (Objects.nonNull(map) && Objects.nonNull(map.get(SystemConstant.WEB_SOCKET_OE_SERVER))) {
+                WebSocketOeServer webSocketOeServer = (WebSocketOeServer) map.get(SystemConstant.WEB_SOCKET_OE_SERVER);
+                WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_NOTICE.name(), map);
+                webSocketOeServer.sendMessage(websocketDto);
             }
         } else if (Objects.equals(MqTagEnum.OE_IM_BROADCASTING.name(), tag)) {//广播消息
             JSONArray jsonArray = JSONArray.parseArray(String.valueOf(mqDto.getBody()));
             Set<String> examStudentIdentitySet = jsonArray.toJavaObject(Set.class);
             log.info("examStudentIdentitySet:{}", JacksonUtil.parseJson(examStudentIdentitySet));
         } else if (Objects.equals(MqTagEnum.OE_LIVENESS_VERIFY.name(), tag)) {//监考强制活体验证
-            Long recordId = Long.parseLong(String.valueOf(mqDto.getBody()));
-            String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
-            if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
-                Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
-                ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
-                if ((Objects.nonNull(examRecordStatusEnum)
-                        && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
-                        && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum))
-                        && Objects.nonNull(webSocketOeServer.getRecordId())
-                        && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
-                    Map map = new HashMap<>();
-                    map.put(SystemConstant.RECORD_ID, recordId);
-                    WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_LIVENESS_VERIFY.name(), map);
-                    webSocketOeServer.sendMessage(websocketDto);
-                    TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
-                    teExamStudentLogService.save(teExamStudentLog);
-                    mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-                    TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
-                    tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
-                    tmRocketMessageService.saveOrUpdate(tmRocketMessage);
-                    redisUtil.delete(key, mqDto.getId());
-                }
+            Map<String, Object> map = oeLivenessVerifyLogicPersisted(webSocketMap, gson, mqDto, key);
+            if (Objects.nonNull(map) && Objects.nonNull(map.get(SystemConstant.WEB_SOCKET_OE_SERVER))) {
+                WebSocketOeServer webSocketOeServer = (WebSocketOeServer) map.get(SystemConstant.WEB_SOCKET_OE_SERVER);
+                WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_LIVENESS_VERIFY.name(), map);
+                webSocketOeServer.sendMessage(websocketDto);
             }
         } else if (Objects.equals(MqTagEnum.OE_WEBSOCKET_MOBILE_ANSWER_READY.name(), tag)//移动端拍照/录音扫描完成
                 || Objects.equals(MqTagEnum.OE_WEBSOCKET_MOBILE_ANSWER_UPLOAD.name(), tag)//移动端拍照/录音上传成功
@@ -285,12 +381,13 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                         default:
                             break;
                     }
-                    webSocketOeServer.sendMessage(websocketDto);
                     mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
                     TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
                     tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
                     tmRocketMessageService.saveOrUpdate(tmRocketMessage);
                     redisUtil.delete(key, mqDto.getId());
+
+                    webSocketOeServer.sendMessage(websocketDto);
                 }
             }
         }
@@ -303,7 +400,6 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
      * @param key
      */
     @Override
-    @Transactional
     public void execMqOeMobileLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException, IOException {
         Gson gson = new Gson();
         String tag = mqDto.getTag();
@@ -356,12 +452,13 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                         default:
                             break;
                     }
-                    webSocketFirstMobileServer.sendMessage(websocketDto);
                     mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
                     TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
                     tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
                     tmRocketMessageService.saveOrUpdate(tmRocketMessage);
                     redisUtil.delete(key, mqDto.getId());
+
+                    webSocketFirstMobileServer.sendMessage(websocketDto);
                 }
             }
             String mobileSecondWebsocketId = ExamRecordCacheUtil.getMobileSecondWebsocketId(recordId);
@@ -394,12 +491,13 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                         default:
                             break;
                     }
-                    webSocketSecondMobileServer.sendMessage(websocketDto);
                     mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
                     TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
                     tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
                     tmRocketMessageService.saveOrUpdate(tmRocketMessage);
                     redisUtil.delete(key, mqDto.getId());
+
+                    webSocketSecondMobileServer.sendMessage(websocketDto);
                 }
             }
         }