Browse Source

新增考试明细查看试卷

wangliang 3 years ago
parent
commit
5856220494
33 changed files with 925 additions and 135 deletions
  1. 9 4
      pom.xml
  2. 2 2
      themis-admin/pom.xml
  3. 7 3
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBAppVersionController.java
  4. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBClientVersionController.java
  5. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBExamInvigilateUserController.java
  6. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBOrgController.java
  7. 7 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBTaskHistoryController.java
  8. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TBUserController.java
  9. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java
  10. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java
  11. 12 1
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamCourseController.java
  12. 10 6
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamReexamController.java
  13. 38 7
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamStudentController.java
  14. 59 41
      themis-admin/src/main/java/com/qmth/themis/admin/api/TENotifyController.java
  15. 13 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEStudentController.java
  16. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateCallMobileController.java
  17. 12 8
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateController.java
  18. 6 2
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateWarnInfoController.java
  19. 31 22
      themis-admin/src/main/java/com/qmth/themis/admin/api/TIeReportController.java
  20. 10 6
      themis-business/pom.xml
  21. 82 0
      themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordAnswerBean.java
  22. 191 0
      themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordDetailBean.java
  23. 186 0
      themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordPaperViewBean.java
  24. 3 0
      themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java
  25. 24 0
      themis-business/src/main/java/com/qmth/themis/business/dao/TOeExamRecordMapper.java
  26. 33 0
      themis-business/src/main/java/com/qmth/themis/business/service/TOeExamRecordService.java
  27. 81 4
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java
  28. 50 0
      themis-business/src/main/resources/mapper/TOeExamRecordMapper.xml
  29. 2 2
      themis-common/pom.xml
  30. 2 2
      themis-exam/pom.xml
  31. 2 2
      themis-mq/pom.xml
  32. 9 3
      themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java
  33. 2 2
      themis-task/pom.xml

+ 9 - 4
pom.xml

@@ -4,7 +4,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.themis</groupId>
     <artifactId>themis-service</artifactId>
-    <version>1.1.1</version>
+    <version>1.1.2</version>
     <packaging>pom</packaging>
 
     <modules>
@@ -102,10 +102,15 @@
                 <artifactId>springfox-swagger2</artifactId>
                 <version>${swagger2.version}</version>
             </dependency>
+<!--            <dependency>-->
+<!--                <groupId>com.github.xiaoymin</groupId>-->
+<!--                <artifactId>swagger-bootstrap-ui</artifactId>-->
+<!--                <version>${swagger2-bootstrap.version}</version>-->
+<!--            </dependency>-->
             <dependency>
