Bläddra i källkod

监考端接口

wangliang 4 år sedan
förälder
incheckning
bd52a79e2b

+ 12 - 7
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateCallMobileController.java

@@ -6,15 +6,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.base.BasePage;
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 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.TIeExamInvigilateCall;
 import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
-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.MqTopicEnum;
+import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TIeExamInvigilateCallService;
 import com.qmth.themis.business.util.RedisUtil;
@@ -29,7 +27,9 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @Description: mobile监考监控通话信息 前端控制器
@@ -93,8 +93,13 @@ public class TIeInvigilateCallMobileController {
             source = MonitorVideoSourceEnum.MOBILE_SECOND;
             liveUrl = String.valueOf(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + MonitorVideoSourceEnum.MOBILE_SECOND.name()));
         }
-        objectMap.put(SystemConstant.MONITOR_STATUS_ + source.name(), MonitorStatusSourceEnum.STOP);
-        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.STOP);
+        if (Objects.isNull(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name()))) {
+            throw new BusinessException("推流状态为空");
+        }
+        objectMap.put(SystemConstant.MONITOR_CALL_STATUS_ + source.name(), MonitorCallStatusSourceEnum.STOP);
+        String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+        MonitorStatusSourceEnum status = MonitorStatusSourceEnum.valueOf(String.valueOf(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name())));
+        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
         //监考监控通话信息 发送mq start
         MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());

+ 69 - 0
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateController.java

@@ -10,6 +10,8 @@ import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.base.BasePage;
 import com.qmth.themis.business.bean.backend.*;
 import com.qmth.themis.business.cache.RedisKeyHelper;
+import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
@@ -31,6 +33,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -73,6 +76,15 @@ public class TIeInvigilateController {
     @Resource
     TBExamInvigilateUserService tbExamInvigilateUserService;
 
+    @Resource
+    TEExamReexamService teExamReexamService;
+
+    @Resource
+    TEExamActivityService teExamActivityService;
+
+    @Resource
+    TEExamService teExamService;
+
     @ApiOperation(value = "实时监控台列表接口")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = InvigilateListBean.class)})
