Ver Fonte

修复辅机位不退出的BUG

wangliang há 3 anos atrás
pai
commit
d43b91e377

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

@@ -14,7 +14,6 @@ import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.exam.listener.service.MqOeLogicService;
 import com.qmth.themis.exam.websocket.WebSocketMobileServer;
@@ -271,11 +270,20 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                 || Objects.equals(MqTagEnum.MONITOR_STOP.name(), tag)//监控结束
                 || Objects.equals(MqTagEnum.OE_WEBSOCKET_MOBILE_MONITOR_STATUS.name(), tag)) {//通知客户端移动端当前监控状态
             Long recordId = Long.parseLong(String.valueOf(mqDto.getBody()));
+            TOeExamRecord tOeExamRecord = null;
             String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(recordId);
+            if (Objects.isNull(clientWebsocketId)) {
+                tOeExamRecord = SystemConstant.getExamRecord(recordId);
+                clientWebsocketId = tOeExamRecord.getClientWebsocketId();
+            }
             Map<String, Object> prop = mqDto.getProperties();
             if (Objects.nonNull(clientWebsocketId) && Objects.nonNull(webSocketMap.get(clientWebsocketId))) {
                 WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
                 ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
+                if (Objects.isNull(examRecordStatusEnum)) {
+                    tOeExamRecord = Objects.isNull(tOeExamRecord) ? SystemConstant.getExamRecord(recordId) : tOeExamRecord;
+                    examRecordStatusEnum = tOeExamRecord.getStatus();
+                }
                 if (Objects.nonNull(examRecordStatusEnum)
                         && Objects.nonNull(webSocketOeServer.getRecordId())
                         && webSocketOeServer.getRecordId().longValue() == recordId.longValue()) {
@@ -283,13 +291,16 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     switch (tag.toUpperCase()) {
                         case "OE_WEBSOCKET_MOBILE_ANSWER_READY":
                             websocketDto = new WebsocketDto(WebsocketTypeEnum.MOBILE_ANSWER_READY.name(), prop);
+                            webSocketOeServer.sendMessage(websocketDto);
                             break;
                         case "OE_WEBSOCKET_MOBILE_ANSWER_UPLOAD":
                             websocketDto = new WebsocketDto(WebsocketTypeEnum.MOBILE_ANSWER_UPLOAD.name(), prop);
+                            webSocketOeServer.sendMessage(websocketDto);
                             break;
                         case "OE_WEBSOCKET_EXAM_STOP":
                             if (!Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
                                 websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), prop);
+                                webSocketOeServer.sendMessage(websocketDto);
                                 SystemConstant.clientMonitorStatusStop(recordId);
                                 Map<String, Object> properties = mqDto.getProperties();
                                 if (Objects.nonNull(properties) && properties.size() > 0) {
@@ -307,6 +318,7 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                                     && Objects.nonNull(monitorStatusBean.getTimestamp())
                                     && mqDto.getTimestamp().longValue() >= monitorStatusBean.getTimestamp().longValue()) {
                                 websocketDto = new WebsocketDto(WebsocketTypeEnum.MOBILE_MONITOR_START.name(), prop);
+                                webSocketOeServer.sendMessage(websocketDto);
                             }
                             break;
                         case "MONITOR_STOP":
@@ -316,7 +328,8 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                                     && Objects.nonNull(monitorStatusBean.getTimestamp())
                                     && mqDto.getTimestamp().longValue() >= monitorStatusBean.getTimestamp().longValue()) {
                                 websocketDto = new WebsocketDto(WebsocketTypeEnum.MOBILE_MONITOR_STOP.name(), prop);
-//                                ConcurrentHashMap<String, WebSocketMobileServer> webSocketMobileMap = WebSocketMobileServer.getWebSocketMap();
+                                webSocketOeServer.sendMessage(websocketDto);
+                                //                                ConcurrentHashMap<String, WebSocketMobileServer> webSocketMobileMap = WebSocketMobileServer.getWebSocketMap();
 //
 //                                String mobileWebsocketId = null;
 ////                                WebsocketStatusEnum websocketStatusEnum = null;
@@ -351,13 +364,12 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                                 prop.put(MonitorVideoSourceEnum.MOBILE_SECOND.name().toLowerCase(), ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_SECOND));
                             }
                             websocketDto = new WebsocketDto(WebsocketTypeEnum.MOBILE_MONITOR_STATUS.name(), prop);
+                            webSocketOeServer.sendMessage(websocketDto);
                             break;
                         default:
                             break;
                     }
                     tmRocketMessageService.saveMqMessageSuccess(mqDto, key);
-
-                    webSocketOeServer.sendMessage(websocketDto);
                 }
             }
         }
