فهرست منبع

Merge branch 'dev' into release
123

wangliang 4 سال پیش
والد
کامیت
54975e6b36
22فایلهای تغییر یافته به همراه389 افزوده شده و 80 حذف شده
  1. 12 12
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamReexamController.java
  2. 5 20
      themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateController.java
  3. 19 27
      themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateWarnInfoController.java
  4. 21 0
      themis-backend/src/main/java/com/qmth/themis/backend/api/TIeReportController.java
  5. 46 0
      themis-business/src/main/java/com/qmth/themis/business/bean/backend/ExamStudentLogDetailListBean.java
  6. 118 0
      themis-business/src/main/java/com/qmth/themis/business/bean/backend/ExamStudentLogListBean.java
  7. 2 1
      themis-business/src/main/java/com/qmth/themis/business/dao/TEExamActivityMapper.java
  8. 16 9
      themis-business/src/main/java/com/qmth/themis/business/dao/TEExamReexamMapper.java
  9. 7 2
      themis-business/src/main/java/com/qmth/themis/business/dao/TEExamStudentLogMapper.java
  10. 4 0
      themis-business/src/main/java/com/qmth/themis/business/dao/TEExamStudentMapper.java
  11. 3 2
      themis-business/src/main/java/com/qmth/themis/business/service/TEExamActivityService.java
  12. 9 0
      themis-business/src/main/java/com/qmth/themis/business/service/TEExamReexamService.java
  13. 6 0
      themis-business/src/main/java/com/qmth/themis/business/service/TIeReportService.java
  14. 5 4
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java
  15. 12 0
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamReexamServiceImpl.java
  16. 1 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java
  17. 31 0
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TIeReportServiceImpl.java
  18. 3 1
      themis-business/src/main/resources/mapper/TEExamActivityMapper.xml
  19. 2 1
      themis-business/src/main/resources/mapper/TEExamMapper.xml
  20. 28 0
      themis-business/src/main/resources/mapper/TEExamReexamMapper.xml
  21. 13 0
      themis-business/src/main/resources/mapper/TEExamStudentLogMapper.xml
  22. 26 0
      themis-business/src/main/resources/mapper/TEExamStudentMapper.xml

+ 12 - 12
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamReexamController.java

@@ -202,7 +202,7 @@ public class TEExamReexamController {
     @ApiOperation(value = "重考申请列表接口")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = ReexamListRequestBean.class)})
-    public Result list(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result list(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                        @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                        @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                        @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
@@ -210,9 +210,6 @@ public class TEExamReexamController {
                        @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -228,7 +225,7 @@ public class TEExamReexamController {
     @ApiOperation(value = "重考待审列表接口")
     @RequestMapping(value = "/list_not_done", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = ReexamListRequestBean.class)})
-    public Result listNotDone(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result listNotDone(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                               @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                               @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                               @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
@@ -240,19 +237,25 @@ public class TEExamReexamController {
                               @ApiParam(value = "申请人", required = false) @RequestParam(required = false) String applyName,
                               @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                               @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         IPage<ReexamListNotDoneBean> reexamListNotDongBeanIPage = teExamReexamService.reexamPageNotDoneList(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, courseCode, name, identity, reason, reasonStartTime, reasonEndTime, applyName, tbUser.getId());
         BasePage basePage = new BasePage(reexamListNotDongBeanIPage.getRecords(), reexamListNotDongBeanIPage.getCurrent(), reexamListNotDongBeanIPage.getSize(), reexamListNotDongBeanIPage.getTotal());
         return ResultUtil.ok(basePage);
     }
 
+    @ApiOperation(value = "重考待审提醒接口")
+    @RequestMapping(value = "/list_not_done_notify", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = ReexamListRequestBean.class)})
+    public Result listNotDoneNotify(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId) {
+        TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
+        Integer count = teExamReexamService.reexamPageNotDoneCount(examId, tbUser.getId());
+        return ResultUtil.ok(Collections.singletonMap(SystemConstant.COUNT, count));
+    }
+
     @ApiOperation(value = "重考已审列表接口")
     @RequestMapping(value = "/list_done", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = ReexamListRequestBean.class)})
