浏览代码

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java
wangliang 4 年之前
父节点
当前提交
9ff875b3af

+ 4 - 3
themis-business/src/main/java/com/qmth/themis/business/bean/exam/ExamFinishBean.java

@@ -1,6 +1,7 @@
 package com.qmth.themis.business.bean.exam;
 
 import com.qmth.themis.business.enums.FinishExamResultEnum;
+import com.qmth.themis.business.enums.ReviewResultEnum;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -18,7 +19,7 @@ public class ExamFinishBean {
 	private Double objectiveScore;
 
 	@ApiModelProperty("审核结果")
-	private String reviewResult;
+	private ReviewResultEnum reviewResult;
 
 	public Long getFinishTime() {
 		return finishTime;
@@ -44,11 +45,11 @@ public class ExamFinishBean {
 		this.objectiveScore = objectiveScore;
 	}
 
-	public String getReviewResult() {
+	public ReviewResultEnum getReviewResult() {
 		return reviewResult;
 	}
 
-	public void setReviewResult(String reviewResult) {
+	public void setReviewResult(ReviewResultEnum reviewResult) {
 		this.reviewResult = reviewResult;
 	}
 

+ 17 - 4
themis-business/src/main/java/com/qmth/themis/business/bean/exam/ExamResultBean.java

@@ -1,6 +1,8 @@
 package com.qmth.themis.business.bean.exam;
 
+import com.qmth.themis.business.enums.FinishExamResultEnum;
 import com.qmth.themis.business.enums.FinishTypeEnum;
+import com.qmth.themis.business.enums.ReviewResultEnum;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -11,7 +13,7 @@ public class ExamResultBean {
 	@ApiModelProperty("finishTime")
 	private Long finishTime;
 
-	@ApiModelProperty("交卷后状态")
+	@ApiModelProperty("交卷类型")
 	private FinishTypeEnum finishType;
 
 	@ApiModelProperty("客观分")
@@ -21,7 +23,10 @@ public class ExamResultBean {
 	private Integer durationSeconds;
 
 	@ApiModelProperty("审核结果")
-	private String reviewResult;
+	private ReviewResultEnum reviewResult;
+	
+	@ApiModelProperty("交卷后状态")
+	private FinishExamResultEnum status;
 
 	public Long getFinishTime() {
 		return finishTime;
@@ -56,12 +61,20 @@ public class ExamResultBean {
 		this.objectiveScore = objectiveScore;
 	}
 
-	public String getReviewResult() {
+	public ReviewResultEnum getReviewResult() {
 		return reviewResult;
 	}
 
-	public void setReviewResult(String reviewResult) {
+	public void setReviewResult(ReviewResultEnum reviewResult) {
 		this.reviewResult = reviewResult;
 	}
 
+	public FinishExamResultEnum getStatus() {
+		return status;
+	}
+
+	public void setStatus(FinishExamResultEnum status) {
+		this.status = status;
+	}
+
 }

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

@@ -117,4 +117,20 @@ public class ExamRecordCacheUtil {
 	public static Long getExamActivityId(Long recordId) {
 		return (Long) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), "examActivityId");
 	}
+	
+	public static void setWarningCount(Long recordId, Integer warningCount) {
+		redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), "warningCount", warningCount);
+	}
+	
+	public static Integer getWarningCount(Long recordId) {
+		return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), "warningCount");
+	}
+	
+	public static void setBreachStatus(Long recordId, Integer breachStatus) {
+		redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), "breachStatus", breachStatus);
+	}
+	
+	public static Integer getBreachStatus(Long recordId) {
+		return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), "breachStatus");
+	}
 }

+ 74 - 13
themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamCacheBean.java

@@ -3,13 +3,36 @@ package com.qmth.themis.business.cache.bean;
 import java.io.Serializable;
 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.ApiModelProperty;
+import com.qmth.themis.business.enums.EntryAuthenticationPolicyEnum;
+import com.qmth.themis.business.enums.ExamModeEnum;
+import com.qmth.themis.business.enums.InProcessLivenessJudgePolicyEnum;
+import com.qmth.themis.business.enums.InvigilateVerifyEnum;
+import com.qmth.themis.business.enums.ObjectiveScorePolicyEnum;
+import com.qmth.themis.business.enums.RecordSelectStrategyEnum;
+import com.qmth.themis.business.enums.ScoreStatusEnum;
 
