瀏覽代碼

mobile bug fix

wangliang 4 年之前
父節點
當前提交
9b0b473667

+ 23 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -1,10 +1,14 @@
 package com.qmth.themis.business.constant;
 
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.dto.ExpireTimeDTO;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 import com.qmth.themis.common.contanst.Constants;
+import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.Platform;
 import com.qmth.themis.common.enums.Source;
+import com.qmth.themis.common.exception.BusinessException;
 
 import java.io.File;
 import java.util.*;
@@ -436,4 +440,23 @@ public class SystemConstant {
     public static String setStreamId(String prefix, Long recordId, MonitorVideoSourceEnum monitorVideoSource) {
         return prefix + "_" + recordId + "_" + monitorVideoSource.name().toLowerCase();
     }
+
+    /**
+     * 检查考试状态
+     *
+     * @param recordId
+     */
+    public static void checkExamStatus(Long recordId) {
+        if (Objects.isNull(recordId)) {
+            throw new BusinessException(ExceptionResultEnum.RECORD_ID_IS_NULL);
+        }
+        ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
+        if (Objects.isNull(examRecordStatusEnum)) {
+            throw new BusinessException(ExceptionResultEnum.EXAM_FINISH);
+        }
+        if (!Objects.equals(ExamRecordStatusEnum.FIRST_PREPARE, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.RESUME_PREPARE, examRecordStatusEnum)
+                && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
+            throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_ERROR);
+        }
+    }
 }

+ 3 - 2
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEMobileServiceImpl.java

@@ -86,6 +86,7 @@ public class TEMobileServiceImpl implements TEMobileService {
         if (ExamRecordCacheUtil.getId(ret.getRecordId()) == null) {
             throw new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD);
         }
+        SystemConstant.checkExamStatus(ret.getRecordId());
         ExamStudentCacheBean es = examStudentService
                 .getExamStudentCacheBean(ExamRecordCacheUtil.getExamStudentId(ret.getRecordId()));
         if (es == null) {
@@ -93,7 +94,7 @@ public class TEMobileServiceImpl implements TEMobileService {
         }
         ExamRecordStatusEnum sta = ExamRecordCacheUtil.getStatus(ret.getRecordId());
         if (ExamRecordStatusEnum.FINISHED.equals(sta) || ExamRecordStatusEnum.PERSISTED.equals(sta)) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ALREADY_FINISHED);
+            throw new BusinessException(ExceptionResultEnum.EXAM_FINISH);
         }
         String deviceId = ServletUtil.getRequestDeviceId();
         AuthDto authDto = cacheService.addStudentAuthCache(es.getStudentId());
@@ -195,7 +196,7 @@ public class TEMobileServiceImpl implements TEMobileService {
         }
         ExamRecordStatusEnum sta = ExamRecordCacheUtil.getStatus(recordId);
         if (ExamRecordStatusEnum.FINISHED.equals(sta) || ExamRecordStatusEnum.PERSISTED.equals(sta)) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ALREADY_FINISHED);
