Bladeren bron

考务设置修改

wangliang 4 jaren geleden
bovenliggende
commit
c5108d6bde

+ 6 - 6
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java

@@ -71,6 +71,12 @@ public class TEExamActivityController {
         Long examId = null;
         try {
             TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
+            examId = teExamActivityList.get(0).getExamId();
+            TEExam teExam = teExamService.getById(teExamActivityList.get(0).getExamId());
+            if (Objects.nonNull(teExam.getMonitorStatus()) && Objects
+                    .equals(teExam.getMonitorStatus(), InvigilateMonitorStatusEnum.FINISHED)) {
+                throw new BusinessException("监考结束的考试场次不可以修改");
+            }
             teExamActivityList.forEach(s -> {
                 if (Objects.nonNull(s.getId())) {
                     s.setUpdateId(tbUser.getId());
@@ -81,12 +87,6 @@ public class TEExamActivityController {
                 }
                 teExamActivityService.saveOrUpdate(s);
             });
-            examId = teExamActivityList.get(0).getExamId();
-            TEExam teExam = teExamService.getById(teExamActivityList.get(0).getExamId());
-            if (Objects.nonNull(teExam.getMonitorStatus()) && Objects
-                    .equals(teExam.getMonitorStatus(), InvigilateMonitorStatusEnum.FINISHED)) {
-                throw new BusinessException("监考结束的考试场次不可以修改");
-            }
             for (TEExamActivity ac : teExamActivityList) {
                 teExamActivityService.updateExamActivityCacheBean(ac.getId());
             }

+ 22 - 0
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -75,6 +75,9 @@ public class TEExamController {
     @Resource
     TBTaskHistoryService taskHistoryService;
 
+    @Resource
+    TOeExamRecordService tOeExamRecordService;
+
     @ApiOperation(value = "考试批次修改/新增接口")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
@@ -109,6 +112,25 @@ public class TEExamController {
             if (Objects.nonNull(oldId)) {
                 teExamDto.setUpdateId(tbUser.getId());
                 oldTeExam = teExamService.getById(oldId);
+                boolean recordUpdate = true;
+                if ((Objects.nonNull(oldTeExam.getRecordSelectStrategy()) && Objects.nonNull(teExamDto.getRecordSelectStrategy()) && !Objects.equals(oldTeExam.getRecordSelectStrategy(), teExamDto.getRecordSelectStrategy()))) {
+                    recordUpdate = false;
+                }
+                boolean objectiveUpdate = true;
+                if ((Objects.nonNull(oldTeExam.getObjectiveScorePolicy()) && Objects.nonNull(teExam.getObjectiveScorePolicy()) && !Objects.equals(oldTeExam.getObjectiveScorePolicy(), teExamDto.getObjectiveScorePolicy()))) {
+                    objectiveUpdate = false;
+                }
+                QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+                tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamId, oldId);
+                int count = tOeExamRecordService.count(tOeExamRecordQueryWrapper);
+                if (count > 0) {
+                    if (!recordUpdate) {
+                        throw new BusinessException("已有考试记录,取分策略不允许修改");
+                    }
+                    if (!objectiveUpdate) {
+                        throw new BusinessException("已有考试记录,客观题判分策略不允许修改");
+                    }
+                }
             } else {
                 teExamDto.setId(uidUtil.getId());
                 teExamDto.setCreateId(tbUser.getId());

+ 110 - 0
themis-business/src/main/java/com/qmth/themis/business/cache/ExamRecordCacheUtil.java

@@ -479,4 +479,114 @@ public class ExamRecordCacheUtil {
     public static Integer getHasAnswerFile(Long recordId) {
         return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.has_answer_file.getCode());
     }
+
+    public static void setCameraPhotoUpload(Long recordId, Integer cameraPhotoUpload, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.camera_photo_upload.getCode(), cameraPhotoUpload);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.camera_photo_upload.name(), cameraPhotoUpload);
+        }
+    }
+
+    public static void setMobilePhotoUpload(Long recordId, Integer mobilePhotoUpload, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_photo_upload.getCode(), mobilePhotoUpload);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.mobile_photo_upload.name(), mobilePhotoUpload);
+        }
+    }
+
+    public static void setEntryAuthenticationPolicy(Long recordId, String entryAuthenticationPolicy, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.entry_authentication_policy.getCode(), entryAuthenticationPolicy);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.entry_authentication_policy.name(), entryAuthenticationPolicy);
+        }
+    }
+
+    public static void setInProcessFaceStrangerIgnore(Long recordId, Integer inProcessFaceStrangerIgnore, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_face_stranger_ignore.getCode(), inProcessFaceStrangerIgnore);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.in_process_face_stranger_ignore.name(), inProcessFaceStrangerIgnore);
+        }
+    }
+
+    public static void setInProcessLivenessFixedRange(Long recordId, String inProcessLivenessFixedRange, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_fixed_range.getCode(), inProcessLivenessFixedRange);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.in_process_liveness_fixed_range.name(), inProcessLivenessFixedRange);
+        }
+    }
+
+    public static void setInProcessLivenessJudgePolicy(Long recordId, String inProcessLivenessJudgePolicy, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_judge_policy.getCode(), inProcessLivenessJudgePolicy);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.in_process_liveness_judge_policy.name(), inProcessLivenessJudgePolicy);
+        }
+    }
+
+    public static void setMonitorVideoSource(Long recordId, String monitorVideoSource, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.monitor_video_source.getCode(), monitorVideoSource);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.monitor_video_source.name(), monitorVideoSource);
+        }
+    }
+
+    public static void setInProcessRealnessVerifyStatus(Long recordId, Integer inProcessRealnessVerifyStatus, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_realness_verify_status.getCode(), inProcessRealnessVerifyStatus);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.in_process_realness_verify_status.name(), inProcessRealnessVerifyStatus);
+        }
+    }
+
+    public static void setInProcessLivenessVerifyStatus(Long recordId, Integer inProcessLivenessVerifyStatus, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_verify_status.getCode(), inProcessLivenessVerifyStatus);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.in_process_liveness_verify_status.name(), inProcessLivenessVerifyStatus);
+        }
+    }
+
+    public static void setInProcessFaceVerifyStatus(Long recordId, Integer inProcessFaceVerifyStatus, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_face_verify_status.getCode(), inProcessFaceVerifyStatus);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.in_process_face_verify_status.name(), inProcessFaceVerifyStatus);
+        }
+    }
+
+    public static Integer getCameraPhotoUpload(Long recordId) {
+        return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.camera_photo_upload.getCode());
+    }
+
+    public static Integer getMobilePhotoUpload(Long recordId) {
+        return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.mobile_photo_upload.getCode());
+    }
+
+    public static String getEntryAuthenticationPolicy(Long recordId) {
+        return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.entry_authentication_policy.getCode());
+    }
+
+    public static Integer getInProcessFaceStrangerIgnore(Long recordId) {
+        return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_face_stranger_ignore.getCode());
+    }
+
+    public static String getInProcessLivenessFixedRange(Long recordId) {
+        return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_fixed_range.getCode());
+    }
+
+    public static String getInProcessLivenessJudgePolicy(Long recordId) {
+        return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_judge_policy.getCode());
+    }
+
+    public static String getMonitorVideoSource(Long recordId) {
+        return (String) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.monitor_video_source.getCode());
+    }
+
+    public static Integer getInProcessRealnessVerifyStatus(Long recordId) {
+        return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_realness_verify_status.getCode());
+    }
+
+    public static Integer getInProcessLivenessVerifyStatus(Long recordId) {
+        return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_verify_status.getCode());
+    }
+
+    public static Integer getInProcessFaceVerifyStatus(Long recordId) {
+        return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_face_verify_status.getCode());
+    }
 }

