Bladeren bron

新增候考阶段且没有进入考试则不交卷

wangliang 3 jaren geleden
bovenliggende
commit
29c000e870
37 gewijzigde bestanden met toevoegingen van 262 en 172 verwijderingen
  1. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBClientVersionController.java
  2. 3 3
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBExamInvigilateUserController.java
  3. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBOrgController.java
  4. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBUserController.java
  5. 2 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java
  6. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamCourseController.java
  7. 2 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamPaperController.java
  8. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamReexamController.java
  9. 15 16
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamStudentController.java
  10. 2 1
      themis-admin/src/main/java/com/qmth/themis/admin/aspect/ApiControllerAspect.java
  11. 1 1
      themis-admin/src/main/java/com/qmth/themis/admin/websocket/WebSocketAdminServer.java
  12. 2 1
      themis-business/src/main/java/com/qmth/themis/business/config/MapApiReader.java
  13. 18 0
      themis-business/src/main/java/com/qmth/themis/business/service/CommonService.java
  14. 2 2
      themis-business/src/main/java/com/qmth/themis/business/service/impl/CacheServiceImpl.java
  15. 64 28
      themis-business/src/main/java/com/qmth/themis/business/service/impl/CommonServiceImpl.java
  16. 7 7
      themis-business/src/main/java/com/qmth/themis/business/service/impl/MqDtoServiceImpl.java
  17. 2 2
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TBAttachmentServiceImpl.java
  18. 1 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java
  19. 0 8
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java
  20. 2 2
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java
  21. 1 1
      themis-business/src/main/java/com/qmth/themis/business/templete/TaskExportCommon.java
  22. 1 1
      themis-business/src/main/java/com/qmth/themis/business/templete/TaskImportCommon.java
  23. 1 1
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java
  24. 3 2
      themis-business/src/main/java/com/qmth/themis/business/util/JacksonUtil.java
  25. 5 6
      themis-common/src/main/java/com/qmth/themis/common/util/AesUtil.java
  26. 25 22
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEExamController.java
  27. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java
  28. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java
  29. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketMobileServer.java
  30. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketOeServer.java
  31. 1 1
      themis-mq/src/main/java/com/qmth/themis/mq/listener/RocketMessageConsumer.java
  32. 2 2
      themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java
  33. 6 0
      themis-task/src/main/java/com/qmth/themis/task/quartz/ExamActivityJob.java
  34. 6 0
      themis-task/src/main/java/com/qmth/themis/task/quartz/ExamStudentJob.java
  35. 20 13
      themis-task/src/main/java/com/qmth/themis/task/quartz/MqActivityJob.java
  36. 49 29
      themis-task/src/main/java/com/qmth/themis/task/quartz/service/impl/QuartzLogicServiceImpl.java
  37. 10 9
      themis-task/src/main/java/com/qmth/themis/task/service/impl/QuartzServiceImpl.java

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBClientVersionController.java

@@ -73,7 +73,7 @@ public class TBClientVersionController {
                     .saveAttachment(file, ServletUtil.getRequestMd5(), ServletUtil.getRequestPath(), mapParameter,
                             UploadFileEnum.client, tbUser.getOrgId(), tbUser.getId());
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(tbAttachment)) {
                 tbAttachmentService.deleteAttachment(mapParameter, UploadFileEnum.client, tbAttachment);
             }

+ 3 - 3
themis-admin/src/main/java/com/qmth/themis/admin/api/TBExamInvigilateUserController.java

@@ -135,7 +135,7 @@ public class TBExamInvigilateUserController {
             }
             tbExamInvigilateUserService.saveBatch(tbExamInvigilateUserList);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
                 String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length())
@@ -193,7 +193,7 @@ public class TBExamInvigilateUserController {
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(tbAttachment)) {
                 tbAttachmentService.deleteAttachment(mapParameter, UploadFileEnum.file, tbAttachment);
             }
@@ -239,7 +239,7 @@ public class TBExamInvigilateUserController {
                 return ResultUtil.ok(true);
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof BusinessException) {
                 throw new BusinessException(e.getMessage());
             } else {

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBOrgController.java

@@ -94,7 +94,7 @@ public class TBOrgController {
             cacheService.updateOrgCache(tbOrg.getId());
             cacheService.updateOrgCodeCache(tbOrg.getCode());
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
                 String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length())

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TBUserController.java

@@ -672,7 +672,7 @@ public class TBUserController {
                 cacheService.updateAccountCache(tbUser.getId());
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
                 String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length())

+ 2 - 2
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -232,7 +232,7 @@ public class TEExamController {
                 }
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(teExam) && Objects.nonNull(teExam.getId()) && Objects.nonNull(activityCode)) {
                 redisUtil.setRedisActivityCodeSequence(teExam.getId(), Integer.parseInt(activityCode) - 1);
             }