-                <groupId>com.github.xiaoymin</groupId>
-                <artifactId>swagger-bootstrap-ui</artifactId>
-                <version>${swagger2-bootstrap.version}</version>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger-ui</artifactId>
+                <version>${swagger2.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.alibaba</groupId>

+ 2 - 2
themis-admin/pom.xml

@@ -4,13 +4,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.themis.admin</groupId>
     <artifactId>themis-admin</artifactId>
-    <version>1.1.1</version>
+    <version>1.1.2</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.themis</groupId>
         <artifactId>themis-service</artifactId>
-        <version>1.1.1</version>
+        <version>1.1.2</version>
     </parent>
 
     <dependencies>

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

@@ -9,9 +9,12 @@ import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.Collections;
 
 /**
@@ -24,6 +27,7 @@ import java.util.Collections;
 @Api(tags = "移动端Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/app")
+@Validated
 public class TBAppVersionController {
     private final static Logger log = LoggerFactory.getLogger(TBAppVersionController.class);
 
@@ -35,14 +39,14 @@ public class TBAppVersionController {
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result save(@ApiParam(value = "移动端版本信息", required = true) @RequestBody TBAppVersion tbAppVersion) {
         tbAppVersionService.saveOrUpdate(tbAppVersion);
-        return ResultUtil.ok( true);
+        return ResultUtil.ok(true);
     }
 
     @ApiOperation(value = "移动端版本查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "移动端信息", response = TBAppVersion.class)})
-    public Result query(@ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result query(@ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(tbAppVersionService.appVersionQuery(new Page<>(pageNumber, pageSize)));
     }
 }

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

@@ -18,10 +18,13 @@ import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
@@ -36,6 +39,7 @@ import java.util.Objects;
 @Api(tags = "客户端Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/client")
+@Validated
 public class TBClientVersionController {
     private final static Logger log = LoggerFactory.getLogger(TBClientVersionController.class);
 
@@ -93,8 +97,8 @@ public class TBClientVersionController {
     @ApiOperation(value = "客户端版本查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "客户端信息", response = TBClientVersion.class)})
-    public Result query(@ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result query(@ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(tbClientVersionService.clientVersionQuery(new Page<>(pageNumber, pageSize)));
     }
 }

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

@@ -25,10 +25,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -42,6 +45,7 @@ import java.util.stream.Collectors;
 @Api(tags = "监考员设置Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/invigilateUser")
+@Validated
 public class TBExamInvigilateUserController {
 
     private final static Logger log = LoggerFactory.getLogger(TBExamInvigilateUserController.class);
@@ -70,8 +74,8 @@ public class TBExamInvigilateUserController {
     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 = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         return ResultUtil.ok(tbExamInvigilateUserService
                 .examInvigilateUserQuery(new Page<>(pageNumber, pageSize), examId, roomCode, userId,

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

@@ -21,9 +21,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.Map;
 import java.util.Objects;
 
@@ -37,6 +40,7 @@ import java.util.Objects;
 @Api(tags = "机构Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/org")
+@Validated
 public class TBOrgController {
 
     private final static Logger log = LoggerFactory.getLogger(TBOrgController.class);
@@ -56,8 +60,8 @@ public class TBOrgController {
     public Result queryByPage(@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 enable,
-                              @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                              @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                              @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                              @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(tbOrgService.queryByPage(new Page<>(pageNumber, pageSize), code, name, enable));
     }
 

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

@@ -1,6 +1,7 @@
 package com.qmth.themis.admin.api;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.response.TBTaskDto;
 import com.qmth.themis.business.entity.TBUser;
 import com.qmth.themis.business.enums.TaskStatusEnum;
@@ -10,12 +11,15 @@ import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 
 /**
  * @Description: 任务 前端控制器
@@ -27,6 +31,7 @@ import javax.annotation.Resource;
 @Api(tags = "任务Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/task")
+@Validated
 public class TBTaskHistoryController {
 
 	@Resource
@@ -40,8 +45,8 @@ public class TBTaskHistoryController {
 			@ApiParam(value = "业务对象id", required = false) @RequestParam(required = false) Long entityId,
 			@ApiParam(value = "任务类型", required = false) @RequestParam(required = false) TaskTypeEnum type,
 			@ApiParam(value = "任务状态", required = false) @RequestParam(required = false) TaskStatusEnum status,
-			@ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-			@ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+			@ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+			@ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
 		TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
 		return ResultUtil.ok(tbTaskHistoryService.taskQuery(new Page<>(pageNumber, pageSize), id, entityId, type,
 				status, tbUser.getOrgId(),examId));

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

@@ -31,9 +31,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.io.UnsupportedEncodingException;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
@@ -48,6 +51,7 @@ import java.util.*;
 @Api(tags = "用户Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/user")
+@Validated
 public class TBUserController {
 
     private final static Logger log = LoggerFactory.getLogger(TBUserController.class);
@@ -565,8 +569,8 @@ public class TBUserController {
                         @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                         @ApiParam(value = "角色", required = false) @RequestParam(required = false) String roleCode,
                         @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Integer enable,
-                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                        @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         IPage<TBUserDto> tbUserIPage = tbUserService
                 .userQuery(new Page<>(pageNumber, pageSize), id, loginName, name, roleCode, enable, tbUser.getOrgId());

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

@@ -4,8 +4,11 @@ import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -36,6 +39,7 @@ import io.swagger.annotations.ApiResponses;
 @Api(tags = "考试场次Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/activity")
+@Validated
 public class TEExamActivityController {
 
     @Resource
@@ -63,8 +67,8 @@ public class TEExamActivityController {
                         @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 = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(teExamActivityService
                 .examActivityQuery(new Page<>(pageNumber, pageSize), id, examId, code, startDate, finishDate));
     }

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

@@ -24,9 +24,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
@@ -42,6 +45,7 @@ import java.util.stream.Collectors;
 @Api(tags = "考试批次Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/exam")
+@Validated
 public class TEExamController {
 
     private final static Logger log = LoggerFactory.getLogger(TEExamController.class);
@@ -279,8 +283,8 @@ public class TEExamController {
                         @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 = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = cacheService.addAccountAuthCache(tbUser.getId());
         if (authDto.getRoleCodes().toString().contains(RoleEnum.INSPECTION.name())) {

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

@@ -2,6 +2,7 @@ package com.qmth.themis.admin.api;
 
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBUser;
 import com.qmth.themis.business.entity.TEExamCourse;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
@@ -16,9 +17,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.Objects;
 
 /**
@@ -31,6 +35,7 @@ import java.util.Objects;
 @Api(tags = "考试科目Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/exam")
+@Validated
 public class TEExamCourseController {
     private final static Logger log = LoggerFactory.getLogger(TEExamCourseController.class);
 
@@ -72,7 +77,13 @@ public class TEExamCourseController {
     @ApiOperation(value = "考试科目查询接口")
     @RequestMapping(value = "/course/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = TEExamCourse.class)})
-    public Result query(@ApiParam(value = "id", required = false) @RequestParam(required = false) Long id, @ApiParam(value = "考试批次id", required = true) @RequestParam Long examId, @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode, @ApiParam(value = "科目名称", required = false) @RequestParam(required = false) String courseName, @ApiParam(value = "是否已绑定试卷", required = false) @RequestParam(required = false) Integer hasPaper, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber, @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result query(@ApiParam(value = "id", required = false) @RequestParam(required = false) Long id,
+                        @ApiParam(value = "考试批次id", required = true) @RequestParam Long examId,
+                        @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
+                        @ApiParam(value = "科目名称", required = false) @RequestParam(required = false) String courseName,
+                        @ApiParam(value = "是否已绑定试卷", required = false) @RequestParam(required = false) Integer hasPaper,
+                        @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }

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

@@ -26,9 +26,12 @@ import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.*;
 
 /**
@@ -41,6 +44,7 @@ import java.util.*;
 @Api(tags = "考生重考处理Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/invigilate/reexam")
+@Validated
 public class TEExamReexamController {
     private final static Logger log = LoggerFactory.getLogger(TEExamReexamController.class);
 
@@ -252,8 +256,8 @@ public class TEExamReexamController {
                        @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
                        @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                        @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
-                       @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                       @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = cacheService.addAccountAuthCache(tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -277,8 +281,8 @@ public class TEExamReexamController {
                               @ApiParam(value = "申请开始时间", required = false) @RequestParam(required = false) Long reasonStartTime,
                               @ApiParam(value = "申请结束时间", required = false) @RequestParam(required = false) Long reasonEndTime,
                               @ApiParam(value = "申请人", required = false) @RequestParam(required = false) String applyName,
-                              @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                              @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                              @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                              @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         return ResultUtil.ok(teExamReexamService.reexamPageNotDoneList(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, courseCode, name, identity, reason, reasonStartTime, reasonEndTime, applyName, tbUser.getId(), tbUser.getOrgId()));
     }
@@ -305,8 +309,8 @@ public class TEExamReexamController {
                            @ApiParam(value = "申请开始时间", required = false) @RequestParam(required = false) Long reasonStartTime,
                            @ApiParam(value = "申请结束时间", required = false) @RequestParam(required = false) Long reasonEndTime,
                            @ApiParam(value = "申请人", required = false) @RequestParam(required = false) String applyName,
-                           @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                           @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                           @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                           @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         return ResultUtil.ok(teExamReexamService.reexamPageDoneList(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, courseCode, name, identity, auditingStatus, reasonStartTime, reasonEndTime, applyName, tbUser.getId(), tbUser.getOrgId()));
     }

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

@@ -1,13 +1,15 @@
 package com.qmth.themis.admin.api;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
-import com.qmth.themis.business.cache.bean.ExamCacheBean;
-import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
+import com.qmth.themis.business.cache.bean.*;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.response.MarkResultDto;
@@ -16,6 +18,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.JacksonUtil;
 import com.qmth.themis.business.util.MqUtil;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.ServletUtil;
@@ -28,11 +31,16 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -47,6 +55,7 @@ import java.util.stream.Collectors;
 @Api(tags = "考生库Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/examStudent")
+@Validated
 public class TEExamStudentController {
 
     private final static Logger log = LoggerFactory.getLogger(TEExamStudentController.class);
@@ -87,6 +96,28 @@ public class TEExamStudentController {
     @Resource
     MqUtil mqUtil;
 
+    @ApiOperation(value = "考试明细查询接口")
+    @RequestMapping(value = "/exam_record_detail/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考生信息", response = ExamRecordDetailBean.class)})
+    public Result examRecordDetailQuery(@ApiParam(value = "考试批次id", required = true) @RequestParam Long examId,
+                                        @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long activityId,
+                                        @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
+                                        @ApiParam(value = "考场编码", required = false) @RequestParam(required = false) String roomCode,
+                                        @ApiParam(value = "交卷方式", required = false) @RequestParam(required = false) FinishTypeEnum finishType,
+                                        @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
+                                        @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
+                                        @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
+        return ResultUtil.ok(tOeExamRecordService.examRecordDetailQuery(new Page<>(pageNumber, pageSize), examId, activityId, courseCode, roomCode, finishType, name, identity));
+    }
+
+    @ApiOperation(value = "考试明细查看试卷接口")
+    @RequestMapping(value = "/exam_record/paper_view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考生信息", response = ExamRecordPaperViewBean.class)})
+    public Result examRecordPaperView(@ApiParam(value = "考试记录id", required = true) @RequestParam Long examRecordId) throws IOException {
+        return ResultUtil.ok(tOeExamRecordService.examRecordPaperView(examRecordId));
+    }
+
     @ApiOperation(value = "考生导出")
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     public Result export(@ApiParam(value = "考试批次id", required = true) @RequestParam Long examId,
@@ -144,8 +175,8 @@ public class TEExamStudentController {
                         @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Integer enable,
                         @ApiParam(value = "教学班级", required = false) @RequestParam(required = false) String classNo,
                         @ApiParam(value = "底照是否上传", required = false) @RequestParam(required = false) Integer hasPhoto,
-                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                        @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -226,7 +257,7 @@ public class TEExamStudentController {
                     teStudentService.save(teStudent);
                     s.setStudentId(teStudent.getId());
                     s.setCreateId(tbUser.getId());
-                }else{//否则插入考生数据
+                } else {//否则插入考生数据
                     s.setStudentId(teStudent.getId());
                     s.setCreateId(tbUser.getId());
                 }
@@ -375,8 +406,8 @@ public class TEExamStudentController {
                              @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
                              @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                              @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
-                             @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                             @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                             @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }

+ 59 - 41
themis-admin/src/main/java/com/qmth/themis/admin/api/TENotifyController.java

@@ -2,9 +2,12 @@ package com.qmth.themis.admin.api;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.entity.TMTencentVideoMessage;
 import com.qmth.themis.business.entity.TOeExamRecord;
+import com.qmth.themis.business.service.TMTencentVideoMessageService;
 import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.TencentYunUtil;
@@ -49,6 +52,9 @@ public class TENotifyController {
     @Resource
     RedisUtil redisUtil;
 
+    @Resource
+    TMTencentVideoMessageService tencentVideoMessageService;
+
     @ApiOperation(value = "腾讯云视频接口回调")
     @RequestMapping(value = "/tencent", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
@@ -71,32 +77,50 @@ public class TENotifyController {
         //说明是录制视频回调成功
         if (Objects.nonNull(eventType) && Objects.equals(eventType, "100")) {
             String streamId = String.valueOf(jsonObject.get("stream_id"));
-            Long recordId = null;
-            if (Objects.nonNull(streamId)) {
-                String[] str = streamId.split("_");
-                recordId = Long.parseLong(str[2]);
-                String tencentVideoUrl = ExamRecordCacheUtil.getTencentVideoUrl(recordId);
-                if (Objects.nonNull(tencentVideoUrl)) {//说明缓存还在
-                    JSONArray jsonArrayDb = JSONArray.parseArray(tencentVideoUrl);
-                    int count = jsonArrayDb.size();
-                    JSONArray jsonArray = this.getVideoUrl(tencentVideoUrl, streamId, jsonObject);
-                    if (Objects.nonNull(jsonArray) && jsonArray.size() > 0 && count != jsonArray.size()) {
-                        ExamRecordCacheUtil.setTencentVideoUrl(recordId, jsonArray.toJSONString());
-                        tOeExamRecordService.sendExamRecordDataSaveMq(recordId, System.currentTimeMillis());
-                    }
-                } else {
-                    TOeExamRecord tOeExamRecord = tOeExamRecordService.getById(recordId);
-                    int count = 0;
-                    JSONArray jsonArrayDb = null;
-                    if (Objects.nonNull(tOeExamRecord.getTencentVideoUrl())) {
-                        jsonArrayDb = JSONArray.parseArray(tOeExamRecord.getTencentVideoUrl());
-                        count = jsonArrayDb.size();
-                    }
-                    JSONArray jsonArray = this.getVideoUrl(tOeExamRecord.getTencentVideoUrl(), streamId, jsonObject);
-                    if (Objects.nonNull(jsonArray) && jsonArray.size() > 0 && count != jsonArray.size()) {
-                        tOeExamRecord.setTencentVideoUrl(jsonArray.toJSONString());
-                        tOeExamRecordService.updateById(tOeExamRecord);
+            String videoSource = SystemConstant.getMonitorRecordStreamId(streamId);
+            boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_PREFIX + videoSource, SystemConstant.REDIS_LOCK_TENCENT_VIDEO_TIME_OUT);
+            if (lock) {
+                try {
+                    Long recordId = null;
+                    if (Objects.nonNull(streamId)) {
+                        String[] str = streamId.split("_");
+                        recordId = Long.parseLong(str[2]);
+                        String tencentVideoUrl = ExamRecordCacheUtil.getTencentVideoUrl(recordId);
+                        if (Objects.nonNull(tencentVideoUrl)) {//说明缓存还在
+                            JSONArray jsonArrayDb = JSONArray.parseArray(tencentVideoUrl);
+                            int count = jsonArrayDb.size();
+                            JSONArray jsonArray = this.getVideoUrl(tencentVideoUrl, videoSource, jsonObject);
+                            if (Objects.nonNull(jsonArray) && jsonArray.size() > 0 && count != jsonArray.size()) {
+                                if (Objects.nonNull(ExamRecordCacheUtil.getTencentVideoUrl(recordId)) && Objects.equals(tencentVideoUrl, ExamRecordCacheUtil.getTencentVideoUrl(recordId))) {
+                                    ExamRecordCacheUtil.setTencentVideoUrl(recordId, jsonArray.toJSONString());
+                                    tOeExamRecordService.sendExamRecordDataSaveMq(recordId, System.currentTimeMillis());
+                                }
+                            }
+                        } else {
+                            TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
+                            int count = 0;
+                            JSONArray jsonArrayDb = null;
+                            if (Objects.nonNull(tOeExamRecord.getTencentVideoUrl())) {
+                                jsonArrayDb = JSONArray.parseArray(tOeExamRecord.getTencentVideoUrl());
+                                count = jsonArrayDb.size();
+                            }
+                            JSONArray jsonArray = this.getVideoUrl(tOeExamRecord.getTencentVideoUrl(), videoSource, jsonObject);
+                            if (Objects.nonNull(jsonArray) && jsonArray.size() > 0 && count != jsonArray.size()) {
+                                String tencentViderUrl = tOeExamRecord.getTencentVideoUrl();
+                                UpdateWrapper<TOeExamRecord> updateWrapper = new UpdateWrapper<>();
+                                updateWrapper.lambda().eq(TOeExamRecord::getId, tOeExamRecord.getId());
+                                if (Objects.nonNull(tencentViderUrl) && !Objects.equals(tencentViderUrl.trim(), "")) {
+                                    updateWrapper.lambda().eq(TOeExamRecord::getTencentVideoUrl, tencentViderUrl);
+                                }
+                                updateWrapper.lambda().set(TOeExamRecord::getTencentVideoUrl, jsonArray.toJSONString());
+                                tOeExamRecordService.update(updateWrapper);
+                            }
+                        }
                     }
+                    TMTencentVideoMessage tencentVideoMessage = new TMTencentVideoMessage(SystemConstant.getUuid(), jsonObject.toJSONString());
+                    tencentVideoMessageService.save(tencentVideoMessage);
+                } finally {
+                    redisUtil.releaseLock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_PREFIX + videoSource);
                 }
             }
         }
@@ -107,11 +131,11 @@ public class TENotifyController {
      * 获取视频源地址
      *
      * @param tencentVideoUrl
-     * @param streamId
+     * @param videoSource
      * @param jsonObject
      * @return
      */
-    private JSONArray getVideoUrl(String tencentVideoUrl, String streamId, JSONObject jsonObject) {
+    private JSONArray getVideoUrl(String tencentVideoUrl, String videoSource, JSONObject jsonObject) {
         Map<String, String> map = new HashMap<>();
         JSONArray jsonArray = null;
         if (Objects.isNull(tencentVideoUrl)) {
@@ -121,21 +145,15 @@ public class TENotifyController {
         }
         for (int i = 0; i < jsonArray.size(); i++) {
             JSONObject json = (JSONObject) jsonArray.get(i);
-            String videoSource = SystemConstant.getMonitorRecordStreamId((String) json.get(SystemConstant.VIDEO_SOURCE));
-            map.put(videoSource, videoSource);
+            String videoSourceTemp = SystemConstant.getMonitorRecordStreamId((String) json.get(SystemConstant.VIDEO_SOURCE));
+            map.put(videoSourceTemp, videoSourceTemp);
         }
-        String videoSource = SystemConstant.getMonitorRecordStreamId(streamId);
-        boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_PREFIX + videoSource, SystemConstant.REDIS_LOCK_TENCENT_VIDEO_TIME_OUT);
-        if (lock && Objects.isNull(map.get(videoSource))) {
-            try {
-                String videoUrl = String.valueOf(jsonObject.get("video_url"));
-                JSONObject json = new JSONObject();
-                json.put(SystemConstant.VIDEO_SOURCE, videoSource);
-                json.put(SystemConstant.VIDEO_URL, videoUrl);
-                jsonArray.add(json);
-            } finally {
-                redisUtil.releaseLock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_PREFIX + videoSource);
-            }
+        if (Objects.isNull(map.get(videoSource))) {
+            String videoUrl = String.valueOf(jsonObject.get("video_url"));
+            JSONObject json = new JSONObject();
+            json.put(SystemConstant.VIDEO_SOURCE, videoSource);
+            json.put(SystemConstant.VIDEO_URL, videoUrl);
+            jsonArray.add(json);
         }
         return jsonArray;
     }

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

@@ -20,10 +20,13 @@ import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.Map;
 import java.util.Objects;
 
@@ -37,6 +40,7 @@ import java.util.Objects;
 @Api(tags = "学生档案Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/student")
+@Validated
 public class TEStudentController {
 
     @Resource
@@ -51,7 +55,11 @@ public class TEStudentController {
     @ApiOperation(value = "学生查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "考生信息", response = TEStudentDto.class)})
-    public Result query(@ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity, @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name, @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Integer enable, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber, @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result query(@ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
+                        @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
+                        @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Integer enable,
+                        @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                        @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         IPage<TEStudentDto> teExamStudentIPage = teStudentService.studentQuery(new Page<>(pageNumber, pageSize), identity, name, enable, tbUser.getOrgId());
         if (teExamStudentIPage.getRecords() != null && teExamStudentIPage.getRecords().size() > 0) {
@@ -123,7 +131,10 @@ public class TEStudentController {
     @ApiOperation(value = "学生考试记录查询接口")
     @RequestMapping(value = "/exam_record/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "学生考试记录信息", response = TOeExamRecord.class)})
-    public Result examRecordQuery(@ApiParam(value = "学生ID", required = true) @RequestParam Long studentId, @ApiParam(value = "考试id", required = false) @RequestParam(required = false) Long examId, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber, @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result examRecordQuery(@ApiParam(value = "学生ID", required = true) @RequestParam Long studentId,
+                                  @ApiParam(value = "考试id", required = false) @RequestParam(required = false) Long examId,
+                                  @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                  @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(studentId) || Objects.equals(studentId, "")) {
             throw new BusinessException(ExceptionResultEnum.STUDENT_ID_IS_NULL);
         }

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

@@ -29,9 +29,12 @@ import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.io.File;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
@@ -46,6 +49,7 @@ import java.util.*;
 @Api(tags = "mobile监考监控通话信息Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/monitor")
+@Validated
 public class TIeInvigilateCallMobileController {
     private final static Logger log = LoggerFactory.getLogger(TIeInvigilateCallMobileController.class);
 
@@ -84,8 +88,8 @@ public class TIeInvigilateCallMobileController {
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = TIeExamInvigilateCallDto.class)})
     public Result callList(@ApiParam(value = "考试批次id", required = true) @RequestParam(required = true) Long examId,
                            @ApiParam(value = "通话状态", required = false) @RequestParam(required = false) String callStatus,
-                           @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                           @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                           @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                           @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }

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

@@ -32,9 +32,12 @@ import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.io.File;
 import java.util.*;
 
@@ -48,6 +51,7 @@ import java.util.*;
 @Api(tags = "监考信息Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/invigilate")
+@Validated
 public class TIeInvigilateController {
     private final static Logger log = LoggerFactory.getLogger(TIeInvigilateController.class);
 
@@ -111,8 +115,8 @@ public class TIeInvigilateController {
                             @ApiParam(value = "屏幕监控设备推流状态('START'or'STOP')", required = false) @RequestParam(required = false) String screenMonitorStatus,
                             @ApiParam(value = "手机端主机位监控设备推流状态('START'or'STOP')", required = false) @RequestParam(required = false) String mobileFirstMonitorStatus,
                             @ApiParam(value = "手机端辅机位监控设备推流状态('START'or'STOP')", required = false) @RequestParam(required = false) String mobileSecondMonitorStatus,
-                            @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                            @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = cacheService.addAccountAuthCache(tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -239,8 +243,8 @@ public class TIeInvigilateController {
                               @ApiParam(value = "异常处理max", required = false) @RequestParam(required = false) Integer maxExceptionCount,
                               @ApiParam(value = "预警量min", required = false) @RequestParam(required = false) Integer minWarningCount,
                               @ApiParam(value = "预警量max", required = false) @RequestParam(required = false) Integer maxWarningCount,
-                              @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                              @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                              @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                              @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = cacheService.addAccountAuthCache(tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -381,8 +385,8 @@ public class TIeInvigilateController {
                              @ApiParam(value = "预警量min", required = false) @RequestParam(required = false) Integer minWarningCount,
                              @ApiParam(value = "预警量max", required = false) @RequestParam(required = false) Integer maxWarningCount,
                              @ApiParam(value = "客户端网络通信状态", required = false) @RequestParam(required = false) String clientWebsocketStatus,
-                             @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                             @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                             @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = cacheService.addAccountAuthCache(tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -423,8 +427,8 @@ public class TIeInvigilateController {
                                @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
                                @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
-                               @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                               @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                               @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                               @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = cacheService.addAccountAuthCache(tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场

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

@@ -21,9 +21,12 @@ import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.*;
 
 /**
@@ -36,6 +39,7 @@ import java.util.*;
 @Api(tags = "监考预警信息Controller")
 @RestController
 @RequestMapping("/${prefix.url.admin}/invigilate/warn")
+@Validated
 public class TIeInvigilateWarnInfoController {
 
     @Resource
@@ -79,8 +83,8 @@ public class TIeInvigilateWarnInfoController {
                        @ApiParam(value = "异常处理max", required = false) @RequestParam(required = false) Integer maxExceptionCount,
                        @ApiParam(value = "预警量min", required = false) @RequestParam(required = false) Integer minWarningCount,
                        @ApiParam(value = "预警量max", required = false) @RequestParam(required = false) Integer maxWarningCount,
-                       @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                       @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = cacheService.addAccountAuthCache(tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场

+ 31 - 22
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeReportController.java

@@ -1,6 +1,7 @@
 package com.qmth.themis.admin.api;
 
 import com.qmth.themis.business.bean.admin.InvigilateListPatrolReportBean;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBUser;
 import com.qmth.themis.business.service.TIeReportService;
 import com.qmth.themis.business.util.ServletUtil;
@@ -9,12 +10,15 @@ import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.util.Objects;
 
 /**
@@ -27,6 +31,7 @@ import java.util.Objects;
 @Api(tags = "监考报表")
 @RestController
 @RequestMapping("/${prefix.url.admin}/report")
+@Validated
 public class TIeReportController {
 
     @Resource
@@ -57,8 +62,8 @@ public class TIeReportController {
                                 @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                 @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                 @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity,
-                                @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                                @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -75,8 +80,8 @@ public class TIeReportController {
                                      @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                      @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                      @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity,
-                                     @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                     @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                                     @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                     @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -93,8 +98,8 @@ public class TIeReportController {
                                     @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                     @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                     @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity,
-                                    @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                    @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                                    @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                    @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -104,8 +109,9 @@ public class TIeReportController {
     @ApiOperation(value = "异常处理明细")
     @RequestMapping(value = "/exam_exception_list_detail", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
-    public Result examExceptionListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                          @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result examExceptionListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId,
+                                          @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                          @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(reportService.examExceptionDetailList(examStudentId, pageNumber, pageSize));
     }
 
@@ -118,8 +124,8 @@ public class TIeReportController {
                                  @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                  @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                  @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity,
-                                 @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                 @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                                 @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                 @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -135,8 +141,8 @@ public class TIeReportController {
                                  @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                  @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                  @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity,
-                                 @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                 @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                                 @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                 @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -146,8 +152,9 @@ public class TIeReportController {
     @ApiOperation(value = "违纪名单明细")
     @RequestMapping(value = "/exam_breach_list_detail", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
-    public Result examBreachListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                       @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result examBreachListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId,
+                                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(reportService.examBreachListDetail(examStudentId, 0, pageNumber, pageSize));
     }
 
@@ -160,8 +167,8 @@ public class TIeReportController {
                                        @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                        @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                        @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity,
-                                       @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                       @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -171,8 +178,9 @@ public class TIeReportController {
     @ApiOperation(value = "撤销违纪名单明细")
     @RequestMapping(value = "/exam_revoke_breach_list_detail", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
-    public Result examRevokeBreachListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result examRevokeBreachListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId,
+                                             @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                             @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(reportService.examRevokeBreachListDetail(examStudentId, 1, pageNumber, pageSize));
     }
 
@@ -185,8 +193,8 @@ public class TIeReportController {
                                      @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                      @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
                                      @ApiParam(value = "唯一码", required = false) @RequestParam(required = false) String identity,
-                                     @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                     @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+                                     @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                     @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         if (Objects.isNull(examId) || Objects.equals(examId, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
         }
@@ -196,8 +204,9 @@ public class TIeReportController {
     @ApiOperation(value = "考生日志明细")
     @RequestMapping(value = "/exam_student_log_list_detail", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
-    public Result examStudentLogListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId, @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                                           @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+    public Result examStudentLogListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId,
+                                           @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) int pageNumber,
+                                           @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) int pageSize) {
         return ResultUtil.ok(reportService.examStudentLogListDetail(examStudentId, pageNumber, pageSize));
     }
 

+ 10 - 6
themis-business/pom.xml

@@ -5,13 +5,13 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>com.qmth.themis.business</groupId>
 	<artifactId>themis-business</artifactId>
-	<version>1.1.1</version>
+	<version>1.1.2</version>
 	<packaging>jar</packaging>
 
 	<parent>
 		<groupId>com.qmth.themis</groupId>
 		<artifactId>themis-service</artifactId>
-		<version>1.1.1</version>
+		<version>1.1.2</version>
 	</parent>
 
 	<dependencies>
@@ -76,10 +76,14 @@
 			<groupId>io.springfox</groupId>
 			<artifactId>springfox-swagger2</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.github.xiaoymin</groupId>
-			<artifactId>swagger-bootstrap-ui</artifactId>
-		</dependency>
+<!--		<dependency>-->
+<!--			<groupId>com.github.xiaoymin</groupId>-->
+<!--			<artifactId>swagger-bootstrap-ui</artifactId>-->
+<!--		</dependency>-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
 		<dependency>
 			<groupId>com.alibaba</groupId>
 			<artifactId>druid</artifactId>

+ 82 - 0
themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordAnswerBean.java

@@ -0,0 +1,82 @@
+package com.qmth.themis.business.cache.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 考生作答bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/4/27
+ */
+public class ExamRecordAnswerBean implements Serializable {
+
+    @ApiModelProperty("大题号")
+    private Integer mainNumber;
+
+    @ApiModelProperty("小题号")
+    private Integer subNumber;
+
+    @ApiModelProperty("套题子题序号")
+    private Integer subIndex;
+
+    @ApiModelProperty(value = "分数")
+    private Double score;
+
+    @ApiModelProperty(value = "答案")
+    private String answer;
+
+    public ExamRecordAnswerBean() {
+
+    }
+
+    public ExamRecordAnswerBean(Integer mainNumber, Integer subNumber, Integer subIndex, Double score, String answer) {
+        this.mainNumber = mainNumber;
+        this.subNumber = subNumber;
+        this.subIndex = subIndex;
+        this.score = score;
+        this.answer = answer;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public Integer getSubIndex() {
+        return subIndex;
+    }
+
+    public void setSubIndex(Integer subIndex) {
+        this.subIndex = subIndex;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+}

+ 191 - 0
themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordDetailBean.java

@@ -0,0 +1,191 @@
+package com.qmth.themis.business.cache.bean;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.business.enums.FinishTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 考试明细bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/4/26
+ */
+public class ExamRecordDetailBean implements Serializable {
+
+    @ApiModelProperty(value = "考试记录id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examRecordId;
+
+    @ApiModelProperty(value = "考试批次id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "考试名称")
+    private String name;
+
+    @ApiModelProperty(value = "考场编码")
+    private String code;
+
+    @ApiModelProperty(value = "考场id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examActivityId;
+
+    @ApiModelProperty(value = "考生名称")
+    private String examStudentName;
+
+    @ApiModelProperty(value = "考生身份证")
+    private String identity;
+
+    @ApiModelProperty(value = "科目编码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "科目名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "考场编码")
+    private String roomCode;
+
+    @ApiModelProperty(value = "考场名称")
+    private String roomName;
+
+    @ApiModelProperty(value = "进入考试时间")
+    private Long firstStartTime;
+
+    @ApiModelProperty(value = "结束考试时间")
+    private Long finishTime;
+
+    @ApiModelProperty(value = "交卷方式")
+    private FinishTypeEnum finishType;
+
+    @ApiModelProperty(value = "交卷方式")
+    private String finishTypeStr;
+
+    public Long getExamRecordId() {
+        return examRecordId;
+    }
+
+    public void setExamRecordId(Long examRecordId) {
+        this.examRecordId = examRecordId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Long getExamActivityId() {
+        return examActivityId;
+    }
+
+    public void setExamActivityId(Long examActivityId) {
+        this.examActivityId = examActivityId;
+    }
+
+    public String getExamStudentName() {
+        return examStudentName;
+    }
+
+    public void setExamStudentName(String examStudentName) {
+        this.examStudentName = examStudentName;
+    }
+
+    public String getIdentity() {
+        return identity;
+    }
+
+    public void setIdentity(String identity) {
+        this.identity = identity;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getRoomCode() {
+        return roomCode;
+    }
+
+    public void setRoomCode(String roomCode) {
+        this.roomCode = roomCode;
+    }
+
+    public String getRoomName() {
+        return roomName;
+    }
+
+    public void setRoomName(String roomName) {
+        this.roomName = roomName;
+    }
+
+    public Long getFirstStartTime() {
+        return firstStartTime;
+    }
+
+    public void setFirstStartTime(Long firstStartTime) {
+        this.firstStartTime = firstStartTime;
+    }
+
+    public Long getFinishTime() {
+        return finishTime;
+    }
+
+    public void setFinishTime(Long finishTime) {
+        this.finishTime = finishTime;
+    }
+
+    public FinishTypeEnum getFinishType() {
+        return finishType;
+    }
+
+    public void setFinishType(FinishTypeEnum finishType) {
+        this.finishType = finishType;
+    }
+
+    public String getFinishTypeStr() {
+        if (Objects.nonNull(finishType)) {
+            return finishType.getCode();
+        } else {
+            return finishTypeStr;
+        }
+    }
+
+    public void setFinishTypeStr(String finishTypeStr) {
+        this.finishTypeStr = finishTypeStr;
+    }
+}

+ 186 - 0
themis-business/src/main/java/com/qmth/themis/business/cache/bean/ExamRecordPaperViewBean.java

@@ -0,0 +1,186 @@
+package com.qmth.themis.business.cache.bean;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.business.bean.admin.OpenRecordAnswerBean;
+import com.qmth.themis.business.enums.FinishTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: 考试明细查看试卷bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/4/26
+ */
+public class ExamRecordPaperViewBean implements Serializable {
+
+    @ApiModelProperty(value = "考试记录id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examRecordId;
+
+    @ApiModelProperty(value = "考生名称")
+    private String examStudentName;
+
+    @ApiModelProperty(value = "考生身份证")
+    private String identity;
+
+    @ApiModelProperty(value = "科目编码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "科目名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "考场编码")
+    private String roomCode;
+
+    @ApiModelProperty(value = "考场名称")
+    private String roomName;
+
+    @ApiModelProperty(value = "交卷方式")
+    private FinishTypeEnum finishType;
+
+    @ApiModelProperty(value = "交卷方式")
+    private String finishTypeStr;
+
+    @ApiModelProperty(value = "试卷结构json")
+    private String paperStructJson;
+
+    @ApiModelProperty(value = "标答json")
+    private String answerJson;
+
+    @ApiModelProperty(value = "答题记录json")
+    private String examStudentAnswerJson;
+
+    public ExamRecordPaperViewBean() {
+
+    }
+
+    public ExamRecordPaperViewBean(Long examRecordId,
+                                   String examStudentName,
+                                   String identity,
+                                   String courseCode,
+                                   String courseName,
+                                   String roomCode,
+                                   String roomName,
+                                   FinishTypeEnum finishType,
+                                   String paperStructJson,
+                                   String answerJson,
+                                   String examStudentAnswerJson) {
+        this.examRecordId = examRecordId;
+        this.examStudentName = examStudentName;
+        this.identity = identity;
+        this.courseCode = courseCode;
+        this.courseName = courseName;
+        this.roomCode = roomCode;
+        this.roomName = roomName;
+        this.finishType = finishType;
+        this.paperStructJson = paperStructJson;
+        this.answerJson = answerJson;
+        this.examStudentAnswerJson = examStudentAnswerJson;
+    }
+
+    public String getPaperStructJson() {
+        return paperStructJson;
+    }
+
+    public void setPaperStructJson(String paperStructJson) {
+        this.paperStructJson = paperStructJson;
+    }
+
+    public String getAnswerJson() {
+        return answerJson;
+    }
+
+    public void setAnswerJson(String answerJson) {
+        this.answerJson = answerJson;
+    }
+
+    public String getExamStudentAnswerJson() {
+        return examStudentAnswerJson;
+    }
+
+    public void setExamStudentAnswerJson(String examStudentAnswerJson) {
+        this.examStudentAnswerJson = examStudentAnswerJson;
+    }
+
+    public String getFinishTypeStr() {
+        if (Objects.nonNull(finishType)) {
+            return finishType.getCode();
+        } else {
+            return finishTypeStr;
+        }
+    }
+
+    public Long getExamRecordId() {
+        return examRecordId;
+    }
+
+    public void setExamRecordId(Long examRecordId) {
+        this.examRecordId = examRecordId;
+    }
+
+    public String getExamStudentName() {
+        return examStudentName;
+    }
+
+    public void setExamStudentName(String examStudentName) {
+        this.examStudentName = examStudentName;
+    }
+
+    public String getIdentity() {
+        return identity;
+    }
+
+    public void setIdentity(String identity) {
+        this.identity = identity;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getRoomCode() {
+        return roomCode;
+    }
+
+    public void setRoomCode(String roomCode) {
+        this.roomCode = roomCode;
+    }
+
+    public String getRoomName() {
+        return roomName;
+    }
+
+    public void setRoomName(String roomName) {
+        this.roomName = roomName;
+    }
+
+    public FinishTypeEnum getFinishType() {
+        return finishType;
+    }
+
+    public void setFinishType(FinishTypeEnum finishType) {
+        this.finishType = finishType;
+    }
+
+    public void setFinishTypeStr(String finishTypeStr) {
+        this.finishTypeStr = finishTypeStr;
+    }
+}

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

@@ -93,6 +93,9 @@ public class SystemConstant {
     /**
      * 系统相关
      */
+    public static final int PAGE_SIZE_MIN = 10;
+    public static final int PAGE_SIZE_MAX = 1000;
+    public static final int PAGE_NUMBER_MIN = 0;
     public static final String STATUS = "status";
 
     public static final String EXAM_ID = "examId";

+ 24 - 0
themis-business/src/main/java/com/qmth/themis/business/dao/TOeExamRecordMapper.java

@@ -3,8 +3,10 @@ package com.qmth.themis.business.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.themis.business.bean.admin.*;
+import com.qmth.themis.business.cache.bean.ExamRecordDetailBean;
 import com.qmth.themis.business.dto.response.TEExamUnFinishDto;
 import com.qmth.themis.business.entity.TOeExamRecord;
+import com.qmth.themis.business.enums.FinishTypeEnum;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -423,4 +425,26 @@ public interface TOeExamRecordMapper extends BaseMapper<TOeExamRecord> {
      * @return
      */
     List<Integer> findByViewAdmin(@Param("orgId") Long orgId, @Param("examId") Long examId, @Param("examActivityId") Long examActivityId, @Param("roomCode") String roomCode, @Param("courseCode") String courseCode);
+
+    /**
+     * 考试明细查询接口
+     *
+     * @param iPage
+     * @param examId
+     * @param examActivityId
+     * @param courseCode
+     * @param roomCode
+     * @param finishType
+     * @param name
+     * @param identity
+     * @return
+     */
+    public IPage<ExamRecordDetailBean> examRecordDetailQuery(IPage<Map> iPage,
+                                                             @Param("examId") Long examId,
+                                                             @Param("examActivityId") Long examActivityId,
+                                                             @Param("courseCode") String courseCode,
+                                                             @Param("roomCode") String roomCode,
+                                                             @Param("finishType") String finishType,
+                                                             @Param("name") String name,
+                                                             @Param("identity") String identity);
 }

+ 33 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TOeExamRecordService.java

@@ -3,10 +3,13 @@ package com.qmth.themis.business.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.themis.business.bean.admin.*;
+import com.qmth.themis.business.cache.bean.ExamRecordDetailBean;
+import com.qmth.themis.business.cache.bean.ExamRecordPaperViewBean;
 import com.qmth.themis.business.dto.response.MarkResultDto;
 import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.*;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -458,4 +461,34 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
      * @return
      */
     List<Integer> findByViewAdmin(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode);
+
+    /**
+     * 考试明细查询接口
+     *
+     * @param iPage
+     * @param examId
+     * @param examActivityId
+     * @param courseCode
+     * @param roomCode
+     * @param finishType
+     * @param name
+     * @param identity
+     * @return
+     */
+    public IPage<ExamRecordDetailBean> examRecordDetailQuery(IPage<Map> iPage,
+                                                             Long examId,
+                                                             Long examActivityId,
+                                                             String courseCode,
+                                                             String roomCode,
+                                                             FinishTypeEnum finishType,
+                                                             String name,
+                                                             String identity);
+
+    /**
+     * 查看试卷
+     *
+     * @param examRecordId
+     * @return
+     */
+    public ExamRecordPaperViewBean examRecordPaperView(Long examRecordId) throws IOException;
 }

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

@@ -1,9 +1,12 @@
 package com.qmth.themis.business.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
 import com.qmth.themis.business.bean.admin.*;
 import com.qmth.themis.business.bean.status.ClientWebsocketStatusBean;
@@ -24,10 +27,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;
+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.FileUtil;
@@ -41,7 +41,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.io.File;
+import java.io.IOException;
 import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -96,6 +98,12 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     @Resource
     TGErrorService tgErrorService;
 
+    @Resource
+    TEExamPaperService teExamPaperService;
+
+    @Resource
+    TOeExamAnswerService tOeExamAnswerService;
+
     /**
      * 获取考试未完列表
      *
@@ -1344,6 +1352,75 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         return tOeExamRecordMapper.findByViewAdmin(orgId, examId, examActivityId, roomCode, courseCode);
     }
 
+    /**
+     * 考试明细查询接口
+     *
+     * @param iPage
+     * @param examId
+     * @param examActivityId
+     * @param courseCode
+     * @param roomCode
+     * @param finishType
+     * @param name
+     * @param identity
+     * @return
+     */
+    @Override
+    public IPage<ExamRecordDetailBean> examRecordDetailQuery(IPage<Map> iPage, Long examId, Long examActivityId, String courseCode, String roomCode, FinishTypeEnum finishType, String name, String identity) {
+        return tOeExamRecordMapper.examRecordDetailQuery(iPage, examId, examActivityId, courseCode, roomCode, Objects.nonNull(finishType) ? finishType.name() : null, name, identity);
+    }
+
+    /**
+     * 查看试卷
+     *
+     * @param examRecordId
+     * @return
+     */
+    @Override
+    public ExamRecordPaperViewBean examRecordPaperView(Long examRecordId) throws IOException {
+        TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(examRecordId);
+        Optional.ofNullable(tOeExamRecord).orElseThrow(() -> new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD));
+
+        ExamPaperCacheBean teExamPaper = teExamPaperService.getExamPaperCacheBean(tOeExamRecord.getPaperId());
+        Optional.ofNullable(teExamPaper).orElseThrow(() -> new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_PAPER));
+
+        ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(tOeExamRecord.getExamStudentId());
+        Optional.ofNullable(examStudentCacheBean).orElseThrow(() -> new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_STUDENT));
+
+        JSONObject paperStructJson = null, answerJson = null;
+        String examStudentAnswerJson = null;
+        if (Objects.nonNull(teExamPaper.getPaperViewPath())) {
+            //获取试卷结构json
+            paperStructJson = JSONObject.parseObject(new String(ossUtil.download(false, teExamPaper.getPaperViewPath()), StandardCharsets.UTF_8));
+        }
+        if (Objects.nonNull(teExamPaper.getAnswerPath())) {
+            //获取答案结构json
+            answerJson = JSONObject.parseObject(new String(ossUtil.download(false, teExamPaper.getAnswerPath()), StandardCharsets.UTF_8));
+        }
+
+        QueryWrapper<TOeExamAnswer> tOeExamAnswerQueryWrapper = new QueryWrapper<>();
+        tOeExamAnswerQueryWrapper.lambda().eq(TOeExamAnswer::getExamRecordId, tOeExamRecord.getId())
+                .orderByAsc(TOeExamAnswer::getMainNumber, TOeExamAnswer::getSubNumber, TOeExamAnswer::getSubIndex);
+        List<TOeExamAnswer> tOeExamAnswerList = tOeExamAnswerService.list(tOeExamAnswerQueryWrapper);
+
+        if (Objects.nonNull(tOeExamAnswerList) && tOeExamAnswerList.size() > 0) {
+            List<ExamRecordAnswerBean> examRecordAnswerBeanList = new Gson().fromJson(JacksonUtil.parseJson(tOeExamAnswerList), new TypeToken<List<ExamRecordAnswerBean>>() {
+            }.getType());
+            examStudentAnswerJson = JacksonUtil.parseJson(examRecordAnswerBeanList);
+        }
+        return new ExamRecordPaperViewBean(tOeExamRecord.getId(),
+                examStudentCacheBean.getName(),
+                examStudentCacheBean.getIdentity(),
+                examStudentCacheBean.getCourseCode(),
+                examStudentCacheBean.getCourseName(),
+                examStudentCacheBean.getRoomCode(),
+                examStudentCacheBean.getRoomName(),
+                tOeExamRecord.getFinishType(),
+                paperStructJson.toJSONString(),
+                answerJson.toJSONString(),
+                examStudentAnswerJson);
+    }
+
     /**
      * 取最高分
      *

+ 50 - 0
themis-business/src/main/resources/mapper/TOeExamRecordMapper.xml

@@ -1186,4 +1186,54 @@
         where
         t.id = toer.exam_student_id)
     </select>
+
+    <select id="examRecordDetailQuery" resultType="com.qmth.themis.business.cache.bean.ExamRecordDetailBean">
+        select
+        toer.id as examRecordId,
+        tee.id as examId,
+        tee.name,
+        teea.code,
+        teea.id as examActivityId,
+        tees.name as examStudentName,
+        tees.`identity`,
+        tees.course_code as courseCode,
+        tees.course_name as courseName,
+        tees.room_code as roomCode,
+        tees.room_name as roomName,
+        toer.first_start_time as firstStartTime,
+        toer.finish_time as finishTime,
+        toer.finish_type as finishType
+        from
+        t_oe_exam_record toer
+        join t_e_exam tee on
+        tee.id = toer.exam_id
+        join t_e_exam_activity teea on
+        teea.exam_id = tee.id
+        join t_e_exam_student tees on
+        tees.id = toer.exam_student_id
+        <where>
+            <if test="examId != null and examId != ''">
+                and toer.exam_id = #{examId}
+            </if>
+            <if test="examActivityId != null and examActivityId != ''">
+                and teea.id = #{examActivityId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and tees.course_code = #{courseCode}
+            </if>
+            <if test="roomCode != null and roomCode != ''">
+                and tees.room_code = #{roomCode}
+            </if>
+            <if test="finishType != null and finishType != ''">
+                and toer.finish_type = #{finishType}
+            </if>
+            <if test="name != null and name !=''">
+                and tees.name like CONCAT('%', #{name},'%')
+            </if>
+            <if test="identity != null and identity !=''">
+                and tees.identity like CONCAT('%', #{identity},'%')
+            </if>
+        </where>
+        order by tees.id
+    </select>
 </mapper>

+ 2 - 2
themis-common/pom.xml

@@ -5,13 +5,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.themis.common</groupId>
     <artifactId>themis-common</artifactId>
-    <version>1.1.1</version>
+    <version>1.1.2</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.themis</groupId>
         <artifactId>themis-service</artifactId>
-        <version>1.1.1</version>
+        <version>1.1.2</version>
     </parent>
 
     <dependencies>

+ 2 - 2
themis-exam/pom.xml

@@ -4,13 +4,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.themis.exam</groupId>
     <artifactId>themis-exam</artifactId>
-    <version>1.1.1</version>
+    <version>1.1.2</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.themis</groupId>
         <artifactId>themis-service</artifactId>
-        <version>1.1.1</version>
+        <version>1.1.2</version>
     </parent>
 
     <dependencies>

+ 2 - 2
themis-mq/pom.xml

@@ -4,13 +4,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.themis.mq</groupId>
     <artifactId>themis-mq</artifactId>
-    <version>1.1.1</version>
+    <version>1.1.2</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.themis</groupId>
         <artifactId>themis-service</artifactId>
-        <version>1.1.1</version>
+        <version>1.1.2</version>
     </parent>
 
     <dependencies>

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

@@ -297,7 +297,7 @@ public class MqLogicServiceImpl implements MqLogicService {
     public void execMqTencentVideoLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException, IOException {
         Map<String, Object> tranMap = mqDto.getProperties();
         Long recordId = Long.parseLong(String.valueOf(tranMap.get(SystemConstant.RECORD_ID)));
-        TOeExamRecord tOeExamRecord = tOeExamRecordService.getById(recordId);
+        TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
         List<String> monitorRecordList = Arrays.asList(tOeExamRecord.getMonitorRecord().trim().toUpperCase().split(","));
         String[] streamIds = new String[monitorRecordList.size()];
         for (int i = 0; i < monitorRecordList.size(); i++) {
@@ -344,8 +344,14 @@ public class MqLogicServiceImpl implements MqLogicService {
                     }
                 }
                 if (Objects.nonNull(jsonArray) && jsonArray.size() > 0 && countDb != jsonArray.size()) {
-                    tOeExamRecord.setTencentVideoUrl(jsonArray.toJSONString());
-                    tOeExamRecordService.updateById(tOeExamRecord);
+                    String tencentViderUrl = tOeExamRecord.getTencentVideoUrl();
+                    UpdateWrapper<TOeExamRecord> updateWrapper = new UpdateWrapper<>();
+                    updateWrapper.lambda().eq(TOeExamRecord::getId, tOeExamRecord.getId());
+                    if (Objects.nonNull(tencentViderUrl) && !Objects.equals(tencentViderUrl.trim(), "")) {
+                        updateWrapper.lambda().eq(TOeExamRecord::getTencentVideoUrl, tencentViderUrl);
+                    }
+                    updateWrapper.lambda().set(TOeExamRecord::getTencentVideoUrl, jsonArray.toJSONString());
+                    tOeExamRecordService.update(updateWrapper);
                 }
                 TMTencentVideoMessage tencentVideoMessage = new TMTencentVideoMessage(response.getRequestId(), JacksonUtil.parseJson(response));
                 tencentVideoMessageService.save(tencentVideoMessage);

+ 2 - 2
themis-task/pom.xml

@@ -4,13 +4,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.qmth.themis.task</groupId>
     <artifactId>themis-task</artifactId>
-    <version>1.1.1</version>
+    <version>1.1.2</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>com.qmth.themis</groupId>
         <artifactId>themis-service</artifactId>
-        <version>1.1.1</version>
+        <version>1.1.2</version>
     </parent>
 
     <dependencies>