@@ -376,16 +388,16 @@ 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()));
+            TOeExamRecord tOeExamRecord = null;
             ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
             if (Objects.isNull(examRecordStatusEnum)) {
-                return;
+                tOeExamRecord = SystemConstant.getExamRecord(recordId);
+                examRecordStatusEnum = tOeExamRecord.getStatus();
             }
             Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
             Long studentId = null;
             if (Objects.isNull(examStudentId)) {
-                TOeExamRecord tOeExamRecord = tOeExamRecordService.getById(recordId);
-                Optional.ofNullable(tOeExamRecord).orElseThrow(() -> new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD));
-
+                tOeExamRecord = Objects.isNull(tOeExamRecord) ? SystemConstant.getExamRecord(recordId) : tOeExamRecord;
                 TEExamStudent teExamStudent = teExamStudentService.getById(tOeExamRecord.getExamStudentId());
                 studentId = teExamStudent.getStudentId();
             } else {
@@ -395,8 +407,12 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
             }
 
             String mobileFirstWebsocketId = ExamRecordCacheUtil.getMobileFirstWebsocketId(recordId);
-            if (Objects.nonNull(mobileFirstWebsocketId) && Objects.nonNull(webSocketMap.get(mobileFirstWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_FIRST.name()))) {
-                WebSocketMobileServer webSocketFirstMobileServer = webSocketMap.get(mobileFirstWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_FIRST.name());
+            if (Objects.isNull(mobileFirstWebsocketId)) {
+                tOeExamRecord = Objects.isNull(tOeExamRecord) ? SystemConstant.getExamRecord(recordId) : tOeExamRecord;
+                mobileFirstWebsocketId = tOeExamRecord.getMobileFirstWebsocketId();
+            }
+            if (Objects.nonNull(mobileFirstWebsocketId) && Objects.nonNull(webSocketMap.get(mobileFirstWebsocketId))) {
+                WebSocketMobileServer webSocketFirstMobileServer = webSocketMap.get(mobileFirstWebsocketId);
                 if (Objects.nonNull(examRecordStatusEnum)
                         && Objects.nonNull(webSocketFirstMobileServer.getRecordId())
                         && webSocketFirstMobileServer.getRecordId().longValue() == recordId.longValue()) {
@@ -405,6 +421,7 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                         case "EXAM_STOP":
                             if (!Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
                                 websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), mqDto.getProperties());
+                                webSocketFirstMobileServer.sendMessage(websocketDto);
                                 SystemConstant.mobileMonitorStatusStop(studentId, recordId, false);
                                 Map<String, Object> properties = mqDto.getProperties();
                                 if (Objects.nonNull(properties) && properties.size() > 0) {
@@ -419,19 +436,22 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                             if (!Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
                                     && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)) {
                                 websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_START.name(), mqDto.getProperties());
+                                webSocketFirstMobileServer.sendMessage(websocketDto);
                             }
                             break;
                         default:
                             break;
                     }
                     tmRocketMessageService.saveMqMessageSuccess(mqDto, key);
-
-                    webSocketFirstMobileServer.sendMessage(websocketDto);
                 }
             }
             String mobileSecondWebsocketId = ExamRecordCacheUtil.getMobileSecondWebsocketId(recordId);
-            if (Objects.nonNull(mobileSecondWebsocketId) && Objects.nonNull(webSocketMap.get(mobileSecondWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_SECOND.name()))) {
-                WebSocketMobileServer webSocketSecondMobileServer = webSocketMap.get(mobileSecondWebsocketId + "-" + MonitorVideoSourceEnum.MOBILE_SECOND.name());
+            if (Objects.isNull(mobileSecondWebsocketId)) {
+                tOeExamRecord = Objects.isNull(tOeExamRecord) ? SystemConstant.getExamRecord(recordId) : tOeExamRecord;
+                mobileSecondWebsocketId = tOeExamRecord.getMobileSecondWebsocketId();
+            }
+            if (Objects.nonNull(mobileSecondWebsocketId) && Objects.nonNull(webSocketMap.get(mobileSecondWebsocketId))) {
+                WebSocketMobileServer webSocketSecondMobileServer = webSocketMap.get(mobileSecondWebsocketId);
                 if (Objects.nonNull(examRecordStatusEnum)
                         && Objects.nonNull(webSocketSecondMobileServer.getRecordId())
                         && webSocketSecondMobileServer.getRecordId().longValue() == recordId.longValue()) {
@@ -440,6 +460,7 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                         case "EXAM_STOP":
                             if (!Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
                                 websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), mqDto.getProperties());
+                                webSocketSecondMobileServer.sendMessage(websocketDto);
                                 SystemConstant.mobileMonitorStatusStop(studentId, recordId, false);
                                 Map<String, Object> properties = mqDto.getProperties();
                                 if (Objects.nonNull(properties) && properties.size() > 0) {
@@ -454,16 +475,15 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                             if (!Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
                                     && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)) {
                                 websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_START.name(), mqDto.getProperties());
+                                webSocketSecondMobileServer.sendMessage(websocketDto);
                             }
                             break;
                         default:
                             break;
                     }
                     tmRocketMessageService.saveMqMessageSuccess(mqDto, key);
-
-                    webSocketSecondMobileServer.sendMessage(websocketDto);
                 }
             }
         }
     }
-}
+}