xiaof 3 лет назад
Родитель
Сommit
3c6be0d9b3
35 измененных файлов с 820 добавлено и 465 удалено
  1. 88 48
      sql/msyj-local-v3.0.0-last.sql
  2. 2 3
      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. 10 22
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/TrialController.java
  5. 17 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java
  6. 3 3
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java
  7. 15 4
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/MarkExpDTO.java
  8. 98 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/SysAdjustLevelDTO.java
  9. 2 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java
  10. 9 9
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java
  11. 91 113
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  12. 167 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/ToolService.java
  13. 35 54
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java
  14. 0 12
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ExamQuestion.java
  15. 14 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLogOperType.java
  16. 1 14
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java
  17. 10 16
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/TrialEnum.java
  18. 4 12
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ExamQuestionRepo.java
  19. 1 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkSubjectRepo.java
  20. 3 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  21. 16 9
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  22. 10 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/StudentRepo.java
  23. 1 1
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java
  24. 1 1
      stmms-ms-main/src/main/resources/application-dev.properties
  25. 5 5
      stmms-ms-main/src/test/java/BatchCreateDataTest.java
  26. 3 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ExamQuestionApi.java
  27. 2 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  28. 29 18
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  29. 55 54
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  30. 20 28
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java
  31. 4 6
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java
  32. 3 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/GroupingService.java
  33. 43 14
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkerGroupLeaderService.java
  34. 0 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java
  35. 1 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 88 - 48
sql/msyj-local-last.sql → sql/msyj-local-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-2.0.0
+ Source Schema         : msyj-local-v3.0.0-trial
 
  Target Server Type    : MySQL
  Target Server Version : 50717
  File Encoding         : 65001
 
- Date: 28/06/2021 16:05:52
+ Date: 12/05/2022 10:04:34
 */
 
 SET NAMES utf8mb4;
