浏览代码

线上版本-与线下功能同步

xiaof 4 年之前
父节点
当前提交
ce34ef3a46
共有 22 个文件被更改,包括 690 次插入252 次删除
  1. 30 23
      sql/美术-线上-最新数据结构-20201116.sql
  2. 11 8
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java
  3. 1 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/StudentExporter.java
  4. 2 2
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  5. 38 9
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java
  6. 2 2
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/RandomUtil.java
  7. 1 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  8. 23 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTask.java
  9. 29 6
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  10. 14 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  11. 7 2
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java
  12. 2 1
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java
  13. 4 4
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java
  14. 5 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ChangeLevelApi.java
  15. 228 49
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  16. 74 34
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  17. 32 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  18. 1 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/TaskApi.java
  19. 66 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  20. 20 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/LevelStatDTO.java
  21. 94 99
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java
  22. 6 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

+ 30 - 23
sql/美术-线上-最新数据结构-20201116.sql

@@ -11,7 +11,7 @@
  Target Server Version : 50717
  File Encoding         : 65001
 
- Date: 16/11/2020 00:12:19
+ Date: 27/01/2021 16:50:34
 */
 
 SET NAMES utf8mb4;
@@ -56,9 +56,9 @@ CREATE TABLE `change_level`  (
   `audit_id` bigint(20) NULL DEFAULT NULL COMMENT '审核用户id',
   `audit_date` datetime(0) NULL DEFAULT NULL COMMENT '审核时间',
   `suggest_level` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `is_curr` int(11) NULL DEFAULT NULL,
+  `is_curr` tinyint(1) NULL DEFAULT NULL COMMENT '是否最新',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '改档记录表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '改档记录表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for exam_question
@@ -73,7 +73,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 = 49 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 53 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for exam_score_prop
@@ -135,8 +135,9 @@ CREATE TABLE `inspect_task`  (
   `score` int(11) NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `FK4e9mfahf522t4ej4y4yd065dh`(`paper_id`) USING BTREE,
-  CONSTRAINT `FK4e9mfahf522t4ej4y4yd065dh` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `inspect_task_ibfk_1` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `inspect_task_ibfk_10` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `inspect_task_ibfk_11` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `inspect_task_ibfk_2` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `inspect_task_ibfk_3` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `inspect_task_ibfk_4` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
@@ -166,8 +167,9 @@ CREATE TABLE `level`  (
   `kdpt` int(11) NOT NULL,
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `idx_level_workId_code`(`work_id`, `code`) USING BTREE,
-  CONSTRAINT `FK3km0g7jbkt78oj20csqeh26f2` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_1` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `level_ibfk_10` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `level_ibfk_11` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_2` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_3` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_4` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
@@ -176,7 +178,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 = 146 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 157 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_log
@@ -204,7 +206,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 = 606 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 696 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_subject
@@ -224,8 +226,9 @@ CREATE TABLE `mark_subject`  (
   `enable` tinyint(1) NULL DEFAULT 1 COMMENT '是否启用 0:禁用 1:启用',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `FK1tvc2mil1ebqgt08912t4hxqw`(`work_id`) USING BTREE,
-  CONSTRAINT `FK1tvc2mil1ebqgt08912t4hxqw` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_subject_ibfk_1` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_subject_ibfk_10` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_subject_ibfk_11` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_subject_ibfk_2` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_subject_ibfk_3` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_subject_ibfk_4` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
@@ -250,6 +253,7 @@ CREATE TABLE `mark_task`  (
   `origin_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `question_id` bigint(20) NULL DEFAULT NULL,
   `result` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `level` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
   `stage` int(11) NOT NULL,
   `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `updated_on` datetime(0) NULL DEFAULT NULL,
@@ -265,12 +269,14 @@ CREATE TABLE `mark_task`  (
   `serial_number` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '叫号序号',
   `display_number` int(11) NULL DEFAULT NULL,
   `manual_score` tinyint(1) NULL DEFAULT NULL COMMENT '是否手工输入打分,1-是、0-否(分档阶段无此值)',
+  `is_sample` bit(1) NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
-  INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`) USING BTREE,
-  INDEX `idx_union_1`(`marker_id`, `stage`, `result`) USING BTREE,
-  CONSTRAINT `FKa6xqlu9ml2e47x1o2u2yec7vm` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
+  INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE,
   CONSTRAINT `mark_task_ibfk_1` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_ibfk_10` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_ibfk_11` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_2` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_3` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_4` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
@@ -293,7 +299,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 = 86 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 94 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_user
@@ -327,8 +333,9 @@ CREATE TABLE `mark_user`  (
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `UK_cyf7k1neuij8lma85x19omo07`(`login_name`) USING BTREE,
   INDEX `FKinr4i9gbxj9njwo82s7cc89q5`(`group_id`) USING BTREE,
-  CONSTRAINT `FKinr4i9gbxj9njwo82s7cc89q5` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_user_ibfk_10` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_user_ibfk_11` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_2` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_3` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_4` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
@@ -337,7 +344,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 = 183 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 193 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for marker_group
@@ -411,12 +418,12 @@ CREATE TABLE `paper`  (
   `is_one_click` bit(1) NULL DEFAULT b'0' COMMENT '是否一键定档',
   `is_rejected_by_leader` bit(1) NULL DEFAULT b'0' COMMENT '是否科组长打回',
   PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_paper_index`(`idx`) USING BTREE,
   INDEX `idx_paper_exam_number`(`exam_number`) USING BTREE,
-  INDEX `idx_paper_area_code`(`area_code`) USING BTREE,
-  INDEX `is_missing`(`is_missing`, `is_test`, `batch_no`) USING BTREE,
-  INDEX `idx_paper_student_name`(`level`, `score_batch_no`) USING BTREE,
-  INDEX `idx_union_1`(`is_missing`, `score_batch_no`, `is_shift`, `is_shift_score`) USING BTREE
+  INDEX `idx_union_1`(`batch_no`) USING BTREE,
+  INDEX `idx_union_2`(`question_id`, `level`) USING BTREE,
+  INDEX `idx_union_3`(`work_id`, `subject`, `batch_no`) USING BTREE,
+  INDEX `idx_union_4`(`is_shift`, `is_shift_score`) USING BTREE,
+  INDEX `idx_union_5`(`work_id`, `subject`, `score_batch_no`) USING BTREE
 ) ENGINE = InnoDB AUTO_INCREMENT = 472 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
@@ -441,7 +448,7 @@ CREATE TABLE `param_setting`  (
   `score_show_all_paper` tinyint(1) NULL DEFAULT NULL COMMENT '打分阶段阅卷员是否显示所有试卷(1:是、0:否)',
   `is_level_to_score` tinyint(1) NULL DEFAULT NULL COMMENT '是否谁分档谁打分',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 40 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 41 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for shiwai
@@ -478,7 +485,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 = 553 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 617 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for task_publish_setting
@@ -512,6 +519,6 @@ CREATE TABLE `work`  (
   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `organization_id` bigint(20) NULL DEFAULT NULL COMMENT '机构id',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 70 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 71 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 11 - 8
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java

@@ -10,15 +10,9 @@ import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.utils.OssUtil;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
-import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.domain.Student;
-import cn.com.qmth.stmms.ms.core.domain.Work;
+import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
-import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
-import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
-import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
-import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
+import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
@@ -57,6 +51,9 @@ public class ScoreApi {
     @Autowired
     private MarkTaskRepo markTaskRepo;
 
+    @Autowired
+    private MarkSubjectRepo markSubjectRepo;
+
     @Autowired
     private StudentRepo studentRepo;
 
@@ -398,6 +395,12 @@ public class ScoreApi {
     public ResponseEntity doMissing(@PathVariable("id") Long id) {
         //更新为缺考
         Paper paper = paperRepo.findOne(id);
+        //开启正评任务后,不能再标记缺考
+        MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId()+"-"+paper.getSubject().name());
+        if(markSubject.getStage() != MarkStage.INIT && markSubject.getTest() == 0) {
+            throw new RuntimeException("正评阶段不允许设置缺考");
+        }
+
         paper.setIsMissing(!paper.getIsMissing());
         paperRepo.save(paper);
         Map map = new HashMap();

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

@@ -27,7 +27,7 @@ public class StudentExporter {
     private StudentRepo studentRepo;
 
     @GetMapping
-    public void export(@RequestParam StudentSpecification params, HttpServletResponse response) {
+    public void export(StudentSpecification params, HttpServletResponse response) {
 
         List<Student> students = studentRepo.findAll(params.getSpecification());
         List<StudentExpDTO> list = new ArrayList<>();

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

@@ -865,7 +865,7 @@ public class CollectApi {
         try {
             //首先根据workId和阶段去查所有试卷
             StringBuffer sql = new StringBuffer();
-            sql.append("SELECT s.id studentId,s.name studentName,s.school, p.work_id workId, p.subject, p.area_code areaCode, p.exam_number examNumber, 0+cast(p.score as char) as score FROM paper p LEFT JOIN student s ON p.work_id = s.work_id AND p.exam_number = s.exam_number WHERE p.score is not null and p.work_id = ").append(workId);
+            sql.append("SELECT s.id studentId,s.name studentName,s.school, p.work_id workId, p.subject, p.area_code areaCode, p.exam_number examNumber, 0+cast(p.score as char) as score FROM paper p LEFT JOIN student s ON p.work_id = s.work_id AND p.exam_number = s.exam_number WHERE p.work_id = ").append(workId);
             if (startScore != null && endScore != null) {
                 sql.append(" and p.score >= ").append(startScore);
                 sql.append(" and p.score <= ").append(endScore);
@@ -1094,7 +1094,7 @@ public class CollectApi {
                 }
                 String path;
                 if (Objects.equals("1", imageType)) {
-                    path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject1
+                    path = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject1
                             + File.separator + areaCode;
                 } else if (Objects.equals("2", imageType)) {
                     path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject1

+ 38 - 9
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java

@@ -56,6 +56,7 @@ public class RotateTask implements Runnable {
             String imagePath = null;
             String imageNew = null;
             String sliceMD5 = null;
+
             LOGGER.info("准备生成缩略和裁切旋转图:{}", start);
             if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
                 try {
@@ -71,6 +72,7 @@ public class RotateTask implements Runnable {
                             + File.separator + paper.getAreaCode() + File.separator + imageMd5;
 
                     //缩略图旋转生成
+                    LOGGER.info("加密-生成缩略图:原文件名{},读取原始文件开始", imageMd5);
                     String thumbOldPath = thumbPath + ".jpg";
                     String thumbTempPath = thumbPath + "temp.jpg";
                     File thumbOldFile = new File(thumbOldPath);
@@ -82,11 +84,22 @@ public class RotateTask implements Runnable {
                     is.close();
                     outputStream.flush();
                     outputStream.close();
+                    LOGGER.info("加密-生成缩略图:原文件名{},读取原始文件结束,temp图片是否存在:{}", imageMd5, thumbTempFile.exists());
 
                     //原图旋转
-                    ImageCompression.rotate(thumbTempFile, thumbTempFile, degree);
-                    thumbOldFile.renameTo(new File(thumbNew + "_" + start + ".jpg"));
-                    thumbTempFile.renameTo(new File(thumbOldPath));
+                    try {
+                        ImageCompression.rotate(thumbTempFile, thumbTempFile, degree);
+                    } catch (IOException e) {
+                        LOGGER.info("加密-生成缩略图:原文件名{},旋转失败,错误原因:{}", imageMd5, e.getMessage());
+                    }
+                    LOGGER.info("加密-生成缩略图:原文件名{},重命名开始", imageMd5);
+                    File thumbFileNew = new File(thumbNew + "_" + start + ".jpg");
+                    thumbFileNew.delete();
+                    thumbOldFile.renameTo(thumbFileNew);
+                    thumbOldFile.delete();
+                    thumbTempFile.renameTo(thumbOldFile);
+                    LOGGER.info("加密-生成缩略图:原文件名{},重命名结束", imageMd5);
+
                     //加密旋转图
                     InputStream is1 = new ByteArrayInputStream(FileCopyUtils.copyToByteArray(thumbOldFile));
                     OutputStream outputStream1 = new FileOutputStream(thumbOldFile);
@@ -94,8 +107,10 @@ public class RotateTask implements Runnable {
                     is1.close();
                     outputStream1.flush();
                     outputStream1.close();
+                    LOGGER.info("加密-生成缩略图:原文件名{},加密旋转图结束", imageMd5);
 
                     //裁切原图旋转生成
+                    LOGGER.info("加密-生成裁切图:原文件名{},读取原始文件开始", imageMd5);
                     String imageOldPath = imagePath + ".jpg";
                     String imageTempPath = imagePath + "temp.jpg";
                     File imageOldFile = new File(imageOldPath);
@@ -107,11 +122,21 @@ public class RotateTask implements Runnable {
                     is2.close();
                     outputStream2.flush();
                     outputStream2.close();
+                    LOGGER.info("加密-生成裁切图:原文件名{},读取原始文件结束,temp图片是否存在:{}", imageMd5, imageTempFile.exists());
 
                     //原图旋转
-                    ImageCompression.rotate(imageTempFile, imageTempFile, degree);
-                    imageOldFile.renameTo(new File(imageNew + "_" + start + ".jpg"));
-                    imageTempFile.renameTo(new File(imageOldPath));
+                    try {
+                        ImageCompression.rotate(imageTempFile, imageTempFile, degree);
+                    } catch (IOException e) {
+                        LOGGER.info("加密-生成裁切图:原文件名{},旋转失败,错误原因:{}", imageMd5, e.getMessage());
+                    }
+                    LOGGER.info("加密-生成裁切图:原文件名{},重命名开始", imageMd5);
+                    File imageFileNew = new File(imageNew + "_" + start + ".jpg");
+                    imageFileNew.delete();
+                    imageOldFile.renameTo(imageFileNew);
+                    imageOldFile.delete();
+                    imageTempFile.renameTo(imageOldFile);
+                    LOGGER.info("加密-生成裁切图:原文件名{},重命名结束", imageMd5);
                     //加密旋转图
                     InputStream is3 = new ByteArrayInputStream(FileCopyUtils.copyToByteArray(imageOldFile));
                     OutputStream outputStream3 = new FileOutputStream(imageOldFile);
@@ -119,6 +144,7 @@ public class RotateTask implements Runnable {
                     is3.close();
                     outputStream3.flush();
                     outputStream3.close();
+                    LOGGER.info("加密-生成裁切图:原文件名{},加密旋转图结束", imageMd5);
 
                     InputStream is4 = new FileInputStream(imageOldFile);
                     sliceMD5 = DigestUtils.md5Hex(is4);
@@ -229,11 +255,11 @@ public class RotateTask implements Runnable {
                             new File(thumbNew).renameTo(thumbFile);
                             LOGGER.info("生成缩略图:失败。原文件名{},还原结束", fileName);
                         }
-
                         LOGGER.info("生成缩略图:原文件名{},旋转结束", fileName);
+
                     }
 
-                    if (!thumbFile.exists()) {
+                    if (!thumbFile.exists() || thumbFile.length() == 0) {
                         LOGGER.info("生成缩略图:原文件名{},目标文件丢失,还原图片开始", fileName);
                         thumbFile.delete();
                         new File(thumbNew).renameTo(thumbFile);
@@ -251,6 +277,7 @@ public class RotateTask implements Runnable {
                         imageFileNew.delete();
                         imageFile.renameTo(imageFileNew);
                         LOGGER.info("生成裁切图:原文件名{},重命名为新文件名结束,开始旋转", fileName);
+
                         try {
                             ImageCompression.rotate(new File(imageNew), new File(imagePath), degree);
                         } catch (IOException e) {
@@ -263,7 +290,7 @@ public class RotateTask implements Runnable {
 
                         LOGGER.info("生成裁切图:原文件名{},旋转结束", fileName);
                     }
-                    if (!imageFile.exists()) {
+                    if (!imageFile.exists() || imageFile.length() == 0) {
                         LOGGER.info("生成裁切图:原文件名{},目标文件丢失,还原图片开始", fileName);
                         imageFile.delete();
                         new File(imageNew).renameTo(imageFile);
@@ -272,9 +299,11 @@ public class RotateTask implements Runnable {
                         LOGGER.info("生成裁切图:原文件名{},旋转成功", fileName);
                     }
                     LOGGER.info("生成裁切图结束:原文件名{}", fileName);
+
                     FileInputStream in = new FileInputStream(new File(imagePath));
                     sliceMD5 = DigestUtils.md5Hex(in);
                     in.close();
+
                 }
             }
             long end = System.currentTimeMillis();

+ 2 - 2
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/RandomUtil.java

@@ -17,8 +17,8 @@ import java.util.*;
 @Component
 public class RandomUtil {
     private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(RandomUtil.class);
-    private final int minSize = 1000000;
-    private final int maxSize = 1000001;
+    private final int minSize = 10000000;
+    private final int maxSize = 10000001;
     private final int randomSize = 2000000;
     private int randomNum = 0;
     private Map<Long, List<Long>> randomMap = new HashMap<>();

+ 1 - 4
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java

@@ -13,10 +13,7 @@ import java.util.Date;
  */
 @Entity
 @Table(indexes = {
-        @Index(name = "idx_paper_index", columnList = "idx"),
-        @Index(name = "idx_paper_exam_number", columnList = "examNumber"),
-        @Index(name = "idx_paper_area_code", columnList = "areaCode"),
-        @Index(name = "idx_paper_student_name", columnList = "studentName")})
+        @Index(name = "idx_paper_exam_number", columnList = "examNumber")})
 public class Paper implements Serializable {
 
     private static final long serialVersionUID = 3200579901138269179L;

+ 23 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTask.java

@@ -49,6 +49,8 @@ public class MarkTask implements Serializable {
 
     private String result;
 
+    private String level;
+
     private String originLevel;
 
     private Integer levelValue;
@@ -93,6 +95,8 @@ public class MarkTask implements Serializable {
 
     private Integer displayNumber;
 
+    private boolean isSample;
+
     private Integer manualScore;
 
     public Long getBatchNo() {
@@ -176,6 +180,7 @@ public class MarkTask implements Serializable {
         this.secretNumber = markerId + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
         this.randomSeqNew = randomSeqNew;
         this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
+        this.isSample = paper.isSample();
     }
 
     public MarkTask(MarkUser marker, Paper paper, Level level, MarkStage stage, Long randomSeqNew, int test) {
@@ -194,6 +199,8 @@ public class MarkTask implements Serializable {
         this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
 
         this.result = paper.getLevel();
+        this.level = paper.getLevel();
+        this.isSample = paper.isSample();
         this.levelValue = level.getLevelValue();
         this.updatedOn = new Date();
     }
@@ -352,4 +359,20 @@ public class MarkTask implements Serializable {
     public void setManualScore(Integer manualScore) {
         this.manualScore = manualScore;
     }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public boolean isSample() {
+        return isSample;
+    }
+
+    public void setSample(boolean sample) {
+        isSample = sample;
+    }
 }

+ 29 - 6
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -5,6 +5,7 @@ import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
@@ -37,22 +38,25 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     long countByMarkerId(Long markerId);
 
-    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no = ?2 where m.question_id = ?1 and m.marker_id = ?3", nativeQuery = true)
+    @Query(value = "select count(1) from (select * from mark_task where question_id = ?1 and marker_id = ?3) m inner join paper p on m.paper_id = p.id and p.batch_no = ?2", nativeQuery = true)
     long countByQuestionId(Long questionId, Long batchNo, Long markerId);
 
+    @Query(value = "select count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?3 and m.batch_no = ?2", nativeQuery = true)
+    long countByQuestionIdAndBatchNo(Long questionId, Long batchNo, Long markerId);
+
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.score_batch_no = ?2 where m.question_id = ?1 and m.marker_id = ?3", nativeQuery = true)
     long countScoreByQuestionId(Long questionId, Long batchNo, Long markerId);
 
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?2", nativeQuery = true)
     long countScoreByQuestionIdAll(Long questionId, Long markerId);
 
-    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and p.batch_no = ?5 and p.is_rejected = false", nativeQuery = true)
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and m.is_rejected = false", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
 
-    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and p.batch_no is not null and p.is_rejected = false ", nativeQuery = true)
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and m.is_rejected = false", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
 
-    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.level = ?4 and p.score_batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.score_batch_no = ?5 and p.level = ?4 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
     int countScoreByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
 
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.level = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
@@ -169,12 +173,18 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
             "WHERE t.workId = ?1 and t.subject = ?2 and t.markerId = ?3 and t.stage = ?4 and t.questionId = ?5 ")
     Integer findRandomSeqByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId);
 
-    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and p.is_rejected = false", nativeQuery = true)
+    @Query(value = "SELECT count(1) from mark_task m inner join (select * from paper where batch_no = ?5 and is_missing = ?4 and is_rejected = false) p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long markerId, int stage, boolean isMissing, Long batchNo);
 
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no = ?4 and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultNull(Long questionId, Long markerId, int stage, Long batchNo);
+
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no = ?5 and p.is_shift = 0 and p.is_shift_score = 0 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long markerId, int stage, boolean isMissing, Long batchNo);
 
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 0 and p.score_batch_no = ?4 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(Long questionId, Long markerId, int stage, Long batchNo);
+
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and p.is_shift = 0 and p.is_shift_score = 0", nativeQuery = true)
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissingAll(Long questionId, Long markerId, int stage, boolean isMissing);
 
@@ -197,18 +207,27 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.is_shift = 0 and p.is_shift_score = 1 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
     int countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long id, int ordinal, boolean b);
 
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 1 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(Long questionId, Long id, int ordinal);
+
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2", nativeQuery = true)
     long countByQuestionIdAll(Long questionId, Long markId);
 
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and p.is_rejected = false", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissingAll(Long questionId, Long markerId, int stage, boolean isMissing);
 
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no is not null and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(Long questionId, Long markerId, int stage);
+
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?5 and m.stage = ?2 and m.result =?3 and p.is_rejected = false", nativeQuery = true)
     int countByQuestionIdAndStageAndResultAndIsMissingAll(Long questionId, int stage, String result, boolean isMissing,Long markerId);
 
-    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and p.is_rejected = true  and m.is_rejected = true", nativeQuery = true)
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and p.is_rejected = true", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(Long questionId, Long markerId, int ordinal,boolean isMissing);
 
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and  m.batch_no is not null and m.is_rejected = true", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(Long questionId, Long markerId, int ordinal);
+
     List<MarkTask> findByWorkIdAndSubjectAndMarkerIdAndStage(Long workId, Subject subject, Long valueOf, MarkStage stage);
 
     int countByWorkIdAndStageAndResultNotNull(Long id, MarkStage level);
@@ -231,4 +250,8 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
 
     @Query(value = "select id, random_seq_new randomSeqNew from mark_task m where m.work_id = ?1", nativeQuery = true)
     List<Object[]> findAllByWorkId(Long workId);
+
+    @Modifying
+    @Query(value = "update mark_task m set m.level = ?1 where m.paper_id = ?2", nativeQuery = true)
+    void updateLevelByPaperId(String level, Long id);
 }

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

@@ -86,11 +86,11 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     List<Object[]> countGroupByLevel(Long questionId, Long batchNo);
 
     @Query(value = "SELECT p.`level`,COUNT(*)," +
-            "SUM(IF(p.`is_rejected` = 1, 1, 0))," +
-            "SUM(IF(p.`is_arbitrated` = 1, 1, 0))" +
+            "SUM(p.`is_rejected`)," +
+            "SUM(p.`is_arbitrated`)" +
             "FROM paper p " +
-            "WHERE p.`question_id` = ? and p.is_missing = false and p.batch_no is not null " +
-            "GROUP BY p.`level` ORDER BY p.`level`", nativeQuery = true)
+            "WHERE p.`question_id` = ? and p.batch_no is not null " +
+            "GROUP BY p.`level`", nativeQuery = true)
     List<Object[]> countGroupByLevel(Long questionId);
 
     /**
@@ -191,6 +191,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     long countByWorkIdAndQuestionId(Long workId, Long questionId);
 
+    long countByQuestionId(Long questionId);
+
     /**
      * 统计同一个考生的paper数量
      *
@@ -285,6 +287,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     long countByWorkIdAndSubjectAndQuestionIdAndLevel(Long workId,
                                                       Subject subject, Long id, String code);
 
+    long countByQuestionIdAndLevelAndSubjectAndWorkId(Long questionId, String code, Subject subject ,Long workId);
+
     long countByWorkIdAndSubjectAndQuestionId(Long workId, Subject subject,
                                               Long id);
 
@@ -370,9 +374,15 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     @Query("select max(p.batchNo) from Paper p where p.workId = ?1 and p.subject = ?2")
     Long findMaxBatchNoByWorkIdAndSubject(Long workId, Subject subject);
 
+    @Query(value = "select cast(p.batch_no as char) from paper p where p.work_id = ?1 and p.subject = ?2 order by p.batch_no desc limit 1", nativeQuery = true)
+    List<Object> findBatchNoByWorkIdAndSubject(Long workId, String subject);
+
     @Query("select max(p.scoreBatchNo) from Paper p where p.workId = ?1 and p.subject = ?2")
     Long findMaxScoreBatchNoByWorkIdAndSubject(Long workId, Subject subject);
 
+    @Query(value = "select cast(p.score_batch_no as char) from paper p where p.work_id = ?1 and p.subject = ?2 order by score_batch_no desc limit 1", nativeQuery = true)
+    List<Object> findScoreBatchNoByWorkIdAndSubject(Long workId, String subject);
+
     List<Paper> findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTestAndLevelIsNull(Long workId, Subject valueOf, Long questionId, boolean b, int ordinal);
 
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);

+ 7 - 2
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java

@@ -301,6 +301,7 @@ public class MarkLogAop {
                                 m.setRejected(true);
                                 m.setOriginLevel(m.getResult());
                                 m.setResult(null);
+                                m.setLevel(null);
                                 MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(m.getMarkerId(), MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId(), m.getSubject().toString(), paper.getExamNumber());
                                 if (Objects.nonNull(markLogPrev)) {
                                     operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse("-");
@@ -386,8 +387,12 @@ public class MarkLogAop {
         if (Objects.nonNull(markTask)) {
             markUser = markUserRepo.findOne(markTask.getMarkerId());
         } else {
-            String[] strs = token.split("#");
-            markUser = strs == null || strs[2] == null || strs[2] == "null" ? null : markUserRepo.findOne(Long.parseLong(strs[2]));
+            String userId = request.getHeader("userId");
+            markUser = markUserRepo.findOne(Long.valueOf(userId));
+            if(Objects.isNull(markUser)) {
+                String[] strs = token.split("#");
+                markUser = strs == null || strs[2] == null || strs[2] == "null" ? null : markUserRepo.findOne(Long.parseLong(strs[2]));
+            }
         }
         LOGGER.info("markUser:{}", JSONObject.toJSONString(markUser));
 //        String[] argNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();//参数名

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

@@ -263,7 +263,8 @@ public class MarkLogController {
                 Map map = new HashMap();
                 map.put("createUserName", markLog.getCreateUserName());
                 Paper paper = paperRepo.findOne(markLog.getPaperId());
-                PaperDTO paperDTO = paperAssembler.toDTO(paper);
+//                PaperDTO paperDTO = paperAssembler.toDTO(paper);
+                PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
                 map.put("imgSrc", paperDTO.getImgSrc());
                 map.put("thumbSrc", paperDTO.getThumbSrc());
                 arrayList.add(map);

+ 4 - 4
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java

@@ -193,20 +193,20 @@ public class ScheduledTask implements InitializingBean {
     @Transactional
     public void repairRepeatTask(Long workId) {
         try {
-            String sql = "select * from (select mt.random_seq_new, count(mt.random_seq_new) as seq from mark_task mt where mt.work_id = ? group by mt.random_seq_new) temp where temp.seq > 1 LIMIT 500";
+            String sql = "select * from (select mt.secret_number, count(mt.secret_number) as seq from mark_task mt where mt.work_id = ? group by mt.secret_number) temp where temp.seq > 1 LIMIT 500";
             List list = sqlUtil.execSqlForMapNative(sql, workId);
             Set tasks = new HashSet();
             if (Objects.nonNull(list) && list.size() > 0) {
                 this.repairTask = true;
                 for (int i = 0; i < list.size(); i++) {
                     Map map = (Map) list.get(i);
-                    Long randomSeq = Long.parseLong(String.valueOf(map.get("random_seq_new")));
-                    List<MarkTask> markTaskList = markTaskRepo.findByRandomSeqNew(randomSeq);
+                    String randomSeq = String.valueOf(map.get("secret_number"));
+                    List<MarkTask> markTaskList = markTaskRepo.findByWorkIdAndSecretNumber(workId, randomSeq);
                     markTaskList.remove(0);//删除一条
                     for (MarkTask markTask : markTaskList) {
                         Long randomNew = this.getRandomTask(markTask.getMarkerId(), markTask.getPaper().getId(), markTask.getWorkId(), markTask.getPaper().getExamNumber());
                         String secretNumberNew = markTask.getMarkerId() + markTask.getSubject().ordinal() + markTask.getPaper().getAreaCode() + randomNew;
-                        markTask.setRandomSeqNew(randomNew);
+//                        markTask.setRandomSeqNew(randomNew);
                         markTask.setSecretNumber(secretNumberNew);
                         tasks.add(markTask);
                     }

+ 5 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ChangeLevelApi.java

@@ -238,8 +238,11 @@ public class ChangeLevelApi {
 
             //重置已经打分的数据
             List<MarkTask> markTasksScore = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.SCORE);
-            if (markTasksScore != null && markTasksScore.size() > 0){
-                markTasksScore.forEach(o-> o.setResult(null));
+            if (markTasksScore != null && markTasksScore.size() > 0) {
+                markTasksScore.forEach(o -> {
+                    o.setResult(null);
+                    o.setLevel(null);
+                });
                 markTaskRepo.save(markTasksScore);
             }
 

+ 228 - 49
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java

@@ -136,8 +136,12 @@ public class MakrerApi {
         MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
-//        Long batchNo = paperRepo.findByQuestionId(questionId);
-        Long batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
+        Integer levelShowAllPaper = ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper();
+        Long batchNo = null;
+        if(levelShowAllPaper == 0){
+            batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
+        }
+        Long finalBatchNo = batchNo;
         Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
 
             @Override
@@ -145,10 +149,10 @@ public class MakrerApi {
                 Map<String, Long> map = new HashMap<>();
                 //当前老师当前批次试卷总数
                 long kdtotal;
-                if (ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper() == 1) {
+                if (levelShowAllPaper  == 1) {
                     kdtotal = markTaskRepo.countByQuestionIdAll(questionId, marker.getId());
                 } else {
-                    kdtotal = markTaskRepo.countByQuestionId(questionId, batchNo, marker.getId());
+                    kdtotal = markTaskRepo.countByQuestionIdAndBatchNo(questionId, finalBatchNo, marker.getId());
                 }
                 //当前考区内试卷总数
                 long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
@@ -158,25 +162,25 @@ public class MakrerApi {
             }
         });
         //当前考区各档位定档数量
-        paperRepo.countGroupByLevel(questionId)
-                .forEach(o -> {
-                    LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
-                    levelStatDTO.setGcount(levelStatDTO.getCount());
-                    if (Objects.isNull(levelStatDTO.getId())) {
-                        //求任务数为null的条数
-                        int count;
-                        if (ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper() == 1) {
-                            count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissingAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
-                        } else {
-                            count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false, batchNo);
-                        }
-                        //查询当前老师打回个数
-                        int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
-                        levelStatDTO.setCount(count);
-                        levelStatDTO.setRejected(rejectCount);
-                    }
-                    levelStatDTOs.add(levelStatDTO);
-                });
+        List<Object[]> list = paperRepo.countGroupByLevel(questionId);
+        list.forEach(o -> {
+            LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
+            levelStatDTO.setGcount(levelStatDTO.getCount());
+            if (Objects.isNull(levelStatDTO.getId())) {
+                //求任务数为null的条数
+                int count;
+                if (levelShowAllPaper == 1) {
+                    count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
+                } else {
+                    count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), finalBatchNo);
+                }
+                //查询当前老师打回个数
+                int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
+                levelStatDTO.setCount(count);
+                levelStatDTO.setRejected(rejectCount);
+            }
+            levelStatDTOs.add(levelStatDTO);
+        });
         for (Level level : levels) {
             //所有档位依次比较
             long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
@@ -185,15 +189,119 @@ public class MakrerApi {
                 dto.setId(level.getCode());
                 dto.setCount(0);
                 dto.setPercent(0.0);
+                levelStatDTOs.add(dto);
+            }
+        }
+        long kdtotal = 0L, total = 0L;
+        if (Objects.nonNull(future) && Objects.nonNull(future.get())) {
+            Map<String, Long> map = (Map<String, Long>) future.get();
+            kdtotal = map.get("kdtotal");
+            total = map.get("total");
+        }
 
-                //当前老师当前档位评档次数(所有考试)
-//                int countNew;
-//                if (ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper() == 1) {
-////                    countNew = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissingAll(questionId, MarkStage.LEVEL.ordinal(), level.getCode(), false, marker.getId());
-//                } else {
-//                    countNew = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.LEVEL.ordinal(), level.getCode(), false, batchNo, marker.getId());
-//                }
-//                dto.setCount(countNew);
+        long finalKdtotal = kdtotal;
+        long finalTotal = total;
+        levelStatDTOs.forEach(o -> {
+            if (o.getId() != null) {
+                //当前老师各档位数量
+                int countNew;
+                if (levelShowAllPaper == 1) {
+                    countNew = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), String.valueOf(o.getId()));
+                } else {
+                    countNew = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), String.valueOf(o.getId()), finalBatchNo);
+                }
+                o.setCount(countNew);
+                //该档位考区内已定档数量
+                long gcountNew = paperRepo.countByQuestionIdAndLevelAndSubjectAndWorkId(questionId, String.valueOf(o.getId()), markSubject.getSubject(), marker.getWorkId());                o.setGcount((int) gcountNew);
+                o.setGcount((int) gcountNew);
+
+                o.setPt(levelMap.get(o.getId()).getPt());
+                o.setKdpt(levelMap.get(o.getId()).getKdpt());
+                double p = finalKdtotal == 0 ? 0 : (double) o.getCount() / finalKdtotal * 100;
+                BigDecimal bd = new BigDecimal(p).setScale(3, RoundingMode.HALF_EVEN);
+                o.setPercent(bd.doubleValue());
+
+                o.setGcount(Objects.isNull(o.getGcount()) ? 0 : o.getGcount());
+                double gp = finalTotal == 0 ? 0 : (double) o.getGcount() / finalTotal * 100;
+                BigDecimal gbd = new BigDecimal(gp).setScale(3, RoundingMode.HALF_EVEN);
+                o.setGpercent(gbd.doubleValue());
+            }
+        });
+        Collections.sort(levelStatDTOs, (o1, o2) -> {
+            if (o1.getId() == null || o2.getId() == null) {
+                return 1;
+            }
+            return o1.getId().toString().compareTo(o2.getId().toString());
+        });
+        return levelStatDTOs;
+    }
+
+    /**
+     * 评卷员分档数量及占比数据
+     *
+     * @param marker     评卷员用户id
+     * @param questionId 试题id
+     * @return
+     */
+    @RequestMapping(value = "{marker}/stat/totalLevels", method = RequestMethod.GET)
+    public List<LevelStatDTO> totalLevels(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
+        List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
+        MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
+        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
+        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
+        Integer levelShowAllPaper = ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper();
+        Long batchNo = null;
+        if(levelShowAllPaper == 0){
+            batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
+        }
+        Long finalBatchNo = batchNo;
+        Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
+            @Override
+            public Map<String, Long> call() throws Exception {
+                Map<String, Long> map = new HashMap<>();
+                //当前老师当前批次试卷总数
+                long kdtotal;
+                if (levelShowAllPaper == 1) {
+                    kdtotal = markTaskRepo.countByQuestionIdAll(questionId, marker.getId());
+                } else {
+                    kdtotal = markTaskRepo.countByQuestionIdAndBatchNo(questionId, finalBatchNo, marker.getId());
+                }
+                //当前考区内试卷总数
+                long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
+                map.put("kdtotal", kdtotal);
+                map.put("total", total);
+                return map;
+            }
+        });
+        //当前考区各档位定档数量
+        List<Object[]> list = paperRepo.countGroupByLevel(questionId);
+        list.forEach(o -> {
+            LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
+            levelStatDTO.setGcount(levelStatDTO.getCount());
+            if (Objects.isNull(levelStatDTO.getId())) {
+                //求任务数为null的条数
+                int count;
+                if (levelShowAllPaper == 1) {
+                    count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
+                } else {
+                    count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), finalBatchNo);
+                }
+                //查询当前老师打回个数
+//                        int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
+                int rejectCount = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
+                levelStatDTO.setCount(count);
+                levelStatDTO.setRejected(rejectCount);
+            }
+            levelStatDTOs.add(levelStatDTO);
+        });
+        for (Level level : levels) {
+            //所有档位依次比较
+            long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
+            if (count == 0) {
+                LevelStatDTO dto = new LevelStatDTO();
+                dto.setId(level.getCode());
+                dto.setCount(0);
+                dto.setPercent(0.0);
                 levelStatDTOs.add(dto);
             }
         }
@@ -203,10 +311,6 @@ public class MakrerApi {
             kdtotal = map.get("kdtotal");
             total = map.get("total");
         }
-//        //当前老师当前试卷的评档次数(不分档位)
-//        long kdtotal = markTaskRepo.countByQuestionId(questionId, batchNo, marker.getId());
-//        //当前老师所有的评档次数(不分档位)
-//        long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
 
         long finalKdtotal = kdtotal;
         long finalTotal = total;
@@ -214,37 +318,28 @@ public class MakrerApi {
             if (o.getId() != null) {
                 //当前老师各档位数量
                 int countNew;
-                if (ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper() == 1) {
-//                            count = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissingAll(questionId, MarkStage.LEVEL.ordinal(), levelStatDTO.getId().toString(), false, marker.getId());
+                if (levelShowAllPaper == 1) {
                     countNew = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), String.valueOf(o.getId()));
                 } else {
-//                            count = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.LEVEL.ordinal(), levelStatDTO.getId().toString(), false, batchNo, marker.getId());
-                    countNew = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), String.valueOf(o.getId()), batchNo);
+                    countNew = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), String.valueOf(o.getId()), finalBatchNo);
                 }
                 o.setCount(countNew);
                 //该档位考区内已定档数量
-                long gcountNew = paperRepo.countByWorkIdAndSubjectAndQuestionIdAndLevel(marker.getWorkId(), markSubject.getSubject(), questionId, String.valueOf(o.getId()));
+                long gcountNew = paperRepo.countByQuestionIdAndLevelAndSubjectAndWorkId(questionId, String.valueOf(o.getId()), markSubject.getSubject(), marker.getWorkId());
                 o.setGcount((int) gcountNew);
 
                 o.setPt(levelMap.get(o.getId()).getPt());
                 o.setKdpt(levelMap.get(o.getId()).getKdpt());
-                o.setCount(Objects.isNull(o.getCount()) ? 0 : o.getCount());
                 double p = finalKdtotal == 0 ? 0 : (double) o.getCount() / finalKdtotal * 100;
                 BigDecimal bd = new BigDecimal(p).setScale(3, RoundingMode.HALF_EVEN);
                 o.setPercent(bd.doubleValue());
+                o.setFinalKdTotal(Math.toIntExact(finalKdtotal));
 
                 o.setGcount(Objects.isNull(o.getGcount()) ? 0 : o.getGcount());
                 double gp = finalTotal == 0 ? 0 : (double) o.getGcount() / finalTotal * 100;
                 BigDecimal gbd = new BigDecimal(gp).setScale(3, RoundingMode.HALF_EVEN);
                 o.setGpercent(gbd.doubleValue());
-//                int count;
-//                if (ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper() == 1) {
-//                    count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), o.getId().toString());
-//                } else {
-//                    count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), o.getId().toString(), batchNo);
-//                }
-//                o.setPercent(count == 0 ? 0 : o.getPercent());
-//                o.setCount(count);
+                o.setFinalTotal(Math.toIntExact(finalTotal));
             }
         });
         Collections.sort(levelStatDTOs, (o1, o2) -> {
@@ -354,6 +449,90 @@ public class MakrerApi {
         return levelStatDTOs;
     }
 
+    /**
+     * 评卷员打分数量
+     *
+     * @param marker     评卷员用户id
+     * @param questionId 试题id
+     * @return
+     */
+    @RequestMapping(value = "{marker}/stat/totalScores", method = RequestMethod.GET)
+    public List<LevelStatDTO> totalScores(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
+        List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
+        MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
+        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
+        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
+        Long batchNo = paperRepo.findMaxScoreBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
+        Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
+            @Override
+            public Map<String, Long> call() {
+                Map<String, Long> map = new HashMap<>();
+                //当前老师所有的评档次数(不分档位)
+//                long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
+                long total = paperRepo.countByQuestionId(questionId);
+                map.put("total", total);
+                return map;
+            }
+        });
+        LevelStatDTO levelStatDTO = new LevelStatDTO();
+        //求任务数为null的条数
+        int totalCount = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.SCORE.ordinal(), batchNo);
+        levelStatDTO.setCount(totalCount);
+        //查询改档
+        int shiftCount = markTaskRepo.countShiftByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
+        levelStatDTO.setShift(shiftCount);
+        //查询改档打分
+        int shiftScoreCount = markTaskRepo.countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.SCORE.ordinal());
+        levelStatDTO.setShiftScore(shiftScoreCount);
+        levelStatDTOs.add(levelStatDTO);
+
+        for (Level level : levels) {
+            //所有档位依次比较
+            long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
+            if (count == 0) {
+                LevelStatDTO dto = new LevelStatDTO();
+                dto.setId(level.getCode());
+                dto.setCount(0);
+                dto.setPercent(0.0);
+
+                //当前老师当前档位评档次数(所有考试)
+                dto.setCount(0);
+                levelStatDTOs.add(dto);
+            }
+        }
+        long total = 0L;
+        if (Objects.nonNull(future) && Objects.nonNull(future.get())) {
+            Map<String, Long> map = (Map<String, Long>) future.get();
+            total = map.get("total");
+        }
+
+        long finalTotal = total;
+        levelStatDTOs.forEach(o -> {
+            if (o.getId() != null) {
+                o.setPt(levelMap.get(o.getId()).getPt());
+                o.setKdpt(levelMap.get(o.getId()).getKdpt());
+                o.setCount(Objects.isNull(o.getCount()) ? 0 : o.getCount());
+                o.setPercent(0D);
+
+                o.setGcount(Objects.isNull(o.getGcount()) ? 0 : o.getGcount());
+                double gp = (double) o.getGcount() / finalTotal;
+                BigDecimal gbd = new BigDecimal(gp).setScale(3, RoundingMode.HALF_EVEN);
+                o.setGpercent(gbd.doubleValue());
+                o.setFinalTotal(Math.toIntExact(finalTotal));
+
+                int count;
+                if (ParamCache.paramMap.get(marker.getWorkId()).getScoreShowAllPaper() == 1) {
+                    count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString());
+                } else {
+                    count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString(), batchNo);
+                }
+                o.setPercent(count == 0 ? 0 : o.getPercent());
+                o.setCount(count);
+            }
+        });
+        return levelStatDTOs;
+    }
+
     /**
      * 各试题统计数据
      *

+ 74 - 34
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -12,8 +12,10 @@ import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkTaskAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkerAssembler;
+import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.LevelDetailDTO;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
+import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -55,6 +57,9 @@ public class MarkTaskApi {
     @Autowired
     private MarkTaskAssembler markTaskAssembler;
 
+    @Autowired
+    private PaperAssembler paperAssembler;
+
     @Autowired
     ExamQuestionRepo examQuestionRepo;
 
@@ -99,6 +104,25 @@ public class MarkTaskApi {
                             Pageable pageable) throws Exception {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         MarkUser markUser = markUserRepo.findOne(markerId);
+        Long batchNo = null;
+        Long scoreBatchNo = null;
+        if (stage == MarkStage.LEVEL) {
+            List<Object> batchNos = paperRepo.findBatchNoByWorkIdAndSubject(workId, markUser.getSubject().name());
+            if(batchNos !=null && batchNos.size() > 0){
+                Object object = batchNos.get(0);
+                batchNo = Long.valueOf(object.toString());
+            }
+        } else if (stage == MarkStage.SCORE) {
+            List<Object> batchNos = paperRepo.findScoreBatchNoByWorkIdAndSubject(workId, markUser.getSubject().name());
+            if(batchNos !=null && batchNos.size() > 0){
+                Object object = batchNos.get(0);
+                scoreBatchNo = Long.valueOf(object.toString());
+            }
+        }
+        Long finalBatchNo = batchNo;
+        Long finalScoreBatchNo = scoreBatchNo;
+        Integer levelShowAllPaper = ParamCache.paramMap.get(workId).getLevelShowAllPaper();
+        Integer scoreShowAllPaper = ParamCache.paramMap.get(workId).getScoreShowAllPaper();
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             List<Predicate> onPredicates = new ArrayList<>();
@@ -111,62 +135,44 @@ public class MarkTaskApi {
             if (level == null) {
                 predicates.add(builder.isNull(root.get("result")));
                 if (stage == MarkStage.SCORE) {
-//                    predicates.add(builder.equal(root.get("paper").get("isShift"), false));
-//                    predicates.add(builder.equal(root.get("paper").get("isShiftScore"), false));
                     onPredicates.add(builder.equal(join.get("isShift"), false));
                     onPredicates.add(builder.equal(join.get("isShiftScore"), false));
                 }
             } else if (stage == MarkStage.LEVEL) {
                 //查询
                 predicates.add(builder.equal(root.get("result"), level));
-                if(ParamCache.paramMap.get(workId).getLevelShowAllPaper() == 0) {
-//                    Long batchNo = paperRepo.findByQuestionId(questionId);
-                    Long batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(workId, markUser.getSubject());
-                    if (!Objects.isNull(batchNo)) {
-//                        predicates.add(builder.equal(root.get("paper").get("batchNo"), batchNo));
-                        onPredicates.add(builder.equal(join.get("batchNo"), batchNo));
+                if(levelShowAllPaper  == 0) {
+                    if (!Objects.isNull(finalBatchNo)) {
+                        onPredicates.add(builder.equal(join.get("batchNo"), finalBatchNo));
                     }
                 }
             } else if (stage == MarkStage.SCORE) {
-//                Long batchNo = paperRepo.findScoreBatchNoByQuestionId(questionId);
-                Long batchNo = paperRepo.findMaxScoreBatchNoByWorkIdAndSubject(workId, markUser.getSubject());
-//                predicates.add(builder.equal(root.get("paper").get("level"), level));
                 onPredicates.add(builder.equal(join.get("level"), level));
                 predicates.add(builder.isNotNull(root.get("result")));
-//                predicates.add(builder.equal(root.get("paper").get("isShift"), false));
-//                predicates.add(builder.equal(root.get("paper").get("isShiftScore"), false));
                 onPredicates.add(builder.equal(join.get("isShift"), false));
-//                onPredicates.add(builder.equal(join.get("isShiftScore"), false));
-                if(ParamCache.paramMap.get(workId).getScoreShowAllPaper() == 1){
-//                    predicates.add(builder.isNotNull(root.get("paper").get("scoreBatchNo")));
+                if(scoreShowAllPaper  == 1){
                     onPredicates.add(builder.isNotNull(join.get("scoreBatchNo")));
                 } else {
-//                    predicates.add(builder.equal(root.get("paper").get("scoreBatchNo"), batchNo));
-                    onPredicates.add(builder.equal(join.get("scoreBatchNo"), batchNo));
+                    onPredicates.add(builder.equal(join.get("scoreBatchNo"), finalScoreBatchNo));
                 }
             }
             if (isSample != null) {
-//                predicates.add(builder.equal(root.get("paper").get("isSample"), isSample));
                 onPredicates.add(builder.equal(join.get("isSample"), isSample));
             }
-            if (reject != null) {
-//                predicates.add(builder.equal(root.get("paper").get("isRejected"), reject));
+            if (reject != null && reject) {
                 onPredicates.add(builder.equal(join.get("isRejected"), reject));
+            } else {
+                predicates.add(builder.equal(root.get("isRejected"), reject));
             }
-//            predicates.add(builder.equal(root.get("paper").get("isMissing"), false));
-//            predicates.add(builder.equal(root.get("paper").get("active"), true));
-            onPredicates.add(builder.equal(join.get("isMissing"), false));
             onPredicates.add(builder.equal(join.get("active"), true));
             //过滤考区
             if (Objects.nonNull(areaCode)) {
-//                predicates.add(builder.equal(root.get("paper").get("areaCode"), areaCode));
                 onPredicates.add(builder.equal(join.get("areaCode"), areaCode));
             }
             join.on(onPredicates.toArray(new Predicate[onPredicates.size()]));
-//            predicates.add(builder.equal(root.get("isActive"), false));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
-        Sort sort = new Sort( "randomSeq","paper.level", "serialNumber", "randomSeqNew");
+        Sort sort = new Sort( "randomSeq", "randomSeqNew");
         Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
 
@@ -369,6 +375,16 @@ public class MarkTaskApi {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         Sort sort = new Sort(Sort.Direction.DESC, "updatedOn");
         Pageable pageable = new PageRequest(0, 5, sort);
+        Long batchNo = null;
+        Long socreBatchNo = null;
+        if (stage == MarkStage.LEVEL) {
+            batchNo = paperRepo.findByQuestionId(questionId);
+        }else if (stage == MarkStage.SCORE) {
+            socreBatchNo=paperRepo.findScoreBatchNoByQuestionId(questionId);
+        }
+
+        Long finalBatchNo = batchNo;
+        Long finalSocreBatchNo = socreBatchNo;
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             if (Objects.nonNull(questionId)) {
@@ -378,17 +394,16 @@ public class MarkTaskApi {
             predicates.add(builder.equal(root.get("stage"), stage));
             if (stage == MarkStage.LEVEL) {
                 //查询
-                Long batchNo = paperRepo.findByQuestionId(questionId);
-                if (!Objects.isNull(batchNo)) {
-                    predicates.add(builder.equal(root.get("paper").get("batchNo"), batchNo));
+                if (!Objects.isNull(finalBatchNo)) {
+                    predicates.add(builder.equal(root.get("paper").get("batchNo"), finalBatchNo));
                 }
                 predicates.add(builder.isNotNull(root.get("result")));
                 //分档需要过滤标准卷
                 predicates.add(builder.equal(root.get("paper").get("isSample"), false));
             } else if (stage == MarkStage.SCORE) {
-                Long socreBatchNo = paperRepo.findScoreBatchNoByQuestionId(questionId);
-                if (!Objects.isNull(socreBatchNo)) {
-                    predicates.add(builder.equal(root.get("paper").get("scoreBatchNo"), socreBatchNo));
+
+                if (!Objects.isNull(finalSocreBatchNo)) {
+                    predicates.add(builder.equal(root.get("paper").get("scoreBatchNo"), finalSocreBatchNo));
                 }
                 predicates.add(builder.isNotNull(root.get("result")));
             }
@@ -398,7 +413,6 @@ public class MarkTaskApi {
             }
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
-
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable);
         markTasks.getContent().forEach(m -> {
             markTaskDTOs.add(markTaskAssembler.toDTO(m));
@@ -406,6 +420,32 @@ public class MarkTaskApi {
         return markTaskDTOs;
     }
 
+    @RequestMapping(value = "/kzzReviewPaper", method = RequestMethod.GET)
+    public List<PaperDTO> reviewPaper(@RequestParam Long workId,
+                                      @RequestParam Subject subject,
+                                      @RequestParam Long questionId) {
+        Specification<Paper> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("workId"), workId));
+            predicates.add(builder.equal(root.get("subject"), subject));
+            if (Objects.nonNull(questionId)) {
+                predicates.add(builder.equal(root.get("questionId"), questionId));
+            }
+            predicates.add(builder.equal(root.get("isOneClick"), true));
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        Sort sort = new Sort(Sort.Direction.DESC, "updatedOn");
+        Pageable pageable = new PageRequest(0, 5, sort);
+        Page<Paper> papers = paperRepo.findAll(specification, pageable);
+
+        List<PaperDTO> paperList = new ArrayList<>();
+        papers.getContent().forEach(p -> {
+            paperList.add(paperAssembler.toDTO(p));
+        });
+        return paperList;
+    }
+
 
     /**
      * 分档详情

+ 32 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -335,6 +335,38 @@ public class PaperApi {
         return null;
     }
 
+    /**
+     * 批量取消标准卷
+     *
+     * @param body 试卷信息
+     * @return
+     */
+    @RequestMapping(value = "batch/cancelSample", method = RequestMethod.PATCH)
+    @Transactional
+    public ResponseEntity cancelSample(@RequestBody HashMap<String, String> body) {
+        String paperIds = body.get("paperIds");
+        if (paperIds.length() > 0) {
+            String[] ids = paperIds.split(",");
+            for (String id : ids) {
+                Paper paper = paperRepo.findOne(Long.valueOf(id));
+                paper.determineLevel(null);
+                paper.setMarkByLeader(false);
+                paper.setSample(false);
+                paperRepo.save(paper);
+
+                List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
+                for (MarkTask markTask : markTasks) {
+                    markTask.setResult(null);
+                    markTask.setLevel(null);
+                    markTask.setSample(false);
+                    markTaskRepo.save(markTask);
+                }
+            }
+            return new ResponseEntity(true, HttpStatus.OK);
+        }
+        return null;
+    }
+
     /**
      * 标记试卷
      *

+ 1 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/TaskApi.java

@@ -136,6 +136,7 @@ public class TaskApi {
                 markTask.setRejected(true);
                 markTask.setOriginLevel(markTask.getResult());
                 markTask.setResult(null);
+                markTask.setLevel(null);
             }
             markTaskRepo.save(markTask);
             paperRepo.save(paper);

+ 66 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -145,8 +145,8 @@ public class PaperAssembler {
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
             thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
             if(paper.isManual() && Objects.nonNull(isManual) && isManual) {
-                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
-                thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
+                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+                thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
             }
         } else {
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
@@ -196,6 +196,70 @@ public class PaperAssembler {
         return paperDTO;
     }
 
+    public PaperDTO toDTOForEquipmentMonitor(Paper paper, Boolean isManual) {
+        String imgSrc = null;
+        String thumbSrc = null;
+        String fileName = paper.getExamNumber();
+        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+        //0:随机码 1:考号
+        if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
+            fileName = MD5Util.getImageRuleMd5(paper.getWorkId(),paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+        }
+        if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
+            thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
+            if(Objects.nonNull(isManual) && isManual) {
+                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+                thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+            }
+        } else {
+            imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            if(Objects.nonNull(isManual) && isManual) {
+                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            }
+        }
+        //查询阶段
+        MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
+        PaperDTO paperDTO = null;
+        if (paper != null) {
+            paperDTO = new PaperDTO();
+            paperDTO.setId(paper.getId());
+            paperDTO.setSubjectName(paper.getSubject().getName());
+            paperDTO.setExamNumber(paper.getExamNumber());
+            paperDTO.setSn(paper.getSecretNumber());
+            paperDTO.setLevel(paper.getLevel());
+            paperDTO.setManual(paper.isManual());
+            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setArbitrated(paper.isArbitrated());
+            paperDTO.setRejected(paper.isRejected());
+            paperDTO.setSample(paper.isSample());
+            paperDTO.setMarkByLeader(paper.isMarkByLeader());
+            paperDTO.setTagged(paper.isTagged());
+            paperDTO.setMarkedLogic(paper.isMarkedLogic());
+            paperDTO.setRedoLevel(paper.getRedoLevel());
+            paperDTO.setUpdatedOn(paper.getUpdatedOn());
+            paperDTO.setImgSrc(imgSrc);
+            paperDTO.setThumbSrc(thumbSrc);
+            paperDTO.setAreaCode(paper.getAreaCode());
+            paperDTO.setMissing(paper.getIsMissing());
+            if (paper.getInspectScore() != null) {
+                paperDTO.setInspectScore(paper.getInspectScore().intValue());
+            }
+            if (paper.getInspectLevel() != null) {
+                paperDTO.setInspectLevel(paper.getInspectLevel());
+            }
+            paperDTO.setStage(markSubject.getStage());
+            paperDTO.setTest(markSubject.getTest());
+            paperDTO.setPaperTest(paper.getTest());
+            paperDTO.setShift(paper.isShift());
+            paperDTO.setShiftScore(paper.isShiftScore());
+            paperDTO.setStudentName(student.getName());
+        }
+        return paperDTO;
+    }
+
     public PaperDTO toDTOForSheet(Paper paper) {
         String imgSrc = null;
         String thumbSrc = null;

+ 20 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/LevelStatDTO.java

@@ -30,6 +30,10 @@ public class LevelStatDTO implements Serializable {
      */
     private int kdpt = 0;
 
+    private Integer finalKdTotal;
+
+    private Integer finalTotal;
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -129,4 +133,20 @@ public class LevelStatDTO implements Serializable {
     public void setShiftScore(Integer shiftScore) {
         this.shiftScore = shiftScore;
     }
+
+    public Integer getFinalKdTotal() {
+        return finalKdTotal;
+    }
+
+    public void setFinalKdTotal(Integer finalKdTotal) {
+        this.finalKdTotal = finalKdTotal;
+    }
+
+    public Integer getFinalTotal() {
+        return finalTotal;
+    }
+
+    public void setFinalTotal(Integer finalTotal) {
+        this.finalTotal = finalTotal;
+    }
 }

+ 94 - 99
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java

@@ -110,135 +110,130 @@ public class AssignTaskService {
     /**
      * 分组任务模式,将该科目的评卷员分成N组,将该科目试卷平均分给这些组,每组内的评卷员每人将这些试卷打分
      * 比如:6个评卷员分2组,有1000份试卷,每组评500份,每个评卷员评500份
-     *  @param papers
+     *
+     * @param papers
      * @param markerGroups
      * @param taskList
      */
     @Transactional
     public void assignForGrouping(List<Paper> papers, List<MarkerGroup> markerGroups, MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
+        markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
+        int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
+        int groupSize = markerGroups.size();
+        int idx = 0;
         long currentTime = System.currentTimeMillis();
-        List<MarkTask> markTaskList;
+        Iterator<Paper> iterator = papers.iterator();
+        List<MarkTask> markTaskList = new ArrayList<>(papers.size() * sum);
         List<Paper> paperList = new ArrayList<>(papers.size());
 //        List<MarkTask> markTasks = markTaskRepo.findByWorkId(markSubject.getWorkId());
 //        Map<Long, MarkTask> randomMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getRandomSeqNew, Function.identity(), (dto1, dto2) -> dto1));
         List<Object[]> markTasks = markTaskRepo.findAllByWorkId(markSubject.getWorkId());
         Map<Long, Object> randomMap = new HashMap<>();
-        markTasks.forEach(m-> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
-        //打分任务发布,并且是谁分档谁打分模式
-        if (Objects.equals(MarkStage.SCORE, markSubject.getStage()) && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1) {
-            //查询所有试卷各分档时任务详情
-            List<MarkTask> levelMarkTasks = markTaskRepo.findByWorkIdAndStage(markSubject.getWorkId(), MarkStage.LEVEL);
-            markTaskList = new ArrayList<>(levelMarkTasks.size());
-            //各试卷对应的分档评卷员信息
-            Map<Long, List<MarkTask>> listMap = levelMarkTasks.stream().collect(Collectors.groupingBy(item-> item.getPaper().getId()));
-            //生成打分任务
-            Map<String, AtomicInteger> integerMap = new HashMap<>();
-            for (Paper paper : papers) {
-                //是否显示序号
+        markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
+        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
+        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
+        //定序序号记录
+        Map map = new HashMap();
+        Map seqNewMap = new HashMap();
+        while (iterator.hasNext()) {
+            if (idx >= groupSize) {
+                idx = 0;
+            }
+            Paper paper = iterator.next();
+            String serialNumber = null;
+            Integer displayNumber = null;
+            Integer seqNewNumber = null;
+            if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
+                //是否定序
+                int seq = 0;
                 long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
-                String serialNumber = null;
-                Integer displayNumber = null;
                 if (sortRule != 0) {
-                    AtomicInteger atomicInteger = integerMap.get(paper.getLevel());
-                    if(atomicInteger == null){
-                        atomicInteger = new AtomicInteger(0);
-                        integerMap.put(paper.getLevel(), atomicInteger);
+                    if (map.containsKey(paper.getLevel() + idx)) {
+                        seq = (int) map.get(paper.getLevel() + idx);
                     }
-                    serialNumber = paper.getLevel() + atomicInteger.incrementAndGet();
+                    seq = ++seq;
+                    serialNumber = paper.getLevel() + seq;
                     //是否显示序号
                     long display = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getDisplayNumber() == 1).count();
                     displayNumber = (int) display;
-                }
+                    //设置新值
+                    map.put(paper.getLevel() + idx, seq);
 
-                for (MarkTask task : listMap.get(paper.getId())) {
-                    Long random = getRandom(task.getMarkerId(), paper.getId(), task.getWorkId(), paper.getExamNumber(), randomMap);
-                    MarkTask markTask = new MarkTask(task.getMarkerId(), task.getMarkerName(), task.getSubject(), task.getWorkId(), paper, markSubject.getStage(), random, markSubject.getTest());
-                    markTask.setBatchNo(currentTime);
-                    markTask.setSerialNumber(serialNumber);
-                    markTask.setDisplayNumber(displayNumber);
-                    markTaskList.add(markTask);
-                    randomMap.put(random, markTask);
-                }
-                if (markSubject.getTest() != 1) {
-                    if (MarkStage.SCORE.equals(markSubject.getStage())) {
-                        paper.setScoreBatchNo(currentTime);
-                        paperList.add(paper);
+                    int seqNew = 0;
+                    if(seqNewMap.containsKey(paper.getLevel())){
+                        seqNew = (int) seqNewMap.get(paper.getLevel());
                     }
+                    seqNewNumber = ++seqNew;
+                    seqNewMap.put(paper.getLevel(), seqNew);
                 }
             }
-        } else {
-            markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
-            int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
-            int groupSize = markerGroups.size();
-            int idx = 0;
-            Iterator<Paper> iterator = papers.iterator();
-            markTaskList = new ArrayList<>(papers.size() * sum);
-            //定序序号记录
-            Map map = new HashMap();
-            while (iterator.hasNext()) {
-                if (idx >= groupSize) {
-                    idx = 0;
-                }
-                Paper paper = iterator.next();
-                String serialNumber = null;
-                Integer displayNumber = null;
+            for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
+                Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
+                MarkTask markTask = null;
                 if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
-                    //是否定序
-                    int seq = 0;
-                    long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
-                    if (sortRule != 0) {
-                        if (map.containsKey(paper.getLevel() + idx)) {
-                            seq = (int) map.get(paper.getLevel() + idx);
-                        }
-                        seq = ++seq;
-                        serialNumber = paper.getLevel() + seq;
-                        //是否显示序号
-                        long display = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getDisplayNumber() == 1).count();
-                        displayNumber = (int) display;
-                        //设置新值
-                        map.put(paper.getLevel() + idx, seq);
+                    markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                    String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
+                    if (Objects.nonNull(serialNumber)) {
+                        //和随机数位数保持一致(8位)
+                        String randomSeqNew = String.format("%08d", seqNewNumber);
+                        markTask.setRandomSeqNew(Long.valueOf(levelValue + randomSeqNew));
+                    } else {
+                        markTask.setRandomSeqNew(Long.valueOf(levelValue + markTask.getRandomSeqNew()));
                     }
-                }
-                for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
-                    Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
-                    MarkTask markTask = null;
-                    if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
-                        markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
-                        markTask.setBatchNo(currentTime);
-                        markTask.setSerialNumber(serialNumber);
-                        markTask.setDisplayNumber(displayNumber);
+                    markTask.setBatchNo(currentTime);
+                    markTask.setSerialNumber(serialNumber);
+                    markTask.setDisplayNumber(displayNumber);
+                    markTask.setLevel(paper.getLevel());
+                } else {
+                    if (paper.isSample() && paper.getLevel() != null) {
+                        Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
+                        markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
                     } else {
-                        if (paper.isSample() && paper.getLevel() != null) {
-                            Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
-                            markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
-                        } else {
-                            markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
-                        }
+                        markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
                     }
-                    markTaskList.add(markTask);
-                    randomMap.put(random, markTask);
-//                markTaskRepo.save(markTask);
+                    markTask.setBatchNo(currentTime);
                 }
-                if (markSubject.getTest() != 1) {
-                    if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-                        //将paper置为激活
-                        paper.setActive(true);
-                        paper.setBatchNo(currentTime);
+                markTaskList.add(markTask);
+                randomMap.put(random, markTask);
+//                markTaskRepo.save(markTask);
+            }
+            if (markSubject.getTest() != 1) {
+                if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+                    //将paper置为激活
+                    paper.setActive(true);
+                    paper.setBatchNo(currentTime);
 //                    paperRepo.save(paper);
-                        paperList.add(paper);
-                        //更新subject表formal为正试评卷
+                    paperList.add(paper);
+                    //更新subject表formal为正试评卷
 //                    markSubject.setFormal(true);
 //                    markSubjectRepo.saveAndFlush(markSubject);
-                    }
-                    if (MarkStage.SCORE.equals(markSubject.getStage())) {
-                        paper.setScoreBatchNo(currentTime);
-                        paperList.add(paper);
-                    }
                 }
-                idx++;
+                if (MarkStage.SCORE.equals(markSubject.getStage())) {
+                    paper.setScoreBatchNo(currentTime);
+                    paperList.add(paper);
+                }
+            } else {
+                paper.setBatchNo(currentTime);
+                paperList.add(paper);
+            }
+            idx++;
+        }
+
+        List<MarkTask> data = new ArrayList<>();
+        //5000条提交一次
+        for (MarkTask markTask : markTaskList) {
+            if (data.size() == 2000) {
+                markTaskRepo.save(data);
+                data.clear();
             }
+            data.add(markTask);
         }
-        markTaskRepo.save(markTaskList);
+        //将剩下的数据也导入
+        if (!data.isEmpty()) {
+            markTaskRepo.save(data);
+        }
+
+//        markTaskRepo.save(markTaskList);
         paperRepo.save(paperList);
         if (markSubject.getTest() != 1) {
             //更新subject表formal为正试评卷
@@ -246,14 +241,14 @@ public class AssignTaskService {
             markSubjectRepo.saveAndFlush(markSubject);
         }
         //只有全部任务投放完成,才能删除分组
-        /*int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
+        int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
         //进入分档阶段后,清空当前分组,以便打分阶段前重新分组
         if (MarkStage.LEVEL.equals(markSubject.getStage()) && count == 0) {
             for (MarkerGroup markerGroup : markerGroups) {
                 markerGroup.setMarkers(null);
             }
             markerGroupRepo.delete(markerGroups);
-        }*/
+        }
 //        if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
 //            //初始化打分任务数据
 //            initTaskPublishData(markSubject);

+ 6 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -163,6 +163,9 @@ public class MarkingService {
             //重新分档,打回科组长打回状态改为false
             paper.setRejectedByLeader(false);
             paperRepo.save(paper);
+
+            //同步mark_task表中level
+            markTaskRepo.updateLevelByPaperId(paper.getLevel(), paper.getId());
         }
         long end = System.currentTimeMillis();
         LOG.info("提交分档耗时:{}", (end - start) / 1000 + "s");
@@ -276,6 +279,8 @@ public class MarkingService {
 //            markTask.setOriginLevel(markTask.getResult());
             markTask.setRejected(false);
             markTask.setResult(level);
+            markTask.setLevel(level);
+            markTask.setSample(paper.isSample());
         }
         markTaskRepo.save(markTasks);
         levelsLog(markTasks, paper);
@@ -317,6 +322,7 @@ public class MarkingService {
                         markTask.setRejected(true);
                         markTask.setOriginLevel(markTask.getResult());
                         markTask.setResult(null);
+                        markTask.setLevel(null);
                         MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(markTask.getMarkerId(), MarkLogOperType.HANDLE_LEVEl.getId(), markTask.getSubject().toString(), paper.getExamNumber());
                         if (Objects.nonNull(markLogPrev)) {
                             operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse("-");