+            throw new BusinessException(ExceptionResultEnum.EXAM_FINISH);
         }
         ExamStudentAnswerCacheBean answerCache = (ExamStudentAnswerCacheBean) redisUtil
                 .get(RedisKeyHelper.examAnswerKey(recordId),

+ 0 - 19
themis-business/src/main/java/com/qmth/themis/business/util/WebsocketUtil.java

@@ -50,25 +50,6 @@ public class WebsocketUtil {
         return null;
     }
 
-    /**
-     * 检查考试状态
-     *
-     * @param recordId
-     */
-    public static void checkExamStatus(Long recordId) {
-        if (Objects.isNull(recordId)) {
-            throw new BusinessException(ExceptionResultEnum.RECORD_ID_IS_NULL);
-        }
-        ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
-        if (Objects.isNull(examRecordStatusEnum)) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_NOT_NULL);
-        }
-        if (!Objects.equals(ExamRecordStatusEnum.FIRST_PREPARE, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.RESUME_PREPARE, examRecordStatusEnum)
-                && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_ERROR);
-        }
-    }
-
     /**
      * 更新websocket状态
      *

+ 2 - 2
themis-common/src/main/java/com/qmth/themis/common/enums/ExceptionResultEnum.java

@@ -15,7 +15,7 @@ public enum ExceptionResultEnum {
 
     NOT_FOUND_EXAM_STUDENT(500,500021,"未找到考生"),
 
-    EXAM_ALREADY_FINISHED(500,500022,"该考试已结束"),
+//    EXAM_ALREADY_FINISHED(500,500022,"该考试已结束"),
 
     EXAM_ID_NOT_EQUALY(500,500023,"考试记录的学生Id和当前登录用户不一致"),
 
@@ -25,7 +25,7 @@ public enum ExceptionResultEnum {
 
     STUDENT_NOT_ALLOW_LOGIN(500,500026,"该学生正在考试,不能登录"),
 
-    EXAM_STATUS_NOT_NULL(500,500027,"考试状态不能为空"),
+//    EXAM_STATUS_NOT_NULL(500,500027,"考试状态不能为空"),
 
     EXAM_STATUS_NOT_ALLOW_IP(500,500028,"考生IP不被允许"),
 

+ 3 - 0
themis-exam/src/main/java/com/qmth/themis/exam/api/TEMobileController.java

@@ -80,6 +80,7 @@ public class TEMobileController {
         if (ExamRecordCacheUtil.getId(param.getRecordId()) == null) {
             throw new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD);
         }
+        SystemConstant.checkExamStatus(param.getRecordId());
         ExamRecordStatusEnum sta = ExamRecordCacheUtil.getStatus(param.getRecordId());
 //        if (ExamRecordStatusEnum.FIRST_PREPARE.equals(sta)) {
 //            throw new BusinessException("该考试未开始答题");
@@ -113,6 +114,7 @@ public class TEMobileController {
                              @ApiParam(value = "后缀名", required = true) @RequestParam String suffix,
                              @ApiParam(value = "md5", required = true) @RequestParam String md5) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
+        SystemConstant.checkExamStatus(recordId);
         return ResultUtil.ok(examService.fileUpload(teStudent.getId(), recordId, file, suffix, md5));
     }
 
@@ -133,6 +135,7 @@ public class TEMobileController {
         if (StringUtils.isBlank(param.getUrls())) {
             throw new BusinessException("答案不能为空");
         }
+        SystemConstant.checkExamStatus(param.getRecordId());
         MobileAnswerSubmitReponseBean ret = mobileService.answerSubmit(teStudent.getId(), param.getRecordId(), param.getMainNumber(),
                 param.getSubNumber(), param.getSubIndex(), param.getUrls());
         Map<String, Object> mapParameter = new HashMap<String, Object>();

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

@@ -228,44 +228,41 @@ public class TEStudentController {
         Map<String, Object> map = new HashMap<>();
         //获取未完考试
         if (Objects.isNull(ExamingDataCacheUtil.getUnFinishedRecordId(teStudent.getId()))) {
-            //获取待考列表
-            List<TEExamWaitDto> list = teExamService.getWaitingExam(teStudent.getId(), examId, orgId);
-            if (Objects.nonNull(list) && list.size() > 0) {
-                map.put("waiting", list);
-            }
+            map = this.getWaitList(teStudent.getId(), examId, orgId, map);
         } else {
             Long recordId = ExamingDataCacheUtil.getUnFinishedRecordId(teStudent.getId());
             //获取考试记录缓存
             ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(recordId);
             if (Objects.isNull(status)) {
-                throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_NOT_NULL);
-            }
-            Long ecExamId = ExamRecordCacheUtil.getExamId(recordId);
-            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-            Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
-            ExamCacheBean ec = teExamService.getExamCacheBean(ecExamId);//考试缓存
-            ExamActivityCacheBean examActivityCacheBean = teExamActivityService
-                    .getExamActivityCacheBean(examActivityId);//考试场次缓存
-            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-            //如果断点时间大于整体断点时间,则强制交卷
-            if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING) || Objects
-                    .equals(status, ExamRecordStatusEnum.BREAK_OFF) || Objects
-                    .equals(status, ExamRecordStatusEnum.RESUME_PREPARE)) {
-                //只有ANSWERING状态才生成断点
-                if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING)) {
-                    ExamConstant.sendExamStopMsg(recordId, true, false);
-                    tOeExamRecordService.setExamBreak(recordId);
-                }
-                Boolean finished = tOeExamRecordService.examBreakLogic(recordId, false);
-                if (finished) {
-                    map = this.getWaitList(teStudent.getId(), examId, orgId, map);
+                map = this.getWaitList(teStudent.getId(), examId, orgId, map);
+            } else {
+                Long ecExamId = ExamRecordCacheUtil.getExamId(recordId);
+                Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+                Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
+                ExamCacheBean ec = teExamService.getExamCacheBean(ecExamId);//考试缓存
+                ExamActivityCacheBean examActivityCacheBean = teExamActivityService
+                        .getExamActivityCacheBean(examActivityId);//考试场次缓存
+                ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+                //如果断点时间大于整体断点时间,则强制交卷
+                if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING) || Objects
+                        .equals(status, ExamRecordStatusEnum.BREAK_OFF) || Objects
+                        .equals(status, ExamRecordStatusEnum.RESUME_PREPARE)) {
+                    //只有ANSWERING状态才生成断点
+                    if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING)) {
+                        ExamConstant.sendExamStopMsg(recordId, true, false);
+                        tOeExamRecordService.setExamBreak(recordId);
+                    }
+                    Boolean finished = tOeExamRecordService.examBreakLogic(recordId, false);
+                    if (finished) {
+                        map = this.getWaitList(teStudent.getId(), examId, orgId, map);
+                    } else {
+                        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);
+                    map = this.getWaitList(teStudent.getId(), examId, orgId, map);
                 }
-            } else {
-                map = this.getWaitList(teStudent.getId(), examId, orgId, map);
             }
         }
         //获取全局考试配置
@@ -348,6 +345,7 @@ public class TEStudentController {
      * @return
      */
     private Map<String, Object> getWaitList(Long studentId, Long examId, Long orgId, Map<String, Object> map) {
+        //获取待考列表
         List<TEExamWaitDto> list = teExamService.getWaitingExam(studentId, examId, orgId);
         if (Objects.nonNull(list) && list.size() > 0) {
             map.put("waiting", list);

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketMobileServer.java

@@ -89,7 +89,7 @@ public class WebSocketMobileServer implements Concurrently {
 
         this.redisUtil = SpringContextHolder.getBean(RedisUtil.class);
         TBSession tbSession = AuthUtil.websocketAuthInterceptor(this.platform, this.deviceId, this.authorization, this.time, SystemConstant.GET, this.url);
-        WebsocketUtil.checkExamStatus(this.recordId);
+        SystemConstant.checkExamStatus(this.recordId);
         this.session = session;
         session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
         this.sessionId = tbSession.getId();

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketOeServer.java

@@ -85,7 +85,7 @@ public class WebSocketOeServer implements Concurrently {
         redisUtil = SpringContextHolder.getBean(RedisUtil.class);
 
         TBSession tbSession = AuthUtil.websocketAuthInterceptor(this.platform, this.deviceId, this.authorization, this.time, SystemConstant.GET, this.url);
-        WebsocketUtil.checkExamStatus(this.recordId);
+        SystemConstant.checkExamStatus(this.recordId);
         this.session = session;
         session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
         this.sessionId = tbSession.getId();