Explorar o código

机构版-3.0.0

xiaof %!s(int64=3) %!d(string=hai) anos
pai
achega
33a9a30567
Modificáronse 32 ficheiros con 1062 adicións e 409 borrados
  1. 32 36
      sql/msyj-org-v3.0.0-last.sql
  2. 10 8
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java
  3. 57 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ToolApi.java
  4. 9 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java
  5. 61 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/MarkExpDTO.java
  6. 20 9
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/OneClickExpDTO.java
  7. 98 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/SysAdjustLevelDTO.java
  8. 27 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java
  9. 6 3
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  10. 167 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/ToolService.java
  11. 10 10
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  12. 9 0
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/dto/CollectStuDTO.java
  13. 67 0
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/DbBackupUtils.java
  14. 16 6
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/ServletUtil.java
  15. 14 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLogOperType.java
  16. 23 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  17. 12 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java
  18. 32 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTask.java
  19. 13 8
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  20. 11 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  21. 0 118
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/utils/DbBackupUtils.java
  22. 28 32
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java
  23. 3 6
      stmms-ms-main/src/main/resources/application-dev.properties
  24. 51 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  25. 66 13
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  26. 1 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java
  27. 106 112
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  28. 9 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java
  29. 18 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  30. 1 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java
  31. 80 35
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java
  32. 5 7
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

+ 32 - 36
sql/msyj-org-last.sql → sql/msyj-org-v3.0.0-last.sql

@@ -1,17 +1,17 @@
 /*
  Navicat Premium Data Transfer
 
- Source Server         : t470
+ Source Server         : 127.0.0.1
  Source Server Type    : MySQL
  Source Server Version : 50717
  Source Host           : localhost:3306
- Source Schema         : msyj-org-2.0.0-xh
+ Source Schema         : msyj-org-v3.0.0
 
  Target Server Type    : MySQL
  Target Server Version : 50717
  File Encoding         : 65001
 
- Date: 24/06/2021 15:58:02
+ Date: 12/05/2022 14:07:53
 */
 
 SET NAMES utf8mb4;
