wangliang 4 years ago
parent
commit
95f2371132

+ 51 - 31
themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java

@@ -14,6 +14,7 @@ import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
+import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
 import com.qmth.themis.business.dto.response.TEExamActivityDto;
 import com.qmth.themis.business.dto.response.TEExamDto;
@@ -37,10 +38,6 @@ import com.qmth.themis.common.signature.SignatureType;
 import com.qmth.themis.common.util.AesUtil;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
-import com.qmth.themis.business.dto.MqDto;
-import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
-import com.qmth.themis.business.service.MqDtoService;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -199,6 +196,10 @@ public class TEStudentController {
             Long recordId = teStudentCacheDto.getUnFinishedRecordId();
             //获取考试记录缓存
             Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
+            String status = String.valueOf(objectMap.get("status"));
+            if (Objects.isNull(status)) {
+                throw new BusinessException("考试状态不能为空");
+            }
             Long examIdMap = Long.parseLong(String.valueOf(objectMap.get("examId")));
             Long examStudentId = Long.parseLong(String.valueOf(objectMap.get("examStudentId")));
             Long examActivityId = Long.parseLong(String.valueOf(objectMap.get("examActivityId")));
@@ -217,40 +218,40 @@ public class TEStudentController {
             //获取剩余断点次数
             Integer leftBreakResumeCount = Objects.isNull(ExamRecordCacheUtil.getLeftBreakResumeCount(recordId)) ? 0 : ExamRecordCacheUtil.getLeftBreakResumeCount(recordId);
             //如果断点时间大于整体断点时间,则强制交卷
-            if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime() / 1000) > ec.getBreakExpireSeconds()) {
-                teExamService.finish(teStudentCacheDto.getId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
-                List<TEExamDto> list = teExamService.getWaitingExam(teStudent.getId(), examId, orgId);
-                if (Objects.nonNull(list) && list.size() > 0) {
-                    map.put("waiting", list);
-                }
-            } else {//否则断点次数减1
-                leftBreakResumeCount--;
-                leftBreakResumeCount = leftBreakResumeCount <= 0 ? 0 : leftBreakResumeCount;
-                //如果断点次数为0,也强制交卷
-                if (leftBreakResumeCount <= 0) {
+            if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING.name())) {
+                if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime() / 1000) > ec.getBreakExpireSeconds()) {
                     teExamService.finish(teStudentCacheDto.getId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
                     List<TEExamDto> list = teExamService.getWaitingExam(teStudent.getId(), examId, orgId);
                     if (Objects.nonNull(list) && list.size() > 0) {
                         map.put("waiting", list);
                     }
-                } else {
-                    //更新考试记录
-                    objectMap.put("status", ExamRecordStatusEnum.RESUME_PREPARE.name());
-                    objectMap.put("lastBreakTime", new Date());
-                    objectMap.put("leftBreakResumeCount", leftBreakResumeCount);
-                    objectMap.put("lastStartTime", new Date());
+                } else {//否则断点次数减1
+                    leftBreakResumeCount--;
+                    leftBreakResumeCount = leftBreakResumeCount <= 0 ? 0 : leftBreakResumeCount;
+                    //如果断点次数为0,也强制交卷
+                    if (leftBreakResumeCount <= 0) {
+                        teExamService.finish(teStudentCacheDto.getId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+                        List<TEExamDto> list = teExamService.getWaitingExam(teStudent.getId(), examId, orgId);
+                        if (Objects.nonNull(list) && list.size() > 0) {
+                            map.put("waiting", list);
+                        }
+                    } else {
+                        //更新考试记录
+                        objectMap.put("status", ExamRecordStatusEnum.RESUME_PREPARE.name());
+                        objectMap.put("lastBreakTime", new Date());
+                        objectMap.put("leftBreakResumeCount", leftBreakResumeCount);
+                        objectMap.put("lastStartTime", new Date());
 
-                    //发送mq,增加断点次数记录
-                    MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.examBreakHistory.name(), JacksonUtil.parseJson(objectMap), MqEnum.EXAM_BREAK, String.valueOf(recordId), "增加断点记录");
-                    mqDtoService.assembleSendOneWayMsg(mqDto);
-                    ExamCourseCacheBean examCourseCacheBean = teExamCourseService.getExamCourseCacheBean(ec.getId(), examStudentCacheBean.getCourseCode());
-                    TEExamActivityDto teExamActivityDto = new TEExamActivityDto(ec, examActivityCacheBean, examStudentCacheBean, examStudentId, examCourseCacheBean);
-                    Gson gson = new Gson();
-                    ExamActivityUnFinishBean examActivityUnFinishBean = gson.fromJson(gson.toJson(teExamActivityDto), ExamActivityUnFinishBean.class);
-                    examActivityUnFinishBean.setRecordId(recordId);
-                    ExamUnFinishBean examUnFinishBean = new ExamUnFinishBean(ec.getId(), ec.getName(), ec.getPreNotice(), ec.getPreNoticeStaySeconds(), ec.getPostNotice(), examActivityUnFinishBean);
-                    map.put("unFinished", examUnFinishBean);
+                        //发送mq,增加断点次数记录
+                        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.examBreakHistory.name(), JacksonUtil.parseJson(objectMap), MqEnum.EXAM_BREAK, String.valueOf(recordId), "增加断点记录");
+                        mqDtoService.assembleSendOneWayMsg(mqDto);
+                        ExamUnFinishBean examUnFinishBean = this.unFinishCommon(recordId, ec, examStudentCacheBean, examActivityCacheBean, examStudentId);
+                        map.put("unFinished", examUnFinishBean);
+                    }
                 }
+            } else {
+                ExamUnFinishBean examUnFinishBean = this.unFinishCommon(recordId, ec, examStudentCacheBean, examActivityCacheBean, examStudentId);
+                map.put("unFinished", examUnFinishBean);
             }
         }
         //获取全局考试配置
@@ -292,4 +293,23 @@ public class TEStudentController {
         //mq发送消息end
         return ResultUtil.ok(JacksonUtil.parseJson(SystemConstant.SUCCESS));
     }
+
+    /**
+     * 未完成公用
+     *
+     * @param recordId
+     * @param ec
+     * @param examStudentCacheBean
+     * @param examActivityCacheBean
+     * @param examStudentId
+     * @return
+     */
+    public ExamUnFinishBean unFinishCommon(Long recordId, ExamCacheBean ec, ExamStudentCacheBean examStudentCacheBean, ExamActivityCacheBean examActivityCacheBean, Long examStudentId) {
+        ExamCourseCacheBean examCourseCacheBean = teExamCourseService.getExamCourseCacheBean(ec.getId(), examStudentCacheBean.getCourseCode());
+        TEExamActivityDto teExamActivityDto = new TEExamActivityDto(ec, examActivityCacheBean, examStudentCacheBean, examStudentId, examCourseCacheBean);
+        Gson gson = new Gson();
+        ExamActivityUnFinishBean examActivityUnFinishBean = gson.fromJson(gson.toJson(teExamActivityDto), ExamActivityUnFinishBean.class);
+        examActivityUnFinishBean.setRecordId(recordId);
+        return new ExamUnFinishBean(ec.getId(), ec.getName(), ec.getPreNotice(), ec.getPreNoticeStaySeconds(), ec.getPostNotice(), examActivityUnFinishBean);
+    }
 }