Browse Source

更新考试缓存

wangliang 4 years ago
parent
commit
0278a60ae8

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

@@ -4,6 +4,8 @@ import com.qmth.themis.business.bean.status.ClientWebsocketStatusBean;
 import com.qmth.themis.business.bean.status.ExamStatusBean;
 import com.qmth.themis.business.bean.status.MonitorCallStatusBean;
 import com.qmth.themis.business.bean.status.MonitorStatusBean;
+import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.*;
@@ -580,4 +582,27 @@ public class ExamRecordCacheUtil {
     public static Integer getInProcessFaceVerifyStatus(Long recordId) {
         return (Integer) redisUtil.get(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_face_verify_status.getCode());
     }
+
+    /**
+     * 更新考试记录缓存
+     *
+     * @param recordId
+     * @param examCache
+     * @param ac
+     */
+    public static void updateExamRecordCache(Long recordId, ExamCacheBean examCache, ExamActivityCacheBean ac) {
+        ExamRecordCacheUtil.setStartTime(recordId, ac.getStartTime());
+        ExamRecordCacheUtil.setEndTime(recordId, ac.getFinishTime());
+        ExamRecordCacheUtil.setOpeningSeconds(recordId, ac.getOpeningSeconds());
+        ExamRecordCacheUtil.setMinDurationSeconds(recordId, examCache.getMinDurationSeconds());
+        ExamRecordCacheUtil.setMaxDurationSeconds(recordId, ac.getMaxDurationSeconds());
+        ExamRecordCacheUtil.setForceFinish(recordId, examCache.getForceFinish());
+        ExamRecordCacheUtil.setCameraPhotoUpload(recordId, examCache.getCameraPhotoUpload());
+        ExamRecordCacheUtil.setMobilePhotoUpload(recordId, examCache.getMobilePhotoUpload());
+        ExamRecordCacheUtil.setEntryAuthenticationPolicy(recordId, examCache.getEntryAuthenticationPolicy().name());
+        ExamRecordCacheUtil.setInProcessRealnessVerifyStatus(recordId, examCache.getInProcessRealnessVerify());
+        ExamRecordCacheUtil.setInProcessFaceStrangerIgnore(recordId, examCache.getInProcessFaceStrangerIgnore());
+        ExamRecordCacheUtil.setInProcessLivenessJudgePolicy(recordId, examCache.getInProcessLivenessJudgePolicy().name());
+        ExamRecordCacheUtil.setInProcessLivenessFixedRange(recordId, examCache.getInProcessLivenessFixedRange());
+    }
 }

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

@@ -1,38 +1,5 @@
 package com.qmth.themis.business.service.impl;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Random;
