Prechádzať zdrojové kódy

答案未上传可考试

xiatian 4 rokov pred
rodič
commit
ece9d13844

+ 3 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamPaperServiceImpl.java

@@ -137,6 +137,9 @@ public class TEExamPaperServiceImpl extends ServiceImpl<TEExamPaperMapper, TEExa
         if (ep == null) {
             return ret;
         }
+        if(StringUtils.isBlank(ep.getAnswerPath())) {//没有答案文件
+        	return ret;
+        }
         ret = new HashMap<String, ObjectiveAnswerCacheBean>();
         String structUrl = OssUtil.getUrlForPrivateBucket(systemConfig.getOssEnv(3), ep.getStructPath());
         String answerUrl = OssUtil.getUrlForPrivateBucket(systemConfig.getOssEnv(3), ep.getAnswerPath());

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

@@ -342,18 +342,18 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         if (ec.getPaperIds() == null) {
             throw new BusinessException("考试科目未绑定试卷");
         }
-        if (ec.getHasAnswer() == null || ec.getHasAnswer().intValue() == 0) {
-            throw new BusinessException("考试科目答案未补全");
-        }
+//        if (ec.getHasAnswer() == null || ec.getHasAnswer().intValue() == 0) {
+//            throw new BusinessException("考试科目答案未补全");
+//        }
         // 根据权重选中试卷
         Long paperId = ec.getPaperIds().get(getPaperByWeight(ec.getPaperWeight()));
         ExamPaperCacheBean ep = teExamPaperService.getExamPaperCacheBean(paperId);
         if (ep == null) {
             throw new BusinessException("未找到试卷:" + paperId);
         }
-        if (StringUtils.isBlank(ep.getAnswerPath())) {
-            throw new BusinessException("试卷答案未上传:" + paperId);
-        }
+//        if (StringUtils.isBlank(ep.getAnswerPath())) {
+//            throw new BusinessException("试卷答案未上传:" + paperId);
+//        }
 
         // 写入次数
         Integer alreadyExamCount = es.getAlreadyExamCount() + 1;

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

@@ -158,23 +158,43 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         Integer subNumber = (Integer) param.get("subNumber");
         Integer subIndex = (Integer) param.get("subIndex");
         Long paperId = ExamRecordCacheUtil.getPaperId(recordId);
+        String key = RedisKeyHelper.examAnswerHashKey(mainNumber, subNumber, subIndex);
+        
+        //考生作答缓存
+        ExamStudentAnswerCacheBean answer = (ExamStudentAnswerCacheBean) redisUtil.get(
+                RedisKeyHelper.examAnswerKey(recordId),key);
+        if (answer == null) {
+            log.error("no ExamStudentAnswerCacheBean for calculateObjectiveScore key:"+key);
+
+            // 计算客观分总分
+            calculateTotalObjectiveScore(recordId);
+            return;
+        }
+        //整卷客观题标答缓存集合
         Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(paperId);
         if (map == null || map.size() == 0) {
-            log.error("no ObjectiveAnswerCacheBean for calculateObjectiveScore");
+            log.debug("no ObjectiveAnswerCacheBean map for calculateObjectiveScore paperId:"+paperId);
+            // 更新分数
+            answer.setScore(0.0);
+            redisUtil.set(RedisKeyHelper.examAnswerKey(recordId), key, answer);
+
+            // 计算客观分总分
+            calculateTotalObjectiveScore(recordId);
             return;
         }
-        String key = RedisKeyHelper.examAnswerHashKey(mainNumber, subNumber, subIndex);
+        //客观题标答缓存
         ObjectiveAnswerCacheBean cb = map.get(key);
         if (cb == null) {
+        	log.debug("no ObjectiveAnswerCacheBean for calculateObjectiveScore key:"+key);
+        	// 更新分数
+            answer.setScore(0.0);
+            redisUtil.set(RedisKeyHelper.examAnswerKey(recordId), key, answer);
+
+            // 计算客观分总分
+            calculateTotalObjectiveScore(recordId);
             return;
         }
-        ExamStudentAnswerCacheBean answer = (ExamStudentAnswerCacheBean) redisUtil.get(
-                RedisKeyHelper.examAnswerKey(recordId),
-                RedisKeyHelper.examAnswerHashKey(mainNumber, subNumber, subIndex));
-        if (answer == null) {
-            log.error("no ExamStudentAnswerCacheBean for calculateObjectiveScore");
-            return;
-        }
+
 
         if (cb.getStructType().intValue() == 1) {
             if (checkSingleChoice(answer.getAnswer(), cb.getChoiceAnswer())) {
@@ -217,15 +237,14 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             answer.setScore(0.0);
         }
         // 更新分数
-        redisUtil.set(RedisKeyHelper.examAnswerKey(recordId),
-                RedisKeyHelper.examAnswerHashKey(mainNumber, subNumber, subIndex), answer);
+        redisUtil.set(RedisKeyHelper.examAnswerKey(recordId), key, answer);
 
         // 计算客观分总分
-        calculateTotalObjectiveScore(recordId, map);
+        calculateTotalObjectiveScore(recordId);
     }
 
     @SuppressWarnings("unchecked")
-    private void calculateTotalObjectiveScore(Long recordId, Map<String, ObjectiveAnswerCacheBean> map) {
+    private void calculateTotalObjectiveScore(Long recordId) {
         String lockKey = SystemConstant.REDIS_LOCK_TOTAL_OBJECTIVE_SCORE_PREFIX + recordId;
         try {
             Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);