@@ -434,6 +446,7 @@ public class TIeInvigilateController {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
+        ExamCacheBean examCacheBean = teExamService.getExamCacheBean(examId);
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         TBSession tbSession = (TBSession) ServletUtil.getRequestSession();
         if (Objects.isNull(tbSession)) {
@@ -452,7 +465,63 @@ public class TIeInvigilateController {
         QueryWrapper<TEExamStudent> teExamStudentQueryWrapper = new QueryWrapper<>();
         teExamStudentQueryWrapper.lambda().in(TEExamStudent::getRoomCode, roomCodeSet);
         List<TEExamStudent> teExamStudentList = teExamStudentService.list(teExamStudentQueryWrapper);
+        Set<Long> examStudentIdSet = null;
+        Set<Long> examActivityIdSet = null;
+        AtomicReference<Integer> prepareCount = new AtomicReference<>(0); //已待考
+        AtomicReference<Integer> examCount = new AtomicReference<>(0);//考试中
+        if (Objects.nonNull(teExamStudentList) && teExamStudentList.size() > 0) {
+            examStudentIdSet = new HashSet<>();
+            examActivityIdSet = new HashSet<>();
+            Set<Long> finalExamStudentIdSet = examStudentIdSet;
+            Set<Long> finalExamActivityIdSet = examActivityIdSet;
+            teExamStudentList.forEach(s -> {
+                finalExamStudentIdSet.add(s.getId());
+                finalExamActivityIdSet.add(s.getExamActivityId());
+            });
+        }
+
+        Integer exceptionCount = 0, warningCount = 0, reexamCount = 0;//异常人数,预警人数,重考人数
+        //获取异常人数
+        if (Objects.nonNull(examStudentIdSet)) {
+            QueryWrapper<TIeInvigilateExceptionInfo> tIeInvigilateExceptionInfoQueryWrapper = new QueryWrapper<>();
+            tIeInvigilateExceptionInfoQueryWrapper.lambda().in(TIeInvigilateExceptionInfo::getExamStudentId, examStudentIdSet);
+            exceptionCount = tIeInvigilateExceptionInfoService.count(tIeInvigilateExceptionInfoQueryWrapper);
 
+            QueryWrapper<TIeInvigilateWarnInfo> tIeInvigilateWarnInfoQueryWrapper = new QueryWrapper<>();
+            tIeInvigilateWarnInfoQueryWrapper.lambda().in(TIeInvigilateWarnInfo::getExamStudentId, examStudentIdSet);
+            warningCount = tIeInvigilateWarnInfoService.count(tIeInvigilateWarnInfoQueryWrapper);
+
+            QueryWrapper<TEExamReexam> teExamReexamQueryWrapper = new QueryWrapper<>();
+            teExamReexamQueryWrapper.lambda().in(TEExamReexam::getExamStudentId, examStudentIdSet).eq(TEExamReexam::getStatus, 1);
+            reexamCount = teExamReexamService.count(teExamReexamQueryWrapper);
+        }
+        if (Objects.nonNull(examActivityIdSet)) {
+            //获取已待考、考试中学生
+            examActivityIdSet.forEach(s -> {
+                ExamActivityCacheBean examActivityCacheBean = teExamActivityService.getExamActivityCacheBean(s);
+                if(Objects.nonNull(examCacheBean.getForceFinish()) && examCacheBean.getForceFinish() == 1){
+
+                }
+//                if(examActivityCacheBean.getFinishTime()){
+//
+//                }
+                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(s));
+                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
+
+                    objectMap.forEach((k, v) -> {
+                        ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
+                        //已待考
+                        if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE)) {
+                            prepareCount.getAndSet(prepareCount.get() + 1);
+                        }
+                        //考试中
+                        else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.RESUME_PREPARE)) {
+                            examCount.getAndSet(examCount.get() + 1);
+                        }
+                    });
+                }
+            });
+        }
         return ResultUtil.ok(Collections.singletonMap("success", true));
     }
 }

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

