Browse Source

联考版-v3.0.0优化-bug修复

xiaof 3 years ago
parent
commit
145a7b9fc3
19 changed files with 289 additions and 290 deletions
  1. 16 16
      sql/msyj-local-v3.0.0-last.sql
  2. 5 5
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/CheckDataApi.java
  3. 9 9
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java
  4. 1 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/WorkApi.java
  5. 1 14
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java
  6. 2 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BuiltInParamUtils.java
  7. 9 6
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  8. 95 86
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/PdfUtils.java
  9. 1 1
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/ServletUtil.java
  10. 1 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/CheckDataStatusEnum.java
  11. 2 2
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  12. 1 34
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java
  13. 2 2
      stmms-ms-main/src/main/resources/application-dev.properties
  14. 2 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  15. 11 4
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  16. 1 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java
  17. 9 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java
  18. 120 106
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/CheckDataService.java
  19. 1 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 16 - 16
sql/msyj-local-v3.0.0-last.sql

@@ -5,7 +5,7 @@
  Source Server Type    : MySQL
  Source Server Version : 50717
  Source Host           : localhost:3306
- Source Schema         : msyj-local-v3.0.0-trial
+ Source Schema         : msyj-local-v3.0.0
 
  Target Server Type    : MySQL
  Target Server Version : 50717