+ 37 - 23
themis-business/src/main/java/com/qmth/themis/business/dto/response/TEExamActivityDto.java

@@ -2,14 +2,12 @@ package com.qmth.themis.business.dto.response;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
-import com.qmth.themis.business.enums.EntryAuthenticationPolicyEnum;
-import com.qmth.themis.business.enums.ExamModeEnum;
-import com.qmth.themis.business.enums.HardwareTestEnum;
-import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
+import com.qmth.themis.business.enums.*;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
@@ -149,7 +147,23 @@ public class TEExamActivityDto implements Serializable {
     }
 
     public TEExamActivityDto(ExamCacheBean ec, ExamActivityCacheBean examActivityCacheBean, ExamStudentCacheBean examStudentCacheBean, Long examStudentId, ExamCourseCacheBean examCourseCacheBean,
-                             Long startTime, Long endTime, Integer openingSeconds, Integer minDurationSeconds, Integer maxDurationSeconds, Integer forceFinish) {
+                             Long recordId) {
+        Long startTime = ExamRecordCacheUtil.getStartTime(recordId);
+        Long endTime = ExamRecordCacheUtil.getEndTime(recordId);
+        Integer openingSeconds = ExamRecordCacheUtil.getOpeningSeconds(recordId);
+        Integer minDurationSeconds = ExamRecordCacheUtil.getMinDurationSeconds(recordId);
+        Integer maxDurationSeconds = ExamRecordCacheUtil.getMaxDurationSeconds(recordId);
+        Integer forceFinish = ExamRecordCacheUtil.getForceFinish(recordId);
+        Integer cameraPhotoUpload = ExamRecordCacheUtil.getCameraPhotoUpload(recordId);
+        Integer mobilePhotoUpload = ExamRecordCacheUtil.getMobilePhotoUpload(recordId);
+        String entryAuthenticationPolicy = ExamRecordCacheUtil.getEntryAuthenticationPolicy(recordId);
+        Integer inProcessFaceStrangerIgnore = ExamRecordCacheUtil.getInProcessFaceStrangerIgnore(recordId);
+        String inProcessLivenessFixedRange = ExamRecordCacheUtil.getInProcessLivenessFixedRange(recordId);
+        String inProcessLivenessJudgePolicy = ExamRecordCacheUtil.getInProcessLivenessJudgePolicy(recordId);
+        String monitorVideoSource = ExamRecordCacheUtil.getMonitorVideoSource(recordId);
+        Integer inProcessFaceVerify = ExamRecordCacheUtil.getInProcessFaceVerifyStatus(recordId);
+        Integer inProcessLivenessVerify = ExamRecordCacheUtil.getInProcessLivenessVerifyStatus(recordId);
+        Integer inProcessRealnessVerify = ExamRecordCacheUtil.getInProcessRealnessVerifyStatus(recordId);
         this.id = examActivityCacheBean.getId();
 //        this.code = examActivityCacheBean.getCode();
 //        this.examStudentId = examStudentId;
@@ -175,16 +189,16 @@ public class TEExamActivityDto implements Serializable {
         } else {
             this.maxFinishTime = Objects.nonNull(endTime) ? endTime : ec.getEndTime();
         }
-        this.cameraPhotoUpload = ec.getCameraPhotoUpload();
-        this.entryAuthenticationPolicy = ec.getEntryAuthenticationPolicy().name();
-        if (Objects.nonNull(ec.getMonitorVideoSource()) && !Objects.equals(ec.getMonitorVideoSource().toString().trim().replaceAll(" ", ""), "")) {
-            this.setMonitorVideoSource(Arrays.asList(ec.getMonitorVideoSource().trim().toUpperCase().split(",")));
+        this.cameraPhotoUpload = cameraPhotoUpload;
+        this.entryAuthenticationPolicy = entryAuthenticationPolicy;
+        if (Objects.nonNull(monitorVideoSource) && !Objects.equals(monitorVideoSource.trim().replaceAll(" ", ""), "")) {
+            this.setMonitorVideoSource(Arrays.asList(monitorVideoSource.trim().toUpperCase().split(",")));
             //加入monitorAudioEnable逻辑
-            if (ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) || ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name())) {
+            if (monitorVideoSource.toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) || monitorVideoSource.toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name())) {
                 this.monitorAudioEnable = true;
             }
             //加入hardwareTest逻辑
