瀏覽代碼

脚本和枚举类型修改

wangliang 4 年之前
父節點
當前提交
3d338ad58a
共有 53 個文件被更改,包括 888 次插入353 次删除
  1. 3 4
      themis-backend/src/main/java/com/qmth/themis/backend/api/TBExamInvigilateUserController.java
  2. 3 2
      themis-backend/src/main/java/com/qmth/themis/backend/api/TBTaskHistoryController.java
  3. 1 1
      themis-backend/src/main/java/com/qmth/themis/backend/api/TBUserController.java
  4. 11 14
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamController.java
  5. 2 3
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamPaperController.java
  6. 2 3
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamStudentController.java
  7. 9 3
      themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamPaperCacheBean.java
  8. 21 12
      themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordCacheBean.java
  9. 3 1
      themis-business/src/main/java/com/qmth/themis/business/dao/TBTaskHistoryMapper.java
  10. 7 7
      themis-business/src/main/java/com/qmth/themis/business/entity/TBOrg.java
  11. 12 10
      themis-business/src/main/java/com/qmth/themis/business/entity/TBTaskHistory.java
  12. 53 31
      themis-business/src/main/java/com/qmth/themis/business/entity/TEExam.java
  13. 5 4
      themis-business/src/main/java/com/qmth/themis/business/entity/TEExamPaper.java
  14. 11 10
      themis-business/src/main/java/com/qmth/themis/business/entity/TEStudent.java
  15. 4 3
      themis-business/src/main/java/com/qmth/themis/business/entity/TIeExamInvigilateNotice.java
  16. 9 7
      themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamBreakHistory.java
  17. 117 0
      themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamMonitorExceptionHistory.java
  18. 64 15
      themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamRecord.java
  19. 9 7
      themis-business/src/main/java/com/qmth/themis/business/entity/TOeFaceVerifyHistory.java
  20. 5 16
      themis-business/src/main/java/com/qmth/themis/business/entity/TOeLivenessVerifyHistory.java
  21. 25 0
      themis-business/src/main/java/com/qmth/themis/business/enums/BreakReasonEnum.java
  22. 24 0
      themis-business/src/main/java/com/qmth/themis/business/enums/EncryptModeEnum.java
  23. 29 0
      themis-business/src/main/java/com/qmth/themis/business/enums/EntryAuthenticationPolicyEnum.java
  24. 7 7
      themis-business/src/main/java/com/qmth/themis/business/enums/ExamModeEnum.java
  25. 21 29
      themis-business/src/main/java/com/qmth/themis/business/enums/ExamRecordStatusEnum.java
  26. 27 0
      themis-business/src/main/java/com/qmth/themis/business/enums/ExamTypeEnum.java
  27. 23 0
      themis-business/src/main/java/com/qmth/themis/business/enums/ExceptionEnum.java
  28. 0 16
      themis-business/src/main/java/com/qmth/themis/business/enums/FinishExamTypeEnum.java
  29. 27 0
      themis-business/src/main/java/com/qmth/themis/business/enums/FinishTypeEnum.java
  30. 25 0
      themis-business/src/main/java/com/qmth/themis/business/enums/GenderEnum.java
  31. 26 0
      themis-business/src/main/java/com/qmth/themis/business/enums/InProcessLivenessJudgePolicyEnum.java
  32. 23 0
      themis-business/src/main/java/com/qmth/themis/business/enums/InvigilateNoticeEnum.java
  33. 24 0
      themis-business/src/main/java/com/qmth/themis/business/enums/MonitorStatusSourceEnum.java
  34. 2 2
      themis-business/src/main/java/com/qmth/themis/business/enums/ObjectiveScorePolicyEnum.java
  35. 25 0
      themis-business/src/main/java/com/qmth/themis/business/enums/RealnessEnum.java
  36. 26 0
      themis-business/src/main/java/com/qmth/themis/business/enums/RecordSelectStrategyEnum.java
  37. 25 0
      themis-business/src/main/java/com/qmth/themis/business/enums/ReviewResultEnum.java
  38. 26 0
      themis-business/src/main/java/com/qmth/themis/business/enums/ScoreStatusEnum.java
  39. 29 0
      themis-business/src/main/java/com/qmth/themis/business/enums/TaskStatusEnum.java
  40. 21 36
      themis-business/src/main/java/com/qmth/themis/business/enums/TaskTypeEnum.java
  41. 0 36
      themis-business/src/main/java/com/qmth/themis/business/enums/TaskTypeExecEnum.java
  42. 0 21
      themis-business/src/main/java/com/qmth/themis/business/enums/WebsocketExceptionEnum.java
  43. 3 1
      themis-business/src/main/java/com/qmth/themis/business/service/TBTaskHistoryService.java
  44. 3 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TBTaskHistoryServiceImpl.java
  45. 4 3
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java
  46. 2 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java
  47. 3 3
      themis-business/src/main/java/com/qmth/themis/business/templete/TaskExportCommon.java
  48. 3 3
      themis-business/src/main/java/com/qmth/themis/business/templete/TaskImportCommon.java
  49. 2 1
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java
  50. 1 1
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamStudentImportTemplete.java
  51. 75 33
      themis-business/src/main/resources/db/init.sql
  52. 3 3
      themis-mq/src/main/java/com/qmth/themis/mq/templete/impl/WebsocketUnNormalConcurrentlyImpl.java
  53. 3 3
      themis-task/src/main/java/com/qmth/themis/task/quartz/ExamActivityJob.java

+ 3 - 4
themis-backend/src/main/java/com/qmth/themis/backend/api/TBExamInvigilateUserController.java

@@ -3,15 +3,14 @@ package com.qmth.themis.backend.api;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.themis.backend.config.DictionaryConfig;
 import com.qmth.themis.backend.util.ServletUtil;
 import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
 import com.qmth.themis.business.enums.MqEnum;
+import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.enums.TaskTypeEnum;
-import com.qmth.themis.business.enums.TaskTypeExecEnum;
 import com.qmth.themis.business.service.TBAttachmentService;
 import com.qmth.themis.business.service.TBExamInvigilateUserService;
 import com.qmth.themis.business.service.TBTaskHistoryService;
@@ -142,7 +141,7 @@ public class TBExamInvigilateUserController {
                 throw new BusinessException(ExceptionResultEnum.ATTACHMENT_ERROR);
             } else {
                 //往任务表里插一条数据
-                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.import_invigilate_user.ordinal(), tbAttachment.getId(), TaskTypeExecEnum.init.ordinal(), SystemConstant.IMPORT_INIT, 0d, tbAttachment.getName(), tbAttachment.getRemark(), tbUser.getId());
+                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.import_invigilate_user, tbAttachment.getId(), TaskStatusEnum.init, SystemConstant.IMPORT_INIT, 0d, tbAttachment.getName(), tbAttachment.getRemark(), tbUser.getId());
                 taskHistoryService.save(tbTaskHistory);
                 transMap.put("tbTaskHistory", tbTaskHistory);
             }
@@ -181,7 +180,7 @@ public class TBExamInvigilateUserController {
                 Map transMap = new HashMap();
                 TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
                 //往任务表里插一条数据
-                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.export_invigilate_user.ordinal(), TaskTypeExecEnum.init.ordinal(), SystemConstant.EXPORT_INIT, 0d, tbUser.getId());
+                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.export_invigilate_user, TaskStatusEnum.init, SystemConstant.EXPORT_INIT, 0d, tbUser.getId());
                 taskHistoryService.save(tbTaskHistory);
                 transMap.put("tbTaskHistory", tbTaskHistory);
                 transMap.put("createId", tbUser.getId());

