wangliang преди 4 години
родител
ревизия
cabd0be121
променени са 33 файла, в които са добавени 485 реда и са изтрити 461 реда
  1. 18 14
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBExamInvigilateUserController.java
  2. 7 10
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBUserController.java
  3. 13 14
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java
  4. 29 29
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java
  5. 15 11
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamPaperController.java
  6. 8 4
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamStudentController.java
  7. 5 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateCallMobileController.java
  8. 7 7
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateController.java
  9. 10 10
      themis-admin/src/main/java/com/qmth/themis/admin/config/DictionaryConfig.java
  10. 0 13
      themis-admin/src/main/java/com/qmth/themis/admin/start/StartRunning.java
  11. 21 0
      themis-admin/src/main/resources/application.properties
  12. 13 13
      themis-business/src/main/java/com/qmth/themis/business/domain/MqConfigDomain.java
  13. 12 16
      themis-business/src/main/java/com/qmth/themis/business/domain/MqGroupDomain.java
  14. 18 28
      themis-business/src/main/java/com/qmth/themis/business/enums/MqGroupEnum.java
  15. 0 23
      themis-business/src/main/java/com/qmth/themis/business/enums/MqTopicEnum.java
  16. 65 64
      themis-business/src/main/java/com/qmth/themis/business/service/impl/CommonServiceImpl.java
  17. 34 31
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java
  18. 6 6
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEMobileServiceImpl.java
  19. 10 6
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java
  20. 12 26
      themis-business/src/main/java/com/qmth/themis/business/util/MqUtil.java
  21. 6 2
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEExamController.java
  22. 5 2
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEFaceController.java
  23. 65 65
      themis-exam/src/main/java/com/qmth/themis/exam/api/TELivenessController.java
  24. 11 8
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java
  25. 8 4
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java
  26. 8 4
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java
  27. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/config/DictionaryConfig.java
  28. 6 4
      themis-exam/src/main/java/com/qmth/themis/exam/start/StartRunning.java
  29. 7 6
      themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketOeServer.java
  30. 20 3
      themis-exam/src/main/resources/application.properties
  31. 6 2
      themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java
  32. 21 18
      themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java
  33. 18 15
      themis-task/src/main/resources/application.properties

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

@@ -13,6 +13,7 @@ import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TBAttachmentService;
 import com.qmth.themis.business.service.TBExamInvigilateUserService;
 import com.qmth.themis.business.service.TBTaskHistoryService;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -60,14 +61,17 @@ public class TBExamInvigilateUserController {
     @Resource
     OssUtil ossUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "监考员查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "监考员信息", response = TBExamInvigilateUserDto.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "监考员信息", response = TBExamInvigilateUserDto.class)})
     public Result query(@ApiParam(value = "考试批次id", required = true) @RequestParam(required = false) Long examId,
-            @ApiParam(value = "考场代码", required = false) @RequestParam(required = false) String roomCode,
-            @ApiParam(value = "用户id", required = false) @RequestParam(required = false) Long userId,
-            @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-            @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                        @ApiParam(value = "考场代码", required = false) @RequestParam(required = false) String roomCode,
+                        @ApiParam(value = "用户id", required = false) @RequestParam(required = false) Long userId,
+                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         return ResultUtil.ok(tbExamInvigilateUserService
                 .examInvigilateUserQuery(new Page<>(pageNumber, pageSize), examId, roomCode, userId,
@@ -77,11 +81,11 @@ public class TBExamInvigilateUserController {
     @ApiOperation(value = "监考员修改接口")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result save(@ApiJsonObject(name = "saveInvigilateUser", value = {
             @ApiJsonProperty(key = "examId", type = "long", example = "1", description = "考试批次id", required = true),
             @ApiJsonProperty(key = "roomCode", description = "考场代码"),
-            @ApiJsonProperty(key = "userIds", description = "用户id") }) @ApiParam(value = "监考员信息", required = true) @RequestBody Map<String, Object> mapParameter) {
+            @ApiJsonProperty(key = "userIds", description = "用户id")}) @ApiParam(value = "监考员信息", required = true) @RequestBody Map<String, Object> mapParameter) {
         String roomCode = null;
         try {
             if (Objects.isNull(mapParameter.get("examId")) || Objects.equals(mapParameter.get("examId"), "")) {
@@ -142,9 +146,9 @@ public class TBExamInvigilateUserController {
     @ApiOperation(value = "监考员导入接口")
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class)})
     public Result importData(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
-            @ApiParam(value = "考试批次id", required = true) @RequestParam Long examId) {
+                             @ApiParam(value = "考试批次id", required = true) @RequestParam Long examId) {
         if (Objects.isNull(file) || Objects.equals(file, "")) {
             throw new BusinessException(ExceptionResultEnum.ATTACHMENT_IS_NULL);
         }
@@ -176,7 +180,7 @@ public class TBExamInvigilateUserController {
             transMap.put("orgId", tbUser.getOrgId());
             transMap.put("remark", tbAttachment.getRemark());
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.ROOM_CODE_IMPORT.name(), transMap,
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.ROOM_CODE_IMPORT.name(), transMap,
                     MqTagEnum.ROOM_CODE_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
@@ -197,10 +201,10 @@ public class TBExamInvigilateUserController {
     @ApiOperation(value = "监考员导出接口")
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class)})
     public Result export(@ApiParam(value = "考试批次id", required = true) @RequestParam(required = false) Long examId,
-            @ApiParam(value = "考场代码", required = false) @RequestParam(required = false) String roomCode,
-            @ApiParam(value = "用户id", required = false) @RequestParam(required = false) Long userId) {
+                         @ApiParam(value = "考场代码", required = false) @RequestParam(required = false) String roomCode,
+                         @ApiParam(value = "用户id", required = false) @RequestParam(required = false) Long userId) {
         TBTaskHistory tbTaskHistory = null;
         try {
             int count = tbExamInvigilateUserService.count();
@@ -219,7 +223,7 @@ public class TBExamInvigilateUserController {
                 transMap.put("roomCode", roomCode);
                 transMap.put("userId", userId);
                 //mq发送消息start
-                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.ROOM_CODE_EXPORT.name(), transMap,
+                MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.ROOM_CODE_EXPORT.name(), transMap,
                         MqTagEnum.ROOM_CODE_EXPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
                 mqDtoService.assembleSendOneWayMsg(mqDto);
                 //mq发送消息end

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

@@ -17,20 +17,14 @@ import com.qmth.themis.business.entity.TBUser;
 import com.qmth.themis.business.entity.TBUserRole;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
 import com.qmth.themis.business.enums.SystemOperationEnum;
 import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.business.util.SessionUtil;
-import com.qmth.themis.business.util.UidUtil;
+import com.qmth.themis.business.util.*;
 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 com.qmth.themis.common.signature.SignatureInfo;
-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;
@@ -81,6 +75,9 @@ public class TBUserController {
     @Resource
     UidUtil uidUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "用户登录接口")
     @RequestMapping(value = "/login/account", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = TBUser.class)})
@@ -218,10 +215,10 @@ public class TBUserController {
                 expireTime.getDate().getTime());
         redisUtil.setUserSession(sessionId, tbSession, expireTime.getExpireSeconds());
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), platform.name(), tbSession,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), platform.name(), tbSession,
                 MqTagEnum.valueOf(platform.name()), tbSession.getId(), user.getLoginName());
         mqDtoService.assembleSendOneWayMsg(mqDto);
-        MqDto mqDtoLog = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name(), SystemOperationEnum.LOGIN,
+        MqDto mqDtoLog = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.USER.name(), SystemOperationEnum.LOGIN,
                 MqTagEnum.USER, String.valueOf(user.getId()), user.getLoginName());
         mqDtoService.assembleSendOneWayMsg(mqDtoLog);
         //mq发送消息end
@@ -564,7 +561,7 @@ public class TBUserController {
             cacheService.removeAccountCache(tbUser.getId());
         }
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name(), SystemOperationEnum.LOGOUT,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.USER.name(), SystemOperationEnum.LOGOUT,
                 MqTagEnum.USER, String.valueOf(tbUser.getId()), tbUser.getLoginName());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //mq发送消息end

+ 13 - 14
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java

@@ -9,14 +9,10 @@ import com.qmth.themis.business.entity.TEExamActivity;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
 import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TEExamActivityService;
 import com.qmth.themis.business.service.TEExamService;