@@ -76,6 +76,7 @@ public class SystemConstant {
     public static String TEMP_FILES_DIR;
     public static final String MONITOR_LIVE_URL_ = "monitorLiveUrl_";
     public static final String MONITOR_STATUS_ = "monitorStatus_";
+    public static final String MONITOR_CALL_STATUS_ = "monitorCallStatus_";
     public final static String REDIS_MONITOR_SEQUENCE = "redis:seq:monitor";
     public final static String REDIS_ACTIVITY_CODE_SEQUENCE = "redis:seq:activity:code";
 

+ 18 - 0
themis-business/src/main/java/com/qmth/themis/business/dto/ExamPropCountDto.java

@@ -27,6 +27,8 @@ public class ExamPropCountDto implements Serializable {
     private Integer reexamCount;//重考审核
     private Long maxDurationSeconds;//最大考试时长
     private Long finishTime;//强制交卷时间
+    private Integer exceptionCount;//异常人数
+    private Integer warningCount;//预警人数
 
     public ExamPropCountDto() {
 
@@ -59,6 +61,22 @@ public class ExamPropCountDto implements Serializable {
         this.completionRate = completionRate;
     }
 
+    public Integer getExceptionCount() {
+        return exceptionCount;
+    }
+
+    public void setExceptionCount(Integer exceptionCount) {
+        this.exceptionCount = exceptionCount;
+    }
+
+    public Integer getWarningCount() {
+        return warningCount;
+    }
+
+    public void setWarningCount(Integer warningCount) {
+        this.warningCount = warningCount;
+    }
+
     public Integer getReexamCount() {
         return reexamCount;
     }

+ 27 - 1
themis-business/src/main/java/com/qmth/themis/business/entity/TIeExamInvigilateCall.java

@@ -3,6 +3,7 @@ package com.qmth.themis.business.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.qmth.themis.business.base.BaseEntity;
 import com.qmth.themis.business.enums.ExceptionEnum;
+import com.qmth.themis.business.enums.MonitorCallStatusSourceEnum;
 import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 import com.qmth.themis.common.contanst.Constants;
@@ -51,16 +52,41 @@ public class TIeExamInvigilateCall extends BaseEntity {
     @TableField(value = "type")
     private ExceptionEnum type;
 
+    @ApiModelProperty(value = "通话状态")
+    @TableField(value = "call_status")
+    private MonitorCallStatusSourceEnum callStatus;
+
+    @ApiModelProperty(value = "房间号")
+    @TableField(value = "monitor_key")
+    private String monitorKey;
+
     public TIeExamInvigilateCall() {
 
     }
 
-    public TIeExamInvigilateCall(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl, MonitorStatusSourceEnum status) {
+    public TIeExamInvigilateCall(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl, MonitorStatusSourceEnum status, String monitorKey) {
         setId(Constants.idGen.next());
         this.examRecordId = examRecordId;
         this.source = source;
         this.liveUrl = liveUrl;
         this.status = status;
+        this.monitorKey = monitorKey;
+    }
+
+    public MonitorCallStatusSourceEnum getCallStatus() {
+        return callStatus;
+    }
+
+    public void setCallStatus(MonitorCallStatusSourceEnum callStatus) {
+        this.callStatus = callStatus;
+    }
+
+    public String getMonitorKey() {
+        return monitorKey;
+    }
+
+    public void setMonitorKey(String monitorKey) {
+        this.monitorKey = monitorKey;
     }
 
     public ExceptionEnum getType() {

+ 15 - 2
themis-business/src/main/java/com/qmth/themis/business/entity/TIeExamInvigilateCallLog.java

@@ -1,6 +1,7 @@
 package com.qmth.themis.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.qmth.themis.business.enums.MonitorCallStatusSourceEnum;
 import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 import com.qmth.themis.common.contanst.Constants;
@@ -25,12 +26,23 @@ public class TIeExamInvigilateCallLog extends TIeExamInvigilateCall {
 
     }
 
-    public TIeExamInvigilateCallLog(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl, MonitorStatusSourceEnum status) {
+    public TIeExamInvigilateCallLog(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl, MonitorStatusSourceEnum status, String monitorKey) {
         setId(Constants.idGen.next());
         setExamRecordId(examRecordId);
         setSource(source);
         setLiveUrl(liveUrl);
         setStatus(status);
+        setMonitorKey(monitorKey);
+    }
+
+    public TIeExamInvigilateCallLog(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl, MonitorStatusSourceEnum status, String monitorKey, MonitorCallStatusSourceEnum callStatus) {
+        setId(Constants.idGen.next());
+        setExamRecordId(examRecordId);
+        setSource(source);
+        setLiveUrl(liveUrl);
+        setStatus(status);
+        setCallStatus(callStatus);
+        setMonitorKey(monitorKey);
     }
 
     public TIeExamInvigilateCallLog(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl) {
@@ -40,13 +52,14 @@ public class TIeExamInvigilateCallLog extends TIeExamInvigilateCall {
         setLiveUrl(liveUrl);
     }
 
-    public TIeExamInvigilateCallLog(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl, MonitorStatusSourceEnum status, String remark) {
+    public TIeExamInvigilateCallLog(Long examRecordId, MonitorVideoSourceEnum source, String liveUrl, MonitorStatusSourceEnum status, String remark, String monitorKey) {
         setId(Constants.idGen.next());
         setExamRecordId(examRecordId);
         setSource(source);
         setLiveUrl(liveUrl);
         setStatus(status);
         this.remark = remark;
+        setMonitorKey(monitorKey);
     }
 
     public String getRemark() {

+ 25 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/MonitorCallStatusSourceEnum.java

@@ -0,0 +1,25 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 监控状态 enum
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum MonitorCallStatusSourceEnum {
+
+    STOP("停止"),
+
+    START("正常");
+
+    private String code;
+
+    private MonitorCallStatusSourceEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 27 - 6
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java

@@ -2,6 +2,7 @@ package com.qmth.themis.exam.api;
 
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
@@ -74,7 +75,8 @@ public class TIeInvigilateCallMobileController {
                 throw new BusinessException("观看地址不能为空");
             }
             String liveUrl = String.valueOf(mapParameter.get("liveUrl"));
-            TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.INIT);
+            String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+            TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.INIT, monitorKey);
             //获取考试记录缓存
             Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
             objectMap.put(SystemConstant.MONITOR_LIVE_URL_ + source.name(), liveUrl);
@@ -122,8 +124,16 @@ public class TIeInvigilateCallMobileController {
             source = MonitorVideoSourceEnum.MOBILE_SECOND;
             liveUrl = String.valueOf(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + MonitorVideoSourceEnum.MOBILE_SECOND.name()));
         }
-        objectMap.put(SystemConstant.MONITOR_STATUS_ + source.name(), MonitorStatusSourceEnum.START);
-        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.START);
+        if (Objects.isNull(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name()))) {
+            throw new BusinessException("推流状态为空");
+        }
+        MonitorStatusSourceEnum status = MonitorStatusSourceEnum.valueOf(String.valueOf(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name())));
+        if (!Objects.equals(status, MonitorStatusSourceEnum.START)) {
+            throw new BusinessException("推流状态不正常");
+        }
+        objectMap.put(SystemConstant.MONITOR_CALL_STATUS_ + source.name(), MonitorCallStatusSourceEnum.START);
+        String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
         redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
 
         //监考监控通话信息 发送mq start
@@ -164,8 +174,14 @@ public class TIeInvigilateCallMobileController {
         if (Objects.nonNull(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + source.name()))) {
             liveUrl = String.valueOf(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + source.name()));
         }
+        MonitorCallStatusSourceEnum callStatus = null;
+        if (Objects.nonNull(objectMap.get(SystemConstant.MONITOR_CALL_STATUS_ + source.name()))) {
+            callStatus = MonitorCallStatusSourceEnum.valueOf(String.valueOf(objectMap.get(SystemConstant.MONITOR_CALL_STATUS_ + source.name())));
+        }
         objectMap.put(SystemConstant.MONITOR_STATUS_ + source.name(), status);
-        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.START);
+        objectMap.put(SystemConstant.MONITOR_CALL_STATUS_ + source.name(), callStatus);
+        String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.START, monitorKey, callStatus);
         if (Objects.nonNull(mapParameter.get("type")) && !Objects.equals(mapParameter.get("type"), "")) {
             tIeExamInvigilateCallLog.setType(ExceptionEnum.valueOf(String.valueOf(mapParameter.get("type"))));
         }
@@ -220,8 +236,13 @@ public class TIeInvigilateCallMobileController {
             source = MonitorVideoSourceEnum.MOBILE_SECOND;
             liveUrl = String.valueOf(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + MonitorVideoSourceEnum.MOBILE_SECOND.name()));
         }
-        objectMap.put(SystemConstant.MONITOR_STATUS_ + source.name(), MonitorStatusSourceEnum.STOP);
-        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.STOP);
+        if (Objects.isNull(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name()))) {
+            throw new BusinessException("推流状态为空");
+        }
+        objectMap.put(SystemConstant.MONITOR_CALL_STATUS_ + source.name(), MonitorCallStatusSourceEnum.STOP);
+        String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+        MonitorStatusSourceEnum status = MonitorStatusSourceEnum.valueOf(String.valueOf(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name())));
+        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
         //监考监控通话信息 发送mq start
         MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());