@@ -60,6 +60,24 @@ CREATE TABLE `change_level`  (
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '改档记录表' ROW_FORMAT = Dynamic;
 
+-- ----------------------------
+-- Table structure for check_data
+-- ----------------------------
+DROP TABLE IF EXISTS `check_data`;
+CREATE TABLE `check_data`  (
+  `id` bigint(20) NOT NULL,
+  `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作ID',
+  `check_item` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据校验类型',
+  `param_value` int(3) NULL DEFAULT NULL COMMENT '变量值',
+  `status` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+  `result` tinyint(1) NULL DEFAULT NULL COMMENT '是否校验通过(1:是,0:否)',
+  `error_count` int(7) NULL DEFAULT 0 COMMENT '未通过数量(result=0时,数量大于0)',
+  `content` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '校验不通过考生列表',
+  `start_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间',
+  `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据校验日志' ROW_FORMAT = Dynamic;
+
 -- ----------------------------
 -- Table structure for exam_question
 -- ----------------------------
@@ -73,7 +91,7 @@ CREATE TABLE `exam_question`  (
   `work_id` bigint(20) NOT NULL,
   `is_test` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for exam_score_prop
@@ -140,6 +158,9 @@ CREATE TABLE `inspect_task`  (
   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_15` 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,
@@ -174,6 +195,9 @@ CREATE TABLE `level`  (
   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_15` 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 +206,7 @@ CREATE TABLE `level`  (
   CONSTRAINT `level_ibfk_7` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_8` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `level_ibfk_9` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_log
@@ -210,7 +234,7 @@ CREATE TABLE `mark_log`  (
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `union_001_index`(`create_user_id`, `oper_type`, `subject`, `exam_number`) USING BTREE,
   INDEX `idx_union_2`(`work_id`, `paper_id`, `oper_type`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 131 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_subject
@@ -218,14 +242,13 @@ CREATE TABLE `mark_log`  (
 DROP TABLE IF EXISTS `mark_subject`;
 CREATE TABLE `mark_subject`  (
   `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `work_id` bigint(20) NULL DEFAULT NULL,
   `collect_config` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `stage` int(11) NULL DEFAULT NULL,
   `total_score` int(11) NOT NULL,
-  `work_id` bigint(20) NULL DEFAULT NULL,
   `sample_count` int(11) NOT NULL DEFAULT 100,
   `is_test` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
-  `is_formal` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否正评,0:不是,1:是',
   `all_level` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否全部根据档位分配完,0:不是,1:是',
   `enable` tinyint(1) NULL DEFAULT 1 COMMENT '是否启用 0:禁用 1:启用',
   PRIMARY KEY (`id`) USING BTREE,
@@ -235,6 +258,9 @@ CREATE TABLE `mark_subject`  (
   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_15` 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,
@@ -251,7 +277,8 @@ CREATE TABLE `mark_subject`  (
 DROP TABLE IF EXISTS `mark_task`;
 CREATE TABLE `mark_task`  (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `created_on` datetime(0) NULL DEFAULT NULL,
+  `work_id` bigint(20) NOT NULL,
+  `paper_id` bigint(20) NOT NULL,
   `is_rejected` bit(1) NOT NULL,
   `level_value` int(11) NULL DEFAULT NULL,
   `marker_id` bigint(20) NOT NULL,
@@ -262,9 +289,8 @@ CREATE TABLE `mark_task`  (
   `level` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
   `stage` int(11) NOT NULL,
   `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `created_on` datetime(0) NULL DEFAULT NULL,
   `updated_on` datetime(0) NULL DEFAULT NULL,
-  `work_id` bigint(20) NOT NULL,
-  `paper_id` bigint(20) NOT NULL,
   `random_seq` int(11) NULL DEFAULT NULL,
   `secret_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
   `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
@@ -276,6 +302,7 @@ CREATE TABLE `mark_task`  (
   `display_number` int(11) NULL DEFAULT NULL,
   `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
   `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,
@@ -285,6 +312,9 @@ CREATE TABLE `mark_task`  (
   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_15` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_2` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_3` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_4` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
@@ -293,7 +323,7 @@ CREATE TABLE `mark_task`  (
   CONSTRAINT `mark_task_ibfk_7` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_8` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_task_ibfk_9` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 50 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_task_job
@@ -307,7 +337,7 @@ CREATE TABLE `mark_task_job`  (
   `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作区id',
   `version` int(11) NULL DEFAULT 0 COMMENT '版本号',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for mark_user
@@ -315,18 +345,17 @@ CREATE TABLE `mark_task_job`  (
 DROP TABLE IF EXISTS `mark_user`;
 CREATE TABLE `mark_user`  (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `enabled` bit(1) NOT NULL,
-  `last_login_time` datetime(0) NULL DEFAULT NULL,
-  `login_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `work_id` bigint(20) NOT NULL,
+  `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `enabled` bit(1) NOT NULL,
+  `login_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
   `pw_changed_count` int(11) NOT NULL,
   `session_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `group_id` bigint(20) NULL DEFAULT NULL,
   `mark_right` int(11) NULL DEFAULT NULL,
-  `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
-  `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
-  `work_id` bigint(20) NOT NULL,
   `inspect_sc` bit(1) NULL DEFAULT NULL,
   `inspect_sm` bit(1) NULL DEFAULT NULL,
   `inspect_sx` bit(1) NULL DEFAULT NULL,
@@ -337,6 +366,7 @@ CREATE TABLE `mark_user`  (
   `leader_confirm` bit(1) NULL DEFAULT NULL COMMENT '科组长打回、定档是否要确认',
   `display_count` int(1) NULL DEFAULT NULL COMMENT '显示数量:4-4张显示,6-6张显示,8-8张显示',
   `default_account` tinyint(1) NULL DEFAULT NULL COMMENT '是否默认账号(采集账号)',
+  `last_login_time` datetime(0) NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE INDEX `UK_cyf7k1neuij8lma85x19omo07`(`login_name`) USING BTREE,
   INDEX `FKinr4i9gbxj9njwo82s7cc89q5`(`group_id`) USING BTREE,
@@ -346,6 +376,9 @@ CREATE TABLE `mark_user`  (
   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_15` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_user_ibfk_16` 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,
@@ -354,7 +387,7 @@ CREATE TABLE `mark_user`  (
   CONSTRAINT `mark_user_ibfk_7` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_8` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
   CONSTRAINT `mark_user_ibfk_9` FOREIGN KEY (`group_id`) REFERENCES `marker_group` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 71 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for marker_group
@@ -366,7 +399,23 @@ 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 = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for marker_group_leader
+-- ----------------------------
+DROP TABLE IF EXISTS `marker_group_leader`;
+CREATE TABLE `marker_group_leader`  (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `work_id` bigint(20) NOT NULL COMMENT '工作ID',
+  `subject` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '科目',
+  `stage` int(11) NOT NULL COMMENT '阶段',
+  `mark_leader_id` bigint(20) NULL DEFAULT NULL COMMENT '科组长ID',
+  `marker_id` bigint(20) NULL DEFAULT NULL COMMENT '评卷员ID',
+  `group_id` bigint(20) NOT NULL,
+  `group_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for paper
@@ -374,8 +423,11 @@ CREATE TABLE `marker_group`  (
 DROP TABLE IF EXISTS `paper`;
 CREATE TABLE `paper`  (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `area_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `work_id` bigint(20) NOT NULL,
+  `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
   `exam_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `student_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `area_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
   `idx` bigint(20) NULL DEFAULT NULL,
   `is_arbitrated` bit(1) NOT NULL,
   `is_manual` bit(1) NOT NULL,
@@ -389,12 +441,9 @@ CREATE TABLE `paper`  (
   `redo_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `score` double NULL DEFAULT NULL,
   `secret_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
-  `student_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
-  `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
   `updated_on` datetime(0) NULL DEFAULT NULL,
   `uploaded_count` int(11) NOT NULL,
   `uploaded_on` datetime(0) NULL DEFAULT NULL,
-  `work_id` bigint(20) NOT NULL,
   `inspect_range` bigint(20) NULL DEFAULT NULL,
   `inspect_score` double NULL DEFAULT NULL,
   `source_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
@@ -415,14 +464,16 @@ 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 NULL COMMENT '排序值',
+  `sort_num` int(11) NULL DEFAULT NULL COMMENT '排序值',
+  `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,
   INDEX `idx_union_4`(`is_shift`, `is_shift_score`) USING BTREE,
   INDEX `idx_union_3`(`work_id`, `subject`, `batch_no`) USING BTREE,
   INDEX `idx_union_5`(`work_id`, `subject`, `score_batch_no`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for param_setting
@@ -445,22 +496,11 @@ CREATE TABLE `param_setting`  (
   `score_show_all_paper` tinyint(1) NULL DEFAULT NULL COMMENT '打分阶段阅卷员是否显示所有试卷(1:是、0:否)',
   `prop_denominator` int(2) NULL DEFAULT NULL COMMENT '档位百分比分母(1: \"全部考生数\", 2: \"去掉缺考考生数\")',
   `auto_callback_show_deviation` tinyint(1) NULL DEFAULT NULL COMMENT '自动打回时显示偏差',
+  `show_standard_paper_manage` int(11) NULL DEFAULT NULL,
+  `clear_data` int(11) NULL DEFAULT NULL,
+  `take_best` tinyint(1) NULL DEFAULT NULL COMMENT '取优原则(1:是、0:否)',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 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 = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for student
@@ -468,22 +508,22 @@ CREATE TABLE `shiwai`  (
 DROP TABLE IF EXISTS `student`;
 CREATE TABLE `student`  (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `work_id` bigint(20) NULL DEFAULT NULL,
+  `exam_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `area_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `area_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
-  `exam_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `exam_room` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `school` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '学校',
   `is_absent` bit(1) NOT NULL,
-  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `upload_status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
-  `work_id` bigint(20) NULL DEFAULT NULL,
   `source_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
   `is_test` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
   `relate_exam_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '关联考号',
   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 = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Table structure for task_publish_setting
@@ -512,10 +552,10 @@ CREATE TABLE `task_publish_setting`  (
 DROP TABLE IF EXISTS `work`;
 CREATE TABLE `work`  (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   `active` bit(1) NOT NULL,
   `created_on` date NULL DEFAULT NULL,
-  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 2 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java

@@ -14,7 +14,6 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -124,7 +123,7 @@ public class ParamApi {
                                            @RequestParam Integer autoCallbackShowDeviation,
                                            @RequestParam Integer showStandardPaperManage,
                                            @RequestParam Integer takeBest) {
-        List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
+        List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNot(workId, TrialEnum.DEFAULT.ordinal());
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         boolean flag = false;
         if ((markSubjects == null || markSubjects.size() == 0) && countMarkTasks > 0) {
@@ -169,7 +168,7 @@ public class ParamApi {
         Integer roundUp = (Integer) map.get("roundUp");
         Integer changeStage = (Integer) map.get("changeStage");
         Integer scoreShowAllPaper = (Integer) map.get("scoreShowAllPaper");
-        List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
+        List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNot(workId, TrialEnum.DEFAULT.ordinal());
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         boolean flag = false;
         if ((markSubjects == null || markSubjects.size() == 0) && countMarkTasks > 0) {

+ 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;
+    }
+}

+ 10 - 22
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/TrialController.java

@@ -2,12 +2,13 @@ package cn.com.qmth.stmms.ms.admin.api;
 
 import cn.com.qmth.stmms.ms.admin.service.TrialService;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+
 /**
  * @Description: 试评任务controller
  * @Param:
@@ -15,44 +16,35 @@ import org.springframework.web.bind.annotation.RestController;
  * @Author: wangliang
  * @Date: 2019/11/4
  */
-//@Api(tags = "试评任务接口controller")
 @RestController
 @RequestMapping("api/trial")
 public class TrialController {
 
-    @Autowired
+    @Resource
     TrialService trialService;
 
     /**
      * 开始试评任务
      *
-     * @param workId
-     * @param subject
-     * @throws Exception
+     * @param workId  工作ID
+     * @param subject 科目
      */
-//    @ApiOperation(value = "开始试评任务接口")
     @RequestMapping(value = "startTrial", method = RequestMethod.GET)
     public void startTrial(
-//            @ApiParam(value = "workId", required = true)
             @RequestParam Long workId,
-//            @ApiParam(value = "科目", required = true)
             @RequestParam Subject subject) throws Exception {
         trialService.startTrial(workId, subject);
     }
 
     /**
-     * 删除试评任务,保留标准卷
+     * 结束试评任务,保留标准卷
      *
-     * @param workId
-     * @param subject
-     * @throws Exception
+     * @param workId  工作ID
+     * @param subject 科目
      */
-//    @ApiOperation(value = "结束试评任务接口")
     @RequestMapping(value = "finishTrial", method = RequestMethod.GET)
     public boolean finishTrial(
-//            @ApiParam(value = "workId", required = true)
             @RequestParam Long workId,
-//            @ApiParam(value = "科目", required = true)
             @RequestParam Subject subject) throws Exception {
         trialService.finishTrial(workId, subject);
         return true;
@@ -61,16 +53,12 @@ public class TrialController {
     /**
      * 检查任务状态
      *
-     * @param workId
-     * @param subject
-     * @throws Exception
+     * @param workId  工作ID
+     * @param subject 科目
      */
-//    @ApiOperation(value = "检查试评任务接口")
     @RequestMapping(value = "checkMissionStatus", method = RequestMethod.GET)
     public void checkMissionStatus(
-//            @ApiParam(value = "workId", required = true)
             @RequestParam Long workId,
-//            @ApiParam(value = "科目", required = true)
             @RequestParam Subject subject) throws Exception {
         trialService.checkMissionStatus(workId, subject);
     }

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

@@ -148,7 +148,7 @@ public class UserApi {
     /**
      * 采集员列表查询(不分页)
      */
-    @RequestMapping(value = "/collect/all", method = RequestMethod.GET)
+    @RequestMapping(value = "/list_by_role", method = RequestMethod.GET)
     public Object listCollectAll(@RequestParam() Long workId,
                                  @RequestParam(required = false, defaultValue = "COLLECTOR") Role role) {
         return markUserRepo.findByWorkIdAndRole(workId, role);
@@ -273,4 +273,20 @@ public class UserApi {
         return markerGroupLeaderService.listGroupByWorkIdAndSubjectAndStage(workId, subject, stage);
     }
 
+    /**
+     * 查询科组长下所有用户
+     *
+     * @param workId   工作ID
+     * @param subject  科目
+     * @param stage    阶段
+     * @param markerId 科组长ID
+     */
+    @RequestMapping(value = "/list_group_users", method = RequestMethod.GET)
+    public List<MarkUser> listGroupUsers(@RequestParam Long workId,
+                                         @RequestParam Subject subject,
+                                         @RequestParam MarkStage stage,
+                                         @RequestParam Long markerId) {
+        return markerGroupLeaderService.listGroupUsersByWorkIdAndSubjectAndStageAndMarkerId(workId, subject, stage, markerId);
+    }
+
 }

+ 3 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java

@@ -41,11 +41,11 @@ public class WorkOverviewAssembler {
         if (work != null) {
             workOverview = new WorkOverview();
             workOverview.setWorkName(work.getName());
-            workOverview.setPaperCount(paperRepo.countByWorkIdAndTest(work.getId(), TrialEnum.DEFAULT.getId()));
+            workOverview.setPaperCount(paperRepo.countByWorkId(work.getId()));
             workOverview.setMarkerCount(markUserRepo.countByWorkIdAndRole(work.getId(), Role.MARKER));
-            workOverview.setQuestionCount(examQuestionRepo.countByWorkIdAndTest(work.getId(), TrialEnum.DEFAULT.getId()));
+            workOverview.setQuestionCount(examQuestionRepo.countByWorkId(work.getId()));
 
-            List<Student> students = studentRepo.findByWorkIdAndTest(work.getId(), String.valueOf(TrialEnum.DEFAULT.getId()));
+            List<Student> students = studentRepo.findByWorkId(work.getId());
             workOverview.setStuTotalCount(students.stream().count());
             workOverview.setStuAbsentCount(students.stream().filter(s -> s.isAbsent()).count());
             workOverview.setStuUploadedCount(workOverview.getStuTotalCount() - workOverview.getStuAbsentCount());

+ 15 - 4
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/MarkExpDTO.java

@@ -4,18 +4,29 @@ import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelProperty;
 
 public class MarkExpDTO {
 
-    @ExcelProperty(name = "科目", index = 0, type = 1)
+    @ExcelProperty(name = "工作ID", index = 0, type = 1)
+    private Long workId;
+
+    @ExcelProperty(name = "科目", index = 1, type = 1)
     private String subject;
 
-    @ExcelProperty(name = "科目名称", index = 1, type = 1)
+    @ExcelProperty(name = "科目名称", index = 2, type = 1)
     private String subjectName;
 
-    @ExcelProperty(name = "考号", index = 2, type = 1)
+    @ExcelProperty(name = "考号", index = 3, type = 1)
     private String examNumber;
 
-    @ExcelProperty(name = "姓名", index = 3, type = 1)
+    @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;
     }

+ 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;
+    }
+}

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

@@ -169,9 +169,10 @@ public class PaperExporter {
     @GetMapping("{workId}/mark")
     public void exportMark(@PathVariable Long workId, HttpServletResponse response) {
         List<MarkExpDTO> markExpDTOS = new ArrayList<>();
-        List<Paper> papers = paperRepo.findByWorkIdAndIsMarkTure(workId);
+        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();

+ 9 - 9
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java

@@ -25,6 +25,12 @@ public class StudentImporter {
     @Autowired
     private DataUploadService dataUploadService;
 
+    /**
+     * 考生导入
+     * @param workId 工作Id
+     * @param isAbsent 是否缺考
+     * @param file 考生文件
+     */
     @RequestMapping(method = RequestMethod.POST)
     public List<ExcelError> batchAll(@RequestParam Long workId,
                                      @RequestParam(required = false, defaultValue = "false") boolean isAbsent, @RequestParam MultipartFile file)
@@ -35,20 +41,14 @@ public class StudentImporter {
     /**
      * 试评考生导入
      *
-     * @param workId
-     * @param subject
-     * @param file
-     * @return
-     * @throws Exception
+     * @param workId 工作ID
+     * @param subject 科目
+     * @param file 试评文件
      */
-//    @ApiOperation(value = "试评学生导入接口")
     @RequestMapping(value = "batchAllForTrial", method = RequestMethod.POST)
     public List<ExcelError> batchAllForTrial(
-//            @ApiParam(value = "workId", required = true)
             @RequestParam Long workId,
-//            @ApiParam(value = "科目", required = true)
             @RequestParam Subject subject,
-//            @ApiParam(value = "excel文件", required = true)
             @RequestParam MultipartFile file)
             throws Exception {
         return dataUploadService.uploadStudentsForTrial(workId, subject, file.getInputStream());

+ 91 - 113
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -16,24 +16,27 @@ import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 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.enums.TrialEnum;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
+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 com.alibaba.fastjson.JSONObject;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.lang.reflect.Field;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -61,6 +64,15 @@ public class DataUploadService {
     @Autowired
     private MarkTaskRepo markTaskRepo;
 
+    @Resource
+    private LevelRepo levelRepo;
+
+    @Resource
+    private MarkUserRepo markUserRepo;
+
+    @Resource
+    private MarkerGroupRepo markerGroupRepo;
+
     @Autowired
     ImageConfig imageConfig;
 
@@ -199,8 +211,7 @@ public class DataUploadService {
                 exist.setSliceMD5(sliceMD5);
                 paperRepo.save(exist);
             } else {
-                ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(student.getWorkId(), subject,
-                        student.getAreaCode(), TrialEnum.DEFAULT.getId());
+                ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(student.getWorkId(), subject, student.getAreaCode());
                 Long random = getRandom(student.getWorkId(), student.getExamNumber());
                 Paper paper = new Paper(student.getWorkId(), null, subject, examQuestion, student, false, random);
                 paper.setSheetMD5(sheetMD5);
@@ -353,141 +364,108 @@ public class DataUploadService {
     /**
      * 试评考生导入
      *
-     * @param workId
-     * @param subject
-     * @param inputStream
-     * @return
-     * @throws Exception
+     * @param workId      工作ID
+     * @param subject     科目
+     * @param inputStream 文件输入流
      */
     @Transactional
     public List<ExcelError> uploadStudentsForTrial(Long workId, Subject subject, InputStream inputStream) throws Exception {
         Work work = workRepo.findOne(workId);
         if (Objects.isNull(work)) {
-            throw new Exception("没有此工作区,请检查workId是否正确");
+            throw new Exception("没有此工作区");
         }
-        List<Paper> papers = paperRepo.findByWorkIdAndSubject(workId, subject);
-        if (papers.isEmpty()) {
+        long count = paperRepo.countByWorkIdAndSubject(workId, subject);
+        if (count == 0) {
             throw new Exception("没有采集数据,不能导入试评数据");
         }
         List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase())).collect(Collectors.toList());
         MarkSubject markSubject = markSubjectList.get(0);
         if (markSubject.getTest() == TrialEnum.START_TRIAL.getId()) {
-            throw new Exception("已经开始试评,请先停止试评再重新导入数据");
+            throw new Exception("已经开始试评,请先结束试评再重新导入数据");
+        }
+
+        List<Level> levels = levelRepo.findByWorkId(workId);
+        if (levels.size() == 0) {
+            throw new RuntimeException("没有设定档位");
         }
+
+        List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
+        List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_LEVELING).collect(Collectors.toList());
+        if (levelMarkers.size() == 0) {
+            throw new RuntimeException("没有设定评卷员");
+        }
+
+        List<MarkUser> markerLeader = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARK_LEADER);
+        if (markerLeader.size() == 0) {
+            throw new RuntimeException("没有设定科组长");
+        }
+
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+        if (markerGroups.size() == 0) {
+            throw new RuntimeException("评卷员没有进行分组");
+        }
+
         //更新科目
         markSubject.setTest(TrialEnum.INIT.getId());
         markSubjectRepo.save(markSubject);
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put(String.valueOf(TrialEnum.INIT.getId()), subject);
-        //全量删除全量增加
-        //1.试卷
-        examQuestionRepo.deleteByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId());
-        //2.学生
-        studentRepo.deleteByWorkIdAndTest(workId, jsonObject.toJSONString());
-        //3.paper
-        paperRepo.deleteByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId());
-        long startTime = System.currentTimeMillis();
+        // 更新学生试评状态
+        studentRepo.updateTestByWorkId(workId, String.valueOf(TrialEnum.INIT.getId()), String.valueOf(TrialEnum.DEFAULT.getId()));
+        // 更新试卷试评状态
+        paperRepo.updateTestByWorkId(workId, TrialEnum.INIT.getId(), TrialEnum.DEFAULT.getId());
+
+        List<Student> students = studentRepo.findByWorkId(workId);
+        Map<String, Student> studentMap = students.stream().collect(Collectors.toMap(Student::getExamNumber, Function.identity()));
+
+        List<Paper> papers = paperRepo.findByWorkId(workId);
+        Map<String, Paper> paperMap = papers.stream().collect(Collectors.toMap(m -> m.getExamNumber() + "#" + m.getSubject() + "#" + m.getAreaCode(), Function.identity()));
+
         ExcelReader excelReader = new ExcelReader(StudentDTO.class);
 
         List<Student> studentList = new ArrayList<>();
         List<Paper> paperList = new ArrayList<>();
 
-        List<ExcelError> excelErrors = excelReader.reader(inputStream, new ExcelReaderHandle() {
-
-            @Override
-            public ExcelError handle(Object obj) throws Exception {
-                try {
-                    StudentDTO dto = (StudentDTO) obj;
-                    //校验excel文件中数据是否完整
-                    if (!checkObjFieldIsNotNull(dto)) {
-                        throw new RuntimeException("考生信息缺失");
-                    }
-                    //复制学生给试评用
-                    Student studentNew = null;
-                    Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
-                    if (student == null) {
-                        return null;
+        List<ExcelError> excelErrors = excelReader.reader(inputStream, obj -> {
+            try {
+                StudentDTO dto = (StudentDTO) obj;
+                //校验excel文件中数据是否完整
+                if (!checkObjFieldIsNotNull(dto)) {
+                    throw new RuntimeException("考生信息缺失");
+                }
+                //复制学生给试评用
+//                Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+                Student student = studentMap.get(dto.getExamNumber());
+                if (student == null) {
+                    return null;
 //                        throw new Exception("没有学生" + dto.getName() + "信息");
-                    }
-                    if (!student.getUploadStatus().contains(subject + ":1")) {
-//                        throw new Exception("学生" + student.getName() + "未上传完试卷");
-                        return null;
-                    }
+                }
+                if (!student.getUploadStatus().contains(subject + ":1")) {
+//                        throw new Exception("学生" + student.getName() + "未采集完试卷");
+                    return null;
+                }
 
-                    //复制paper
-                    Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndAreaCodeAndTest(workId, subject, student.getExamNumber(), dto.getAreaCode(), TrialEnum.DEFAULT.getId());
-                    if (Objects.isNull(paper)) {
-                        paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndAreaCodeAndTest(workId, subject, student.getExamNumber(), dto.getAreaCode(), TrialEnum.START_FORMAL.getId());
-                    }
-                    if (Objects.isNull(paper) || paper.getIsMissing()) {
-                        return null;
-                    }
+                //复制paper
+//                Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndAreaCodeAndTest(workId, subject, student.getExamNumber(), dto.getAreaCode(), TrialEnum.DEFAULT.getId());
+                Paper paper = paperMap.get(student.getExamNumber() + "#" + subject + "#" + dto.getAreaCode());
+                if (Objects.isNull(paper) || paper.getIsMissing()) {
+                    return null;
+                }
 
-                    String examNumber = dto.getExamNumber();
-                    //如果没有设置区域代码,用准考证前2位作为区域代码
-                    String areaCode = null;
-                    if (dto.getAreaCode() == null || dto.getAreaCode().isEmpty()) {
-                        areaCode = examNumber.substring(0, 2);
-                        dto.setAreaCode(areaCode);
-                    }
-                    //复制卷子给试评用
-                    ExamQuestion questionNew = null;
-                    ExamQuestion isExist = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(workId, subject, dto.getAreaCode(), TrialEnum.DEFAULT.getId());
-                    if (Objects.isNull(isExist)) {
-                        throw new Exception("请先上传试卷");
-                    } else {
-                        ExamQuestion questionTemp = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(workId, subject, dto.getAreaCode(), TrialEnum.INIT.getId());
-                        questionNew = new ExamQuestion();
-                        if (Objects.isNull(questionTemp)) {
-                            BeanUtils.copyProperties(isExist, questionNew);
-                            questionNew.setTest(TrialEnum.INIT.getId());
-                            questionNew.setName(new StringBuffer("试评").append(subject.getName()).append(dto.getAreaCode()).toString());
-                            questionNew.setId(null);
-                            examQuestionRepo.save(questionNew);
-                        } else {
-                            BeanUtils.copyProperties(questionTemp, questionNew);
-                        }
-                    }
+                studentList.add(student);
 
-                    studentNew = new Student();
-                    BeanUtils.copyProperties(student, studentNew);
-                    studentNew.setId(null);
-                    studentNew.setTest(jsonObject.toJSONString());
-//                    studentRepo.save(studentNew);
-                    studentList.add(studentNew);
-
-                    Paper paperNew = new Paper();
-                    BeanUtils.copyProperties(paper, paperNew);
-                    paperNew.setId(null);
-                    paperNew.setTest(TrialEnum.INIT.getId());
-                    Long random = getRandom(studentNew.getWorkId(), studentNew.getExamNumber());
-                    paperNew.setRandomSeq(random);
-                    paperNew.setQuestionName(questionNew.getName());
-                    paperNew.setQuestionId(questionNew.getId());
-                    paperNew.setLevel(null);
-                    paperNew.setMarkByLeader(false);
-                    paperNew.setSample(false);
-                    paperNew.setRejected(false);
-                    paperNew.setTagged(false);
-                    paperNew.setSecretNumber(new StringBuffer(String.valueOf(subject.ordinal())).append(questionNew.getAreaCode()).append(random).toString());
-                    paperNew.setActive(true);
-                    paperNew.setBatchNo(startTime);
-//                    paperRepo.save(paperNew);
-                    paperList.add(paperNew);
-                } catch (Exception e) {
-                    ExcelError excelError = new ExcelError();
-                    excelError.setExcelErrorType(e.getMessage());
-                    return excelError;
-                }
-                return null;
+                paperList.add(paper);
+            } catch (Exception e) {
+                ExcelError excelError = new ExcelError();
+                excelError.setExcelErrorType(e.getMessage());
+                return excelError;
             }
+            return null;
         });
         if (!CollectionUtils.isEmpty(studentList)) {
-//            studentRepo.save(studentList);
             List<Student> data = new ArrayList<>();
             //500条提交一次
             for (Student student : studentList) {
-                if (data.size() == 500) {
+                student.setTest(String.valueOf(TrialEnum.INIT.getId()));
+                if (data.size() == 1000) {
                     studentRepo.save(data);
                     data.clear();
                 }
@@ -499,11 +477,11 @@ public class DataUploadService {
             }
         }
         if (!CollectionUtils.isEmpty(paperList)) {
-//            paperRepo.save(paperList);
             List<Paper> data = new ArrayList<>();
             //500条提交一次
             for (Paper paper : paperList) {
-                if (data.size() == 500) {
+                paper.setTest(TrialEnum.INIT.getId());
+                if (data.size() == 1000) {
                     paperRepo.save(data);
                     data.clear();
                 }
@@ -541,7 +519,7 @@ public class DataUploadService {
 
     @Transactional
     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());
+        ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(student.getWorkId(), subject, student.getAreaCode());
         Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject, student.getExamNumber(), TrialEnum.DEFAULT.getId());
         if (paper == null) {
             Long random = getRandom(student.getWorkId(), student.getExamNumber());

+ 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);
+            }
+        }
+    }
+}

+ 35 - 54
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java

@@ -13,14 +13,12 @@ import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
 import cn.com.qmth.stmms.ms.marking.service.StageControlService;
-import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -95,8 +93,7 @@ public class TrialService {
             finishTrial(workId, subject);
         }
         //修改科目test
-        markSubject.setTest(TrialEnum.START_FORMAL.getId());
-//        markSubject.setFormal(true);
+        markSubject.setTest(TrialEnum.DEFAULT.getId());
         markSubjectRepo.save(markSubject);
     }
 
@@ -111,10 +108,9 @@ public class TrialService {
     public void startTrial(Long workId, Subject subject) throws Exception {
         Work work = workRepo.findOne(workId);
         if (Objects.isNull(work)) {
-            throw new Exception("没有此工作区,请检查workId是否正确");
+            throw new Exception("没有此工作区");
         }
-        List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase()))
-                .collect(Collectors.toList());
+        List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase())).collect(Collectors.toList());
         MarkSubject markSubject = markSubjectList.get(0);
         //分配任务
         Map map = new HashMap();
@@ -123,24 +119,23 @@ public class TrialService {
         //修改科目test
         markSubject.setTest(TrialEnum.START_TRIAL.getId());
         markSubjectRepo.save(markSubject);
-        //先删除上次试评试卷(取标准卷用)
-//        paperRepo.deleteByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.START_TRIAL.getId());
+
+        studentRepo.updateTestByWorkId(workId, String.valueOf(TrialEnum.INIT.getId()), String.valueOf(TrialEnum.START_TRIAL.getId()));
         //修改试卷test
         paperRepo.updateByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId(), TrialEnum.START_TRIAL.getId());
     }
 
     /**
-     * 删除试评任务,保留标准卷
+     * 结束试评任务,保留标准卷
      *
-     * @param workId
-     * @param subject
-     * @throws Exception
+     * @param workId  工作ID
+     * @param subject 科目
      */
     @Transactional
     public void finishTrial(Long workId, Subject subject) throws Exception {
         Work work = workRepo.findOne(workId);
         if (Objects.isNull(work)) {
-            throw new Exception("没有此工作区,请检查workId是否正确");
+            throw new Exception("没有此工作区");
         }
         //1.更新科目为初始状态并设置test为false
         work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase()))
@@ -149,54 +144,40 @@ public class TrialService {
                     o.setTest(TrialEnum.DEFAULT.getId());
                     o.setStage(MarkStage.INIT);
                     o.setSampleCount(0);
-                    o.setFormal(false);
                     markSubjectRepo.save(o);
                 });
         //2.删除该科目下所有任务数据
-        markTaskRepo.deleteByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.START_TRIAL.getId());
-        //3.删除学生数据
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put(String.valueOf(TrialEnum.INIT.getId()), subject);
-        studentRepo.deleteByWorkIdAndTest(workId, jsonObject.toJSONString());
-
-        //4.删除卷子信息
-        examQuestionRepo.deleteByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId());
+        markTaskRepo.deleteByWorkIdAndSubject(workId, subject);
+        //3.删除试评学生数据
+        studentRepo.updateTestByWorkId(workId, String.valueOf(TrialEnum.START_TRIAL.getId()), String.valueOf(TrialEnum.DEFAULT.getId()));
+
         //5.更新该科目下的试卷信息(正式卷子,并删除试评卷子)
         List<Paper> paperList = paperRepo.findByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.START_TRIAL.getId());
-//        List<Long> paperIds = new ArrayList<>();
-        if (Objects.nonNull(paperList) && paperList.size() > 0) {
-            List<Paper> paperAllList = paperRepo.findByWorkIdAndSubject(workId, subject);
-            Map<String, Paper> paperAllMap = paperAllList.stream().filter(o -> (o.getTest() == 0 || o.getTest() == 3))
-                    .collect(Collectors.toList())
-                    .stream()
-                    .collect(Collectors.toMap(Paper::getExamNumber, Function.identity(), (dto1, dto2) -> dto1));
-            List<Paper> finalPaperList = new ArrayList<>();
-            Map<String, String> levelMap = new HashMap<>();
-            paperList.forEach(p -> {
-                if (Objects.nonNull(paperAllMap.get(p.getExamNumber())) && p.isMarkByLeader() && p.isSample() && Objects.nonNull(p.getLevel())) {
-                    if (Objects.equals(p.getAreaCode(), paperAllMap.get(p.getExamNumber()).getAreaCode())) {
-                        finalPaperList.add(paperAllMap.get(p.getExamNumber()));
-                        levelMap.put(p.getExamNumber(), p.getLevel());
-                    }
-                }
-//                paperIds.add(p.getId());
-            });
 
-            if (finalPaperList.size() > 0) {
-                finalPaperList.forEach(o -> {
-                    markingService.levelMarkPaper(o, levelMap.get(o.getExamNumber()), true);
-                    o.setTest(TrialEnum.DEFAULT.getId());
-                    o.setActive(false);
-                });
-                paperRepo.save(finalPaperList);
+        for (Paper paper : paperList) {
+            // 标准卷不清除档位
+            paper.setActive(false);
+            paper.setBatchNo(null);
+            paper.setLevel(paper.isSample() ? paper.getLevel() : null);
+            paper.setTest(TrialEnum.DEFAULT.getId());
+        }
+
+        if (!CollectionUtils.isEmpty(paperList)) {
+            List<Paper> data = new ArrayList<>();
+            //1000条提交一次
+            for (Paper paper : paperList) {
+                if (data.size() == 1000) {
+                    paperRepo.save(data);
+                    data.clear();
+                }
+                data.add(paper);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                paperRepo.save(data);
             }
-            //6.删除log日志
-//            markLogRepo.deleteByPaperIdIn(paperIds);
-        } else {
-            paperList = paperRepo.findByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId());
         }
-        //5.删除试评卷子
-        paperRepo.delete(paperList);
+
         //7.删除分组
         markerGroupRepo.deleteBySubjectAndWorkId(subject, workId);
         // 删除分组内成员

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

@@ -34,18 +34,6 @@ public class ExamQuestion implements Serializable {
 
     private String areaName;
 
-    @Basic
-    @Column(name = "is_test")
-    private int test; //是否试评,1:数据已导入,2:试评中
-
-    public int getTest() {
-        return test;
-    }
-
-    public void setTest(int test) {
-        this.test = test;
-    }
-
     public ExamQuestion(String areaCode, Subject subject, Long workId, String areaName) {
         this.areaCode = areaCode;
         this.name = subject.getName() + this.areaCode;

+ 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());

+ 1 - 14
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java

@@ -1,6 +1,5 @@
 package cn.com.qmth.stmms.ms.core.domain;
 
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 
 import javax.persistence.*;
@@ -41,10 +40,6 @@ public class MarkSubject implements Serializable {
     @Column(name = "is_test")
     private int test; //是否试评,1:数据已导入,2:试评中,3:正式任务
 
-    @Basic
-    @Column(name = "is_formal")
-    private boolean formal;//是否正评,0:不是,1:是
-
     @Basic
     @Column(name = "all_level")
     private boolean allLevel;//是否全部根据档位分配完,0:不是,1:是
@@ -60,20 +55,12 @@ public class MarkSubject implements Serializable {
         this.allLevel = allLevel;
     }
 
-    public boolean isFormal() {
-        return formal;
-    }
-
-    public void setFormal(boolean formal) {
-        this.formal = formal;
-    }
-
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
 
     public int getTest() {
-        return test == TrialEnum.START_FORMAL.getId() ? TrialEnum.DEFAULT.getId() : test;
+        return test;
     }
 
     public void setTest(int test) {

+ 10 - 16
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/TrialEnum.java

@@ -1,7 +1,5 @@
 package cn.com.qmth.stmms.ms.core.domain.enums;
 
-import java.util.Objects;
-
 /**
  * @Description: 试评 enum
  * @Param:
@@ -22,11 +20,7 @@ public enum TrialEnum {
     /**
      * 开始试评
      */
-    START_TRIAL(2, "开始试评"),
-    /**
-     * 正式任务
-     */
-    START_FORMAL(3, "正式任务");
+    START_TRIAL(2, "开始试评");
 
     private int id;
 
@@ -59,17 +53,17 @@ public enum TrialEnum {
      * @param value
      * @return
      */
-    public static int convertToId(String value) {
+    /*public static int convertToId(String value) {
         if (Objects.equals(value.trim(), DEFAULT.name)) {
             return DEFAULT.getId();
         } else if (Objects.equals(value.trim(), INIT.name)) {
             return INIT.getId();
-        } else if (Objects.equals(value.trim(), START_FORMAL.name)) {
-            return START_FORMAL.getId();
-        } else {
+        } else if (Objects.equals(value.trim(), START_TRIAL.name)) {
             return START_TRIAL.getId();
+        } else {
+            return 0;
         }
-    }
+    }*/
 
     /**
      * 状态转换 toName
@@ -77,15 +71,15 @@ public enum TrialEnum {
      * @param id
      * @return
      */
-    public static String convertToName(int id) {
+    /*public static String convertToName(int id) {
         if (id == DEFAULT.getId()) {
             return DEFAULT.name;
         } else if (id == INIT.getId()) {
             return INIT.name;
-        } else if (id == START_FORMAL.getId()) {
-            return START_FORMAL.name;
+        } else if (id == START_TRIAL.getId()) {
+            return START_TRIAL.name;
         } else {
             return START_TRIAL.name;
         }
-    }
+    }*/
 }

+ 4 - 12
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ExamQuestionRepo.java

@@ -14,32 +14,24 @@ public interface ExamQuestionRepo extends JpaRepository<ExamQuestion, Long> {
 
     List<ExamQuestion> findByWorkIdAndSubject(Long workId, Subject subject);
 
-    @Query("select count(distinct s.areaCode) from ExamQuestion s where s.workId = ?1 and s.test = ?2")
-    long countByWorkIdAndTest(Long workId, int test);
+    @Query("select count(distinct s.areaCode) from ExamQuestion s where s.workId = ?1")
+    long countByWorkId(Long workId);
 
     long countByWorkIdAndAreaCode(Long workId, String areaCode);
 
     List<ExamQuestion> findByWorkIdAndAreaCode(Long workId, String areaCode);
 
-    ExamQuestion findByWorkIdAndSubjectAndAreaCode(Long workId,
-                                                   Subject subject, String areaCode);
-
-    ExamQuestion findByWorkIdAndSubjectAndAreaCodeAndTest(Long workId,
-                                                          Subject subject, String areaCode, int test);
+    ExamQuestion findByWorkIdAndSubjectAndAreaCode(Long workId, Subject subject, String areaCode);
 
     void deleteByWorkId(Long workId);
 
-    void deleteByWorkIdAndSubjectAndTest(Long workId, Subject subject, int test);
+    void deleteByWorkIdAndSubject(Long workId, Subject subject);
 
     List<ExamQuestion> findAllByAreaCodeAndSubjectAndWorkId(String areaCode, Subject subject, Long workId);
 
-    List<ExamQuestion> findByWorkIdAndSubjectAndTest(Long workId, Subject subject, int test);
-
     @Query("select distinct s.areaCode, s.areaName from ExamQuestion s where s.workId = ?1")
     List<Object[]> findByWorkId(Long workId);
 
-    List<ExamQuestion> findByWorkIdAndSubjectAndTestNot(Long workId, Subject subject, int id);
-
     @Query(value = "select id, area_name areaName, name from exam_question eq where eq.id in (select question_id from paper p where p.work_id = ? and p.subject = ? and p.is_sample = 1 and p.is_missing = 0)", nativeQuery = true)
     List<Object[]> listByWorkIdAndSubject(Long workId, String subject);
 

+ 1 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkSubjectRepo.java

@@ -25,7 +25,7 @@ public interface MarkSubjectRepo extends JpaRepository<MarkSubject,String> {
      */
     List<MarkSubject> findAllByWorkIdAndEnableTrue(Long workId);
 
-    List<MarkSubject> findByWorkIdAndTestNotIn(Long workId, List<Integer> ints);
+    List<MarkSubject> findByWorkIdAndTestNot(Long workId, Integer test);
 
     List<MarkSubject> findAllByWorkIdAndStageNot(Long workId, MarkStage stage);
 

+ 3 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -293,5 +293,7 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     @Query("update MarkTask m set m.isMark = ?2 where m.id = ?1")
     void updateMarkTaskMarkById(Long markTaskId, Boolean isMark);
 
-    List<MarkTask> findByWorkIdAndSubjectAndMarkerIdAndIsMarkTrue(Long workId, Subject subject, Long markerId);
+    List<MarkTask> findByWorkIdAndSubjectAndStageAndMarkerIdAndIsMarkTrue(Long workId, Subject subject, MarkStage stage, Long markerId);
+
+    void deleteByWorkIdAndSubject(Long workId, Subject subject);
 }

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

@@ -48,8 +48,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     Page<Paper> findByQuestionId(Long questionId, Pageable pageable);
 
-    @Query(value = "select * from paper p where p.`level` = ?1 and p.is_sample = ?2 and p.is_missing = ?3 and p.subject = ?4 and (p.is_test = ?5 or p.is_test = ?6) and p.area_code = ?7 and p.work_id = ?8 order by p.updated_on desc", nativeQuery = true)
-    List<Paper> findSample(String level, boolean isSample, boolean isMissing, String subject, int test, int test1, String areaCode, Long workId);
+    @Query(value = "select * from paper p where p.`level` = ?1 and p.is_sample = ?2 and p.is_missing = ?3 and p.subject = ?4 and p.is_test = ?5 and p.area_code = ?7 and p.work_id = ?8 order by p.updated_on desc", nativeQuery = true)
+    List<Paper> findSample(String level, boolean isSample, boolean isMissing, String subject, int test, String areaCode, Long workId);
 
     /**
      * 统计各省各科试卷数量[areaCode,areaName,questionName,count]
@@ -306,13 +306,11 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     long countByWorkIdAndSubject(Long workId, Subject subject);
 
-    long countByWorkIdAndSubjectAndQuestionIdAndLevel(Long workId,
-                                                      Subject subject, Long id, String code);
+    long countByWorkIdAndSubjectAndQuestionIdAndLevel(Long workId, Subject subject, Long id, String code);
 
-    long countByQuestionIdAndLevelAndSubjectAndWorkId(Long questionId, String code, Subject subject ,Long workId);
+    long countByQuestionIdAndLevelAndSubjectAndWorkId(Long questionId, String code, Subject subject, Long workId);
 
-    long countByWorkIdAndSubjectAndQuestionId(Long workId, Subject subject,
-                                              Long id);
+    long countByWorkIdAndSubjectAndQuestionId(Long workId, Subject subject, Long id);
 
     void deleteByWorkIdAndSubjectAndTest(Long workId, Subject subject, int test);
 
@@ -467,7 +465,16 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByWorkIdAndIsMissing(Long workId, boolean missing);
 
-    List<Paper> findByWorkIdAndIsMarkTure(Long workId);
+    List<Paper> findByWorkIdAndIsMarkTrue(Long workId);
+
+    @Modifying
+    @Query("update Paper p set p.test = ?3, p.active = false, p.batchNo = null where p.workId = ?1 and p.test = ?2")
+    void updateTestByWorkId(Long workId, int source, int dest);
+
+    List<Paper> findByWorkIdAndSubjectOrderByLevelAscSortNumDesc(Long workId, Subject subject);
+
+    long countByWorkId(Long workId);
+
+//    List<Paper> findByWorkIdAndSubjectOrderByLevelSortNumDesc(Long workId, Subject subject);
 
-//    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }

+ 10 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/StudentRepo.java

@@ -1,8 +1,10 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
 import cn.com.qmth.stmms.ms.core.domain.Student;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
@@ -37,4 +39,12 @@ public interface StudentRepo extends JpaRepository<Student, Long>, JpaSpecificat
     List<Student> findByWorkId(Long workId);
 
     Student findByWorkIdAndAreaCodeAndExamNumber(Long workId, String areaCode, String examNumber);
+
+    @Modifying
+    @Query("update Student s set s.test = ?3 where s.workId = ?1 and s.test = ?2")
+    void updateTestByWorkId(Long workId, String source, String dest);
+
+    @Modifying
+    @Query("update Student s set s.test = ?2 where s.id = ?1")
+    void updateTestByStudentId(Long workId, String test);
 }

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

@@ -278,7 +278,7 @@ public class MarkLogController {
         }*/
         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("workId"), workId));
             predicates.add(builder.equal(root.get("role"), Role.COLLECTOR));
             return builder.and(predicates.toArray(new Predicate[0]));
         };

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

@@ -1,6 +1,6 @@
 db.host=localhost
 db.port=3306
-db.dbName=msyj-local-v3.0.0
+db.dbName=msyj-local-v3.0.0-trial-1
 db.userName=root
 db.password=root
 

+ 5 - 5
stmms-ms-main/src/test/java/BatchCreateDataTest.java

@@ -65,7 +65,7 @@ public class BatchCreateDataTest {
     // 科组长数量
     private static int MARKER_LEADER_COUNT = 4;
     // 工作id
-    private static Long WORK_ID = 13L;
+    private static Long WORK_ID = 9L;
     // 生成科目
     private List<Subject> subjects = Arrays.asList(Subject.SX, Subject.SC, Subject.SM);
     // 是否复制图片
@@ -239,7 +239,7 @@ public class BatchCreateDataTest {
         examQuestion1.setName("速写1");
         examQuestion1.setSubject(Subject.SX);
         examQuestion1.setWorkId(WORK_ID);
-        examQuestion1.setTest(0);
+//        examQuestion1.setTest(0);
         questions.add(examQuestion1);
 
         ExamQuestion examQuestion2 = new ExamQuestion();
@@ -249,7 +249,7 @@ public class BatchCreateDataTest {
         examQuestion2.setName("色彩1");
         examQuestion2.setSubject(Subject.SC);
         examQuestion2.setWorkId(WORK_ID);
-        examQuestion2.setTest(0);
+//        examQuestion2.setTest(0);
         questions.add(examQuestion2);
 
         ExamQuestion examQuestion3 = new ExamQuestion();
@@ -259,7 +259,7 @@ public class BatchCreateDataTest {
         examQuestion3.setName("素描1");
         examQuestion3.setSubject(Subject.SM);
         examQuestion3.setWorkId(WORK_ID);
-        examQuestion3.setTest(0);
+//        examQuestion3.setTest(0);
         questions.add(examQuestion3);
 
         return questions;
@@ -293,7 +293,7 @@ public class BatchCreateDataTest {
     private List<Paper> createPaper(List<Student> students, List<Subject> subjects) throws Exception {
         List<Paper> papers = new ArrayList<>();
         for (Subject subject : subjects) {
-            ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(WORK_ID, subject, "1", TrialEnum.DEFAULT.getId());
+            ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(WORK_ID, subject, "1");
             for (Student student : students) {
                 Long random = getRandom(student.getWorkId(), student.getExamNumber());
                 Paper paper = new Paper(student.getWorkId(), null, subject, examQuestion, student, false, random);

+ 3 - 3
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ExamQuestionApi.java

@@ -39,13 +39,13 @@ public class ExamQuestionApi {
     @RequestMapping(method = RequestMethod.GET)
     public List<ExamQuestion> list(@RequestParam Long workId, @RequestParam Subject subject) {
         if (!imageConfig.isCustomSubject()) {
-            List<ExamQuestion> questions = examQuestionRepo.findByWorkIdAndSubjectAndTestNot(workId, subject, TrialEnum.DEFAULT.getId());
+            List<ExamQuestion> questions = examQuestionRepo.findByWorkIdAndSubject(workId, subject);
             if(questions == null || questions.size() == 0){
-                questions = examQuestionRepo.findByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.DEFAULT.getId());
+                questions = examQuestionRepo.findByWorkIdAndSubject(workId, subject);
             }
             return questions;
         } else {
-            return examQuestionRepo.findByWorkIdAndSubjectAndTest(workId, Subject.CUSTOM, TrialEnum.DEFAULT.getId());
+            return examQuestionRepo.findByWorkIdAndSubject(workId, Subject.CUSTOM);
         }
     }
 

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

@@ -601,9 +601,9 @@ public class MakrerApi {
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.toString());
 
         //总体进度
-        if (markSubject.getStage().name() == MarkStage.INIT.name()) {
+        if (markSubject.getStage().name().equals(MarkStage.INIT.name())) {
             List<Student> students = studentRepo.findByWorkIdAndTest(workId, String.valueOf(TrialEnum.DEFAULT.getId()));
-            long stuTotalCount = students.stream().count();
+            long stuTotalCount = students.size();
             long c = 0L;
             for (Student student : students) {
                 String[] uploadStatus = student.getUploadStatus().split(",");

+ 29 - 18
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -112,7 +112,6 @@ public class MarkTaskApi {
                             @RequestParam Long questionId,
                             @RequestParam(required = false) String areaCode,
                             Pageable pageable) throws Exception {
-        long t0 = System.currentTimeMillis();
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         MarkUser markUser = markUserRepo.findOne(markerId);
         Long batchNo = null;
@@ -186,19 +185,15 @@ public class MarkTaskApi {
         };
         Sort sort = new Sort("randomSeq", "randomSeqNew");
         Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
-        long t1 = System.currentTimeMillis();
-        System.out.println("m0:" + (t1 - t0));
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
-        long t2 = System.currentTimeMillis();
-        System.out.println("m1:" + (t2 - t1));
 
         if (Objects.isNull(markTasks) || markTasks.getContent().size() == 0) {
             if (Objects.nonNull(isSample) && isSample) {
                 ExamQuestion examQuestion = examQuestionRepo.findOne(questionId);
-                if (examQuestion.getTest() == TrialEnum.DEFAULT.getId()) {
-                    List<Paper> paperList = paperRepo.findSample(level, isSample, false, examQuestion.getSubject().name(), TrialEnum.DEFAULT.getId(), TrialEnum.START_FORMAL.getId(), examQuestion.getAreaCode(), examQuestion.getWorkId());
+                MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + examQuestion.getSubject());
+                if (markSubject.getTest() == TrialEnum.DEFAULT.getId()) {
+                    List<Paper> paperList = paperRepo.findSample(level, isSample, false, examQuestion.getSubject().name(), TrialEnum.DEFAULT.getId(), examQuestion.getAreaCode(), examQuestion.getWorkId());
                     if (Objects.nonNull(paperList) && paperList.size() > 0) {
-//                        MarkUser markUser = markUserRepo.findOne(markerId);
                         for (Paper p : paperList) {
                             MarkTask markTask = new MarkTask(markUser, p, stage, 1L);
                             markTaskDTOs.add(markTaskAssembler.toDTO(markTask));
@@ -391,7 +386,6 @@ public class MarkTaskApi {
      * 跳过评卷任务
      *
      * @param markTaskId 评卷你任务id
-     * @return
      */
     @RequestMapping(value = "/mark_task", method = RequestMethod.POST)
     public Object markTask(@RequestParam Long markTaskId,
@@ -595,10 +589,9 @@ public class MarkTaskApi {
     /**
      * 根据任务密号查询试卷
      *
-     * @param workId
-     * @param subject
-     * @param secretNumber
-     * @return
+     * @param workId       工作ID
+     * @param subject      科目
+     * @param secretNumber 密号
      */
     @RequestMapping(value = "/get_by_secret_number", method = RequestMethod.GET)
     public List<MarkTask> getBySecretNumber(@RequestParam Long workId,
@@ -612,17 +605,35 @@ public class MarkTaskApi {
      *
      * @param workId   工作ID
      * @param subject  科目
+     * @param stage    阶段
      * @param markerId 评卷员ID
      */
     @RequestMapping(value = "/list_mark_task", method = RequestMethod.GET)
-    public List<MarkTaskDTO> listMarkTask(@RequestParam Long workId,
-                                          @RequestParam Subject subject,
-                                          @RequestParam Long markerId) {
-        List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndSubjectAndMarkerIdAndIsMarkTrue(workId, subject, markerId);
+    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;
+        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());
     }
 }

+ 55 - 54
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -49,10 +49,12 @@ public class PaperAssembler {
     private MarkLogRepo markLogRepo;
 
     public PaperDTO toDTO(Paper paper) {
+
+        String imgSrc = null;
+        String thumbSrc = null;
+        String sheetSrc = null;
+        PaperDTO paperDTO = null;
         if (paper != null) {
-            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:考号
@@ -70,7 +72,7 @@ public class PaperAssembler {
             }
             //查询阶段
             MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
-            PaperDTO paperDTO = null;
+
 
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
@@ -128,39 +130,39 @@ public class PaperAssembler {
                     }
                 }
             }
-            return paperDTO;
         }
-        return null;
+        return paperDTO;
     }
 
     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());
@@ -199,10 +201,11 @@ public class PaperAssembler {
     }
 
     public PaperDTO toDTOForEquipmentMonitor(Paper paper, Boolean isManual) {
+        String imgSrc = null;
+        String thumbSrc = null;
+        String sheetSrc = null;
+        PaperDTO paperDTO = null;
         if (paper != null) {
-            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:考号
@@ -230,8 +233,6 @@ public class PaperAssembler {
             }
             //查询阶段
             MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
-            PaperDTO paperDTO = null;
-
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setSubjectName(paper.getSubject().getName());
@@ -265,35 +266,35 @@ public class PaperAssembler {
             paperDTO.setShift(paper.isShift());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setStudentName(student.getName());
-            return paperDTO;
         }
-        return null;
+        return paperDTO;
     }
 
     public PaperDTO toDTOForSheet(Paper paper) {
         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());

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

@@ -2,10 +2,10 @@ package cn.com.qmth.stmms.ms.marking.service;
 
 import cn.com.qmth.stmms.ms.commons.utils.DbBackupUtils;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
-import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.core.cache.CacheService;
 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.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
@@ -13,7 +13,6 @@ import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -138,8 +137,6 @@ public class AssignTaskService {
         Iterator<Paper> iterator = papers.iterator();
         List<MarkTask> markTaskList = new ArrayList<>(papers.size() * sum);
         List<Paper> paperList = new ArrayList<>(papers.size());
-//        List<MarkTask> markTasks = markTaskRepo.findByWorkId(markSubject.getWorkId());
-//        Map<Long, MarkTask> randomMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getRandomSeqNew, Function.identity(), (dto1, dto2) -> dto1));
         List<Object[]> markTasks = markTaskRepo.findAllByWorkId(markSubject.getWorkId());
         Map<Long, Object> randomMap = new HashMap<>();
         markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
@@ -187,7 +184,20 @@ public class AssignTaskService {
                 markerCount++;
                 Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
                 MarkTask markTask;
-                if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
+                if (Objects.equals(MarkStage.LEVEL, markSubject.getStage())) {
+                    if (paper.isSample() && paper.getLevel() != null) {
+                        Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
+                        markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
+
+                        // 初始化排序值
+                        if (markerCount == markerGroups.get(idx).getMarkers().size()) {
+                            paper.setSortNum(level.getWeight() * markerCount);
+                        }
+                    } else {
+                        markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                    }
+                    markTask.setBatchNo(currentTime);
+                } else {
                     markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
                     String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
                     if (Objects.nonNull(serialNumber)) {
@@ -201,40 +211,23 @@ public class AssignTaskService {
                     markTask.setSerialNumber(serialNumber);
                     markTask.setDisplayNumber(displayNumber);
                     markTask.setLevel(paper.getLevel());
-                } else {
-                    if (paper.isSample() && paper.getLevel() != null) {
-                        Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
-                        markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
-
-                        // 初始化排序值
-                        if (markerCount == markerGroups.get(idx).getMarkers().size()) {
-                            paper.setSortNum(level.getWeight() * markerCount);
-                        }
-                    } else {
-                        markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
-                    }
-                    markTask.setBatchNo(currentTime);
                 }
                 markTaskList.add(markTask);
                 randomMap.put(random, markTask);
-//                markTaskRepo.save(markTask);
             }
             if (markSubject.getTest() != 1) {
                 if (MarkStage.LEVEL.equals(markSubject.getStage())) {
                     //将paper置为激活
                     paper.setActive(true);
                     paper.setBatchNo(currentTime);
-//                    paperRepo.save(paper);
                     paperList.add(paper);
-                    //更新subject表formal为正试评卷
-//                    markSubject.setFormal(true);
-//                    markSubjectRepo.saveAndFlush(markSubject);
                 }
                 if (MarkStage.SCORE.equals(markSubject.getStage())) {
                     paper.setScoreBatchNo(currentTime);
                     paperList.add(paper);
                 }
             } else {
+                paper.setActive(true);
                 paper.setBatchNo(currentTime);
                 paperList.add(paper);
             }
@@ -257,11 +250,10 @@ public class AssignTaskService {
 
 //        markTaskRepo.save(markTaskList);
         paperRepo.save(paperList);
-        if (markSubject.getTest() != 1) {
-            //更新subject表formal为正试评卷
+        /*if (markSubject.getTest() != 1) {
             markSubject.setFormal(true);
             markSubjectRepo.saveAndFlush(markSubject);
-        }
+        }*/
         //只有全部任务投放完成,才能删除分组
 //        int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
         //进入分档阶段后,清空当前分组,以便打分阶段前重新分组
@@ -280,11 +272,11 @@ public class AssignTaskService {
 
     @Transactional
     public void assignForGroupingScore(MarkSubject markSubject, List<MarkerGroup> markerGroups) {
-        if (markSubject.getTest() != 1) {
+        /*if (markSubject.getTest() != 1) {
             //更新subject表formal为正试评卷
             markSubject.setFormal(true);
             markSubjectRepo.saveAndFlush(markSubject);
-        }
+        }*/
         //只有全部任务投放完成,才能删除分组
         int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
         if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {

+ 4 - 6
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java

@@ -52,7 +52,7 @@ public class DetermineLevelService {
         if (majority) {
             majorityResult = calcMajority(tasks);
         }
-        weightResult = calcWeight(tasks);
+        weightResult = calcWeight(levels, tasks);
 
         if (majorityResult != null) {
             if (taskBest) {
@@ -79,14 +79,13 @@ public class DetermineLevelService {
      *
      * @param tasks 任务集合
      */
-    private DeterResult calcWeight(MarkTask[] 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()));
+            String levelResult = tasks[i].getResult();
+            Level level = levels.stream().filter(m->m.getCode().equals(levelResult)).findFirst().orElse(null);
             if (level == null) {
                 throw new RuntimeException("无此档位");
             }
@@ -96,7 +95,6 @@ public class DetermineLevelService {
             weights[i] = markerWeight;
         }
         int avg = (int) Math.round(DoubleStream.of(values).sum() / DoubleStream.of(weights).sum());
-        List<Level> levels = levelRepo.findByWorkId(workId);
         Optional<Level> levelOptional = levels.stream().filter(o -> o.getMaxScore() >= avg && o.getMinScore() <= avg).findFirst();
         Level level = levelOptional.orElse(null);
         if (level == null) {

+ 3 - 3
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/GroupingService.java

@@ -84,10 +84,10 @@ public class GroupingService {
      */
     public void getTotalProgress(Long workId, MarkSubject markSubject, Map<String, Object> objectMap) {
         int successCount = 0;
-        if (markSubject.getStage().name() == MarkStage.LEVEL.name()) {
+        if (markSubject.getStage().name().equals(MarkStage.LEVEL.name())) {
             successCount = paperRepo.countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrueAndTest(workId, markSubject.getSubject(), 0);
         }
-        if (markSubject.getStage().name() == MarkStage.SCORE.name()) {
+        if (markSubject.getStage().name().equals(MarkStage.SCORE.name())) {
             successCount = paperRepo.countByWorkIdAndSubjectAndScoreNotNullAndIsMissingFalseAndActiveTrueAndTest(workId, markSubject.getSubject(), 0);
         }
         //所有任务数(查询所有有效试卷)
@@ -114,7 +114,7 @@ public class GroupingService {
      */
     public void getAreaProgress(Long workId, MarkSubject markSubject, Map<String, Object> objectMap) {
         List<Object[]> areas;
-        if (markSubject.getStage().name() == MarkStage.SCORE.name()) {
+        if (markSubject.getStage().name().equals(MarkStage.SCORE.name())) {
             areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name());
         } else {
             areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getTest());

+ 43 - 14
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkerGroupLeaderService.java

@@ -3,12 +3,12 @@ package cn.com.qmth.stmms.ms.marking.service;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 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.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkerGroupLeaderRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkerGroupRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -26,13 +27,16 @@ import java.util.stream.Collectors;
 @Service
 public class MarkerGroupLeaderService {
 
-    @Autowired
+    @Resource
+    private MarkUserRepo markUserRepo;
+
+    @Resource
     private MarkTaskRepo markTaskRepo;
 
-    @Autowired
+    @Resource
     private MarkerGroupRepo markerGroupRepo;
 
-    @Autowired
+    @Resource
     private MarkerGroupLeaderRepo markerGroupLeaderRepo;
 
     /**
@@ -109,10 +113,10 @@ public class MarkerGroupLeaderService {
             for (Map.Entry<Long, List<MarkerGroupLeader>> listEntry : maps.entrySet()) {
                 Map<String, List<Long>> map = new HashMap<>();
                 // 科组长
-                List<Long> markLeaderList = listEntry.getValue().stream().map(m -> m.getMarkLeaderId()).distinct().collect(Collectors.toList());
+                List<Long> markLeaderList = listEntry.getValue().stream().map(MarkerGroupLeader::getMarkLeaderId).distinct().collect(Collectors.toList());
                 map.put("markLeaders", markLeaderList);
                 // 评卷员
-                List<Long> markList = listEntry.getValue().stream().map(m -> m.getMarkerId()).distinct().collect(Collectors.toList());
+                List<Long> markList = listEntry.getValue().stream().map(MarkerGroupLeader::getMarkerId).distinct().collect(Collectors.toList());
                 map.put("markers", markList);
                 mapList.add(map);
             }
@@ -133,8 +137,7 @@ public class MarkerGroupLeaderService {
     public List<Long> listPaperIdsByWorkIdAndSubjectAndStageAndMarkerIds(Long workId, Subject subject, MarkStage stage, List<Long> markers) {
         List<Paper> papers = markTaskRepo.findByWorkIdAndSubjectAndStageAndMarkerIdIn(workId, subject, stage, markers);
         if (!CollectionUtils.isEmpty(papers)) {
-            List<Long> paperIds = papers.stream().map(m -> m.getId()).distinct().collect(Collectors.toList());
-            return paperIds;
+            return papers.stream().map(Paper::getId).distinct().collect(Collectors.toList());
         }
         return null;
     }
@@ -142,8 +145,7 @@ public class MarkerGroupLeaderService {
     public List<Long> listPaperIdsByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage, List<Long> markers) {
         List<Object[]> papers = markTaskRepo.findByWorkIdAndSubjectAndStage(workId, subject.name(), stage.ordinal());
         if (!CollectionUtils.isEmpty(papers)) {
-            List<Long> paperIds = papers.stream().filter(m -> markers.contains(Long.valueOf(m[1].toString()))).map(m -> Long.valueOf(m[0].toString())).distinct().collect(Collectors.toList());
-            return paperIds;
+            return papers.stream().filter(m -> markers.contains(Long.valueOf(m[1].toString()))).map(m -> Long.valueOf(m[0].toString())).distinct().collect(Collectors.toList());
         }
         return null;
     }
@@ -186,19 +188,46 @@ public class MarkerGroupLeaderService {
      *
      * @param workId
      * @param subject
-     * @param level
+     * @param stage
      * @param groupId
      * @return
      */
-    public List<Long> listByWorkIdAndSubjectAndStageAndGroupId(Long workId, Subject subject, MarkStage level, Long groupId) {
+    public List<Long> listByWorkIdAndSubjectAndStageAndGroupId(Long workId, Subject subject, MarkStage stage, Long groupId) {
         if (Objects.isNull(groupId)) {
             return null;
         }
-        List<MarkerGroupLeader> markerGroupLeaders = markerGroupLeaderRepo.findByWorkIdAndSubjectAndStageAndGroupId(workId, subject, level, groupId);
+        List<MarkerGroupLeader> markerGroupLeaders = markerGroupLeaderRepo.findByWorkIdAndSubjectAndStageAndGroupId(workId, subject, stage, groupId);
         List<Long> markerIds = null;
         if (!CollectionUtils.isEmpty(markerGroupLeaders)) {
-            markerIds = markerGroupLeaders.stream().map(m -> m.getMarkerId()).distinct().collect(Collectors.toList());
+            markerIds = markerGroupLeaders.stream().map(MarkerGroupLeader::getMarkerId).distinct().collect(Collectors.toList());
         }
         return markerIds;
     }
+
+    /**
+     * 查询科组长下所有用户
+     *
+     * @param workId   工作ID
+     * @param subject  科目
+     * @param stage    阶段
+     * @param markerId 科组长ID
+     */
+    public List<MarkUser> listGroupUsersByWorkIdAndSubjectAndStageAndMarkerId(Long workId, Subject subject, MarkStage stage, Long markerId) {
+        MarkUser markUser = markUserRepo.getOne(markerId);
+        if(markUser == null){
+            return null;
+        }
+
+        if(markUser.getGroupId() == null){
+            return markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
+        } else {
+            List<MarkerGroupLeader> markerGroupLeaders = markerGroupLeaderRepo.findByWorkIdAndSubjectAndStageAndGroupId(workId, subject, stage, markUser.getGroupId());
+            if(markerGroupLeaders == null){
+                return null;
+            } else {
+                List<Long> markerIds = markerGroupLeaders.stream().map(MarkerGroupLeader::getMarkerId).distinct().collect(Collectors.toList());
+                return markUserRepo.findAll(markerIds);
+            }
+        }
+    }
 }

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

@@ -279,7 +279,6 @@ public class MarkingService {
 
         List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
         for (MarkTask markTask : markTasks) {
-//            markTask.setOriginLevel(markTask.getResult());
             markTask.setRejected(false);
             markTask.setResult(level);
             markTask.setLevel(level);

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

@@ -75,7 +75,7 @@ public class StageControlService {
         statusMap.put(markSubject.getId(), true);
         MarkStage markStage = markSubject.getStage();
         //是否还有未投放的试卷
-        int waitCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
+        int waitCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), TrialEnum.DEFAULT.getId());
         if (waitCount > 0 && markStage.equals(MarkStage.LEVEL)) {
             markStage = MarkStage.INIT;
         }
@@ -194,7 +194,6 @@ public class StageControlService {
                 Long questionId1 = Long.valueOf(questionId.toString());
                 papersList = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndIsMissingFalseAndActiveFalseAndTestOrderByQuestionId(workId, questionId1, subject, 0);
             }
-//            papers = papersList.subList(0, taskCount);
             papers = randomList(papersList, taskCount);
         }
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, null);