-    public Result listDone(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result listDone(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                            @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                            @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                            @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
@@ -264,9 +267,6 @@ public class TEExamReexamController {
                            @ApiParam(value = "申请人", required = false) @RequestParam(required = false) String applyName,
                            @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                            @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         IPage<ReexamListDoneBean> reexamListRequestBeanIPage = teExamReexamService.reexamPageDoneList(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, courseCode, name, identity, auditingStatus,reasonStartTime,reasonEndTime,applyName,tbUser.getId());
         BasePage basePage = new BasePage(reexamListRequestBeanIPage.getRecords(), reexamListRequestBeanIPage.getCurrent(), reexamListRequestBeanIPage.getSize(), reexamListRequestBeanIPage.getTotal());

+ 5 - 20
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateController.java

@@ -89,7 +89,7 @@ public class TIeInvigilateController {
     @ApiOperation(value = "实时监控台列表接口")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = InvigilateListBean.class)})
-    public Result list(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result list(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                        @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                        @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                        @ApiParam(value = "试题下载状态", required = false) @RequestParam(required = false) Integer paperDownload,
@@ -102,9 +102,6 @@ public class TIeInvigilateController {
                        @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
                        @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                        @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -120,7 +117,7 @@ public class TIeInvigilateController {
     @ApiOperation(value = "实时监控台视频列表接口")
     @RequestMapping(value = "/list/video", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = InvigilateListVideoBean.class)})
-    public Result listVideo(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result listVideo(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                             @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                             @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                             @ApiParam(value = "试题下载状态", required = false) @RequestParam(required = false) Integer paperDownload,
@@ -133,9 +130,6 @@ public class TIeInvigilateController {
                             @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
                             @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -151,7 +145,7 @@ public class TIeInvigilateController {
     @ApiOperation(value = "监考明细管理列表接口")
     @RequestMapping(value = "/history/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考明细信息", response = InvigilateListHistoryBean.class)})
-    public Result historyList(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result historyList(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                               @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                               @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                               @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
@@ -170,9 +164,6 @@ public class TIeInvigilateController {
                               @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
                               @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                               @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -292,7 +283,7 @@ public class TIeInvigilateController {
     @ApiOperation(value = "在线巡考列表接口")
     @RequestMapping(value = "/patrol/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考监控信息", response = InvigilateListPatrolBean.class)})
-    public Result patrolList(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result patrolList(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                              @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                              @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                              @ApiParam(value = "考生状态", required = false) @RequestParam(required = false) String status,
@@ -308,9 +299,6 @@ public class TIeInvigilateController {
                              @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
                              @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                              @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -326,7 +314,7 @@ public class TIeInvigilateController {
     @ApiOperation(value = "进度查询列表接口")
     @RequestMapping(value = "/progress/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考进度信息", response = InvigilateListProgressBean.class)})
-    public Result progressList(@ApiParam(value = "考试批次id") @RequestParam Long examId,
+    public Result progressList(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
                                @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
                                @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
                                @ApiParam(value = "科目代码", required = false) @RequestParam(required = false) String courseCode,
@@ -334,9 +322,6 @@ public class TIeInvigilateController {
                                @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
                                @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                                @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场

+ 19 - 27
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateWarnInfoController.java

@@ -24,8 +24,6 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -52,12 +50,9 @@ public class TIeInvigilateWarnInfoController {
     @ApiOperation(value = "预警提醒接口")
     @RequestMapping(value = "/notify", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"count\":1}", response = Result.class)})
-    public Result notify(@ApiParam(value = "考试批次id") @RequestParam Long examId,
-                             @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
-                             @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
+    public Result notify(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
+                         @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
+                         @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场
@@ -72,25 +67,22 @@ public class TIeInvigilateWarnInfoController {
     @ApiOperation(value = "预警提醒列表接口")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "监考预警信息", response = InvigilateListWarningBean.class)})
-    public Result list(@ApiParam(value = "考试批次id") @RequestParam Long examId,
-                           @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
-                           @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
-                           @ApiParam(value = "审阅状态", required = false) @RequestParam(required = false) Integer approveStatus,
-                           @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
-                           @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
-                           @ApiParam(value = "陌生人脸min", required = false) @RequestParam(required = false) Integer minMultipleFaceCount,
-                           @ApiParam(value = "陌生人脸max", required = false) @RequestParam(required = false) Integer maxMultipleFaceCount,
-                           @ApiParam(value = "异常处理min", required = false) @RequestParam(required = false) Integer minExceptionCount,
-                           @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 = false) @RequestParam(required = false) String clientWebsocketStatus,
-                           @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
-                           @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
-                           @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        if (Objects.isNull(examId) || Objects.equals(examId, "")) {
-            throw new BusinessException(ExceptionResultEnum.EXAM_ID_IS_NULL);
-        }
+    public Result list(@ApiParam(value = "考试批次id", required = false) @RequestParam(required = false) Long examId,
+                       @ApiParam(value = "考试场次id", required = false) @RequestParam(required = false) Long examActivityId,
+                       @ApiParam(value = "虚拟考场代码", required = false) @RequestParam(required = false) String roomCode,
+                       @ApiParam(value = "审阅状态", required = false) @RequestParam(required = false) Integer approveStatus,
+                       @ApiParam(value = "姓名", required = false) @RequestParam(required = false) String name,
+                       @ApiParam(value = "证件号", required = false) @RequestParam(required = false) String identity,
+                       @ApiParam(value = "陌生人脸min", required = false) @RequestParam(required = false) Integer minMultipleFaceCount,
+                       @ApiParam(value = "陌生人脸max", required = false) @RequestParam(required = false) Integer maxMultipleFaceCount,
+                       @ApiParam(value = "异常处理min", required = false) @RequestParam(required = false) Integer minExceptionCount,
+                       @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 = false) @RequestParam(required = false) String clientWebsocketStatus,
+                       @ApiParam(value = "监控设备通信状态", required = false) @RequestParam(required = false) String monitorStatusSource,
+                       @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                       @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         AuthDto authDto = (AuthDto) redisUtil.get(SystemConstant.userOauth + "::" + tbUser.getId());
         //如果有监考员角色,只能查看自己所监考的考场,巡考员和管理员则可以查看全部考场

+ 21 - 0
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeReportController.java

@@ -147,4 +147,25 @@ public class TIeReportController {
     public Result examRevokeBreachListDetail(@ApiParam(value = "考生id", required = true) @RequestParam Long examStudentId) {
         return ResultUtil.ok(reportService.examRevokeBreachListDetail(examStudentId));
     }
+    
+    @ApiOperation(value = "考生日志")
+    @RequestMapping(value = "/exam_student_log_list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    public Result examStudentLogList(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
+                             @ApiParam(value = "考场场次id", required = false) @RequestParam Long examActivityId,
+                             @ApiParam(value = "虚拟考场代码", required = false) @RequestParam String roomCode,
+                             @ApiParam(value = "科目编码", required = false) @RequestParam String courseCode,
+                             @ApiParam(value = "姓名", required = false) @RequestParam String name,
+                             @ApiParam(value = "唯一码", required = false) @RequestParam String identity,
+                             @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
+        return ResultUtil.ok(reportService.examStudentLogList(examId, examActivityId, roomCode, courseCode, name, identity,pageNumber,pageSize));
+    }
+    
+    @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) {
+        return ResultUtil.ok(reportService.examStudentLogListDetail(examStudentId));
+    }
 }

+ 46 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/backend/ExamStudentLogDetailListBean.java

@@ -0,0 +1,46 @@
+package com.qmth.themis.business.bean.backend;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("报表-考生日志明细返回对象")
+public class ExamStudentLogDetailListBean {
+
+
+	@ApiModelProperty(name = "发生时间")
+    private Long createTime;
+	
+	@ApiModelProperty(name = "事件类型")
+    private String type;
+	
+	@ApiModelProperty(name = "详情")
+    private String remark;
+
+	public Long getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Long createTime) {
+		this.createTime = createTime;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+
+    
+    
+}

+ 118 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/backend/ExamStudentLogListBean.java

@@ -0,0 +1,118 @@
+package com.qmth.themis.business.bean.backend;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel("报表-考生日志返回对象")
+public class ExamStudentLogListBean {
+
+
+	@ApiModelProperty(name = "考生id")
+    private String examStudentId;
+	@ApiModelProperty(name = "考试名称")
+    private String examName;
+	
+	@ApiModelProperty(name = "考试id")
+    private Long examId;
+
+    @ApiModelProperty(name = "场次id")
+    private Long examActivityId;
+
+    @ApiModelProperty(name = "虚拟考场代码")
+    private String roomCode;
+
+    @ApiModelProperty(name = "虚拟考场名称")
+    private String roomName;
+
+    @ApiModelProperty(name = "唯一码")
+    private String identity;
+    
+    @ApiModelProperty(name = "姓名")
+    private String name;
+    
+    @ApiModelProperty(name = "科目名称")
+    private String courseCode;
+    
+    @ApiModelProperty(name = "科目编码")
+    private String courseName;
+
+	public String getExamStudentId() {
+		return examStudentId;
+	}
+
+	public void setExamStudentId(String examStudentId) {
+		this.examStudentId = examStudentId;
+	}
+
+	public String getExamName() {
+		return examName;
+	}
+
+	public void setExamName(String examName) {
+		this.examName = examName;
+	}
+
+	public Long getExamId() {
+		return examId;
+	}
+
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+
+	public Long getExamActivityId() {
+		return examActivityId;
+	}
+
+	public void setExamActivityId(Long examActivityId) {
+		this.examActivityId = examActivityId;
+	}
+
+	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 String getIdentity() {
+		return identity;
+	}
+
+	public void setIdentity(String identity) {
+		this.identity = identity;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamActivityMapper.java

@@ -80,7 +80,8 @@ public interface TEExamActivityMapper extends BaseMapper<TEExamActivity> {
      * @param studentId
      * @param examId
      * @param examActivityId
+     * @param mode
      * @return
      */
-    public List<TEExamActivityDto> getWaitingExam(@Param("studentId") Long studentId, @Param("examId") Long examId, @Param("examActivityId") Long examActivityId);
+    public List<TEExamActivityDto> getWaitingExam(@Param("studentId") Long studentId, @Param("examId") Long examId, @Param("examActivityId") Long examActivityId, @Param("mode") String mode);
 }

+ 16 - 9
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamReexamMapper.java

@@ -1,18 +1,16 @@
 package com.qmth.themis.business.dao;
 
-import java.util.Map;
-
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.qmth.themis.business.bean.backend.ExamExceptionListBean;
 import com.qmth.themis.business.bean.backend.ExamReexamListBean;
 import com.qmth.themis.business.bean.backend.ReexamListDoneBean;
 import com.qmth.themis.business.bean.backend.ReexamListNotDoneBean;
 import com.qmth.themis.business.bean.backend.ReexamListRequestBean;
 import com.qmth.themis.business.entity.TEExamReexam;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
 
 /**
  * @Description: 考生重考处理 Mapper 接口
@@ -74,6 +72,15 @@ public interface TEExamReexamMapper extends BaseMapper<TEExamReexam> {
                                                               @Param("applyName") String applyName,
                                                               @Param("userId") Long userId);
 
+    /**
+     * 重考待审提醒
+     *
+     * @param examId
+     * @param userId
+     * @return
+     */
+    public Integer reexamPageNotDoneCount(@Param("examId") Long examId, @Param("userId") Long userId);
+
     /**
      * 重考已审列表
      *
@@ -103,7 +110,7 @@ public interface TEExamReexamMapper extends BaseMapper<TEExamReexam> {
                                                         @Param("applyName") String applyName,
                                                         @Param("userId") Long userId);
 
-	public IPage<ExamReexamListBean> getExamReexamPage(IPage<ExamReexamListBean> iPage, @Param("examId") Long examId,
-			@Param("activityId") Long activityId, @Param("roomCode") String roomCode,
-			@Param("courseCode") String courseCode, @Param("name") String name, @Param("identity") String identity);
+    public IPage<ExamReexamListBean> getExamReexamPage(IPage<ExamReexamListBean> iPage, @Param("examId") Long examId,
+                                                       @Param("activityId") Long activityId, @Param("roomCode") String roomCode,
+                                                       @Param("courseCode") String courseCode, @Param("name") String name, @Param("identity") String identity);
 }

+ 7 - 2
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamStudentLogMapper.java

@@ -1,8 +1,13 @@
 package com.qmth.themis.business.dao;
 
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.themis.business.bean.backend.ExamStudentLogDetailListBean;
 import com.qmth.themis.business.entity.TEExamStudentLog;
-import org.apache.ibatis.annotations.Mapper;
 
 /**
  * @Description: 考生轨迹 Mapper 接口
@@ -13,5 +18,5 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface TEExamStudentLogMapper extends BaseMapper<TEExamStudentLog> {
-
+	public List<ExamStudentLogDetailListBean> getExamStudentLogList(@Param("examStudentId") Long examStudentId);
 }

+ 4 - 0
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamStudentMapper.java

@@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Param;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.themis.business.bean.backend.ExamDeficiencyListBean;
+import com.qmth.themis.business.bean.backend.ExamStudentLogListBean;
 import com.qmth.themis.business.bean.backend.ExamViewCountListBean;
 import com.qmth.themis.business.dto.response.RoomCodeQueryDto;
 import com.qmth.themis.business.dto.response.TEExamStudentDto;
@@ -66,4 +67,7 @@ public interface TEExamStudentMapper extends BaseMapper<TEExamStudent> {
 			@Param("activityId") Long activityId, @Param("roomCode") String roomCode,
 			@Param("courseCode") String courseCode, @Param("name") String name, @Param("identity") String identity,@Param("activityIds") List<Long> activityIds);
 
+    public IPage<ExamStudentLogListBean> getPageForStudentLog(IPage<ExamStudentLogListBean> iPage, @Param("examId") Long examId,
+			@Param("activityId") Long activityId, @Param("roomCode") String roomCode,
+			@Param("courseCode") String courseCode, @Param("name") String name, @Param("identity") String identity);
 }

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

@@ -70,7 +70,7 @@ public interface TEExamActivityService extends IService<TEExamActivity> {
      * @param finishDate
      * @return
      */
-    public IPage<TEExamActivityQueryDto> examActivityQuery(IPage<Map> iPage, Long id,Long examId, String code, String startDate, String finishDate);
+    public IPage<TEExamActivityQueryDto> examActivityQuery(IPage<Map> iPage, Long id, Long examId, String code, String startDate, String finishDate);
 
     /**
      * 获取考试待考列表
@@ -78,9 +78,10 @@ public interface TEExamActivityService extends IService<TEExamActivity> {
      * @param studentId
      * @param examId
      * @param examActivityId
+     * @param mode
      * @return
      */
-    public List<TEExamActivityDto> getWaitingExam(Long studentId, Long examId, Long examActivityId);
+    public List<TEExamActivityDto> getWaitingExam(Long studentId, Long examId, Long examActivityId, String mode);
 
     /**
      * 获取场次缓存

+ 9 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TEExamReexamService.java

@@ -68,6 +68,15 @@ public interface TEExamReexamService extends IService<TEExamReexam> {
                                                               String applyName,
                                                               Long userId);
 
+    /**
+     * 重考待审提醒
+     *
+     * @param examId
+     * @param userId
+     * @return
+     */
+    public Integer reexamPageNotDoneCount(Long examId, Long userId);
+
     /**
      * 重考已审列表
      *

+ 6 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TIeReportService.java

@@ -6,6 +6,7 @@ import java.util.Map;
 import com.qmth.themis.business.base.BasePage;
 import com.qmth.themis.business.bean.backend.ExamBreachDetailListBean;
 import com.qmth.themis.business.bean.backend.ExamExceptionDetailListBean;
+import com.qmth.themis.business.bean.backend.ExamStudentLogDetailListBean;
 
 public interface TIeReportService {
 	public Map<String, Object> examView(Long examId, Long examActivityId, String roomCode, String courseCode,
@@ -34,4 +35,9 @@ public interface TIeReportService {
 			String name, String identity, int pageNumber, int pageSize);
 
 	public List<ExamBreachDetailListBean> examRevokeBreachListDetail(Long examStudentId);
+
+	public BasePage examStudentLogList(Long examId, Long examActivityId, String roomCode, String courseCode, String name,
+			String identity, int pageNumber, int pageSize);
+
+	public List<ExamStudentLogDetailListBean> examStudentLogListDetail(Long examStudentId);
 }

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

@@ -97,8 +97,8 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
      * @return
      */
     @Override
-    public IPage<TEExamActivityQueryDto> examActivityQuery(IPage<Map> iPage, Long id,Long examId, String code, String startDate, String finishDate) {
-        return teExamActivityMapper.examActivityQuery(iPage,id, examId, code, startDate, finishDate);
+    public IPage<TEExamActivityQueryDto> examActivityQuery(IPage<Map> iPage, Long id, Long examId, String code, String startDate, String finishDate) {
+        return teExamActivityMapper.examActivityQuery(iPage, id, examId, code, startDate, finishDate);
     }
 
     /**
@@ -107,11 +107,12 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
      * @param studentId
      * @param examId
      * @param examActivityId
+     * @param mode
      * @return
      */
     @Override
-    public List<TEExamActivityDto> getWaitingExam(Long studentId, Long examId, Long examActivityId) {
-        return teExamActivityMapper.getWaitingExam(studentId, examId, examActivityId);
+    public List<TEExamActivityDto> getWaitingExam(Long studentId, Long examId, Long examActivityId, String mode) {
+        return teExamActivityMapper.getWaitingExam(studentId, examId, examActivityId, mode);
     }
 
     @Cacheable(value = "exam_activity", key = "#examActivityId", unless = "#result == null")

+ 12 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamReexamServiceImpl.java

@@ -66,6 +66,18 @@ public class TEExamReexamServiceImpl extends ServiceImpl<TEExamReexamMapper, TEE
         return teExamReexamMapper.reexamPageNotDoneList(iPage, examId, examActivityId, roomCode, courseCode, name, identity, reason, reasonStartTime, reasonEndTime, applyName, userId);
     }
 
+    /**
+     * 重考待审提醒
+     *
+     * @param examId
+     * @param userId
+     * @return
+     */
+    @Override
+    public Integer reexamPageNotDoneCount(Long examId, Long userId) {
+        return teExamReexamMapper.reexamPageNotDoneCount(examId, userId);
+    }
+
     /**
      * 重考已审列表
      *

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

@@ -111,7 +111,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         List<TEExamDto> list = teExamMapper.getWaitingExam(studentId, examId, orgId);
         if (Objects.nonNull(list) && list.size() > 0) {
             list.forEach(s -> {
-                List<TEExamActivityDto> teExamActivityList = teExamActivityService.getWaitingExam(studentId, s.getId(), s.getExamActivityId());
+                List<TEExamActivityDto> teExamActivityList = teExamActivityService.getWaitingExam(studentId, s.getId(), s.getExamActivityId(), s.getMode());
                 teExamActivityList.forEach(v -> {
                     if (Objects.nonNull(v.getInProcessLivenessFixedRangeStr())) {
                         String[] longs = v.getInProcessLivenessFixedRangeStr().trim().replaceAll(" ", "").split(",");

+ 31 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TIeReportServiceImpl.java

@@ -24,11 +24,14 @@ import com.qmth.themis.business.bean.backend.ExamDeficiencyListBean;
 import com.qmth.themis.business.bean.backend.ExamExceptionDetailListBean;
 import com.qmth.themis.business.bean.backend.ExamExceptionListBean;
 import com.qmth.themis.business.bean.backend.ExamReexamListBean;
+import com.qmth.themis.business.bean.backend.ExamStudentLogDetailListBean;
+import com.qmth.themis.business.bean.backend.ExamStudentLogListBean;
 import com.qmth.themis.business.bean.backend.ExamViewCountListBean;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.dao.TEExamBreachLogMapper;
 import com.qmth.themis.business.dao.TEExamReexamMapper;
+import com.qmth.themis.business.dao.TEExamStudentLogMapper;
 import com.qmth.themis.business.dao.TEExamStudentMapper;
 import com.qmth.themis.business.dao.TIeInvigilateExceptionInfoMapper;
 import com.qmth.themis.business.dao.TOeExamRecordMapper;
@@ -62,6 +65,9 @@ public class TIeReportServiceImpl implements TIeReportService {
     
     @Resource
     TEExamBreachLogMapper examBreachLogMapper;
+    
+    @Resource
+    TEExamStudentLogMapper examStudentLogMapper;
 
 	@Override
 	public Map<String, Object> examView(Long examId, Long examActivityId, String roomCode, String courseCode,
@@ -331,5 +337,30 @@ public class TIeReportServiceImpl implements TIeReportService {
 		return ret;
 	}
 
+	@Override
+	public BasePage examStudentLogList(Long examId, Long examActivityId, String roomCode, String courseCode,
+			String name, String identity, int pageNumber, int pageSize) {
+		Page<ExamStudentLogListBean> ipage=new Page<>(pageNumber, pageSize);
+		ipage.addOrder(OrderItem.asc("t.id"));
+		IPage<ExamStudentLogListBean> total = examStudentMapper.getPageForStudentLog(ipage,examId, examActivityId, roomCode, courseCode,name,identity);
+        List<ExamStudentLogListBean> data=total.getRecords();
+        if(data==null||data.size()==0) {
+        	BasePage basePage = new BasePage(total.getRecords(), total.getCurrent(), total.getSize(), total.getTotal());
+        	return basePage;
+        }
+        ExamCacheBean exam=examService.getExamCacheBean(examId);
+		for(ExamStudentLogListBean b:data) {
+			b.setExamName(exam.getName());
+		}
+		BasePage basePage = new BasePage(total.getRecords(), total.getCurrent(), total.getSize(), total.getTotal());
+        return basePage;
+	}
+
+	@Override
+	public List<ExamStudentLogDetailListBean> examStudentLogListDetail(Long examStudentId) {
+		List<ExamStudentLogDetailListBean> ret=examStudentLogMapper.getExamStudentLogList(examStudentId);
+		return ret;
+	}
+
 
 }

+ 3 - 1
themis-business/src/main/resources/mapper/TEExamActivityMapper.xml

@@ -163,7 +163,9 @@
             and tee.enable = 1
             and teea.enable = 1
             and tees.enable = 1
-            and teea.start_time <![CDATA[ >= ]]> date_sub(now(), interval IFNULL(teea.opening_seconds, tee.opening_seconds) second)
+            <if test="mode != null and mode != '' and mode == 'TOGETHER'">
+                and teea.start_time <![CDATA[ >= ]]> date_sub(now(), interval IFNULL(teea.opening_seconds, tee.opening_seconds) second)
+            </if>
         </where>
     </select>
 </mapper>

+ 2 - 1
themis-business/src/main/resources/mapper/TEExamMapper.xml

@@ -122,7 +122,8 @@
                 <if test="examId != null and examId != ''">
                     and tee.id = #{examId}
                 </if>
-                and teea.start_time <![CDATA[ >= ]]> date_sub(now(), interval IFNULL(teea.opening_seconds, tee.opening_seconds) second)
+                and IF(tee.mode = 'TOGETHER', teea.start_time >= date_sub(now(),
+                interval IFNULL(teea.opening_seconds, tee.opening_seconds) second),1 = 1 )
         </where>
             ) t
         <where>

+ 28 - 0
themis-business/src/main/resources/mapper/TEExamReexamMapper.xml

@@ -117,6 +117,34 @@
          order by tees.room_code
     </select>
 
+    <select id="reexamPageNotDoneCount" resultType="java.lang.Integer">
+        select count(1)
+        from
+        t_e_exam_reexam teer
+        left join t_e_exam_student tees on
+        tees.id = teer.exam_student_id
+        left join t_e_exam tee on
+        tee.id = teer.exam_id
+        left join t_e_exam_activity teea on
+        teea.id = teer.exam_activity_id
+        left join t_b_user tbu on
+        tbu.id = teer.create_id
+        left join t_e_exam_reexam_auditing teera on
+        teera.reexam_id = teer.id
+        <where>
+            <if test="userId != null and userId !=''">
+                and teera.auditing_id = #{userId}
+            </if>
+            <if test="examId != null and examId != ''">
+                and teer.exam_id = #{examId}
+            </if>
+            and tee.enable = 1
+            and teea.enable = 1
+            and tees.enable = 1
+            and teer.status = 1
+        </where>
+    </select>
+
     <select id="reexamPageDoneList" resultType="com.qmth.themis.business.bean.backend.ReexamListDoneBean">
         select
             teer.id as reexamId,

+ 13 - 0
themis-business/src/main/resources/mapper/TEExamStudentLogMapper.xml

@@ -2,4 +2,17 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.themis.business.dao.TEExamStudentLogMapper">
 
+	<select id="getExamStudentLogList"
+		resultType="com.qmth.themis.business.bean.backend.ExamStudentLogDetailListBean">
+		SELECT
+		UNIX_TIMESTAMP(f.create_time) * 1000
+		createTime,
+		f.type type,
+		f.info remark
+		FROM
+		t_e_exam_student_log f
+		where f.exam_student_id
+		=#{examStudentId}
+		order by f.create_time
+	</select>
 </mapper>

+ 26 - 0
themis-business/src/main/resources/mapper/TEExamStudentMapper.xml

@@ -170,4 +170,30 @@
 		</if>
 	</select>
 	
+	<select id="getPageForStudentLog"
+		resultType="com.qmth.themis.business.bean.backend.ExamStudentLogListBean">
+		select t.id examStudentId,t.exam_id examId,t.exam_activity_id
+		examActivityId,t.room_code
+		roomCode,t.course_code courseCode,t.course_name
+		courseName,t.name,t.identity
+		,t.room_name roomName from
+		t_e_exam_student t
+		where t.exam_id = #{examId} 
+		<if test="activityId != null and activityId != ''">
+			and t.exam_activity_id = #{activityId}
+		</if>
+		<if test="roomCode != null and roomCode != ''">
+			and t.room_code =#{roomCode}
+		</if>
+		<if test="courseCode != null and courseCode != ''">
+			and t.course_code = #{courseCode}
+		</if>
+		<if test="identity != null and identity != ''">
+			and t.identity like concat(#{identity},'%')
+		</if>
+		<if test="name != null and name != ''">
+			and t.name like concat(#{name},'%')
+		</if>
+	</select>
+	
 </mapper>