-public class ExamCacheBean extends BaseEntity {
+public class ExamCacheBean implements Serializable {
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -1544653057729256077L;
+
+	 //主键
+    private Long id;
+
+    //创建人id
+    private Long createId;
+
+    //创建时间
+    private Date createTime;
+
+    //修改人id
+    private Long updateId;
+
+    //修改时间
+    private Date updateTime;
+	
 	//机构ID
     private Long orgId;
 
@@ -121,20 +144,16 @@ public class ExamCacheBean extends BaseEntity {
     //是否开始监控转录,0:开启,1:不开启
     private Integer monitorRecord;
 
-    @ApiModelProperty(value = "是否允许使用移动端拍照答题,0:不开启,1:开启")
-    @TableField(value = "mobile_photo_upload")
+    //是否允许使用移动端拍照答题,0:不开启,1:开启
     private Integer mobilePhotoUpload;
 
-    @ApiModelProperty(value = "考试过程中活体检测间隔时间")
-    @TableField(value = "in_process_liveness_fixed_range")
+    //考试过程中活体检测间隔时间
     private String inProcessLivenessFixedRange;
 
-    @ApiModelProperty(value = "算分进度")
-    @TableField(value = "progress")
+    //算分进度
     private Double progress;
 
-    @ApiModelProperty(value = "监考人工审核,now:实时审核,later:事后审核")
-    @TableField(value = "invigilate_verify")
+    //监考人工审核,now:实时审核,later:事后审核
     private InvigilateVerifyEnum invigilateVerify;
 
     public InvigilateVerifyEnum getInvigilateVerify() {
@@ -464,4 +483,46 @@ public class ExamCacheBean extends BaseEntity {
     public void setObjectiveScorePolicy(ObjectiveScorePolicyEnum objectiveScorePolicy) {
         this.objectiveScorePolicy = objectiveScorePolicy;
     }
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getCreateId() {
+		return createId;
+	}
+
+	public void setCreateId(Long createId) {
+		this.createId = createId;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Long getUpdateId() {
+		return updateId;
+	}
+
+	public void setUpdateId(Long updateId) {
+		this.updateId = updateId;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+    
+    
 }

+ 4 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/FinishExamResultEnum.java

@@ -14,6 +14,10 @@ public enum FinishExamResultEnum {
 	 * 待审核
 	 */
 	AUDITING("待审核"),
+	/**
+	 * 违纪
+	 */
+	BREACH("违纪"),
 	/**
 	 * 分数显示
 	 */

+ 8 - 4
themis-business/src/main/java/com/qmth/themis/business/enums/ReviewResultEnum.java

@@ -8,10 +8,14 @@ package com.qmth.themis.business.enums;
 * @Date: 2020/7/29
 */
 public enum ReviewResultEnum {
-    //todo 数据模型待补充确认
-    PASS("通过"),
-
-    NO_PASS("不通过");
+	/**
+	 * 通过"
+	 */
+	PASS("通过"),
+    /**
+     * 不通过
+     */
+    UN_PASS("不通过");
 
     private String code;
 

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

@@ -15,7 +15,11 @@ import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamQueryDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TOeExamRecord;
-import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
+import com.qmth.themis.business.enums.FinishExamResultEnum;
+import com.qmth.themis.business.enums.FinishTypeEnum;
+import com.qmth.themis.business.enums.InvigilateVerifyEnum;
+import com.qmth.themis.business.enums.ReviewResultEnum;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.RedisUtil;
@@ -62,6 +66,9 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
     @Resource
     TOeExamRecordService toeExamRecordService;
 
+    @Resource
+    TEExamStudentService examStudentService;
+
     @Resource
     RedisUtil redisUtil;
 
@@ -100,11 +107,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 List<TEExamActivityDto> teExamActivityList = teExamActivityService.getWaitingExam(studentId, s.getId(), s.getExamActivityId());
                 teExamActivityList.forEach(v -> {
                     if (Objects.nonNull(v.getInProcessLivenessFixedRangeStr())) {
-                        String[] longs = v.getInProcessLivenessFixedRangeStr().trim().replaceAll(" ", "").split(",");
+                        String[] longs = v.getInProcessLivenessFixedRangeStr().trim().split(",");
                         List inProcessLivenessFixedRange = new ArrayList();
                         for (int i = 0; i < longs.length; i++) {
-                            Integer integer = Integer.valueOf(longs[i].trim());
-                            inProcessLivenessFixedRange.add(integer);
+                            Long l = Long.valueOf(longs[i].trim());
+                            inProcessLivenessFixedRange.add(l);
                         }
                         if (Objects.equals(inProcessLivenessFixedRange.toString().trim().replaceAll(" ", ""), "")) {
                             v.setInProcessLivenessFixedRange(null);
@@ -113,30 +120,10 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                         }
                     }
                     if (Objects.nonNull(v.getMonitorVideoSourceStr()) && !Objects.equals(v.getMonitorVideoSourceStr().toString().trim().replaceAll(" ", ""), "")) {
-                        v.setMonitorVideoSource(Arrays.asList(v.getMonitorVideoSourceStr().trim().toUpperCase().replaceAll(" ", "").split(",")));
-                        //加入monitorAudioEnable逻辑
-                        if (v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) && v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name())) {
-                            v.setMonitorAudioEnable(true);
-                        }
-                        //加入hardwareTest逻辑
-                        if (v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()) || (Objects.nonNull(v.getEntryAuthenticationPolicy()) && (Objects.equals(v.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.LIVENESS.name()) || Objects.equals(v.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.FACE_VERIFY_FORCE.name()))) || (Objects.nonNull(v.getCameraPhotoUpload()) && v.getCameraPhotoUpload() == 1)) {
-                            List<String> hardwareTest = v.getHardwareTest();
-                            if (Objects.isNull(hardwareTest)) {
-                                hardwareTest = new ArrayList<>();
-                            }
-                            hardwareTest.add(HardwareTestEnum.CAMERA.name());
-                            //取course缓存
-                            ExamCourseCacheBean examCourseCacheBean = teExamCourseService.getExamCourseCacheBean(v.getExamId(), v.getCourseCode());
-                            if (Objects.nonNull(examCourseCacheBean) && Objects.nonNull(examCourseCacheBean.getHasAudio()) && examCourseCacheBean.getHasAudio() == 1) {
-                                hardwareTest.add(HardwareTestEnum.AUDIOPLAY.name());
-                            }
-                            v.setHardwareTest(hardwareTest);
-                        }
+                        v.setMonitorVideoSource(Arrays.asList(v.getMonitorVideoSourceStr().trim().split(",")));
                     } else {
                         v.setMonitorVideoSource(null);
                     }
-                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudnetCacheBean(v.getExamStudentId());
-                    v.setLeftExamCount(examStudentCacheBean.getLeftExamCount());
                 });
                 s.setActivities(teExamActivityList);
             });
@@ -170,11 +157,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         }
         TEStudentCacheDto teStudentCacheDto = (TEStudentCacheDto) redisUtil.getStudent(es.getStudentId());
         if (teStudentCacheDto.getUnFinishedRecordId() != null) {
-            Long recordId = teStudentCacheDto.getUnFinishedRecordId();
-
-            ExamPaperCacheBean ep = teExamPaperService.getExamPaperCacheBean(ExamRecordCacheUtil.getPaperId(recordId));
-            ExamCourseCacheBean ec = teExamCourseService.getExamCourseCacheBean(es.getExamId(), es.getCourseCode());
-            ExamPrepareBean prepare = new ExamPrepareBean();
+        	Long recordId=teStudentCacheDto.getUnFinishedRecordId();
+        	
+        	ExamPaperCacheBean ep = teExamPaperService.getExamPaperCacheBean(ExamRecordCacheUtil.getPaperId(recordId));
+        	ExamCourseCacheBean ec = teExamCourseService.getExamCourseCacheBean(es.getExamId(), es.getCourseCode());
+        	ExamPrepareBean prepare = new ExamPrepareBean();
             prepare.setRecordId(recordId);
             prepare.setAudioPlayCount(ep.getAudioPlayCount());
             prepare.setHasAudio((ep.getHasAudio() == null || ep.getHasAudio().intValue() == 0 ? false : true));
@@ -613,18 +600,36 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         ret.setFinishTime(now.getTime());
         ret.setObjectiveScore(ExamRecordCacheUtil.getObjectiveScore(recordId));
         ExamCacheBean exam = getExamCacheBean(es.getExamId());
-        //TODO
+        //页面结果
         if (exam.getShowObjectiveScore() != null && exam.getShowObjectiveScore().intValue() == 1) {//实时出分
-            if (ret.getObjectiveScore() == null) {
-                ret.setStatus(FinishExamResultEnum.SCORE_CALCULATE);
-            } else {
-                ret.setStatus(FinishExamResultEnum.SCORE_VIEW);
+        	if(InvigilateVerifyEnum.NOW.equals(exam.getInvigilateVerify())) {//实时审核
+        		Integer warningCount=ExamRecordCacheUtil.getWarningCount(recordId);
+        		Integer breachStatus=ExamRecordCacheUtil.getBreachStatus(recordId);
+	            if(warningCount!=null&&warningCount.intValue()>0) {//有预警
+	            	if(breachStatus==null) {//无违纪结果
+		            	ret.setStatus(FinishExamResultEnum.AUDITING);
+	            	}else if(breachStatus.intValue()==0) {//违纪结果是false
+	            		ret.setReviewResult(ReviewResultEnum.PASS);
+		            	if (ret.getObjectiveScore() == null) {
+			                ret.setStatus(FinishExamResultEnum.SCORE_CALCULATE);
+			            } else {
+			                ret.setStatus(FinishExamResultEnum.SCORE_VIEW);
+			            }
+		            }else if(breachStatus.intValue()==1) {//违纪结果是true
+		            	ret.setReviewResult(ReviewResultEnum.UN_PASS);
+		            	ret.setStatus(FinishExamResultEnum.BREACH);
+		            }
+	            }
+        	}else {
+        		if (ret.getObjectiveScore() == null) {
+	                ret.setStatus(FinishExamResultEnum.SCORE_CALCULATE);
+	            } else {
+	                ret.setStatus(FinishExamResultEnum.SCORE_VIEW);
+	            }
             }
-        } else {
+        } else {//非实时出分
             ret.setStatus(FinishExamResultEnum.NORMAL);
         }
-        // TODO
-        ret.setReviewResult("");
         ExamRecordCacheUtil.setFinishTime(recordId, now);
         ExamRecordCacheUtil.setDurationSeconds(recordId, durationSeconds);
         ExamRecordCacheUtil.setFinishType(recordId, FinishTypeEnum.valueOf(type));
@@ -676,8 +681,37 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             ret.setObjectiveScore(ExamRecordCacheUtil.getObjectiveScore(recordId));
         }
 
-        //TODO
-        ret.setReviewResult("");
+      //页面结果
+        ExamCacheBean exam = getExamCacheBean(er.getExamId());
+        if (exam.getShowObjectiveScore() != null && exam.getShowObjectiveScore().intValue() == 1) {//实时出分
+        	if(InvigilateVerifyEnum.NOW.equals(exam.getInvigilateVerify())) {//实时审核
+        		Integer warningCount=ExamRecordCacheUtil.getWarningCount(recordId);
+        		Integer breachStatus=ExamRecordCacheUtil.getBreachStatus(recordId);
+	            if(warningCount!=null&&warningCount.intValue()>0) {//有预警
+	            	if(breachStatus==null) {//无违纪结果
+		            	ret.setStatus(FinishExamResultEnum.AUDITING);
+	            	}else if(breachStatus.intValue()==0) {//违纪结果是false
+	            		ret.setReviewResult(ReviewResultEnum.PASS);
+		            	if (ret.getObjectiveScore() == null) {
+			                ret.setStatus(FinishExamResultEnum.SCORE_CALCULATE);
+			            } else {
+			                ret.setStatus(FinishExamResultEnum.SCORE_VIEW);
+			            }
+		            }else if(breachStatus.intValue()==1) {//违纪结果是true
+		            	ret.setReviewResult(ReviewResultEnum.UN_PASS);
+		            	ret.setStatus(FinishExamResultEnum.BREACH);
+		            }
+	            }
+        	}else {
+        		if (ret.getObjectiveScore() == null) {
+	                ret.setStatus(FinishExamResultEnum.SCORE_CALCULATE);
+	            } else {
+	                ret.setStatus(FinishExamResultEnum.SCORE_VIEW);
+	            }
+            }
+        } else {//非实时出分
+            ret.setStatus(FinishExamResultEnum.NORMAL);
+        }
         return ret;
     }