-import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.business.util.UidUtil;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
@@ -60,10 +56,13 @@ public class TEExamActivityController {
     @Resource
     UidUtil uidUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "考试场次修改/新增接口")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result save(
             @ApiParam(value = "考试场次信息", required = true) @RequestBody List<TEExamActivity> teExamActivityList) {
         if (Objects.isNull(teExamActivityList) || teExamActivityList.size() == 0) {
@@ -96,7 +95,7 @@ public class TEExamActivityController {
                 Map<String, Object> prop = new HashMap<>();
                 prop.put("oper", "insert");
                 prop.put("exam", teExam);
-                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(),
+                MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
                         JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
                         String.valueOf(teExam.getId()), prop, tbUser.getName());
                 mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -126,14 +125,14 @@ public class TEExamActivityController {
 
     @ApiOperation(value = "考试场次查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试场次信息", response = TEExamActivity.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试场次信息", response = TEExamActivity.class)})
     public Result query(@ApiParam(value = "主键", required = false) @RequestParam(required = false) Long id,
-            @ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
-            @ApiParam(value = "考试场次编码", required = false) @RequestParam(required = false) String code,
-            @ApiParam(value = "开始日期", required = false) @RequestParam(required = false) Long startDate,
-            @ApiParam(value = "结束日期", required = false) @RequestParam(required = false) Long finishDate,
-            @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-            @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                        @ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
+                        @ApiParam(value = "考试场次编码", required = false) @RequestParam(required = false) String code,
+                        @ApiParam(value = "开始日期", required = false) @RequestParam(required = false) Long startDate,
+                        @ApiParam(value = "结束日期", required = false) @RequestParam(required = false) Long finishDate,
+                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         return ResultUtil.ok(teExamActivityService
                 .examActivityQuery(new Page<>(pageNumber, pageSize), id, examId, code, startDate, finishDate));
     }

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

@@ -16,10 +16,7 @@ import com.qmth.themis.business.dto.request.TEExamDto;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.business.util.UidUtil;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
@@ -72,13 +69,16 @@ public class TEExamController {
     @Resource
     UidUtil uidUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     @Resource
     TBTaskHistoryService taskHistoryService;
 
     @ApiOperation(value = "考试批次修改/新增接口")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result save(@ApiParam(value = "考试批次信息", required = true) @RequestBody TEExamDto teExamDto) {
         if (Objects.isNull(teExamDto) || Objects.equals(teExamDto, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_INFO_IS_NULL);
@@ -134,7 +134,7 @@ public class TEExamController {
                     Map<String, Object> prop = new HashMap<>();
                     prop.put("oper", "delete");
                     if (Objects.nonNull(teExamActivityList.get(0)) && teExamActivityList.get(0).getEnable() == 1) {
-                        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(),
+                        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
                                 JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
                                 String.valueOf(teExam.getId()), prop, tbUser.getName());
                         mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -169,7 +169,7 @@ public class TEExamController {
                         Map<String, Object> prop = new HashMap<>();
                         prop.put("oper", "insert");
                         prop.put("exam", teExam);
-                        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(),
+                        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
                                 JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
                                 String.valueOf(teExam.getId()), prop, tbUser.getName());
                         mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -191,7 +191,7 @@ public class TEExamController {
                         Map<String, Object> prop = new HashMap<>();
                         prop.put("oper", "insert");
                         prop.put("exam", teExam);
-                        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(),
+                        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
                                 JacksonUtil.parseJson(Arrays.asList(teExamActivity)), MqTagEnum.EXAM_ACTIVITY,
                                 String.valueOf(teExam.getId()), prop, tbUser.getName());
                         mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -221,10 +221,10 @@ public class TEExamController {
 
     @ApiOperation(value = "考试批次统计接口")
     @RequestMapping(value = "/count", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"count\":1}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"count\":1}", response = Result.class)})
     public Result count(@ApiParam(value = "考试批次编码", required = false) @RequestParam(required = false) String code,
-            @ApiParam(value = "考试批次名称", required = false) @RequestParam(required = false) String name,
-            @ApiParam(value = "考试批次模式", required = false) @RequestParam(required = false) Integer mode) {
+                        @ApiParam(value = "考试批次名称", required = false) @RequestParam(required = false) String name,
+                        @ApiParam(value = "考试批次模式", required = false) @RequestParam(required = false) Integer mode) {
         QueryWrapper<TEExam> teExamQueryWrapper = new QueryWrapper<>();
         if (Objects.nonNull(code)) {
             teExamQueryWrapper.lambda().eq(TEExam::getCode, code);
@@ -241,16 +241,16 @@ public class TEExamController {
 
     @ApiOperation(value = "考试批次查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试批次信息", response = TEExam.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试批次信息", response = TEExam.class)})
     public Result query(@ApiParam(value = "用户id", required = false) @RequestParam(required = false) Long userId,
-            @ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long id,
-            @ApiParam(value = "考试批次编码", required = false) @RequestParam(required = false) String code,
-            @ApiParam(value = "考试批次名称", required = false) @RequestParam(required = false) String name,
-            @ApiParam(value = "考试批次模式", required = false) @RequestParam(required = false) String mode,
-            @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Integer enable,
-            @ApiParam(value = "类型(区分实时监考台和考务)", required = false) @RequestParam(required = false) String type,
-            @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-            @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                        @ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long id,
+                        @ApiParam(value = "考试批次编码", required = false) @RequestParam(required = false) String code,
+                        @ApiParam(value = "考试批次名称", required = false) @RequestParam(required = false) String name,
+                        @ApiParam(value = "考试批次模式", required = false) @RequestParam(required = false) String mode,
+                        @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Integer enable,
+                        @ApiParam(value = "类型(区分实时监考台和考务)", required = false) @RequestParam(required = false) String type,
+                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + tbUser.getId());
         if (authDto.getRoleCodes().toString().contains(RoleEnum.INSPECTION.name())) {
@@ -263,11 +263,11 @@ public class TEExamController {
 
     @ApiOperation(value = "考试批次停用/启用接口")
     @RequestMapping(value = "/toggle", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     @Transactional
     public Result examToggle(@ApiJsonObject(name = "examToggle", value = {
             @ApiJsonProperty(key = "id", type = "long", example = "1", description = "考试批次ID"),
-            @ApiJsonProperty(key = "enable", type = "int", example = "1", description = "是否启用") }) @ApiParam(value = "考试批次信息", required = true) @RequestBody Map<String, Object> mapParameter) {
+            @ApiJsonProperty(key = "enable", type = "int", example = "1", description = "是否启用")}) @ApiParam(value = "考试批次信息", required = true) @RequestBody Map<String, Object> mapParameter) {
         if (Objects.isNull(mapParameter.get("id")) || Objects.equals(mapParameter.get("id"), "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -290,7 +290,7 @@ public class TEExamController {
 
     @ApiOperation(value = "考试批次详情接口")
     @RequestMapping(value = "/detail", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试批次信息", response = TEExam.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试批次信息", response = TEExam.class)})
     public Result detail(@ApiParam(value = "考试批次id", required = true) @RequestParam Long id) {
         if (Objects.isNull(id) || Objects.equals(id, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
@@ -304,12 +304,12 @@ public class TEExamController {
 
     @ApiOperation(value = "考试批次复制接口")
     @RequestMapping(value = "/copy", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     @Transactional
     public Result copy(@ApiJsonObject(name = "examCopy", value = {
             @ApiJsonProperty(key = "sourceId", type = "long", example = "1", description = "来源批次ID"),
             @ApiJsonProperty(key = "code", description = "代码"),
-            @ApiJsonProperty(key = "name", description = "名称") }) @ApiParam(value = "考试批次信息", required = true) @RequestBody Map<String, Object> mapParameter) {
+            @ApiJsonProperty(key = "name", description = "名称")}) @ApiParam(value = "考试批次信息", required = true) @RequestBody Map<String, Object> mapParameter) {
         if (Objects.isNull(mapParameter.get("sourceId")) || Objects.equals(mapParameter.get("sourceId"), "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -379,7 +379,7 @@ public class TEExamController {
 
     @ApiOperation(value = "监考端获取考试批次提醒接口")
     @RequestMapping(value = "/list/count", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试批次信息", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试批次信息", response = Result.class)})
     public Result listCount(@ApiParam(value = "用户id", required = false) @RequestParam(required = false) Long userId) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         return ResultUtil.ok(teExamService.examList(userId, tbUser.getOrgId()));
@@ -387,7 +387,7 @@ public class TEExamController {
 
     @ApiOperation(value = "考试属性统计接口")
     @RequestMapping(value = "/prop/count", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试属性信息", response = ExamPropCountDto.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试属性信息", response = ExamPropCountDto.class)})
     public Result propCount(@ApiParam(value = "考试id", required = true) @RequestParam Long examId) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
@@ -526,7 +526,7 @@ public class TEExamController {
     @ApiOperation(value = "考试重新算分")
     @RequestMapping(value = "/score/calculate", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class)})
     public Result scoreCalculate(@ApiParam(value = "批次ID", required = true) @RequestParam Long id) {
         //先查询考试相关信息
         TEExam teExam = teExamService.getById(id);
@@ -547,7 +547,7 @@ public class TEExamController {
             transMap.put("orgId", tbUser.getOrgId());
             transMap.put(SystemConstant.TASK_ID, tbTaskHistory.getId());
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_SCORE_CALCULATE.name(), transMap,
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_SCORE_CALCULATE.name(), transMap,
                     MqTagEnum.EXAM_SCORE_CALCULATE, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end

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

@@ -7,6 +7,7 @@ import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -56,14 +57,17 @@ public class TEExamPaperController {
     @Resource
     OssUtil ossUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     @Resource
     TEExamCourseService examCourseService;
 
     @ApiOperation(value = "考试试卷查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
-    @ApiResponses({ @ApiResponse(code = 200, message = "考试科目信息", response = TEExamPaper.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = TEExamPaper.class)})
     public Result query(@ApiParam(value = "考试批次id", required = true) @RequestParam Long examId,
-            @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode) {
+                        @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -78,7 +82,7 @@ public class TEExamPaperController {
     @ApiOperation(value = "考试试卷参数修改接口")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result save(@ApiParam(value = "考试试卷信息", required = true) @RequestBody List<TEExamPaper> teExamPaperList) {
         if (Objects.isNull(teExamPaperList) || teExamPaperList.size() == 0) {
             throw new BusinessException(ExceptionResultEnum.PAPER_INFO_IS_NULL);
@@ -115,14 +119,14 @@ public class TEExamPaperController {
     @ApiOperation(value = "考试试卷数据包上传接口")
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     @Transactional
-    @ApiResponses({ @ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class) })
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"taskId\":0}", response = Result.class)})
     public Result importData(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
-            @ApiParam(value = "批次ID", required = true) @RequestParam Long examId,
-            @ApiParam(value = "客观题乱序", required = false) @RequestParam Boolean objectiveShuffle,
-            @ApiParam(value = "选项乱序", required = false) @RequestParam Boolean optionShuffle,
-            @ApiParam(value = "音频播放次数", required = false) @RequestParam Integer audioPlayCount,
-            @ApiParam(value = "解析试卷", required = true) @RequestParam Boolean processPaper,
-            @ApiParam(value = "解析标答", required = true) @RequestParam Boolean processAnswer) {
+                             @ApiParam(value = "批次ID", required = true) @RequestParam Long examId,
+                             @ApiParam(value = "客观题乱序", required = false) @RequestParam Boolean objectiveShuffle,
+                             @ApiParam(value = "选项乱序", required = false) @RequestParam Boolean optionShuffle,
+                             @ApiParam(value = "音频播放次数", required = false) @RequestParam Integer audioPlayCount,
+                             @ApiParam(value = "解析试卷", required = true) @RequestParam Boolean processPaper,
+                             @ApiParam(value = "解析标答", required = true) @RequestParam Boolean processAnswer) {
         if (file == null) {
             throw new BusinessException(ExceptionResultEnum.ATTACHMENT_IS_NULL);
         }
@@ -164,7 +168,7 @@ public class TEExamPaperController {
             transMap.put("processAnswer", processAnswer);
             transMap.put("remark", tbAttachment.getRemark());
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_PAPER_IMPORT.name(), transMap,
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_PAPER_IMPORT.name(), transMap,
                     MqTagEnum.EXAM_PAPER_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end

+ 8 - 4
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamStudentController.java

@@ -16,6 +16,7 @@ import com.qmth.themis.business.dto.response.TEExamStudentDto;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -83,6 +84,9 @@ public class TEExamStudentController {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "考生导出")
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     public Result export(@ApiParam(value = "考试批次id", required = true) @RequestParam Long examId,
@@ -119,7 +123,7 @@ public class TEExamStudentController {
         transMap.put("createId", tbUser.getId());
 
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT_EXPORT.name(), transMap,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_STUDENT_EXPORT.name(), transMap,
                 MqTagEnum.EXAM_STUDENT_EXPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
 
         mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -335,7 +339,7 @@ public class TEExamStudentController {
             }
             transMap.put("remark", tbAttachment.getRemark());
             // mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name(), transMap,
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_STUDENT_IMPORT.name(), transMap,
                     MqTagEnum.EXAM_STUDENT_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             // mq发送消息end
@@ -423,7 +427,7 @@ public class TEExamStudentController {
             transMap.put("name", name);
             transMap.put("courseCode", courseCode);
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MARK_RESULT_SIMPLE_EXPORT.name(),
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MARK_RESULT_SIMPLE_EXPORT.name(),
                     transMap, MqTagEnum.MARK_RESULT_SIMPLE_EXPORT, String.valueOf(tbTaskHistory.getId()),
                     tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -470,7 +474,7 @@ public class TEExamStudentController {
             transMap.put("name", name);
             transMap.put("courseCode", courseCode);
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MARK_RESULT_STANDARD_EXPORT.name(),
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MARK_RESULT_STANDARD_EXPORT.name(),
                     transMap, MqTagEnum.MARK_RESULT_STANDARD_EXPORT, String.valueOf(tbTaskHistory.getId()),
                     tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);

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

@@ -80,6 +80,9 @@ public class TIeInvigilateCallMobileController {
     @Resource
     TEExamStudentService teExamStudentService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "监考监控通话查询接口")
     @RequestMapping(value = "/call/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = TIeExamInvigilateCallDto.class)})
@@ -176,7 +179,7 @@ public class TIeInvigilateCallMobileController {
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl,
                 status, monitorKey, MonitorCallStatusSourceEnum.CALLING);
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(),
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(),
                 tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()),
                 source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -215,7 +218,7 @@ public class TIeInvigilateCallMobileController {
                 status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         tIeExamInvigilateCallLog.setEndTime(System.currentTimeMillis());
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(),
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(),
                 tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()),
                 source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);

+ 7 - 7
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateController.java

@@ -21,10 +21,7 @@ import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.excel.ExportUtils;
 import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.business.util.OssUtil;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
@@ -96,6 +93,9 @@ public class TIeInvigilateController {
     @Resource
     OssUtil ossUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "实时监控台视频列表接口")
     @RequestMapping(value = "/list/video", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = InvigilateListVideoBean.class)})
@@ -363,7 +363,7 @@ public class TIeInvigilateController {
             } else {
                 mqTagEnum = MqTagEnum.OE_HARD_FINISH;
             }
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), mqTagEnum.name(), JacksonUtil.parseJson(recordIdList), mqTagEnum, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), mqTagEnum.name(), JacksonUtil.parseJson(recordIdList), mqTagEnum, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //发送mq给客户端强制收卷end
         }
@@ -532,7 +532,7 @@ public class TIeInvigilateController {
                 properties.put("examStudentId", eb.getExamStudentId());
                 properties.put("examRecordId", eb.getExamRecordId());
                 ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(eb.getExamStudentId());
-                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), eb.getStatus() == 0 ? SystemOperationEnum.BREACH_HANDLE : SystemOperationEnum.BREACH_REVOKE, MqTagEnum.STUDENT, String.valueOf(examStudentCacheBean.getStudentId()), properties, examStudentCacheBean.getIdentity());
+                MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.STUDENT.name(), eb.getStatus() == 0 ? SystemOperationEnum.BREACH_HANDLE : SystemOperationEnum.BREACH_REVOKE, MqTagEnum.STUDENT, String.valueOf(examStudentCacheBean.getStudentId()), properties, examStudentCacheBean.getIdentity());
                 mqDtoService.assembleSendOneWayMsg(mqDto);
                 teExamBreachLogService.saveOrUpdate(eb);
             }
@@ -557,7 +557,7 @@ public class TIeInvigilateController {
         }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         //发送mq给客户端监考消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_IM_CLUSTERING.name(), recordId, MqTagEnum.OE_IM_CLUSTERING, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.OE_IM_CLUSTERING.name(), recordId, MqTagEnum.OE_IM_CLUSTERING, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //发送mq给客户端监考消息end
 

+ 10 - 10
themis-admin/src/main/java/com/qmth/themis/admin/config/DictionaryConfig.java

@@ -92,14 +92,14 @@ public class DictionaryConfig {
         return new WxappDomain();
     }
 
-//    /**
-//     * mq配置
-//     *
-//     * @return
-//     */
-//    @Bean
-//    @ConfigurationProperties(prefix = "mq.config", ignoreUnknownFields = false)
-//    public MqConfigDomain mqConfigDomain() {
-//        return new MqConfigDomain();
-//    }
+    /**
+     * mq配置
+     *
+     * @return
+     */
+    @Bean
+    @ConfigurationProperties(prefix = "mq.config", ignoreUnknownFields = false)
+    public MqConfigDomain mqConfigDomain() {
+        return new MqConfigDomain();
+    }
 }

+ 0 - 13
themis-admin/src/main/java/com/qmth/themis/admin/start/StartRunning.java

@@ -1,24 +1,11 @@
 package com.qmth.themis.admin.start;
 
-import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.business.enums.MqGroupEnum;
-import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
-import com.qmth.themis.mq.listener.RocketMessageConsumer;
-import com.qmth.themis.mq.templete.impl.LogConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.SessionConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.TaskConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.UserLogConcurrentlyImpl;
-import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
-
 /**
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
  * @Param:

+ 21 - 0
themis-admin/src/main/resources/application.properties

@@ -167,6 +167,27 @@ rocketmq.producer.enable-msg-trace=true
 #\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u8F68\u8FF9\u4E3B\u9898
 #rocketmq.producer.customized-trace-topic=my-trace-topic
 
+#mq topic\u548Cgroup\u914D\u7F6E
+mq.config.topic=themis-topic-exam
+mq.config.map.SESSION_GROUP=themis-group-exam-session
+mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
+mq.config.map.LOG_GROUP=themis-group-exam-log
+mq.config.map.TASK_GROUP=themis-group-exam-task
+mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
+mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
+mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
+mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
+mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
+mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
+mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
+mq.config.map.EXAM_RECORD_INIT_GROUP=themis-group-exam-examRecordInit
+mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
+mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
+mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
+mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
+mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
+mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
+
 #api\u524D\u7F00
 prefix.url.admin=api/admin
 prefix.url.open=api/open

+ 13 - 13
themis-business/src/main/java/com/qmth/themis/business/domain/MqConfigDomain.java

@@ -12,22 +12,22 @@ import java.util.Map;
  */
 public class MqConfigDomain implements Serializable {
 
-//    String topic;
-    Map<String, Object> group;
+    String topic;
+    Map<String, String> map;
 
-//    public String getTopic() {
-//        return topic;
-//    }
-//
-//    public void setTopic(String topic) {
-//        this.topic = topic;
-//    }
+    public String getTopic() {
+        return topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
 
-    public Map<String, Object> getGroup() {
-        return group;
+    public Map<String, String> getMap() {
+        return map;
     }
 
-    public void setGroup(Map<String, Object> group) {
-        this.group = group;
+    public void setMap(Map<String, String> map) {
+        this.map = map;
     }
 }

+ 12 - 16
themis-business/src/main/java/com/qmth/themis/business/domain/MqGroupDomain.java

@@ -12,35 +12,31 @@ import java.util.Map;
  */
 public class MqGroupDomain implements Serializable {
 
-//    String topic;
-    Map<String, Object> map;
+    String topic;
+    Map<String, String> map;
 
     public MqGroupDomain() {
 
     }
 
-    public MqGroupDomain(Map<String, Object> map) {
+    public MqGroupDomain(String topic, Map<String, String> map) {
+        this.topic = topic;
         this.map = map;
     }
 
-//    public MqGroupDomain(String topic, Map<String, String> map) {
-//        this.topic = topic;
-//        this.map = map;
-//    }
+    public String getTopic() {
+        return topic;
+    }
 
-//    public String getTopic() {
-//        return topic;
-//    }
-//
-//    public void setTopic(String topic) {
-//        this.topic = topic;
-//    }
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
 
-    public Map<String, Object> getMap() {
+    public Map<String, String> getMap() {
         return map;
     }
 
-    public void setMap(Map<String, Object> map) {
+    public void setMap(Map<String, String> map) {
         this.map = map;
     }
 }

+ 18 - 28
themis-business/src/main/java/com/qmth/themis/business/enums/MqGroupEnum.java

@@ -12,98 +12,88 @@ public enum MqGroupEnum {
     /**
      * session会话
      */
-    SESSION_GROUP("themis-group-exam-session"),
+    SESSION_GROUP,
 
     /**
      * 用户轨迹
      */
-    USER_LOG_GROUP("themis-group-exam-userLog"),
+    USER_LOG_GROUP,
 
     /**
      * 导入导出任务
      */
-    TASK_GROUP("themis-group-exam-task"),
+    TASK_GROUP,
 
     /**
      * 日志
      */
-    LOG_GROUP("themis-group-exam-log"),
+    LOG_GROUP,
 
     /**
      * websocket oe 考生 group
      */
-    WEBSOCKET_OE_GROUP("themis-group-exam-websocketOe"),
+    WEBSOCKET_OE_GROUP,
 
     /**
      * websocket oe 考生 group
      */
-    WEBSOCKET_OE_MOBILE_GROUP("themis-group-exam-websocketOeMobile"),
+    WEBSOCKET_OE_MOBILE_GROUP,
 
     /**
      * websocket超时退出 考生 group
      */
-    WEBSOCKET_DELAY_GROUP("themis-group-exam-websocketDelay"),
+    WEBSOCKET_DELAY_GROUP,
 
     /**
      * quartz 考场 group
      */
-    QUARTZ_GROUP("themis-group-exam-quartz"),
+    QUARTZ_GROUP,
 
     /**
      * 计算客观分
      */
-    CALCULATE_OBJECTIVE_SCORE_GROUP("themis-group-exam-calculateObjectiveScore"),
+    CALCULATE_OBJECTIVE_SCORE_GROUP,
 
     /**
      * 人脸验证
      */
-    FACE_VERIFY_SAVE_GROUP("themis-group-exam-faceVerifySave"),
+    FACE_VERIFY_SAVE_GROUP,
     /**
      * 活体验证
      */
-    LIVENESS_VERIFY_SAVE_GROUP("themis-group-exam-livenessVerifySave"),
+    LIVENESS_VERIFY_SAVE_GROUP,
 
     /**
      * 考试记录数据持久化
      */
-    EXAM_RECORD_PERSISTED_GROUP("themis-group-exam-examRecordPersisted"),
+    EXAM_RECORD_PERSISTED_GROUP,
     
     /**
      * 考试记录数据初始化
      */
-    EXAM_RECORD_INIT_GROUP("themis-group-exam-examRecordInit"),
+    EXAM_RECORD_INIT_GROUP,
     
     /**
      * 考试记录数据更新
      */
-    EXAM_RECORD_UPDATE_GROUP("themis-group-exam-examRecordUpdate"),
+    EXAM_RECORD_UPDATE_GROUP,
 	
 	/**
      * 考试重新算分
      */
-    SCORE_CALCULATE_GROUP("themis-group-exam-scoreCalculate"),
+    SCORE_CALCULATE_GROUP,
     /**
      * 考生数据更新
      */
-    EXAM_STUDENT_UPDATE_GROUP("themis-group-exam-examStudentUpdate"),
+    EXAM_STUDENT_UPDATE_GROUP,
 
     /**
      * 考试断点
      */
-    EXAM_BREAK_GROUP("themis-group-exam-examBreak"),
+    EXAM_BREAK_GROUP,
 
     /**
      * 考试断点延时消息
      */
-    EXAM_BREAK_DELAY_GROUP("themis-group-exam-examBreakDelay");
-
-    private MqGroupEnum(String code) {
-        this.code = code;
-    }
-
-    private String code;
-
-    public String getCode() {
-        return code;
-    }
+    EXAM_BREAK_DELAY_GROUP;
 }

+ 0 - 23
themis-business/src/main/java/com/qmth/themis/business/enums/MqTopicEnum.java

@@ -1,23 +0,0 @@
-package com.qmth.themis.business.enums;
-
-/**
- * @Description: mq topic enum
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/7/28
- */
-public enum MqTopicEnum {
-
-    THEMIS_TOPIC("themis-topic-exam");
-
-    private MqTopicEnum(String code) {
-        this.code = code;
-    }
-
-    private String code;
-
-    public String getCode() {
-        return code;
-    }
-}

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

@@ -1,27 +1,25 @@
 package com.qmth.themis.business.service.impl;
 
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.annotation.Resource;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
 import com.qmth.themis.business.service.CommonService;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.RedisUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @Description:
@@ -30,66 +28,69 @@ import com.qmth.themis.business.util.RedisUtil;
  */
 @Service
 public class CommonServiceImpl implements CommonService {
-	private final static Logger log = LoggerFactory.getLogger(CommonService.class);
+    private final static Logger log = LoggerFactory.getLogger(CommonService.class);
+
+    @Resource
+    TOeExamRecordService examRecordService;
+    @Resource
+    RedisUtil redisUtil;
 
-	@Resource
-	TOeExamRecordService examRecordService;
-	@Resource
-	RedisUtil redisUtil;
+    @Resource
+    MqDtoService mqDtoService;
 
-	@Resource
-	MqDtoService mqDtoService;
+    @Resource
+    MqUtil mqUtil;
 
-	@Override
-	public void persisted(Long recordId) {
-		String lockKey = SystemConstant.REDIS_LOCK_EXAM_RECORD_PERSISTED_PREFIX + recordId;
-		Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
-		if (!lock) {
-			log.info("persisted doing,request ignore recordId:"+recordId);
-			return;
-		}
+    @Override
+    public void persisted(Long recordId) {
+        String lockKey = SystemConstant.REDIS_LOCK_EXAM_RECORD_PERSISTED_PREFIX + recordId;
+        Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
+        if (!lock) {
+            log.info("persisted doing,request ignore recordId:" + recordId);
+            return;
+        }
 
-		try {
-			ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(recordId);
-			if (!ExamRecordStatusEnum.FINISHED.equals(status)) {
-				log.info("status error ,status:"+status.name()+" recordId:"+recordId);
-				return;
-			}
-			Double score = ExamRecordCacheUtil.getObjectiveScore(recordId);
-			if (score == null) {
-				log.info("score is null ,recordId:"+recordId);
-				//算分未完成的 发送10秒延迟消息
-				Map<String, Object> transMap = new HashMap<String, Object>();
-				transMap.put("recordId", recordId);
-				String level = "10s";
-				Integer time = SystemConstant.mqDelayLevel.get(level);
-				LocalDateTime dt = LocalDateTime.now();
-				dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
-				Map<String, Object> propMap = new HashMap<String, Object>();
-				propMap.put("timeOut", time);
-				propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-				MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(),
-						transMap, MqTagEnum.EXAM_RECORD_PERSISTED, recordId.toString(), propMap, recordId.toString());
+        try {
+            ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(recordId);
+            if (!ExamRecordStatusEnum.FINISHED.equals(status)) {
+                log.info("status error ,status:" + status.name() + " recordId:" + recordId);
+                return;
+            }
+            Double score = ExamRecordCacheUtil.getObjectiveScore(recordId);
+            if (score == null) {
+                log.info("score is null ,recordId:" + recordId);
+                //算分未完成的 发送10秒延迟消息
+                Map<String, Object> transMap = new HashMap<String, Object>();
+                transMap.put("recordId", recordId);
+                String level = "10s";
+                Integer time = SystemConstant.mqDelayLevel.get(level);
+                LocalDateTime dt = LocalDateTime.now();
+                dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
+                Map<String, Object> propMap = new HashMap<String, Object>();
+                propMap.put("timeOut", time);
+                propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
+                MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_RECORD_PERSISTED.name(),
+                        transMap, MqTagEnum.EXAM_RECORD_PERSISTED, recordId.toString(), propMap, recordId.toString());
 
-				mqDtoService.assembleSendAsyncDelayMsg(mqDto);
+                mqDtoService.assembleSendAsyncDelayMsg(mqDto);
 
-				return;
-			}
+                return;
+            }
 
-			log.info("start persisted,recordId:"+recordId);
-			examRecordService.saveDataByCache(recordId);
-			// 清除缓存
+            log.info("start persisted,recordId:" + recordId);
+            examRecordService.saveDataByCache(recordId);
+            // 清除缓存
 //			ExamActivityRecordCacheUtil.removeActivityRecordCache(ExamRecordCacheUtil.getExamActivityId(recordId),
 //					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));
-			log.info("end persisted,recordId:"+recordId);
-		} finally {
-			redisUtil.releaseLock(lockKey);
-		}
-	}
+            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));
+            log.info("end persisted,recordId:" + recordId);
+        } finally {
+            redisUtil.releaseLock(lockKey);
+        }
+    }
 
 }

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

@@ -100,6 +100,9 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
     @Resource
     TEExamPaperService examPaperService;
 
+    @Resource
+    MqUtil mqUtil;
+
     /**
      * 查询考试批次
      *
@@ -116,7 +119,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      */
     @Override
     public IPage<TEExamQueryDto> examQuery(IPage<Map> iPage, Long userId, Long id, String code, String name,
-            String mode, Integer enable, Long orgId, String type) {
+                                           String mode, Integer enable, Long orgId, String type) {
         return teExamMapper.examQuery(iPage, userId, id, code, name, mode, enable, orgId, type);
     }
 
@@ -280,12 +283,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 ExamRecordCacheUtil.setMinDurationSeconds(recordId, examCache.getMinDurationSeconds(), false);
                 ExamRecordCacheUtil.setMaxDurationSeconds(recordId, ac.getMaxDurationSeconds(), false);
                 ExamRecordCacheUtil.setForceFinish(recordId, examCache.getForceFinish(), false);
-                String[] columns = new String[] { ExamRecordFieldEnum.start_time.name(),
+                String[] columns = new String[]{ExamRecordFieldEnum.start_time.name(),
                         ExamRecordFieldEnum.end_time.name(), ExamRecordFieldEnum.opening_seconds.name(),
                         ExamRecordFieldEnum.min_duration_seconds.name(),
-                        ExamRecordFieldEnum.max_duration_seconds.name(), ExamRecordFieldEnum.force_finish.name() };
-                Object[] values = new Object[] { ac.getStartTime(), ac.getFinishTime(), ac.getOpeningSeconds(),
-                        examCache.getMinDurationSeconds(), ac.getMaxDurationSeconds(), examCache.getForceFinish() };
+                        ExamRecordFieldEnum.max_duration_seconds.name(), ExamRecordFieldEnum.force_finish.name()};
+                Object[] values = new Object[]{ac.getStartTime(), ac.getFinishTime(), ac.getOpeningSeconds(),
+                        examCache.getMinDurationSeconds(), ac.getMaxDurationSeconds(), examCache.getForceFinish()};
                 toeExamRecordService.dataUpdatesMq(recordId, columns, values);
                 return prepare;
             }
@@ -381,7 +384,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         transMap.put("examStudentId", examStudentId);
         transMap.put("alreadyExamCount", alreadyExamCount);
         transMap.put("currentRecordId", currentRecordId);
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), transMap,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), transMap,
                 MqTagEnum.EXAM_STUDNET_UPDATE, examStudentId.toString(), examStudentId.toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
@@ -492,14 +495,14 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 if (Objects.isNull(clientCameraStatus) || Objects
                         .equals(MonitorStatusSourceEnum.STOP, clientCameraStatus)) {
                     switch (strs[i]) {
-                    case "CLIENT_CAMERA":
-                        throw new BusinessException(ExceptionResultEnum.CLIENT_CAMERA_OFFLINE);
-                    case "CLIENT_SCREEN":
-                        throw new BusinessException(ExceptionResultEnum.CLIENT_SCREEN_OFFLINE);
-                    case "MOBILE_FIRST":
-                        throw new BusinessException(ExceptionResultEnum.MOBILE_FIRST_OFFLINE);
-                    default:
-                        throw new BusinessException(ExceptionResultEnum.MOBILE_SECOND_OFFLINE);
+                        case "CLIENT_CAMERA":
+                            throw new BusinessException(ExceptionResultEnum.CLIENT_CAMERA_OFFLINE);
+                        case "CLIENT_SCREEN":
+                            throw new BusinessException(ExceptionResultEnum.CLIENT_SCREEN_OFFLINE);
+                        case "MOBILE_FIRST":
+                            throw new BusinessException(ExceptionResultEnum.MOBILE_FIRST_OFFLINE);
+                        default:
+                            throw new BusinessException(ExceptionResultEnum.MOBILE_SECOND_OFFLINE);
                     }
                 }
             }
@@ -521,9 +524,9 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.ANSWERING, false);
         Long lastStartTime = System.currentTimeMillis();
         ExamRecordCacheUtil.setLastStartTime(recordId, lastStartTime, false);
-        String[] columns = new String[] { ExamRecordFieldEnum.first_start_time.name(),
-                ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_start_time.name() };
-        Object[] values = new Object[] { firstStartTime, ExamRecordStatusEnum.ANSWERING, lastStartTime };
+        String[] columns = new String[]{ExamRecordFieldEnum.first_start_time.name(),
+                ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_start_time.name()};
+        Object[] values = new Object[]{firstStartTime, ExamRecordStatusEnum.ANSWERING, lastStartTime};
         toeExamRecordService.dataUpdatesMq(recordId, columns, values);
         //更新场次-考试记录缓存
         ExamActivityRecordCacheUtil.setExamRecordStatus(activityId, recordId,
@@ -561,7 +564,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 Map<String, Object> prop = new HashMap<>();
                 prop.put("oper", "insert");
                 prop.put("exam", exam);
-                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT.name(),
+                MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_STUDENT.name(),
                         JacksonUtil.parseJson(examStudentCacheBean), MqTagEnum.EXAM_STUDENT, String.valueOf(recordId),
                         prop, es.getName());
                 mqDtoService.assembleSendOneWayMsg(mqDto);
@@ -609,7 +612,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      */
     @Override
     public AnswerSubmitBean answerSubmit(Long studentId, Long recordId, Integer mainNumber, Integer subNumber,
-            Integer subIndex, String answer, Long version, Integer durationSeconds) {
+                                         Integer subIndex, String answer, Long version, Integer durationSeconds) {
 
         // 校验当前登录用户和参数一致性
         if (ExamRecordCacheUtil.getId(recordId) == null) {
@@ -695,7 +698,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         transMap.put("subNumber", subNumber);
         transMap.put("subIndex", subIndex);
         // mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(),
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(),
                 transMap, MqTagEnum.CALCULATE_OBJECTIVE_SCORE, recordId.toString(), recordId.toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
@@ -705,7 +708,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      */
     @Override
     public AudioLeftPlayCountSubmitBean audioLeftPlayCountSubmit(Long studentId, Long recordId, String key,
-            Integer count) {
+                                                                 Integer count) {
 
         // 校验当前登录用户和参数一致性
         if (ExamRecordCacheUtil.getId(recordId) == null) {
@@ -854,9 +857,9 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         Long lastPrepareTime = System.currentTimeMillis();
         ExamRecordCacheUtil.setLastPrepareTime(recordId, lastPrepareTime, false);
         ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.RESUME_PREPARE, false);
-        String[] columns = new String[] { ExamRecordFieldEnum.last_prepare_time.name(),
-                ExamRecordFieldEnum.status.name() };
-        Object[] values = new Object[] { lastPrepareTime, ExamRecordStatusEnum.RESUME_PREPARE };
+        String[] columns = new String[]{ExamRecordFieldEnum.last_prepare_time.name(),
+                ExamRecordFieldEnum.status.name()};
+        Object[] values = new Object[]{lastPrepareTime, ExamRecordStatusEnum.RESUME_PREPARE};
         toeExamRecordService.dataUpdatesMq(recordId, columns, values);
         //更新场次-考试记录缓存
         ExamActivityRecordCacheUtil.setExamRecordStatus(es.getExamActivityId(), recordId,
@@ -1006,11 +1009,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         ExamRecordCacheUtil.setDurationSeconds(recordId, durationSeconds, false);
         ExamRecordCacheUtil.setFinishType(recordId, FinishTypeEnum.valueOf(type), false);
         ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.FINISHED, false);
-        String[] columns = new String[] { ExamRecordFieldEnum.finish_time.name(),
+        String[] columns = new String[]{ExamRecordFieldEnum.finish_time.name(),
                 ExamRecordFieldEnum.duration_seconds.name(), ExamRecordFieldEnum.finish_type.name(),
-                ExamRecordFieldEnum.status.name() };
-        Object[] values = new Object[] { finishTime, durationSeconds, FinishTypeEnum.valueOf(type),
-                ExamRecordStatusEnum.FINISHED };
+                ExamRecordFieldEnum.status.name()};
+        Object[] values = new Object[]{finishTime, durationSeconds, FinishTypeEnum.valueOf(type),
+                ExamRecordStatusEnum.FINISHED};
         toeExamRecordService.dataUpdatesMq(recordId, columns, values);
         //更新场次-考试记录缓存
         ExamActivityRecordCacheUtil.setExamRecordStatus(es.getExamActivityId(), recordId,
@@ -1023,7 +1026,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         //异步持久化
         checkToPersisted(recordId);
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(),
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.STUDENT.name(),
                 SystemOperationEnum.FINISHED, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()),
                 teStudentCacheDto.getIdentity());
         this.sendOeLogMessage(SystemOperationEnum.FINISHED, examStudentId, recordId, mqDto);
@@ -1051,7 +1054,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         Map<String, Object> propMap = new HashMap<String, Object>();
         propMap.put("timeOut", time);
         propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), transMap,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), transMap,
                 MqTagEnum.EXAM_RECORD_PERSISTED, recordId.toString(), propMap, recordId.toString());
 
         mqDtoService.assembleSendAsyncDelayMsg(mqDto);
@@ -1183,7 +1186,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      */
     @Override
     public void sendOeLogMessage(SystemOperationEnum systemOperationEnum, Long examStudentId, Long recordId,
-            MqDto mqDto) {
+                                 MqDto mqDto) {
         //mq发送消息start
         Map<String, Object> properties = new HashMap<>();
         properties.put("remark", systemOperationEnum.getCode());

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

@@ -21,10 +21,7 @@ import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEExamStudentService;
 import com.qmth.themis.business.service.TEMobileService;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.business.util.SessionUtil;
-import com.qmth.themis.business.util.TencentYunUtil;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.Platform;
 import com.qmth.themis.common.enums.Source;
@@ -54,6 +51,9 @@ public class TEMobileServiceImpl implements TEMobileService {
     @Resource
     MqDtoService mqDtoService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @Override
     public MobileAuthorizationBean authorization(MobileAuthorizationParamBean param) throws NoSuchAlgorithmException {
         MobileModeEnum mode = MobileModeEnum.valueOf(param.getMode().toUpperCase());
@@ -96,10 +96,10 @@ public class TEMobileServiceImpl implements TEMobileService {
         ret.setTime(System.currentTimeMillis());
         ret.setMode(mode);
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), platform.name(), tbSession,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), platform.name(), tbSession,
                 MqTagEnum.valueOf(platform.name()), tbSession.getId(), es.getIdentity());
         mqDtoService.assembleSendOneWayMsg(mqDto);
-        MqDto mqDtoLog = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(),
+        MqDto mqDtoLog = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.STUDENT.name(),
                 SystemOperationEnum.LOGIN, MqTagEnum.STUDENT, String.valueOf(es.getStudentId()), es.getIdentity());
         mqDtoService.assembleSendOneWayMsg(mqDtoLog);
         //mq发送消息end

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

@@ -19,6 +19,7 @@ import com.qmth.themis.business.entity.TOeExamAnswer;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.UidUtil;
@@ -85,6 +86,9 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     @Resource
     UidUtil uidUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     /**
      * 获取考试未完列表
      *
@@ -333,7 +337,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         Map<String, Object> propMap = new HashMap<String, Object>();
         propMap.put("timeOut", time);
         propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(),
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(),
                 transMap, MqTagEnum.CALCULATE_OBJECTIVE_SCORE, recordId.toString(), propMap, recordId.toString());
 
         mqDtoService.assembleSendAsyncDelayMsg(mqDto);
@@ -474,7 +478,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         transMap.put("colName", colName);
         transMap.put("colValue", colValue);
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), transMap,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_RECORD_UPDATE.name(), transMap,
                 MqTagEnum.EXAM_RECORD_UPDATE, recordId.toString(), colName);
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
@@ -507,7 +511,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         transMap.put("colNames", colNames);
         transMap.put("colValues", colValues);
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_UPDATE_COLUMNS.name(),
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_RECORD_UPDATE_COLUMNS.name(),
                 transMap, MqTagEnum.EXAM_RECORD_UPDATE_COLUMNS, recordId.toString(), recordId.toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
@@ -517,7 +521,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     public void dataInitMq(Map<String, Object> param) {
         Long id = (Long) param.get("id");
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), param,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_RECORD_INIT.name(), param,
                 MqTagEnum.EXAM_RECORD_INIT, id.toString(), id.toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
@@ -1035,7 +1039,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
                 TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
                 tOeExamRecordService.dataUpdatesMq(recordId, columns, values);
                 //考试断点异常原因 发送mq start
-                MqDto mqDtoBreak = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(),
+                MqDto mqDtoBreak = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_BREAK.name(),
                         ExceptionEnum.NET_TIME_OUT, MqTagEnum.EXAM_BREAK, String.valueOf(recordId),
                         String.valueOf(recordId));
                 MqDtoService mqDtoService = SpringContextHolder.getBean(MqDtoService.class);
@@ -1078,7 +1082,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
                     tranMap.put("timeOut", time);
                     tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
                     //考试断点延时消息 发送mq start
-                    MqDto mqDtoBreakDelay = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(),
+                    MqDto mqDtoBreakDelay = new MqDto(mqUtil.getMqGroupDomain().getTopic(),
                             MqTagEnum.EXAM_BREAK_DELAY.name(), MqTagEnum.EXAM_BREAK_DELAY, MqTagEnum.EXAM_BREAK_DELAY,
                             String.valueOf(recordId), tranMap, String.valueOf(recordId));
                     mqDtoService.assembleSendAsyncDelayMsg(mqDtoBreakDelay);

+ 12 - 26
themis-business/src/main/java/com/qmth/themis/business/util/MqUtil.java

@@ -21,35 +21,21 @@ import java.util.Map;
 public class MqUtil {
     private final static Logger log = LoggerFactory.getLogger(MqUtil.class);
 
-//    private MqGroupDomain mqOeGroupDomain;
-//
-//    private MqGroupDomain mqTaskGroupDomain;
-//
-//    @Bean
-//    public MqGroupDomain mqOeGroupDomainInit(MqConfigDomain mqConfigDomain) {
-//        Map<String, Object> map = new HashMap<>();
-//        map.putAll(mqConfigDomain.getGroup());
-//        mqOeGroupDomain = new MqGroupDomain(map);
-//        return mqOeGroupDomain;
-//    }
-//
-//    @Bean
-//    public MqGroupDomain mqTaskGroupDomainInit(MqConfigDomain mqConfigDomain) {
-//        Map<String, Object> map = new HashMap<>();
-//        map.putAll(mqConfigDomain.getGroup());
-//        mqTaskGroupDomain = new MqGroupDomain(map);
-//        return mqTaskGroupDomain;
-//    }
+    private MqGroupDomain mqGroupDomain;
+
+    @Bean
+    public MqGroupDomain mqGroupDomainInit(MqConfigDomain mqConfigDomain) {
+        Map<String, String> map = new HashMap<>();
+        map.putAll(mqConfigDomain.getMap());
+        mqGroupDomain = new MqGroupDomain(mqConfigDomain.getTopic(), map);
+        return mqGroupDomain;
+    }
 
     public static Logger getLog() {
         return log;
     }
 
-//    public MqGroupDomain getMqOeGroupDomain() {
-//        return mqOeGroupDomain;
-//    }
-//
-//    public MqGroupDomain getMqTaskGroupDomain() {
-//        return mqTaskGroupDomain;
-//    }
+    public MqGroupDomain getMqGroupDomain() {
+        return mqGroupDomain;
+    }
 }

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

@@ -17,6 +17,7 @@ import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TEExamService;
 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;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -50,6 +51,9 @@ public class TEExamController {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "验证考试口令接口")
     @RequestMapping(value = "/short_code", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "考试信息", response = TEExam.class)})
@@ -157,13 +161,13 @@ public class TEExamController {
                     ExamBreakCacheUtil.setBreakReason(breakId, exceptionEnum);
                     ExamBreakCacheUtil.setResumeReason(breakId, reason);
                     //考试断点异常原因 发送mq start
-                    MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXCEPTION_LOG.name(), JacksonUtil.parseJson(param), MqTagEnum.EXCEPTION_LOG, String.valueOf(param.getRecordId()), param.getReason());
+                    MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXCEPTION_LOG.name(), JacksonUtil.parseJson(param), MqTagEnum.EXCEPTION_LOG, String.valueOf(param.getRecordId()), param.getReason());
                     mqDtoService.assembleSendOneWayMsg(mqDto);
                     //考试断点异常原因 发送mq end
                 }
             } else {
                 //mq发送消息start
-                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.ANSWERING, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()), teStudent.getIdentity());
+                MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.STUDENT.name(), SystemOperationEnum.ANSWERING, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()), teStudent.getIdentity());
                 teExamService.sendOeLogMessage(SystemOperationEnum.ANSWERING, ExamRecordCacheUtil.getExamStudentId(param.getRecordId()), param.getRecordId(), mqDto);
                 //mq发送消息end
             }

+ 5 - 2
themis-exam/src/main/java/com/qmth/themis/exam/api/TEFaceController.java

@@ -4,9 +4,9 @@ import com.qmth.themis.business.bean.exam.FaceVerifyBean;
 import com.qmth.themis.business.bean.exam.FaceVerifyParamBean;
 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 com.qmth.themis.business.service.TOeFaceVerifyHistoryService;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
@@ -42,6 +42,9 @@ public class TEFaceController {
     @Resource
     MqDtoService mqDtoService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "人脸验证结果")
     @RequestMapping(value = "/verify", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "人脸验证信息")})
@@ -84,7 +87,7 @@ public class TEFaceController {
         transMap.put("time", param.getTime());
         transMap.put("exception", param.getException());
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), transMap, MqTagEnum.FACE_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.FACE_VERIFY_SAVE.name(), transMap, MqTagEnum.FACE_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         return ResultUtil.ok(ret);
     }

+ 65 - 65
themis-exam/src/main/java/com/qmth/themis/exam/api/TELivenessController.java

@@ -1,35 +1,32 @@
 package com.qmth.themis.exam.api;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.annotation.Resource;
-
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
-
 import com.qmth.themis.business.bean.exam.LivenessVerifyBean;
 import com.qmth.themis.business.bean.exam.LivenessVerifyParamBean;
+import com.qmth.themis.business.dto.MqDto;
+import com.qmth.themis.business.enums.MqTagEnum;
+import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TOeLivenessVerifyHistoryService;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.common.exception.BusinessException;
 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.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 活体验证
- * 
+ *
  * @Description:
  * @Author: xiatian
  * @Date: 2020-08-03
@@ -39,56 +36,59 @@ import io.swagger.annotations.ApiResponses;
 @RequestMapping("/${prefix.url.exam}/liveness")
 public class TELivenessController {
 
-	@Resource
-	TOeLivenessVerifyHistoryService livenessVerifyHistoryService;
+    @Resource
+    TOeLivenessVerifyHistoryService livenessVerifyHistoryService;
+
+    @Resource
+    MqDtoService mqDtoService;
 
-	@Resource
-	MqDtoService mqDtoService;
+    @Resource
+    MqUtil mqUtil;
 
-	@ApiOperation(value = "活体验证结果")
-	@RequestMapping(value = "/verify", method = RequestMethod.POST)
-	@ApiResponses({ @ApiResponse(code = 200, message = "活体验证信息") })
-	@Transactional
-	public Result verify(@RequestBody LivenessVerifyParamBean param) {
-		if (param.getRecordId() == null) {
-			throw new BusinessException("考试记录id不能为空");
-		}
-		if (param.getType() == null) {
-			throw new BusinessException("type不能为空");
-		}
-		if (param.getActions() == null) {
-			throw new BusinessException("动作详情不能为空");
-		}
-		if (param.getRetry() == null) {
-			throw new BusinessException("整体第几次重试不能为空");
-		}
-		if (param.getStartTime() == null) {
-			throw new BusinessException("验证开始时间不能为空");
-		}
-		if (param.getFinishTime() == null) {
-			throw new BusinessException("验证结束时间不能为空");
-		}
-		if (param.getException() == null) {
-			throw new BusinessException("验证异常不能为空");
-		}
+    @ApiOperation(value = "活体验证结果")
+    @RequestMapping(value = "/verify", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "活体验证信息")})
+    @Transactional
+    public Result verify(@RequestBody LivenessVerifyParamBean param) {
+        if (param.getRecordId() == null) {
+            throw new BusinessException("考试记录id不能为空");
+        }
+        if (param.getType() == null) {
+            throw new BusinessException("type不能为空");
+        }
+        if (param.getActions() == null) {
+            throw new BusinessException("动作详情不能为空");
+        }
+        if (param.getRetry() == null) {
+            throw new BusinessException("整体第几次重试不能为空");
+        }
+        if (param.getStartTime() == null) {
+            throw new BusinessException("验证开始时间不能为空");
+        }
+        if (param.getFinishTime() == null) {
+            throw new BusinessException("验证结束时间不能为空");
+        }
+        if (param.getException() == null) {
+            throw new BusinessException("验证异常不能为空");
+        }
 
-		LivenessVerifyBean ret = livenessVerifyHistoryService.verify(param.getRecordId(), param.getType(),
-				param.getActions(), param.getRetry(), param.getStartTime(), param.getFinishTime(),
-				param.getException());
-		Map<String, Object> transMap = new HashMap<String, Object>();
-		transMap.put("id", ret.getId());
-		transMap.put("recordId", param.getRecordId());
-		transMap.put("type", param.getType());
-		transMap.put("actions", param.getActions());
-		transMap.put("retry", param.getRetry());
-		transMap.put("startTime", param.getStartTime());
-		transMap.put("finishTime", param.getFinishTime());
-		transMap.put("exception", param.getException());
-		// mq发送消息start
-		MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), transMap,
-				MqTagEnum.LIVENESS_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
-		mqDtoService.assembleSendOneWayMsg(mqDto);
-		return ResultUtil.ok(ret);
-	}
+        LivenessVerifyBean ret = livenessVerifyHistoryService.verify(param.getRecordId(), param.getType(),
+                param.getActions(), param.getRetry(), param.getStartTime(), param.getFinishTime(),
+                param.getException());
+        Map<String, Object> transMap = new HashMap<String, Object>();
+        transMap.put("id", ret.getId());
+        transMap.put("recordId", param.getRecordId());
+        transMap.put("type", param.getType());
+        transMap.put("actions", param.getActions());
+        transMap.put("retry", param.getRetry());
+        transMap.put("startTime", param.getStartTime());
+        transMap.put("finishTime", param.getFinishTime());
+        transMap.put("exception", param.getException());
+        // mq发送消息start
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), transMap,
+                MqTagEnum.LIVENESS_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
+        mqDtoService.assembleSendOneWayMsg(mqDto);
+        return ResultUtil.ok(ret);
+    }
 
 }

+ 11 - 8
themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java

@@ -24,12 +24,12 @@ import com.qmth.themis.business.entity.TBOrg;
 import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.entity.TEConfig;
 import com.qmth.themis.business.entity.TEStudent;
-import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
+import com.qmth.themis.business.enums.MqTagEnum;
+import com.qmth.themis.business.enums.SystemOperationEnum;
+import com.qmth.themis.business.enums.WebsocketStatusEnum;
 import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.OssUtil;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.business.util.SessionUtil;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.Platform;
@@ -102,6 +102,9 @@ public class TEStudentController {
     @Resource
     TBOrgService tbOrgService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "学生登录接口")
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "学生信息", response = TEExamResultDto.class)})
@@ -224,10 +227,10 @@ public class TEStudentController {
                 ServletUtil.getRequest().getLocalAddr(), token, expireTime.getDate().getTime());
         redisUtil.setUserSession(sessionId, tbSession, expireTime.getExpireSeconds());
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), platform.name(), tbSession,
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), platform.name(), tbSession,
                 MqTagEnum.valueOf(platform.name()), tbSession.getId(), teStudent.getIdentity());
         mqDtoService.assembleSendOneWayMsg(mqDto);
-        MqDto mqDtoLog = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(),
+        MqDto mqDtoLog = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.STUDENT.name(),
                 SystemOperationEnum.LOGIN, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()),
                 teStudent.getIdentity());
         mqDtoService.assembleSendOneWayMsg(mqDtoLog);
@@ -314,7 +317,7 @@ public class TEStudentController {
             cacheService.removeStudentCache(teStudent.getId());
         }
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(),
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.STUDENT.name(),
                 SystemOperationEnum.LOGOUT, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()),
                 teStudent.getIdentity());
         mqDtoService.assembleSendOneWayMsg(mqDto);

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

@@ -9,6 +9,7 @@ import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.MqDtoService;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
@@ -48,6 +49,9 @@ public class TIeInvigilateCallMobileController {
     @Resource
     MqDtoService mqDtoService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "监控观看地址更新接口")
     @RequestMapping(value = "/live_url", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
@@ -81,7 +85,7 @@ public class TIeInvigilateCallMobileController {
             ExamRecordCacheUtil.setMonitorLiveUrl(recordId, source, liveUrl, true);
 
             //监考监控通话信息 发送mq start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //监考监控通话信息 发送mq end
         } catch (Exception e) {
@@ -129,7 +133,7 @@ public class TIeInvigilateCallMobileController {
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
         tIeExamInvigilateCallLog.setStartTime(System.currentTimeMillis());
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
@@ -179,7 +183,7 @@ public class TIeInvigilateCallMobileController {
         }
 
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
 
@@ -235,7 +239,7 @@ public class TIeInvigilateCallMobileController {
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         tIeExamInvigilateCallLog.setEndTime(System.currentTimeMillis());
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));

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

@@ -8,6 +8,7 @@ import com.qmth.themis.business.entity.TIeExamInvigilateCallLog;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
@@ -47,6 +48,9 @@ public class TIeInvigilateCallOeController {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
+    @Resource
+    MqUtil mqUtil;
+
     @ApiOperation(value = "监控观看地址更新接口")
     @RequestMapping(value = "/live_url", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
@@ -80,7 +84,7 @@ public class TIeInvigilateCallOeController {
             tOeExamRecordService.dataUpdatesMq(recordId, columns, values);
 
             //监考监控通话信息 发送mq start
-            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //监考监控通话信息 发送mq end
         } catch (Exception e) {
@@ -135,7 +139,7 @@ public class TIeInvigilateCallOeController {
         }
 
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         Map map = new HashMap();
@@ -174,7 +178,7 @@ public class TIeInvigilateCallOeController {
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
         tIeExamInvigilateCallLog.setStartTime(System.currentTimeMillis());
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
@@ -210,7 +214,7 @@ public class TIeInvigilateCallOeController {
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         tIeExamInvigilateCallLog.setEndTime(System.currentTimeMillis());
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/config/DictionaryConfig.java

@@ -109,7 +109,7 @@ public class DictionaryConfig {
      * @return
      */
     @Bean
-    @ConfigurationProperties(prefix = "mq", ignoreUnknownFields = false)
+    @ConfigurationProperties(prefix = "mq.config", ignoreUnknownFields = false)
     public MqConfigDomain mqConfigDomain() {
         return new MqConfigDomain();
     }

+ 6 - 4
themis-exam/src/main/java/com/qmth/themis/exam/start/StartRunning.java

@@ -4,11 +4,10 @@ import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.MqGroupEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
+import com.qmth.themis.exam.config.DictionaryConfig;
 import com.qmth.themis.exam.websocket.WebSocketMobileServer;
 import com.qmth.themis.exam.websocket.WebSocketOeServer;
 import com.qmth.themis.mq.listener.RocketMessageConsumer;
-import com.qmth.themis.mq.templete.impl.*;
 import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,14 +34,17 @@ public class StartRunning implements CommandLineRunner {
     @Value("${rocketmq.name-server}")
     String nameServer;
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
     @Override
     public void run(String... args) throws Exception {
         log.info("服务器启动时执行 start");
         /**
          * websocket mq start
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.WEBSOCKET_OE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_HARD_FINISH.name() + "||" + MqTagEnum.OE_IM_BROADCASTING.name() + "||" + MqTagEnum.OE_IM_CLUSTERING.name() + "||" + MqTagEnum.OE_LIVENESS_VERIFY.name() + "||" + MqTagEnum.OE_MONITOR_FINISH.name() + "||" + MqTagEnum.OE_WARNING_FINISH.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketOeServer.class));
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.WEBSOCKET_OE_MOBILE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STOP.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketMobileServer.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.WEBSOCKET_OE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.OE_HARD_FINISH.name() + "||" + MqTagEnum.OE_IM_BROADCASTING.name() + "||" + MqTagEnum.OE_IM_CLUSTERING.name() + "||" + MqTagEnum.OE_LIVENESS_VERIFY.name() + "||" + MqTagEnum.OE_MONITOR_FINISH.name() + "||" + MqTagEnum.OE_WARNING_FINISH.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketOeServer.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.WEBSOCKET_OE_MOBILE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_STOP.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketMobileServer.class));
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
     }

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

@@ -8,13 +8,13 @@ import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.entity.TBSession;
-import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
+import com.qmth.themis.business.enums.MqTagEnum;
+import com.qmth.themis.business.enums.WebsocketStatusEnum;
+import com.qmth.themis.business.enums.WebsocketTypeEnum;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TOeExamRecordService;
-import com.qmth.themis.business.util.AuthUtil;
-import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.util.WebsocketUtil;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.Platform;
@@ -132,6 +132,7 @@ public class WebSocketOeServer implements Concurrently {
                     log.info("超时退出");
                     //发送延时mq消息start
                     MqDtoService mqDtoService = SpringContextHolder.getBean(MqDtoService.class);
+                    MqUtil mqUtil = SpringContextHolder.getBean(MqUtil.class);
                     String level = "2m";
 //                    String level = "30s";
                     Integer time = SystemConstant.mqDelayLevel.get(level);
@@ -140,7 +141,7 @@ public class WebSocketOeServer implements Concurrently {
 //                    dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
                     tranMap.put("timeOut", time);
                     tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-                    MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MqTagEnum.OE_UN_NORMAL, MqTagEnum.OE_UN_NORMAL, String.valueOf(this.recordId), this.tranMap, this.sessionId);
+                    MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.OE_UN_NORMAL.name(), MqTagEnum.OE_UN_NORMAL, MqTagEnum.OE_UN_NORMAL, String.valueOf(this.recordId), this.tranMap, this.sessionId);
                     mqDtoService.assembleSendAsyncDelayMsg(mqDto);
                     //发送延时mq消息end
                 } else {

+ 20 - 3
themis-exam/src/main/resources/application.properties

@@ -120,9 +120,26 @@ rocketmq.producer.enable-msg-trace=true
 #rocketmq.producer.customized-trace-topic=my-trace-topic
 
 #mq topic\u548Cgroup\u914D\u7F6E
-#mq.config.map.topic=themis-topic-exam
-#mq.config.map.websocketOe=themis-group-exam-websocketOe
-#mq.config.map.websocketOeMobile=themis-group-exam-websocketOeMobile
+mq.config.topic=themis-topic-exam
+mq.config.map.SESSION_GROUP=themis-group-exam-session
+mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
+mq.config.map.LOG_GROUP=themis-group-exam-log
+mq.config.map.TASK_GROUP=themis-group-exam-task
+mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
+mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
+mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
+mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
+mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
+mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
+mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
+mq.config.map.EXAM_RECORD_INIT_GROUP=themis-group-exam-examRecordInit
+mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
+mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
+mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
+mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
+mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
+mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
+
 
 #\u963F\u91CC\u4E91OSS\u914D\u7F6E
 aliyun.oss.publicName=oss-cn-shenzhen.aliyuncs.com

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

@@ -19,6 +19,7 @@ import com.qmth.themis.business.templete.TaskExportTemplete;
 import com.qmth.themis.business.templete.TaskImportTemplete;
 import com.qmth.themis.business.templete.impl.*;
 import com.qmth.themis.business.util.JacksonUtil;
+import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.UidUtil;
 import com.qmth.themis.common.contanst.Constants;
@@ -112,6 +113,9 @@ public class MqLogicServiceImpl implements MqLogicService {
     @Resource
     UidUtil uidUtil;
 
+    @Resource
+    MqUtil mqUtil;
+
     /**
      * mq最大重试次数逻辑
      *
@@ -283,7 +287,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                                 true);
             }
             //发送移动端监考退出考试mq消息 start
-            MqDto mqDtoExamStop = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STOP.name(), recordId,
+            MqDto mqDtoExamStop = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_STOP.name(), recordId,
                     MqTagEnum.EXAM_STOP, String.valueOf(recordId), String.valueOf(recordId));
             mqDtoService.assembleSendOneWayMsg(mqDtoExamStop);
             //发送移动端监考退出考试mq消息 end
@@ -880,7 +884,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                             true);
         }
         //发送移动端监考退出考试mq消息 start
-        MqDto mqDtoExamStop = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STOP.name(), recordId,
+        MqDto mqDtoExamStop = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.EXAM_STOP.name(), recordId,
                 MqTagEnum.EXAM_STOP, String.valueOf(recordId), String.valueOf(recordId));
         mqDtoService.assembleSendOneWayMsg(mqDtoExamStop);
         //发送移动端监考退出考试mq消息 end

+ 21 - 18
themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java

@@ -1,12 +1,11 @@
 package com.qmth.themis.task.start;
 
 import com.qmth.themis.business.constant.SpringContextHolder;
-import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.MqGroupEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
-import com.qmth.themis.business.enums.MqTopicEnum;
 import com.qmth.themis.mq.listener.RocketMessageConsumer;
 import com.qmth.themis.mq.templete.impl.*;
+import com.qmth.themis.task.config.DictionaryConfig;
 import com.qmth.themis.task.enums.QuartzTaskEnum;
 import com.qmth.themis.task.listener.QuartzOrderlyImpl;
 import com.qmth.themis.task.quartz.MqActivityJob;
@@ -43,6 +42,9 @@ public class StartRunning implements CommandLineRunner {
     @Value("${rocketmq.name-server}")
     String nameServer;
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
     @Override
     public void run(String... args) throws Exception {
         log.info("服务器启动时执行 start");
@@ -63,50 +65,51 @@ public class StartRunning implements CommandLineRunner {
         /**
          * session
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.SESSION_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.SESSION_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
         /**
          * userLog
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.USER_LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.USER_LOG_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
         /**
          * log
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.LOG_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
         /**
          * task
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.TASK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name() + "||" + MqTagEnum.EXAM_STUDENT_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_SIMPLE_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_STANDARD_EXPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.TASK_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name() + "||" + MqTagEnum.EXAM_STUDENT_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_SIMPLE_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_STANDARD_EXPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
         /**
          * websocket mq start
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.WEBSOCKET_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.WEBSOCKET_DELAY_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
         /**
          * quartz mq start
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.QUARTZ_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name() + "||" + MqTagEnum.EXAM_STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(QuartzOrderlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.QUARTZ_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_ACTIVITY.name() + "||" + MqTagEnum.EXAM_STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(QuartzOrderlyImpl.class));
         //计算客观分
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.CALCULATE_OBJECTIVE_SCORE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
-
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.CALCULATE_OBJECTIVE_SCORE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
+        //重新算分
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.SCORE_CALCULATE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_SCORE_CALCULATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateScoreConcurrentlyImpl.class));
         //人脸验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.FACE_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.FACE_VERIFY_SAVE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
 
         //活体验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LIVENESS_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LivenessVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.LIVENESS_VERIFY_SAVE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LivenessVerifyConcurrentlyImpl.class));
 
         //考试记录数据持久化
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_PERSISTED_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.EXAM_RECORD_PERSISTED_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
 
         //考试记录数据更新
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name() + "||" + MqTagEnum.EXAM_RECORD_UPDATE_COLUMNS.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.EXAM_RECORD_UPDATE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_RECORD_UPDATE.name() + "||" + MqTagEnum.EXAM_RECORD_UPDATE_COLUMNS.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
         //考试记录数据初始化
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_INIT_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.EXAM_RECORD_INIT_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
 
         //考生数据更新
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_STUDENT_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamStudentUpdateConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.EXAM_STUDENT_UPDATE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamStudentUpdateConcurrentlyImpl.class));
 
         //考试断点
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK_DELAY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakDelayConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.EXAM_BREAK_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.EXAM_BREAK_DELAY_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_BREAK_DELAY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakDelayConcurrentlyImpl.class));
         log.info("服务器启动时执行 end");
     }
 }

+ 18 - 15
themis-task/src/main/resources/application.properties

@@ -179,21 +179,24 @@ rocketmq.producer.enable-msg-trace=true
 
 #mq topic\u548Cgroup\u914D\u7F6E
 mq.config.topic=themis-topic-exam
-mq.config.map.session=themis-group-exam-session
-mq.config.map.userLog=themis-group-exam-userLog
-mq.config.map.log=themis-group-exam-log
-mq.config.map.task=themis-group-exam-task
-mq.config.map.websocketDelay=themis-group-exam-websocketDelay
-mq.config.map.quartz=themis-group-exam-quartz
-mq.config.map.calculateObjectiveScore=themis-group-exam-calculateObjectiveScore
-mq.config.map.faceVerifySave=themis-group-exam-faceVerifySave
-mq.config.map.livenessVerifySave=themis-group-exam-livenessVerifySave
-mq.config.map.examRecordPersisted=themis-group-exam-examRecordPersisted
-mq.config.map.examRecordUpdate=themis-group-exam-examRecordUpdate
-mq.config.map.examRecordInit=themis-group-exam-examRecordInit
-mq.config.map.examStudentUpdate=themis-group-exam-examStudentUpdate
-mq.config.map.examBreak=themis-group-exam-examBreak
-mq.config.map.examBreakDelay=themis-group-exam-examBreakDelay
+mq.config.map.SESSION_GROUP=themis-group-exam-session
+mq.config.map.USER_LOG_GROUP=themis-group-exam-userLog
+mq.config.map.LOG_GROUP=themis-group-exam-log
+mq.config.map.TASK_GROUP=themis-group-exam-task
+mq.config.map.WEBSOCKET_DELAY_GROUP=themis-group-exam-websocketDelay
+mq.config.map.QUARTZ_GROUP=themis-group-exam-quartz
+mq.config.map.CALCULATE_OBJECTIVE_SCORE_GROUP=themis-group-exam-calculateObjectiveScore
+mq.config.map.FACE_VERIFY_SAVE_GROUP=themis-group-exam-faceVerifySave
+mq.config.map.LIVENESS_VERIFY_SAVE_GROUP=themis-group-exam-livenessVerifySave
+mq.config.map.EXAM_RECORD_PERSISTED_GROUP=themis-group-exam-examRecordPersisted
+mq.config.map.EXAM_RECORD_UPDATE_GROUP=themis-group-exam-examRecordUpdate
+mq.config.map.EXAM_RECORD_INIT_GROUP=themis-group-exam-examRecordInit
+mq.config.map.SCORE_CALCULATE_GROUP=themis-group-exam-scoreCalculate
+mq.config.map.EXAM_STUDENT_UPDATE_GROUP=themis-group-exam-examStudentUpdate
+mq.config.map.EXAM_BREAK_GROUP=themis-group-exam-examBreak
+mq.config.map.EXAM_BREAK_DELAY_GROUP=themis-group-exam-examBreakDelay
+mq.config.map.WEBSOCKET_OE_GROUP=themis-group-exam-websocketOe
+mq.config.map.WEBSOCKET_OE_MOBILE_GROUP=themis-group-exam-websocketOeMobile
 
 #\u817E\u8BAF\u4E91\u914D\u7F6E
 tencentyun.sdk.appId=1400411036