@@ -58,7 +58,7 @@ CREATE TABLE `change_level`  (
   `suggest_level` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   `is_curr` tinyint(1) NULL DEFAULT NULL COMMENT '是否最新',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '改档记录表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 3 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 = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 85 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for exam_score_prop
@@ -135,11 +135,12 @@ 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_12` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `inspect_task_ibfk_13` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `inspect_task_ibfk_14` 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,
@@ -169,11 +170,12 @@ 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_12` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `level_ibfk_13` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `level_ibfk_14` 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,
@@ -182,7 +184,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 = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 199 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_log
@@ -210,7 +212,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 = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 15431 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_subject
@@ -230,11 +232,12 @@ 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_12` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_subject_ibfk_13` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_subject_ibfk_14` 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,
@@ -277,15 +280,17 @@ CREATE TABLE `mark_task`  (
   `manual_score` tinyint(1) NULL DEFAULT NULL COMMENT '是否手工输入打分,1-是、0-否(分档阶段无此值)',
   `is_sample` bit(1) NULL DEFAULT NULL,
   `deviation_direction` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '偏差方向',
+  `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
   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 `FKa6xqlu9ml2e47x1o2u2yec7vm` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   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_12` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_ibfk_13` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_ibfk_14` 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,
@@ -294,7 +299,7 @@ CREATE TABLE `mark_task`  (
   CONSTRAINT `mark_task_ibfk_7` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_8` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_9` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 4837 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_task_job
@@ -308,7 +313,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 = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1348 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_user
@@ -343,11 +348,12 @@ 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_12` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_user_ibfk_13` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_user_ibfk_14` 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,
@@ -356,7 +362,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 = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 272 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for marker_group
@@ -368,7 +374,7 @@ CREATE TABLE `marker_group`  (
   `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
   `work_id` bigint(20) NOT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 56 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for organization
@@ -381,7 +387,7 @@ CREATE TABLE `organization`  (
   `enabled` bit(1) NULL DEFAULT NULL COMMENT '是否启用',
   `created_on` date NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '机构管理' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '机构管理' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for paper
@@ -430,6 +436,9 @@ CREATE TABLE `paper`  (
   `is_one_click` bit(1) NULL DEFAULT b'0' COMMENT '是否一键定档',
   `is_rejected_by_leader` bit(1) NULL DEFAULT b'0' COMMENT '是否科组长打回',
   `is_relate` bit(1) NULL DEFAULT b'0' COMMENT '是否关联试卷',
+  `sort_num` int(11) NULL DEFAULT NULL,
+  `scan_user_id` bigint(20) NULL DEFAULT NULL COMMENT '采集员ID',
+  `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx_paper_exam_number`(`exam_number`) USING BTREE,
   INDEX `idx_union_1`(`batch_no`) USING BTREE,
@@ -437,7 +446,7 @@ CREATE TABLE `paper`  (
   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 = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1319 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for param_setting
@@ -464,22 +473,9 @@ CREATE TABLE `param_setting`  (
   `show_sample` tinyint(1) NULL DEFAULT NULL COMMENT '是否显示标准卷',
   `direct_score` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用直接输分功能',
   `is_level_to_score` tinyint(1) NULL DEFAULT NULL COMMENT '是否谁分档谁打分',
+  `take_best` tinyint(1) NULL DEFAULT NULL COMMENT '取优原则(1:是、0:否)',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
-
--- ----------------------------
--- Table structure for shiwai
--- ----------------------------
-DROP TABLE IF EXISTS `shiwai`;
-CREATE TABLE `shiwai`  (
-  `姓名` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `性别` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `地区` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `报名号(按顺序编号)` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `准考证号` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `考场号` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `座位号` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
-) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for student
@@ -505,7 +501,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 = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1440 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for task_publish_setting
@@ -526,7 +522,7 @@ CREATE TABLE `task_publish_setting`  (
   `batch_no` bigint(45) NULL DEFAULT NULL,
   `publish_count` int(3) NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '发布打分任务' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 379 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '发布打分任务' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for work
@@ -539,6 +535,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 = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 10 - 8
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java

@@ -108,13 +108,13 @@ public class ParamApi {
     /**
      * 更新分档规则参数
      *
-     * @param workId
-     * @param deviation
-     * @param autoCallback
-     * @param majority
-     * @param cumulativeError
-     * @param levelShowAllPaper
-     * @return
+     * @param workId 工作ID
+     * @param deviation 仲裁档位差
+     * @param autoCallback 是否自动打回
+     * @param majority 是否过半定档
+     * @param cumulativeError 打回累计误差
+     * @param levelShowAllPaper 分档阶段阅卷员是否显示所有试卷
+     * @param takeBest                  取优原则
      */
     @RequestMapping(value = "/level", method = RequestMethod.POST)
     public ResponseEntity updateLevelParam(@RequestParam Long workId,
@@ -126,7 +126,8 @@ public class ParamApi {
                                            @RequestParam Integer showPaperCount,
                                            @RequestParam Integer propDenominator,
                                            @RequestParam Integer autoCallbackShowDeviation,
-                                           @RequestParam Integer showSample) {
+                                           @RequestParam Integer showSample,
+                                           @RequestParam Integer takeBest) {
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         boolean flag = false;
@@ -154,6 +155,7 @@ public class ParamApi {
         paramSetting.setPropDenominator(propDenominator);
         paramSetting.setAutoCallbackShowDeviation(autoCallbackShowDeviation);
         paramSetting.setShowSample(showSample);
+        paramSetting.setTakeBest(takeBest);
         paramSettingRepo.saveAndFlush(paramSetting);
         ParamCache.resetParam(paramSetting);
 

+ 57 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ToolApi.java

@@ -0,0 +1,57 @@
+package cn.com.qmth.stmms.ms.admin.api;
+
+import cn.com.qmth.stmms.ms.admin.dto.SysAdjustLevelDTO;
+import cn.com.qmth.stmms.ms.admin.service.ToolService;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpStatus;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 小工具api
+ */
+@RestController
+@RequestMapping("/api/tool")
+public class ToolApi {
+
+    @Resource
+    private ToolService toolService;
+
+    /**
+     * 查询调档数据
+     *
+     * @param workId  工作ID
+     * @param subject 科目
+     */
+    @RequestMapping("/list")
+    public String listAdjustLevels(Long workId, Subject subject) {
+        JSONObject object = new JSONObject();
+        try {
+            object.put("code", HttpStatus.SC_OK);
+            List<SysAdjustLevelDTO> list = toolService.listAdjustLevels(workId, subject);
+            object.put("data", list);
+        } catch (Exception e){
+            object.put("code", HttpStatus.SC_INTERNAL_SERVER_ERROR);
+            object.put("data", e.getMessage());
+        }
+        return JSONObject.toJSONString(object);
+    }
+
+    /**
+     * 调档操作
+     *
+     * @param workId 工作ID
+     * @param subject 科目
+     * @param json list内容
+     */
+    @RequestMapping("/deal")
+    public boolean deal(Long workId, Subject subject, String json) {
+        List<SysAdjustLevelDTO> list = JSONObject.parseArray(json, SysAdjustLevelDTO.class);
+        toolService.deal(workId, subject, list);
+        return true;
+    }
+}

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

@@ -180,6 +180,15 @@ public class UserApi {
         markUserRepo.save(user);
     }
 
+    /**
+     * 采集员列表查询(不分页)
+     */
+    @RequestMapping(value = "/collect/all", method = RequestMethod.GET)
+    public Object listCollectAll(@RequestParam() Long workId,
+                                 @RequestParam(required = false, defaultValue = "COLLECTOR") Role role) {
+        return markUserRepo.findByWorkIdAndRole(workId, role);
+    }
+
     /**
      * 采集员修改
      *

+ 61 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/MarkExpDTO.java

@@ -0,0 +1,61 @@
+package cn.com.qmth.stmms.ms.admin.dto;
+
+import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelProperty;
+
+public class MarkExpDTO {
+
+    @ExcelProperty(name = "工作ID", index = 0, type = 1)
+    private Long workId;
+
+    @ExcelProperty(name = "科目", index = 1, type = 1)
+    private String subject;
+
+    @ExcelProperty(name = "科目名称", index = 2, type = 1)
+    private String subjectName;
+
+    @ExcelProperty(name = "考号", index = 3, type = 1)
+    private String examNumber;
+
+    @ExcelProperty(name = "姓名", index = 4, type = 1)
+    private String studentName;
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+}

+ 20 - 9
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/OneClickExpDTO.java

@@ -7,16 +7,19 @@ public class OneClickExpDTO {
     @ExcelProperty(name = "科目", index = 0, type = 1)
     private String subject;
 
-    @ExcelProperty(name = "序号", index = 1, type = 1)
+    @ExcelProperty(name = "操作账号", index = 1, type = 1)
+    private String createUserName;
+
+    @ExcelProperty(name = "序号", index =2, type = 1)
     private Integer seqNo;
 
-    @ExcelProperty(name = "考号", index = 2, type = 1)
-    private String examNumber;
+    @ExcelProperty(name = "试卷密号", index = 3, type = 1)
+    private String secretNumber;
 
-    @ExcelProperty(name = "原档位", index = 3, type = 1)
+    @ExcelProperty(name = "原档位", index = 4, type = 1)
     private String originLevel;
 
-    @ExcelProperty(name = "复审后档位", index = 4, type = 1)
+    @ExcelProperty(name = "复审后档位", index = 5, type = 1)
     private String level;
 
     public String getSubject() {
@@ -27,6 +30,14 @@ public class OneClickExpDTO {
         this.subject = subject;
     }
 
+    public String getCreateUserName() {
+        return createUserName;
+    }
+
+    public void setCreateUserName(String createUserName) {
+        this.createUserName = createUserName;
+    }
+
     public Integer getSeqNo() {
         return seqNo;
     }
@@ -35,12 +46,12 @@ public class OneClickExpDTO {
         this.seqNo = seqNo;
     }
 
-    public String getExamNumber() {
-        return examNumber;
+    public String getSecretNumber() {
+        return secretNumber;
     }
 
-    public void setExamNumber(String examNumber) {
-        this.examNumber = examNumber;
+    public void setSecretNumber(String secretNumber) {
+        this.secretNumber = secretNumber;
     }
 
     public String getOriginLevel() {

+ 98 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/SysAdjustLevelDTO.java

@@ -0,0 +1,98 @@
+package cn.com.qmth.stmms.ms.admin.dto;
+
+/**
+ * 小工具-系统批量调档DTO
+ */
+public class SysAdjustLevelDTO {
+
+    /**
+     * 科目
+     */
+    private String subject;
+
+    /**
+     * 档位
+     */
+    private String level;
+
+    /**
+     * 当前实际比例
+     */
+    private Double actualRate;
+
+    /**
+     * 当前实际数量
+     */
+    private Integer actualCount;
+
+    /**
+     * 期望比例
+     */
+    private Double expectRate;
+
+    /**
+     * 期望数量
+     */
+    private Integer expectCount;
+
+    /**
+     * 实际考生数量(有效考生)
+     */
+    private Integer studentCount;
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public Double getActualRate() {
+        return actualRate;
+    }
+
+    public void setActualRate(Double actualRate) {
+        this.actualRate = actualRate;
+    }
+
+    public Integer getActualCount() {
+        return actualCount;
+    }
+
+    public void setActualCount(Integer actualCount) {
+        this.actualCount = actualCount;
+    }
+
+    public Double getExpectRate() {
+        return expectRate;
+    }
+
+    public void setExpectRate(Double expectRate) {
+        this.expectRate = expectRate;
+    }
+
+    public Integer getExpectCount() {
+        return expectCount;
+    }
+
+    public void setExpectCount(Integer expectCount) {
+        this.expectCount = expectCount;
+    }
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+}

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

@@ -105,8 +105,10 @@ public class PaperExporter {
                 MarkLog markLog = marklogs.get(i);
                 OneClickExpDTO oneClickExpDTO = new OneClickExpDTO();
                 oneClickExpDTO.setSubject(subjectName);
+                oneClickExpDTO.setCreateUserName(markLog.getCreateUserName());
                 oneClickExpDTO.setSeqNo(i + 1);
-                oneClickExpDTO.setExamNumber(markLog.getExamNumber());
+                Paper paper = paperRepo.findOne(markLog.getPaperId());
+                oneClickExpDTO.setSecretNumber(paper == null ? "" : paper.getSecretNumber());
                 oneClickExpDTO.setOriginLevel(markLog.getOperDataBefore() == null ? "" : markLog.getOperDataBefore());
                 oneClickExpDTO.setLevel(markLog.getOperDataAfter());
                 oneClickExpDTOS.add(oneClickExpDTO);
@@ -142,4 +144,28 @@ public class PaperExporter {
         }
         ExportUtils.exportEXCEL("改档信息导出", ChangeLevelExpDTO.class, changeLevelExpDTOS, response);
     }
+
+    /**
+     * 导出标记试卷信息
+     *
+     * @param workId 工作ID
+     * @param response response对象
+     */
+    @GetMapping("{workId}/mark")
+    public void exportMark(@PathVariable Long workId, HttpServletResponse response) {
+        List<MarkExpDTO> markExpDTOS = new ArrayList<>();
+        List<Paper> papers = paperRepo.findByWorkIdAndIsMarkTrue(workId);
+        for (Paper paper : papers) {
+            MarkExpDTO markExpDTO = new MarkExpDTO();
+            markExpDTO.setWorkId(workId);
+            Subject subject = paper.getSubject();
+            markExpDTO.setSubject(subject.name());
+            String subjectName = subject.getName();
+            markExpDTO.setSubjectName(subjectName);
+            markExpDTO.setExamNumber(paper.getExamNumber());
+            markExpDTO.setStudentName(paper.getStudentName());
+            markExpDTOS.add(markExpDTO);
+        }
+        ExportUtils.exportEXCEL("标记试卷信息", MarkExpDTO.class, markExpDTOS, response);
+    }
 }

+ 6 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -510,7 +510,7 @@ public class DataUploadService {
     }
 
     @Transactional
-    public Paper savePaper(Student student, Subject subject, boolean isManual, String level) throws Exception {
+    public Paper savePaper(Student student, Subject subject, boolean isManual, String level, Long scanUserId) throws Exception {
         ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(student.getWorkId(), subject, student.getAreaCode(), TrialEnum.DEFAULT.getId());
         Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject, student.getExamNumber(), TrialEnum.DEFAULT.getId());
         if (paper == null) {
@@ -520,12 +520,15 @@ public class DataUploadService {
         paper.setUploadedOn(new Date());
         paper.setManual(isManual);
 
-        if (Objects.nonNull(level) && level != "") {
+        // 采集员ID
+        paper.setScanUserId(scanUserId);
+
+        if (Objects.nonNull(level) && !level.equals("")) {
             paper.setLevel(level);
             //设置为已发布任务的状态
             paper.setActive(true);
             //默认给1,与实际分档批次区分
-            paper.setBatchNo(1l);
+            paper.setBatchNo(1L);
         }
 
         if (!imageServerConfig.isAliyunOss()) {

+ 167 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/ToolService.java

@@ -0,0 +1,167 @@
+package cn.com.qmth.stmms.ms.admin.service;
+
+import cn.com.qmth.stmms.ms.admin.dto.SysAdjustLevelDTO;
+import cn.com.qmth.stmms.ms.commons.utils.DbBackupUtils;
+import cn.com.qmth.stmms.ms.core.domain.*;
+import cn.com.qmth.stmms.ms.core.domain.user.Role;
+import cn.com.qmth.stmms.ms.core.repository.*;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class ToolService {
+
+    @Resource
+    private LevelRepo levelRepo;
+
+    @Resource
+    private WorkRepo workRepo;
+
+    @Resource
+    private PaperRepo paperRepo;
+
+    @Resource
+    private MarkLogRepo markLogRepo;
+
+    @Resource
+    private MarkSubjectRepo markSubjectRepo;
+
+    @Resource
+    DbBackupUtils dbBackupUtils;
+
+    public List<SysAdjustLevelDTO> listAdjustLevels(Long workId, Subject subject) {
+        Work work = workRepo.findOne(workId);
+        if (work == null) {
+            throw new RuntimeException("不存在此工作");
+        }
+
+        MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject);
+        if (markSubject == null || !MarkStage.LEVEL.equals(markSubject.getStage())) {
+            throw new RuntimeException("不是分档阶段");
+        }
+
+        List<Level> levels = levelRepo.findByWorkId(workId);
+
+        List<Paper> papers = paperRepo.findByWorkIdAndSubject(workId, subject);
+        if (papers.isEmpty()) {
+            throw new RuntimeException("不是分档阶段");
+        }
+        long nullLevel = papers.stream().filter(m -> StringUtils.isBlank(m.getLevel())).count();
+        if (nullLevel > 0) {
+            throw new RuntimeException("分档未结束");
+        }
+
+        Map<String, Long> countMap = papers.stream().collect(Collectors.groupingBy(Paper::getLevel, Collectors.counting()));
+        List<SysAdjustLevelDTO> list = new ArrayList<>();
+        for (Level level : levels) {
+            SysAdjustLevelDTO sysAdjustLevelDTO = new SysAdjustLevelDTO();
+            sysAdjustLevelDTO.setSubject(subject.name());
+            sysAdjustLevelDTO.setLevel(level.getCode());
+            int actualCount = 0;
+            double actualRate = 0;
+            if (countMap.containsKey(level.getCode())) {
+                actualCount = Math.toIntExact(countMap.get(level.getCode()));
+                actualRate = new BigDecimal(actualCount * 100).divide(new BigDecimal(papers.size()), 2, RoundingMode.UP).doubleValue();
+            }
+            sysAdjustLevelDTO.setActualCount(actualCount);
+            sysAdjustLevelDTO.setActualRate(actualRate);
+            sysAdjustLevelDTO.setStudentCount(papers.size());
+            list.add(sysAdjustLevelDTO);
+        }
+
+        return list;
+    }
+
+    /**
+     * 调档操作
+     *
+     * @param workId  工作ID
+     * @param subject 科目
+     * @param list    list内容
+     */
+    @Transactional
+    public void deal(Long workId, Subject subject, List<SysAdjustLevelDTO> list) {
+        Work work = workRepo.findOne(workId);
+
+        // 备份数据库
+        dbBackupUtils.startBackup(workId, "系统调档");
+
+        // 处理调档,记录日志
+        List<Paper> paperList = paperRepo.findByWorkIdAndSubjectOrderByLevelAscSortNumDesc(workId, subject);
+        int sum = list.stream().mapToInt(SysAdjustLevelDTO::getExpectCount).sum();
+        if (sum != paperList.size()) {
+            throw new RuntimeException("总数量不一致");
+        }
+
+        List<Paper> finalPapers = new ArrayList<>();
+        List<MarkLog> markLogs = new ArrayList<>();
+        int total = 0;
+        for (SysAdjustLevelDTO levelDTO : list) {
+            int expectCount = levelDTO.getExpectCount();
+            if (expectCount == 0) {
+                continue;
+            }
+            int lastIndex = total + expectCount;
+            // 取试卷
+            List<Paper> papers = paperList.subList(total, lastIndex);
+            String level = levelDTO.getLevel();
+            for (Paper paper : papers) {
+                if (level.equals(paper.getLevel())) {
+                    continue;
+                }
+
+                // 记录日志
+                MarkLog markLog = new MarkLog(0L, "admin", Role.ADMIN, subject, paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.SYSTEM_ADJUST_LEVEL.getId(), workId, paper.getId(), MarkStage.LEVEL, paper.getLevel(), level, "系统批量调档", work.getName(), new Date());
+                markLogs.add(markLog);
+
+                // 有档位变动的试卷
+                paper.setLevel(level);
+                finalPapers.add(paper);
+            }
+            total = lastIndex;
+        }
+
+        if (!CollectionUtils.isEmpty(finalPapers)) {
+            List<Paper> data = new ArrayList<>();
+            //500条提交一次
+            for (Paper paper : finalPapers) {
+                if (data.size() == 1000) {
+                    paperRepo.save(data);
+                    data.clear();
+                }
+                data.add(paper);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                paperRepo.save(data);
+            }
+        }
+        if (!CollectionUtils.isEmpty(markLogs)) {
+            List<MarkLog> data = new ArrayList<>();
+            //500条提交一次
+            for (MarkLog markLog : markLogs) {
+                if (data.size() == 1000) {
+                    markLogRepo.save(markLog);
+                    data.clear();
+                }
+                data.add(markLog);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                markLogRepo.save(data);
+            }
+        }
+    }
+}

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

@@ -267,19 +267,20 @@ public class CollectApi {
     public CollectStuDTO saveStudent(HttpServletRequest request, @PathVariable Integer subjectId,
                                      CollectStuDTO dto) throws Exception {
         Subject subject = Subject.values()[subjectId - 1];
-        Long organizationId = Long.valueOf(request.getHeader("organizationId"));
-//        Work activeWork = workRepo.findByActiveTrue();
-        Work activeWork = workRepo.findByActiveTrueAndOrganizationId(organizationId);
-        List<CollectStuDTO> list = new ArrayList<>();
+        Long workId = ServletUtil.getWordId();
+        Work activeWork = workRepo.findOne(workId);
+        if (activeWork == null) {
+            throw new RuntimeException("工作不存在");
+        }
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
-//        for (CollectStuDTO dto : uploadStudentArray) {
         Student student = studentRepo.findByWorkIdAndRelateExamNumberAndTest(activeWork.getId(), dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
         Paper paper = null;
+        Long userId = ServletUtil.getUserId();
         if (!dto.isAbsent()) {
-            paper = dataUploadService.savePaper(student, subject, dto.isManual(), dto.getLevel());
+            paper = dataUploadService.savePaper(student, subject, dto.isManual(), dto.getLevel(), userId);
         }
         //已知档位,更新阶段
-        if (Objects.nonNull(dto.getLevel()) && dto.getLevel() != "") {
+        if (Objects.nonNull(dto.getLevel()) && !Objects.equals(dto.getLevel(), "")) {
             MarkSubject markSubject = markSubjectRepo.findOne(activeWork.getId() + "-" + subject.name());
             if (markSubject.getStage().name().equals(MarkStage.INIT.name())) {
                 markSubject.setStage(MarkStage.LEVEL);
@@ -287,14 +288,13 @@ public class CollectApi {
             }
         }
         dto.setUploadTime(sdf.format(new Date()));
-        paper.setRelate(!StringUtils.equals(student.getExamNumber(), student.getRelateExamNumber()));
         if (paper != null) {
+            paper.setRelate(!StringUtils.equals(student.getExamNumber(), student.getRelateExamNumber()));
             dto.setPaperId(paper.getId());
         }
         return dto;
     }
 
-//    File srcFile = new File("/Users/king/stmms-ms/static/images/2/SM/1/1901040150.jpg"); //初始文件
 
     /**
      * 上传原图(图片加密)
@@ -1242,7 +1242,7 @@ public class CollectApi {
                     finalList.addAll(entryValue);
                 } else {
                     int count = countPerScore.intValue();
-                    if(entryValue.size() <= count){
+                    if (entryValue.size() <= count) {
                         finalList.addAll(entryValue);
                     } else {
                         finalList.addAll(entryValue.subList(0, count));

+ 9 - 0
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/dto/CollectStuDTO.java

@@ -17,6 +17,7 @@ public class CollectStuDTO {
 
     private String level;
     private Long paperId;
+    private Long scanUserId;
 
     public Long getExamId() {
         return examId;
@@ -97,4 +98,12 @@ public class CollectStuDTO {
     public void setPaperId(Long paperId) {
         this.paperId = paperId;
     }
+
+    public Long getScanUserId() {
+        return scanUserId;
+    }
+
+    public void setScanUserId(Long scanUserId) {
+        this.scanUserId = scanUserId;
+    }
 }

+ 67 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/DbBackupUtils.java

@@ -0,0 +1,67 @@
+package cn.com.qmth.stmms.ms.commons.utils;
+
+import cn.com.qmth.stmms.ms.commons.config.DbConfig;
+import org.apache.http.client.utils.DateUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * @Date: 2021/5/31.
+ */
+@Component
+public class DbBackupUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DbBackupUtils.class);
+
+    ExecutorService service = Executors.newFixedThreadPool(1);
+
+    @Autowired
+    DbConfig dbConfig;
+
+    public void startBackup(Long workId, String stage) {
+        service.submit(dbBackUp(workId, stage));
+    }
+
+    public Runnable dbBackUp(Long workId, String stage) {
+        return () -> {
+            String path = "beifen";
+            String pathSql = workId + "-" + stage + "-" + DateUtils.formatDate(new Date(), "yyyyMMddHHmmss") + ".sql";
+            File fileSql = new File(path, pathSql);
+            try {
+                if (!fileSql.getParentFile().exists()) {
+                    fileSql.getParentFile().mkdirs();
+                }
+                //创建备份sql文件
+                if (!fileSql.exists()) {
+                    fileSql.createNewFile();
+                }
+                //mysqldump -hlocalhost -uroot -p123456 db > /home/back.sql
+                StringBuffer sb = new StringBuffer();
+                sb.append("mysqldump");
+                sb.append(" -h " + dbConfig.getHost());
+                sb.append(" -u" + dbConfig.getUserName());
+                sb.append(" -p" + dbConfig.getPassword());
+                sb.append(" " + dbConfig.getDbName() + " >");
+                sb.append(fileSql.getAbsolutePath());
+                LOGGER.info("cmd命令为:{},开始备份数据库:" + sb.toString(), dbConfig.getDbName());
+                Runtime runtime = Runtime.getRuntime();
+                Process process = runtime.exec("cmd /c" + sb.toString());
+                LOGGER.info("备份成功!");
+            } catch (IOException e) {
+                LOGGER.info("备份失败!原因:{}", e.getMessage());
+            }
+        };
+    }
+
+    public static void main(String[] args) {
+        System.out.println(System.getProperty("os.name"));
+    }
+}

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

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.commons.utils;
 
+import org.apache.commons.lang.StringUtils;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -22,19 +23,28 @@ public class ServletUtil {
 
     /**
      * 获取用户ID
-     * @return
      */
-    public static String getUserId() {
+    public static Long getUserId() {
         HttpServletRequest request = getRequest();
-        return request.getHeader("userId");
+        String userId = request.getHeader("userId");
+        return StringUtils.isBlank(userId) ? null : Long.valueOf(userId);
     }
 
     /**
      * 获取工作ID
-     * @return
      */
-    public static String getWordId() {
+    public static Long getWordId() {
+        HttpServletRequest request = getRequest();
+        String workId = request.getHeader("examId");
+        return StringUtils.isBlank(workId) ? null : Long.valueOf(workId);
+    }
+
+    /**
+     * 获取机构ID
+     */
+    public static Long getOrganizationId() {
         HttpServletRequest request = getRequest();
-        return request.getHeader("wordId");
+        String organizationId = request.getHeader("organizationId");
+        return StringUtils.isBlank(organizationId) ? null : Long.valueOf(organizationId);
     }
 }

+ 14 - 4
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLogOperType.java

@@ -99,7 +99,12 @@ public enum MarkLogOperType {
     /**
      * 改档打档
      */
-    CHANGE_SCORE(18, "改档打分");
+    CHANGE_SCORE(18, "改档打分"),
+
+    /**
+     * 改档打档
+     */
+    SYSTEM_ADJUST_LEVEL(19, "系统调档");
 
     private int id;
 
@@ -167,6 +172,8 @@ public enum MarkLogOperType {
             return CHANGE_LEVEL.getId();
         } else if (value.trim().equals(CHANGE_SCORE.name)) {
             return CHANGE_SCORE.getId();
+        } else if (value.trim().equals(SYSTEM_ADJUST_LEVEL.name)) {
+            return SYSTEM_ADJUST_LEVEL.getId();
         } else {
             return CRITERION_PAPER_SET.getId();
         }
@@ -213,6 +220,8 @@ public enum MarkLogOperType {
             return CHANGE_LEVEL.name;
         } else if (id == CHANGE_SCORE.getId()) {
             return CHANGE_SCORE.name;
+        } else if (id == SYSTEM_ADJUST_LEVEL.getId()) {
+            return SYSTEM_ADJUST_LEVEL.name;
         } else {
             return CRITERION_PAPER_SET.name;
         }
@@ -220,15 +229,16 @@ public enum MarkLogOperType {
 
     /**
      * 操作日志管理类型查询
+     *
      * @return
      */
-    public static List<Map> listTypes(){
+    public static List<Map> listTypes() {
         MarkLogOperType[] values = MarkLogOperType.values();
-        Integer[] ints = {1, 2, 3, 4, 8, 7, 10, 5, 15, 16, 17, 18};
+        Integer[] ints = {1, 2, 3, 4, 8, 7, 10, 5, 15, 16, 17, 18, 19};
         List<Integer> intList = Arrays.asList(ints);
         List<Map> list = new ArrayList<>();
         for (MarkLogOperType value : values) {
-            if(intList.contains(value.getId())) {
+            if (intList.contains(value.getId())) {
                 Map map = new HashMap();
                 map.put("id", value.getId());
                 map.put("type", value.name());

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

@@ -146,6 +146,13 @@ public class Paper implements Serializable {
 
     private Integer sortNum;
 
+    private Long scanUserId;
+
+    /**
+     * 是否标记
+     */
+    private boolean isMark;
+
     public int getTest() {
         return test;
     }
@@ -558,4 +565,20 @@ public class Paper implements Serializable {
     public void setSortNum(Integer sortNum) {
         this.sortNum = sortNum;
     }
+
+    public Long getScanUserId() {
+        return scanUserId;
+    }
+
+    public void setScanUserId(Long scanUserId) {
+        this.scanUserId = scanUserId;
+    }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
 }

+ 12 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java

@@ -54,6 +54,8 @@ public class ParamSetting implements Serializable {
 
     private Integer directScore;
 
+    private Integer takeBest;
+
     public static ParamSetting init(){
         ParamSetting paramSetting = new ParamSetting();
         paramSetting.setPackageScan(0);
@@ -76,6 +78,8 @@ public class ParamSetting implements Serializable {
         paramSetting.setAutoCallbackShowDeviation(1);
         paramSetting.setShowSample(1);
         paramSetting.setDirectScore(0);
+        // 取优原则默认开启
+        paramSetting.setTakeBest(1);
         return paramSetting;
     }
 
@@ -238,4 +242,12 @@ public class ParamSetting implements Serializable {
     public void setDirectScore(Integer directScore) {
         this.directScore = directScore;
     }
+
+    public Integer getTakeBest() {
+        return takeBest;
+    }
+
+    public void setTakeBest(Integer takeBest) {
+        this.takeBest = takeBest;
+    }
 }

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

@@ -101,12 +101,18 @@ public class MarkTask implements Serializable {
 
     private String deviationDirection;
 
+    /**
+     * 是否标记
+     */
+    private boolean isMark;
+
     /**
      * 计算偏差范围使用
      */
     @Transient
     private String dateMineResult;
 
+
     public Long getBatchNo() {
         return batchNo;
     }
@@ -214,6 +220,24 @@ public class MarkTask implements Serializable {
         this.updatedOn = new Date();
     }
 
+    /**
+     * 成绩查询使用
+     *
+     * @param id           任务ID
+     * @param markerId     评卷员Id
+     * @param markerName   评卷员名称
+     * @param result       结果
+     * @param secretNumber 任务密号
+     */
+    public MarkTask(Long id, Long markerId, String markerName, String result, String secretNumber, MarkStage stage) {
+        this.id = id;
+        this.markerId = markerId;
+        this.markerName = markerName;
+        this.result = result;
+        this.secretNumber = secretNumber;
+        this.stage = stage;
+    }
+
     public MarkTask() {
     }
 
@@ -400,4 +424,12 @@ public class MarkTask implements Serializable {
     public void setDateMineResult(String dateMineResult) {
         this.dateMineResult = dateMineResult;
     }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
 }

+ 13 - 8
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -61,6 +61,7 @@ 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.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)
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
+
     /**
      * 查询评卷员的评卷任务
      *
@@ -103,7 +104,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
      * 统计各评卷员各试题已评数及总数(分档阶段)
      *
-     *
      * @param name
      * @param stageId
      * @param batchNo
@@ -117,7 +117,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
      * 考区已评数及总数(分档阶段)
      *
-     *
      * @param name
      * @return
      */
@@ -129,7 +128,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
      * 考区已评数及总数(分档阶段)
      *
-     *
      * @param name
      * @return
      */
@@ -189,13 +187,13 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissingAll(Long questionId, Long markerId, int stage, boolean isMissing);
 
     @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 = ?6 and m.stage = ?2 and m.result =?3 and p.is_rejected = false", nativeQuery = true)
-    int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing,Long batchNo,Long markerId);
+    int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing, 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.is_missing = ?4 and p.score_batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and p.level =?3 and m.result is not null", nativeQuery = true)
-    int countScoreByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing,Long batchNo,Long markerId);
+    int countScoreByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing, 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.is_missing = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?5 and m.stage = ?2 and p.level =?3 and m.result is not null", nativeQuery = true)
-    int countScoreByQuestionIdAndStageAndResultAndIsMissingAll(Long questionId, int stage, String result, boolean isMissing,Long markerId);
+    int countScoreByQuestionIdAndStageAndResultAndIsMissingAll(Long questionId, int stage, String result, boolean isMissing, Long markerId);
 
     MarkTask findByPaperIdAndMarkerId(Long paperId, Long markId);
 
@@ -220,10 +218,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     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);
+    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", nativeQuery = true)
-    int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(Long questionId, Long markerId, int ordinal,boolean isMissing);
+    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);
@@ -273,4 +271,11 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     List<String> findByWorkIdAndSubjectAndStageAndManualScore(Long workId, String subject, int stage);
 
     List<MarkTask> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
+
+    @Query(value = "select new MarkTask(m.id, m.markerId , m.markerName, m.result, m.secretNumber, m.stage) from MarkTask m where m.paper.id = ?1 and m.stage = ?2")
+    List<MarkTask> findByPaperIdAndStageNative(Long id, MarkStage level);
+
+    @Modifying
+    @Query("update MarkTask m set m.isMark = ?2 where m.id = ?1")
+    void updateMarkTaskMarkById(Long markTaskId, Boolean isMark);
 }

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

@@ -400,5 +400,16 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
 
+    @Query(value = "select * from paper p where p.scan_user_id = ?1 order by p.updated_on desc limit 1", nativeQuery = true)
+    Paper findByScanUserIdOrderByUpdatedOnDescLimit(Long id);
+
+    @Modifying
+    @Query("update Paper s set s.isMark = ?2 where s.id = ?1")
+    void updatePaperMarkById(Long paperId, boolean isMark);
+
+    List<Paper> findByWorkIdAndIsMarkTrue(Long workId);
+
+    List<Paper> findByWorkIdAndSubjectOrderByLevelAscSortNumDesc(Long workId, Subject subject);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }

+ 0 - 118
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/utils/DbBackupUtils.java

@@ -1,118 +0,0 @@
-package cn.com.qmth.stmms.ms.core.utils;
-
-import cn.com.qmth.stmms.ms.commons.config.DbConfig;
-import cn.com.qmth.stmms.ms.core.domain.Organization;
-import cn.com.qmth.stmms.ms.core.domain.Work;
-import cn.com.qmth.stmms.ms.core.repository.OrganizationRepo;
-import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
-import org.apache.commons.io.FileUtils;
-import org.apache.http.client.utils.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.*;
-import java.nio.charset.Charset;
-import java.util.Date;
-import java.util.Objects;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * @Date: 2021/5/31.
- */
-@Component
-public class DbBackupUtils {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(DbBackupUtils.class);
-
-    ExecutorService service = Executors.newFixedThreadPool(1);
-
-    @Autowired
-    DbConfig dbConfig;
-
-    @Autowired
-    OrganizationRepo organizationRepo;
-
-    @Autowired
-    WorkRepo workRepo;
-
-    public void startBackup(Long workId, String stage) {
-        Work work = workRepo.getOne(workId);
-        if (Objects.nonNull(work)) {
-            Organization organization = organizationRepo.getOne(work.getOrganizationId());
-            if (Objects.nonNull(organization)) {
-                String code = organization.getAbbreviation();
-                service.submit(dbBackUp(workId, code, stage));
-            }
-        }
-    }
-
-    public Runnable dbBackUp(Long workId, String code, String stage) {
-        return () -> {
-            String path = "beifen";
-            String pathSql = code + "-" + workId + "-" + stage + "-" + DateUtils.formatDate(new Date(), "yyyyMMddHHmmss") + ".sql";
-            File fileSql = new File(path, pathSql);
-            try {
-                if (!fileSql.getParentFile().exists()) {
-                    fileSql.getParentFile().mkdirs();
-                }
-                //创建备份sql文件
-                if (!fileSql.exists()) {
-                    fileSql.createNewFile();
-                }
-
-//                String mysqldump = getMysqldump(fileSql);
-                //mysqldump -hlocalhost -uroot -p123456 db > /home/back.sql
-                StringBuffer sb = new StringBuffer();
-                sb.append("cmd /c ");
-                sb.append("mysqldump");
-                sb.append(" -h " + dbConfig.getHost());
-                sb.append(" -u" + dbConfig.getUserName());
-                sb.append(" -p" + dbConfig.getPassword());
-                sb.append(" -P" + dbConfig.getPort());
-                sb.append(" " + dbConfig.getDbName() + " >");
-                sb.append(fileSql.getPath());
-                LOGGER.info("cmd命令为:{}", sb.toString());
-                Runtime runtime = Runtime.getRuntime();
-                runtime.exec(sb.toString());
-                LOGGER.info("备份成功!");
-            } catch (Exception e) {
-                LOGGER.info("备份失败!原因:{}", e.getMessage());
-            }
-        };
-    }
-
-    public static String getMysqldump(File fileSql) throws IOException, InterruptedException {
-        Runtime runtime = Runtime.getRuntime();
-        Process process = runtime.exec("where mysqldump");
-        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
-        String line = null;
-        String result = "";
-        while ((line = br.readLine()) != null) {
-            System.out.println(line);
-            result += line;
-        }
-        br.close();
-        process.waitFor();
-        File destFile = new File(fileSql.getParent(), "mysqldump.exe");
-        if (result.contains("mysqldump")) {
-            if (destFile.exists()) {
-                destFile.delete();
-            }
-            FileUtils.copyFile(new File(result), destFile);
-        } else {
-            try {
-                FileOutputStream out = new FileOutputStream(fileSql.getAbsolutePath(), true);
-                String str = "没有找到mysqldump命令";
-                out.write(str.getBytes());
-                out.close();
-            } catch (Exception e) {
-                throw new RuntimeException(e.getMessage());
-            }
-            throw new RuntimeException("没有找到mysqldump命令");
-        }
-        return destFile.getParent() + File.separator + "mysqldump";
-    }
-}

+ 28 - 32
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java

@@ -5,13 +5,16 @@ import cn.com.qmth.stmms.ms.commons.utils.specification.PagingAndSortingDTO;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 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;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -22,6 +25,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.Predicate;
 import javax.servlet.http.HttpServletRequest;
@@ -48,6 +52,9 @@ public class MarkLogController {
     @Autowired
     WorkRepo workRepo;
 
+    @Resource
+    MarkUserRepo markUserRepo;
+
     @Autowired
     SqlUtil sqlUtil;
 
@@ -241,39 +248,28 @@ public class MarkLogController {
      */
     @RequestMapping(value = "/equipmentMonitor", method = RequestMethod.GET)
     public Object saveCollectLog(Long workId, Pageable pageable) {
-        List<Map> mapList = markLogRepo.findByWorkId(workId);
-        if (!mapList.isEmpty() && mapList.size() > 0) {
-            List<Long> longs = mapList.stream().map(m -> Long.valueOf(m.get("id").toString())).collect(Collectors.toList());
-
-            Specification<MarkLog> specification = (root, query, builder) -> {
-                List<Predicate> predicates = new ArrayList<>();
-                if (longs != null && longs.size() > 0) {
-                    CriteriaBuilder.In<Object> in = builder.in(root.get("id"));
-                    for (Long id : longs) {
-                        in.value(id);
-                    }
-                    predicates.add(builder.and(builder.and(in)));
-                }
-                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
-            };
-            Page<MarkLog> markLogs = markLogRepo.findAll(specification, pageable);
-            List<MarkLog> list = markLogs.getContent();
-            List<Map> arrayList = new ArrayList<>();
-            for (MarkLog markLog : list) {
-                Map map = new HashMap();
-                map.put("createUserName", markLog.getCreateUserName());
-                if(Objects.nonNull(markLog.getPaperId())) {
-                    Paper paper = paperRepo.findOne(markLog.getPaperId());
-                    PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
-                    map.put("imgSrc", paperDTO.getImgSrc());
-                    map.put("thumbSrc", paperDTO.getThumbSrc());
-                }
-                arrayList.add(map);
-            }
-
-            return new PageableDTO(arrayList, markLogs.getTotalElements(), markLogs.getTotalPages(), pageable.getPageNumber());
+        Specification<MarkUser> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("workId"), workId));
+            predicates.add(builder.equal(root.get("role"), Role.COLLECTOR));
+            return builder.and(predicates.toArray(new Predicate[0]));
+        };
+        Sort sort = new Sort(Sort.Direction.ASC, "loginName");
+        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+        Page<MarkUser> markUserPage = markUserRepo.findAll(specification, pageable1);
+        List<MarkUser> markUserList = markUserPage.getContent();
+        List<JSONObject> arrayList = new ArrayList<>();
+        for (MarkUser markUser : markUserList) {
+            JSONObject object = new JSONObject();
+            object.put("createUserName", markUser.getName());
+            Paper paper = paperRepo.findByScanUserIdOrderByUpdatedOnDescLimit(markUser.getId());
+            PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
+            object.put("imgSrc", paper == null ? null : paperDTO.getImgSrc());
+            object.put("thumbSrc", paper == null ? null : paperDTO.getThumbSrc());
+            object.put("sheetSrc", paper == null ? null : paperDTO.getSheetSrc());
+            arrayList.add(object);
         }
-        return null;
+        return new PageableDTO(arrayList, markUserPage.getTotalElements(), markUserPage.getTotalPages(), pageable.getPageNumber());
     }
 
     /**

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

@@ -1,10 +1,8 @@
-#spring.datasource.url=jdbc:mysql://192.168.10.42:3306/stmms-ms-2-1?useUnicode=true&characterEncoding=UTF-8
-#spring.datasource.username=root
-#spring.datasource.password=root
+server.port=9000
 
 db.host=localhost
 db.port=3306
-db.dbName=msyj-org-v2.1.0
+db.dbName=msyj-org-v3.0.0
 db.userName=root
 db.password=root
 
@@ -19,7 +17,6 @@ spring.datasource.test-on-borrow=true
 #spring.redis.host=192.168.199.102
 #spring.redis.port=32768
 
-server.port=9000
 server.compression.enabled=true
 server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
 
@@ -99,7 +96,7 @@ score.level.taskSort=paper
 #score.level.taskSort=paper
 
 #\u524D\u7AEF\u9759\u6001\u8D44\u6E90\u76EE\u5F55
-web.upload-path=D:\\company\\qmth\\bat-pro\\msyj\\org\\msyj-2021-org-v2.1.0-nginx\\dist\\
+web.upload-path=D:\\company\\qmth\\bat-pro\\msyj\\org\\msyj-org-v3.0.0-nginx\\dist\\
 spring.mvc.static-path-pattern=/**
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${sys.config.localhostPath},file:${web.upload-path}
 

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

@@ -28,6 +28,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -415,6 +416,19 @@ public class MarkTaskApi {
         return new ResponseEntity(markTaskAssembler.toDTO(markTask), HttpStatus.OK);
     }
 
+    /**
+     * 跳过评卷任务
+     *
+     * @param markTaskId 评卷你任务id
+     */
+    @RequestMapping(value = "/mark_task", method = RequestMethod.POST)
+    @Transactional
+    public Object markTask(@RequestParam Long markTaskId,
+                           @RequestParam Boolean isMark) {
+        markTaskRepo.updateMarkTaskMarkById(markTaskId, isMark);
+        return true;
+    }
+
     /**
      * 已评试卷回显
      *
@@ -582,4 +596,41 @@ public class MarkTaskApi {
                                             @RequestParam String secretNumber) {
         return markTaskRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber, TrialEnum.DEFAULT.getId());
     }
+
+    /**
+     * 查询标记任务(科组长)
+     *
+     * @param workId   工作ID
+     * @param subject  科目
+     * @param stage    阶段
+     * @param markerId 评卷员ID
+     */
+    @RequestMapping(value = "/list_mark_task", method = RequestMethod.GET)
+    public PageableDTO listMarkTask(@RequestParam Long workId,
+                                    @RequestParam Subject subject,
+                                    @RequestParam MarkStage stage,
+                                    @RequestParam Long markerId,
+                                    Pageable pageable) {
+        /*List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndSubjectAndStageAndMarkerIdAndIsMarkTrue(workId, subject, stage, markerId);
+        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
+        markTasks.forEach(m -> {
+            markTaskDTOs.add(markTaskAssembler.toDTO(m));
+        });
+        return markTaskDTOs;*/
+
+        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
+        Specification<MarkTask> 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));
+            predicates.add(builder.equal(root.get("stage"), stage));
+            predicates.add(builder.equal(root.get("markerId"), markerId));
+            predicates.add(builder.equal(root.get("isMark"), true));
+            return builder.and(predicates.toArray(new Predicate[0]));
+        };
+        Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable);
+
+        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskAssembler.toDTO(m)));
+        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+    }
 }

+ 66 - 13
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -18,6 +18,7 @@ import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
 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 com.alibaba.fastjson.JSONObject;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -137,7 +138,7 @@ public class PaperApi {
     }
 
     @RequestMapping(value = "listByQuestion", method = RequestMethod.GET)
-    public PageableDTO listByQuerion(@RequestParam Long workId,
+    public PageableDTO listByQuestion(@RequestParam Long workId,
                                      @RequestParam(required = false) String areaCode,
                                      @RequestParam Subject subject,
                                      @RequestParam(required = false) Long startNumber,
@@ -146,6 +147,8 @@ public class PaperApi {
                                      @RequestParam(required = false) Boolean missing,
                                      @RequestParam(required = false) Boolean isRelate,
                                      @RequestParam(required = false) String studentName,
+                                      @RequestParam(required = false) Long scanUserId,
+                                      @RequestParam(required = false) Boolean isMark,
                                      @RequestParam(required = false) String sortBy,
                                      Pageable pageable) {
         Sort sort = null;
@@ -159,7 +162,10 @@ public class PaperApi {
         Specification<Paper> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.equal(root.get("workId"), workId));
-            if (areaCode != null && areaCode != "") {
+            if (scanUserId != null) {
+                predicates.add(builder.equal(root.get("scanUserId"), scanUserId));
+            }
+            if (areaCode != null && !areaCode.equals("")) {
                 predicates.add(builder.equal(root.get("areaCode"), areaCode));
             }
             if (subject != null) {
@@ -167,9 +173,9 @@ public class PaperApi {
             }
             if (startNumber != null && endNumber != null) {
                 predicates.add(builder.between(root.get("examNumber"), startNumber, endNumber));
-            } else if (startNumber != null && endNumber == null) {
+            } else if (startNumber != null) {
                 predicates.add(builder.equal(root.get("examNumber"), startNumber));
-            } else if (startNumber == null && endNumber != null) {
+            } else if (endNumber != null) {
                 predicates.add(builder.equal(root.get("examNumber"), endNumber));
             }
             if (isManual != null) {
@@ -181,8 +187,11 @@ public class PaperApi {
             if (isRelate != null) {
                 predicates.add(builder.equal(root.get("isRelate"), isRelate));
             }
+            if (isMark != null) {
+                predicates.add(builder.equal(root.get("isMark"), isMark));
+            }
             //考生姓名
-            if (studentName != null && studentName != "") {
+            if (studentName != null && !studentName.equals("")) {
                 predicates.add(builder.equal(root.get("studentName"), studentName));
             }
             predicates.add(builder.equal(root.get("test"), 0));
@@ -540,17 +549,35 @@ public class PaperApi {
         Map<String, List<Paper>> groupPaper = papers.stream().collect(Collectors.groupingBy(p -> p.getExamNumber() + ":" + p.getStudentName()));
         List<Map> mapList = new ArrayList<>();
         for (Map.Entry<String, List<Paper>> entry : groupPaper.entrySet()) {
-            Map map = new HashMap();
+            JSONObject object = new JSONObject();
             String key = entry.getKey();
+            object.put("examNumber", key.split(":")[0]);
+            object.put("name", key.split(":")[1]);
+
             List<Paper> paperList = entry.getValue();
-            map.put("examNumber", key.split(":")[0]);
-            map.put("name", key.split(":")[1]);
             double sumScore = paperList.stream().filter(m -> Objects.nonNull(m.getScore())).mapToDouble(Paper::getScore).sum();
-            map.put("sumScore", Optional.ofNullable(sumScore).orElse(0D).intValue());
-            List<PaperDTO> paperDTOs = new ArrayList<>();
-            paperList.forEach(p -> paperDTOs.add(paperAssembler.toDTO(p)));
-            map.put("scores", paperDTOs);
-            mapList.add(map);
+            object.put("sumScore", Optional.of(sumScore).orElse(0D).intValue());
+            List<JSONObject> paperDTOs = new ArrayList<>();
+            for (Paper paper : paperList) {
+                PaperDTO paperDTO = paperAssembler.toDTO(paper);
+                JSONObject subObject = new JSONObject();
+                subObject.put("secretNumber", paperDTO.getSecretNumber());
+                subObject.put("level", paperDTO.getLevel());
+                subObject.put("score", paperDTO.getScore());
+                subObject.put("imgSrc", paperDTO.getImgSrc());
+                subObject.put("thumbSrc", paperDTO.getImgSrc());
+                subObject.put("sheetSrc", paperDTO.getSheetSrc());
+                // 分档明细
+                List<MarkTask> taskLevels = markTaskRepo.findByPaperIdAndStageNative(paper.getId(), MarkStage.LEVEL);
+                subObject.put("taskLevels", taskLevels.isEmpty() ? null : taskLevels);
+                // 打分明细
+                List<MarkTask> taskScores = markTaskRepo.findByPaperIdAndStageNative(paper.getId(), MarkStage.SCORE);
+                subObject.put("taskScores", taskScores.isEmpty() ? null : taskScores);
+                paperDTOs.add(subObject);
+            }
+            object.put("papers", paperDTOs);
+            mapList.add(object);
+
         }
         return mapList;
     }
@@ -712,4 +739,30 @@ public class PaperApi {
                                          @RequestParam String secretNumber) {
         return paperRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber, TrialEnum.DEFAULT.getId());
     }
+
+    /**
+     * 试卷管理-标记试卷
+     *
+     * @param paperId 试卷ID
+     * @param isMark  标记状态
+     */
+    @RequestMapping(value = "/mark_paper", method = RequestMethod.POST)
+    @Transactional
+    public Object markPaper(@RequestParam Long paperId, @RequestParam boolean isMark) {
+        paperRepo.updatePaperMarkById(paperId, isMark);
+        return true;
+    }
+
+    /**
+     * 根据工作、科目、考号查询原卷
+     *
+     * @param workId     工作id
+     * @param subject    科目
+     * @param examNumber 考号
+     */
+    @RequestMapping(value = "{workId}/{subject}/{examNumber}", method = RequestMethod.GET)
+    public PaperDTO get(@PathVariable Long workId, @PathVariable Subject subject, @PathVariable String examNumber) {
+        Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumber(workId, subject, examNumber);
+        return paperAssembler.toDTO(paper);
+    }
 }

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

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

+ 106 - 112
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -5,35 +5,25 @@ import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
-import cn.com.qmth.stmms.ms.core.domain.*;
+import cn.com.qmth.stmms.ms.core.domain.MarkLogOperType;
+import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
+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.enums.TrialEnum;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
-import cn.com.qmth.stmms.ms.core.repository.*;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
-import cn.com.qmth.stmms.ms.marking.api.MakrerApi;
+import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
+import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
-import com.sun.glass.ui.Window;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
-import java.util.Map;
 import java.util.Objects;
-import java.util.stream.Collectors;
 
 /**
  * Created by zhengmin on 2016/10/10.
  */
 @Component
 public class PaperAssembler {
-
-    @Autowired
-    private MarkTaskRepo markTaskRepo;
-
-    @Autowired
-    private MarkTaskAssembler markTaskAssembler;
-
     @Autowired
     private SystemConfig systemConfig;
 
@@ -46,40 +36,33 @@ public class PaperAssembler {
     @Autowired
     private MarkSubjectRepo markSubjectRepo;
 
-    @Autowired
-    private LevelRepo levelRepo;
-
     @Autowired
     private MarkLogRepo markLogRepo;
 
     public PaperDTO toDTO(Paper paper) {
         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 = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
-            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(paper.isManual()) {
-                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
-            }*/
-        } else {
-            imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            /*if(paper.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());
+        String sheetSrc = null;
         PaperDTO paperDTO = null;
         if (paper != 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);
+                sheetSrc = 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);
+                sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            }
+            //查询阶段
+            MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
+
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setPaperId(paper.getId());
@@ -88,7 +71,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
@@ -97,10 +80,12 @@ public class PaperAssembler {
             paperDTO.setMarkedLogic(paper.isMarkedLogic());
             paperDTO.setRedoLevel(paper.getRedoLevel());
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
+            paperDTO.setSecretNumber(paper.getSecretNumber());
 //            String imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
 //            String thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setThumbSrc(thumbSrc);
+            paperDTO.setSheetSrc(sheetSrc);
             paperDTO.setAreaCode(paper.getAreaCode());
             paperDTO.setMissing(paper.getIsMissing());
             if (paper.getInspectScore() != null) {
@@ -115,7 +100,7 @@ public class PaperAssembler {
             paperDTO.setShift(paper.isShift());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setOneClick(paper.isOneClick());
-            paperDTO.setIsRejectedByLeader(paper.isRejectedByLeader() == null ? false : paper.isRejectedByLeader());
+            paperDTO.setIsRejectedByLeader(paper.isRejectedByLeader() != null && paper.isRejectedByLeader());
             //打回总次数
             int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), MarkLogOperType.CALLBACK_LEVEl.getId());
             paperDTO.setRejectedCount(rejectedCount);
@@ -127,31 +112,32 @@ public class PaperAssembler {
     public PaperDTO toDTOForPaperManager(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(paper.isManual() && 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(paper.isManual() && 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) {
+            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 (paper.isManual() && 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 (paper.isManual() && 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 = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setSubjectName(paper.getSubject().getName());
@@ -159,7 +145,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
@@ -184,6 +170,7 @@ public class PaperAssembler {
             paperDTO.setShift(paper.isShift());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setStudentName(student.getName());
+            paperDTO.setMark(paper.isMark());
         }
         return paperDTO;
     }
@@ -191,31 +178,36 @@ public class PaperAssembler {
     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());
+        String sheetSrc = null;
         PaperDTO paperDTO = null;
         if (paper != 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);
+                sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+                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);
+                    sheetSrc = 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);
+                sheetSrc = systemConfig.getSheetUrl(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);
+                    sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                }
+            }
+            //查询阶段
+            MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setSubjectName(paper.getSubject().getName());
@@ -223,7 +215,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
@@ -234,6 +226,7 @@ public class PaperAssembler {
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setThumbSrc(thumbSrc);
+            paperDTO.setSheetSrc(sheetSrc);
             paperDTO.setAreaCode(paper.getAreaCode());
             paperDTO.setMissing(paper.getIsMissing());
             if (paper.getInspectScore() != null) {
@@ -256,33 +249,34 @@ public class PaperAssembler {
         String imgSrc = null;
         String thumbSrc = null;
         String sheetSrc = 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 = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
-            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);
-            sheetSrc = 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);
-            sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-        }
-        //查询阶段
-        MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
         PaperDTO paperDTO = null;
         if (paper != 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 = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
+                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);
+                sheetSrc = 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);
+                sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            }
+            //查询阶段
+            MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
+
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             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.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());

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

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

+ 18 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java

@@ -54,6 +54,8 @@ public class PaperDTO implements Serializable{
     //考生姓名
     private String studentName;
     private boolean isOneClick;
+    private String secretNumber;
+    private boolean isMark;
     private List<MarkTaskDTO> markResults = new ArrayList<>();
 
     public int getPaperTest() {
@@ -339,4 +341,20 @@ public class PaperDTO implements Serializable{
     public void setOneClick(boolean oneClick) {
         isOneClick = oneClick;
     }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
+
+    public String getSecretNumber() {
+        return secretNumber;
+    }
+
+    public void setSecretNumber(String secretNumber) {
+        this.secretNumber = secretNumber;
+    }
 }

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

@@ -1,7 +1,7 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
+import cn.com.qmth.stmms.ms.commons.utils.DbBackupUtils;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
-import cn.com.qmth.stmms.ms.core.utils.DbBackupUtils;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.core.cache.CacheService;

+ 80 - 35
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java

@@ -24,7 +24,7 @@ import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 @Service
 public class DetermineLevelService {
 
-    public enum DeterType{
+    public enum DeterType {
         /**
          * 多数
          */
@@ -40,56 +40,101 @@ public class DetermineLevelService {
     @Autowired
     private MarkUserRepo markUserRepo;
 
-    public DeterResult determine(boolean majority,MarkTask...tasks){
-    	if(majority){
-    		//如果相同的数量大于半数,直接定档
-    		Stream<MarkTask> taskStream = Stream.of(tasks);
-    		Optional<Map.Entry<String,Long>> optional = taskStream
-    				.collect(Collectors.groupingBy(i -> i.getResult().toString(), Collectors.counting()))
-    				.entrySet()
-    				.stream()
-    				.max(Comparator.comparing(Map.Entry::getValue));
-    		if(optional.isPresent()){
-    			Map.Entry<String,Long> entry = optional.get();
-    			if(entry.getValue() > tasks.length/2){
-    				return new DeterResult(entry.getKey(),DeterType.MAJORITY);
-    			}
-    		}
-    	}
+    /**
+     * 计算定档值(规则:1.不是过半定档,取权重,2.是过半定档,没有取优,取过半定档,3.是过半定档,是取优,取过半定档和权重最优值)
+     *
+     * @param majority 是否过半定档
+     * @param taskBest 是否取优
+     * @param tasks    任务集合
+     */
+    public DeterResult determine(boolean majority, boolean taskBest, List<Level> levels, MarkTask... tasks) {
+        DeterResult majorityResult = null;
+        DeterResult weightResult = null;
+        if (majority) {
+            majorityResult = calcMajority(tasks);
+        }
+        weightResult = calcWeight(levels, tasks);
+
+        if (majorityResult != null) {
+            if (taskBest) {
+                Map<String, Integer> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getLevelValue));
+                // 取优
+                int majorityLevelValue = levelMap.get(majorityResult.getResult());
+                int weightLevelValue = levelMap.get(weightResult.getResult());
+                // 值越小,档位越大
+                if (majorityLevelValue > weightLevelValue) {
+                    return weightResult;
+                } else {
+                    return majorityResult;
+                }
+            } else {
+                return majorityResult;
+            }
+        } else {
+            return weightResult;
+        }
+    }
+
+    /**
+     * 计算过半定档值
+     *
+     * @param tasks 任务集合
+     */
+    private DeterResult calcMajority(MarkTask[] tasks) {
+        //如果相同的数量大于半数,直接定档
+        Stream<MarkTask> taskStream = Stream.of(tasks);
+        Optional<Map.Entry<String, Long>> optional = taskStream
+                .collect(Collectors.groupingBy(i -> i.getResult().toString(), Collectors.counting()))
+                .entrySet()
+                .stream()
+                .max(Comparator.comparing(Map.Entry::getValue));
+        if (optional.isPresent()) {
+            Map.Entry<String, Long> entry = optional.get();
+            if (entry.getValue() > tasks.length / 2) {
+                return new DeterResult(entry.getKey(), DeterType.MAJORITY);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 计算权重值
+     *
+     * @param tasks 任务集合
+     */
+    private DeterResult calcWeight(List<Level> levels, MarkTask[] tasks) {
         //通过权重计算,平均值四舍五入
         double[] values = new double[tasks.length];
         double[] weights = new double[tasks.length];
-        Long workId = null;
         for (int i = 0; i < tasks.length; i++) {
-            workId = tasks[i].getWorkId();
-            Level level = levelRepo.findByWorkIdAndCode(workId,String.valueOf(tasks[i].getResult()));
-            if(level == null){
+            String levelResult = tasks[i].getResult();
+            Level level = levels.stream().filter(m->m.getCode().equals(levelResult)).findFirst().orElse(null);
+            if (level == null) {
                 throw new RuntimeException("无此档位");
             }
             MarkUser marker = markUserRepo.findOne(tasks[i].getMarkerId());
             double markerWeight = marker.getWeight();
-            values[i] = level.getWeight()*markerWeight;
+            values[i] = level.getWeight() * markerWeight;
             weights[i] = markerWeight;
         }
-        int avg = (int)Math.round(DoubleStream.of(values).sum()/DoubleStream.of(weights).sum());
-        List<Level> levels = levelRepo.findByWorkId(workId);
+        int avg = (int) Math.round(DoubleStream.of(values).sum() / DoubleStream.of(weights).sum());
         Optional<Level> levelOptional = levels.stream().filter(o -> o.getMaxScore() >= avg && o.getMinScore() <= avg).findFirst();
         Level level = levelOptional.orElse(null);
-        if(level == null){
-        	levels = levels.stream().sorted(Comparator.comparing(Level::getMaxScore).reversed()).collect(Collectors.toList());
-        	if(avg>levels.get(0).getMaxScore()){
-        		level = levels.get(0);
-        	}
-        	levels = levels.stream().sorted(Comparator.comparing(Level::getMinScore)).collect(Collectors.toList());
-        	if(avg<levels.get(0).getMinScore()){
-        		level = levels.get(0);
-        	}
+        if (level == null) {
+            levels = levels.stream().sorted(Comparator.comparing(Level::getMaxScore).reversed()).collect(Collectors.toList());
+            if (avg > levels.get(0).getMaxScore()) {
+                level = levels.get(0);
+            }
+            levels = levels.stream().sorted(Comparator.comparing(Level::getMinScore)).collect(Collectors.toList());
+            if (avg < levels.get(0).getMinScore()) {
+                level = levels.get(0);
+            }
         }
-        return new DeterResult(level.getCode(),DeterType.WEIGHT);
+        return new DeterResult(level.getCode(), DeterType.WEIGHT);
     }
 }
 
-class DeterResult{
+class DeterResult {
     private String result;
     private DetermineLevelService.DeterType deterType;
 

+ 5 - 7
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -153,7 +153,9 @@ public class MarkingService {
             MarkTask[] sources = new MarkTask[markTasks.size()];
             //定档
             Integer majority = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getMajority()).orElse(1);
-            DeterResult determine = determineLevelService.determine(majority.intValue() == 1 ? true : false, markTasks.toArray(sources));
+            // 是否取优(过半定档和权重,取最优值)
+            Integer takeBest = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getTakeBest()).orElse(1);
+            DeterResult determine = determineLevelService.determine(majority == 1,takeBest == 1, levels, markTasks.toArray(sources));
             if(Objects.nonNull(determine) && Objects.nonNull(determine.getResult())){
                 markTask.setDateMineResult(determine.getResult());
             }
@@ -340,18 +342,14 @@ public class MarkingService {
 
         List<MarkLog> markLogList = new ArrayList<>();
         for (MarkTask markTask : markTasks) {
-            /*if (markTask.getResult() != null && !markTask.getResult().toString().equals(redoLevel)) {
-                markTask.setRejected(true);
-                markTask.setOriginLevel(markTask.getResult());
-                markTask.setResult(null);
-            }*/
             String[] range = ranges.split(",");
             if (range.length > 0) {
                 //加入手动打回日志
                 String operResult = "-";
                 Date date = new Date();
                 for (String r : range) {
-                    if (Objects.equals(String.valueOf(markTask.getMarkerId()), r)) {
+                    // 建议的档位与其中评委所评档位相同时就不打回给此评委
+                    if (Objects.equals(String.valueOf(markTask.getMarkerId()), r) && !redoLevel.equals(markTask.getResult())) {
                         markTask.setRejected(true);
                         markTask.setOriginLevel(markTask.getResult());
                         markTask.setResult(null);