소스 검색

监考日志修改

wangliang 4 년 전
부모
커밋
03cd34b045

+ 50 - 39
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamController.java

@@ -25,6 +25,8 @@ 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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -45,6 +47,7 @@ import java.util.stream.Collectors;
 @RestController
 @RequestMapping("/${prefix.url.admin}/exam")
 public class TEExamController {
+    private final static Logger log = LoggerFactory.getLogger(TEExamController.class);
 
     @Resource
     TEExamService teExamService;
@@ -353,7 +356,7 @@ public class TEExamController {
         if (Objects.nonNull(tbExamInvigilateUserList) && tbExamInvigilateUserList.size() > 0) {
             roomCodeSet = tbExamInvigilateUserList.stream().map(s -> s.getRoomCode()).collect(Collectors.toSet());
         }
-        if (Objects.nonNull(roomCodeSet) || roomCodeSet.size() == 0) {
+        if (Objects.isNull(roomCodeSet) || roomCodeSet.size() == 0) {
             throw new BusinessException("当前监考老师未设置任何监考考场");
         }
         //根据roomCode获取当前老师所要监考的全部应考学生数
@@ -371,53 +374,61 @@ public class TEExamController {
         AtomicReference<Integer> alreadyComplete = new AtomicReference<>(0);
         Integer notComplete = 0;
         if (Objects.nonNull(teExamStudentList) && teExamStudentList.size() > 0) {
+            studentSet = new HashSet<>();
+            examActivityIdSet = new HashSet<>();
+            Set<Long> finalExamActivityIdSet = examActivityIdSet;
+            Set<String> finalStudentSet = studentSet;
             teExamStudentList.forEach(s -> {
-                studentSet.add(SystemConstant.STUDENT + s.getStudentId());
-                examActivityIdSet.add(s.getExamActivityId());
+                finalStudentSet.add(SystemConstant.STUDENT + s.getStudentId());
+                finalExamActivityIdSet.add(s.getExamActivityId());
             });
             allCount = studentSet.size();
         }
 
-        //获取已登录学生
-        List<TEStudentCacheDto> teStudentCacheDto = (List<TEStudentCacheDto>) redisUtil.multiGet(studentSet);
-        if (Objects.nonNull(teExamStudentList) && teExamStudentList.size() > 0) {
-            loginCount = teStudentCacheDto.size();
+        if (Objects.nonNull(studentSet)) {
+            //获取已登录学生
+            List<TEStudentCacheDto> teStudentCacheDtoList = (List<TEStudentCacheDto>) redisUtil.multiGet(studentSet);
+            if (Objects.nonNull(teStudentCacheDtoList) && teStudentCacheDtoList.size() > 0) {
+                loginCount = teStudentCacheDtoList.stream().filter(s -> Objects.nonNull(s)).collect(Collectors.toList()).size();
+            }
         }
 
-        //获取已待考、考试中、已完成学生
-        examActivityIdSet.forEach(s -> {
-            Map<Long, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(s));
-            if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                objectMap.forEach((k, v) -> {
-                    Map<String, Object> recordIdObjectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(k));
-                    if (Objects.nonNull(recordIdObjectMap) && recordIdObjectMap.size() > 0) {
-                        //客户端通讯状态
-                        WebsocketStatusEnum clientStatus = Objects.isNull(recordIdObjectMap.get("clientWebsocketStatus")) ? null : (WebsocketStatusEnum) recordIdObjectMap.get("clientWebsocketStatus");
-                        if (Objects.equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
-                            clientCommunicationStatusCount.getAndSet(clientCommunicationStatusCount.get() + 1);
+        if (Objects.nonNull(examActivityIdSet)) {
+            //获取已待考、考试中、已完成学生
+            examActivityIdSet.forEach(s -> {
+                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(s));
+                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
+                    objectMap.forEach((k, v) -> {
+                        Map<String, Object> recordIdObjectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(Long.parseLong(k)));
+                        if (Objects.nonNull(recordIdObjectMap) && recordIdObjectMap.size() > 0) {
+                            //客户端通讯状态
+                            WebsocketStatusEnum clientStatus = Objects.isNull(recordIdObjectMap.get("clientWebsocketStatus")) ? null : (WebsocketStatusEnum) recordIdObjectMap.get("clientWebsocketStatus");
+                            if (Objects.equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
+                                clientCommunicationStatusCount.getAndSet(clientCommunicationStatusCount.get() + 1);
+                            }
+                            //监控端通讯状态
+                            MonitorStatusSourceEnum monitorStatus = Objects.isNull(recordIdObjectMap.get("monitorStatusSource")) ? null : (MonitorStatusSourceEnum) recordIdObjectMap.get("monitorStatusSource");
+                            if (Objects.nonNull(monitorStatus) && Objects.equals(monitorStatus, MonitorStatusSourceEnum.STOP)) {
+                                monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
+                            }
                         }
-                        //监控端通讯状态
-                        MonitorStatusSourceEnum monitorStatus = Objects.isNull(recordIdObjectMap.get("monitorStatusSource")) ? null : (MonitorStatusSourceEnum) recordIdObjectMap.get("monitorStatusSource");
-                        if (Objects.nonNull(monitorStatus) && Objects.equals(monitorStatus, MonitorStatusSourceEnum.STOP)) {
-                            monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
+                        ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
+                        //已待考
+                        if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE)) {
+                            prepareCount.getAndSet(prepareCount.get() + 1);
                         }
-                    }
-                    ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
-                    //已待考
-                    if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE)) {
-                        prepareCount.getAndSet(prepareCount.get() + 1);
-                    }
-                    //考试中
-                    else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.RESUME_PREPARE)) {
-                        examCount.getAndSet(examCount.get() + 1);
-                    }
-                    //已完成
-                    else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED)) {
-                        alreadyComplete.getAndSet(alreadyComplete.get() + 1);
-                    }
-                });
-            }
-        });
+                        //考试中
+                        else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.RESUME_PREPARE)) {
+                            examCount.getAndSet(examCount.get() + 1);
+                        }
+                        //已完成
+                        else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED)) {
+                            alreadyComplete.getAndSet(alreadyComplete.get() + 1);
+                        }
+                    });
+                }
+            });
+        }
         notComplete = allCount - alreadyComplete.get();
         ExamPropCountDto examPropCountDto = new ExamPropCountDto(examId, allCount, loginCount, prepareCount.get(), examCount.get(), clientCommunicationStatusCount.get(), monitorStatusSourceCount.get(), alreadyComplete.get(), notComplete);
         return ResultUtil.ok(examPropCountDto);

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