@@ -392,7 +392,7 @@ public class TEExamController {
                 }
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(examId) && Objects.nonNull(teExam.getId()) && (Objects.nonNull(teExamActivityList)
                     && teExamActivityList.size() > 0 && Objects.nonNull(teExamActivityList.get(0)))) {
                 redisUtil.setRedisActivityCodeSequence(examId,

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamCourseController.java

@@ -59,7 +59,7 @@ public class TEExamCourseController {
                     .eq(TEExamCourse::getExamId, teExamCourse.getExamId()).eq(TEExamCourse::getCourseCode, teExamCourse.getCourseCode());
             teExamCourseService.update(teExamCourseUpdateWrapper);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
                 String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");

+ 2 - 2
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamPaperController.java

@@ -95,7 +95,7 @@ public class TEExamPaperController {
                 teExamPaperService.saveOrUpdate(s);
             });
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
                 String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length())
@@ -175,7 +175,7 @@ public class TEExamPaperController {
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(tbAttachment)) {
                 tbAttachmentService.deleteAttachment(mapParameter, UploadFileEnum.file, tbAttachment);
             }

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamReexamController.java

@@ -227,7 +227,7 @@ public class TEExamReexamController {
                 teExamReexamService.updateBatchById(teExamReexamUpdateList);
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof BusinessException) {
                 throw new BusinessException(e.getMessage());
             } else {

+ 15 - 16
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamStudentController.java

@@ -13,7 +13,6 @@ import com.qmth.themis.business.cache.bean.ExamRecordPaperViewBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.response.MarkResultDto;
-import com.qmth.themis.business.dto.response.RoomCodeQueryDto;
 import com.qmth.themis.business.dto.response.TEExamStudentDto;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
@@ -272,18 +271,18 @@ public class TEExamStudentController {
                 throw new BusinessException("考试科目不存在");
             }
             s.setCourseName(examCourseCacheBean.getCourseName());
-            List<RoomCodeQueryDto> roomCodeQueryDtoList = teExamStudentService.examRoomQuery(null);
-            if (Objects.nonNull(roomCodeQueryDtoList)) {
-                Map<String, RoomCodeQueryDto> roomCodeQueryDtoMap = roomCodeQueryDtoList.stream().collect(
-                        Collectors.toMap(RoomCodeQueryDto::getRoomCode, Function.identity(), (dto1, dto2) -> dto1));
-                if (Objects.nonNull(s.getRoomCode())) {
-                    String roomName = roomCodeQueryDtoMap.get(s.getRoomCode()).getRoomName();
-                    if (Objects.isNull(roomName)) {
-                        throw new BusinessException("考场不存在");
-                    }
-                    s.setRoomName(roomCodeQueryDtoMap.get(s.getRoomCode()).getRoomName());
-                }
-            }
+//            List<RoomCodeQueryDto> roomCodeQueryDtoList = teExamStudentService.examRoomQuery(null);
+//            if (Objects.nonNull(roomCodeQueryDtoList)) {
+//                Map<String, RoomCodeQueryDto> roomCodeQueryDtoMap = roomCodeQueryDtoList.stream().collect(
+//                        Collectors.toMap(RoomCodeQueryDto::getRoomCode, Function.identity(), (dto1, dto2) -> dto1));
+//                if (Objects.nonNull(s.getRoomCode())) {
+//                    String roomName = roomCodeQueryDtoMap.get(s.getRoomCode()).getRoomName();
+//                    if (Objects.isNull(roomName)) {
+//                        throw new BusinessException("考场不存在");
+//                    }
+//                    s.setRoomName(roomCodeQueryDtoMap.get(s.getRoomCode()).getRoomName());
+//                }
+//            }
             s.setAlreadyExamCount(Objects.isNull(s.getAlreadyExamCount()) ? 0 : s.getAlreadyExamCount());
             teExamStudentService.saveOrUpdate(s);
         });
@@ -382,7 +381,7 @@ public class TEExamStudentController {
             mqDtoService.assembleSendOneWayMsg(mqDto);
             // mq发送消息end
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(tbAttachment)) {
                 tbAttachmentService.deleteAttachment(mapParameter, UploadFileEnum.file, tbAttachment);
             }
@@ -471,7 +470,7 @@ public class TEExamStudentController {
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof BusinessException) {
                 throw new BusinessException(e.getMessage());
             } else {
@@ -518,7 +517,7 @@ public class TEExamStudentController {
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof BusinessException) {
                 throw new BusinessException(e.getMessage());
             } else {

+ 2 - 1
themis-admin/src/main/java/com/qmth/themis/admin/aspect/ApiControllerAspect.java

@@ -1,5 +1,6 @@
 package com.qmth.themis.admin.aspect;
 
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.exception.BusinessException;
@@ -82,7 +83,7 @@ public class ApiControllerAspect {
             log.info("============耗时============:{}秒", (end - start) / 1000);
             return proceed;
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof BusinessException) {
                 return ResultUtil.error((BusinessException) e, e.getMessage());
             } else {

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/websocket/WebSocketAdminServer.java

@@ -117,7 +117,7 @@ public class WebSocketAdminServer
                     this.sendMessage(result);
                 }
             } catch (Exception e) {
-                log.error("请求出错", e);
+                log.error(SystemConstant.LOG_ERROR, e);
             }
         }
     }

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/config/MapApiReader.java

@@ -4,6 +4,7 @@ import com.fasterxml.classmate.TypeResolver;
 import com.google.common.base.Optional;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
+import com.qmth.themis.business.constant.SystemConstant;
 import org.apache.ibatis.javassist.*;
 import org.apache.ibatis.javassist.bytecode.AnnotationsAttribute;
 import org.apache.ibatis.javassist.bytecode.ConstPool;
@@ -70,7 +71,7 @@ public class MapApiReader implements ParameterBuilderPlugin {
             }
             return ctClass.toClass();
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             return null;
         }
     }

+ 18 - 0
themis-business/src/main/java/com/qmth/themis/business/service/CommonService.java

@@ -4,6 +4,24 @@ public interface CommonService {
 
     /**
      * 考试记录数据持久化
+     *
+     * @param recordId
+     * @param studentId
      */
     void persisted(Long recordId, Long studentId);
+
+    /**
+     * 删除考生缓存
+     *
+     * @param recordId
+     * @param studentId
+     */
+    public void deleteExamStudentCache(Long recordId, Long studentId);
+
+    /**
+     * 解散房间
+     *
+     * @param recordId
+     */
+    public void DismissRoomByStrRoomId(Long recordId);
 }

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