-import java.util.Set;
-import java.util.UUID;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.BeanUtils;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.CachePut;
-import org.springframework.cache.annotation.Cacheable;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.common.utils.BinaryUtil;
@@ -40,29 +7,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.themis.business.bean.admin.OpenExamBean;
-import com.qmth.themis.business.bean.exam.AnswerSubmitBean;
-import com.qmth.themis.business.bean.exam.AudioLeftPlayCountSubmitBean;
-import com.qmth.themis.business.bean.exam.ExamFileUploadBean;
-import com.qmth.themis.business.bean.exam.ExamFinishBean;
-import com.qmth.themis.business.bean.exam.ExamPaperDownloadBean;
-import com.qmth.themis.business.bean.exam.ExamPrepareBean;
-import com.qmth.themis.business.bean.exam.ExamResultBean;
-import com.qmth.themis.business.bean.exam.ExamResumeBean;
-import com.qmth.themis.business.bean.exam.ExamStartBean;
-import com.qmth.themis.business.bean.exam.StudentPaperStructBean;
-import com.qmth.themis.business.cache.ExamActivityRecordCacheUtil;
-import com.qmth.themis.business.cache.ExamBreakCacheUtil;
-import com.qmth.themis.business.cache.ExamRecordCacheUtil;
-import com.qmth.themis.business.cache.ExamingDataCacheUtil;
-import com.qmth.themis.business.cache.RedisKeyHelper;
-import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
-import com.qmth.themis.business.cache.bean.ExamCacheBean;
-import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
-import com.qmth.themis.business.cache.bean.ExamPaperCacheBean;
-import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
-import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
-import com.qmth.themis.business.cache.bean.ExamStudentPaperStructCacheBean;
-import com.qmth.themis.business.cache.bean.ObjectiveAnswerCacheBean;
+import com.qmth.themis.business.bean.exam.*;
+import com.qmth.themis.business.cache.*;
+import com.qmth.themis.business.cache.bean.*;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dao.TEExamMapper;
@@ -76,41 +23,32 @@ import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.entity.TBTaskHistory;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TOeExamRecord;
-import com.qmth.themis.business.enums.ExamModeEnum;
-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.InvigilateMonitorStatusEnum;
-import com.qmth.themis.business.enums.InvigilateVerifyEnum;
-import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
-import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
-import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.ObjectiveScorePolicyEnum;
-import com.qmth.themis.business.enums.ReviewResultEnum;
-import com.qmth.themis.business.enums.ScoreStatusEnum;
-import com.qmth.themis.business.enums.SystemOperationEnum;
-import com.qmth.themis.business.enums.TaskStatusEnum;
-import com.qmth.themis.business.enums.WebsocketStatusEnum;
-import com.qmth.themis.business.service.MqDtoService;
-import com.qmth.themis.business.service.TBTaskHistoryService;
-import com.qmth.themis.business.service.TEExamActivityService;
-import com.qmth.themis.business.service.TEExamCourseService;
-import com.qmth.themis.business.service.TEExamPaperService;
-import com.qmth.themis.business.service.TEExamService;
-import com.qmth.themis.business.service.TEExamStudentService;
-import com.qmth.themis.business.service.TGErrorService;
-import com.qmth.themis.business.service.TOeExamBreakHistoryService;
-import com.qmth.themis.business.service.TOeExamRecordService;
-import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.business.util.MqUtil;
-import com.qmth.themis.business.util.OssUtil;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.business.util.TencentYunUtil;
+import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.service.*;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.HexUtils;
 import com.qmth.themis.common.util.IpUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 考试批次 服务实现类
@@ -184,7 +122,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      * @return
      */
     @SuppressWarnings("rawtypes")
-	@Override
+    @Override
     public IPage<TEExamQueryDto> examQuery(IPage<Map> iPage, Long userId, Long id, String code, String name,
                                            String mode, Integer enable, Long orgId, String type) {
         return teExamMapper.examQuery(iPage, userId, id, code, name, mode, enable, orgId, type);
@@ -294,7 +232,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                         , ep.getAudioPlayCount(), ExamRecordCacheUtil.getMonitorKey(recordId), monitorUserId
                         , tencentYunUtil.getSign(monitorUserId, SystemConstant.TENCENT_EXPIRE_TIME)
                         , tencentYunUtil.getTencentYunDomain().getAppId());
-
+                ExamRecordCacheUtil.updateExamRecordCache(recordId, examCache, ac);
                 TEExamActivityDto teExamActivityDto = new TEExamActivityDto(examCache, ac, examStudentCacheBean,
                         examStudentId, ec, recordId);
                 prepare.setTeExamActivityDto(teExamActivityDto);
@@ -681,7 +619,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 ExamRecordCacheUtil.getHasAnswerFile(recordId) :
                 0;
         if (hasAnswerFile.intValue() == 1) {
-        	calculateObjectiveScore(answerCache, recordId);
+            calculateObjectiveScore(answerCache, recordId);
         }
         // 更新考生作答
         redisUtil.set(RedisKeyHelper.examAnswerKey(recordId),
@@ -692,12 +630,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 
         return ret;
     }