@@ -65,7 +65,7 @@ CREATE TABLE `change_level`  (
 -- ----------------------------
 DROP TABLE IF EXISTS `check_data`;
 CREATE TABLE `check_data`  (
-  `id` bigint(20) NOT NULL,
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作ID',
   `check_item` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据校验类型',
   `param_value` int(3) NULL DEFAULT NULL COMMENT '变量值',
@@ -76,7 +76,7 @@ CREATE TABLE `check_data`  (
   `start_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间',
   `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据校验日志' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据校验日志' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for exam_question
@@ -91,7 +91,7 @@ CREATE TABLE `exam_question`  (
   `work_id` bigint(20) NOT NULL,
   `is_test` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for exam_score_prop
@@ -206,7 +206,7 @@ CREATE TABLE `level`  (
   CONSTRAINT `level_ibfk_7` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_8` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_9` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_log
@@ -234,7 +234,7 @@ CREATE TABLE `mark_log`  (
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `union_001_index`(`create_user_id`, `oper_type`, `subject`, `exam_number`) USING BTREE,
   INDEX `idx_union_2`(`work_id`, `paper_id`, `oper_type`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 131 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_subject
@@ -323,7 +323,7 @@ CREATE TABLE `mark_task`  (
   CONSTRAINT `mark_task_ibfk_7` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_8` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_9` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 50 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_task_job
@@ -337,7 +337,7 @@ CREATE TABLE `mark_task_job`  (
   `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作区id',
   `version` int(11) NULL DEFAULT 0 COMMENT '版本号',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_user
@@ -346,7 +346,7 @@ DROP TABLE IF EXISTS `mark_user`;
 CREATE TABLE `mark_user`  (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `work_id` bigint(20) NOT NULL,
-  `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
@@ -387,7 +387,7 @@ CREATE TABLE `mark_user`  (
   CONSTRAINT `mark_user_ibfk_7` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_8` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_9` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 71 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for marker_group
@@ -399,7 +399,7 @@ CREATE TABLE `marker_group`  (
   `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
   `work_id` bigint(20) NOT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for marker_group_leader
@@ -415,7 +415,7 @@ CREATE TABLE `marker_group_leader`  (
   `group_id` bigint(20) NOT NULL,
   `group_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for paper
@@ -473,7 +473,7 @@ CREATE TABLE `paper`  (
   INDEX `idx_union_4`(`is_shift`, `is_shift_score`) USING BTREE,
   INDEX `idx_union_3`(`work_id`, `subject`, `batch_no`) USING BTREE,
   INDEX `idx_union_5`(`work_id`, `subject`, `score_batch_no`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for param_setting
@@ -500,7 +500,7 @@ CREATE TABLE `param_setting`  (
   `clear_data` int(11) NULL DEFAULT NULL,
   `take_best` tinyint(1) NULL DEFAULT NULL COMMENT '取优原则(1:是、0:否)',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for student
@@ -522,7 +522,7 @@ CREATE TABLE `student`  (
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `exam_number`(`exam_number`, `work_id`, `is_test`) USING BTREE,
   INDEX `idx_student_name`(`name`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for task_publish_setting
@@ -555,6 +555,6 @@ CREATE TABLE `work`  (
   `active` bit(1) NOT NULL,
   `created_on` date NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 5 - 5
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/CheckDataApi.java → stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/CheckDataApi.java

@@ -1,4 +1,4 @@
-package cn.com.qmth.stmms.ms.marking.api;
+package cn.com.qmth.stmms.ms.admin.api;
 
 import cn.com.qmth.stmms.ms.core.domain.CheckData;
 import cn.com.qmth.stmms.ms.core.domain.enums.CheckDataStatusEnum;
@@ -31,7 +31,7 @@ public class CheckDataApi {
      *
      * @param workId 工作ID
      */
-    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
     public List<CheckData> list(@RequestParam Long workId) {
         return checkDataRepo.findByWorkId(workId);
     }
@@ -46,17 +46,17 @@ public class CheckDataApi {
     @RequestMapping(value = "/check", method = RequestMethod.POST)
     public Object check(@RequestParam Long workId,
                         @RequestParam CheckItemEnum checkItem,
-                        @RequestParam(required = false) Integer paramValue) throws Exception {
+                        @RequestParam(required = false) Integer paramValue) {
         CheckData checkData = checkDataRepo.findByWorkIdAndCheckItem(workId, checkItem);
         if (checkData == null) {
             checkData = new CheckData(workId, checkItem, paramValue);
         } else {
             if (!CheckDataStatusEnum.FINISH.equals(checkData.getStatus())) {
-                throw new Exception("有任务正在执行");
+                throw new RuntimeException("有任务正在执行");
             }
             checkData.resetData(paramValue);
         }
-        checkDataRepo.save(checkData);
+        checkDataRepo.saveAndFlush(checkData);
 
         // 异步任务开始
         checkDataService.syncCheckData(checkData);

+ 9 - 9
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java

@@ -145,15 +145,6 @@ public class UserApi {
         return new PageableDTO(userDTOList, markUsers.getTotalElements(), markUsers.getTotalPages(), pageable.getPageNumber());
     }
 
-    /**
-     * 采集员列表查询(不分页)
-     */
-    @RequestMapping(value = "/list_by_role", method = RequestMethod.GET)
-    public Object listCollectAll(@RequestParam() Long workId,
-                                 @RequestParam(required = false, defaultValue = "COLLECTOR") Role role) {
-        return markUserRepo.findByWorkIdAndRole(workId, role);
-    }
-
     /**
      * 采集员新增
      *
@@ -179,6 +170,15 @@ public class UserApi {
         markUserRepo.save(user);
     }
 
+    /**
+     * 采集员列表查询(不分页)
+     */
+    @RequestMapping(value = "/collect/all", method = RequestMethod.GET)
+    public Object listCollectAll(@RequestParam() Long workId,
+                                 @RequestParam(required = false, defaultValue = "COLLECTOR") Role role) {
+        return markUserRepo.findByWorkIdAndRole(workId, role);
+    }
+
     /**
      * 采集员修改
      *

+ 1 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/WorkApi.java

@@ -154,6 +154,7 @@ public class WorkApi {
             w.setActive(false);
             if (w.getId().equals(workId)) {
                 w.setActive(true);
+                randomUtil.getRandom(workId, false);
             }
         }
         workRepo.save(works);

+ 1 - 14
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java

@@ -113,7 +113,7 @@ public class PaperExporter {
                 oneClickExpDTO.setSeqNo(i + 1);
                 Paper paper = paperRepo.findOne(markLog.getPaperId());
                 oneClickExpDTO.setSecretNumber(paper == null ? "" : paper.getSecretNumber());
-                oneClickExpDTO.setOriginLevel(markLog.getOperDataBefore() == null ? "" : markLog.getOperDataBefore());
+                oneClickExpDTO.setOriginLevel(markLog.getOperDataBefore() == null ? "-" : markLog.getOperDataBefore());
                 oneClickExpDTO.setLevel(markLog.getOperDataAfter());
                 oneClickExpDTOS.add(oneClickExpDTO);
             }
@@ -134,19 +134,6 @@ public class PaperExporter {
         //科目名称
         String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
         List<ChangeLevel> changeLevels = changeLevelRepo.findByWorkIdAndSubjectAndAuditStatus(workId, subject.name());
-        /*List<ChangeLevelExpDTO> changeLevelExpDTOS = new ArrayList<>();
-        for (int i = 0; i < changeLevels.size(); i++) {
-            ChangeLevel changeLevel = changeLevels.get(i);
-            ChangeLevelExpDTO changeLevelExpDTO = new ChangeLevelExpDTO();
-            changeLevelExpDTO.setSubject(subjectName);
-            changeLevelExpDTO.setSeqNo(i + 1);
-            Paper paper = paperRepo.findOne(changeLevel.getPaperId());
-            changeLevelExpDTO.setExamNumber(paper.getExamNumber());
-            changeLevelExpDTO.setOriginLevel(changeLevel.getOriginalLevel());
-            changeLevelExpDTO.setLevel(changeLevel.getSuggestLevel());
-            changeLevelExpDTOS.add(changeLevelExpDTO);
-        }
-        ExportUtils.exportEXCEL("改档信息导出", ChangeLevelExpDTO.class, changeLevelExpDTOS, response);*/
 
         List<JSONObject> datas = new ArrayList<>();
         for (ChangeLevel changeLevel : changeLevels) {

+ 2 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BuiltInParamUtils.java

@@ -68,7 +68,7 @@ public class BuiltInParamUtils {
                     if (markUser != null) {
                         continue;
                     }
-                    markUser = new MarkUser(loginName, SystemConstant.INIT_PASSWORD, 0L, Subject.SC, loginName, Role.findByName((String) map.get("name")), null);
+                    markUser = new MarkUser(loginName, SystemConstant.INIT_PASSWORD, 0L, null, loginName, Role.findByName((String) map.get("name")), null);
                     userList.add(markUser);
                 } else {
                     for (int i = 1; i <= count; i++) {
@@ -79,7 +79,7 @@ public class BuiltInParamUtils {
                         }
                         //默认密码123456
                         //随机密码randomPassword()
-                        markUser = new MarkUser(loginNameTemp, SystemConstant.INIT_PASSWORD, workId, Subject.SC, loginName, Role.findByName((String) map.get("name")), null);
+                        markUser = new MarkUser(loginNameTemp, SystemConstant.INIT_PASSWORD, workId, null, loginNameTemp, Role.findByName((String) map.get("name")), null);
                         //默认为禁用
                         markUser.setEnabled(false);
                         userList.add(markUser);

+ 9 - 6
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -151,13 +151,13 @@ public class CollectApi {
             else if (!Objects.equals(markUser.getPassword(), password)) {
                 throw new RuntimeException("密码错误");
             }
-            activeWork = workRepo.findByActiveTrue();
+            activeWork = workRepo.getOne(markUser.getWorkId());
             if (Objects.isNull(activeWork)) {
                 throw new Exception("没有work");
             }
             loginDTO = new LoginDTO();
             loginDTO.setUserId(markUser.getId());
-            loginDTO.setExamId(activeWork.getId());
+            loginDTO.setExamId(markUser.getWorkId());
             loginDTO.setExamName(activeWork.getName());
             loginDTO.setImageEnc(ParamCache.paramMap.get(activeWork.getId()).getImageEncrypt() == 1);
         }
@@ -199,8 +199,9 @@ public class CollectApi {
     }
 
     @RequestMapping(value = "exam/getStudent/{examNumber}", method = RequestMethod.GET)
-    public CollectStuDTO getStudent(@PathVariable String examNumber) {
-        Work activeWork = workRepo.findByActiveTrue();
+    public CollectStuDTO getStudent(@PathVariable String examNumber, HttpServletRequest request) {
+        Long workId = ServletUtil.getWordId();
+        Work activeWork = workRepo.getOne(workId);
         Student student = studentRepo.findByWorkIdAndRelateExamNumber(activeWork.getId(), examNumber);
         if (student == null) {
             throw new RuntimeException("无该考生,请处理");
@@ -250,12 +251,14 @@ public class CollectApi {
     public CollectStuDTO saveStudent(@PathVariable Integer subjectId,
                                      CollectStuDTO dto) throws Exception {
         Subject subject = Subject.values()[subjectId - 1];
-        Work activeWork = workRepo.findByActiveTrue();
+        Long userId = ServletUtil.getUserId();
+        Long workId = ServletUtil.getWordId();
+        Work activeWork = workRepo.getOne(workId);
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
         Student student = studentRepo.findByWorkIdAndRelateExamNumber(activeWork.getId(), dto.getExamNumber());
         Paper paper = null;
         if (!dto.isAbsent()) {
-            paper = dataUploadService.savePaper(student, subject, dto.isManual(), dto.getLevel(), dto.getScanUserId());
+            paper = dataUploadService.savePaper(student, subject, dto.isManual(), dto.getLevel(), userId);
         }
         //已知档位,更新阶段
         if (Objects.nonNull(dto.getLevel()) && !"".equals(dto.getLevel())) {

+ 95 - 86
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/PdfUtils.java

@@ -39,99 +39,108 @@ public class PdfUtils {
             Font fontChina12 = new Font(bfChinese, 12);
 
             // 4:向文档添加内容
-            // 计算页数
-            int divide = datas.size() / PAGE_SIZE;
-            // 总页数
-            int totalPage = datas.size() % PAGE_SIZE == 0 ? divide : divide + 1;
-
-            for (int i = 0; i < totalPage; i++) {
-                // 若大于2页,需要增加页面
-                if (i > 0) {
-                    document.newPage();
-                }
+            if (datas.isEmpty()) {
+                document.newPage();
+
                 // 标题
-                Paragraph titleParagraph = new Paragraph(title, fontChina18);
+                Paragraph titleParagraph = new Paragraph("没有改档数据", fontChina18);
                 titleParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
                 document.add(titleParagraph);
-
-                // 空格
-                Paragraph blank1 = new Paragraph(" ");
-                document.add(blank1);
-
-                // 编号
-                Chunk c1 = new Chunk("共" + totalPage + "页  ", fontChina12);
-                Chunk c2 = new Chunk("第" + (i + 1) + "页", fontChina12);
-                Paragraph snoParagraph = new Paragraph();
-                snoParagraph.add(c1);
-                snoParagraph.add(c2);
-                snoParagraph.setAlignment(Element.ALIGN_RIGHT);
-                document.add(snoParagraph);
-
-                // 空格
-                document.add(blank1);
-
-                // 表格处理
-                PdfPTable table = new PdfPTable(4);// 四列
-                table.setWidthPercentage(100);// 表格宽度为100%
-
-                // 表头
-                // 序号
-                fillCell(table, "序号", fontChina12, BaseColor.GRAY);
-                // 试卷密号
-                fillCell(table, "试卷密号", fontChina12, BaseColor.GRAY);
-                // 原档位
-                fillCell(table, "原档位", fontChina12, BaseColor.GRAY);
-                // 改后档位
-                fillCell(table, "改后档位", fontChina12, BaseColor.GRAY);
-
-                List<JSONObject> subList = CollUtil.sub(datas, i * 20, (i + 1) * 20);
-                for (int j = 0; j < subList.size(); j++) {
-                    JSONObject object = subList.get(j);
-                    // 序号填充
-                    fillCell(table, i * 20 + j + 1, fontChina12, null);
+            } else {
+                // 计算页数
+                int divide = datas.size() / PAGE_SIZE;
+                // 总页数
+                int totalPage = datas.size() % PAGE_SIZE == 0 ? divide : divide + 1;
+
+                for (int i = 0; i < totalPage; i++) {
+                    // 若大于2页,需要增加页面
+                    if (i > 0) {
+                        document.newPage();
+                    }
+                    // 标题
+                    Paragraph titleParagraph = new Paragraph(title, fontChina18);
+                    titleParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
+                    document.add(titleParagraph);
+
+                    // 空格
+                    Paragraph blank1 = new Paragraph(" ");
+                    document.add(blank1);
+
+                    // 编号
+                    Chunk c1 = new Chunk("共" + totalPage + "页  ", fontChina12);
+                    Chunk c2 = new Chunk("第" + (i + 1) + "页", fontChina12);
+                    Paragraph snoParagraph = new Paragraph();
+                    snoParagraph.add(c1);
+                    snoParagraph.add(c2);
+                    snoParagraph.setAlignment(Element.ALIGN_RIGHT);
+                    document.add(snoParagraph);
+
+                    // 空格
+                    document.add(blank1);
+
+                    // 表格处理
+                    PdfPTable table = new PdfPTable(4);// 四列
+                    table.setWidthPercentage(100);// 表格宽度为100%
+
+                    // 表头
+                    // 序号
+                    fillCell(table, "序号", fontChina12, BaseColor.GRAY);
                     // 试卷密号
-                    fillCell(table, object.getString("secretNumber"), fontChina12, null);
+                    fillCell(table, "试卷密号", fontChina12, BaseColor.GRAY);
                     // 原档位
-                    fillCell(table, object.getString("oldLevel"), fontChina12, null);
+                    fillCell(table, "原档位", fontChina12, BaseColor.GRAY);
                     // 改后档位
-                    fillCell(table, object.getString("newLevel"), fontChina12, null);
+                    fillCell(table, "改后档位", fontChina12, BaseColor.GRAY);
+
+                    List<JSONObject> subList = CollUtil.sub(datas, i * 20, (i + 1) * 20);
+                    for (int j = 0; j < subList.size(); j++) {
+                        JSONObject object = subList.get(j);
+                        // 序号填充
+                        fillCell(table, i * 20 + j + 1, fontChina12, null);
+                        // 试卷密号
+                        fillCell(table, object.getString("secretNumber"), fontChina12, null);
+                        // 原档位
+                        fillCell(table, object.getString("oldLevel"), fontChina12, null);
+                        // 改后档位
+                        fillCell(table, object.getString("newLevel"), fontChina12, null);
+                    }
+
+                    // 不足20个,自动补齐
+                    for (int k = 0; k < PAGE_SIZE - subList.size(); k++) {
+                        // 序号填充
+                        fillCell(table, i * 20 + subList.size() + k + 1, fontChina12, null);
+                        // 试卷密号
+                        fillCell(table, null, fontChina12, null);
+                        // 原档位
+                        fillCell(table, null, fontChina12, null);
+                        // 改后档位
+                        fillCell(table, null, fontChina12, null);
+                    }
+
+                    Paragraph pDate = new Paragraph(" 年        月        日", fontChina12);
+                    pDate.setAlignment(Element.ALIGN_RIGHT);
+                    pDate.setIndentationRight(20);
+
+                    // 备注
+                    PdfPCell cell34 = new PdfPCell();
+                    cell34.setBorderWidth(0.5F);
+                    cell34.setMinimumHeight(40);
+                    cell34.setPhrase(new Paragraph("签字栏", fontChina12));
+                    cell34.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
+                    cell34.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
+                    table.addCell(cell34);
+                    PdfPCell cell35 = new PdfPCell();
+                    cell35.setBorderWidth(0.5F);
+                    cell35.setColspan(3);
+                    cell35.addElement(blank1);
+                    cell35.addElement(blank1);
+                    cell35.addElement(blank1);
+                    cell35.addElement(pDate);
+                    cell35.addElement(blank1);
+                    table.addCell(cell35);
+
+                    document.add(table);
                 }
-
-                // 不足20个,自动补齐
-                for (int k = 0; k < PAGE_SIZE - subList.size(); k++) {
-                    // 序号填充
-                    fillCell(table, i * 20 + subList.size() + k + 1, fontChina12, null);
-                    // 试卷密号
-                    fillCell(table, null, fontChina12, null);
-                    // 原档位
-                    fillCell(table, null, fontChina12, null);
-                    // 改后档位
-                    fillCell(table, null, fontChina12, null);
-                }
-
-                Paragraph pDate = new Paragraph(" 年        月        日", fontChina12);
-                pDate.setAlignment(Element.ALIGN_RIGHT);
-                pDate.setIndentationRight(20);
-
-                // 备注
-                PdfPCell cell34 = new PdfPCell();
-                cell34.setBorderWidth(0.5F);
-                cell34.setMinimumHeight(40);
-                cell34.setPhrase(new Paragraph("签字栏", fontChina12));
-                cell34.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
-                cell34.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
-                table.addCell(cell34);
-                PdfPCell cell35 = new PdfPCell();
-                cell35.setBorderWidth(0.5F);
-                cell35.setColspan(3);
-                cell35.addElement(blank1);
-                cell35.addElement(blank1);
-                cell35.addElement(blank1);
-                cell35.addElement(pDate);
-                cell35.addElement(blank1);
-                table.addCell(cell35);
-
-                document.add(table);
             }
             // 5:关闭文档
             document.close();

+ 1 - 1
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/ServletUtil.java

@@ -37,7 +37,7 @@ public class ServletUtil {
      */
     public static Long getWordId() {
         HttpServletRequest request = getRequest();
-        String workId = request.getHeader("workId");
+        String workId = request.getHeader("examId");
         return StringUtils.isBlank(workId) ? null : Long.valueOf(workId);
     }
 }

+ 1 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/CheckDataStatusEnum.java

@@ -8,7 +8,7 @@ public enum CheckDataStatusEnum {
     /**
      * 初始化
      */
-    INIT("初始化"),
+    INIT("未开始"),
     /**
      * 执行中
      */

+ 2 - 2
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java

@@ -304,8 +304,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     @Query("update Paper s set s.isMark = ?2 where s.id = ?1")
     void updatePaperMarkById(Long paperId, boolean isMark);
 
-    @Query(value = "select * from paper p where p.scan_user_id = ?1 order by p.updated_on desc limit 1", nativeQuery = true)
-    Paper findByScanUserIdOrderByUpdatedOnDescLimit(Long id);
+    @Query(value = "select * from paper p where p.scan_user_id = ?1 order by p.uploaded_on desc limit 1", nativeQuery = true)
+    Paper findByScanUserIdOrderByUploadedOnDescLimit(Long id);
 
     List<Paper> findByWorkIdAndIsMissing(Long workId, boolean missing);
 

+ 1 - 34
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java

@@ -246,36 +246,6 @@ public class MarkLogController {
      */
     @RequestMapping(value = "/equipmentMonitor", method = RequestMethod.GET)
     public Object saveCollectLog(Long workId, Pageable pageable) {
-        /*List<Map> mapList = markLogRepo.findByWorkId(workId);
-        if (!mapList.isEmpty()) {
-            List<Long> longs = mapList.stream().map(m -> Long.valueOf(m.get("id").toString())).collect(Collectors.toList());
-            Specification<MarkLog> specification = (root, query, builder) -> {
-                List<Predicate> predicates = new ArrayList<>();
-                if (longs.size() > 0) {
-                    CriteriaBuilder.In<Object> in = builder.in(root.get("id"));
-                    for (Long id : longs) {
-                        in.value(id);
-                    }
-                    predicates.add(builder.and(builder.and(in)));
-                }
-                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
-            };
-            Page<MarkLog> markLogs = markLogRepo.findAll(specification, pageable);
-            List<MarkLog> list = markLogs.getContent();
-            List<Map> arrayList = new ArrayList<>();
-            for (MarkLog markLog : list) {
-                Map map = new HashMap();
-                map.put("createUserName", markLog.getCreateUserName());
-                Paper paper = paperRepo.findOne(markLog.getPaperId());
-                PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
-                map.put("imgSrc", paperDTO.getImgSrc());
-                map.put("thumbSrc", paperDTO.getThumbSrc());
-                map.put("sheetSrc", paperDTO.getSheetSrc());
-                arrayList.add(map);
-            }
-
-            return new PageableDTO(arrayList, markLogs.getTotalElements(), markLogs.getTotalPages(), pageable.getPageNumber());
-        }*/
         Specification<MarkUser> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.equal(root.get("workId"), workId));
@@ -290,7 +260,7 @@ public class MarkLogController {
         for (MarkUser markUser : markUserList) {
             JSONObject object = new JSONObject();
             object.put("createUserName", markUser.getName());
-            Paper paper = paperRepo.findByScanUserIdOrderByUpdatedOnDescLimit(markUser.getId());
+            Paper paper = paperRepo.findByScanUserIdOrderByUploadedOnDescLimit(markUser.getId());
             PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
             object.put("imgSrc", paper == null ? null : paperDTO.getImgSrc());
             object.put("thumbSrc", paper == null ? null : paperDTO.getThumbSrc());
@@ -302,9 +272,6 @@ public class MarkLogController {
 
     /**
      * 设备监控
-     *
-     * @return
-     * @throws ParseException
      */
     @RequestMapping(value = "/listTypes", method = RequestMethod.GET)
     public Object listTypes() {

+ 2 - 2
stmms-ms-main/src/main/resources/application-dev.properties

@@ -1,6 +1,6 @@
 db.host=localhost
 db.port=3306
-db.dbName=msyj-local-v3.0.0-trial-1
+db.dbName=msyj-local-v3.0.0
 db.userName=root
 db.password=root
 
@@ -96,7 +96,7 @@ score.level.taskSort=paper
 #score.level.taskSort=paper
 
 #\u524D\u7AEF\u9759\u6001\u8D44\u6E90\u76EE\u5F55
-web.upload-path=D:\\company\\qmth\\bat-pro\\msyj\\local\\msyj-2021-local-v2.1.0-nginx\\dist\\
+web.upload-path=D:\\company\\qmth\\bat-pro\\msyj\\local\\msyj-local-v3.0.0-nginx\\dist\\
 spring.mvc.static-path-pattern=/**
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${sys.config.localhostPath},file:${web.upload-path}
 

+ 2 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -31,6 +31,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -388,6 +389,7 @@ public class MarkTaskApi {
      * @param markTaskId 评卷你任务id
      */
     @RequestMapping(value = "/mark_task", method = RequestMethod.POST)
+    @Transactional
     public Object markTask(@RequestParam Long markTaskId,
                            @RequestParam Boolean isMark) {
         markTaskRepo.updateMarkTaskMarkById(markTaskId, isMark);

+ 11 - 4
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -215,7 +215,6 @@ public class PaperApi {
             if (studentName != null && !"".equals(studentName)) {
                 predicates.add(builder.equal(root.get("studentName"), studentName));
             }
-            predicates.add(builder.equal(root.get("test"), 0));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
         List<PaperDTO> paperDTOs = new ArrayList<>();
@@ -246,13 +245,20 @@ public class PaperApi {
                             @RequestParam(defaultValue = "false") Boolean isScore,//打分阶段该档位已打分数
                             Pageable pageable) {
         ExamQuestion examQuestion = examQuestionRepo.findOne(questionId);
-        MarkSubject markSubject = markSubjectRepo.findOne(examQuestion.getWorkId() + "-" + examQuestion.getSubject().name());
+        Long workId = examQuestion.getWorkId();
+        MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + examQuestion.getSubject().name());
         Long markerId = ServletUtil.getUserId();
-        List<MarkerGroupLeader> markerGroupLeaders = markerGroupLeaderService.listByWorkIdAndSubjectAndStageAndMarkLeaderId(markSubject.getWorkId(), markSubject, markerId);
+        List<MarkerGroupLeader> markerGroupLeaders = markerGroupLeaderService.listByWorkIdAndSubjectAndStageAndMarkLeaderId(workId, markSubject, markerId);
         List<Long> paperIds = null;
         if (!CollectionUtils.isEmpty(markerGroupLeaders)) {
             List<Long> markers = markerGroupLeaders.stream().map(MarkerGroupLeader::getMarkerId).distinct().collect(Collectors.toList());
-            paperIds = markerGroupLeaderService.listPaperIdsByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage(), markers);
+            paperIds = markerGroupLeaderService.listPaperIdsByWorkIdAndSubjectAndStage(workId, markSubject.getSubject(), markSubject.getStage(), markers);
+        }
+
+        // 处理试评(大科组长能查询的试卷范围)
+        if (paperIds == null && markSubject.getTest() == TrialEnum.START_TRIAL.getId()) {
+            List<Paper> papers = paperRepo.findByWorkIdAndSubjectAndTest(workId, markSubject.getSubject(), TrialEnum.START_TRIAL.getId());
+            paperIds = papers.stream().map(Paper::getId).collect(Collectors.toList());
         }
 
         List<Long> finalPaperIds = paperIds;
@@ -738,6 +744,7 @@ public class PaperApi {
      * @param isMark  标记状态
      */
     @RequestMapping(value = "/mark_paper", method = RequestMethod.POST)
+    @Transactional
     public Object markPaper(@RequestParam Long paperId, @RequestParam boolean isMark) {
         paperRepo.updatePaperMarkById(paperId, isMark);
         return true;

+ 1 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java

@@ -103,7 +103,7 @@ public class MarkTaskAssembler {
             int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), Objects.nonNull(paper.isRejectedByLeader()) && paper.isRejectedByLeader() ? MarkLogOperType.CALLBACK_LEVEl.getId() : MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId());
             markTaskDTO.setRejectedCount(rejectedCount);
             markTaskDTO.setDeviationDirection(markTask.getDeviationDirection());
-
+            markTaskDTO.setMark(markTask.isMark());
         }
         return markTaskDTO;
     }

+ 9 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java

@@ -41,6 +41,7 @@ public class MarkTaskDTO implements Serializable{
     // 计算偏差范围使用
     private String dateMineResult;
     private String deviationDirection;
+    private Boolean isMark;
 
     public Integer getRandomSeq() {
         return randomSeq;
@@ -269,4 +270,12 @@ public class MarkTaskDTO implements Serializable{
     public void setDeviationDirection(String deviationDirection) {
         this.deviationDirection = deviationDirection;
     }
+
+    public Boolean getMark() {
+        return isMark;
+    }
+
+    public void setMark(Boolean mark) {
+        isMark = mark;
+    }
 }

+ 120 - 106
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/CheckDataService.java

@@ -11,6 +11,7 @@ import cn.com.qmth.stmms.ms.core.repository.CheckDataRepo;
 import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -24,7 +25,7 @@ import java.util.stream.Collectors;
 @Service
 public class CheckDataService {
 
-    private static final String SEPARATE = "#";
+    private static final String SEPARATE = "##";
 
     @Resource
     SystemConfig systemConfig;
@@ -54,20 +55,40 @@ public class CheckDataService {
 
         int errorCount = 0;
         List<JSONObject> list = null;
+        String content = null;
         try {
             Long workId = checkData.getWorkId();
             if (CheckItemEnum.PAPER_SIZE.equals(checkData.getCheckItem())) {
                 errorCount = checkPaperSize(workId);
+                if (errorCount > 0) {
+                    content = String.format("有%d张图片大小为0", errorCount);
+                }
             } else if (CheckItemEnum.ALL_SCORE.equals(checkData.getCheckItem())) {
-                errorCount = checkAllScore(workId);
+                Map<String, Long> map = checkAllScore(workId);
+                if (map != null) {
+                    errorCount = map.values().stream().mapToInt(Math::toIntExact).sum();
+                }
+                if (errorCount > 0) {
+                    StringJoiner stringJoiner = new StringJoiner(";");
+                    for (Map.Entry<String, Long> entry : map.entrySet()) {
+                        stringJoiner.add(String.format("%s有%d张没有成绩", entry.getKey(), entry.getValue()));
+                    }
+                    content = stringJoiner.toString();
+                }
             } else if (CheckItemEnum.LEVEL_SCORE_MATCH.equals(checkData.getCheckItem())) {
                 list = checkLevelScoreMatch(workId);
+                errorCount = list.size();
+                content = JSON.toJSONString(list);
             } else if (CheckItemEnum.LEVEL_DIFF.equals(checkData.getCheckItem())) {
-                list = checkLevelDiff(workId, checkData.getParamValue());
+                list = checkDiff(workId, checkData.getParamValue(), true);
+                errorCount = list.size();
+                content = JSON.toJSONString(list);
             } else if (CheckItemEnum.SCORE_DIFF.equals(checkData.getCheckItem())) {
-                list = checkScoreDiff(workId, checkData.getParamValue());
+                list = checkDiff(workId, checkData.getParamValue(), false);
+                errorCount = list.size();
+                content = JSON.toJSONString(list);
             } else {
-                throw new Exception("没有此类型任务");
+                throw new RuntimeException("没有此类型任务");
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -75,9 +96,7 @@ public class CheckDataService {
             checkData.setStatus(CheckDataStatusEnum.FINISH);
             checkData.setResult(errorCount == 0);
             checkData.setErrorCount(errorCount);
-            if (list != null && list.size() > 0) {
-                checkData.setContent(JSONObject.toJSONString(list));
-            }
+            checkData.setContent(content);
             checkData.setEndTime(new Date());
             checkDataRepo.saveAndFlush(checkData);
         }
@@ -106,7 +125,7 @@ public class CheckDataService {
 
     private int getZeroCount(int count, File fileDir) {
         List<File> files = getAllFile(fileDir);
-        if (files != null && files.size() > 0) {
+        if (!files.isEmpty()) {
             int zeroCount = Math.toIntExact(files.stream().filter(m -> m.length() == 0).count());
             count = count + zeroCount;
         }
@@ -118,12 +137,12 @@ public class CheckDataService {
      *
      * @param workId 工作ID
      */
-    private int checkAllScore(Long workId) {
+    private Map<String, Long> checkAllScore(Long workId) {
         List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
-        if (paperList != null && paperList.size() > 0) {
-            return Math.toIntExact(paperList.stream().filter(m -> m.getScore() == null).count());
+        if (paperList != null && !paperList.isEmpty()) {
+            return paperList.stream().filter(m -> m.getScore() == null).collect(Collectors.groupingBy(m -> m.getSubject().name(), Collectors.counting()));
         }
-        return 0;
+        return null;
     }
 
     /**
@@ -132,37 +151,55 @@ public class CheckDataService {
      * @param workId 工作ID
      */
     private List<JSONObject> checkLevelScoreMatch(Long workId) {
+        List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
         List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
         List<JSONObject> list = new ArrayList<>();
-        if (paperList != null && paperList.size() > 0) {
-            // 有未打分的,算未匹配
-            List<Paper> papers = paperList.stream().filter(m -> m.getScore() == null).collect(Collectors.toList());
-            if (papers.size() > 0) {
-                list = papers.stream().map(p -> {
-                    JSONObject object = new JSONObject();
-                    object.put("examNumber", p.getExamNumber());
-                    object.put("studentName", p.getStudentName());
-                    return object;
-                }).collect(Collectors.toList());
-            } else {
-                //分档、打分完成后,做匹配校验
-                List<Level> levels = levelRepo.findByWorkId(workId);
-                Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
+        if (paperList != null && !paperList.isEmpty()) {
+            // 多科目,先按准考证号+考生姓名分组
+            Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
+            List<Level> levels = levelRepo.findByWorkId(workId);
+            Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
+            for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
+                String key = entry.getKey();
+                String[] strings = key.split(SEPARATE);
+                List<Paper> papers = entry.getValue();
+                StringJoiner stringJoiner = new StringJoiner(";");
+                // 每个科目做比较
+                List<String> subjectsAll = markSubjects.stream().map(m -> m.getSubject().name()).collect(Collectors.toList());
+                papers.forEach(paper -> {
+                    String subject = paper.getSubject().name();
+                    subjectsAll.remove(subject);
+                    // 未分档
+                    if (paper.getLevel() == null) {
+                        stringJoiner.add(subject + "未分档");
+                        return;
+                    }
+                    // 未打分
+                    if (paper.getScore() == null) {
+                        stringJoiner.add(subject + "未打分");
+                        return;
+                    }
+                    Level level = levelMap.get(paper.getLevel());
+                    if (level == null) {
+                        stringJoiner.add("档位" + paper.getLevel() + "不存在");
+                        return;
+                    }
+                    // 已分档并打分,进行校验
+                    if (paper.getScore().intValue() <= level.getMinScore() || paper.getScore().intValue() >= level.getMaxScore()) {
+                        stringJoiner.add(String.format("%s档位[%s]分数[%s]不匹配", subject, paper.getLevel(), paper.getScore()));
+                    }
+                });
 
-                list = paperList.stream().filter(p -> {
-                    // 未分档的,不参与统计
-                    if (p.getLevel() == null) {
-                        return false;
+                // 未采集
+                if (!subjectsAll.isEmpty()) {
+                    for (String subject : subjectsAll) {
+                        stringJoiner.add(subject + "未采集");
                     }
-                    Level level = levelMap.get(p.getLevel());
-                    // 正常范围,是左开右闭
-                    return p.getScore().intValue() <= level.getMinScore() || p.getScore().intValue() >= level.getMaxScore();
-                }).map(p -> {
-                    JSONObject object = new JSONObject();
-                    object.put("examNumber", p.getExamNumber());
-                    object.put("studentName", p.getStudentName());
-                    return object;
-                }).collect(Collectors.toList());
+                }
+
+                if (stringJoiner.toString().length() > 1) {
+                    list.add(assembleErrorData(strings[0], strings[1], stringJoiner.toString()));
+                }
             }
         }
         return list;
@@ -173,66 +210,41 @@ public class CheckDataService {
      *
      * @param workId     工作ID
      * @param paramValue 变量参数值
+     * @param isLevel    是否校验档位
      */
-    private List<JSONObject> checkLevelDiff(Long workId, int paramValue) {
+    private List<JSONObject> checkDiff(Long workId, int paramValue, boolean isLevel) {
         List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
-
-        List<Level> levels = levelRepo.findByWorkId(workId);
-        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
-
-        List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
-        Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
-        List<JSONObject> list = new ArrayList<>();
-        for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
-            String key = entry.getKey();
-            List<Paper> papers = entry.getValue();
-            // 只考部分科目,校验不通过
-            if (papers.size() != markSubjects.size()) {
-                list.add(assembleErrorData(key, "只考" + papers.size() + "科"));
-            } else {
-                long noLevel = papers.stream().filter(m -> m.getLevel() == null).count();
-                if (noLevel > 0) {
-                    list.add(assembleErrorData(key, "有" + noLevel + "科未分档"));
-                } else {
-                    List<Integer> integers = papers.stream().map(m -> levelMap.get(m.getLevel()).getLevelValue()).collect(Collectors.toList());
-                    // true为校验通过,false为不通过
-                    boolean checkFlag = calcDiff(integers, paramValue);
-                    if (!checkFlag) {
-                        list.add(assembleErrorData(key, "最大差值大于" + paramValue));
-                    }
-                }
-            }
+        Map<String, Level> levelMap = new HashMap<>();
+        if (isLevel) {
+            List<Level> levels = levelRepo.findByWorkId(workId);
+            levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
         }
-        return list;
-    }
 
-    /**
-     * 同一考生各科目成绩差
-     *
-     * @param workId     工作ID
-     * @param paramValue 变量参数值
-     */
-    private List<JSONObject> checkScoreDiff(Long workId, int paramValue) {
-        List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
         List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
         Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
         List<JSONObject> list = new ArrayList<>();
         for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
             String key = entry.getKey();
+            String[] strings = key.split(SEPARATE);
             List<Paper> papers = entry.getValue();
             // 只考部分科目,校验不通过
             if (papers.size() != markSubjects.size()) {
-                list.add(assembleErrorData(key, "只考" + papers.size() + "科"));
+                list.add(assembleErrorData(strings[0], strings[1], "只考" + papers.size() + "科,无法校验"));
             } else {
-                long noScore = papers.stream().filter(m -> m.getLevel() != null && m.getScore() == null).count();
-                if (noScore > 0) {
-                    list.add(assembleErrorData(key, "有" + noScore + "科已分档未打分"));
+                long noLevel = papers.stream().filter(m -> isLevel ? m.getLevel() == null : m.getScore() == null).count();
+                if (noLevel > 0) {
+                    list.add(assembleErrorData(strings[0], strings[1], "有" + noLevel + "科未" + (isLevel ? "分档" : "打分") + ",无法校验"));
                 } else {
-                    List<Integer> integers = papers.stream().map(m -> m.getScore().intValue()).collect(Collectors.toList());
-                    // true为校验通过,false为不通过
-                    boolean checkFlag = calcDiff(integers, paramValue);
-                    if (!checkFlag) {
-                        list.add(assembleErrorData(key, "最大差值大于" + paramValue));
+                    Map<String, Level> finalLevelMap = levelMap;
+                    Map<String, Integer> integersMap = papers.stream().collect(Collectors.toMap(m -> m.getSubject().name(), m -> isLevel ? finalLevelMap.get(m.getLevel()).getLevelValue() : m.getScore().intValue()));
+                    // 校验详情
+                    Map<String[], Integer> map = calcDiff(integersMap, paramValue);
+                    if (!map.isEmpty()) {
+                        StringJoiner stringJoiner = new StringJoiner(";");
+                        for (Map.Entry<String[], Integer> integerEntry : map.entrySet()) {
+                            stringJoiner.add(String.format("%s相差%d", Arrays.toString(integerEntry.getKey()), integerEntry.getValue()));
+                        }
+                        list.add(assembleErrorData(strings[0], strings[1], stringJoiner.toString()));
                     }
                 }
             }
@@ -243,36 +255,38 @@ public class CheckDataService {
     /**
      * 计算差值
      *
-     * @param integers   值集合
-     * @param paramValue 变量
+     * @param integersMap 值
+     * @param paramValue  变量
      * @return true为通过,false为不通过
      */
-    private boolean calcDiff(List<Integer> integers, int paramValue) {
-        List<Integer> diffList = new ArrayList<>();
-        for (int i = 0; i < integers.size(); i++) {
-            for (int j = i; j < integers.size(); j++) {
+    private Map<String[], Integer> calcDiff(Map<String, Integer> integersMap, int paramValue) {
+        Map<String[], Integer> map = new HashMap<>();
+        List<String> stringList = new ArrayList<>(integersMap.keySet());
+        for (int i = 0; i < stringList.size(); i++) {
+            for (int j = i; j < stringList.size(); j++) {
                 if (i != j) {
-                    int diffValue = Math.abs(integers.get(i) - integers.get(j));
-                    diffList.add(diffValue);
+                    int diffValue = Math.abs(integersMap.get(stringList.get(i)) - integersMap.get(stringList.get(j)));
+                    if (diffValue > paramValue) {
+                        String[] key = {stringList.get(i), stringList.get(j)};
+                        map.put(key, diffValue);
+                    }
                 }
             }
         }
-        // A和C,差值为2,若paramValue=2,不通过,返回false,paramValue = 1,通过,返回true
-        int maxDiff = diffList.stream().max(Comparator.comparing(i -> i)).get();
-        return maxDiff < paramValue;
+        return map;
     }
 
     /**
      * 组装错误信息
      *
-     * @param key          分组key(准考证号#考生姓名)
+     * @param examNumber   准考证号
+     * @param studentName  考生姓名
      * @param errorMessage 错误信息
      */
-    private JSONObject assembleErrorData(String key, String errorMessage) {
+    private JSONObject assembleErrorData(String examNumber, String studentName, String errorMessage) {
         JSONObject object = new JSONObject();
-        String[] strings = key.split(SEPARATE);
-        object.put("examNumber", strings[0]);
-        object.put("studentName", strings[1]);
+        object.put("examNumber", examNumber);
+        object.put("studentName", studentName);
         object.put("errorMessage", errorMessage);
         return object;
     }
@@ -283,15 +297,15 @@ public class CheckDataService {
      * @param dirFile 文件夹
      */
     public static List<File> getAllFile(File dirFile) {
+        List<File> files = new ArrayList<>();
         // 如果文件夹不存在或着不是文件夹,则返回 null
         if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile())
-            return null;
+            return files;
 
         File[] childrenFiles = dirFile.listFiles();
         if (Objects.isNull(childrenFiles) || childrenFiles.length == 0)
-            return null;
+            return files;
 
-        List<File> files = new ArrayList<>();
         for (File childFile : childrenFiles) {
 
             // 如果时文件,直接添加到结果集合
@@ -300,7 +314,7 @@ public class CheckDataService {
             } else {
                 // 如果是文件夹,则将其内部文件添加进结果集合
                 List<File> cFiles = getAllFile(childFile);
-                if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
+                if (cFiles.isEmpty()) {
                     continue;
                 }
                 files.addAll(cFiles);

+ 1 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -183,7 +183,7 @@ public class StageControlService {
             }
         }
 
-        List<Paper> papers = null;
+        List<Paper> papers;
         if (markSubject.getTest() == 1) {
             papers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false, markSubject.getTest());
         } else {