@@ -164,7 +164,7 @@ public class CacheServiceImpl implements CacheService {
                 authDto = new AuthDto(roleCodes, tbPrivilegeList.stream().map(s -> s.getUrl()).collect(Collectors.toSet()), tbOrg);
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             throw new BusinessException("添加用户鉴权缓存失败");
         }
         return authDto;
@@ -245,7 +245,7 @@ public class CacheServiceImpl implements CacheService {
             roleCodes.add(RoleEnum.STUDENT.name());
             authDto = new AuthDto(roleCodes, tbPrivilegeList.stream().map(s -> s.getUrl()).collect(Collectors.toSet()), tbOrg);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             throw new BusinessException("添加学生鉴权缓存失败");
         }
         return authDto;

+ 64 - 28
themis-business/src/main/java/com/qmth/themis/business/service/impl/CommonServiceImpl.java

@@ -16,6 +16,7 @@ import com.qmth.themis.business.service.TOeExamBreakHistoryService;
 import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.RedisUtil;
+import com.qmth.themis.business.util.TencentYunUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -49,6 +50,15 @@ public class CommonServiceImpl implements CommonService {
     @Resource
     TOeExamBreakHistoryService tOeExamBreakHistoryService;
 
+    @Resource
+    TencentYunUtil tencentYunUtil;
+
+    /**
+     * 考试记录数据持久化
+     *
+     * @param recordId
+     * @param studentId
+     */
     @Override
     public void persisted(Long recordId, Long studentId) {
         String lockKey = SystemConstant.REDIS_LOCK_EXAM_RECORD_PERSISTED_PREFIX + recordId;
@@ -79,38 +89,64 @@ public class CommonServiceImpl implements CommonService {
 
             log.info("start persisted,recordId:" + recordId);
             examRecordService.saveDataByCache(recordId);
-            // 清除缓存
-//			ExamActivityRecordCacheUtil.removeActivityRecordCache(ExamRecordCacheUtil.getExamActivityId(recordId),
-//					recordId);
-//            Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
-//            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-            redisUtil.delete(RedisKeyHelper.examRecordCacheKey(recordId));
-            redisUtil.delete(RedisKeyHelper.examAnswerKey(recordId));
-            redisUtil.delete(RedisKeyHelper.audioLeftPlayCountKey(recordId));
-            redisUtil.delete(RedisKeyHelper.livenessVerifyCacheKey(recordId));
-            redisUtil.delete(RedisKeyHelper.faceVerifyCacheKey(recordId));
-            //2021-03-01新增
-            redisUtil.delete(RedisKeyHelper.studentPaperStructKey(recordId));
-//            redisUtil.delete(RedisKeyHelper.examStudentCacheKey(examStudentId));
-            //先查询之前的断点记录
-            QueryWrapper<TOeExamBreakHistory> tOeExamBreakHistoryQueryWrapper = new QueryWrapper<>();
-            tOeExamBreakHistoryQueryWrapper.lambda().eq(TOeExamBreakHistory::getExamRecordId, recordId);
-            List<TOeExamBreakHistory> tOeExamBreakHistoryList = tOeExamBreakHistoryService.list(tOeExamBreakHistoryQueryWrapper);
-            //删除历史断点缓存
-            if (Objects.nonNull(tOeExamBreakHistoryList) && tOeExamBreakHistoryList.size() > 0) {
-                tOeExamBreakHistoryList.forEach(s -> {
-                    redisUtil.delete(RedisKeyHelper.examBreakCacheKey(s.getId()));
-                });
-            }
-            //删除未完成的考试id
-//            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-//            ExamingDataCacheUtil.deleteUnFinishedRecordId(examStudentCacheBean.getStudentId());
-            //删除场次考试记录
-//            ExamActivityRecordCacheUtil.deleteExamRecordStatus(examActivityId, recordId);
+            this.deleteExamStudentCache(recordId, studentId);
             log.info("end persisted,recordId:" + recordId);
         } finally {
             redisUtil.releaseLock(lockKey);
         }
     }
 
+    /**
+     * 删除考生缓存
+     *
+     * @param recordId
+     * @param studentId
+     */
+    @Override
+    public void deleteExamStudentCache(Long recordId, Long studentId) {
+        //判断当前结束的考试记录ID是否是未完成的考试记录ID
+        if (Objects.equals(recordId, ExamingDataCacheUtil.getUnFinishedRecordId(studentId))) {
+            ExamingDataCacheUtil.deleteUnFinishedRecordId(studentId);
+        }
+        if (Objects.equals(recordId, ExamingDataCacheUtil.getExamingRecordId(studentId))) {
+            ExamingDataCacheUtil.deleteExamingRecordId(studentId);
+        }
+
+        redisUtil.delete(RedisKeyHelper.examRecordCacheKey(recordId));
+        redisUtil.delete(RedisKeyHelper.examAnswerKey(recordId));
+        redisUtil.delete(RedisKeyHelper.audioLeftPlayCountKey(recordId));
+        redisUtil.delete(RedisKeyHelper.livenessVerifyCacheKey(recordId));
+        redisUtil.delete(RedisKeyHelper.faceVerifyCacheKey(recordId));
+        //2021-03-01新增
+        redisUtil.delete(RedisKeyHelper.studentPaperStructKey(recordId));
+        //先查询之前的断点记录
+        QueryWrapper<TOeExamBreakHistory> tOeExamBreakHistoryQueryWrapper = new QueryWrapper<>();
+        tOeExamBreakHistoryQueryWrapper.lambda().eq(TOeExamBreakHistory::getExamRecordId, recordId);
+        List<TOeExamBreakHistory> tOeExamBreakHistoryList = tOeExamBreakHistoryService.list(tOeExamBreakHistoryQueryWrapper);
+        //删除历史断点缓存
+        if (Objects.nonNull(tOeExamBreakHistoryList) && tOeExamBreakHistoryList.size() > 0) {
+            tOeExamBreakHistoryList.forEach(s -> {
+                redisUtil.delete(RedisKeyHelper.examBreakCacheKey(s.getId()));
+            });
+        }
+    }
+
+    /**
+     * 解散房间
+     *
+     * @param recordId
+     */
+    @Override
+    public void DismissRoomByStrRoomId(Long recordId) {
+        try {
+            tencentYunUtil.DismissRoomByStrRoomId(tencentYunUtil.getTencentYunDomain().getSecretId(),
+                    tencentYunUtil.getTencentYunDomain().getSecretKey(),
+                    tencentYunUtil.getTencentYunDomain().getTrtcQueryUrl(),
+                    tencentYunUtil.getTencentYunDomain().getTrtcRegion(),
+                    Long.parseLong(tencentYunUtil.getTencentYunDomain().getAppId()),
+                    String.valueOf(recordId));
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+    }
 }

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

@@ -49,7 +49,7 @@ public class MqDtoServiceImpl implements MqDtoService {
         try {
             producerServer.sendOneWay(mqDto);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(mqDto)) {
                 mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
             }
@@ -71,7 +71,7 @@ public class MqDtoServiceImpl implements MqDtoService {
         try {
             producerServer.asyncDelayMsg(mqDto);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(mqDto)) {
                 mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
             }
@@ -93,7 +93,7 @@ public class MqDtoServiceImpl implements MqDtoService {
         try {
             producerServer.sendOneWayOrderly(mqDto);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(mqDto)) {
                 mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
             }
@@ -115,7 +115,7 @@ public class MqDtoServiceImpl implements MqDtoService {
         try {
             producerServer.asyncOrderlyMsg(mqDto);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(mqDto)) {
                 mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
             }
@@ -137,7 +137,7 @@ public class MqDtoServiceImpl implements MqDtoService {
         try {
             producerServer.syncOrderlyMsg(mqDto);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(mqDto)) {
                 mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
             }
@@ -159,7 +159,7 @@ public class MqDtoServiceImpl implements MqDtoService {
         try {
             producerServer.syncDelayMsg(mqDto);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(mqDto)) {
                 mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
             }
@@ -181,7 +181,7 @@ public class MqDtoServiceImpl implements MqDtoService {
         try {
             producerServer.sendMsgTran(mqDto);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(mqDto)) {
                 mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
             }

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

@@ -146,7 +146,7 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
             tbAttachment.setCreateId(userId);
             this.save(tbAttachment);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             deleteAttachment(map, type, tbAttachment);
             if (e instanceof BusinessException) {
                 throw new BusinessException(e.getMessage());
@@ -231,7 +231,7 @@ public class TBAttachmentServiceImpl extends ServiceImpl<TBAttachmentMapper, TBA
             tbAttachment.setCreateId(userId);
             this.save(tbAttachment);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             deleteAttachment(map, type, tbAttachment);
             if (e instanceof BusinessException) {
                 throw new BusinessException(e.getMessage());

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java

@@ -357,7 +357,7 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
                 //新增quartz任务,发送mq消息end
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(examId) && Objects.nonNull(teExamActivityList) && (Objects.nonNull(teExamActivityList)
                     && teExamActivityList.size() > 0 && Objects.nonNull(teExamActivityList.get(0)))) {
                 redisUtil.setRedisActivityCodeSequence(examId,

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

@@ -1193,14 +1193,6 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         }
         //更新未完成考试记录id
         TEStudentCacheDto teStudentCacheDto = cacheService.addStudentAccountCache(es.getStudentId());
-        //判断当前结束的考试记录ID是否是未完成的考试记录ID
-        if (recordId.equals(ExamingDataCacheUtil.getUnFinishedRecordId(studentId))) {
-            ExamingDataCacheUtil.deleteUnFinishedRecordId(studentId);
-        }
-        if (Objects.equals(recordId, ExamingDataCacheUtil.getExamingRecordId(studentId))) {
-            ExamingDataCacheUtil.deleteExamingRecordId(studentId);
-        }
-
         Map<String, Object> properties = new HashMap<>();
         properties.put(SystemConstant.REMOVE_WEBSOCKET, true);
 

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

@@ -1241,7 +1241,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
                     }
                     break;
                 } catch (Exception e) {
-                    log.error("请求出错", e);
+                    log.error(SystemConstant.LOG_ERROR, e);
                     if (e instanceof BusinessException) {
                         throw new BusinessException(e.getMessage());
                     } else {
@@ -1313,7 +1313,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
                 }
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof BusinessException) {
                 throw new BusinessException(e.getMessage());
             } else {

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/templete/TaskExportCommon.java

@@ -170,7 +170,7 @@ public class TaskExportCommon {
             }
             tbTaskHistoryService.updateById(this.tbTaskHistory);
         } catch (IOException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         } finally {
             if (Objects.nonNull(inputStream)) {
                 inputStream.close();

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/templete/TaskImportCommon.java

@@ -157,7 +157,7 @@ public class TaskImportCommon {
             this.tbTaskHistory.setReportFilePath(json.toJSONString());
             tbTaskHistoryService.updateById(this.tbTaskHistory);
         } catch (IOException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         } finally {
             if (Objects.nonNull(inputStream)) {
                 inputStream.close();

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java

@@ -461,7 +461,7 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
             byte[] bookByteAry = out.toByteArray();
             paper.setStructMd5(BinaryUtil.encodeMD5(bookByteAry));
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         } finally {
             if (Objects.nonNull(out)) {
                 out.flush();

+ 3 - 2
themis-business/src/main/java/com/qmth/themis/business/util/JacksonUtil.java

@@ -3,6 +3,7 @@ package com.qmth.themis.business.util;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.qmth.themis.business.constant.SystemConstant;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +48,7 @@ public class JacksonUtil {
         try {
             return objectMapper.writeValueAsString(o);
         } catch (JsonProcessingException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
         return null;
     }
@@ -64,7 +65,7 @@ public class JacksonUtil {
         try {
             return objectMapper.readValue(o, valueType);
         } catch (JsonProcessingException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
         return null;
     }

+ 5 - 6
themis-common/src/main/java/com/qmth/themis/common/util/AesUtil.java

@@ -21,6 +21,7 @@ import java.util.Base64;
  */
 public class AesUtil {
     private final static Logger log = LoggerFactory.getLogger(AesUtil.class);
+    private final static String ERROR_MSG = "请求出错:";
 
     /**
      * 加密
@@ -80,8 +81,7 @@ public class AesUtil {
      * @throws Exception
      */
     public static String encoder(String content, String encryptKey) throws Exception {
-        String encoderText = Base64.getEncoder().encodeToString(encrypt(content, encryptKey));
-        return encoderText;
+        return Base64.getEncoder().encodeToString(encrypt(content, encryptKey));
     }
 
     /**
@@ -93,8 +93,7 @@ public class AesUtil {
      * @throws Exception
      */
     public static String decoder(String encryptStr, String decryptKey) throws Exception {
-        String decoderText = decrypt(Base64.getDecoder().decode(encryptStr), decryptKey);
-        return decoderText;
+        return decrypt(Base64.getDecoder().decode(encryptStr), decryptKey);
     }
 
     /**
@@ -121,7 +120,7 @@ public class AesUtil {
             byte[] result = cipher.doFinal(content.getBytes(Constants.CHARSET_NAME));
             encoderText = Base64.getEncoder().encodeToString(result);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(ERROR_MSG, e);
         }
         return encoderText;
     }
@@ -142,7 +141,7 @@ public class AesUtil {
             cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec);
             decoderText = new String(cipher.doFinal(Base64.getDecoder().decode(content)), Constants.CHARSET_NAME);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(ERROR_MSG, e);
         }
         return decoderText;
     }

+ 25 - 22
themis-exam/src/main/java/com/qmth/themis/exam/api/TEExamController.java

@@ -18,7 +18,10 @@ import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.ExceptionEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
 import com.qmth.themis.business.enums.SystemOperationEnum;
-import com.qmth.themis.business.service.*;
+import com.qmth.themis.business.service.MqDtoService;
+import com.qmth.themis.business.service.TEExamService;
+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.RedisUtil;
@@ -64,9 +67,9 @@ public class TEExamController {
 
     @ApiOperation(value = "验证考试口令接口")
     @RequestMapping(value = "/short_code", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试信息", response = TEExam.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试信息", response = TEExam.class)})
     public Result shortCode(@ApiJsonObject(name = "shortCode", value = {
-            @ApiJsonProperty(key = "shortCode", description = "考试口令") }) @ApiParam(value = "考试口令", required = true) @RequestBody Map<String, Object> mapParameter) {
+            @ApiJsonProperty(key = "shortCode", description = "考试口令")}) @ApiParam(value = "考试口令", required = true) @RequestBody Map<String, Object> mapParameter) {
         if (Objects.isNull(mapParameter.get("shortCode")) || Objects.equals(mapParameter.get("shortCode"), "")) {
             throw new BusinessException(ExceptionResultEnum.SHORT_CODE_IS_NULL);
         }
@@ -86,9 +89,9 @@ public class TEExamController {
 
     @ApiOperation(value = "获取待考列表接口")
     @RequestMapping(value = "/waiting", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试列表", response = TEExamDto.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试列表", response = TEExamDto.class)})
     public Result waiting(@ApiJsonObject(name = "examWaiting", value = {
-            @ApiJsonProperty(key = "examId", type = "long", example = "1", description = "批次id") }) @ApiParam(value = "考试口令", required = true) @RequestBody Map<String, Object> mapParameter) {
+            @ApiJsonProperty(key = "examId", type = "long", example = "1", description = "批次id")}) @ApiParam(value = "考试口令", required = true) @RequestBody Map<String, Object> mapParameter) {
         Long examId = Objects.nonNull(mapParameter.get(SystemConstant.EXAM_ID)) ?
                 Long.parseLong(String.valueOf(mapParameter.get(SystemConstant.EXAM_ID))) :
                 null;
@@ -99,7 +102,7 @@ public class TEExamController {
 
     @ApiOperation(value = "开始候考")
     @RequestMapping(value = "/prepare", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "候考信息", response = ExamPrepareBean.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "候考信息", response = ExamPrepareBean.class)})
     public Result prepare(@RequestBody PrepareParamBean param) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
@@ -118,9 +121,9 @@ public class TEExamController {
 
     @ApiOperation(value = "候考/答题状态退出")
     @RequestMapping(value = "/exit", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result exit(@ApiJsonObject(name = "saveInvigilateUser", value = {
-            @ApiJsonProperty(key = "recordId", type = "long", example = "1", description = "考试记录id", required = true) }) @ApiParam(value = "考试记录id", required = true) @RequestBody Map<String, Object> mapParameter)
+            @ApiJsonProperty(key = "recordId", type = "long", example = "1", description = "考试记录id", required = true)}) @ApiParam(value = "考试记录id", required = true) @RequestBody Map<String, Object> mapParameter)
             throws NoSuchAlgorithmException, IOException {
         if (Objects.isNull(mapParameter.get(SystemConstant.RECORD_ID)) || Objects
                 .equals(mapParameter.get(SystemConstant.RECORD_ID), "")) {
@@ -149,7 +152,7 @@ public class TEExamController {
 
     @ApiOperation(value = "开始考试")
     @RequestMapping(value = "/start", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result start(@RequestBody ExamStartParamBean param) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
@@ -196,7 +199,7 @@ public class TEExamController {
 
     @ApiOperation(value = "上传个人试卷结构")
     @RequestMapping(value = "/student_paper_struct/upload", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result studentPaperStruct(@RequestBody StudentPaperStructParamBean param) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         if (Objects.isNull(param.getRecordId()) || Objects.equals(param.getRecordId(), "")) {
@@ -211,7 +214,7 @@ public class TEExamController {
 
     @ApiOperation(value = "提交作答结果")
     @RequestMapping(value = "/answer/submit", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result answerSubmit(@RequestBody AnswerSubmitParamBean param) throws IOException {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         if (Objects.isNull(param.getRecordId()) || Objects.equals(param.getRecordId(), "")) {
@@ -254,7 +257,7 @@ public class TEExamController {
 
     @ApiOperation(value = "更新音频剩余播放次数")
     @RequestMapping(value = "/audio_left_play_count/submit", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result audioLeftPlayCountSubmit(@RequestBody AudioLeftPlayCountSubmitParamBean param) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         if (Objects.isNull(param.getRecordId()) || Objects.equals(param.getRecordId(), "")) {
@@ -272,18 +275,18 @@ public class TEExamController {
 
     @ApiOperation(value = "文件上传")
     @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result fileUpload(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId,
-            @ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
-            @ApiParam(value = "后缀名", required = true) @RequestParam String suffix,
-            @ApiParam(value = "md5", required = true) @RequestParam String md5) {
+                             @ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                             @ApiParam(value = "后缀名", required = true) @RequestParam String suffix,
+                             @ApiParam(value = "md5", required = true) @RequestParam String md5) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         return ResultUtil.ok(teExamService.fileUpload(teStudent.getId(), recordId, file, suffix, md5));
     }
 
     @ApiOperation(value = "断点恢复")
     @RequestMapping(value = "/resume", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result resume(@RequestBody ResumeParamBean param) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
@@ -303,7 +306,7 @@ public class TEExamController {
 
     @ApiOperation(value = "结束考试")
     @RequestMapping(value = "/finish", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result finish(@RequestBody FinishParamBean param) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
@@ -330,7 +333,7 @@ public class TEExamController {
 
     @ApiOperation(value = "查询交卷结果")
     @RequestMapping(value = "/result", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result result(@RequestBody ResultParamBean param) {
         if (Objects.isNull(param.getRecordId()) || Objects.equals(param.getRecordId(), "")) {
             throw new BusinessException(ExceptionResultEnum.RECORD_ID_IS_NULL);
@@ -350,7 +353,7 @@ public class TEExamController {
 
     @ApiOperation(value = "获取试卷下载信息")
     @RequestMapping(value = "/paper/download", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result paperDownload(@RequestBody ResultParamBean param) throws IOException {
         if (Objects.isNull(param.getRecordId()) || Objects.equals(param.getRecordId(), "")) {
             throw new BusinessException(ExceptionResultEnum.RECORD_ID_IS_NULL);
@@ -366,7 +369,7 @@ public class TEExamController {
 
     @ApiOperation(value = "试卷下载成功通知")
     @RequestMapping(value = "/paper/downloaded", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result paperDownloaded(@RequestBody ResultParamBean param) {
         if (Objects.isNull(param.getRecordId()) || Objects.equals(param.getRecordId(), "")) {
             throw new BusinessException(ExceptionResultEnum.RECORD_ID_IS_NULL);
@@ -389,7 +392,7 @@ public class TEExamController {
 
     @ApiOperation(value = "查询考试状态")
     @RequestMapping(value = "/status", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
+    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
     public Result status(@RequestBody ResultParamBean param) {
         if (Objects.isNull(param)) {
             throw new BusinessException(ExceptionResultEnum.PARAMS_ILLEGALITY);

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java

@@ -98,7 +98,7 @@ public class TIeInvigilateCallMobileController {
 //            mqDtoService.assembleSendOneWayMsg(mqDto);
 //            //监考监控通话信息 发送mq end
 //        } catch (Exception e) {
-//            log.error("请求出错", e);
+//            log.error(SystemConstant.LOG_ERROR, e);
 //            if (e instanceof DuplicateKeyException) {
 //                String errorColumn = e.getCause().toString();
 //                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java

@@ -97,7 +97,7 @@ public class TIeInvigilateCallOeController {
 //            mqDtoService.assembleSendOneWayMsg(mqDto);
 //            //监考监控通话信息 发送mq end
 //        } catch (Exception e) {
-//            log.error("请求出错", e);
+//            log.error(SystemConstant.LOG_ERROR, e);
 //            if (e instanceof DuplicateKeyException) {
 //                String errorColumn = e.getCause().toString();
 //                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");

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

@@ -208,7 +208,7 @@ public class WebSocketMobileServer implements Concurrently {
                     }
                 }
             } catch (Exception e) {
-                log.error("请求出错", e);
+                log.error(SystemConstant.LOG_ERROR, e);
             }
         }
     }

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

@@ -205,7 +205,7 @@ public class WebSocketOeServer implements Concurrently {
                     }
                 }
             } catch (Exception e) {
-                log.error("请求出错", e);
+                log.error(SystemConstant.LOG_ERROR, e);
                 if (log.isInfoEnabled()) {
                     log.info("incoming message:" + message);
                 }

+ 1 - 1
themis-mq/src/main/java/com/qmth/themis/mq/listener/RocketMessageConsumer.java

@@ -50,7 +50,7 @@ public class RocketMessageConsumer {
             consumer.start();
             log.info("consumer is start !!! groupName:{},topic:{},tag:{},namesrvAddr:{}", consumerGroupName, topic, tag, nameSrvAddr);
         } catch (MQClientException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
         return consumer;
     }

+ 2 - 2
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -219,7 +219,7 @@ public class MqLogicServiceImpl implements MqLogicService {
             try {
                 taskImportTemplete.importTask(map);
             } catch (IOException e) {
-                log.error("请求出错", e);
+                log.error(SystemConstant.LOG_ERROR, e);
             }
         } else {
             TaskExportTemplete taskExportTemplete = null;
@@ -235,7 +235,7 @@ public class MqLogicServiceImpl implements MqLogicService {
             try {
                 taskExportTemplete.exportTask(map);
             } catch (IOException e) {
-                log.error("请求出错", e);
+                log.error(SystemConstant.LOG_ERROR, e);
             }
         }
 //        });

+ 6 - 0
themis-task/src/main/java/com/qmth/themis/task/quartz/ExamActivityJob.java

@@ -27,6 +27,12 @@ public class ExamActivityJob extends QuartzJobBean {
     @Resource
     QuartzLogicService quartzLogicService;
 
+    /**
+     * 考试场次mq延时任务
+     *
+     * @param context
+     * @throws JobExecutionException
+     */
     @Override
     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
         log.info("exam_acvitity_job进来了,context:{}", context);

+ 6 - 0
themis-task/src/main/java/com/qmth/themis/task/quartz/ExamStudentJob.java

@@ -26,6 +26,12 @@ public class ExamStudentJob extends QuartzJobBean {
     @Resource
     QuartzLogicService quartzLogicService;
 
+    /**
+     * 非强制交卷,换算最终交卷时间并生成一次性考生延时任务
+     *
+     * @param context
+     * @throws JobExecutionException
+     */
     @Override
     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
         log.info("exam_student_job进来了,context:{}", context);

+ 20 - 13
themis-task/src/main/java/com/qmth/themis/task/quartz/MqActivityJob.java

@@ -7,10 +7,7 @@ import com.qmth.themis.business.entity.TEExamActivity;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.FinishTypeEnum;
-import com.qmth.themis.business.service.TEExamActivityService;
-import com.qmth.themis.business.service.TEExamService;
-import com.qmth.themis.business.service.TEExamStudentService;
-import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.service.*;
 import org.quartz.JobExecutionContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,6 +41,14 @@ public class MqActivityJob extends QuartzJobBean {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
+    @Resource
+    CommonService commonService;
+
+    /**
+     * 每天凌晨定时任务
+     *
+     * @param context
+     */
     @Override
     protected void executeInternal(JobExecutionContext context) {
         log.info("mq_activity_job进来了,context:{}", context);
@@ -59,26 +64,28 @@ public class MqActivityJob extends QuartzJobBean {
                 List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
                 if (Objects.nonNull(teExamActivityList) && teExamActivityList.size() > 0) {
                     Set<Long> examActivityIdSet = teExamActivityList.stream().map(s -> s.getId()).collect(Collectors.toSet());
-//                    for (TEExamActivity teExamActivity : teExamActivityList) {
                     QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
                     tOeExamRecordQueryWrapper.lambda().in(TOeExamRecord::getExamActivityId, examActivityIdSet);
                     List<TOeExamRecord> examRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
-//                        Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
-//                        if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
                     examRecordList.forEach(s -> {
-//                        ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
                         ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
                         //获取该考试批次下所有未交卷的考生的考试记录
-                        if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
-//                            Long recordId = s.getId();
+                        if (Objects.nonNull(examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
                             Integer durationSeconds = s.getDurationSeconds();
                             Long examStudentId = s.getExamStudentId();
                             ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                            //交卷
-                            teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
+                            //候考阶段且没有进入考试则不交卷
+                            if (examRecordStatusEnum == ExamRecordStatusEnum.FIRST_PREPARE && Objects.isNull(s.getFirstStartTime())) {
+                                commonService.deleteExamStudentCache(s.getId(), examStudentCacheBean.getStudentId());
+                                commonService.DismissRoomByStrRoomId(s.getId());
+                            } else {//交卷
+                                teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
+                            }
                         }
                     });
-//                    }
                 }
             }
         }

+ 49 - 29
themis-task/src/main/java/com/qmth/themis/task/quartz/service/impl/QuartzLogicServiceImpl.java

@@ -5,14 +5,11 @@ import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
-import com.qmth.themis.business.constant.SpringContextHolder;
-import com.qmth.themis.business.dto.MqDto;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.FinishTypeEnum;
-import com.qmth.themis.business.enums.MqTagEnum;
 import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.task.quartz.service.QuartzLogicService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -21,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -47,6 +43,9 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
+    @Resource
+    CommonService commonService;
+
     /**
      * 考试场次quartz逻辑
      *
@@ -64,24 +63,26 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
             QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
             tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamActivityId, examActivityCacheBean.getId());
             List<TOeExamRecord> examRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
-//            Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(examActivityCacheBean.getId()));
             if (Objects.nonNull(forceFinish) && forceFinish.intValue() == 1) {//强制收卷
                 if (Objects.nonNull(examRecordList) && examRecordList.size() > 0) {
                     examRecordList.forEach(s -> {
-//                        ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
                         ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
                         //获取该考试批次下所有未交卷的考生的考试记录
-                        if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)) {
-//                            Long recordId = Long.parseLong(k);
-                            Long recordEndTime = s.getEndTime();
-                            if (Objects.nonNull(examActivityCacheBean.getFinishTime()) && Objects.nonNull(recordEndTime) && examActivityCacheBean.getFinishTime().longValue() == recordEndTime.longValue()) {
-                                Integer durationSeconds = s.getDurationSeconds();
-                                Long examStudentId = s.getExamStudentId();
-                                ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                                //交卷
-                                teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
-                                // 清除缓存
-//                                ExamActivityRecordCacheUtil.removeActivityRecordCache(ExamRecordCacheUtil.getExamActivityId(recordId), recordId);
+                        if (Objects.nonNull(examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)) {
+                            Integer durationSeconds = s.getDurationSeconds();
+                            Long examStudentId = s.getExamStudentId();
+                            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+                            //候考阶段且没有进入考试则不交卷
+                            if (examRecordStatusEnum == ExamRecordStatusEnum.FIRST_PREPARE && Objects.isNull(s.getFirstStartTime())) {
+                                commonService.deleteExamStudentCache(s.getId(), examStudentCacheBean.getStudentId());
+                                commonService.DismissRoomByStrRoomId(s.getId());
+                            } else {//交卷
+                                Long recordEndTime = s.getEndTime();
+                                if (Objects.nonNull(examActivityCacheBean.getFinishTime()) && Objects.nonNull(recordEndTime) && examActivityCacheBean.getFinishTime().longValue() == recordEndTime.longValue()) {
+                                    teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
+                                }
                             }
                         }
                     });
@@ -91,16 +92,22 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
                     examRecordList.forEach(s -> {
                         ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
                         //获取该考试批次下所有未交卷的考生的考试记录
-                        if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
+                        if (Objects.nonNull(examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
+                                && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
                             Long recordEndTime = s.getEndTime();
                             if (Objects.nonNull(examActivityCacheBean.getFinishTime()) && Objects.nonNull(recordEndTime) && examActivityCacheBean.getFinishTime().longValue() == recordEndTime.longValue()) {
                                 Integer durationSeconds = s.getDurationSeconds();
                                 Long examStudentId = s.getExamStudentId();
                                 ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                                //交卷
-                                teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
-                                // 清除缓存
-//                                ExamActivityRecordCacheUtil.removeActivityRecordCache(ExamRecordCacheUtil.getExamActivityId(recordId), recordId);
+                                //候考阶段且没有进入考试则不交卷
+                                if (examRecordStatusEnum == ExamRecordStatusEnum.FIRST_PREPARE && Objects.isNull(s.getFirstStartTime())) {
+                                    commonService.deleteExamStudentCache(s.getId(), examStudentCacheBean.getStudentId());
+                                    commonService.DismissRoomByStrRoomId(s.getId());
+                                } else {//交卷
+                                    teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
+                                }
                             }
                         }
                     });
@@ -124,12 +131,25 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
         ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
         ExamActivityCacheBean examActivityCacheBean = teExamActivityService.getExamActivityCacheBean(examStudentCacheBean.getExamActivityId());
         //获取该考试批次下所有未交卷的考生的考试记录
-        if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
-            Long recordEndTime = ExamRecordCacheUtil.getEndTime(recordId);
-            if (examActivityCacheBean.getFinishTime().longValue() == recordEndTime.longValue()) {
-                Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
-                //交卷
-                teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+        if (Objects.nonNull(examRecordStatusEnum)
+                && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)
+                && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
+                && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
+            Long firstStartTime = ExamRecordCacheUtil.getFirstStartTime(recordId);
+            if (Objects.isNull(firstStartTime)) {
+                TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
+                firstStartTime = tOeExamRecord.getFirstStartTime();
+            }
+            //候考阶段且没有进入考试则不交卷
+            if (examRecordStatusEnum == ExamRecordStatusEnum.FIRST_PREPARE && Objects.isNull(firstStartTime)) {
+                commonService.deleteExamStudentCache(recordId, examStudentCacheBean.getStudentId());
+                commonService.DismissRoomByStrRoomId(recordId);
+            } else {//交卷
+                Long recordEndTime = ExamRecordCacheUtil.getEndTime(recordId);
+                if (examActivityCacheBean.getFinishTime().longValue() == recordEndTime.longValue()) {
+                    Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
+                    teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+                }
             }
         }
     }

+ 10 - 9
themis-task/src/main/java/com/qmth/themis/task/service/impl/QuartzServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.themis.task.service.impl;
 
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.templete.TaskExportCommon;
 import com.qmth.themis.task.service.QuartzService;
 import org.quartz.*;
@@ -61,7 +62,7 @@ public class QuartzServiceImpl implements QuartzService {
             }
             scheduler.scheduleJob(jobDetail, trigger);
         } catch (SchedulerException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
     }
 
@@ -95,7 +96,7 @@ public class QuartzServiceImpl implements QuartzService {
             // 把作业和触发器注册到任务调度中
             scheduler.scheduleJob(jobDetail, trigger);
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
     }
 
@@ -116,7 +117,7 @@ public class QuartzServiceImpl implements QuartzService {
             // 重启触发器
             scheduler.rescheduleJob(triggerKey, trigger);
         } catch (SchedulerException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
     }
 
@@ -131,7 +132,7 @@ public class QuartzServiceImpl implements QuartzService {
         try {
             scheduler.deleteJob(new JobKey(jobName, jobGroupName));
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
     }
 
@@ -147,7 +148,7 @@ public class QuartzServiceImpl implements QuartzService {
             JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
             scheduler.pauseJob(jobKey);
         } catch (SchedulerException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
     }
 
@@ -163,7 +164,7 @@ public class QuartzServiceImpl implements QuartzService {
             JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
             scheduler.resumeJob(jobKey);
         } catch (SchedulerException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
     }
 
@@ -179,7 +180,7 @@ public class QuartzServiceImpl implements QuartzService {
             JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
             scheduler.triggerJob(jobKey);
         } catch (SchedulerException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
     }
 
@@ -213,7 +214,7 @@ public class QuartzServiceImpl implements QuartzService {
                 }
             }
         } catch (SchedulerException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
         return jobList;
     }
@@ -247,7 +248,7 @@ public class QuartzServiceImpl implements QuartzService {
                 jobList.add(map);
             }
         } catch (SchedulerException e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
         }
         return jobList;
     }