+ 27 - 6
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java

@@ -2,6 +2,7 @@ package com.qmth.themis.exam.api;
 
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
@@ -71,7 +72,8 @@ public class TIeInvigilateCallOeController {
                 throw new BusinessException("观看地址不能为空");
             }
             String liveUrl = String.valueOf(mapParameter.get("liveUrl"));
-            TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.INIT);
+            String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+            TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.INIT, monitorKey);
             //获取考试记录缓存
             Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
             objectMap.put(SystemConstant.MONITOR_LIVE_URL_ + source.name(), liveUrl);
@@ -128,8 +130,14 @@ public class TIeInvigilateCallOeController {
         if (Objects.nonNull(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + source.name()))) {
             liveUrl = String.valueOf(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + source.name()));
         }
+        MonitorCallStatusSourceEnum callStatus = null;
+        if (Objects.nonNull(objectMap.get(SystemConstant.MONITOR_CALL_STATUS_ + source.name()))) {
+            callStatus = MonitorCallStatusSourceEnum.valueOf(String.valueOf(objectMap.get(SystemConstant.MONITOR_CALL_STATUS_ + source.name())));
+        }
         objectMap.put(SystemConstant.MONITOR_STATUS_ + source.name(), status);
-        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.START);
+        objectMap.put(SystemConstant.MONITOR_CALL_STATUS_ + source.name(), callStatus);
+        String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.START, monitorKey, callStatus);
         if (Objects.nonNull(mapParameter.get("type")) && !Objects.equals(mapParameter.get("type"), "")) {
             tIeExamInvigilateCallLog.setType(ExceptionEnum.valueOf(String.valueOf(mapParameter.get("type"))));
         }
