瀏覽代碼

监控源+预警不提醒修改

wangliang 4 年之前
父節點
當前提交
9a9fb24ae4

+ 46 - 4
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateController.java

@@ -2,6 +2,7 @@ package com.qmth.themis.backend.api;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
@@ -133,7 +134,7 @@ public class TIeInvigilateController {
                             @ApiParam(value = "预警量min", required = false) @RequestParam(required = false) Integer minWarningCount,
                             @ApiParam(value = "预警量max", required = false) @RequestParam(required = false) Integer maxWarningCount,
                             @ApiParam(value = "客户端网络通信状态", required = false) @RequestParam(required = false) String clientWebsocketStatus,
-                            @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
+                            @ApiParam(value = "监控设备来源", required = false) @RequestParam(required = false) String monitorVideoSource,
                             @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
@@ -143,7 +144,44 @@ public class TIeInvigilateController {
         if (authDto.getRoleCodes().toString().contains(RoleEnum.INVIGILATE.name())) {
             userId = tbUser.getId();
         }
-        return ResultUtil.ok(tOeExamRecordService.invigilatePageListVideo(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, paperDownload, status, name, identity, minWarningCount, maxWarningCount, clientWebsocketStatus, monitorStatusSource, userId));
+        IPage<InvigilateListVideoBean> invigilateListVideoBeanIPage = tOeExamRecordService.invigilatePageListVideo(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, paperDownload, status, name, identity, minWarningCount, maxWarningCount, clientWebsocketStatus, userId);
+        if (Objects.nonNull(invigilateListVideoBeanIPage)) {
+            List<InvigilateListVideoBean> invigilateListVideoBeanList = invigilateListVideoBeanIPage.getRecords();
+            ExamCacheBean examCacheBean = teExamService.getExamCacheBean(examId);
+            List<String> monitorVideoSourceList = null;
+            if (Objects.nonNull(examCacheBean.getMonitorVideoSource()) && !Objects.equals(examCacheBean.getMonitorVideoSource().toString().trim().replaceAll(" ", ""), "")) {
+                monitorVideoSourceList = Arrays.asList(examCacheBean.getMonitorVideoSource().trim().toUpperCase().replaceAll(" ", "").split(","));
+            }
+            if (Objects.nonNull(monitorVideoSourceList) && monitorVideoSourceList.size() > 0 && Objects.nonNull(invigilateListVideoBeanList) && invigilateListVideoBeanList.size() > 0) {
+                List<String> finalMonitorVideoSourceList = monitorVideoSourceList;
+                invigilateListVideoBeanList.forEach(s -> {
+                    finalMonitorVideoSourceList.forEach(l -> {
+                        MonitorVideoSourceEnum source = MonitorVideoSourceEnum.valueOf(l);
+                        switch (source.ordinal()) {
+                            case 0:
+                                s.setScreenMonitorStatusSource(ExamRecordCacheUtil.getMonitorStatus(s.getExamRecordId(), source.name()));
+                                break;
+                            case 1:
+                                s.setCameraMonitorStatusSource(ExamRecordCacheUtil.getMonitorStatus(s.getExamRecordId(), source.name()));
+                                break;
+                            case 2:
+                                s.setMobileFirstMonitorStatusSource(ExamRecordCacheUtil.getMonitorStatus(s.getExamRecordId(), source.name()));
+                                break;
+                            default:
+                                s.setMobileSecondMonitorStatusSource(ExamRecordCacheUtil.getMonitorStatus(s.getExamRecordId(), source.name()));
+                                break;
+                        }
+                    });
+                    MonitorVideoSourceEnum source = MonitorVideoSourceEnum.CLIENT_CAMERA;
+                    if (Objects.nonNull(monitorVideoSource)) {
+                        source = MonitorVideoSourceEnum.valueOf(monitorVideoSource);
+                    }
+                    s.setMonitorLiveUrl(ExamRecordCacheUtil.getMonitorLiveUrl(s.getExamRecordId(), source.name()));
+                    s.setClientWebsocketStatus(ExamRecordCacheUtil.getClientWebsocketStatus(s.getExamRecordId()));
+                });
+            }
+        }
+        return ResultUtil.ok(invigilateListVideoBeanIPage);
     }
 
     @ApiOperation(value = "实时监控台视频随机列表接口")
@@ -207,17 +245,21 @@ public class TIeInvigilateController {
         TOeExamRecord tOeExamRecord = null;
         Long examStudentId = null;
         Long examActivityId = null;
+        ExamRecordStatusEnum status = null;
+        Integer breachStatus = null;
         if (Objects.isNull(examId)) {
             tOeExamRecord = tOeExamRecordService.getById(examRecordId);
             examId = tOeExamRecord.getExamId();
             examStudentId = tOeExamRecord.getExamStudentId();
             examActivityId = tOeExamRecord.getExamActivityId();
+            status = tOeExamRecord.getStatus();
+            breachStatus = tOeExamRecord.getBreachStatus();
         } else {
             examStudentId = ExamRecordCacheUtil.getExamStudentId(examRecordId);
             examActivityId = ExamRecordCacheUtil.getExamActivityId(examRecordId);
+            status = ExamRecordCacheUtil.getStatus(examRecordId);
+            breachStatus = Objects.isNull(ExamRecordCacheUtil.getBreachStatus(examRecordId)) ? 1 : ExamRecordCacheUtil.getBreachStatus(examRecordId);
         }
-        ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(examRecordId);
-        Integer breachStatus = Objects.isNull(ExamRecordCacheUtil.getBreachStatus(examRecordId)) ? 1 : ExamRecordCacheUtil.getBreachStatus(examRecordId);
         ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
         TEStudent teStudent = teStudentService.getById(examStudentCacheBean.getStudentId());
         String basePhotoPath = systemConfig.getProperty("aliyun.oss.url") + File.separator + teStudent.getBasePhotoPath();

+ 1 - 3
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateWarnInfoController.java

@@ -78,8 +78,6 @@ public class TIeInvigilateWarnInfoController {
                        @ApiParam(value = "异常处理max", required = false) @RequestParam(required = false) Integer maxExceptionCount,
                        @ApiParam(value = "预警量min", required = false) @RequestParam(required = false) Integer minWarningCount,
                        @ApiParam(value = "预警量max", required = false) @RequestParam(required = false) Integer maxWarningCount,
-                       @ApiParam(value = "客户端网络通信状态", required = false) @RequestParam(required = false) String clientWebsocketStatus,
-                       @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
@@ -89,7 +87,7 @@ public class TIeInvigilateWarnInfoController {
         if (authDto.getRoleCodes().toString().contains(RoleEnum.INVIGILATE.name())) {
             userId = tbUser.getId();
         }
-        return ResultUtil.ok(tOeExamRecordService.invigilatePageWarningList(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, approveStatus, name, identity, minMultipleFaceCount, maxMultipleFaceCount, minExceptionCount, maxExceptionCount, minWarningCount, maxWarningCount, clientWebsocketStatus, monitorStatusSource, userId));
+        return ResultUtil.ok(tOeExamRecordService.invigilatePageWarningList(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, approveStatus, name, identity, minMultipleFaceCount, maxMultipleFaceCount, minExceptionCount, maxExceptionCount, minWarningCount, maxWarningCount, userId));
     }
 
     @ApiOperation(value = "预警消息接口")

+ 39 - 6
themis-business/src/main/java/com/qmth/themis/business/bean/backend/InvigilateListVideoBean.java

@@ -81,8 +81,17 @@ public class InvigilateListVideoBean implements Serializable {
     @ApiModelProperty(name = "客户端网络通信状态")
     private WebsocketStatusEnum clientWebsocketStatus;
 
-    @ApiModelProperty(name = "监控通信状态")
-    private MonitorStatusSourceEnum monitorStatusSource;
+    @ApiModelProperty(name = "电脑摄像头通信状态")
+    private MonitorStatusSourceEnum cameraMonitorStatusSource;
+
+    @ApiModelProperty(name = "电脑屏幕通信状态")
+    private MonitorStatusSourceEnum screenMonitorStatusSource;
+
+    @ApiModelProperty(name = "手机主机位通信状态")
+    private MonitorStatusSourceEnum mobileFirstMonitorStatusSource;
+
+    @ApiModelProperty(name = "手机辅机位监控通信状态")
+    private MonitorStatusSourceEnum mobileSecondMonitorStatusSource;
 
     @ApiModelProperty(name = "ip地址")
     private String clientCurrentIp;
@@ -126,12 +135,36 @@ public class InvigilateListVideoBean implements Serializable {
         this.clientWebsocketStatus = clientWebsocketStatus;
     }
 
-    public MonitorStatusSourceEnum getMonitorStatusSource() {
-        return monitorStatusSource;
+    public MonitorStatusSourceEnum getCameraMonitorStatusSource() {
+        return cameraMonitorStatusSource;
+    }
+
+    public void setCameraMonitorStatusSource(MonitorStatusSourceEnum cameraMonitorStatusSource) {
+        this.cameraMonitorStatusSource = cameraMonitorStatusSource;
+    }
+
+    public MonitorStatusSourceEnum getScreenMonitorStatusSource() {
+        return screenMonitorStatusSource;
+    }
+
+    public void setScreenMonitorStatusSource(MonitorStatusSourceEnum screenMonitorStatusSource) {
+        this.screenMonitorStatusSource = screenMonitorStatusSource;
+    }
+
+    public MonitorStatusSourceEnum getMobileFirstMonitorStatusSource() {
+        return mobileFirstMonitorStatusSource;
+    }
+
+    public void setMobileFirstMonitorStatusSource(MonitorStatusSourceEnum mobileFirstMonitorStatusSource) {
+        this.mobileFirstMonitorStatusSource = mobileFirstMonitorStatusSource;
+    }
+
+    public MonitorStatusSourceEnum getMobileSecondMonitorStatusSource() {
+        return mobileSecondMonitorStatusSource;
     }
 
-    public void setMonitorStatusSource(MonitorStatusSourceEnum monitorStatusSource) {
-        this.monitorStatusSource = monitorStatusSource;
+    public void setMobileSecondMonitorStatusSource(MonitorStatusSourceEnum mobileSecondMonitorStatusSource) {
+        this.mobileSecondMonitorStatusSource = mobileSecondMonitorStatusSource;
     }
 
     public String getClientCurrentIp() {

+ 0 - 6
themis-business/src/main/java/com/qmth/themis/business/dao/TOeExamRecordMapper.java

@@ -94,7 +94,6 @@ public interface TOeExamRecordMapper extends BaseMapper<TOeExamRecord> {
      * @param minWarningCount
      * @param maxWarningCount
      * @param clientWebsocketStatus
-     * @param monitorStatusSource
      * @param userId
      * @return
      */
@@ -108,7 +107,6 @@ public interface TOeExamRecordMapper extends BaseMapper<TOeExamRecord> {
                                                                   @Param("minWarningCount") Integer minWarningCount,
                                                                   @Param("maxWarningCount") Integer maxWarningCount,
                                                                   @Param("clientWebsocketStatus") String clientWebsocketStatus,
-                                                                  @Param("monitorStatusSource") String monitorStatusSource,
                                                                   @Param("userId") Long userId);
 
     /**
@@ -174,8 +172,6 @@ public interface TOeExamRecordMapper extends BaseMapper<TOeExamRecord> {
      * @param maxExceptionCount
      * @param minWarningCount
      * @param maxWarningCount
-     * @param clientWebsocketStatus
-     * @param monitorStatusSource
      * @param userId
      * @return
      */
@@ -191,8 +187,6 @@ public interface TOeExamRecordMapper extends BaseMapper<TOeExamRecord> {
                                                                       @Param("maxExceptionCount") Integer maxExceptionCount,
                                                                       @Param("minWarningCount") Integer minWarningCount,
                                                                       @Param("maxWarningCount") Integer maxWarningCount,
-                                                                      @Param("clientWebsocketStatus") String clientWebsocketStatus,
-                                                                      @Param("monitorStatusSource") String monitorStatusSource,
                                                                       @Param("userId") Long userId);
 
     /**

+ 24 - 0
themis-business/src/main/java/com/qmth/themis/business/dto/response/TEExamQueryDto.java

@@ -5,8 +5,10 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @Description: 考试dto
@@ -51,6 +53,28 @@ public class TEExamQueryDto implements Serializable {
     @ApiModelProperty(name = "更新人")
     private String updateName;//更新人
 
+    @ApiModelProperty(name = "监控源")
+    private String monitorVideoSource;
+
+    @ApiModelProperty(value = "是否IP段限制,0:不允许,1:允许")
+    private Integer enableIpLimit;
+
+    public Integer getEnableIpLimit() {
+        return enableIpLimit;
+    }
+
+    public void setEnableIpLimit(Integer enableIpLimit) {
+        this.enableIpLimit = enableIpLimit;
+    }
+
+    public String getMonitorVideoSource() {
+        return monitorVideoSource;
+    }
+
+    public void setMonitorVideoSource(String monitorVideoSource) {
+        this.monitorVideoSource = monitorVideoSource;
+    }
+
     public Long getId() {
         return id;
     }

+ 16 - 3
themis-business/src/main/java/com/qmth/themis/business/entity/TIeInvigilateWarnInfo.java

@@ -11,7 +11,6 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
-import java.util.Date;
 
 /**
  * @Description:
@@ -86,11 +85,15 @@ public class TIeInvigilateWarnInfo implements Serializable {
     @TableField(value = "video_url")
     private String videoUrl;
 
+    @ApiModelProperty(value = "提醒状态,0:不提醒,1:提醒")
+    @TableField(value = "remind_status")
+    private Integer remindStatus;
+
     public TIeInvigilateWarnInfo() {
 
     }
 
-    public TIeInvigilateWarnInfo(Long examId, Long examActivityId, Long examRecordId, Long examStudentId, String level, String info, VerifyExceptionEnum type) {
+    public TIeInvigilateWarnInfo(Long examId, Long examActivityId, Long examRecordId, Long examStudentId, String level, String info, VerifyExceptionEnum type, Integer remindStatus) {
         this.id = Constants.idGen.next();
         this.examId = examId;
         this.examActivityId = examActivityId;
@@ -100,9 +103,10 @@ public class TIeInvigilateWarnInfo implements Serializable {
         this.info = info;
         this.type = type;
         this.approveStatus = 0;
+        this.remindStatus = remindStatus;
     }
 
-    public TIeInvigilateWarnInfo(Long examId, Long examActivityId, Long examRecordId, Long examStudentId, String level, String info, VerifyExceptionEnum type, String photoUrl) {
+    public TIeInvigilateWarnInfo(Long examId, Long examActivityId, Long examRecordId, Long examStudentId, String level, String info, VerifyExceptionEnum type, String photoUrl, Integer remindStatus) {
         this.id = Constants.idGen.next();
         this.examId = examId;
         this.examActivityId = examActivityId;
@@ -113,6 +117,15 @@ public class TIeInvigilateWarnInfo implements Serializable {
         this.type = type;
         this.approveStatus = 0;
         this.photoUrl = photoUrl;
+        this.remindStatus = remindStatus;
+    }
+
+    public Integer getRemindStatus() {
+        return remindStatus;
+    }
+
+    public void setRemindStatus(Integer remindStatus) {
+        this.remindStatus = remindStatus;
     }
 
     public String getPhotoUrl() {

+ 0 - 6
themis-business/src/main/java/com/qmth/themis/business/service/TOeExamRecordService.java

@@ -139,7 +139,6 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
      * @param minWarningCount
      * @param maxWarningCount
      * @param clientWebsocketStatus
-     * @param monitorStatusSource
      * @param userId
      * @return
      */
@@ -153,7 +152,6 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
                                                                   Integer minWarningCount,
                                                                   Integer maxWarningCount,
                                                                   String clientWebsocketStatus,
-                                                                  String monitorStatusSource,
                                                                   Long userId);
 
     /**
@@ -219,8 +217,6 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
      * @param maxExceptionCount
      * @param minWarningCount
      * @param maxWarningCount
-     * @param clientWebsocketStatus
-     * @param monitorStatusSource
      * @param userId
      * @return
      */
@@ -236,8 +232,6 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
                                                                       Integer maxExceptionCount,
                                                                       Integer minWarningCount,
                                                                       Integer maxWarningCount,
-                                                                      String clientWebsocketStatus,
-                                                                      String monitorStatusSource,
                                                                       Long userId);
 
     /**

+ 2 - 2
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -336,8 +336,8 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         ExamingDataCacheUtil.setUnFinishedRecordId(studentId, recordId);
         //mq发送消息start
         TEStudentCacheDto teStudentCacheDto = (TEStudentCacheDto) redisUtil.getStudent(studentId);
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FIRST_PREPARE, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), teStudentCacheDto.getIdentity());
-        this.sendOeLogMessage(SystemOperationEnum.FIRST_PREPARE, examStudentId, recordId, mqDto);
+//        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FIRST_PREPARE, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), teStudentCacheDto.getIdentity());
+//        this.sendOeLogMessage(SystemOperationEnum.FIRST_PREPARE, examStudentId, recordId, mqDto);
         updateExamStudent(examStudentId, alreadyExamCount, recordId);
         //mq发送消息end
         return prepare;

+ 32 - 65
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -1,43 +1,13 @@
 package com.qmth.themis.business.service.impl;
 
-import java.io.File;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.UUID;
-
-import javax.annotation.Resource;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.themis.business.bean.backend.InvigilateListBean;
-import com.qmth.themis.business.bean.backend.InvigilateListHistoryBean;
-import com.qmth.themis.business.bean.backend.InvigilateListPatrolBean;
-import com.qmth.themis.business.bean.backend.InvigilateListProgressBean;
-import com.qmth.themis.business.bean.backend.InvigilateListProgressExcelBean;
-import com.qmth.themis.business.bean.backend.InvigilateListVideoBean;
-import com.qmth.themis.business.bean.backend.InvigilateListWarningBean;
+import com.qmth.themis.business.bean.backend.*;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 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.ExamPaperCacheBean;
-import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
-import com.qmth.themis.business.cache.bean.ExamStudentPaperStructCacheBean;
-import com.qmth.themis.business.cache.bean.ObjectiveAnswerCacheBean;
+import com.qmth.themis.business.cache.bean.*;
 import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
@@ -46,25 +16,25 @@ import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.response.TEExamUnFinishDto;
 import com.qmth.themis.business.entity.TOeExamAnswer;
 import com.qmth.themis.business.entity.TOeExamRecord;
-import com.qmth.themis.business.enums.ExamRecordFieldEnum;
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
-import com.qmth.themis.business.enums.ExamTypeEnum;
-import com.qmth.themis.business.enums.LivenessTypeEnum;
-import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
-import com.qmth.themis.business.enums.ObjectiveScorePolicyEnum;
-import com.qmth.themis.business.enums.VerifyExceptionEnum;
-import com.qmth.themis.business.service.MqDtoService;
-import com.qmth.themis.business.service.TEExamActivityService;
-import com.qmth.themis.business.service.TEExamPaperService;
-import com.qmth.themis.business.service.TEExamService;
-import com.qmth.themis.business.service.TOeExamAnswerService;
-import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.util.FileUtil;
 import com.qmth.themis.common.util.SimpleBeanUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * @Description: 考试记录 服务实现类
@@ -175,9 +145,9 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         er.setForceFinish(exam.getForceFinish());
         ExamPaperCacheBean ep = examPaperService.getExamPaperCacheBean(paperId);
         if (StringUtils.isBlank(ep.getAnswerPath())) {
-        	er.setHasAnswerFile(0);
-        }else {
-        	er.setHasAnswerFile(1);
+            er.setHasAnswerFile(0);
+        } else {
+            er.setHasAnswerFile(1);
         }
         Map<String, Object> map = SimpleBeanUtil.objectToMap(er);
         redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(er.getId()), map);
@@ -196,12 +166,12 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         Integer subIndex = (Integer) param.get("subIndex");
         Long paperId = ExamRecordCacheUtil.getPaperId(recordId);
         String key = RedisKeyHelper.examAnswerHashKey(mainNumber, subNumber, subIndex);
-        
+
         //考生作答缓存
         ExamStudentAnswerCacheBean answer = (ExamStudentAnswerCacheBean) redisUtil.get(
-                RedisKeyHelper.examAnswerKey(recordId),key);
+                RedisKeyHelper.examAnswerKey(recordId), key);
         if (answer == null) {
-            log.error("no ExamStudentAnswerCacheBean for calculateObjectiveScore key:"+key);
+            log.error("no ExamStudentAnswerCacheBean for calculateObjectiveScore key:" + key);
 
             // 计算客观分总分
             calculateTotalObjectiveScore(recordId);
@@ -210,7 +180,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         //整卷客观题标答缓存集合
         Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(paperId);
         if (map == null || map.size() == 0) {
-            log.debug("no ObjectiveAnswerCacheBean map for calculateObjectiveScore paperId:"+paperId);
+            log.debug("no ObjectiveAnswerCacheBean map for calculateObjectiveScore paperId:" + paperId);
             // 更新分数
             answer.setScore(0.0);
             redisUtil.set(RedisKeyHelper.examAnswerKey(recordId), key, answer);
@@ -222,8 +192,8 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         //客观题标答缓存
         ObjectiveAnswerCacheBean cb = map.get(key);
         if (cb == null) {
-        	log.debug("no ObjectiveAnswerCacheBean for calculateObjectiveScore key:"+key);
-        	// 更新分数
+            log.debug("no ObjectiveAnswerCacheBean for calculateObjectiveScore key:" + key);
+            // 更新分数
             answer.setScore(0.0);
             redisUtil.set(RedisKeyHelper.examAnswerKey(recordId), key, answer);
 
@@ -559,13 +529,12 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
      * @param minWarningCount
      * @param maxWarningCount
      * @param clientWebsocketStatus
-     * @param monitorStatusSource
      * @param userId
      * @return
      */
     @Override
-    public IPage<InvigilateListVideoBean> invigilatePageListVideo(IPage<Map> iPage, Long examId, Long examActivityId, String roomCode, Integer paperDownload, String status, String name, String identity, Integer minWarningCount, Integer maxWarningCount, String clientWebsocketStatus, String monitorStatusSource, Long userId) {
-        return tOeExamRecordMapper.invigilatePageListVideo(iPage, examId, examActivityId, roomCode, paperDownload, status, name, identity, minWarningCount, maxWarningCount, clientWebsocketStatus, monitorStatusSource, userId);
+    public IPage<InvigilateListVideoBean> invigilatePageListVideo(IPage<Map> iPage, Long examId, Long examActivityId, String roomCode, Integer paperDownload, String status, String name, String identity, Integer minWarningCount, Integer maxWarningCount, String clientWebsocketStatus, Long userId) {
+        return tOeExamRecordMapper.invigilatePageListVideo(iPage, examId, examActivityId, roomCode, paperDownload, status, name, identity, minWarningCount, maxWarningCount, clientWebsocketStatus, userId);
     }
 
     /**
@@ -623,14 +592,12 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
      * @param maxExceptionCount
      * @param minWarningCount
      * @param maxWarningCount
-     * @param clientWebsocketStatus
-     * @param monitorStatusSource
      * @param userId
      * @return
      */
     @Override
-    public IPage<InvigilateListWarningBean> invigilatePageWarningList(IPage<Map> iPage, Long examId, Long examActivityId, String roomCode, Integer approveStatus, String name, String identity, Integer minMultipleFaceCount, Integer maxMultipleFaceCount, Integer minExceptionCount, Integer maxExceptionCount, Integer minWarningCount, Integer maxWarningCount, String clientWebsocketStatus, String monitorStatusSource, Long userId) {
-        return tOeExamRecordMapper.invigilatePageWarningList(iPage, examId, examActivityId, roomCode, approveStatus, name, identity, minMultipleFaceCount, maxMultipleFaceCount, minExceptionCount, maxExceptionCount, minWarningCount, maxWarningCount, clientWebsocketStatus, monitorStatusSource, userId);
+    public IPage<InvigilateListWarningBean> invigilatePageWarningList(IPage<Map> iPage, Long examId, Long examActivityId, String roomCode, Integer approveStatus, String name, String identity, Integer minMultipleFaceCount, Integer maxMultipleFaceCount, Integer minExceptionCount, Integer maxExceptionCount, Integer minWarningCount, Integer maxWarningCount, Long userId) {
+        return tOeExamRecordMapper.invigilatePageWarningList(iPage, examId, examActivityId, roomCode, approveStatus, name, identity, minMultipleFaceCount, maxMultipleFaceCount, minExceptionCount, maxExceptionCount, minWarningCount, maxWarningCount, userId);
     }
 
     /**
@@ -705,10 +672,10 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     public void calculateScore(Long recordId) {
 
         TOeExamRecord rec = this.getById(recordId);
-        
+
         ExamPaperCacheBean ep = examPaperService.getExamPaperCacheBean(rec.getPaperId());
-        if (rec.getHasAnswerFile().intValue()==0 && StringUtils.isNotBlank(ep.getAnswerPath())) {
-        	tOeExamRecordMapper.updateHasAnswerFile(recordId, 1);
+        if (rec.getHasAnswerFile().intValue() == 0 && StringUtils.isNotBlank(ep.getAnswerPath())) {
+            tOeExamRecordMapper.updateHasAnswerFile(recordId, 1);
         }
 
         Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(rec.getPaperId());

+ 5 - 5
themis-business/src/main/java/com/qmth/themis/business/service/impl/WarningServiceImpl.java

@@ -70,7 +70,7 @@ public class WarningServiceImpl implements WarningService {
                 Integer count = Integer.parseInt(String.valueOf(map.get("tmpCount")));
                 count = Objects.isNull(count) ? 0 : count;
                 if (count >= teConfig.getMultipleFaceCountError()) {
-                    TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(1), WarningLevelEnum.valueOf(warningEnum.getLevel().get(1)).getTitle(), warningEnum, photoUrl);
+                    TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(1), WarningLevelEnum.valueOf(warningEnum.getLevel().get(1)).getTitle(), warningEnum, photoUrl, Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1);
                     tIeInvigilateWarnInfoService.saveOrUpdate(tIeInvigilateWarnInfo);
                     this.setWarningCount(recordId);
                     this.setPhotoUrls(map, tIeInvigilateWarnInfo, examStudentCacheBean, recordId);
@@ -82,7 +82,7 @@ public class WarningServiceImpl implements WarningService {
                 Integer count = Integer.parseInt(String.valueOf(map.get("tmpCount")));
                 count = Objects.isNull(count) ? 0 : count;
                 if (count >= teConfig.getNoFaceCountError()) {
-                    TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(0), WarningLevelEnum.valueOf(warningEnum.getLevel().get(0)).getTitle(), warningEnum, photoUrl);
+                    TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(0), WarningLevelEnum.valueOf(warningEnum.getLevel().get(0)).getTitle(), warningEnum, photoUrl, Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1);
                     tIeInvigilateWarnInfoService.saveOrUpdate(tIeInvigilateWarnInfo);
                     this.setWarningCount(recordId);
                     this.setPhotoUrls(map, tIeInvigilateWarnInfo, examStudentCacheBean, recordId);
@@ -112,13 +112,13 @@ public class WarningServiceImpl implements WarningService {
             Integer count = Integer.parseInt(String.valueOf(map.get("tmpCount")));
             count = Objects.isNull(count) ? 0 : count;
             if (count >= teConfig.getMatchFaceCompareErrorCount()) {
-                TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(0), WarningLevelEnum.valueOf(warningEnum.getLevel().get(0)).getTitle(), warningEnum, photoUrl);
+                TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(0), WarningLevelEnum.valueOf(warningEnum.getLevel().get(0)).getTitle(), warningEnum, photoUrl, Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1);
                 tIeInvigilateWarnInfoService.saveOrUpdate(tIeInvigilateWarnInfo);
                 this.setWarningCount(recordId);
                 this.setPhotoUrls(map, tIeInvigilateWarnInfo, examStudentCacheBean, recordId);
             }
             if (count >= teConfig.getTotalFaceCompareErrorCount()) {
-                TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(1), WarningLevelEnum.valueOf(warningEnum.getLevel().get(1)).getTitle(), warningEnum, photoUrl);
+                TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, warningEnum.getLevel().get(1), WarningLevelEnum.valueOf(warningEnum.getLevel().get(1)).getTitle(), warningEnum, photoUrl, Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1);
                 tIeInvigilateWarnInfoService.saveOrUpdate(tIeInvigilateWarnInfo);
                 this.setWarningCount(recordId);
                 this.setPhotoUrls(map, tIeInvigilateWarnInfo, examStudentCacheBean, recordId);
@@ -165,7 +165,7 @@ public class WarningServiceImpl implements WarningService {
         ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
         int count = faceVerifyHistoryService.count(tOeFaceVerifyHistoryQueryWrapper);
         if (count > teConfig.getRealnessCount()) {
-            TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, WarningLevelEnum.D15.name(), WarningLevelEnum.D15.getTitle(), warningEnum);
+            TIeInvigilateWarnInfo tIeInvigilateWarnInfo = new TIeInvigilateWarnInfo(examId, examActivityId, recordId, examStudentId, WarningLevelEnum.D15.name(), WarningLevelEnum.D15.getTitle(), warningEnum, Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1);
             tIeInvigilateWarnInfoService.saveOrUpdate(tIeInvigilateWarnInfo);
             this.setWarningCount(recordId);
             TEExamStudentLog teExamStudentLog = new TEExamStudentLog(tIeInvigilateWarnInfo.getType().name(), WarningLevelEnum.valueOf(tIeInvigilateWarnInfo.getLevel()).getTitle(), tIeInvigilateWarnInfo.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentCacheBean.getId(), recordId);

+ 1 - 0
themis-business/src/main/resources/db/init.sql

@@ -1289,6 +1289,7 @@ CREATE TABLE `t_ie_invigilate_warn_info` (
   `update_time` bigint DEFAULT NULL COMMENT '更新时间',
   `photo_url` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '图片url',
   `video_url` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '视频url',
+  `remind_status` tinyint(4) DEFAULT '1' COMMENT '提醒状态,0:不提醒,1:提醒',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='监考预警信息';
 

+ 5 - 1
themis-business/src/main/resources/mapper/TEExamMapper.xml

@@ -41,7 +41,9 @@
         t.endTime,
         t.progress,
         if(t.updateName is not null, t.updateName, t.createName) as updateName,
-        if(t.updateTime is not null, t.updateTime, t.createTime) as updateTime
+        if(t.updateTime is not null, t.updateTime, t.createTime) as updateTime,
+        t.enableIpLimit,
+        t.monitorVideoSource
         from
         (select t.id,
         t.code,
@@ -53,6 +55,8 @@
         t.end_time as endTime,
         t.create_time as createTime,
         t.update_time as updateTime,
+        t.enable_ip_limit as enableIpLimit,
+        t.monitor_video_source as monitorVideoSource,
         TRUNCATE(t.progress,2) as progress,
         (
         select

+ 3 - 0
themis-business/src/main/resources/mapper/TIeInvigilateWarnInfoMapper.xml

@@ -23,6 +23,7 @@
                 and tees.room_code = #{roomCode}
             </if>
             and tiiwi.approve_status = 0
+            and tiiwi.remind_status = 1
         </where>
     </select>
 
@@ -54,8 +55,10 @@
                 and tbeiu.org_id = #{orgId}
             </if>
             and tiiwi.approve_status = 0
+            and tiiwi.remind_status = 1
         </where>
     </select>
+
     <select id="findLastMsg" resultType="com.qmth.themis.business.bean.backend.WarningNotifyBean">
     	SELECT
 			f.identity,

+ 49 - 14
themis-business/src/main/resources/mapper/TOeExamRecordMapper.xml

@@ -101,7 +101,6 @@
 		IFNULL(t.warning_count,0) as warningCount,
 		IFNULL(t.breach_status,1) as breachStatus,
 		IFNULL(t.client_websocket_status,'OFF_LINE') as clientWebsocketStatus,
-		IFNULL(t.monitor_status_source,'STOP') as monitorStatusSource,
 		t.client_last_sync_time as updateTime
 	</sql>
 
@@ -157,9 +156,6 @@
 			<if test="clientWebsocketStatus != null and clientWebsocketStatus != ''">
 				and t.client_websocket_status = #{clientWebsocketStatus}
 			</if>
-			<if test="monitorStatusSource != null and monitorStatusSource != ''">
-				and t.monitor_status_source = #{monitorStatusSource}
-			</if>
 			and s.enable = 1
 			and tee.enable = 1
 			and teea.enable = 1
@@ -167,6 +163,48 @@
 		</where>
 	</sql>
 
+	<sql id="invigilatePageHistoryFoot">
+		<where>
+			<if test="examId != null and examId != ''">
+				and t.exam_id = #{examId}
+			</if>
+			<if test="examActivityId != null and examActivityId != ''">
+				and t.exam_activity_id = #{examActivityId}
+			</if>
+			<if test="roomCode != null and roomCode != ''">
+				and s.room_code = #{roomCode}
+			</if>
+			<if test="status != null and status != ''">
+				<choose>
+					<when test="status == 'EXAMING'">
+						and (t.status = 'ANSWERING' or t.status = 'RESUME_PREPARE')
+					</when>
+					<otherwise>
+						and t.status = #{status}
+					</otherwise>
+				</choose>
+			</if>
+			<if test="name != null and name !=''">
+				and s.name like CONCAT('%', #{name},'%')
+			</if>
+			<if test="identity != null and identity !=''">
+				and s.identity like CONCAT('%', #{identity},'%')
+			</if>
+			<if test="maxWarningCount != null and maxWarningCount != '' or maxWarningCount == 0">
+				and t.warning_count &lt;= #{maxWarningCount}
+			</if>
+			<if test="minWarningCount != null and minWarningCount != '' or minWarningCount == 0">
+				and t.warning_count &gt;= #{minWarningCount}
+			</if>
+			<if test="clientWebsocketStatus != null and clientWebsocketStatus != ''">
+				and t.client_websocket_status = #{clientWebsocketStatus}
+			</if>
+			and s.enable = 1
+			and tee.enable = 1
+			and teea.enable = 1
+		</where>
+	</sql>
+
 	<select id="invigilatePageList" resultType="com.qmth.themis.business.bean.backend.InvigilateListBean">
         select
         (@i := @i + 1) as seq,
@@ -322,14 +360,6 @@
 			<if test="minWarningCount != null and minWarningCount != '' or minWarningCount == 0">
 				and toer.warning_count &gt;= #{minWarningCount}
 			</if>
-			<if
-				test="clientWebsocketStatus != null and clientWebsocketStatus != ''">
-				and toer.client_websocket_status = #{clientWebsocketStatus}
-			</if>
-			<if
-				test="monitorStatusSource != null and monitorStatusSource != ''">
-				and toer.monitor_status_source = #{monitorStatusSource}
-			</if>
 			and tee.enable = 1
 			and teea.enable = 1
 		</where>
@@ -471,9 +501,14 @@
 		,(select count(1) from t_ie_invigilate_exception_info tiiei where tiiei.exam_record_id = t.id) as exceptionCount
 		<include refid="invigilatePageMiddle" />
 		left join t_e_student tes on s.student_id = tes.id
-		<include refid="invigilatePageFoot" />
+		<include refid="invigilatePageHistoryFoot" />
 		<if test="breachStatus != null and breachStatus != '' or breachStatus == 0">
-			and t.breach_status = #{breachStatus}
+			<if test="breachStatus == 0">
+			 	and t.breach_status = #{breachStatus}
+			</if>
+			<if test="breachStatus == 1">
+				and (t.breach_status = #{breachStatus} or t.breach_status is null)
+			</if>
 		</if>
 		<if test="finishType != null and finishType != ''">
 			and t.finish_type = #{finishType}

+ 8 - 37
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -337,11 +337,7 @@ public class MqLogicServiceImpl implements MqLogicService {
             VerifyExceptionEnum warningEnum = VerifyExceptionEnum.valueOf(exception);
             WarningDto warningDto = new WarningDto(warningEnum, faceCount, realness, recordId, photoUrl);
             if (Objects.equals(VerifyExceptionEnum.NONE, warningEnum)) {//无异常,往考生日志表里插一条
-                JSONObject jsonObject = new JSONObject();
-                jsonObject.put(PhotoTypeEnum.FACE_VERIFY_PHOTO.name(), photoUrl);
-                TEExamStudentLog teExamStudentLog = new TEExamStudentLog(type, ExamTypeEnum.valueOf(type).getCode(), jsonObject.toJSONString(), examStudentCacheBean.getStudentId(), examStudentCacheBean.getId(), recordId);
                 faceVerifyHistoryService.save(id, recordId, type, photoUrl, faceCount, similarity, realness, time, exception, null);
-                teExamStudentLogService.saveOrUpdate(teExamStudentLog);
             } else {
                 if (Objects.equals(VerifyExceptionEnum.FACE_COUNT_ERROR, warningEnum)) {//人脸数量异常
                     if (faceCount > 1) {//多张人脸
@@ -357,10 +353,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                         if (count >= teConfig.getMultipleFaceCountError()) {
                             ExamRecordCacheUtil.setMultipleFaceCountErrorRandom(recordId, String.valueOf(UUID.randomUUID()).replaceAll("-", ""));
                             ExamRecordCacheUtil.setMultipleFaceCountErrorNum(recordId, 0);
-                            Integer breachStatus = Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1;
-                            if (Objects.nonNull(breachStatus) && breachStatus.intValue() == 1) {
-                                warningService.faceCountError(warningDto);
-                            }
+                            warningService.faceCountError(warningDto);
                         }
                     } else if (faceCount <= 0) {
                         String noFaceRandom = ExamRecordCacheUtil.getNoFaceCountErrorRandom(recordId);
@@ -375,10 +368,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                         if (count >= teConfig.getNoFaceCountError()) {
                             ExamRecordCacheUtil.setNoFaceCountErrorRandom(recordId, String.valueOf(UUID.randomUUID()).replaceAll("-", ""));
                             ExamRecordCacheUtil.setNoFaceCountErrorNum(recordId, 0);
-                            Integer breachStatus = Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1;
-                            if (Objects.nonNull(breachStatus) && breachStatus.intValue() == 1) {
-                                warningService.faceCountError(warningDto);
-                            }
+                            warningService.faceCountError(warningDto);
                         }
                     }
                 } else if (Objects.equals(VerifyExceptionEnum.FACE_COMPARE_ERROR, warningEnum)) {//人脸比对异常
@@ -394,17 +384,11 @@ public class MqLogicServiceImpl implements MqLogicService {
                     if (count >= teConfig.getTotalFaceCompareErrorCount()) {
                         ExamRecordCacheUtil.setFaceCompareErrorRandom(recordId, String.valueOf(UUID.randomUUID()).replaceAll("-", ""));
                         ExamRecordCacheUtil.setFaceCompareErrorNum(recordId, 0);
-                        Integer breachStatus = Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1;
-                        if (Objects.nonNull(breachStatus) && breachStatus.intValue() == 1) {
-                            warningService.faceCompareError(warningDto);
-                        }
+                        warningService.faceCompareError(warningDto);
                     }
                 } else {
                     faceVerifyHistoryService.save(id, recordId, type, photoUrl, faceCount, similarity, realness, time, exception, null);
-                    Integer breachStatus = Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1;
-                    if (realness.intValue() == 0 && Objects.nonNull(breachStatus) && breachStatus.intValue() == 1) {//真实性异常
-                        warningService.realnessError(warningDto);
-                    }
+                    warningService.realnessError(warningDto);
                 }
             }
         } else {
@@ -460,11 +444,7 @@ public class MqLogicServiceImpl implements MqLogicService {
             for (int i = 0; i < jsonArray.size(); i++) {
                 JSONObject jsonObject = jsonArray.getJSONObject(i);
                 if (Objects.equals(VerifyExceptionEnum.NONE, warningEnum)) {//无异常,往考生日志表里插一条
-                    JSONObject object = new JSONObject();
-                    object.put(PhotoTypeEnum.LIVENESS_VERIFY_PHOTO.name(), String.valueOf(jsonObject.get("photoUrl")));
-                    TEExamStudentLog teExamStudentLog = new TEExamStudentLog(type, LivenessTypeEnum.valueOf(type).getTitle(), object.toJSONString(), examStudentCacheBean.getStudentId(), examStudentCacheBean.getId(), recordId);
                     livenessVerifyHistoryService.save(id, recordId, type, actions, retry, startTime, finishTime, exception, null);
-                    teExamStudentLogService.saveOrUpdate(teExamStudentLog);
                 } else {
                     if (Objects.equals(VerifyExceptionEnum.FACE_COUNT_ERROR, warningEnum)) {//人脸数量异常
                         Integer faceCount = Integer.parseInt(String.valueOf(jsonObject.get("faceCount")));
@@ -482,10 +462,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                             if (count >= teConfig.getMultipleFaceCountError()) {
                                 ExamRecordCacheUtil.setMultipleFaceCountErrorRandom(recordId, String.valueOf(UUID.randomUUID()).replaceAll("-", ""));
                                 ExamRecordCacheUtil.setMultipleFaceCountErrorNum(recordId, 0);
-                                Integer breachStatus = Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1;
-                                if (Objects.nonNull(breachStatus) && breachStatus.intValue() == 1) {
-                                    warningService.faceCountError(warningDto);
-                                }
+                                warningService.faceCountError(warningDto);
                             }
                         } else if (faceCount <= 0) {
                             String noFaceRandom = ExamRecordCacheUtil.getNoFaceCountErrorRandom(recordId);
@@ -500,10 +477,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                             if (count >= teConfig.getNoFaceCountError()) {
                                 ExamRecordCacheUtil.setNoFaceCountErrorRandom(recordId, String.valueOf(UUID.randomUUID()).replaceAll("-", ""));
                                 ExamRecordCacheUtil.setNoFaceCountErrorNum(recordId, 0);
-                                Integer breachStatus = Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1;
-                                if (Objects.nonNull(breachStatus) && breachStatus.intValue() == 1) {
-                                    warningService.faceCountError(warningDto);
-                                }
+                                warningService.faceCountError(warningDto);
                             }
                         }
                     } else if (Objects.equals(VerifyExceptionEnum.FACE_COMPARE_ERROR, warningEnum)) {//人脸比对异常
@@ -520,10 +494,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                         if (count >= teConfig.getTotalFaceCompareErrorCount()) {
                             ExamRecordCacheUtil.setFaceCompareErrorRandom(recordId, String.valueOf(UUID.randomUUID()).replaceAll("-", ""));
                             ExamRecordCacheUtil.setFaceCompareErrorNum(recordId, 0);
-                            Integer breachStatus = Objects.nonNull(ExamRecordCacheUtil.getBreachStatus(recordId)) ? ExamRecordCacheUtil.getBreachStatus(recordId) : 1;
-                            if (Objects.nonNull(breachStatus) && breachStatus.intValue() == 1) {
-                                warningService.faceCompareError(warningDto);
-                            }
+                            warningService.faceCompareError(warningDto);
                         }
                     }
                 }
@@ -674,7 +645,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                 }
 
                 //修改异常日志
-                String reason = String.valueOf(jsonObject.getJSONObject("reason").get("reason"));
+                String reason = "【异常处理】" + String.valueOf(jsonObject.getJSONObject("reason").get("reason"));
                 UpdateWrapper<TIeInvigilateExceptionInfo> tIeInvigilateExceptionInfoUpdateWrapper = new UpdateWrapper<>();
                 tIeInvigilateExceptionInfoUpdateWrapper.lambda().set(TIeInvigilateExceptionInfo::getInfo, reason)
                         .set(TIeInvigilateExceptionInfo::getType, exceptionEnum)