+ 3 - 2
themis-backend/src/main/java/com/qmth/themis/backend/api/TBTaskHistoryController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBTaskHistory;
+import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.enums.TaskTypeEnum;
 import com.qmth.themis.business.service.TBTaskHistoryService;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -39,11 +40,11 @@ public class TBTaskHistoryController {
     @ApiOperation(value = "任务查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.GET)
     @ApiResponses({@ApiResponse(code = 200, message = "任务信息", response = TBTaskHistory.class)})
-    public Result query(@ApiParam(value = "任务id", required = false) @RequestParam(required = false) Long id, @ApiParam(value = "业务对象id", required = false) @RequestParam(required = false) Long entityId, @ApiParam(value = "任务类型", required = true) @RequestParam Integer type, @ApiParam(value = "任务状态", required = false) @RequestParam(required = false) Integer status, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber, @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result query(@ApiParam(value = "任务id", required = false) @RequestParam(required = false) Long id, @ApiParam(value = "业务对象id", required = false) @RequestParam(required = false) Long entityId, @ApiParam(value = "任务类型", required = true) @RequestParam TaskTypeEnum type, @ApiParam(value = "任务状态", required = false) @RequestParam(required = false) TaskStatusEnum status, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber, @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         if (Objects.isNull(type) || Objects.equals(type, "")) {
             throw new BusinessException(ExceptionResultEnum.TASK_TYPE_IS_NULL);
         }
-        if (Objects.isNull(TaskTypeEnum.convertToName(type))) {
+        if (Objects.isNull(TaskTypeEnum.valueOf(type.name()))) {
             throw new BusinessException(ExceptionResultEnum.TASK_TYPE_ERROR);
         }
         IPage<Map> teExamStudentIPage = tbTaskHistoryService.taskQuery(new Page<>(pageNumber, pageSize), id, entityId, type, status);

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

@@ -177,7 +177,7 @@ public class TBUserController {
             Map orgMap = new HashMap();
             orgMap.put("name", authDto.getTbOrg().getName());
             orgMap.put("logo", authDto.getTbOrg().getLogo());
-            orgMap.put("enableVideoRecord", authDto.getTbOrg().getEnableVideoRecord());
+            orgMap.put("enableMonitorRecord", authDto.getTbOrg().getEnableMonitorRecord());
             map.put(SystemConstant.ORG_INFO, orgMap);
             redisUtil.setOrg(authDto.getTbOrg().getId(), authDto.getTbOrg());
         }

+ 11 - 14
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamController.java

@@ -3,7 +3,6 @@ package com.qmth.themis.backend.api;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.themis.backend.config.DictionaryConfig;
 import com.qmth.themis.backend.util.ServletUtil;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
@@ -83,7 +82,7 @@ public class TEExamController {
                 teExam.setCreateId(tbUser.getId());
             }
             teExamService.saveOrUpdate(teExam);
-            if (Objects.nonNull(oldTeExam) && oldTeExam.getMode().intValue() != teExam.getMode().intValue()) {//如果模式改变,则删除之前模式的全部quartz
+            if (Objects.nonNull(oldTeExam) && Objects.equals(oldTeExam.getMode().name(), teExam.getMode().name())) {//如果模式改变,则删除之前模式的全部quartz
                 QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
                 teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, oldId);
                 List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
@@ -98,20 +97,18 @@ public class TEExamController {
                 teExamActivityService.remove(teExamActivityQueryWrapper);
             }
             //如果是随到随考,则默认插入一条场次信息
-            if (teExam.getMode().intValue() == ExamModeEnum.anytime.ordinal()) {//随到随考模式
+            if (Objects.equals(teExam.getMode().name(), ExamModeEnum.anytime.name())) {//随到随考模式
                 if (Objects.isNull(oldId)) {//如果是新增
-                    if (teExam.getMode().intValue() == ExamModeEnum.anytime.ordinal()) {
-                        TEExamActivity teExamActivity = new TEExamActivity(teExam.getId(), teExam.getPrepareSeconds(), teExam.getMaxDurationSeconds(), teExam.getOpeningSeconds(), teExam.getStartTime(), teExam.getEndTime(), tbUser.getId());
-                        teExamActivityService.saveOrUpdate(teExamActivity);
+                    TEExamActivity teExamActivity = new TEExamActivity(teExam.getId(), teExam.getPrepareSeconds(), teExam.getMaxDurationSeconds(), teExam.getOpeningSeconds(), teExam.getStartTime(), teExam.getEndTime(), tbUser.getId());
+                    teExamActivityService.saveOrUpdate(teExamActivity);
 
-                        //新增quartz任务,发送mq消息start
-                        Map<String, Object> prop = new HashMap<>();
-                        prop.put("oper", "insert");
-                        prop.put("exam", teExam);
-                        MqDto mqDto = new MqDto(MqTopicEnum.quartzTopic.getCode(), MqTagEnum.examActivity.name(), JacksonUtil.parseJson(Arrays.asList(teExamActivity)), MqEnum.QUARTZ_LOG, String.valueOf(teExam.getId()), prop, tbUser.getName());
-                        mqDtoService.assembleSendOneWayMsg(mqDto);
-                        //新增quartz任务,发送mq消息end
-                    }
+                    //新增quartz任务,发送mq消息start
+                    Map<String, Object> prop = new HashMap<>();
+                    prop.put("oper", "insert");
+                    prop.put("exam", teExam);
+                    MqDto mqDto = new MqDto(MqTopicEnum.quartzTopic.getCode(), MqTagEnum.examActivity.name(), JacksonUtil.parseJson(Arrays.asList(teExamActivity)), MqEnum.QUARTZ_LOG, String.valueOf(teExam.getId()), prop, tbUser.getName());
+                    mqDtoService.assembleSendOneWayMsg(mqDto);
+                    //新增quartz任务,发送mq消息end
                 } else {//修改需删除之前生成的全部quartz任务
                     QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
                     teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, oldId);

+ 2 - 3
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamPaperController.java

@@ -1,15 +1,14 @@
 package com.qmth.themis.backend.api;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qmth.themis.backend.config.DictionaryConfig;
 import com.qmth.themis.backend.util.ServletUtil;
 import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
 import com.qmth.themis.business.enums.MqEnum;
+import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.enums.TaskTypeEnum;
-import com.qmth.themis.business.enums.TaskTypeExecEnum;
 import com.qmth.themis.business.service.TBAttachmentService;
 import com.qmth.themis.business.service.TBTaskHistoryService;
 import com.qmth.themis.business.service.TEExamPaperService;
@@ -144,7 +143,7 @@ public class TEExamPaperController {
                 throw new BusinessException(ExceptionResultEnum.ATTACHMENT_ERROR);
             } else {
                 //往任务表里插一条数据
-                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.import_exam_paper.ordinal(), tbAttachment.getId(), TaskTypeExecEnum.init.ordinal(), SystemConstant.IMPORT_INIT, 0d, tbAttachment.getName(), tbAttachment.getRemark(), tbUser.getId());
+                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.import_exam_paper, tbAttachment.getId(), TaskStatusEnum.init, SystemConstant.IMPORT_INIT, 0d, tbAttachment.getName(), tbAttachment.getRemark(), tbUser.getId());
                 taskHistoryService.save(tbTaskHistory);
                 transMap.put("tbTaskHistory", tbTaskHistory);
             }

+ 2 - 3
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamStudentController.java

@@ -3,7 +3,6 @@ package com.qmth.themis.backend.api;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.themis.backend.config.DictionaryConfig;
 import com.qmth.themis.backend.util.ServletUtil;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
@@ -11,8 +10,8 @@ import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.MqEnum;
+import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.enums.TaskTypeEnum;
-import com.qmth.themis.business.enums.TaskTypeExecEnum;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -159,7 +158,7 @@ public class TEExamStudentController {
                 throw new BusinessException(ExceptionResultEnum.ATTACHMENT_ERROR);
             } else {
                 //往任务表里插一条数据
-                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.import_exam_student.ordinal(), tbAttachment.getId(), TaskTypeExecEnum.init.ordinal(), SystemConstant.IMPORT_INIT, 0d, tbAttachment.getName(), tbAttachment.getRemark(), tbUser.getId());
+                tbTaskHistory = new TBTaskHistory(TaskTypeEnum.import_exam_student, tbAttachment.getId(), TaskStatusEnum.init, SystemConstant.IMPORT_INIT, 0d, tbAttachment.getName(), tbAttachment.getRemark(), tbUser.getId());
                 taskHistoryService.save(tbTaskHistory);
                 transMap.put("tbTaskHistory", tbTaskHistory);
             }

+ 9 - 3
themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamPaperCacheBean.java

@@ -1,5 +1,7 @@
 package com.qmth.themis.business.cache.bean;
 
+import com.qmth.themis.business.enums.EncryptModeEnum;
+
 import java.io.Serializable;
 
 public class ExamPaperCacheBean implements Serializable {
@@ -38,7 +40,7 @@ public class ExamPaperCacheBean implements Serializable {
 	private String decryptVector;
 
 	// 0:自动,1:手动,2:不加密
-	private Integer encryptMode;
+	private EncryptModeEnum encryptMode;
 
 	// 是否需要语音作答,0:不需要,1:需要
 	private Integer needVoiceAnswer;
@@ -140,11 +142,15 @@ public class ExamPaperCacheBean implements Serializable {
 		this.decryptVector = decryptVector;
 	}
 
-	public Integer getEncryptMode() {
+	public static long getSerialVersionUID() {
+		return serialVersionUID;
+	}
+
+	public EncryptModeEnum getEncryptMode() {
 		return encryptMode;
 	}
 
-	public void setEncryptMode(Integer encryptMode) {
+	public void setEncryptMode(EncryptModeEnum encryptMode) {
 		this.encryptMode = encryptMode;
 	}
 

+ 21 - 12
themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordCacheBean.java

@@ -1,5 +1,10 @@
 package com.qmth.themis.business.cache.bean;
 
+import com.qmth.themis.business.enums.EntryAuthenticationPolicyEnum;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
+import com.qmth.themis.business.enums.FinishTypeEnum;
+import com.qmth.themis.business.enums.ReviewResultEnum;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -29,7 +34,7 @@ public class ExamRecordCacheBean implements Serializable {
     private String answerPath;
 
     //当前状态
-    private Integer status;
+    private ExamRecordStatusEnum status;
 
     //首次进入候考时间
     private Date firstPrepareTime;
@@ -92,13 +97,13 @@ public class ExamRecordCacheBean implements Serializable {
     private Date finishTime;
 
     //交卷原因
-    private Integer finishType;
+    private FinishTypeEnum finishType;
 
     //预警次数
     private Integer warningCount;
 
     //审核结果
-    private Integer reviewResult;
+    private ReviewResultEnum reviewResult;
 
     //客观题分数
     private Double objectiveScore;
@@ -122,7 +127,7 @@ public class ExamRecordCacheBean implements Serializable {
     private Long lastBreakId;
 
     //开考身份验证结果
-    private Integer entryAuthenticationResult;
+    private EntryAuthenticationPolicyEnum entryAuthenticationResult;
 
     //开考身份验证记录ID
     private Long entryAuthenticationId;
@@ -184,14 +189,18 @@ public class ExamRecordCacheBean implements Serializable {
 		this.answerPath = answerPath;
 	}
 
-	public Integer getStatus() {
+	public ExamRecordStatusEnum getStatus() {
 		return status;
 	}
 
-	public void setStatus(Integer status) {
+	public void setStatus(ExamRecordStatusEnum status) {
 		this.status = status;
 	}
 
+	public static long getSerialVersionUID() {
+		return serialVersionUID;
+	}
+
 	public Date getFirstPrepareTime() {
 		return firstPrepareTime;
 	}
@@ -352,11 +361,11 @@ public class ExamRecordCacheBean implements Serializable {
 		this.finishTime = finishTime;
 	}
 
-	public Integer getFinishType() {
+	public FinishTypeEnum getFinishType() {
 		return finishType;
 	}
 
-	public void setFinishType(Integer finishType) {
+	public void setFinishType(FinishTypeEnum finishType) {
 		this.finishType = finishType;
 	}
 
@@ -368,11 +377,11 @@ public class ExamRecordCacheBean implements Serializable {
 		this.warningCount = warningCount;
 	}
 
-	public Integer getReviewResult() {
+	public ReviewResultEnum getReviewResult() {
 		return reviewResult;
 	}
 
-	public void setReviewResult(Integer reviewResult) {
+	public void setReviewResult(ReviewResultEnum reviewResult) {
 		this.reviewResult = reviewResult;
 	}
 
@@ -432,11 +441,11 @@ public class ExamRecordCacheBean implements Serializable {
 		this.lastBreakId = lastBreakId;
 	}
 
-	public Integer getEntryAuthenticationResult() {
+	public EntryAuthenticationPolicyEnum getEntryAuthenticationResult() {
 		return entryAuthenticationResult;
 	}
 
-	public void setEntryAuthenticationResult(Integer entryAuthenticationResult) {
+	public void setEntryAuthenticationResult(EntryAuthenticationPolicyEnum entryAuthenticationResult) {
 		this.entryAuthenticationResult = entryAuthenticationResult;
 	}
 

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/dao/TBTaskHistoryMapper.java

@@ -3,6 +3,8 @@ package com.qmth.themis.business.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.themis.business.entity.TBTaskHistory;
+import com.qmth.themis.business.enums.TaskStatusEnum;
+import com.qmth.themis.business.enums.TaskTypeEnum;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -28,5 +30,5 @@ public interface TBTaskHistoryMapper extends BaseMapper<TBTaskHistory> {
      * @param status
      * @return
      */
-    public IPage<Map> taskQuery(IPage<Map> iPage, @Param("taskId") Long taskId, @Param("entityId") Long entityId, @Param("type") Integer type, @Param("status") Integer status);
+    public IPage<Map> taskQuery(IPage<Map> iPage, @Param("taskId") Long taskId, @Param("entityId") Long entityId, @Param("type") TaskTypeEnum type, @Param("status") TaskStatusEnum status);
 }

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

@@ -59,9 +59,9 @@ public class TBOrg extends BaseEntity {
     @TableField(value = "enable_liveness")
     private String enableLiveness;
 
-    @ApiModelProperty(value = "是否允许视频转录")
-    @TableField(value = "enable_video_record")
-    private String enableVideoRecord;
+    @ApiModelProperty(value = "是否允许监控转录")
+    @TableField(value = "enable_monitor_record")
+    private String enableMonitorRecord;
 
     public String getContactName() {
         return contactName;
@@ -87,12 +87,12 @@ public class TBOrg extends BaseEntity {
         this.enableLiveness = enableLiveness;
     }
 
-    public String getEnableVideoRecord() {
-        return enableVideoRecord;
+    public String getEnableMonitorRecord() {
+        return enableMonitorRecord;
     }
 
-    public void setEnableVideoRecord(String enableVideoRecord) {
-        this.enableVideoRecord = enableVideoRecord;
+    public void setEnableMonitorRecord(String enableMonitorRecord) {
+        this.enableMonitorRecord = enableMonitorRecord;
     }
 
     public String getCode() {

+ 12 - 10
themis-business/src/main/java/com/qmth/themis/business/entity/TBTaskHistory.java

@@ -3,6 +3,8 @@ package com.qmth.themis.business.entity;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.qmth.themis.business.enums.TaskStatusEnum;
+import com.qmth.themis.business.enums.TaskTypeEnum;
 import com.qmth.themis.common.contanst.Constants;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -25,17 +27,17 @@ public class TBTaskHistory implements Serializable {
     @TableId(value = "id")
     private Long id;
 
-    @ApiModelProperty(value = "任务类型,0:考试重新算分,1:导入考生,2:导入试卷,3:导入监考员,4:导出监考员")
+    @ApiModelProperty(value = "任务类型,calculate_exam_score:考试重新算分,import_exam_student:导入考生,import_exam_paper:导入试卷,import_invigilate_user:导入监考员,export_invigilate_user:导出监考员")
     @TableField("type")
-    private Integer type;
+    private TaskTypeEnum type;
 
     @ApiModelProperty(value = "关联业务对象ID")
     @TableField("entity_id")
     private Long entityId;
 
-    @ApiModelProperty(value = "任务状态,0:未开始,1:开始执行,2:执行结束")
+    @ApiModelProperty(value = "任务状态,init:未开始,running:开始执行,finish:执行结束")
     @TableField("status")
-    private Integer status;
+    private TaskStatusEnum status;
 
     @ApiModelProperty(value = "实时摘要信息")
     @TableField("summary")
@@ -81,7 +83,7 @@ public class TBTaskHistory implements Serializable {
 
     }
 
-    public TBTaskHistory(Integer type, Long entityId, Integer status, String summary, Double progress, String importFileName, String importFilePath, Long createId) {
+    public TBTaskHistory(TaskTypeEnum type, Long entityId, TaskStatusEnum status, String summary, Double progress, String importFileName, String importFilePath, Long createId) {
         this.id = Constants.idGen.next();
         this.type = type;
         this.entityId = entityId;
@@ -94,7 +96,7 @@ public class TBTaskHistory implements Serializable {
         this.startTime = new Date();
     }
 
-    public TBTaskHistory(Integer type, Integer status, String summary, Double progress, Long createId) {
+    public TBTaskHistory(TaskTypeEnum type, TaskStatusEnum status, String summary, Double progress, Long createId) {
         this.id = Constants.idGen.next();
         this.type = type;
         this.status = status;
@@ -116,11 +118,11 @@ public class TBTaskHistory implements Serializable {
         this.id = id;
     }
 
-    public Integer getType() {
+    public TaskTypeEnum getType() {
         return type;
     }
 
-    public void setType(Integer type) {
+    public void setType(TaskTypeEnum type) {
         this.type = type;
     }
 
@@ -132,11 +134,11 @@ public class TBTaskHistory implements Serializable {
         this.entityId = entityId;
     }
 
-    public Integer getStatus() {
+    public TaskStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(Integer status) {
+    public void setStatus(TaskStatusEnum status) {
         this.status = status;
     }
 

+ 53 - 31
themis-business/src/main/java/com/qmth/themis/business/entity/TEExam.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.qmth.themis.business.base.BaseEntity;
 
+import com.qmth.themis.business.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -113,7 +114,7 @@ public class TEExam extends BaseEntity {
 
     @ApiModelProperty(value = "模式,0:集中统一,1:随到随考")
     @TableField(value = "mode")
-    private Integer mode;
+    private ExamModeEnum mode;
 
     @ApiModelProperty(value = "是否启用,0:停用,1:启用")
     @TableField(value = "enable")
@@ -135,9 +136,9 @@ public class TEExam extends BaseEntity {
     @TableField(value = "force_finish")
     private Integer forceFinish;
 
-    @ApiModelProperty(value = "开考身份验证策略,0:关闭,1:非强制人脸验证,2:强制人脸验证,3:活体验证")
+    @ApiModelProperty(value = "开考身份验证策略,off:关闭,face_verify_optional:非强制人脸验证,face_verify_force:强制人脸验证,liveness:活体验证")
     @TableField(value = "entry_authentication_policy")
-    private Integer entryAuthenticationPolicy;
+    private EntryAuthenticationPolicyEnum entryAuthenticationPolicy;
 
     @ApiModelProperty(value = "考试过程中人脸检测是否开启,0:不开启,1:开启")
     @TableField(value = "in_process_face_verify")
@@ -159,13 +160,13 @@ public class TEExam extends BaseEntity {
     @TableField(value = "in_process_liveness_retry_count")
     private Integer inProcessLivenessRetryCount;
 
-    @ApiModelProperty(value = "考试过程中活体检测结果判定规则,0:任意一次通过,1:全部都要通过,2:通过次数大于失败次数")
+    @ApiModelProperty(value = "考试过程中活体检测结果判定规则,any:任意一次通过,all:全部都要通过,more:通过次数大于失败次数")
     @TableField(value = "in_process_liveness_judge_policy")
-    private Integer inProcessLivenessJudgePolicy;
+    private InProcessLivenessJudgePolicyEnum inProcessLivenessJudgePolicy;
 
-    @ApiModelProperty(value = "多次考试记录的选择逻辑,0:全部阅卷后取最高分,1:客观分最高,3:最后一次提交")
+    @ApiModelProperty(value = "多次考试记录的选择逻辑,highest_total_score:全部阅卷后取最高分,highest_objective_score:客观分最高,latest:最后一次提交")
     @TableField(value = "record_select_strategy")
-    private Integer recordSelectStrategy;
+    private RecordSelectStrategyEnum recordSelectStrategy;
 
     @ApiModelProperty(value = "是否IP段限制,0:不允许,1:允许")
     @TableField(value = "enable_ip_limit")
@@ -175,9 +176,9 @@ public class TEExam extends BaseEntity {
     @TableField(value = "ip_allow")
     private String ipAllow;
 
-    @ApiModelProperty(value = "算分状态,0:从未算分,1:正在算分,2:算分完成")
+    @ApiModelProperty(value = "算分状态,never:从未算分,calculating:正在算分,finish:算分完成")
     @TableField(value = "score_status")
-    private Integer scoreStatus;
+    private ScoreStatusEnum scoreStatus;
 
     @ApiModelProperty(value = "是否启用开考口令,0:不启用,1:启用")
     @TableField(value = "enable_short_code")
@@ -187,10 +188,34 @@ public class TEExam extends BaseEntity {
     @TableField(value = "enable_break")
     private Integer enableBreak;
 
-    @ApiModelProperty(value = "客观题给分策略,0:全对给分,1: 漏选给一半分")
+    @ApiModelProperty(value = "客观题给分策略,equal: 全对给分,partial: 漏选给一半分")
     @TableField(value = "objective_score_policy")
-    private Integer objectiveScorePolicy;
-    
+    private ObjectiveScorePolicyEnum objectiveScorePolicy;
+
+    @ApiModelProperty(value = "开启监控的视频源")
+    @TableField(value = "monitor_video_source")
+    private String monitorVideoSource;
+
+    @ApiModelProperty(value = "是否开始监控转录,0:开启,1:不开启")
+    @TableField(value = "monitor_record")
+    private Integer monitorRecord;
+
+    public String getMonitorVideoSource() {
+        return monitorVideoSource;
+    }
+
+    public void setMonitorVideoSource(String monitorVideoSource) {
+        this.monitorVideoSource = monitorVideoSource;
+    }
+
+    public Integer getMonitorRecord() {
+        return monitorRecord;
+    }
+
+    public void setMonitorRecord(Integer monitorRecord) {
+        this.monitorRecord = monitorRecord;
+    }
+
     public Integer getEnableBreak() {
         return enableBreak;
     }
@@ -207,11 +232,11 @@ public class TEExam extends BaseEntity {
         this.enableShortCode = enableShortCode;
     }
 
-    public Integer getMode() {
+    public ExamModeEnum getMode() {
         return mode;
     }
 
-    public void setMode(Integer mode) {
+    public void setMode(ExamModeEnum mode) {
         this.mode = mode;
     }
 
@@ -255,11 +280,11 @@ public class TEExam extends BaseEntity {
         this.forceFinish = forceFinish;
     }
 
-    public Integer getEntryAuthenticationPolicy() {
+    public EntryAuthenticationPolicyEnum getEntryAuthenticationPolicy() {
         return entryAuthenticationPolicy;
     }
 
-    public void setEntryAuthenticationPolicy(Integer entryAuthenticationPolicy) {
+    public void setEntryAuthenticationPolicy(EntryAuthenticationPolicyEnum entryAuthenticationPolicy) {
         this.entryAuthenticationPolicy = entryAuthenticationPolicy;
     }
 
@@ -303,19 +328,19 @@ public class TEExam extends BaseEntity {
         this.inProcessLivenessRetryCount = inProcessLivenessRetryCount;
     }
 
-    public Integer getInProcessLivenessJudgePolicy() {
+    public InProcessLivenessJudgePolicyEnum getInProcessLivenessJudgePolicy() {
         return inProcessLivenessJudgePolicy;
     }
 
-    public void setInProcessLivenessJudgePolicy(Integer inProcessLivenessJudgePolicy) {
+    public void setInProcessLivenessJudgePolicy(InProcessLivenessJudgePolicyEnum inProcessLivenessJudgePolicy) {
         this.inProcessLivenessJudgePolicy = inProcessLivenessJudgePolicy;
     }
 
-    public Integer getRecordSelectStrategy() {
+    public RecordSelectStrategyEnum getRecordSelectStrategy() {
         return recordSelectStrategy;
     }
 
-    public void setRecordSelectStrategy(Integer recordSelectStrategy) {
+    public void setRecordSelectStrategy(RecordSelectStrategyEnum recordSelectStrategy) {
         this.recordSelectStrategy = recordSelectStrategy;
     }
 
@@ -335,11 +360,11 @@ public class TEExam extends BaseEntity {
         this.ipAllow = ipAllow;
     }
 
-    public Integer getScoreStatus() {
+    public ScoreStatusEnum getScoreStatus() {
         return scoreStatus;
     }
 
-    public void setScoreStatus(Integer scoreStatus) {
+    public void setScoreStatus(ScoreStatusEnum scoreStatus) {
         this.scoreStatus = scoreStatus;
     }
 
@@ -531,14 +556,11 @@ public class TEExam extends BaseEntity {
         this.showObjectiveScore = showObjectiveScore;
     }
 
-	public Integer getObjectiveScorePolicy() {
-		return objectiveScorePolicy;
-	}
-
-	public void setObjectiveScorePolicy(Integer objectiveScorePolicy) {
-		this.objectiveScorePolicy = objectiveScorePolicy;
-	}
-    
-    
+    public ObjectiveScorePolicyEnum getObjectiveScorePolicy() {
+        return objectiveScorePolicy;
+    }
 
+    public void setObjectiveScorePolicy(ObjectiveScorePolicyEnum objectiveScorePolicy) {
+        this.objectiveScorePolicy = objectiveScorePolicy;
+    }
 }

+ 5 - 4
themis-business/src/main/java/com/qmth/themis/business/entity/TEExamPaper.java

@@ -2,6 +2,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.EncryptModeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -31,9 +32,9 @@ public class TEExamPaper extends BaseEntity {
     @TableField(value = "decrypt_secret")
     private String decryptSecret;
 
-    @ApiModelProperty(value = "0:自动,1:手动,2:不加密")
+    @ApiModelProperty(value = "auto:自动,hand:手动")
     @TableField(value = "encrypt_mode")
-    private Integer encryptMode;
+    private EncryptModeEnum encryptMode;
 
     @ApiModelProperty(value = "是否需要语音作答,0:不需要,1:需要")
     @TableField(value = "need_voice_answer")
@@ -123,11 +124,11 @@ public class TEExamPaper extends BaseEntity {
         this.decryptSecret = decryptSecret;
     }
 
-    public Integer getEncryptMode() {
+    public EncryptModeEnum getEncryptMode() {
         return encryptMode;
     }
 
-    public void setEncryptMode(Integer encryptMode) {
+    public void setEncryptMode(EncryptModeEnum encryptMode) {
         this.encryptMode = encryptMode;
     }
 

+ 11 - 10
themis-business/src/main/java/com/qmth/themis/business/entity/TEStudent.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.constant.SystemConstant;
+import com.qmth.themis.business.enums.GenderEnum;
 import com.qmth.themis.common.contanst.Constants;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -41,9 +42,9 @@ public class TEStudent extends BaseEntity {
     @TableField(value = "name")
     private String name;
 
-    @ApiModelProperty(value = "性别,0:女,1:男")
+    @ApiModelProperty(value = "性别")
     @TableField(value = "gender")
-    private Integer gender;
+    private GenderEnum gender;
 
     @ApiModelProperty(value = "底照保存地址")
     @TableField(value = "base_photo_path")
@@ -122,14 +123,6 @@ public class TEStudent extends BaseEntity {
         this.name = name;
     }
 
-    public Integer getGender() {
-        return gender;
-    }
-
-    public void setGender(Integer gender) {
-        this.gender = gender;
-    }
-
     public String getBasePhotoPath() {
         return basePhotoPath;
     }
@@ -137,4 +130,12 @@ public class TEStudent extends BaseEntity {
     public void setBasePhotoPath(String basePhotoPath) {
         this.basePhotoPath = basePhotoPath;
     }
+
+    public GenderEnum getGender() {
+        return gender;
+    }
+
+    public void setGender(GenderEnum gender) {
+        this.gender = gender;
+    }
 }

+ 4 - 3
themis-business/src/main/java/com/qmth/themis/business/entity/TIeExamInvigilateNotice.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.qmth.themis.business.enums.InvigilateNoticeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -42,7 +43,7 @@ public class TIeExamInvigilateNotice implements Serializable {
 
     @ApiModelProperty(value = "消息类型")
     @TableField(value = "type")
-    private Integer type;
+    private InvigilateNoticeEnum type;
 
     @ApiModelProperty(value = "消息内容")
     @TableField(value = "content")
@@ -100,11 +101,11 @@ public class TIeExamInvigilateNotice implements Serializable {
         this.userId = userId;
     }
 
-    public Integer getType() {
+    public InvigilateNoticeEnum getType() {
         return type;
     }
 
-    public void setType(Integer type) {
+    public void setType(InvigilateNoticeEnum type) {
         this.type = type;
     }
 

+ 9 - 7
themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamBreakHistory.java

@@ -2,6 +2,8 @@ package com.qmth.themis.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.qmth.themis.business.enums.BreakReasonEnum;
+import com.qmth.themis.business.enums.EntryAuthenticationPolicyEnum;
 import com.qmth.themis.common.contanst.Constants;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -34,7 +36,7 @@ public class TOeExamBreakHistory implements Serializable {
 
     @ApiModelProperty(value = "断点判定原因")
     @TableField(value = "break_reason")
-    private Integer breakReason;
+    private BreakReasonEnum breakReason;
 
     @ApiModelProperty(value = "提交异常原因")
     @TableField(value = "resume_reason")
@@ -50,7 +52,7 @@ public class TOeExamBreakHistory implements Serializable {
 
     @ApiModelProperty(value = "恢复开考身份验证结果")
     @TableField(value = "entry_authentication_result")
-    private Integer entryAuthenticationResult;
+    private EntryAuthenticationPolicyEnum entryAuthenticationResult;
 
     @ApiModelProperty(value = "恢复开考身份验证记录ID")
     @TableField(value = "entry_authentication_id")
@@ -60,7 +62,7 @@ public class TOeExamBreakHistory implements Serializable {
 
     }
 
-    public TOeExamBreakHistory(Long examRecordId, Date breakTime, Integer breakReason, String resumeReason) {
+    public TOeExamBreakHistory(Long examRecordId, Date breakTime, BreakReasonEnum breakReason, String resumeReason) {
         this.id = Constants.idGen.next();
         this.examRecordId = examRecordId;
         this.breakTime = breakTime;
@@ -96,11 +98,11 @@ public class TOeExamBreakHistory implements Serializable {
         this.breakTime = breakTime;
     }
 
-    public Integer getBreakReason() {
+    public BreakReasonEnum getBreakReason() {
         return breakReason;
     }
 
-    public void setBreakReason(Integer breakReason) {
+    public void setBreakReason(BreakReasonEnum breakReason) {
         this.breakReason = breakReason;
     }
 
@@ -128,11 +130,11 @@ public class TOeExamBreakHistory implements Serializable {
         this.startTime = startTime;
     }
 
-    public Integer getEntryAuthenticationResult() {
+    public EntryAuthenticationPolicyEnum getEntryAuthenticationResult() {
         return entryAuthenticationResult;
     }
 
-    public void setEntryAuthenticationResult(Integer entryAuthenticationResult) {
+    public void setEntryAuthenticationResult(EntryAuthenticationPolicyEnum entryAuthenticationResult) {
         this.entryAuthenticationResult = entryAuthenticationResult;
     }
 

+ 117 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamMonitorExceptionHistory.java

@@ -0,0 +1,117 @@
+package com.qmth.themis.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.qmth.themis.business.enums.ExceptionEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 监控异常记录
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/29
+ */
+@ApiModel(value = "t_oe_exam_monitor_exception_history", description = "监控异常记录")
+public class TOeExamMonitorExceptionHistory implements Serializable {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "考试批次ID")
+    @TableField(value = "exam_id")
+    private Long examId;
+
+    @ApiModelProperty(value = "考试场次ID")
+    @TableField(value = "exam_activity_id")
+    private Long examActivityId;
+
+    @ApiModelProperty(value = "考生ID")
+    @TableField(value = "exam_student_id")
+    private Long examStudentId;
+
+    @ApiModelProperty(value = "考生ID")
+    @TableField(value = "exam_record_id")
+    private Long examRecordId;
+
+    @ApiModelProperty(value = "开启监控的视频源")
+    @TableField(value = "source")
+    private String source;
+
+    @ApiModelProperty(value = "异常类型")
+    @TableField(value = "type")
+    private ExceptionEnum type;
+
+    @ApiModelProperty(value = "异常时间")
+    @TableField(value = "time")
+    private Date time;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getExamActivityId() {
+        return examActivityId;
+    }
+
+    public void setExamActivityId(Long examActivityId) {
+        this.examActivityId = examActivityId;
+    }
+
+    public Long getExamStudentId() {
+        return examStudentId;
+    }
+
+    public void setExamStudentId(Long examStudentId) {
+        this.examStudentId = examStudentId;
+    }
+
+    public Long getExamRecordId() {
+        return examRecordId;
+    }
+
+    public void setExamRecordId(Long examRecordId) {
+        this.examRecordId = examRecordId;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public ExceptionEnum getType() {
+        return type;
+    }
+
+    public void setType(ExceptionEnum type) {
+        this.type = type;
+    }
+
+    public Date getTime() {
+        return time;
+    }
+
+    public void setTime(Date time) {
+        this.time = time;
+    }
+}

+ 64 - 15
themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamRecord.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.qmth.themis.business.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -43,9 +44,9 @@ public class TOeExamRecord implements Serializable {
     @TableField(value = "answer_path")
     private String answerPath;
 
-    @ApiModelProperty(value = "当前状态")
+    @ApiModelProperty(value = "考试状态,first_prepare:首次候考,answering:正在答题,break_off:已中断,resume_prepare:断点恢复候考,finished:已结束考试,persisted:数据已保存")
     @TableField(value = "status")
-    private Integer status;
+    private ExamRecordStatusEnum status;
 
     @ApiModelProperty(value = "首次进入候考时间")
     @TableField(value = "first_prepare_time")
@@ -127,17 +128,17 @@ public class TOeExamRecord implements Serializable {
     @TableField(value = "finish_time")
     private Date finishTime;
 
-    @ApiModelProperty(value = "交卷原因")
+    @ApiModelProperty(value = "交卷原因,hand:手动交卷,auto:系统交卷,breach:违纪交卷")
     @TableField(value = "finish_type")
-    private Integer finishType;
+    private FinishTypeEnum finishType;
 
     @ApiModelProperty(value = "预警次数")
     @TableField(value = "warning_count")
     private Integer warningCount;
 
-    @ApiModelProperty(value = "审核结果")
+    @ApiModelProperty(value = "审核结果,pass:通过,no_pass:不通过")
     @TableField(value = "review_result")
-    private Integer reviewResult;
+    private ReviewResultEnum reviewResult;
 
     @ApiModelProperty(value = "客观题分数")
     @TableField(value = "objective_score")
@@ -169,7 +170,7 @@ public class TOeExamRecord implements Serializable {
 
     @ApiModelProperty(value = "开考身份验证结果")
     @TableField(value = "entry_authentication_result")
-    private Integer entryAuthenticationResult;
+    private EntryAuthenticationPolicyEnum entryAuthenticationResult;
 
     @ApiModelProperty(value = "开考身份验证记录ID")
     @TableField(value = "entry_authentication_id")
@@ -187,6 +188,54 @@ public class TOeExamRecord implements Serializable {
     @TableField(value = "in_process_liveness_verify_count")
     private Integer inProcessLivenessVerifyCount;
 
+    @ApiModelProperty(value = "监控标识(默认直接用recordId)")
+    @TableField(value = "monitor_key")
+    private String monitorKey;
+
+    @ApiModelProperty(value = "监控状态,stop:停止,start:正常")
+    @TableField(value = "monitor_status_source")
+    private MonitorStatusSourceEnum monitorStatusSource;
+
+    @ApiModelProperty(value = "监控观看地址")
+    @TableField(value = "monitor_live_url")
+    private String monitorLiveUrl;
+
+    @ApiModelProperty(value = "算分状态,never:从未算分,calculating:正在算分,finish:算分完成")
+    @TableField(value = "score_status")
+    private ScoreStatusEnum scoreStatus;
+
+    public ScoreStatusEnum getScoreStatus() {
+        return scoreStatus;
+    }
+
+    public void setScoreStatus(ScoreStatusEnum scoreStatus) {
+        this.scoreStatus = scoreStatus;
+    }
+
+    public String getMonitorKey() {
+        return monitorKey;
+    }
+
+    public void setMonitorKey(String monitorKey) {
+        this.monitorKey = monitorKey;
+    }
+
+    public MonitorStatusSourceEnum getMonitorStatusSource() {
+        return monitorStatusSource;
+    }
+
+    public void setMonitorStatusSource(MonitorStatusSourceEnum monitorStatusSource) {
+        this.monitorStatusSource = monitorStatusSource;
+    }
+
+    public String getMonitorLiveUrl() {
+        return monitorLiveUrl;
+    }
+
+    public void setMonitorLiveUrl(String monitorLiveUrl) {
+        this.monitorLiveUrl = monitorLiveUrl;
+    }
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -239,11 +288,11 @@ public class TOeExamRecord implements Serializable {
         this.answerPath = answerPath;
     }
 
-    public Integer getStatus() {
+    public ExamRecordStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(Integer status) {
+    public void setStatus(ExamRecordStatusEnum status) {
         this.status = status;
     }
 
@@ -407,11 +456,11 @@ public class TOeExamRecord implements Serializable {
         this.finishTime = finishTime;
     }
 
-    public Integer getFinishType() {
+    public FinishTypeEnum getFinishType() {
         return finishType;
     }
 
-    public void setFinishType(Integer finishType) {
+    public void setFinishType(FinishTypeEnum finishType) {
         this.finishType = finishType;
     }
 
@@ -423,11 +472,11 @@ public class TOeExamRecord implements Serializable {
         this.warningCount = warningCount;
     }
 
-    public Integer getReviewResult() {
+    public ReviewResultEnum getReviewResult() {
         return reviewResult;
     }
 
-    public void setReviewResult(Integer reviewResult) {
+    public void setReviewResult(ReviewResultEnum reviewResult) {
         this.reviewResult = reviewResult;
     }
 
@@ -487,11 +536,11 @@ public class TOeExamRecord implements Serializable {
         this.lastBreakId = lastBreakId;
     }
 
-    public Integer getEntryAuthenticationResult() {
+    public EntryAuthenticationPolicyEnum getEntryAuthenticationResult() {
         return entryAuthenticationResult;
     }
 
-    public void setEntryAuthenticationResult(Integer entryAuthenticationResult) {
+    public void setEntryAuthenticationResult(EntryAuthenticationPolicyEnum entryAuthenticationResult) {
         this.entryAuthenticationResult = entryAuthenticationResult;
     }
 

+ 9 - 7
themis-business/src/main/java/com/qmth/themis/business/entity/TOeFaceVerifyHistory.java

@@ -3,6 +3,8 @@ package com.qmth.themis.business.entity;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.qmth.themis.business.enums.ExamTypeEnum;
+import com.qmth.themis.business.enums.RealnessEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -34,7 +36,7 @@ public class TOeFaceVerifyHistory implements Serializable {
 
     @ApiModelProperty(value = "真实性验证结果")
     @TableField(value = "realness")
-    private Integer realness;
+    private RealnessEnum realness;
 
     @ApiModelProperty(value = "创建时间")
     @TableField(value = "create_time", fill = FieldFill.INSERT)
@@ -44,9 +46,9 @@ public class TOeFaceVerifyHistory implements Serializable {
     @TableField(value = "update_time", fill = FieldFill.UPDATE)
     private Date updateTime;
 
-    @ApiModelProperty(value = "0:初次开考,1:恢复开考,2:过程中")
+    @ApiModelProperty(value = "first:初次开考,recover:恢复开考,process:过程中")
     @TableField(value = "type")
-    private Integer type;
+    private ExamTypeEnum type;
 
     @ApiModelProperty(value = "图片保存路径")
     @TableField(value = "photo_url")
@@ -84,11 +86,11 @@ public class TOeFaceVerifyHistory implements Serializable {
         this.similarity = similarity;
     }
 
-    public Integer getRealness() {
+    public RealnessEnum getRealness() {
         return realness;
     }
 
-    public void setRealness(Integer realness) {
+    public void setRealness(RealnessEnum realness) {
         this.realness = realness;
     }
 
@@ -108,11 +110,11 @@ public class TOeFaceVerifyHistory implements Serializable {
         this.updateTime = updateTime;
     }
 
-    public Integer getType() {
+    public ExamTypeEnum getType() {
         return type;
     }
 
-    public void setType(Integer type) {
+    public void setType(ExamTypeEnum type) {
         this.type = type;
     }
 

+ 5 - 16
themis-business/src/main/java/com/qmth/themis/business/entity/TOeLivenessVerifyHistory.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.qmth.themis.business.enums.ExamTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -27,18 +28,14 @@ public class TOeLivenessVerifyHistory implements Serializable {
     @TableField(value = "exam_record_id")
     private Long examRecordId;
 
-    @ApiModelProperty(value = "0:初次开考,1:恢复开考,2:过程中")
+    @ApiModelProperty(value = "first:初次开考,recover:恢复开考,process:过程中")
     @TableField(value = "type")
-    private Integer type;
+    private ExamTypeEnum type;
 
     @ApiModelProperty(value = "随机动作与结果")
     @TableField(value = "actions")
     private String actions;
 
-    @ApiModelProperty(value = "检测结果")
-    @TableField(value = "result")
-    private Integer result;
-
     @ApiModelProperty(value = "重试次数")
     @TableField(value = "retry")
     private Integer retry;
@@ -75,11 +72,11 @@ public class TOeLivenessVerifyHistory implements Serializable {
         this.examRecordId = examRecordId;
     }
 
-    public Integer getType() {
+    public ExamTypeEnum getType() {
         return type;
     }
 
-    public void setType(Integer type) {
+    public void setType(ExamTypeEnum type) {
         this.type = type;
     }
 
@@ -91,14 +88,6 @@ public class TOeLivenessVerifyHistory implements Serializable {
         this.actions = actions;
     }
 
-    public Integer getResult() {
-        return result;
-    }
-
-    public void setResult(Integer result) {
-        this.result = result;
-    }
-
     public Integer getRetry() {
         return retry;
     }

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

@@ -0,0 +1,25 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 断点原因 enum
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum BreakReasonEnum {
+
+    NET_TIME_OUT("网络超时"),
+
+    MACHINE_FAULT("机器故障");
+
+    private String code;
+
+    private BreakReasonEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 24 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/EncryptModeEnum.java

@@ -0,0 +1,24 @@
+package com.qmth.themis.business.enums;
+
+/** 
+* @Description: 解密模式
+* @Param:  
+* @return:  
+* @Author: wangliang
+* @Date: 2020/7/29 
+*/ 
+public enum EncryptModeEnum {
+    auto("自动"),
+
+    hand("手动");
+
+    private String code;
+
+    private EncryptModeEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 29 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/EntryAuthenticationPolicyEnum.java

@@ -0,0 +1,29 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 开考身份验证策略 enum
+* @Param:  
+* @return:  
+* @Author: wangliang
+* @Date: 2020/7/29 
+*/ 
+public enum EntryAuthenticationPolicyEnum {
+
+    off("关闭"),
+
+    face_verify_optional("非强制人脸验证"),
+
+    face_verify_force("强制人脸验证"),
+
+    liveness("活体验证");
+
+    private EntryAuthenticationPolicyEnum(String code){
+        this.code = code;
+    }
+
+    private String code;
+
+    public String getCode() {
+        return code;
+    }
+}

+ 7 - 7
themis-business/src/main/java/com/qmth/themis/business/enums/ExamModeEnum.java

@@ -12,20 +12,20 @@ public enum ExamModeEnum {
     /**
      * 集中统一
      */
-    together(0),
+    together("集中统一"),
 
     /**
      * 随到随考
      */
-    anytime(1);
+    anytime("随到随考");
 
-    private int id;
+    private String code;
 
-    private ExamModeEnum(int id) {
-        this.id = id;
+    private ExamModeEnum(String code) {
+        this.code = code;
     }
 
-    public int getId() {
-        return id;
+    public String getCode() {
+        return code;
     }
 }

+ 21 - 29
themis-business/src/main/java/com/qmth/themis/business/enums/ExamRecordStatusEnum.java

@@ -9,33 +9,25 @@ package com.qmth.themis.business.enums;
 */
 public enum ExamRecordStatusEnum {
 
-    /**
-     * 首次候考
-     */
-    first_prepare,
-
-    /**
-     * 正在答题
-     */
-    answering,
-
-    /**
-     * 已中断
-     */
-    break_off,
-
-    /**
-     * 断点恢复候考
-     */
-    resume_prepare,
-
-    /**
-     * 已结束考试
-     */
-    finished,
-
-    /**
-     * 数据已保存
-     */
-    persisted;
+    first_prepare("首次候考"),
+
+    answering("正在答题"),
+
+    break_off("已中断"),
+
+    resume_prepare("断点恢复候考"),
+
+    finished("已结束考试"),
+
+    persisted("数据已保存");
+
+    private String code;
+
+    private ExamRecordStatusEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
 }

+ 27 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/ExamTypeEnum.java

@@ -0,0 +1,27 @@
+package com.qmth.themis.business.enums;
+
+/** 
+* @Description: 考试类型 enum
+* @Param:  
+* @return:  
+* @Author: wangliang
+* @Date: 2020/7/29 
+*/ 
+public enum ExamTypeEnum {
+
+    first("初次开考"),
+
+    recover("恢复开考"),
+
+    process("过程中");
+
+    private String code;
+
+    private ExamTypeEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 23 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/ExceptionEnum.java

@@ -0,0 +1,23 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 异常类型 enum
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum ExceptionEnum {
+
+    NET_TIME_OUT("网络超时");
+
+    private String code;
+
+    private ExceptionEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 0 - 16
themis-business/src/main/java/com/qmth/themis/business/enums/FinishExamTypeEnum.java

@@ -1,16 +0,0 @@
-package com.qmth.themis.business.enums;
-
-/**
-* @Description: 结束考试 enum
-* @Param:
-* @return:
-* @Author: wangliang
-* @Date: 2020/7/27
-*/
-public enum FinishExamTypeEnum {
-
-    /**
-     * 强制交卷
-     */
-    must_finish;
-}

+ 27 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/FinishTypeEnum.java

@@ -0,0 +1,27 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 交卷原因
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum FinishTypeEnum {
+    //todo 数据模型待补充确认
+    hand("手动交卷"),
+
+    auto("系统交卷"),
+
+    breach("违纪交卷");
+
+    private String code;
+
+    private FinishTypeEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

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

@@ -0,0 +1,25 @@
+package com.qmth.themis.business.enums;
+
+/**
+ * @Description: 性别 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/29
+ */
+public enum GenderEnum {
+
+    man("男"),
+
+    woman("女");
+
+    private GenderEnum(String code) {
+        this.code = code;
+    }
+
+    private String code;
+
+    public String getCode() {
+        return code;
+    }
+}

+ 26 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/InProcessLivenessJudgePolicyEnum.java

@@ -0,0 +1,26 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 考试过程中活体检测结果判定规则 enum
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum InProcessLivenessJudgePolicyEnum {
+    any("任意一次通过"),
+
+    all("全部都要通过"),
+
+    more("通过次数大于失败次数");
+
+    private String code;
+
+    private InProcessLivenessJudgePolicyEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 23 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/InvigilateNoticeEnum.java

@@ -0,0 +1,23 @@
+package com.qmth.themis.business.enums;
+
+/** 
+* @Description: 监考通知消息类型 enum
+* @Param:  
+* @return:  
+* @Author: wangliang
+* @Date: 2020/7/29 
+*/ 
+public enum InvigilateNoticeEnum {
+
+    warning("警告");
+
+    private String code;
+
+    private InvigilateNoticeEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 24 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/MonitorStatusSourceEnum.java

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

+ 2 - 2
themis-business/src/main/java/com/qmth/themis/business/enums/ObjectiveScorePolicyEnum.java

@@ -10,12 +10,12 @@ public enum ObjectiveScorePolicyEnum {
     /**
      * 全对给分
      */
-	EQUAL("全对给分"),
+    equal("全对给分"),
 
     /**
      * 漏选给一半分
      */
-	PARTIAL("漏选给一半分");
+    partial("漏选给一半分");
 
     private String title;
 

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

@@ -0,0 +1,25 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 真实性验证结果 enum
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum RealnessEnum {
+
+    pass("通过"),
+
+    no_pass("不通过");
+
+    private String code;
+
+    private RealnessEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 26 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/RecordSelectStrategyEnum.java

@@ -0,0 +1,26 @@
+package com.qmth.themis.business.enums;
+
+/** 
+* @Description: 多次考试记录的选择逻辑 enum
+* @Param:  
+* @return:  
+* @Author: wangliang
+* @Date: 2020/7/29 
+*/ 
+public enum RecordSelectStrategyEnum {
+    highest_total_score("全部阅卷后取最高分"),
+
+    highest_objective_score("客观分最高"),
+
+    latest("最后一次提交");
+
+    private String code;
+
+    private RecordSelectStrategyEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

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

@@ -0,0 +1,25 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 审核结果 enum
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum ReviewResultEnum {
+    //todo 数据模型待补充确认
+    pass("通过"),
+
+    no_pass("不通过");
+
+    private String code;
+
+    private ReviewResultEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 26 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/ScoreStatusEnum.java

@@ -0,0 +1,26 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 算分状态 enum
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+public enum ScoreStatusEnum {
+    never("从未算分"),
+
+    calculating("正在算分"),
+
+    finish("算分完成");
+
+    private String code;
+
+    private ScoreStatusEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 29 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/TaskStatusEnum.java

@@ -0,0 +1,29 @@
+package com.qmth.themis.business.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 任务状态 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/15
+ */
+public enum TaskStatusEnum {
+
+    init("未开始"),
+
+    running("开始执行"),
+
+    finish("执行结束");
+
+    private String code;
+
+    private TaskStatusEnum(String code) {
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 21 - 36
themis-business/src/main/java/com/qmth/themis/business/enums/TaskTypeEnum.java

@@ -11,39 +11,24 @@ import java.util.Objects;
  */
 public enum TaskTypeEnum {
 
-    /**
-     * 考试重新算分
-     */
-    calculate_exam_score(0),
+    calculate_exam_score("考试重新算分"),
 
-    /**
-     * 导入考生
-     */
-    import_exam_student(1),
+    import_exam_student("导入考生"),
 
-    /**
-     * 导入试卷
-     */
-    import_exam_paper(2),
+    import_exam_paper("导入试卷"),
 
-    /**
-     * 导入监考员
-     */
-    import_invigilate_user(3),
+    import_invigilate_user("导入监考员"),
 
-    /**
-     * 导出监考员
-     */
-    export_invigilate_user(4);
+    export_invigilate_user("导出监考员");
 
-    private int id;
+    private String code;
 
-    private TaskTypeEnum(int id) {
-        this.id = id;
+    private TaskTypeEnum(String code) {
+        this.code = code;
     }
 
-    public int getId() {
-        return id;
+    public String getCode() {
+        return code;
     }
 
     /**
@@ -52,17 +37,17 @@ public enum TaskTypeEnum {
      * @param value
      * @return
      */
-    public static int convertToId(String value) {
+    public static String convertToCode(String value) {
         if (Objects.equals(value.trim(), calculate_exam_score.name())) {
-            return calculate_exam_score.getId();
+            return calculate_exam_score.getCode();
         } else if (Objects.equals(value.trim(), import_exam_student.name())) {
-            return import_exam_student.getId();
+            return import_exam_student.getCode();
         } else if (Objects.equals(value.trim(), import_exam_paper.name())) {
-            return import_exam_paper.getId();
+            return import_exam_paper.getCode();
         } else if (Objects.equals(value.trim(), import_invigilate_user.name())) {
-            return import_invigilate_user.getId();
+            return import_invigilate_user.getCode();
         } else {
-            return export_invigilate_user.getId();
+            return export_invigilate_user.getCode();
         }
     }
 
@@ -72,14 +57,14 @@ public enum TaskTypeEnum {
      * @param value
      * @return
      */
-    public static String convertToName(int value) {
-        if (value == calculate_exam_score.getId()) {
+    public static String convertToName(String value) {
+        if (Objects.equals(value.trim(), calculate_exam_score.getCode())) {
             return calculate_exam_score.name();
-        } else if (value == import_exam_student.getId()) {
+        } else if (Objects.equals(value.trim(), import_exam_student.getCode())) {
             return import_exam_student.name();
-        } else if (value == import_exam_paper.getId()) {
+        } else if (Objects.equals(value.trim(), import_exam_paper.getCode())) {
             return import_exam_paper.name();
-        } else if (value == import_invigilate_user.getId()) {
+        } else if (Objects.equals(value.trim(), import_invigilate_user.getCode())) {
             return import_invigilate_user.name();
         } else {
             return export_invigilate_user.name();

+ 0 - 36
themis-business/src/main/java/com/qmth/themis/business/enums/TaskTypeExecEnum.java

@@ -1,36 +0,0 @@
-package com.qmth.themis.business.enums;
-
-/**
- * @Description: 任务执行类型
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/7/15
- */
-public enum TaskTypeExecEnum {
-
-    /**
-     * 未开始
-     */
-    init(0),
-
-    /**
-     * 开始执行
-     */
-    running(1),
-
-    /**
-     * 执行结束
-     */
-    finish(2);
-
-    private int id;
-
-    private TaskTypeExecEnum(int id) {
-        this.id = id;
-    }
-
-    public int getId() {
-        return id;
-    }
-}

+ 0 - 21
themis-business/src/main/java/com/qmth/themis/business/enums/WebsocketExceptionEnum.java

@@ -1,21 +0,0 @@
-package com.qmth.themis.business.enums;
-
-/** 
-* @Description: websocket异常enum
-* @Param:  
-* @return:  
-* @Author: wangliang
-* @Date: 2020/7/25 
-*/ 
-public enum WebsocketExceptionEnum {
-
-    /**
-     * 网络超时
-     */
-    NET_TIME_OUT,
-
-    /**
-     * 机器故障
-     */
-    MACHINE_FAULT;
-}

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/service/TBTaskHistoryService.java

@@ -3,6 +3,8 @@ package com.qmth.themis.business.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.themis.business.entity.TBTaskHistory;
+import com.qmth.themis.business.enums.TaskStatusEnum;
+import com.qmth.themis.business.enums.TaskTypeEnum;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Map;
@@ -26,5 +28,5 @@ public interface TBTaskHistoryService extends IService<TBTaskHistory> {
      * @param status
      * @return
      */
-    public IPage<Map> taskQuery(IPage<Map> iPage, Long taskId, Long entityId, Integer type, Integer status);
+    public IPage<Map> taskQuery(IPage<Map> iPage, Long taskId, Long entityId, TaskTypeEnum type, TaskStatusEnum status);
 }

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/TBTaskHistoryServiceImpl.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.themis.business.dao.TBTaskHistoryMapper;
 import com.qmth.themis.business.entity.TBTaskHistory;
+import com.qmth.themis.business.enums.TaskStatusEnum;
+import com.qmth.themis.business.enums.TaskTypeEnum;
 import com.qmth.themis.business.service.TBTaskHistoryService;
 import org.springframework.stereotype.Service;
 
@@ -34,7 +36,7 @@ public class TBTaskHistoryServiceImpl extends ServiceImpl<TBTaskHistoryMapper, T
      * @return
      */
     @Override
-    public IPage<Map> taskQuery(IPage<Map> iPage, Long taskId, Long entityId, Integer type, Integer status) {
+    public IPage<Map> taskQuery(IPage<Map> iPage, Long taskId, Long entityId, TaskTypeEnum type, TaskStatusEnum status) {
         return tbTaskHistoryMapper.taskQuery(iPage, taskId, entityId, type, status);
     }
 }

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

@@ -14,6 +14,7 @@ import java.util.UUID;
 
 import javax.annotation.Resource;
 
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
@@ -266,7 +267,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 
 		// 修改考试记录数据
 		er.setFirstStartTime(new Date());
-		er.setStatus(2);
+		er.setStatus(ExamRecordStatusEnum.break_off);
 
 		ExamPaperCacheBean ep = teExamPaperService.getExamPaperCacheBean(er.getPaperId());
 		if (ep == null) {
@@ -300,7 +301,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 		}
 		ExamStudentPaperStructCacheBean struct = new ExamStudentPaperStructCacheBean();
 		struct.setContent(content);
-		struct.setTime(new Date().getTime());
+		struct.setTime(System.currentTimeMillis());
 		// 更新考生试卷结构
 		redisUtil.set(RedisKeyHelper.studentPaperStructKey(recordId), struct);
 		return struct.getTime();
@@ -394,7 +395,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 			String url=systemConfig.getProperty("aliyun.oss.url")+"/"+filePath;
 			ExamFileUploadBean ret=new ExamFileUploadBean();
 			ret.setUrl(url);
-			ret.setUploadTime(new Date().getTime());
+			ret.setUploadTime(System.currentTimeMillis());
 			return ret;
 		} catch (IOException e) {
 			throw new BusinessException("文件读取出错");

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

@@ -7,6 +7,7 @@ import java.util.Objects;
 
 import javax.annotation.Resource;
 
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -98,7 +99,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     	er.setPaperId(paperId);
     	er.setSerialNumber(serialNumber);
     	er.setFirstPrepareTime(new Date());
-    	er.setStatus(0);
+    	er.setStatus(ExamRecordStatusEnum.first_prepare);
     	saveOrUpdate(er);
     	ExamRecordCacheBean erCache=new ExamRecordCacheBean();
     	copy(erCache, er);

+ 3 - 3
themis-business/src/main/java/com/qmth/themis/business/templete/TaskExportCommon.java

@@ -7,7 +7,7 @@ import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBTaskHistory;
-import com.qmth.themis.business.enums.TaskTypeExecEnum;
+import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.enums.UploadFileEnum;
 import com.qmth.themis.business.service.TBAttachmentService;
 import com.qmth.themis.business.service.TBTaskHistoryService;
@@ -173,12 +173,12 @@ public class TaskExportCommon {
         BigDecimal bigDecimal = new BigDecimal(100);
         BigDecimal progress = new BigDecimal(Double.valueOf(new BigDecimal(max).divide(new BigDecimal(size), 2, BigDecimal.ROUND_HALF_UP).multiply(bigDecimal).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())).setScale(0, BigDecimal.ROUND_HALF_UP);
         if (progress.intValue() == 100) {
-            this.tbTaskHistory.setStatus(TaskTypeExecEnum.finish.ordinal());
+            this.tbTaskHistory.setStatus(TaskStatusEnum.finish);
             this.tbTaskHistory.setSummary("共导出了" + size + "条数据");
             this.tbTaskHistory.setFinishTime(new Date());
             txtList.add(DateUtil.format(new Date(), this.timeFormat) + "->数据导出完毕," + this.tbTaskHistory.getSummary());
         } else {
-            this.tbTaskHistory.setStatus(TaskTypeExecEnum.running.ordinal());
+            this.tbTaskHistory.setStatus(TaskStatusEnum.running);
             this.tbTaskHistory.setSummary("正在导出第" + min + "条至" + max + "条数据");
             txtList.add(DateUtil.format(new Date(), this.timeFormat) + "->数据导出中," + this.tbTaskHistory.getSummary());
         }

+ 3 - 3
themis-business/src/main/java/com/qmth/themis/business/templete/TaskImportCommon.java

@@ -7,7 +7,7 @@ import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBTaskHistory;
-import com.qmth.themis.business.enums.TaskTypeExecEnum;
+import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.service.TBTaskHistoryService;
 import com.qmth.themis.business.util.OssUtil;
 
@@ -151,12 +151,12 @@ public class TaskImportCommon {
         BigDecimal bigDecimal = new BigDecimal(100);
         BigDecimal progress = new BigDecimal(Double.valueOf(new BigDecimal(max).divide(new BigDecimal(size), 2, BigDecimal.ROUND_HALF_UP).multiply(bigDecimal).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())).setScale(0, BigDecimal.ROUND_HALF_UP);
         if (progress.intValue() == 100) {
-            this.tbTaskHistory.setStatus(TaskTypeExecEnum.finish.ordinal());
+            this.tbTaskHistory.setStatus(TaskStatusEnum.finish);
             this.tbTaskHistory.setSummary("共处理了" + size + "条数据");
             this.tbTaskHistory.setFinishTime(new Date());
             txtList.add(DateUtil.format(new Date(), this.timeFormat) + "->数据处理完毕," + this.tbTaskHistory.getSummary());
         } else {
-            this.tbTaskHistory.setStatus(TaskTypeExecEnum.running.ordinal());
+            this.tbTaskHistory.setStatus(TaskStatusEnum.running);
             this.tbTaskHistory.setSummary("正在处理第" + min + "条至" + max + "条数据");
             txtList.add(DateUtil.format(new Date(), this.timeFormat) + "->数据处理中," + this.tbTaskHistory.getSummary());
         }

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java

@@ -9,6 +9,7 @@ import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TEExamCourse;
 import com.qmth.themis.business.entity.TEExamPaper;
+import com.qmth.themis.business.enums.EncryptModeEnum;
 import com.qmth.themis.business.service.TEExamCourseService;
 import com.qmth.themis.business.service.TEExamPaperService;
 import com.qmth.themis.business.service.TEExamService;
@@ -161,7 +162,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
             paper.setName(paperJson.getString("name"));
             paper.setTotalScore(paperJson.getDouble("totalScore"));
             paper.setDecryptSecret(RandomStringUtils.randomAlphanumeric(16));
-            paper.setEncryptMode(0);
+            paper.setEncryptMode(EncryptModeEnum.auto);
             paper.setExamId(teExam.getId());
             paper.setCode(paperCode);
             paper.setHasAudio(paperJson.getInteger("hasAudio"));

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamStudentImportTemplete.java

@@ -102,7 +102,7 @@ public class TaskExamStudentImportTemplete implements TaskImportTemplete {
 
             TEExamStudentService teExamStudentService = SpringContextHolder.getBean(TEExamStudentService.class);
             TEStudentService teStudentService = SpringContextHolder.getBean(TEStudentService.class);
-            TBUserRoleService tbUserRoleService = SpringContextHolder.getBean(TBUserRoleService.class);
+//            TBUserRoleService tbUserRoleService = SpringContextHolder.getBean(TBUserRoleService.class);
             TBExamInvigilateUserService tbExamInvigilateUserService = SpringContextHolder.getBean(TBExamInvigilateUserService.class);
 
             List<TEExamStudent> teExamStudentList = new ArrayList<>();

+ 75 - 33
themis-business/src/main/resources/db/init.sql

@@ -11,7 +11,7 @@
  Target Server Version : 80020
  File Encoding         : 65001
 
- Date: 28/07/2020 09:49:33
+ Date: 29/07/2020 16:31:02
 */
 
 SET NAMES utf8mb4;
@@ -306,7 +306,7 @@ CREATE TABLE `t_b_org` (
   `contact_name` varchar(50) DEFAULT NULL COMMENT '联系人',
   `contact_phone` varchar(30) DEFAULT NULL COMMENT '联系人电话',
   `enable_liveness` tinyint DEFAULT NULL COMMENT '是否允许使用活体',
-  `enable_video_record` tinyint DEFAULT NULL COMMENT '是否允许视频转录',
+  `enable_monitor_record` tinyint DEFAULT NULL COMMENT '是否允许监控转录',
   `create_id` bigint DEFAULT NULL COMMENT '创建人id',
   `update_id` bigint DEFAULT NULL COMMENT '更新人id',
   PRIMARY KEY (`id`)
@@ -422,15 +422,22 @@ CREATE TABLE `t_b_session` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会话信息';
 
+-- ----------------------------
+-- Records of t_b_session
+-- ----------------------------
+BEGIN;
+INSERT INTO `t_b_session` VALUES ('1-1591624781-admin_web', '1', '[SUPER_ADMIN]', 'admin_web', 'web', '1234567891', '0:0:0:0:0:0:0:1', 'BfVf812accydQeIsoIRsvR4fDISm95iB', '2020-07-29 14:02:27', NULL, '2020-07-29 14:02:29', '2020-07-30 14:02:27');
+COMMIT;
+
 -- ----------------------------
 -- Table structure for t_b_task_history
 -- ----------------------------
 DROP TABLE IF EXISTS `t_b_task_history`;
 CREATE TABLE `t_b_task_history` (
   `id` bigint NOT NULL COMMENT '主键',
-  `type` tinyint NOT NULL COMMENT '任务类型,0:考试重新算分,1:导入考生,2:导入试卷,3:导入监考员,4:导出监考员',
+  `type` varchar(30) NOT NULL COMMENT '任务类型,calculate_exam_score:考试重新算分,import_exam_student:导入考生,import_exam_paper:导入试卷,import_invigilate_user:导入监考员,export_invigilate_user:导出监考员',
   `entity_id` bigint DEFAULT NULL COMMENT '关联业务对象ID',
-  `status` tinyint NOT NULL COMMENT '任务状态,0:未开始,1:开始执行,2:执行结束',
+  `status` varchar(30) NOT NULL COMMENT '任务状态,init:未开始,running:开始执行,finish:执行结束',
   `summary` mediumtext COMMENT '实时摘要信息',
   `progress` double DEFAULT NULL COMMENT '执行进度',
   `import_file_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '导入文件名',
@@ -560,28 +567,30 @@ CREATE TABLE `t_e_exam` (
   `show_objective_score` tinyint DEFAULT NULL COMMENT '交卷后是否显示客观得分,0:不显示,1:显示',
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `mode` tinyint DEFAULT NULL COMMENT '模式,0:集中统一,1:随到随考',
+  `mode` varchar(30) DEFAULT NULL COMMENT '模式,together:集中统一,anytime:随到随考',
   `enable` tinyint DEFAULT '1' COMMENT '是否启用,0:停用,1:启用',
   `archived` tinyint DEFAULT NULL COMMENT '是否归档,0:不归档,1:归档',
   `opening_seconds` int DEFAULT NULL COMMENT '允许开考开放时长(分钟),相当于迟到时间',
   `max_duration_seconds` int DEFAULT NULL COMMENT '最大考试时长(分钟)',
   `force_finish` tinyint DEFAULT NULL COMMENT '是否在结束时间集中强制收卷,0:不强制,1:强制',
-  `entry_authentication_policy` tinyint DEFAULT NULL COMMENT '开考身份验证策略,0:关闭,1:非强制人脸验证,2:强制人脸验证,3:活体验证',
+  `entry_authentication_policy` varchar(30) DEFAULT NULL COMMENT '开考身份验证策略,off:关闭,face_verify_optional:非强制人脸验证,face_verify_force:强制人脸验证,liveness:活体验证',
   `in_process_face_verify` tinyint DEFAULT NULL COMMENT '考试过程中人脸检测是否开启,0:不开启,1:开启',
   `in_process_face_stranger_ignore` tinyint DEFAULT NULL COMMENT '考试过程中人脸检测是否忽略陌生人 ,0:不忽略,1:忽略',
   `in_process_liveness_verify` tinyint DEFAULT NULL COMMENT '考试过程中是否启用活体检测 ,0:不启用,1:启用',
   `in_process_liveness_interval_seconds` tinyint DEFAULT NULL COMMENT '考试过程中活体检测间隔时间',
   `in_process_liveness_retry_count` tinyint DEFAULT NULL COMMENT '考试过程中活体检测重试次数\n',
-  `in_process_liveness_judge_policy` tinyint DEFAULT NULL COMMENT '考试过程中活体检测结果判定规则,0:任意一次通过,1:全部都要通过,2:通过次数大于失败次数',
-  `record_select_strategy` tinyint DEFAULT NULL COMMENT '多次考试记录的选择逻辑,0:全部阅卷后取最高分,1:客观分最高,3:最后一次提交',
+  `in_process_liveness_judge_policy` varchar(30) DEFAULT NULL COMMENT '考试过程中活体检测结果判定规则,any:任意一次通过,all:全部都要通过,more:通过次数大于失败次数',
+  `record_select_strategy` varchar(30) DEFAULT NULL COMMENT '多次考试记录的选择逻辑,highest_total_score:全部阅卷后取最高分,highest_objective_score:客观分最高,latest:最后一次提交',
   `enable_ip_limit` tinyint DEFAULT NULL COMMENT '是否IP段限制,0:不允许,1:允许',
   `ip_allow` varchar(1000) DEFAULT NULL COMMENT '允许IP段',
-  `score_status` tinyint DEFAULT NULL COMMENT '算分状态,0:从未算分,1:正在算分,2:算分完成',
+  `score_status` varchar(30) DEFAULT NULL COMMENT '算分状态,never:从未算分,calculating:正在算分,finish:算分完成',
   `create_id` bigint DEFAULT NULL COMMENT '创建人id',
   `update_id` bigint DEFAULT NULL COMMENT '更新人id',
   `enable_short_code` tinyint DEFAULT NULL COMMENT '是否启用开考口令,0:不启用,1:启用',
   `enable_break` tinyint DEFAULT NULL COMMENT '是否允许断点续考,0:不允许,1:允许',
-  `objective_score_policy` tinyint DEFAULT NULL COMMENT '客观题给分策略',
+  `objective_score_policy` varchar(30) DEFAULT NULL COMMENT '客观题给分策略,equal: 全对给分,partial: 漏选给一半分',
+  `monitor_video_source` varchar(300) DEFAULT NULL COMMENT '开启监控的视频源',
+  `monitor_record` tinyint DEFAULT NULL COMMENT '是否开始监控转录,0:开启,1:不开启',
   PRIMARY KEY (`id`),
   UNIQUE KEY `t_e_exam_orgId_code_Idx` (`org_id`,`code`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考试批次';
@@ -590,8 +599,8 @@ CREATE TABLE `t_e_exam` (
 -- Records of t_e_exam
 -- ----------------------------
 BEGIN;
-INSERT INTO `t_e_exam` VALUES (18738036992901120, 1, '202007130001', '20200713test1', '20200713001', '2020-07-27 00:00:00', '2020-07-29 00:00:00', '456321', 10, 5, '我是考前须知1', 10, '我是考后说明1', 3, 60, 5, 1, 1, 1, 1, 1, 1, 1, 1, '2020-07-22 16:58:17', '2020-07-22 16:58:17', 0, 1, NULL, 10, 120, 1, 3, 1, 0, 1, 10, 3, 1, 1, 1, '192.168.10.2,192.168.10.3', NULL, 1, NULL, 1, 1);
-INSERT INTO `t_e_exam` VALUES (18738491387019264, 1, '202007130002', '20200713test2', '20200713002', '2020-07-27 00:00:00', '2020-07-29 00:00:00', '4563210', 10, 5, '我是考前须知2', 10, '我是考后说明2', 3, 60, 5, 1, 1, 1, 1, 1, 1, 1, 1, '2020-07-22 17:00:05', '2020-07-22 17:00:05', 1, 1, NULL, 10, 120, 1, 3, 1, 0, 1, 10, 3, 1, 1, 1, '192.168.10.2,192.168.10.3', NULL, 1, NULL, 1, 1);
+INSERT INTO `t_e_exam` VALUES (18738036992901120, 1, '202007130001', '20200713test1', '20200713001', '2020-07-27 00:00:00', '2020-07-29 00:00:00', '456321', 10, 5, '我是考前须知1', 10, '我是考后说明1', 3, 60, 5, 1, 1, 1, 1, 1, 1, 1, 1, '2020-07-22 16:58:17', '2020-07-22 16:58:17', 'together', 1, NULL, 10, 120, 1, 'liveness', 1, 0, 1, 10, 3, 'all', 'highest_objective_score', 1, '192.168.10.2,192.168.10.3', 'never', 1, NULL, 1, 1, 'equal', NULL, NULL);
+INSERT INTO `t_e_exam` VALUES (18738491387019264, 1, '202007130002', '20200713test2', '20200713002', '2020-07-27 00:00:00', '2020-07-29 00:00:00', '4563210', 10, 5, '我是考前须知2', 10, '我是考后说明2', 3, 60, 5, 1, 1, 1, 1, 1, 1, 1, 1, '2020-07-22 17:00:05', '2020-07-22 17:00:05', 'anytime', 1, NULL, 10, 120, 1, 'liveness', 1, 0, 1, 10, 3, 'all', 'highest_objective_score', 1, '192.168.10.2,192.168.10.3', 'never', 1, NULL, 1, 1, 'equal', NULL, NULL);
 COMMIT;
 
 -- ----------------------------
@@ -684,7 +693,7 @@ CREATE TABLE `t_e_exam_paper` (
   `total_score` double NOT NULL COMMENT '试卷总分',
   `paper_path` varchar(100) DEFAULT NULL COMMENT '题干路径',
   `decrypt_secret` varchar(50) DEFAULT NULL COMMENT '解密密钥',
-  `encrypt_mode` tinyint DEFAULT NULL COMMENT '0:自动,1:手动,2:不加密',
+  `encrypt_mode` varchar(30) DEFAULT NULL COMMENT 'auto:自动,hand:手动',
   `need_voice_answer` tinyint DEFAULT NULL COMMENT '是否需要语音作答,0:不需要,1:需要',
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
@@ -707,12 +716,12 @@ CREATE TABLE `t_e_exam_paper` (
 -- Records of t_e_exam_paper
 -- ----------------------------
 BEGIN;
-INSERT INTO `t_e_exam_paper` VALUES (1, '大学语文2020测试卷A', 100, 'http://111', '123456', 1, 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YWP001', 'http://222', 1, 100, 3, 1, NULL, 'YW001', 'http://333', '123456789');
-INSERT INTO `t_e_exam_paper` VALUES (2, '大学英语2020测试卷A', 120, 'http://111', '123456', 2, 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YYP001', 'http://222', 1, 90, 3, 1, NULL, 'YY001', 'http://333', '123456789');
-INSERT INTO `t_e_exam_paper` VALUES (3, '大学语文2020测试卷B', 100, 'http://111', '123456', 0, 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YWP002', 'http://222', 1, 90, 3, 1, NULL, 'YW001', 'http://333', '123456789');
-INSERT INTO `t_e_exam_paper` VALUES (4, '大学英语2020测试卷B', 120, 'http://111', '123456', 1, 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YYP002', 'http://222', 1, 100, 3, 1, NULL, 'YY001', 'http://333', '123456789');
-INSERT INTO `t_e_exam_paper` VALUES (5, '大学语文2020随到随考卷', 100, 'http://111', '123456', 0, 1, '2020-07-22 17:06:07', NULL, 18738491387019264, 'YWP003', 'http://222', 1, 100, 3, 1, NULL, 'YW002', 'http://333', '123456789');
-INSERT INTO `t_e_exam_paper` VALUES (6, '大学英语2020随到随考卷', 100, 'http://111', '123456', 1, 1, '2020-07-22 17:06:07', NULL, 18738491387019264, 'YYP003', 'http://222', 1, 100, 3, 1, NULL, 'YY002', 'http://333', '123456789');
+INSERT INTO `t_e_exam_paper` VALUES (1, '大学语文2020测试卷A', 100, 'http://111', '123456', 'hand', 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YWP001', 'http://222', 1, 100, 3, 1, NULL, 'YW001', 'http://333', '123456789');
+INSERT INTO `t_e_exam_paper` VALUES (2, '大学英语2020测试卷A', 120, 'http://111', '123456', 'hand', 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YYP001', 'http://222', 1, 90, 3, 1, NULL, 'YY001', 'http://333', '123456789');
+INSERT INTO `t_e_exam_paper` VALUES (3, '大学语文2020测试卷B', 100, 'http://111', '123456', 'auto', 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YWP002', 'http://222', 1, 90, 3, 1, NULL, 'YW001', 'http://333', '123456789');
+INSERT INTO `t_e_exam_paper` VALUES (4, '大学英语2020测试卷B', 120, 'http://111', '123456', 'hand', 1, '2020-07-22 17:06:07', NULL, 18738036992901120, 'YYP002', 'http://222', 1, 100, 3, 1, NULL, 'YY001', 'http://333', '123456789');
+INSERT INTO `t_e_exam_paper` VALUES (5, '大学语文2020随到随考卷', 100, 'http://111', '123456', 'auto', 1, '2020-07-22 17:06:07', NULL, 18738491387019264, 'YWP003', 'http://222', 1, 100, 3, 1, NULL, 'YW002', 'http://333', '123456789');
+INSERT INTO `t_e_exam_paper` VALUES (6, '大学英语2020随到随考卷', 100, 'http://111', '123456', 'hand', 1, '2020-07-22 17:06:07', NULL, 18738491387019264, 'YYP003', 'http://222', 1, 100, 3, 1, NULL, 'YY002', 'http://333', '123456789');
 COMMIT;
 
 -- ----------------------------
@@ -828,7 +837,7 @@ CREATE TABLE `t_e_student` (
   `idcard_number` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '身份证号',
   `mobile_number` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号',
   `name` varchar(30) NOT NULL COMMENT '姓名',
-  `gender` tinyint DEFAULT NULL COMMENT '性别,0:女,1:男',
+  `gender` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性别,man:男,woman:女',
   `base_photo_path` varchar(100) DEFAULT NULL COMMENT '底照保存地址',
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
@@ -865,6 +874,13 @@ CREATE TABLE `t_e_user_log` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户轨迹';
 
+-- ----------------------------
+-- Records of t_e_user_log
+-- ----------------------------
+BEGIN;
+INSERT INTO `t_e_user_log` VALUES (21230512672604160, 1, 5, '登录', '{\"id\":\"34858a0c6dd9407f881987d25e051ae6\",\"topic\":\"themis-topic-userLog\",\"tag\":\"user\",\"timestamp\":1596002547803,\"body\":\"LOGIN\",\"type\":\"USER_LOG\",\"objId\":\"1\",\"objName\":\"sysadmin\",\"ack\":0,\"sequence\":null,\"properties\":null}', '2020-07-29 14:02:29');
+COMMIT;
+
 -- ----------------------------
 -- Table structure for t_ie_exam_invigilate_notice
 -- ----------------------------
@@ -875,7 +891,7 @@ CREATE TABLE `t_ie_exam_invigilate_notice` (
   `exam_activity_id` bigint NOT NULL COMMENT '场次ID',
   `exam_record_id` bigint NOT NULL COMMENT '考试记录ID',
   `user_id` bigint NOT NULL COMMENT '监考人ID',
-  `type` tinyint NOT NULL COMMENT '消息类型',
+  `type` varchar(30) NOT NULL COMMENT '消息类型',
   `content` varchar(1000) NOT NULL COMMENT '消息内容',
   `send_time` datetime DEFAULT NULL COMMENT '发送时间',
   `receive_time` datetime DEFAULT NULL COMMENT '接收时间',
@@ -940,6 +956,14 @@ CREATE TABLE `t_m_rocket_message` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='rocketmq消息';
 
+-- ----------------------------
+-- Records of t_m_rocket_message
+-- ----------------------------
+BEGIN;
+INSERT INTO `t_m_rocket_message` VALUES ('13b1e84bedea4a0993e44c44a359fe91', 'themis-topic-session', 'web', '{\"id\":\"1-1591624781-admin_web\",\"identity\":\"1\",\"type\":\"[SUPER_ADMIN]\",\"source\":\"admin_web\",\"platform\":\"web\",\"deviceId\":\"1234567891\",\"address\":\"0:0:0:0:0:0:0:1\",\"accessToken\":\"BfVf812accydQeIsoIRsvR4fDISm95iB\",\"lastAccessTime\":1.596002547428E12,\"expireTime\":1.596088947421E12}', 'SESSION', '1-1591624781-admin_web', 'sysadmin', 2, NULL, NULL, '2020-07-29 14:02:30', 1596002547443);
+INSERT INTO `t_m_rocket_message` VALUES ('34858a0c6dd9407f881987d25e051ae6', 'themis-topic-userLog', 'user', 'LOGIN', 'USER_LOG', '1', 'sysadmin', 2, NULL, NULL, '2020-07-29 14:02:30', 1596002547803);
+COMMIT;
+
 -- ----------------------------
 -- Table structure for t_oe_exam_answer
 -- ----------------------------
@@ -966,11 +990,11 @@ CREATE TABLE `t_oe_exam_break_history` (
   `id` bigint NOT NULL COMMENT '主键',
   `exam_record_id` bigint NOT NULL COMMENT '考试记录ID',
   `break_time` datetime DEFAULT NULL COMMENT '断点发生时间',
-  `break_reason` tinyint DEFAULT NULL COMMENT '断点判定原因',
+  `break_reason` varchar(30) DEFAULT NULL COMMENT '断点判定原因',
   `resume_reason` varchar(300) DEFAULT NULL COMMENT '提交异常原因',
   `prepare_time` datetime DEFAULT NULL COMMENT '恢复候考时间',
   `start_time` datetime DEFAULT NULL COMMENT '恢复开考时间',
-  `entry_authentication_result` tinyint DEFAULT NULL COMMENT '恢复开考身份验证结果',
+  `entry_authentication_result` varchar(30) DEFAULT NULL COMMENT '恢复开考身份验证结果',
   `entry_authentication_id` bigint DEFAULT NULL COMMENT '恢复开考身份验证记录ID',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考试断点记录';
@@ -979,9 +1003,24 @@ CREATE TABLE `t_oe_exam_break_history` (
 -- Records of t_oe_exam_break_history
 -- ----------------------------
 BEGIN;
-INSERT INTO `t_oe_exam_break_history` VALUES (19920220273508352, 1, '2020-07-25 23:15:51', 0, 'NET_TIME_OUT', NULL, NULL, NULL, NULL);
+INSERT INTO `t_oe_exam_break_history` VALUES (19920220273508352, 1, '2020-07-25 23:15:51', '0', 'NET_TIME_OUT', NULL, NULL, NULL, NULL);
 COMMIT;
 
+-- ----------------------------
+-- Table structure for t_oe_exam_monitor_exception_history
+-- ----------------------------
+DROP TABLE IF EXISTS `t_oe_exam_monitor_exception_history`;
+CREATE TABLE `t_oe_exam_monitor_exception_history` (
+  `Id` bigint NOT NULL COMMENT '主键',
+  `exam_id` bigint NOT NULL COMMENT '考试id',
+  `exam_activity_id` bigint NOT NULL COMMENT '考试场次id',
+  `exam_student_id` bigint NOT NULL COMMENT '考生id',
+  `exam_record_id` bigint NOT NULL COMMENT '考试记录id',
+  `source` varchar(300) NOT NULL COMMENT '开启监控的视频源',
+  `type` varchar(30) DEFAULT NULL COMMENT '异常类型',
+  `time` datetime DEFAULT NULL COMMENT '异常时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='监控异常记录';
+
 -- ----------------------------
 -- Table structure for t_oe_exam_record
 -- ----------------------------
@@ -993,7 +1032,7 @@ CREATE TABLE `t_oe_exam_record` (
   `exam_student_id` bigint NOT NULL COMMENT '考生ID',
   `paper_id` bigint NOT NULL COMMENT '实际使用的试卷ID',
   `answer_path` varchar(100) DEFAULT NULL COMMENT '全部作答保存地址',
-  `status` tinyint DEFAULT NULL COMMENT '当前状态',
+  `status` varchar(30) DEFAULT NULL COMMENT '考试状态,first_prepare:首次候考,answering:正在答题,break_off:已中断,resume_prepare:断点恢复候考,finished:已结束考试,persisted:数据已保存',
   `first_prepare_time` datetime DEFAULT NULL COMMENT '首次进入候考时间',
   `first_start_time` datetime DEFAULT NULL COMMENT '首次开考时间',
   `last_break_time` datetime DEFAULT NULL COMMENT '最近断点时间',
@@ -1014,9 +1053,9 @@ CREATE TABLE `t_oe_exam_record` (
   `answer_progress` double DEFAULT NULL COMMENT '答题进度',
   `duration_seconds` int DEFAULT NULL COMMENT '累计考试用时',
   `finish_time` datetime DEFAULT NULL COMMENT '交卷时间',
-  `finish_type` tinyint DEFAULT NULL COMMENT '交卷原因',
+  `finish_type` varchar(30) DEFAULT NULL COMMENT '交卷原因,hand:手动交卷,auto:系统交卷,breach:违纪交卷',
   `warning_count` int DEFAULT NULL COMMENT '预警次数',
-  `review_result` tinyint DEFAULT NULL COMMENT '审核结果',
+  `review_result` varchar(30) DEFAULT NULL COMMENT '审核结果,pass:通过,no_pass:不通过',
   `objective_score` double DEFAULT NULL COMMENT '客观题分数',
   `paper_download` tinyint DEFAULT NULL COMMENT '试题下载,0:是,1:不是',
   `breach_status` tinyint DEFAULT NULL COMMENT '是否违纪,0:是,1:不是',
@@ -1024,11 +1063,15 @@ CREATE TABLE `t_oe_exam_record` (
   `paper_struct_upload` tinyint DEFAULT NULL COMMENT '个人试卷结构是否已上传,0:未上传,1:已上传',
   `serial_number` int DEFAULT NULL COMMENT '第几次考试',
   `last_break_id` bigint DEFAULT NULL COMMENT '最近断点记录ID',
-  `entry_authentication_result` tinyint DEFAULT NULL COMMENT '开考身份验证结果',
+  `entry_authentication_result` varchar(30) DEFAULT NULL COMMENT '开考身份验证结果',
   `entry_authentication_id` bigint DEFAULT NULL COMMENT '开考身份验证记录ID',
   `in_process_face_verify_status` tinyint DEFAULT NULL COMMENT '当前过程人脸检测状态',
   `in_process_liveness_verify_status` tinyint DEFAULT NULL COMMENT '当前过程活体验证状态',
   `in_process_liveness_verify_count` int DEFAULT NULL COMMENT '已完成过程活体验证次数',
+  `monitor_key` varchar(50) DEFAULT NULL COMMENT '监控标识(默认直接用recordId)',
+  `monitor_status_source` varchar(30) DEFAULT NULL COMMENT '监控状态,stop:停止,start:正常',
+  `monitor_live_url` varchar(100) DEFAULT NULL COMMENT '监控观看地址',
+  `score_status` varchar(30) DEFAULT NULL COMMENT '算分状态,never:从未算分,calculating:正在算分,finish:算分完成',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考试记录';
 
@@ -1036,7 +1079,7 @@ CREATE TABLE `t_oe_exam_record` (
 -- Records of t_oe_exam_record
 -- ----------------------------
 BEGIN;
-INSERT INTO `t_oe_exam_record` VALUES (1, 18738036992901120, 18740006977798144, 1, 1, 'http://111', 4, '2020-07-22 17:34:02', '2020-07-22 17:34:02', '2020-07-25 23:15:51', NULL, NULL, -4, '', 1, '1234567891', '2020-07-25 23:10:11', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, 100, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, 19920220273508352, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_oe_exam_record` VALUES (1, 18738036992901120, 18740006977798144, 1, 1, 'http://111', 'finished', '2020-07-22 17:34:02', '2020-07-22 17:34:02', '2020-07-25 23:15:51', NULL, NULL, 0, '', 1, '1234567891', '2020-07-25 23:10:11', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 100, 100, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, 19920220273508352, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 COMMIT;
 
 -- ----------------------------
@@ -1059,10 +1102,10 @@ CREATE TABLE `t_oe_face_verify_history` (
   `id` bigint NOT NULL COMMENT '主键',
   `exam_record_id` bigint NOT NULL COMMENT '考试记录ID',
   `similarity` double DEFAULT NULL COMMENT '相似度分数',
-  `realness` tinyint DEFAULT NULL COMMENT '真实性验证结果',
+  `realness` varchar(30) DEFAULT NULL COMMENT '真实性验证结果',
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `type` tinyint DEFAULT NULL COMMENT '0:初次开考,1:恢复开考,2:过程中',
+  `type` varchar(30) DEFAULT NULL COMMENT 'first:初次开考,recover:恢复开考,process:过程中',
   `photo_url` varchar(100) DEFAULT NULL COMMENT '图片保存路径',
   `pass` tinyint DEFAULT NULL COMMENT '本地验证是否通过,0:不通过,1:通过',
   PRIMARY KEY (`id`)
@@ -1075,9 +1118,8 @@ DROP TABLE IF EXISTS `t_oe_liveness_verify_history`;
 CREATE TABLE `t_oe_liveness_verify_history` (
   `id` bigint NOT NULL COMMENT '主键',
   `exam_record_id` bigint NOT NULL COMMENT '考试记录ID',
-  `type` tinyint NOT NULL COMMENT '0:初次开考,1:恢复开考,2:过程中',
+  `type` varchar(30) NOT NULL COMMENT 'first:初次开考,recover:恢复开考,process:过程中',
   `actions` varchar(2000) DEFAULT NULL COMMENT '随机动作与结果',
-  `result` tinyint DEFAULT NULL COMMENT '检测结果',
   `retry` int DEFAULT NULL COMMENT '重试次数',
   `pass` tinyint DEFAULT NULL COMMENT '本地验证是否通过,0:不通过,1:通过',
   `start_time` datetime DEFAULT NULL COMMENT '开始时间',

+ 3 - 3
themis-mq/src/main/java/com/qmth/themis/mq/templete/impl/WebsocketUnNormalConcurrentlyImpl.java

@@ -89,12 +89,12 @@ public class WebsocketUnNormalConcurrentlyImpl implements Concurrently {
                         Integer breakCount = tOeExamRecord.getLeftBreakResumeCount();
                         if (Objects.isNull(breakCount) || breakCount <= 0) {
                             //todo 没有断点次数,则强制交卷
-                            tOeExamRecord.setStatus(ExamRecordStatusEnum.finished.ordinal());
+                            tOeExamRecord.setStatus(ExamRecordStatusEnum.finished);
                             tOeExamRecordService.updateById(tOeExamRecord);
                         } else {
                             breakCount--;
                             //增加断点记录
-                            tOeExamBreakHistory = new TOeExamBreakHistory(recordId, new Date(), WebsocketExceptionEnum.NET_TIME_OUT.ordinal(), WebsocketExceptionEnum.NET_TIME_OUT.name());
+                            tOeExamBreakHistory = new TOeExamBreakHistory(recordId, new Date(), BreakReasonEnum.NET_TIME_OUT, BreakReasonEnum.NET_TIME_OUT.name());
                             tOeExamBreakHistoryService.save(tOeExamBreakHistory);
                             //更新考试记录状态
                             tOeExamRecord.setClientCurrentIp(ip);
@@ -104,7 +104,7 @@ public class WebsocketUnNormalConcurrentlyImpl implements Concurrently {
                             tOeExamRecord.setLastBreakId(tOeExamBreakHistory.getId());
                             tOeExamRecord.setLastBreakTime(tOeExamBreakHistory.getBreakTime());
                             tOeExamRecord.setLeftBreakResumeCount(breakCount);
-                            tOeExamRecord.setStatus(ExamRecordStatusEnum.break_off.ordinal());
+                            tOeExamRecord.setStatus(ExamRecordStatusEnum.break_off);
                             tOeExamRecordService.updateById(tOeExamRecord);
                         }
                     } else {

+ 3 - 3
themis-task/src/main/java/com/qmth/themis/task/quartz/ExamActivityJob.java

@@ -5,7 +5,7 @@ import com.qmth.themis.business.entity.TEExamActivity;
 import com.qmth.themis.business.entity.TEExamStudent;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
-import com.qmth.themis.business.enums.FinishExamTypeEnum;
+import com.qmth.themis.business.enums.FinishTypeEnum;
 import com.qmth.themis.business.service.TEExamActivityService;
 import com.qmth.themis.business.service.TEExamStudentService;
 import com.qmth.themis.business.service.TOeExamRecordService;
@@ -62,9 +62,9 @@ public class ExamActivityJob extends QuartzJobBean {
                 List<TOeExamRecord> tOeExamRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
                 List<Long> examStudentIdList = new ArrayList<>();
                 tOeExamRecordList.forEach(s -> {
-                    s.setStatus(ExamRecordStatusEnum.finished.ordinal());
+                    s.setStatus(ExamRecordStatusEnum.finished);
                     s.setFinishTime(new Date());
-                    s.setFinishType(FinishExamTypeEnum.must_finish.ordinal());
+                    s.setFinishType(FinishTypeEnum.auto);
                     examStudentIdList.add(s.getExamStudentId());
                 });
                 tOeExamRecordService.updateBatchById(tOeExamRecordList);