-    
-    private void calculateObjectiveScore(ExamStudentAnswerCacheBean answer,Long recordId) {
-    	if(answer.getObjective()==null||!answer.getObjective()) {
-    		return;
-    	}
-    	answer.setScore(0.0);
+
+    private void calculateObjectiveScore(ExamStudentAnswerCacheBean answer, Long recordId) {
+        if (answer.getObjective() == null || !answer.getObjective()) {
+            return;
+        }
+        answer.setScore(0.0);
         Integer mainNumber = answer.getMainNumber();
         Integer subNumber = answer.getSubNumber();
         Integer subIndex = answer.getSubIndex();
@@ -707,12 +645,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         //整卷客观题标答缓存集合
         Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(paperId);
         if (map == null || map.size() == 0) {
-        	throw new BusinessException(ExceptionResultEnum.NOT_FOUND_PAPER_OBJECTIVE_ANSWER);
+            throw new BusinessException(ExceptionResultEnum.NOT_FOUND_PAPER_OBJECTIVE_ANSWER);
         }
         //客观题标答缓存
         ObjectiveAnswerCacheBean cb = map.get(key);
         if (cb == null) {
-        	throw new BusinessException(ExceptionResultEnum.NOT_FOUND_QUESTION_OBJECTIVE_ANSWER);
+            throw new BusinessException(ExceptionResultEnum.NOT_FOUND_QUESTION_OBJECTIVE_ANSWER);
         }
 
         if (cb.getStructType().intValue() == 1) {
@@ -756,6 +694,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             }
         }
     }
+
     private boolean checkSingleChoice(String answerArray, JSONArray ar) {
         JSONArray an = JSONArray.parseArray(answerArray);
         if (an.size() == 0) {
@@ -799,6 +738,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         }
         return -1;
     }
+
     private boolean checkIsObjective(Long paperId, Integer mainNumber, Integer subNumber, Integer subIndex) {
         Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(paperId);
         if (map == null || map.size() == 0) {
@@ -1074,17 +1014,17 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             redisUtil.releaseLock(lockKey);
         }
     }
-    
+
     @SuppressWarnings("unchecked")
-	private Double calculateTotalObjectiveScore(Long recordId) {
-    	Double total = 0.0;
-    	Map<String, ExamStudentAnswerCacheBean> as = redisUtil.getHashEntries(RedisKeyHelper.examAnswerKey(recordId));
+    private Double calculateTotalObjectiveScore(Long recordId) {
+        Double total = 0.0;
+        Map<String, ExamStudentAnswerCacheBean> as = redisUtil.getHashEntries(RedisKeyHelper.examAnswerKey(recordId));
         if (as != null && as.size() > 0) {
             for (ExamStudentAnswerCacheBean sa : as.values()) {
                 if (sa.getObjective() != null && sa.getObjective()) {//是客观题
                     if (sa.getScore() != null) {//有分值
                         total = total + sa.getScore();
-                    } 
+                    }
                 }
             }
         }
@@ -1093,11 +1033,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
     }
 
     private ExamFinishBean diposeFinish(Long studentId, Long recordId, String type, Integer durationSeconds) {
-    	Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+        Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
         // 校验当前登录用户和参数一致性
-    	if(examStudentId==null) {
-    		throw new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD);
-    	}
+        if (examStudentId == null) {
+            throw new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD);
+        }
         ExamStudentCacheBean es = (ExamStudentCacheBean) redisUtil
                 .get(RedisKeyHelper.examStudentCacheKey(examStudentId));
         if (es == null) {
@@ -1106,12 +1046,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         if (!studentId.equals(es.getStudentId())) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_NOT_EQUALY);
         }
-        
+
         Date now = new Date();
         ExamFinishBean ret = new ExamFinishBean();
         ret.setFinishTime(now.getTime());
         ret.setObjectiveScore(calculateTotalObjectiveScore(recordId));
-        
+
         if (ExamRecordCacheUtil.getId(recordId) == null || examStudentId == null) {
             ret.setStatus(FinishExamResultEnum.NORMAL);
             return ret;
@@ -1376,7 +1316,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      * @return
      */
     @SuppressWarnings("rawtypes")
-	@Override
+    @Override
     public List<Map> examList(Long userId, Long orgId) {
         return teExamMapper.examList(userId, orgId);
     }