@@ -1,5 +1,6 @@
 package com.qmth.themis.backend.api;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.base.BasePage;
@@ -9,7 +10,6 @@ import com.qmth.themis.business.entity.TEExamCourse;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
 import com.qmth.themis.business.service.TEExamCourseService;
 import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
@@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -39,7 +40,7 @@ public class TEExamCourseController {
     @Resource
     TEExamCourseService teExamCourseService;
 
-    @ApiOperation(value = "考试科目修改/新增接口")
+    @ApiOperation(value = "考试科目修改接口")
     @RequestMapping(value = "/course/save", method = RequestMethod.POST)
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
@@ -48,10 +49,16 @@ public class TEExamCourseController {
             throw new BusinessException(ExceptionResultEnum.COURSE_INFO_IS_NULL);
         }
         try {
-            if (Objects.isNull(teExamCourse.getId())) {
-                teExamCourse.setId(Constants.idGen.next());
+            QueryWrapper<TEExamCourse> teExamCourseQueryWrapper = new QueryWrapper<>();
+            teExamCourseQueryWrapper.lambda().eq(TEExamCourse::getExamId, teExamCourse.getExamId()).eq(TEExamCourse::getCourseCode, teExamCourse.getCourseCode());
+            List<TEExamCourse> teExamCourseList = teExamCourseService.list(teExamCourseQueryWrapper);
+            if (Objects.nonNull(teExamCourseList) && teExamCourseList.size() > 0) {
+                teExamCourseList.forEach(s -> {
+                    s.setObjectiveShuffle(teExamCourse.getObjectiveShuffle());
+                    s.setOptionShuffle(teExamCourse.getOptionShuffle());
+                });
             }
-            teExamCourseService.saveOrUpdate(teExamCourse);
+            teExamCourseService.updateBatchById(teExamCourseList);
         } catch (Exception e) {
             e.printStackTrace();
             if (e instanceof DuplicateKeyException) {

+ 10 - 2
themis-business/src/main/resources/db/init.sql

@@ -466,6 +466,10 @@ INSERT INTO `t_b_privilege` VALUES (92, '监控观看地址更新', '/api/oe/mon
 INSERT INTO `t_b_privilege` VALUES (93, '监控状态更新', '/api/oe/monitor/status', 'LINK', 60, 25, NULL, '2020-08-01 12:08:31');
 INSERT INTO `t_b_privilege` VALUES (94, '发送通话申请', '/api/oe/monitor/call/apply', 'LINK', 60, 26, NULL, '2020-08-01 12:08:31');
 INSERT INTO `t_b_privilege` VALUES (95, '撤销通话申请', '/api/oe/monitor/call/cancel', 'LINK', 60, 27, NULL, '2020-08-01 12:08:31');
+INSERT INTO `t_b_privilege` VALUES (96, '监考考试批次列表', '/api/admin/exam/list', 'LINK', NULL, 4, NULL, '2020-08-01 12:08:31');
+INSERT INTO `t_b_privilege` VALUES (97, '监考考试属性统计', '/api/admin/exam/prop/count', 'LINK', NULL, 5, NULL, '2020-08-01 12:08:31');
+INSERT INTO `t_b_privilege` VALUES (98, '试卷查询', '/api/admin/exam/paper/query', 'LINK', 7, 4, NULL, '2020-08-01 12:08:31');
+INSERT INTO `t_b_privilege` VALUES (99, '科目修改', '/api/admin/exam/course/save', 'LINK', 7, 5, NULL, '2020-08-01 12:08:31');
 COMMIT;
 
 -- ----------------------------
@@ -592,6 +596,10 @@ INSERT INTO `t_b_role_privilege` VALUES (83, 'STUDENT', 92);
 INSERT INTO `t_b_role_privilege` VALUES (84, 'STUDENT', 93);
 INSERT INTO `t_b_role_privilege` VALUES (85, 'STUDENT', 94);
 INSERT INTO `t_b_role_privilege` VALUES (86, 'STUDENT', 95);
+INSERT INTO `t_b_role_privilege` VALUES (87, 'INVIGILATE', 96);
+INSERT INTO `t_b_role_privilege` VALUES (88, 'INVIGILATE', 97);
+INSERT INTO `t_b_role_privilege` VALUES (89, 'ADMIN', 98);
+INSERT INTO `t_b_role_privilege` VALUES (90, 'ADMIN', 99);
 COMMIT;
 
 -- ----------------------------
@@ -1005,7 +1013,7 @@ CREATE TABLE `t_e_exam_student_log` (
   `exam_activity_id` bigint DEFAULT NULL COMMENT '场次ID',
   `exam_record_id` bigint DEFAULT NULL COMMENT '考试记录ID',
   `exam_student_id` bigint DEFAULT NULL COMMENT '考生id',
-  `type` tinyint DEFAULT NULL COMMENT '类型',
+  `type` varchar(30) DEFAULT NULL COMMENT '类型',
   `description` varchar(1000) DEFAULT NULL COMMENT '描述',
   `remark` mediumtext COMMENT '备注',
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
@@ -1071,7 +1079,7 @@ DROP TABLE IF EXISTS `t_e_user_log`;
 CREATE TABLE `t_e_user_log` (
   `id` bigint NOT NULL COMMENT '主键',
   `user_id` bigint NOT NULL COMMENT '用户id',
-  `type` tinyint NOT NULL COMMENT '类型',
+  `type` varchar(30) NOT NULL COMMENT '类型',
   `description` varchar(1000) DEFAULT NULL COMMENT '描述',
   `remark` mediumtext COMMENT '备注',
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',

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

@@ -52,17 +52,17 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
         teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getCode, strings[1]);
         TEExamActivity teExamActivity = teExamActivityService.getOne(teExamActivityQueryWrapper);
         if (Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {
-            Map<Long, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
+            Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
             if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
                 objectMap.forEach((k, v) -> {
                     ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
                     //获取该考试批次下所有未交卷的考生的考试记录
                     if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)) {
-                        Map<String, Object> recordObjectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(k));
+                        Map<String, Object> recordObjectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(Long.parseLong(k)));
                         Integer durationSeconds = Integer.parseInt(String.valueOf(recordObjectMap.get("durationSeconds")));
                         Long studentId = Long.parseLong(String.valueOf(recordObjectMap.get("studentId")));
                         //交卷
-                        teExamService.finish(studentId, k, FinishTypeEnum.AUTO.name(), durationSeconds);
+                        teExamService.finish(studentId, Long.parseLong(k), FinishTypeEnum.AUTO.name(), durationSeconds);
                     }
                 });
             }