ソースを参照

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

wangliang 4 年 前
コミット
2a679af21c

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

@@ -196,12 +196,15 @@ public class TEExamStudentController {
                 QueryWrapper<TEStudent> teExamStudentQueryWrapper = new QueryWrapper<>();
                 teExamStudentQueryWrapper.lambda().eq(TEStudent::getName, s.getName())
                         .eq(TEStudent::getIdentity, s.getIdentity()).eq(TEStudent::getOrgId, tbOrg.getId());
-                int count = teStudentService.count(teExamStudentQueryWrapper);
-                if (count == 0) {
+                TEStudent student = teStudentService.getOne(teExamStudentQueryWrapper);
+                if (student == null) {
                     TEStudent teStudent = new TEStudent(tbOrg.getId(), s.getIdentity(), s.getName(), tbUser.getId());
                     teStudentService.save(teStudent);
                     s.setStudentId(teStudent.getId());
                     s.setCreateId(tbUser.getId());
+                }else {
+                	s.setStudentId(student.getId());
+                    s.setCreateId(tbUser.getId());
                 }
             } else {
                 UpdateWrapper<TEExamStudent> teExamStudentUpdateWrapper = new UpdateWrapper<>();
@@ -230,6 +233,9 @@ public class TEExamStudentController {
                 }
                 s.setRoomName(roomCodeQueryDtoMap.get(s.getRoomCode()).getRoomName());
             }
+            if(s.getAlreadyExamCount()==null) {
+            	s.setAlreadyExamCount(0);
+            }
             teExamStudentService.saveOrUpdate(s);
         });
         for(TEExamStudent es:teExamStudentList){

+ 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());

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

@@ -198,7 +198,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 map.put(v.getExamId(), teExamActivityDtos);
                 ExamCacheBean examCache = getExamCacheBeanNative(v.getExamId());
                 ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(v.getExamStudentId());
-                v.setLeftExamCount(examCache.getExamCount() - examStudentCacheBean.getAlreadyExamCount());
+                v.setLeftExamCount(examCache.getExamCount() - (examStudentCacheBean.getAlreadyExamCount()==null?0:examStudentCacheBean.getAlreadyExamCount()));
                 if (Objects.nonNull(v.getInProcessLivenessFixedRangeStr())) {
                     String[] longs = v.getInProcessLivenessFixedRangeStr().trim().replaceAll(" ", "").split(",");
                     List inProcessLivenessFixedRange = new ArrayList();
@@ -347,18 +347,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);

+ 17 - 2
themis-business/src/main/java/com/qmth/themis/business/templete/service/impl/TempleteLogicServiceImpl.java

@@ -177,6 +177,9 @@ public class TempleteLogicServiceImpl implements TempleteLogicService {
                     if (Objects.nonNull(examCourseCacheBean)) {
                         teExamStudent.setCourseName(examCourseCacheBean.getCourseName());
                     }
+                    if(teExamStudent.getAlreadyExamCount()==null) {
+                    	teExamStudent.setAlreadyExamCount(0);
+                    }
                     teExamStudentService.saveOrUpdate(teExamStudent);
                     roomCodeAndNameSet.add(examId + ":" + teExamStudent.getRoomCode() + ":" + teExamStudent.getRoomName());
                     teExamStudentList.add(teExamStudent);
@@ -310,12 +313,24 @@ public class TempleteLogicServiceImpl implements TempleteLogicService {
             tbExamInvigilateUserQueryWrapper.lambda().eq(TBExamInvigilateUser::getOrgId, orgId)
                     .eq(TBExamInvigilateUser::getUserId, tbUser.getId())
                     .eq(TBExamInvigilateUser::getRoomCode, roomCode)
+                    .eq(TBExamInvigilateUser::getExamId, examId)
                     .eq(TBExamInvigilateUser::getRoomName, roomName);
             TBExamInvigilateUser tbExamInvigilateUser = tbExamInvigilateUserService.getOne(tbExamInvigilateUserQueryWrapper);
             if (Objects.isNull(tbExamInvigilateUser)) {//新增考场
-                tbExamInvigilateUser = new TBExamInvigilateUser(examId,orgId, tbUser.getId(), roomCode, roomName);
+            	 QueryWrapper<TBExamInvigilateUser> wrapper = new QueryWrapper<>();
+            	 wrapper.lambda().eq(TBExamInvigilateUser::getOrgId, orgId)
+                         .isNull(TBExamInvigilateUser::getUserId)
+                         .eq(TBExamInvigilateUser::getRoomCode, roomCode)
+                         .eq(TBExamInvigilateUser::getExamId, examId)
+                         .eq(TBExamInvigilateUser::getRoomName, roomName);
+                tbExamInvigilateUser = tbExamInvigilateUserService.getOne(wrapper);
+                if(tbExamInvigilateUser==null) {
+                	tbExamInvigilateUser = new TBExamInvigilateUser(examId,orgId, tbUser.getId(), roomCode, roomName);
+                }else {
+                	tbExamInvigilateUser.setUserId(tbUser.getId());
+                }
+                tbExamInvigilateUserService.saveOrUpdate(tbExamInvigilateUser);
             }
-            tbExamInvigilateUserService.saveOrUpdate(tbExamInvigilateUser);
         }
     }
 

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

@@ -309,7 +309,7 @@ CREATE TABLE `t_b_exam_invigilate_user` (
   `monitor_status` varchar(30) DEFAULT NULL COMMENT '监考状态,NOT_START:未开始,START:监考中,FINISHED:已结束',
   `exam_id` bigint DEFAULT NULL COMMENT '考试批次id',
   PRIMARY KEY (`id`),
-  UNIQUE KEY `t_b_exam_invigilate_user_orgId_userId_roomCode_Idx` (`org_id`,`user_id`,`room_code`)
+  UNIQUE KEY `t_b_exam_invigilate_user_orgId_userId_roomCode_Idx` (`org_id`,`user_id`,`room_code`,`exam_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='监考员设置';
 
 -- ----------------------------