@@ -167,8 +175,16 @@ public class TIeInvigilateCallOeController {
             source = MonitorVideoSourceEnum.CLIENT_SCREEN;
             liveUrl = String.valueOf(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + MonitorVideoSourceEnum.CLIENT_SCREEN.name()));
         }
-        objectMap.put(SystemConstant.MONITOR_STATUS_ + source.name(), MonitorStatusSourceEnum.START);
-        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.START);
+        if (Objects.isNull(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name()))) {
+            throw new BusinessException("推流状态为空");
+        }
+        MonitorStatusSourceEnum status = MonitorStatusSourceEnum.valueOf(String.valueOf(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name())));
+        if (!Objects.equals(status, MonitorStatusSourceEnum.START)) {
+            throw new BusinessException("推流状态不正常");
+        }
+        objectMap.put(SystemConstant.MONITOR_CALL_STATUS_ + source.name(), MonitorCallStatusSourceEnum.START);
+        String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
         redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
 
         //监考监控通话信息 发送mq start
@@ -200,8 +216,13 @@ public class TIeInvigilateCallOeController {
             source = MonitorVideoSourceEnum.CLIENT_SCREEN;
             liveUrl = String.valueOf(objectMap.get(SystemConstant.MONITOR_LIVE_URL_ + MonitorVideoSourceEnum.CLIENT_SCREEN.name()));
         }
-        objectMap.put(SystemConstant.MONITOR_STATUS_ + source.name(), MonitorStatusSourceEnum.STOP);
-        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, MonitorStatusSourceEnum.STOP);
+        if (Objects.isNull(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name()))) {
+            throw new BusinessException("推流状态为空");
+        }
+        MonitorStatusSourceEnum status = MonitorStatusSourceEnum.valueOf(String.valueOf(objectMap.get(SystemConstant.MONITOR_STATUS_ + source.name())));
+        objectMap.put(SystemConstant.MONITOR_CALL_STATUS_ + source.name(), MonitorCallStatusSourceEnum.STOP);
+        String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
+        TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
         //监考监控通话信息 发送mq start
         MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());

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

@@ -426,6 +426,7 @@ public class MqLogicServiceImpl implements MqLogicService {
             } else {
                 tIeExamInvigilateCall.setLiveUrl(tIeExamInvigilateCallLog.getLiveUrl());
                 tIeExamInvigilateCall.setStatus(tIeExamInvigilateCallLog.getStatus());
+                tIeExamInvigilateCall.setCallStatus(tIeExamInvigilateCallLog.getCallStatus());
             }
             if (Objects.nonNull(tIeExamInvigilateCall.getUpdateTime())) {
                 long dbtimestamp = tIeExamInvigilateCall.getUpdateTime().getTime();