-            if (ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()) || (Objects.nonNull(this.getEntryAuthenticationPolicy()) && (Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.LIVENESS_VERIFY.name()) || Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.FACE_VERIFY_FORCE.name()))) || (Objects.nonNull(this.getCameraPhotoUpload()) && this.getCameraPhotoUpload() == 1)) {
+            if (monitorVideoSource.toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()) || (Objects.nonNull(this.getEntryAuthenticationPolicy()) && (Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.LIVENESS_VERIFY.name()) || Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.FACE_VERIFY_FORCE.name()))) || (Objects.nonNull(this.getCameraPhotoUpload()) && this.getCameraPhotoUpload() == 1)) {
                 if (Objects.isNull(this.hardwareTest)) {
                     this.hardwareTest = new ArrayList<>();
                 }
@@ -206,34 +220,34 @@ public class TEExamActivityDto implements Serializable {
         this.activityMaxDurationSeconds = maxDurationSeconds;
         this.examCount = ec.getExamCount();
         this.forceFinish = forceFinish;
-        this.inProcessFaceVerify = ec.getInProcessFaceVerify();
-        this.inProcessFaceStrangerIgnore = ec.getInProcessFaceStrangerIgnore();
-        this.inProcessLivenessVerify = ec.getInProcessLivenessVerify();
-        this.inProcessRealnessVerify = ec.getInProcessRealnessVerify();
-        if (Objects.nonNull(ec.getInProcessLivenessFixedRange())) {
-            String[] longs = ec.getInProcessLivenessFixedRange().trim().split(",");
-            List inProcessLivenessFixedRange = new ArrayList();
+        this.inProcessFaceVerify = inProcessFaceVerify;
+        this.inProcessFaceStrangerIgnore = inProcessFaceStrangerIgnore;
+        this.inProcessLivenessVerify = inProcessLivenessVerify;
+        this.inProcessRealnessVerify = inProcessRealnessVerify;
+        if (Objects.nonNull(inProcessLivenessFixedRange)) {
+            String[] longs = inProcessLivenessFixedRange.trim().split(",");
+            List inProcessLivenessFixedRangeList = new ArrayList();
             for (int i = 0; i < longs.length; i++) {
                 Integer integer = Integer.valueOf(longs[i].trim());
-                inProcessLivenessFixedRange.add(integer);
+                inProcessLivenessFixedRangeList.add(integer);
             }
             if (Objects.equals(inProcessLivenessFixedRange.toString().trim().replaceAll(" ", ""), "")) {
                 this.setInProcessLivenessFixedRange(null);
             } else {
-                this.setInProcessLivenessFixedRange(inProcessLivenessFixedRange);
+                this.setInProcessLivenessFixedRange(inProcessLivenessFixedRangeList);
             }
         }
-        this.inProcessLivenessJudgePolicy = ec.getInProcessLivenessJudgePolicy().name();
+        this.inProcessLivenessJudgePolicy = inProcessLivenessJudgePolicy;
         this.startTime = startTime;
         this.finishTime = endTime;
         this.leftExamCount = (ec.getExamCount().intValue() - examStudentCacheBean.getAlreadyExamCount().intValue()) < 0 ? 0 : ec.getExamCount().intValue() - examStudentCacheBean.getAlreadyExamCount().intValue();
-        this.mobilePhotoUpload = ec.getMobilePhotoUpload();
+        this.mobilePhotoUpload = mobilePhotoUpload;
         this.examId = ec.getId();
         this.preNotice = ec.getPreNotice();
         this.preNoticeStaySeconds = ec.getPreNoticeStaySeconds();
     }
 
-    public void setTeExamActivityDto(TEExamActivityDto teExamActivityDto){
+    public void setTeExamActivityDto(TEExamActivityDto teExamActivityDto) {
         setId(teExamActivityDto.getId());
         setPrepareTime(teExamActivityDto.getPrepareTime());
         setMinStartTime(teExamActivityDto.getMinStartTime());

+ 86 - 7
themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamRecord.java

@@ -2,17 +2,12 @@ package com.qmth.themis.business.entity;
 
 import java.io.Serializable;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
-import com.qmth.themis.business.enums.FinishTypeEnum;
-import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
-import com.qmth.themis.business.enums.ReviewResultEnum;
-import com.qmth.themis.business.enums.ScoreStatusEnum;
-import com.qmth.themis.business.enums.VerifyExceptionEnum;
-import com.qmth.themis.business.enums.WebsocketStatusEnum;
+import com.qmth.themis.business.enums.*;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -219,6 +214,90 @@ public class TOeExamRecord implements Serializable {
     @TableField(value = "in_process_realness_verify_status")
     private Integer inProcessRealnessVerifyStatus;
 
+    @ApiModelProperty(value = "是否允许使用摄像头拍照答题,0:不允许,1:允许")
+    @TableField(value = "camera_photo_upload")
+    private Integer cameraPhotoUpload;
+
+    @ApiModelProperty(value = "是否允许使用移动端拍照答题,0:不开启,1:开启")
+    @TableField(value = "mobile_photo_upload")
+    private Integer mobilePhotoUpload;
+
+    @ApiModelProperty(value = "开考身份验证策略,off:关闭,face_verify_optional:非强制人脸验证,face_verify_force:强制人脸验证,liveness:活体验证")
+    @TableField(value = "entry_authentication_policy")
+    private EntryAuthenticationPolicyEnum entryAuthenticationPolicy;
+
+    @ApiModelProperty(value = "考试过程中人脸检测是否忽略陌生人 ,0:不忽略,1:忽略")
+    @TableField(value = "in_process_face_stranger_ignore")
+    private Integer inProcessFaceStrangerIgnore;
+
+    @ApiModelProperty(value = "考试过程中活体检测间隔时间")
+    @TableField(value = "in_process_liveness_fixed_range")
+    private String inProcessLivenessFixedRange;
+
+    @ApiModelProperty(value = "考试过程中活体检测结果判定规则,any:任意一次通过,all:全部都要通过,more:通过次数大于失败次数")
+    @TableField(value = "in_process_liveness_judge_policy")
+    private InProcessLivenessJudgePolicyEnum inProcessLivenessJudgePolicy;
+
+    @ApiModelProperty(value = "开启监控的视频源")
+    @TableField(value = "monitor_video_source", updateStrategy = FieldStrategy.IGNORED)
+    private String monitorVideoSource;
+
+    public Integer getCameraPhotoUpload() {
+        return cameraPhotoUpload;
+    }
+
+    public void setCameraPhotoUpload(Integer cameraPhotoUpload) {
+        this.cameraPhotoUpload = cameraPhotoUpload;
+    }
+
+    public Integer getMobilePhotoUpload() {
+        return mobilePhotoUpload;
+    }
+
+    public void setMobilePhotoUpload(Integer mobilePhotoUpload) {
+        this.mobilePhotoUpload = mobilePhotoUpload;
+    }
+
+    public EntryAuthenticationPolicyEnum getEntryAuthenticationPolicy() {
+        return entryAuthenticationPolicy;
+    }
+
+    public void setEntryAuthenticationPolicy(EntryAuthenticationPolicyEnum entryAuthenticationPolicy) {
+        this.entryAuthenticationPolicy = entryAuthenticationPolicy;
+    }
+
+    public Integer getInProcessFaceStrangerIgnore() {
+        return inProcessFaceStrangerIgnore;
+    }
+
+    public void setInProcessFaceStrangerIgnore(Integer inProcessFaceStrangerIgnore) {
+        this.inProcessFaceStrangerIgnore = inProcessFaceStrangerIgnore;
+    }
+
+    public String getInProcessLivenessFixedRange() {
+        return inProcessLivenessFixedRange;
+    }
+
+    public void setInProcessLivenessFixedRange(String inProcessLivenessFixedRange) {
+        this.inProcessLivenessFixedRange = inProcessLivenessFixedRange;
+    }
+
+    public InProcessLivenessJudgePolicyEnum getInProcessLivenessJudgePolicy() {
+        return inProcessLivenessJudgePolicy;
+    }
+
+    public void setInProcessLivenessJudgePolicy(InProcessLivenessJudgePolicyEnum inProcessLivenessJudgePolicy) {
+        this.inProcessLivenessJudgePolicy = inProcessLivenessJudgePolicy;
+    }
+
+    public String getMonitorVideoSource() {
+        return monitorVideoSource;
+    }
+
+    public void setMonitorVideoSource(String monitorVideoSource) {
+        this.monitorVideoSource = monitorVideoSource;
+    }
+
     public Integer getInProcessRealnessVerifyStatus() {
         return inProcessRealnessVerifyStatus;
     }

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

@@ -99,7 +99,21 @@ public enum ExamRecordFieldEnum {
 
     force_finish("forceFinish"),
     
-    has_answer_file("hasAnswerFile");
+    has_answer_file("hasAnswerFile"),
+
+    camera_photo_upload("cameraPhotoUpload"),
+
+    mobile_photo_upload("mobilePhotoUpload"),
+
+    entry_authentication_policy("entryAuthenticationPolicy"),
+
+    in_process_face_stranger_ignore("inProcessFaceStrangerIgnore"),
+
+    in_process_liveness_fixed_range("inProcessLivenessFixedRange"),
+
+    in_process_liveness_judge_policy("inProcessLivenessJudgePolicy"),
+
+    monitor_video_source("monitorVideoSource");
 
     private String code;
 

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

@@ -228,25 +228,8 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                         , tencentYunUtil.getTencentYunDomain().getAppId());
 
                 TEExamActivityDto teExamActivityDto = new TEExamActivityDto(examCache, ac, examStudentCacheBean,
-                        examStudentId, ec, ExamRecordCacheUtil.getStartTime(recordId),
-                        ExamRecordCacheUtil.getEndTime(recordId), ExamRecordCacheUtil.getOpeningSeconds(recordId),
-                        ExamRecordCacheUtil.getMinDurationSeconds(recordId),
-                        ExamRecordCacheUtil.getMaxDurationSeconds(recordId), ExamRecordCacheUtil.getForceFinish(recordId));
+                        examStudentId, ec, recordId);
                 prepare.setTeExamActivityDto(teExamActivityDto);
-
-                ExamRecordCacheUtil.setStartTime(recordId, ac.getStartTime(), false);
-                ExamRecordCacheUtil.setEndTime(recordId, ac.getFinishTime(), false);
-                ExamRecordCacheUtil.setOpeningSeconds(recordId, ac.getOpeningSeconds(), false);
-                ExamRecordCacheUtil.setMinDurationSeconds(recordId, examCache.getMinDurationSeconds(), false);
-                ExamRecordCacheUtil.setMaxDurationSeconds(recordId, ac.getMaxDurationSeconds(), false);
-                ExamRecordCacheUtil.setForceFinish(recordId, examCache.getForceFinish(), false);
-                String[] columns = new String[]{ExamRecordFieldEnum.start_time.name(),
-                        ExamRecordFieldEnum.end_time.name(), ExamRecordFieldEnum.opening_seconds.name(),
-                        ExamRecordFieldEnum.min_duration_seconds.name(),
-                        ExamRecordFieldEnum.max_duration_seconds.name(), ExamRecordFieldEnum.force_finish.name()};
-                Object[] values = new Object[]{ac.getStartTime(), ac.getFinishTime(), ac.getOpeningSeconds(),
-                        examCache.getMinDurationSeconds(), ac.getMaxDurationSeconds(), examCache.getForceFinish()};
-                toeExamRecordService.dataUpdatesMq(recordId, columns, values);
                 return prepare;
             }
         }
@@ -312,6 +295,40 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 , tencentYunUtil.getTencentYunDomain().getAppId());
         TEExamActivityDto teExamActivityDto = teExamActivityService.getWaitingExam(activityId, examStudentId, es.getCourseCode());
         prepare.setTeExamActivityDto(teExamActivityDto);
+
+        ExamRecordCacheUtil.setStartTime(recordId, ac.getStartTime(), false);
+        ExamRecordCacheUtil.setEndTime(recordId, ac.getFinishTime(), false);
+        ExamRecordCacheUtil.setOpeningSeconds(recordId, ac.getOpeningSeconds(), false);
+        ExamRecordCacheUtil.setMinDurationSeconds(recordId, examCache.getMinDurationSeconds(), false);
+        ExamRecordCacheUtil.setMaxDurationSeconds(recordId, ac.getMaxDurationSeconds(), false);
+        ExamRecordCacheUtil.setForceFinish(recordId, examCache.getForceFinish(), false);
+        ExamRecordCacheUtil.setCameraPhotoUpload(recordId, examCache.getCameraPhotoUpload(), false);
+        ExamRecordCacheUtil.setMobilePhotoUpload(recordId, examCache.getMobilePhotoUpload(), false);
+        ExamRecordCacheUtil.setEntryAuthenticationPolicy(recordId, examCache.getEntryAuthenticationPolicy().name(), false);
+        ExamRecordCacheUtil.setInProcessFaceVerifyStatus(recordId, examCache.getInProcessFaceVerify(), false);
+        ExamRecordCacheUtil.setInProcessLivenessVerifyStatus(recordId, examCache.getInProcessLivenessVerify(), false);
+        ExamRecordCacheUtil.setInProcessRealnessVerifyStatus(recordId, examCache.getInProcessRealnessVerify(), false);
+        ExamRecordCacheUtil.setInProcessFaceStrangerIgnore(recordId, examCache.getInProcessFaceStrangerIgnore(), false);
+        ExamRecordCacheUtil.setInProcessLivenessFixedRange(recordId, examCache.getInProcessLivenessFixedRange(), false);
+        ExamRecordCacheUtil.setInProcessLivenessJudgePolicy(recordId, examCache.getInProcessLivenessJudgePolicy().name(), false);
+        ExamRecordCacheUtil.setMonitorVideoSource(recordId, examCache.getMonitorVideoSource(), false);
+
+        String[] columns = new String[]{ExamRecordFieldEnum.start_time.name(),
+                ExamRecordFieldEnum.end_time.name(), ExamRecordFieldEnum.opening_seconds.name(),
+                ExamRecordFieldEnum.min_duration_seconds.name(),
+                ExamRecordFieldEnum.max_duration_seconds.name(), ExamRecordFieldEnum.force_finish.name(),
+                ExamRecordFieldEnum.camera_photo_upload.name(), ExamRecordFieldEnum.mobile_photo_upload.name(),
+                ExamRecordFieldEnum.entry_authentication_policy.name(), ExamRecordFieldEnum.in_process_face_verify_status.name(),
+                ExamRecordFieldEnum.in_process_liveness_verify_status.name(), ExamRecordFieldEnum.in_process_realness_verify_status.name(),
+                ExamRecordFieldEnum.in_process_face_stranger_ignore.name(), ExamRecordFieldEnum.in_process_liveness_fixed_range.name(),
+                ExamRecordFieldEnum.in_process_liveness_judge_policy.name(), ExamRecordFieldEnum.monitor_video_source.name()};
+        Object[] values = new Object[]{ac.getStartTime(), ac.getFinishTime(), ac.getOpeningSeconds(),
+                examCache.getMinDurationSeconds(), ac.getMaxDurationSeconds(), examCache.getForceFinish(),
+                examCache.getCameraPhotoUpload(), examCache.getMonitorVideoSource(), examCache.getEntryAuthenticationPolicy().name(),
+                examCache.getInProcessFaceVerify(), examCache.getInProcessLivenessVerify(), examCache.getInProcessRealnessVerify(),
+                examCache.getInProcessFaceStrangerIgnore(), examCache.getInProcessLivenessFixedRange(), examCache.getInProcessLivenessJudgePolicy().name(),
+                examCache.getMonitorVideoSource()};
+        toeExamRecordService.dataUpdatesMq(recordId, columns, values);
         // 更新考生缓存
         redisUtil.set(RedisKeyHelper.examStudentCacheKey(examStudentId), es);
         //更新场次-考试记录缓存
@@ -528,19 +545,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             Long date = ExamRecordCacheUtil.getExamFinalFinishTime(recordId);
             if (Objects.isNull(date)) {
                 Long startTime = ExamRecordCacheUtil.getStartTime(recordId);
-                Integer activityMaxDurationSeconds = Objects.nonNull(ac.getMaxDurationSeconds()) ?
-                        ac.getMaxDurationSeconds() :
-                        null;
-                Integer maxDurationSeconds = Objects.nonNull(exam.getMaxDurationSeconds()) ?
-                        exam.getMaxDurationSeconds() :
-                        null;
-                Integer finalMaxDurationSeconds = Objects.nonNull(activityMaxDurationSeconds) ?
-                        activityMaxDurationSeconds :
-                        maxDurationSeconds;
+                Integer maxDurationSeconds = ExamRecordCacheUtil.getMaxDurationSeconds(recordId);
                 Calendar calendar = Calendar.getInstance();
-                if (Objects.nonNull(finalMaxDurationSeconds)) {
+                if (Objects.nonNull(maxDurationSeconds)) {
                     calendar.setTimeInMillis(startTime);
-                    calendar.add(Calendar.SECOND, finalMaxDurationSeconds.intValue());
+                    calendar.add(Calendar.SECOND, maxDurationSeconds.intValue());
                 }
                 Integer breakResumeCount = exam.getBreakResumeCount();
                 Integer breakExpireSeconds = Objects.isNull(exam.getBreakExpireSeconds()) ?
@@ -831,10 +840,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         ExamActivityCacheBean ac = teExamActivityService.getExamActivityCacheBean(es.getExamActivityId());
         ExamCourseCacheBean examCourseCacheBean = teExamCourseService.getExamCourseCacheBean(es.getExamId(), es.getCourseCode());
         TEExamActivityDto teExamActivityDto = new TEExamActivityDto(ec, ac, es,
-                examStudentId, examCourseCacheBean, ExamRecordCacheUtil.getStartTime(recordId),
-                ExamRecordCacheUtil.getEndTime(recordId), ExamRecordCacheUtil.getOpeningSeconds(recordId),
-                ExamRecordCacheUtil.getMinDurationSeconds(recordId),
-                ExamRecordCacheUtil.getMaxDurationSeconds(recordId), ExamRecordCacheUtil.getForceFinish(recordId));
+                examStudentId, examCourseCacheBean, recordId);
         ret.setTeExamActivityDto(teExamActivityDto);
 
         ExamStudentPaperStructCacheBean struct = (ExamStudentPaperStructCacheBean) redisUtil