瀏覽代碼

3.1.1 新需求

xiaofei 1 年之前
父節點
當前提交
c1b579a9d6
共有 36 個文件被更改,包括 1661 次插入922 次删除
  1. 0 579
      sql/msyj-local-v3.1.0.sql
  2. 4 0
      sql/清空所有数据脚本.sql
  3. 58 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/QualityAnalyseController.java
  4. 13 10
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/pdfExporter.java
  5. 46 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  6. 29 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  7. 4 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java
  8. 12 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/CollectConfig.java
  9. 13 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/LevelConfig.java
  10. 12 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/RoughLevelConfig.java
  11. 97 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTaskMarkerPaper.java
  12. 151 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTaskSelfCheck.java
  13. 10 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/MarkerGroupLeader.java
  14. 4 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskLevelRepo.java
  15. 23 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskMarkerPaperRepo.java
  16. 3 3
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRoughLevelRepo.java
  17. 4 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskScoreRepo.java
  18. 24 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskSelfCheckRepo.java
  19. 6 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkerGroupLeaderRepo.java
  20. 18 0
      stmms-ms-main/install/config.ini
  21. 5 0
      stmms-ms-main/install/mysql/init/init.sql
  22. 614 0
      stmms-ms-main/install/mysql/init/stmms_ms.sql
  23. 37 0
      stmms-ms-main/install/mysql/upgrade/3.1.1.sql
  24. 20 0
      stmms-ms-main/install/nginx/mslk.conf
  25. 0 88
      stmms-ms-main/src/main/resources/application-dev.properties
  26. 0 68
      stmms-ms-main/src/main/resources/application-gz.properties
  27. 0 58
      stmms-ms-main/src/main/resources/application-qmth.properties
  28. 0 54
      stmms-ms-main/src/main/resources/application-test.properties
  29. 68 39
      stmms-ms-main/src/main/resources/application.properties
  30. 52 5
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  31. 4 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  32. 66 4
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskLevelAssembler.java
  33. 60 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskRoughLevelAssembler.java
  34. 21 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java
  35. 2 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/CheckDataService.java
  36. 181 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskSelfCheckService.java

+ 0 - 579
sql/msyj-local-v3.1.0.sql

@@ -1,579 +0,0 @@
-
-
--- ----------------------------
--- Table structure for attachment
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `attachment`  (
-  `id` bigint(64) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NULL DEFAULT NULL,
-  `subject` varchar(10) NULL DEFAULT NULL,
-  `exam_number` varchar(20) NULL DEFAULT NULL,
-  `file_path_local` varchar(512) NOT NULL,
-  `file_name` varchar(128) NOT NULL,
-  `file_type` varchar(8) NULL DEFAULT NULL,
-  `file_ext` varchar(16) NULL DEFAULT NULL,
-  `bucket` varchar(64) NOT NULL,
-  `object_key` varchar(128) NOT NULL,
-  `oss_name` varchar(500) NOT NULL,
-  `oss_status` varchar(20) NOT NULL,
-  `oss_fail_msg` varchar(500) NULL DEFAULT NULL COMMENT '上传oss失败原因',
-  `delete_status` varchar(20) NULL DEFAULT NULL,
-  `time` datetime(0) NOT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for change_level
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `change_level`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NULL DEFAULT NULL,
-  `subject` varchar(50) NULL DEFAULT NULL,
-  `stage` int(2) NULL DEFAULT NULL COMMENT '阶段',
-  `paper_id` bigint(20) NULL DEFAULT NULL,
-  `original_level` varchar(45) NULL DEFAULT NULL COMMENT '原档位',
-  `audit_status` int(1) NULL DEFAULT NULL COMMENT '改档审核:0-申请,1-同意,2-不同意',
-  `create_id` bigint(20) NULL DEFAULT NULL COMMENT '申请改档用户id',
-  `create_date` datetime(0) NULL DEFAULT NULL COMMENT '申请改档时间',
-  `audit_id` bigint(20) NULL DEFAULT NULL COMMENT '审核用户id',
-  `audit_date` datetime(0) NULL DEFAULT NULL COMMENT '审核时间',
-  `suggest_level` varchar(255) NULL DEFAULT NULL,
-  `is_curr` int(11) NULL DEFAULT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '改档记录表';
-
--- ----------------------------
--- Table structure for check_data
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `check_data`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作ID',
-  `check_item` varchar(45) NULL DEFAULT NULL COMMENT '数据校验类型',
-  `param_value` int(3) NULL DEFAULT NULL COMMENT '变量值',
-  `status` varchar(45) NULL DEFAULT NULL,
-  `result` tinyint(1) NULL DEFAULT NULL COMMENT '是否校验通过(1:是,0:否)',
-  `error_count` int(7) NULL DEFAULT 0 COMMENT '未通过数量(result=0时,数量大于0)',
-  `content` varchar(200) NULL DEFAULT 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 AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '数据校验日志';
-
--- ----------------------------
--- Table structure for check_data_error
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `check_data_error`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `check_data_id` bigint(20) NULL DEFAULT NULL,
-  `exam_number` varchar(45) NULL DEFAULT NULL COMMENT '考号',
-  `student_name` varchar(100) NULL DEFAULT NULL,
-  `error_message` varchar(1000) NULL DEFAULT NULL COMMENT '错误信息',
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_check_data_id`(`check_data_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '数据校验错误数据';
-
--- ----------------------------
--- Table structure for exam_question
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `exam_question`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `area_code` varchar(255) NOT NULL,
-  `area_name` varchar(255) NULL DEFAULT NULL,
-  `name` varchar(255) NOT NULL,
-  `subject` varchar(50) NOT NULL,
-  `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;
-
--- ----------------------------
--- Table structure for exam_score_prop
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `exam_score_prop`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
-  `subject` varchar(50) NULL DEFAULT NULL COMMENT '科目',
-  `exclude` varchar(100) NULL DEFAULT NULL COMMENT '打分阶段配置过滤档位(可选一个或多个档位,多个档位用\",\"号隔开)',
-  `task_sort` varchar(50) NULL DEFAULT NULL COMMENT '打分阶段配置档位排序规则(可选random/paper,为paper时,score.level.exclude置为空)',
-  `enable` bit(1) NULL DEFAULT b'0' COMMENT '打分阶段配置是否启用(为false则不启用打分阶段分档),0:不启用,1:启用',
-  `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作区id',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '考试打分配置';
-
--- ----------------------------
--- Table structure for inspect_range
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `inspect_range`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `condition` int(11) NULL DEFAULT NULL,
-  `enabled` bit(1) NULL DEFAULT NULL,
-  `student_count` int(11) NULL DEFAULT NULL,
-  `type` varchar(255) NULL DEFAULT NULL,
-  `work_id` bigint(20) NULL DEFAULT NULL,
-  `active` bit(1) NOT NULL,
-  `editable` bit(1) NOT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for inspect_student
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `inspect_student`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `exam_number` varchar(255) NOT NULL,
-  `inspect_range_id` bigint(20) NOT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for inspect_task
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `inspect_task`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `created_on` datetime(0) NULL DEFAULT NULL,
-  `inspect_range_id` bigint(20) NOT NULL,
-  `marker_id` bigint(20) NOT NULL,
-  `marker_name` varchar(50) NOT NULL,
-  `question_id` bigint(20) NULL DEFAULT NULL,
-  `subject` varchar(50) NULL DEFAULT NULL,
-  `updated_on` datetime(0) NULL DEFAULT NULL,
-  `work_id` bigint(20) NOT NULL,
-  `paper_id` bigint(20) NOT NULL,
-  `level` varchar(255) NULL DEFAULT NULL,
-  `score` int(11) NULL DEFAULT NULL,
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `FK4e9mfahf522t4ej4y4yd065dh`(`paper_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for level
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `level`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `code` varchar(50) NOT NULL,
-  `interval_score` int(11) NOT NULL,
-  `level_type` int(11) NULL DEFAULT NULL,
-  `level_value` int(11) NOT NULL,
-  `max_score` int(11) NOT NULL,
-  `min_score` int(11) NOT NULL,
-  `pt` int(11) NOT NULL,
-  `score_list` varchar(255) NULL DEFAULT NULL,
-  `weight` int(11) NOT NULL,
-  `work_id` bigint(20) NULL DEFAULT NULL,
-  `kdpt` int(11) NOT NULL,
-  `rough_code` varchar(2) NULL DEFAULT NULL COMMENT '粗分档档位',
-  `rough_weight` int(11) NULL DEFAULT NULL COMMENT '粗分档典型值',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE INDEX `idx_level_workId_code`(`work_id`, `code`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for mark_log
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `mark_log`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
-  `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '操作人id',
-  `create_user_name` varchar(100) NULL DEFAULT NULL COMMENT '操作人名字',
-  `create_role` varchar(50) NULL DEFAULT NULL COMMENT '操作人角色',
-  `subject` varchar(50) NULL DEFAULT NULL COMMENT '科目',
-  `exam_number` varchar(50) NULL DEFAULT NULL COMMENT '准考证号',
-  `student_name` varchar(100) NULL DEFAULT NULL COMMENT '学生姓名',
-  `login_time` datetime(0) NULL DEFAULT NULL COMMENT '登录时间(采集专用)',
-  `logout_time` datetime(0) NULL DEFAULT NULL COMMENT '登出时间(采集专用)',
-  `oper_type` int(11) NULL DEFAULT NULL COMMENT '操作类型,1:分档,2:打分,3:回评档位,4:回评分数,5:档位打回,6:档位打回回评,7:一键定档,8:标准卷设置',
-  `oper_name` varchar(100) NULL DEFAULT NULL,
-  `oper_data_before` varchar(255) NULL DEFAULT NULL COMMENT '操作前数据',
-  `oper_data_after` varchar(255) NULL DEFAULT NULL COMMENT '操作后数据',
-  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间',
-  `work_id` bigint(20) NULL DEFAULT NULL COMMENT '考区id',
-  `paper_id` bigint(20) NULL DEFAULT NULL COMMENT '试卷id',
-  `remark` varchar(500) NULL DEFAULT NULL COMMENT '备注',
-  `test` int(4) NULL DEFAULT 0,
-  `stage` int(1) NULL DEFAULT NULL COMMENT '试卷阶段,0:初始,1:分档,2:打分',
-  `work_name` varchar(255) NULL DEFAULT NULL,
-  `stage_name` varchar(255) NULL DEFAULT NULL,
-  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 = utf8mb4 COMMENT = '操作日志';
-
--- ----------------------------
--- Table structure for mark_subject
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `mark_subject`  (
-  `id` varchar(50) NOT NULL,
-  `work_id` bigint(20) NULL DEFAULT NULL,
-  `collect_config` varchar(255) NULL DEFAULT NULL,
-  `name` varchar(255) NULL DEFAULT NULL,
-  `stage` int(11) NULL DEFAULT NULL,
-  `total_score` int(11) NOT NULL,
-  `sample_count` int(11) NOT NULL DEFAULT 100,
-  `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
-  `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,
-  INDEX `FK1tvc2mil1ebqgt08912t4hxqw`(`work_id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for mark_task_job
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `mark_task_job`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
-  `data_object` varchar(4000) NULL DEFAULT NULL COMMENT 'object',
-  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
-  `status` bit(1) NULL DEFAULT b'0' COMMENT '状态,0:未记录,1:已记录',
-  `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 = utf8mb4 COMMENT = '定时任务调度表';
-
--- ----------------------------
--- Table structure for mark_task_level
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `mark_task_level`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `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,
-  `marker_name` varchar(50) NOT NULL,
-  `origin_level` varchar(255) NULL DEFAULT NULL,
-  `question_id` bigint(20) NULL DEFAULT NULL,
-  `result` varchar(50) NULL DEFAULT NULL,
-  `level` varchar(45) NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
-  `stage` int(11) NOT NULL,
-  `subject` varchar(50) NULL DEFAULT NULL,
-  `created_on` datetime(0) NULL DEFAULT NULL,
-  `updated_on` datetime(0) NULL DEFAULT NULL,
-  `random_seq` int(11) NULL DEFAULT NULL,
-  `secret_number` varchar(255) NULL DEFAULT NULL,
-  `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
-  `is_active` bit(1) NULL DEFAULT b'0' COMMENT '是否激活',
-  `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
-  `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
-  `is_change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '是否改档',
-  `serial_number` varchar(10) NULL DEFAULT NULL COMMENT '叫号序号',
-  `display_number` int(11) NULL DEFAULT NULL,
-  `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
-  `deviation_direction` varchar(10) NULL DEFAULT NULL COMMENT '偏差方向',
-  `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
-  INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
-  INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for mark_task_rough_level
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `mark_task_rough_level`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `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,
-  `marker_name` varchar(50) NOT NULL,
-  `origin_level` varchar(10) NULL DEFAULT NULL,
-  `question_id` bigint(20) NULL DEFAULT NULL,
-  `result` varchar(2) NULL DEFAULT NULL,
-  `level` varchar(2) NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
-  `stage` int(11) NOT NULL,
-  `subject` varchar(50) NULL DEFAULT NULL,
-  `created_on` datetime(0) NULL DEFAULT NULL,
-  `updated_on` datetime(0) NULL DEFAULT NULL,
-  `random_seq` int(11) NULL DEFAULT NULL,
-  `secret_number` varchar(255) NULL DEFAULT NULL,
-  `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
-  `is_active` bit(1) NULL DEFAULT b'0' COMMENT '是否激活',
-  `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
-  `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
-  `is_change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '是否改档',
-  `serial_number` varchar(10) NULL DEFAULT NULL COMMENT '叫号序号',
-  `display_number` int(11) NULL DEFAULT NULL,
-  `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
-  `deviation_direction` varchar(10) NULL DEFAULT NULL COMMENT '偏差方向',
-  `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
-  INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
-  INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for mark_task_score
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `mark_task_score`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `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,
-  `marker_name` varchar(50) NOT NULL,
-  `origin_level` varchar(255) NULL DEFAULT NULL,
-  `question_id` bigint(20) NULL DEFAULT NULL,
-  `result` varchar(50) NULL DEFAULT NULL,
-  `level` varchar(45) NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
-  `stage` int(11) NOT NULL,
-  `subject` varchar(50) NULL DEFAULT NULL,
-  `created_on` datetime(0) NULL DEFAULT NULL,
-  `updated_on` datetime(0) NULL DEFAULT NULL,
-  `random_seq` int(11) NULL DEFAULT NULL,
-  `secret_number` varchar(255) NULL DEFAULT NULL,
-  `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
-  `is_active` bit(1) NULL DEFAULT b'0' COMMENT '是否激活',
-  `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
-  `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
-  `is_change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '是否改档',
-  `serial_number` varchar(10) NULL DEFAULT NULL COMMENT '叫号序号',
-  `display_number` int(11) NULL DEFAULT NULL,
-  `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
-  `deviation_direction` varchar(10) NULL DEFAULT NULL COMMENT '偏差方向',
-  `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
-  INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
-  INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for mark_user
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `mark_user`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NOT NULL,
-  `subject` varchar(50) NULL DEFAULT NULL,
-  `name` varchar(255) NULL DEFAULT NULL,
-  `password` varchar(255) NULL DEFAULT NULL,
-  `role` varchar(255) NULL DEFAULT NULL,
-  `enabled` bit(1) NOT NULL,
-  `login_name` varchar(50) NOT NULL,
-  `pw_changed_count` int(11) NOT NULL,
-  `session_id` varchar(255) NULL DEFAULT NULL,
-  `group_id` bigint(20) NULL DEFAULT NULL,
-  `mark_right` int(11) NULL DEFAULT NULL,
-  `inspect_sc` bit(1) NULL DEFAULT NULL,
-  `inspect_sm` bit(1) NULL DEFAULT NULL,
-  `inspect_sx` bit(1) NULL DEFAULT NULL,
-  `weight` double NULL DEFAULT NULL,
-  `one_click_level` bit(1) NULL DEFAULT b'0' COMMENT '科组长是否开启一键定档',
-  `standard_volume` bit(1) NOT NULL,
-  `level_callback` bit(1) NOT NULL,
-  `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
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for marker_group
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `marker_group`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NOT NULL,
-  `name` varchar(255) NULL DEFAULT NULL,
-  `subject` varchar(50) NOT NULL,
-  `stage` int(1) NULL DEFAULT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- 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) 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) NOT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for marker_group_student
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `marker_group_student`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NOT NULL,
-  `subject` varchar(10) NULL DEFAULT NULL,
-  `stage` int(1) NOT NULL COMMENT '所属阶段',
-  `group_id` bigint(20) NOT NULL COMMENT '分组ID',
-  `paper_id` bigint(20) NULL DEFAULT NULL COMMENT '试卷ID',
-  `question_id` bigint(20) NULL DEFAULT NULL COMMENT '考区ID',
-  `exam_number` varchar(50) NULL DEFAULT NULL,
-  `name` varchar(50) NULL DEFAULT NULL,
-  `area_code` varchar(45) NULL DEFAULT NULL,
-  `area_name` varchar(255) NULL DEFAULT NULL,
-  `exam_room` varchar(255) NULL DEFAULT NULL,
-  `school` varchar(255) NULL DEFAULT NULL,
-  `source_name` varchar(225) NULL DEFAULT NULL COMMENT '生源地',
-  `batch_no` bigint(20) NULL DEFAULT NULL COMMENT '批次号',
-  `used` tinyint(1) NULL DEFAULT NULL COMMENT '已否已发任务',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for message
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `message`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作ID',
-  `subject` varchar(10) NULL DEFAULT NULL COMMENT '科目',
-  `stage` int(2) NULL DEFAULT NULL COMMENT '阶段',
-  `send_user_id` bigint(20) NULL DEFAULT NULL COMMENT '发件人ID',
-  `send_user_name` varchar(45) NULL DEFAULT NULL COMMENT '发件人名称',
-  `content` varchar(500) NULL DEFAULT NULL COMMENT '消息内容',
-  `receive_user` varchar(500) NULL DEFAULT NULL COMMENT '收件人集合json',
-  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '消息管理';
-
--- ----------------------------
--- Table structure for message_receive
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `message_receive`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `message_id` bigint(20) NULL DEFAULT NULL,
-  `receive_user_id` bigint(20) NULL DEFAULT NULL,
-  `is_read` tinyint(1) NULL DEFAULT NULL,
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `FKsg879qydqr4dx6r0khxfkkick`(`message_id`) USING BTREE,
-  CONSTRAINT `message_receive_ibfk_1` FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
-  CONSTRAINT `message_receive_ibfk_2` FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '消息发送的用户';
-
--- ----------------------------
--- Table structure for paper
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `paper`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NOT NULL,
-  `subject` varchar(50) NOT NULL,
-  `exam_number` varchar(50) NOT NULL,
-  `student_name` varchar(50) NOT NULL,
-  `area_code` varchar(50) NOT NULL,
-  `is_arbitrated` bit(1) NOT NULL,
-  `is_manual` bit(1) NOT NULL,
-  `is_rejected` bit(1) NOT NULL,
-  `is_tagged` bit(1) NOT NULL,
-  `level` varchar(255) NULL DEFAULT NULL,
-  `mark_by_leader` bit(1) NOT NULL,
-  `marked_logic` bit(1) NOT NULL,
-  `question_id` bigint(20) NOT NULL,
-  `question_name` varchar(255) NOT NULL,
-  `redo_level` varchar(255) NULL DEFAULT NULL,
-  `score` double NULL DEFAULT NULL,
-  `secret_number` varchar(255) NULL DEFAULT NULL,
-  `updated_on` datetime(0) NULL DEFAULT NULL,
-  `uploaded_count` int(11) NOT NULL,
-  `uploaded_on` datetime(0) NULL DEFAULT NULL,
-  `inspect_range` bigint(20) NULL DEFAULT NULL,
-  `inspect_score` double NULL DEFAULT NULL,
-  `source_name` varchar(255) NULL DEFAULT NULL,
-  `inspect_level` varchar(255) NULL DEFAULT NULL,
-  `inspector` bigint(20) NULL DEFAULT NULL,
-  `is_rough_sample` bit(1) NULL DEFAULT NULL COMMENT '粗分档标准卷',
-  `is_sample` bit(1) NOT NULL,
-  `sheet_md5` varchar(255) NULL DEFAULT NULL,
-  `slice_md5` varchar(255) NULL DEFAULT NULL,
-  `random_seq` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
-  `is_missing` bit(1) NOT NULL,
-  `exam_room` varchar(255) NULL DEFAULT NULL,
-  `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
-  `rough_batch_no` bigint(45) NULL DEFAULT NULL COMMENT '粗分档批次号',
-  `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
-  `score_batch_no` bigint(45) NULL DEFAULT NULL COMMENT '打分任务发布批次号',
-  `is_shift` bit(1) NULL DEFAULT b'0' COMMENT '是否改档',
-  `is_shift_score` bit(1) NULL DEFAULT b'0' COMMENT '是否改档打分',
-  `is_rough_one_click` bit(1) NULL DEFAULT b'0',
-  `is_one_click` bit(1) NULL DEFAULT b'0' COMMENT '是否一键定档',
-  `is_rejected_by_leader` bit(1) NULL DEFAULT b'0' COMMENT '是否科组长打回',
-  `is_relate` bit(1) NULL DEFAULT b'0' COMMENT '是否关联试卷',
-  `sort_num` int(11) NULL DEFAULT 0 COMMENT '排序值',
-  `scan_user_id` bigint(20) NULL DEFAULT NULL COMMENT '采集员ID',
-  `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
-  `rough_level` varchar(2) NULL DEFAULT NULL,
-  `redo_rough_level` varchar(2) NULL DEFAULT NULL,
-  `is_admin_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 = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for param_setting
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `param_setting`  (
-  `id` bigint(10) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(10) NULL DEFAULT NULL COMMENT '工作id',
-  `collect_config` varchar(1000) NULL DEFAULT NULL COMMENT '采集规则参数',
-  `level_config` varchar(1000) NULL DEFAULT NULL COMMENT '细分档规则参数',
-  `rough_level_config` varchar(1000) NULL DEFAULT NULL COMMENT '粗分档规则参数',
-  `score_config` varchar(500) NULL DEFAULT NULL COMMENT '打分规则参数',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '参数设置';
-
--- ----------------------------
--- Table structure for student
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `student`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NULL DEFAULT NULL,
-  `exam_number` varchar(50) NULL DEFAULT NULL,
-  `name` varchar(50) NULL DEFAULT NULL,
-  `area_code` varchar(255) NULL DEFAULT NULL,
-  `area_name` varchar(255) NULL DEFAULT NULL,
-  `exam_room` varchar(255) NULL DEFAULT NULL,
-  `school` varchar(255) NULL DEFAULT NULL COMMENT '学校',
-  `is_absent` bit(1) NOT NULL,
-  `upload_status` varchar(255) NULL DEFAULT NULL,
-  `source_name` varchar(255) NULL DEFAULT NULL,
-  `relate_exam_number` varchar(50) NULL DEFAULT NULL COMMENT '关联考号',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE INDEX `exam_number`(`exam_number`, `work_id`) USING BTREE,
-  INDEX `idx_work_id`(`work_id`) USING BTREE,
-  INDEX `idx_student_name`(`name`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
-
--- ----------------------------
--- Table structure for task_publish_setting
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `task_publish_setting`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `work_id` bigint(20) NULL DEFAULT NULL,
-  `question_id` bigint(45) NULL DEFAULT NULL COMMENT '考区',
-  `subject` varchar(50) NULL DEFAULT NULL,
-  `code` varchar(45) NULL DEFAULT NULL COMMENT '档位',
-  `total_count` int(11) NULL DEFAULT NULL COMMENT '总数量',
-  `success_count` int(11) NULL DEFAULT NULL COMMENT '已评数量',
-  `wait_count` int(11) NULL DEFAULT NULL COMMENT '待评数量',
-  `sort_rule` int(1) NULL DEFAULT NULL COMMENT '排序规则:0-乱序,1-定序',
-  `display_number` int(1) NULL DEFAULT NULL COMMENT '是否显示序号:0-否,1-是',
-  `task_count` int(11) NULL DEFAULT NULL COMMENT '本次任务数',
-  `batch_no` bigint(45) NULL DEFAULT NULL,
-  `publish_count` int(3) NULL DEFAULT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '发布打分任务';
-
--- ----------------------------
--- Table structure for work
--- ----------------------------
-CREATE TABLE IF NOT EXISTS `work`  (
-  `id` bigint(20) NOT NULL AUTO_INCREMENT,
-  `name` varchar(255) NULL DEFAULT NULL,
-  `active` bit(1) NOT NULL,
-  `created_on` date NULL DEFAULT NULL,
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;

+ 4 - 0
sql/清空所有数据脚本.sql

@@ -12,8 +12,10 @@ delete from mark_log;
 delete from mark_subject;
 delete from mark_task_job;
 delete from mark_task_level;
+delete from mark_task_marker_paper;
 delete from mark_task_rough_level;
 delete from mark_task_score;
+delete from mark_task_self_check;
 delete from mark_user;
 delete from marker_group;
 delete from marker_group_leader;
@@ -43,8 +45,10 @@ alter table mark_log AUTO_INCREMENT 1;
 -- alter table mark_subject AUTO_INCREMENT 1;
 alter table mark_task_job AUTO_INCREMENT 1;
 alter table mark_task_level AUTO_INCREMENT 1;
+alter table mark_task_marker_paper AUTO_INCREMENT 1;
 alter table mark_task_rough_level AUTO_INCREMENT 1;
 alter table mark_task_score AUTO_INCREMENT 1;
+alter table mark_task_self_check AUTO_INCREMENT 1;
 alter table mark_user AUTO_INCREMENT 1;
 alter table marker_group AUTO_INCREMENT 1;
 alter table marker_group_leader AUTO_INCREMENT 1;

+ 58 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/QualityAnalyseController.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.RoughLevel;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskLevel;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskRoughLevel;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskLevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRoughLevelRepo;
@@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.Predicate;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -83,7 +85,7 @@ public class QualityAnalyseController {
         Map<String, String> codesMap = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getCode));
         if (MarkStage.ROUGH_LEVEL.equals(stage)) {
             List<RoughLevel> roughLevels = DetermineRoughLevelService.parseRoughLevels(levels);
-            codesMap = roughLevels.stream().collect(Collectors.toMap(RoughLevel::getRoughCode, m-> DigitalToChineseUtil.int2chineseNum(Integer.parseInt(m.getRoughCode()))));
+            codesMap = roughLevels.stream().collect(Collectors.toMap(RoughLevel::getRoughCode, m -> DigitalToChineseUtil.int2chineseNum(Integer.parseInt(m.getRoughCode()))));
         }
 
         List<Long> markerIds = markerGroupLeaderService.listByWorkIdAndSubjectAndStageAndGroupId(workId, subject, stage, groupId);
@@ -452,6 +454,61 @@ public class QualityAnalyseController {
         return list;
     }
 
+    /**
+     * 自查一致性分析
+     *
+     * @param workId    工作ID
+     * @param stage     阶段
+     * @param subject   科目
+     * @param areaCode  考区
+     * @param groupId   分组
+     * @param startTime
+     * @param endTime
+     * @return list
+     */
+    @RequestMapping(value = "/selfReport", method = RequestMethod.GET)
+    public List selfReport(
+            @RequestParam Long workId,
+            @RequestParam(required = false) MarkStage stage,
+            @RequestParam(required = false) Subject subject,
+            @RequestParam(required = false) String areaCode,
+            @RequestParam(required = false) Long groupId,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime) {
+        stage = Objects.isNull(stage) ? MarkStage.LEVEL : stage;
+        List list = new ArrayList();
+        if (MarkStage.ROUGH_LEVEL.equals(stage)) {
+            String sql = new StringBuffer("select mtsc.marker_id, mtsc.level self_level, mtsc.level_value self_level_value, mtrl.level, mtrl.level_value from (select * from mark_task_self_check where work_id = ").append(workId).append(" and subject = '").append(subject.name()).append("' and stage = '").append(stage.ordinal()).append("') mtsc join mark_task_rough_level mtrl on mtsc.task_id = mtrl.id").toString();
+            if (Objects.nonNull(startTime)) {
+                sql = sqlUtil.sqlConditionAnd(sql, new String[]{"mtsc.updated_on"}, new String[]{startTime}, new String[]{">="});
+            }
+            if (Objects.nonNull(endTime)) {
+                sql = sqlUtil.sqlConditionAnd(sql, new String[]{"mtsc.updated_on"}, new String[]{endTime}, new String[]{"<="});
+            }
+            list = sqlUtil.execSqlForMap(sql);
+        } else if (MarkStage.LEVEL.equals(stage)) {
+            String sql = new StringBuffer("select mtsc.marker_id, mtsc.level self_level, mtsc.level_value self_level_value, mtrl.level, mtrl.level_value from (select * from mark_task_self_check where work_id = ").append(workId).append(" and subject = '").append(subject.name()).append("' and stage = '").append(stage.ordinal()).append("') mtsc join mark_task_level mtrl on mtsc.task_id = mtrl.id").toString();
+            list = sqlUtil.execSqlForMap(sql);
+        }
+        if (!CollectionUtils.isEmpty(list)) {
+            List<Map> mapList = list;
+            List<Map> finalList = new ArrayList<>();
+            Map<Long, List<Map>> markerMap = mapList.stream().collect(Collectors.groupingBy(m -> Long.parseLong(m.get("marker_id").toString())));
+            for (Map.Entry<Long, List<Map>> entry : markerMap.entrySet()) {
+                Map map = new HashMap();
+                MarkUser markUser = markUserRepo.findOne(entry.getKey());
+                map.put("userName", markUser.getLoginName());
+                OptionalDouble optionalDouble = entry.getValue().stream().mapToInt(m -> Math.abs((int) m.get("self_level_value") - (int) m.get("level_value"))).average();
+                if (optionalDouble.isPresent()) {
+                    map.put("sumCount", new BigDecimal(optionalDouble.getAsDouble()).setScale(1, RoundingMode.HALF_UP));
+                }
+                finalList.add(map);
+            }
+            return finalList;
+        }
+        return list;
+    }
+
     /**
      * 求差值公用
      *

+ 13 - 10
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/pdfExporter.java

@@ -20,12 +20,14 @@ public class pdfExporter {
     @PostMapping
     public void pdf(@RequestBody Map map, HttpServletResponse response) {
         List<String> bases = JSONObject.parseArray(JSONObject.toJSONString(map.get("content")), String.class);
+        String rootPath = null;
         try {
             ArrayList<String> imageUrllist = new ArrayList();
-            File file = new File("d://"+String.valueOf(System.currentTimeMillis()));
+            File file = new File("download" + File.separator + System.currentTimeMillis());
             if (!file.exists()) {
                 file.mkdirs();
             }
+            rootPath = file.getPath();
             for (String base : bases) {
                 String imgFilePath = file.getPath() + File.separator + System.currentTimeMillis() + ".png";
                 boolean convertFlag = PdfUtils.base64ToImage(base, imgFilePath);
@@ -33,14 +35,17 @@ public class pdfExporter {
                     imageUrllist.add(imgFilePath);
                 }
             }
-            if(imageUrllist.size() == 0){
+            if (imageUrllist.size() == 0) {
                 throw new RuntimeException("导出失败");
             }
             String pdfFilePath = file.getPath() + File.separator + System.currentTimeMillis() + ".pdf";
             PdfUtils.imageToPdf(imageUrllist, pdfFilePath);
-            outputFile(response, new File(pdfFilePath), "导出pdf"+System.currentTimeMillis() + ".pdf", file.getPath());
+            outputFile(response, new File(pdfFilePath), "导出pdf" + System.currentTimeMillis() + ".pdf", file.getPath());
         } catch (Exception e) {
             throw new RuntimeException("导出失败");
+        } finally {
+            //下载完毕删除文件
+            delete(rootPath);
         }
     }
 
@@ -69,23 +74,21 @@ public class pdfExporter {
         } catch (IOException e) {
             e.printStackTrace();
         }
-        //下载完毕删除文件
-        delete(rootPath);
     }
 
-    public static void delete(String path){
+    public static void delete(String path) {
         File file = new File(path);
-        if(!file.exists()){
+        if (!file.exists()) {
             return;
         }
-        if(file.isFile()){
+        if (file.isFile()) {
             file.delete();
         }
         File[] files = file.listFiles();
         for (File f : files) {
-            if(f.isFile()){
+            if (f.isFile()) {
                 f.delete();
-            }else{
+            } else {
                 delete(f.getAbsolutePath());
             }
         }

+ 46 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -37,6 +37,7 @@ import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.lang.reflect.Field;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -214,16 +215,25 @@ public class DataUploadService {
             String sliceMD5 = DigestUtils.md5Hex(slicein);
             sheetIn.close();
             slicein.close();
+
+            int firstCollectSize = getFileSize(subject, student);
             if (exist != null) {
                 exist.setManual(isManual);
                 exist.setUploadedOn(new Date());
                 exist.setSheetMD5(sheetMD5);
                 exist.setSliceMD5(sliceMD5);
+
+                int repeatScanSize = ParamCache.collectConfigMap.get(String.valueOf(student.getId())).getRepeatScanSize();
+                // 异常状态为true时,不管后面是否满足size条件,都不更新此状态
+                if (repeatScanSize > 0 && Math.abs(firstCollectSize - exist.getFirstCollectSize()) >= repeatScanSize && !exist.isSizeAbnormal()) {
+                    exist.setSizeAbnormal(true);
+                }
+
                 paperRepo.save(exist);
             } else {
                 ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(student.getWorkId(), subject, student.getAreaCode());
                 Long random = randomUtil.randomPaper(student.getWorkId());
-                Paper paper = new Paper(student.getWorkId(), subject, examQuestion, student, false, random);
+                Paper paper = new Paper(student.getWorkId(), subject, examQuestion, student, false, random, firstCollectSize);
                 paper.setSheetMD5(sheetMD5);
                 paper.setSliceMD5(sliceMD5);
                 paper.setExamRoom(student.getExamRoom());
@@ -521,9 +531,16 @@ public class DataUploadService {
         List<Paper> allPapers = paperRepo.findByWorkIdAndSubjectAndTest(student.getWorkId(), subject, TrialEnum.DEFAULT.getId());
         List<Paper> filterList = allPapers.stream().filter(m -> student.getExamNumber().equals(m.getExamNumber())).collect(Collectors.toList());
         Paper paper = filterList.isEmpty() ? null : filterList.get(0);
+        int firstCollectSize = getFileSize(subject, student);
         if (paper == null) {
             Long random = randomUtil.randomPaper(student.getWorkId());
-            paper = new Paper(student.getWorkId(), subject, examQuestion, student, isManual, random);
+            paper = new Paper(student.getWorkId(), subject, examQuestion, student, isManual, random, firstCollectSize);
+        } else {
+            int repeatScanSize = ParamCache.collectConfigMap.get(String.valueOf(student.getId())).getRepeatScanSize();
+            // 异常状态为true时,不管后面是否满足size条件,都不更新此状态
+            if (repeatScanSize > 0 && Math.abs(firstCollectSize - paper.getFirstCollectSize()) >= repeatScanSize && !paper.isSizeAbnormal()) {
+                paper.setSizeAbnormal(true);
+            }
         }
         paper.setUploadedOn(new Date());
         paper.setManual(isManual);
@@ -787,4 +804,31 @@ public class DataUploadService {
         }
         return sj.toString();
     }
+
+    private int getFileSize(Subject subject, Student student) {
+        File imageFile;
+        if (ParamCache.collectConfigMap.get(String.valueOf(student.getWorkId())).getImageEncrypt() == 1) {
+            //保存裁切原图+文件名加密
+            String imageDir = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject + File.separator + student.getAreaCode();
+            String imageMd5 = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+            imageFile = new File(imageDir + File.separator + imageMd5 + ".jpg");
+        } else {
+            String savePath = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject + File.separator + student.getAreaCode();
+            imageFile = new File(savePath + File.separator + student.getExamNumber() + ".jpg");
+        }
+
+        long size = 0;
+        if (imageFile.exists()) {
+            size = imageFile.length();
+        }
+
+        if (size == 0) {
+            return 0;
+        }
+
+        BigDecimal byteSize = new BigDecimal(size);
+        // 转KB
+        BigDecimal result = byteSize.divide(new BigDecimal(1024), 0, BigDecimal.ROUND_HALF_UP);
+        return result.intValue();
+    }
 }

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

@@ -165,6 +165,16 @@ public class Paper implements Serializable {
      */
     private boolean isAdminMark;
 
+    /**
+     * 首次采集原图大小
+     */
+    private Integer firstCollectSize;
+
+    /**
+     * 大小是否异常
+     */
+    private boolean sizeAbnormal;
+
     public int getTest() {
         return test;
     }
@@ -193,7 +203,7 @@ public class Paper implements Serializable {
         this.randomSeq = randomSeq;
     }
 
-    public Paper(Long workId, Subject subject, ExamQuestion examQuestion, Student student, boolean isManual, Long randomSeq) {
+    public Paper(Long workId, Subject subject, ExamQuestion examQuestion, Student student, boolean isManual, Long randomSeq, int firstCollectSize) {
         this.workId = workId;
         this.studentName = student.getName();
         this.examNumber = student.getExamNumber();
@@ -208,6 +218,8 @@ public class Paper implements Serializable {
         this.uploadedOn = new Date();
         this.isMark = false;
         this.sortNum = 0;
+        this.firstCollectSize = firstCollectSize;
+        this.sizeAbnormal = false;
     }
 
 
@@ -663,4 +675,20 @@ public class Paper implements Serializable {
     public void setAdminMark(boolean adminMark) {
         isAdminMark = adminMark;
     }
+
+    public Integer getFirstCollectSize() {
+        return firstCollectSize;
+    }
+
+    public void setFirstCollectSize(Integer firstCollectSize) {
+        this.firstCollectSize = firstCollectSize;
+    }
+
+    public boolean isSizeAbnormal() {
+        return sizeAbnormal;
+    }
+
+    public void setSizeAbnormal(boolean sizeAbnormal) {
+        this.sizeAbnormal = sizeAbnormal;
+    }
 }

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

@@ -43,8 +43,9 @@ public class ParamSetting implements Serializable {
     public static ParamSetting init(Long workId) {
         ParamSetting paramSetting = new ParamSetting();
         paramSetting.setWorkId(workId);
-        // 粗分档参数
+        // 彩信参数
         CollectConfig collectConfig = new CollectConfig();
+        collectConfig.setRepeatScanSize(0); //重复扫描大小异常(KB)
         collectConfig.setPackageScan(0); //是否整包扫描
         collectConfig.setImageEncrypt(0); //图片是否加密
         collectConfig.setNameRule(0); //图片命名规则
@@ -65,6 +66,7 @@ public class ParamSetting implements Serializable {
         levelConfig.setClearData(0);//是否显示清除当前阅卷数据
         levelConfig.setRoughLevelEnable(0);//是否开启粗分档
         levelConfig.setRemoveHighAndLow(0);//是否开启去高去低再加权评卷
+        levelConfig.setSelfCheckFrequency(0); // 自查卷分发频率
         paramSetting.setLevelConfig(JSON.toJSONString(levelConfig));
 
         // 粗分档参数
@@ -80,6 +82,7 @@ public class ParamSetting implements Serializable {
         roughLevelConfig.setClearData(0);//是否显示清除当前阅卷数据
         roughLevelConfig.setShowStandardPaperManage(1);//是否显示标准卷管理
         roughLevelConfig.setRemoveHighAndLow(0);//是否开启去高去低再加权评卷
+        roughLevelConfig.setSelfCheckFrequency(0); // 自查卷分发频率
         paramSetting.setRoughLevelConfig(JSON.toJSONString(roughLevelConfig));
 
         // 打分参数

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

@@ -5,6 +5,10 @@ package cn.com.qmth.stmms.ms.core.domain.paramsetting;
  */
 public class CollectConfig {
 
+    /**
+     * 重复扫描大小异常
+     */
+    private Integer repeatScanSize;
     /**
      * 是否整包扫描
      */
@@ -25,6 +29,14 @@ public class CollectConfig {
      */
     private Integer paperStage;
 
+    public Integer getRepeatScanSize() {
+        return repeatScanSize;
+    }
+
+    public void setRepeatScanSize(Integer repeatScanSize) {
+        this.repeatScanSize = repeatScanSize;
+    }
+
     public Integer getPackageScan() {
         return packageScan;
     }

+ 13 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/LevelConfig.java

@@ -65,6 +65,11 @@ public class LevelConfig {
      */
     private Integer removeHighAndLow;
 
+    /**
+     * 自查卷分发频率
+     */
+    private Integer selfCheckFrequency;
+
     public Integer getDeviation() {
         return deviation;
     }
@@ -160,4 +165,12 @@ public class LevelConfig {
     public void setRemoveHighAndLow(Integer removeHighAndLow) {
         this.removeHighAndLow = removeHighAndLow;
     }
+
+    public Integer getSelfCheckFrequency() {
+        return selfCheckFrequency;
+    }
+
+    public void setSelfCheckFrequency(Integer selfCheckFrequency) {
+        this.selfCheckFrequency = selfCheckFrequency;
+    }
 }

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

@@ -59,6 +59,10 @@ public class RoughLevelConfig {
      * 是否开启去高去低再加权评卷
      */
     private Integer removeHighAndLow;
+    /**
+     * 自查卷分发频率
+     */
+    private Integer selfCheckFrequency;
 
     public Integer getDeviation() {
         return deviation;
@@ -147,4 +151,12 @@ public class RoughLevelConfig {
     public void setRemoveHighAndLow(Integer removeHighAndLow) {
         this.removeHighAndLow = removeHighAndLow;
     }
+
+    public Integer getSelfCheckFrequency() {
+        return selfCheckFrequency;
+    }
+
+    public void setSelfCheckFrequency(Integer selfCheckFrequency) {
+        this.selfCheckFrequency = selfCheckFrequency;
+    }
 }

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

@@ -0,0 +1,97 @@
+package cn.com.qmth.stmms.ms.core.domain.task;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 评卷员评卷任务(自查)
+ */
+@Entity
+public class MarkTaskMarkerPaper implements Serializable {
+
+    private static final long serialVersionUID = -1;
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @NotNull
+    private Long workId;
+
+    @Enumerated(value = EnumType.STRING)
+    private Subject subject;
+
+    @NotNull
+    @Enumerated(value = EnumType.ORDINAL)
+    private MarkStage stage;
+
+    @NotNull
+    private Long markerId;
+
+    @NotNull
+    private Long taskId;
+
+    public MarkTaskMarkerPaper() {
+    }
+
+    public MarkTaskMarkerPaper(Long workId, Subject subject, MarkStage stage, Long markerId, Long taskId) {
+        this.workId = workId;
+        this.subject = subject;
+        this.stage = stage;
+        this.markerId = markerId;
+        this.taskId = taskId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public Subject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
+
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
+    public Long getMarkerId() {
+        return markerId;
+    }
+
+    public void setMarkerId(Long markerId) {
+        this.markerId = markerId;
+    }
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+}

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

@@ -0,0 +1,151 @@
+package cn.com.qmth.stmms.ms.core.domain.task;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 自查评卷任务
+ */
+@Entity
+public class MarkTaskSelfCheck implements Serializable {
+
+    private static final long serialVersionUID = -1;
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @NotNull
+    private Long workId;
+
+    @Enumerated(value = EnumType.STRING)
+    private Subject subject;
+
+    @NotNull
+    private Long taskId;
+
+    @NotNull
+    private Long markerId;
+
+    @NotNull
+    @Enumerated(value = EnumType.ORDINAL)
+    private MarkStage stage;
+
+    private String level;
+
+    private Integer levelValue;
+
+    private boolean marking;
+
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date createdOn;
+
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date updatedOn;
+
+    public MarkTaskSelfCheck() {
+    }
+
+    public MarkTaskSelfCheck(Long workId, Subject subject, Long taskId, Long markerId, MarkStage stage) {
+        this.workId = workId;
+        this.subject = subject;
+        this.taskId = taskId;
+        this.markerId = markerId;
+        this.stage = stage;
+        this.marking = false;
+        this.createdOn = new Date();
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public Subject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
+    public Long getMarkerId() {
+        return markerId;
+    }
+
+    public void setMarkerId(Long markerId) {
+        this.markerId = markerId;
+    }
+
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public Integer getLevelValue() {
+        return levelValue;
+    }
+
+    public void setLevelValue(Integer levelValue) {
+        this.levelValue = levelValue;
+    }
+
+    public boolean isMarking() {
+        return marking;
+    }
+
+    public void setMarking(boolean marking) {
+        this.marking = marking;
+    }
+
+    public Date getCreatedOn() {
+        return createdOn;
+    }
+
+    public void setCreatedOn(Date createdOn) {
+        this.createdOn = createdOn;
+    }
+
+    public Date getUpdatedOn() {
+        return updatedOn;
+    }
+
+    public void setUpdatedOn(Date updatedOn) {
+        this.updatedOn = updatedOn;
+    }
+}

+ 10 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/MarkerGroupLeader.java

@@ -43,6 +43,8 @@ public class MarkerGroupLeader implements Serializable{
     @NotNull
     private Long markerId;
 
+    private int markingCount;
+
     public Long getId() {
         return id;
     }
@@ -106,4 +108,12 @@ public class MarkerGroupLeader implements Serializable{
     public void setMarkerId(Long markerId) {
         this.markerId = markerId;
     }
+
+    public int getMarkingCount() {
+        return markingCount;
+    }
+
+    public void setMarkingCount(int markingCount) {
+        this.markingCount = markingCount;
+    }
 }

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

@@ -75,7 +75,7 @@ public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, J
      */
     @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
             "FROM mark_task_level t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.`id`,q.`name`,q.area_code ORDER BY q.`id`", nativeQuery = true)
     List<Object[]> countGroupByQuestion(Long markerId, Integer stageId, int test);
 
     /**
@@ -89,7 +89,7 @@ public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, J
      */
     @Query(value = "SELECT t.`marker_id` markerId,a.login_name loginName,t.`marker_name` markerName,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount FROM mark_task_level t  " +
             "  join (select id, login_name from mark_user where id in (:markers)) a on t.marker_id = a.id " +
-            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test and t.marker_id in (:markers) GROUP BY t.marker_id ORDER BY t.marker_id", nativeQuery = true)
+            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test and t.marker_id in (:markers) GROUP BY t.marker_id, a.login_name,t.`marker_name` ORDER BY t.marker_id", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndMarkerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("test") int test, @Param("markers") List<Long> markers);
 
     /**
@@ -104,7 +104,7 @@ public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, J
      */
     @Query(value = "SELECT t.`marker_id` markerId,a.login_name loginName,t.`marker_name` markerName,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount FROM mark_task_level t " +
             "  join (select id, login_name from mark_user where id in (:markers)) a on t.marker_id = a.id " +
-            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test and t.batch_no = :batchNo and t.marker_id in (:markers) GROUP BY t.marker_id ORDER BY t.marker_id", nativeQuery = true)
+            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test and t.batch_no = :batchNo and t.marker_id in (:markers) GROUP BY t.marker_id,a.login_name,t.`marker_name` ORDER BY t.marker_id", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndBatchNoAndMarkerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("test") int test, @Param("batchNo") Long batchNo, @Param("markers") List<Long> markers);
 
     /**
@@ -116,7 +116,7 @@ public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, J
      */
     @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`level` IS NULL or (p.level is not null and p.batch_no is null),1,0)) leftCount,COUNT(p.question_id) totalCount " +
             "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
-            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name, q.`name` ORDER BY q.area_code", nativeQuery = true)
     List<Object[]> listGroupByAreaName(Long workId, String name, int test);
 
     /**

+ 23 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskMarkerPaperRepo.java

@@ -0,0 +1,23 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskMarkerPaper;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+
+/**
+ * 评卷员评卷任务repo
+ */
+public interface MarkTaskMarkerPaperRepo extends JpaRepository<MarkTaskMarkerPaper, Long>, JpaSpecificationExecutor {
+
+    List<MarkTaskMarkerPaper> findByWorkIdAndSubjectAndStageAndMarkerIdAndTaskId(Long workId, Subject subject, MarkStage stage, Long markerId, Long taskId);
+
+    void deleteByWorkIdAndSubjectAndStageAndMarkerId(Long workId, Subject subject, MarkStage stage, Long markerId);
+
+    List<MarkTaskMarkerPaper> findByWorkIdAndSubjectAndStageAndMarkerId(Long workId, Subject subject, MarkStage stage, Long markerId);
+
+    int countByWorkIdAndSubjectAndStageAndMarkerId(Long workId, Subject subject, MarkStage stage, Long markerId);
+}

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

@@ -69,7 +69,7 @@ public interface MarkTaskRoughLevelRepo extends JpaRepository<MarkTaskRoughLevel
      */
     @Query(value = "SELECT t.`marker_id` markerId, a.login_name loginName,t.`marker_name` markerName,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(1) totalCount FROM mark_task_rough_level t   " +
             "  join (select id, login_name from mark_user where id in (:markers)) a on t.marker_id = a.id " +
-            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test GROUP BY t.marker_id, t.`marker_name` ORDER BY t.marker_id", nativeQuery = true)
+            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test GROUP BY t.marker_id,a.login_name, t.`marker_name` ORDER BY t.marker_id", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndMarkerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("test") int test, @Param("markers") List<Long> markers);
 
     /**
@@ -84,7 +84,7 @@ public interface MarkTaskRoughLevelRepo extends JpaRepository<MarkTaskRoughLevel
      */
     @Query(value = "SELECT t.`marker_id` markerId, a.login_name loginName,t.`marker_name` markerName,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount FROM mark_task_rough_level t  " +
             "  join (select id, login_name from mark_user where id in (:markers)) a on t.marker_id = a.id " +
-            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test and t.batch_no = :batchNo GROUP BY t.marker_id ORDER BY t.marker_id", nativeQuery = true)
+            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.is_test = :test and t.batch_no = :batchNo GROUP BY t.marker_id,a.login_name,t.`marker_name` ORDER BY t.marker_id", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndBatchNoAndMarkerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("test") int test, @Param("batchNo") Long batchNo, @Param("markers") List<Long> markers);
 
     /**
@@ -96,7 +96,7 @@ public interface MarkTaskRoughLevelRepo extends JpaRepository<MarkTaskRoughLevel
      */
     @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`rough_level` IS NULL or (p.rough_level is not null and p.rough_batch_no is null),1,0)) leftCount,COUNT(p.question_id) totalCount " +
             "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
-            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name, q.`name` ORDER BY q.area_code", nativeQuery = true)
     List<Object[]> listGroupByAreaName(Long workId, String name, int test);
 
     /**

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

@@ -62,7 +62,7 @@ public interface MarkTaskScoreRepo extends JpaRepository<MarkTaskScore, Long>, J
      */
     @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`score` IS NULL,1,0)) leftCount,COUNT(p.question_id) totalCount " +
             "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
-            "p.work_id = ? and p.subject = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+            "p.work_id = ? and p.subject = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name, q.`name` ORDER BY q.area_code", nativeQuery = true)
     List<Object[]> listGroupByAreaName(Long workId, String name);
 
     /**
@@ -73,7 +73,7 @@ public interface MarkTaskScoreRepo extends JpaRepository<MarkTaskScore, Long>, J
      */
     @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
             "FROM mark_task_score t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false GROUP BY q.`id`,q.`name`,q.area_code ORDER BY q.`id`", nativeQuery = true)
     List<Object[]> countGroupByQuestion(Long markerId, Integer stageId);
 
     /**
@@ -86,7 +86,7 @@ public interface MarkTaskScoreRepo extends JpaRepository<MarkTaskScore, Long>, J
      */
     @Query(value = "SELECT t.`marker_id` markerId,a.login_name loginName,t.`marker_name` markerName,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount FROM mark_task_score t " +
             "  join (select id, login_name from mark_user where id in (:markers)) a on t.marker_id = a.id " +
-            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.`marker_id` in (:markers) GROUP BY t.marker_id ORDER BY t.`marker_id`", nativeQuery = true)
+            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.`marker_id` in (:markers) GROUP BY t.marker_id, a.login_name,t.`marker_name` ORDER BY t.`marker_id`", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndMakerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("markers") List<Long> markers);
 
     /**
@@ -100,7 +100,7 @@ public interface MarkTaskScoreRepo extends JpaRepository<MarkTaskScore, Long>, J
      */
     @Query(value = "SELECT t.`marker_id` markerId,a.login_name loginName,t.`marker_name` markerName,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount FROM mark_task_score t " +
             "  join (select id, login_name from mark_user where id in (:markers)) a on t.marker_id = a.id " +
-            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.batch_no = :batchNo and t.`marker_id` in (:markers) GROUP BY t.marker_id ORDER BY t.`marker_id`", nativeQuery = true)
+            " WHERE t.work_id = :workId and t.subject = :subject and t.stage = :stageId and t.batch_no = :batchNo and t.`marker_id` in (:markers) GROUP BY t.marker_id, a.login_name,t.`marker_name` ORDER BY t.`marker_id`", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndScoreBatchNoAndMakerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("batchNo") Long batchNo, @Param("markers") List<Long> markers);
 
     /**

+ 24 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskSelfCheckRepo.java

@@ -0,0 +1,24 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskSelfCheck;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Date;
+
+/**
+ * 自查卷repo
+ */
+public interface MarkTaskSelfCheckRepo extends JpaRepository<MarkTaskSelfCheck, Long>, JpaSpecificationExecutor {
+
+
+    @Modifying
+    @Query("update MarkTaskSelfCheck m set m.level = ?2, m.levelValue = ?3, m.marking = ?4, m.updatedOn = ?5 where m.id = ?1")
+    void updateMarkingById(Long id, String level, int levelValue, Boolean marking, Date date);
+
+    MarkTaskSelfCheck findByWorkIdAndMarkerIdAndSubjectAndStageAndMarking(Long workId, Long markerId, Subject subject, MarkStage stage, boolean marking);
+}

+ 6 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkerGroupLeaderRepo.java

@@ -4,6 +4,8 @@ import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
 
@@ -18,4 +20,8 @@ public interface MarkerGroupLeaderRepo extends JpaRepository<MarkerGroupLeader,
     List<MarkerGroupLeader> findByWorkIdAndSubjectAndStageAndGroupId(Long workId, Subject subject, MarkStage level, Long groupId);
 
     void deleteByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
+
+    @Modifying
+    @Query("update MarkerGroupLeader m set m.markingCount = ?5 where m.workId = ?1 and m.subject = ?2 and m.stage = ?3 and m.markerId = ?4")
+    void updateMarkingCountByWorkIdAndSubjectAndStageAndMarkerId(Long workId, Subject subject, MarkStage stage, Long markerId, int markingCount);
 }

+ 18 - 0
stmms-ms-main/install/config.ini

@@ -0,0 +1,18 @@
+[app]
+version=3.1.1
+name=֪\u7f8e\u672f\u9605\u5377\u8054\u8003\u7248
+portal=http://localhost:8300/
+module=api
+depend=mysql,nginx
+
+[mysql]
+db=stmms_ms
+before=init.sql
+after=
+
+[upgrade]
+minmum_version=
+
+[api]
+port=8380
+exec=%QMTH_HOME%\common\jdk\bin\java -Xms512m -Xmx1g -Dqmth.home=%QMTH_HOME% -jar mslk.jar

+ 5 - 0
stmms-ms-main/install/mysql/init/init.sql

@@ -0,0 +1,5 @@
+CREATE DATABASE IF NOT EXISTS stmms_ms default character set utf8mb4 collate utf8mb4_general_ci;
+
+GRANT ALL PRIVILEGES  ON `stmms_ms`.* TO 'stmms'@'localhost' IDENTIFIED BY 'stmms';
+
+FLUSH  PRIVILEGES;

+ 614 - 0
stmms-ms-main/install/mysql/init/stmms_ms.sql

@@ -0,0 +1,614 @@
+USE stmms_ms;
+
+-- ----------------------------
+-- Table structure for attachment
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `attachment`  (
+    `id` bigint(64) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NULL DEFAULT NULL,
+    `subject` varchar(10) NULL DEFAULT NULL,
+    `exam_number` varchar(20) NULL DEFAULT NULL,
+    `file_path_local` varchar(512) NOT NULL,
+    `file_name` varchar(128) NOT NULL,
+    `file_type` varchar(8) NULL DEFAULT NULL,
+    `file_ext` varchar(16) NULL DEFAULT NULL,
+    `bucket` varchar(64) NOT NULL,
+    `object_key` varchar(128) NOT NULL,
+    `oss_name` varchar(500) NOT NULL,
+    `oss_status` varchar(20) NOT NULL,
+    `oss_fail_msg` varchar(500) NULL DEFAULT NULL COMMENT '上传oss失败原因',
+    `delete_status` varchar(20) NULL DEFAULT NULL,
+    `time` datetime(0) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for change_level
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `change_level`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NULL DEFAULT NULL,
+    `subject` varchar(50) NULL DEFAULT NULL,
+    `stage` int(2) NULL DEFAULT NULL COMMENT '阶段',
+    `paper_id` bigint(20) NULL DEFAULT NULL,
+    `original_level` varchar(45) NULL DEFAULT NULL COMMENT '原档位',
+    `audit_status` int(1) NULL DEFAULT NULL COMMENT '改档审核:0-申请,1-同意,2-不同意',
+    `create_id` bigint(20) NULL DEFAULT NULL COMMENT '申请改档用户id',
+    `create_date` datetime(0) NULL DEFAULT NULL COMMENT '申请改档时间',
+    `audit_id` bigint(20) NULL DEFAULT NULL COMMENT '审核用户id',
+    `audit_date` datetime(0) NULL DEFAULT NULL COMMENT '审核时间',
+    `suggest_level` varchar(255) NULL DEFAULT NULL,
+    `is_curr` int(11) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '改档记录表';
+
+-- ----------------------------
+-- Table structure for check_data
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `check_data`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作ID',
+    `check_item` varchar(45) NULL DEFAULT NULL COMMENT '数据校验类型',
+    `param_value` int(3) NULL DEFAULT NULL COMMENT '变量值',
+    `status` varchar(45) NULL DEFAULT NULL,
+    `result` tinyint(1) NULL DEFAULT NULL COMMENT '是否校验通过(1:是,0:否)',
+    `error_count` int(7) NULL DEFAULT 0 COMMENT '未通过数量(result=0时,数量大于0)',
+    `content` varchar(200) NULL DEFAULT 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 AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '数据校验日志';
+
+-- ----------------------------
+-- Table structure for check_data_error
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `check_data_error`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `check_data_id` bigint(20) NULL DEFAULT NULL,
+    `exam_number` varchar(45) NULL DEFAULT NULL COMMENT '考号',
+    `student_name` varchar(100) NULL DEFAULT NULL,
+    `error_message` varchar(1000) NULL DEFAULT NULL COMMENT '错误信息',
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx_check_data_id`(`check_data_id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '数据校验错误数据';
+
+-- ----------------------------
+-- Table structure for exam_question
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `exam_question`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `area_code` varchar(255) NOT NULL,
+    `area_name` varchar(255) NULL DEFAULT NULL,
+    `name` varchar(255) NOT NULL,
+    `subject` varchar(50) NOT NULL,
+    `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;
+
+-- ----------------------------
+-- Table structure for exam_score_prop
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `exam_score_prop`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `subject` varchar(50) NULL DEFAULT NULL COMMENT '科目',
+    `exclude` varchar(100) NULL DEFAULT NULL COMMENT '打分阶段配置过滤档位(可选一个或多个档位,多个档位用\",\"号隔开)',
+    `task_sort` varchar(50) NULL DEFAULT NULL COMMENT '打分阶段配置档位排序规则(可选random/paper,为paper时,score.level.exclude置为空)',
+    `enable` bit(1) NULL DEFAULT b'0' COMMENT '打分阶段配置是否启用(为false则不启用打分阶段分档),0:不启用,1:启用',
+    `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作区id',
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '考试打分配置';
+
+-- ----------------------------
+-- Table structure for inspect_range
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `inspect_range`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `condition` int(11) NULL DEFAULT NULL,
+    `enabled` bit(1) NULL DEFAULT NULL,
+    `student_count` int(11) NULL DEFAULT NULL,
+    `type` varchar(255) NULL DEFAULT NULL,
+    `work_id` bigint(20) NULL DEFAULT NULL,
+    `active` bit(1) NOT NULL,
+    `editable` bit(1) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for inspect_student
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `inspect_student`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `exam_number` varchar(255) NOT NULL,
+    `inspect_range_id` bigint(20) NOT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for inspect_task
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `inspect_task`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `created_on` datetime(0) NULL DEFAULT NULL,
+    `inspect_range_id` bigint(20) NOT NULL,
+    `marker_id` bigint(20) NOT NULL,
+    `marker_name` varchar(50) NOT NULL,
+    `question_id` bigint(20) NULL DEFAULT NULL,
+    `subject` varchar(50) NULL DEFAULT NULL,
+    `updated_on` datetime(0) NULL DEFAULT NULL,
+    `work_id` bigint(20) NOT NULL,
+    `paper_id` bigint(20) NOT NULL,
+    `level` varchar(255) NULL DEFAULT NULL,
+    `score` int(11) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `FK4e9mfahf522t4ej4y4yd065dh`(`paper_id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for level
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `level`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `code` varchar(50) NOT NULL,
+    `interval_score` int(11) NOT NULL,
+    `level_type` int(11) NULL DEFAULT NULL,
+    `level_value` int(11) NOT NULL,
+    `max_score` int(11) NOT NULL,
+    `min_score` int(11) NOT NULL,
+    `pt` int(11) NOT NULL,
+    `score_list` varchar(255) NULL DEFAULT NULL,
+    `weight` int(11) NOT NULL,
+    `work_id` bigint(20) NULL DEFAULT NULL,
+    `kdpt` int(11) NOT NULL,
+    `rough_code` varchar(2) NULL DEFAULT NULL COMMENT '粗分档档位',
+    `rough_weight` int(11) NULL DEFAULT NULL COMMENT '粗分档典型值',
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `idx_level_workId_code`(`work_id`, `code`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for mark_log
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_log`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '操作人id',
+    `create_user_name` varchar(100) NULL DEFAULT NULL COMMENT '操作人名字',
+    `create_role` varchar(50) NULL DEFAULT NULL COMMENT '操作人角色',
+    `subject` varchar(50) NULL DEFAULT NULL COMMENT '科目',
+    `exam_number` varchar(50) NULL DEFAULT NULL COMMENT '准考证号',
+    `student_name` varchar(100) NULL DEFAULT NULL COMMENT '学生姓名',
+    `login_time` datetime(0) NULL DEFAULT NULL COMMENT '登录时间(采集专用)',
+    `logout_time` datetime(0) NULL DEFAULT NULL COMMENT '登出时间(采集专用)',
+    `oper_type` int(11) NULL DEFAULT NULL COMMENT '操作类型,1:分档,2:打分,3:回评档位,4:回评分数,5:档位打回,6:档位打回回评,7:一键定档,8:标准卷设置',
+    `oper_name` varchar(100) NULL DEFAULT NULL,
+    `oper_data_before` varchar(255) NULL DEFAULT NULL COMMENT '操作前数据',
+    `oper_data_after` varchar(255) NULL DEFAULT NULL COMMENT '操作后数据',
+    `create_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间',
+    `work_id` bigint(20) NULL DEFAULT NULL COMMENT '考区id',
+    `paper_id` bigint(20) NULL DEFAULT NULL COMMENT '试卷id',
+    `remark` varchar(500) NULL DEFAULT NULL COMMENT '备注',
+    `test` int(4) NULL DEFAULT 0,
+    `stage` int(1) NULL DEFAULT NULL COMMENT '试卷阶段,0:初始,1:分档,2:打分',
+    `work_name` varchar(255) NULL DEFAULT NULL,
+    `stage_name` varchar(255) NULL DEFAULT NULL,
+    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 = utf8mb4 COMMENT = '操作日志';
+
+-- ----------------------------
+-- Table structure for mark_subject
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_subject`  (
+    `id` varchar(50) NOT NULL,
+    `work_id` bigint(20) NULL DEFAULT NULL,
+    `collect_config` varchar(255) NULL DEFAULT NULL,
+    `name` varchar(255) NULL DEFAULT NULL,
+    `stage` int(11) NULL DEFAULT NULL,
+    `total_score` int(11) NOT NULL,
+    `sample_count` int(11) NOT NULL DEFAULT 100,
+    `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
+    `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,
+    INDEX `FK1tvc2mil1ebqgt08912t4hxqw`(`work_id`) USING BTREE
+    ) ENGINE = InnoDB CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for mark_task_job
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_task_job`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `data_object` varchar(4000) NULL DEFAULT NULL COMMENT 'object',
+    `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+    `status` bit(1) NULL DEFAULT b'0' COMMENT '状态,0:未记录,1:已记录',
+    `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 = utf8mb4 COMMENT = '定时任务调度表';
+
+-- ----------------------------
+-- Table structure for mark_task_level
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_task_level`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `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,
+    `marker_name` varchar(50) NOT NULL,
+    `origin_level` varchar(255) NULL DEFAULT NULL,
+    `question_id` bigint(20) NULL DEFAULT NULL,
+    `result` varchar(50) NULL DEFAULT NULL,
+    `level` varchar(45) NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
+    `stage` int(11) NOT NULL,
+    `subject` varchar(50) NULL DEFAULT NULL,
+    `created_on` datetime(0) NULL DEFAULT NULL,
+    `updated_on` datetime(0) NULL DEFAULT NULL,
+    `random_seq` int(11) NULL DEFAULT NULL,
+    `secret_number` varchar(255) NULL DEFAULT NULL,
+    `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
+    `is_active` bit(1) NULL DEFAULT b'0' COMMENT '是否激活',
+    `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
+    `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
+    `is_change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '是否改档',
+    `serial_number` varchar(10) NULL DEFAULT NULL COMMENT '叫号序号',
+    `display_number` int(11) NULL DEFAULT NULL,
+    `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
+    `deviation_direction` varchar(10) NULL DEFAULT NULL COMMENT '偏差方向',
+    `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
+    INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
+    INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for mark_task_marker_paper
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_task_marker_paper` (
+      `id` BIGINT(10) NOT NULL AUTO_INCREMENT,
+      `work_id` BIGINT(10) NOT NULL COMMENT '工作ID',
+      `subject` VARCHAR(2) NOT NULL COMMENT '科目',
+      `stage` INT(11) NULL COMMENT '阶段',
+      `marker_id` BIGINT(10) NOT NULL COMMENT '评卷员ID',
+      `task_id` BIGINT(10) NOT NULL COMMENT '评卷任务ID',
+      PRIMARY KEY (`id`),
+      INDEX `ix_1` (`work_id` ASC, `subject` ASC, `stage` ASC,  `marker_id` ASC)
+)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '评卷员评卷任务表(自查)';
+
+-- ----------------------------
+-- Table structure for mark_task_rough_level
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_task_rough_level`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `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,
+    `marker_name` varchar(50) NOT NULL,
+    `origin_level` varchar(10) NULL DEFAULT NULL,
+    `question_id` bigint(20) NULL DEFAULT NULL,
+    `result` varchar(2) NULL DEFAULT NULL,
+    `level` varchar(2) NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
+    `stage` int(11) NOT NULL,
+    `subject` varchar(50) NULL DEFAULT NULL,
+    `created_on` datetime(0) NULL DEFAULT NULL,
+    `updated_on` datetime(0) NULL DEFAULT NULL,
+    `random_seq` int(11) NULL DEFAULT NULL,
+    `secret_number` varchar(255) NULL DEFAULT NULL,
+    `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
+    `is_active` bit(1) NULL DEFAULT b'0' COMMENT '是否激活',
+    `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
+    `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
+    `is_change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '是否改档',
+    `serial_number` varchar(10) NULL DEFAULT NULL COMMENT '叫号序号',
+    `display_number` int(11) NULL DEFAULT NULL,
+    `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
+    `deviation_direction` varchar(10) NULL DEFAULT NULL COMMENT '偏差方向',
+    `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
+    INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
+    INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for mark_task_score
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_task_score`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `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,
+    `marker_name` varchar(50) NOT NULL,
+    `origin_level` varchar(255) NULL DEFAULT NULL,
+    `question_id` bigint(20) NULL DEFAULT NULL,
+    `result` varchar(50) NULL DEFAULT NULL,
+    `level` varchar(45) NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
+    `stage` int(11) NOT NULL,
+    `subject` varchar(50) NULL DEFAULT NULL,
+    `created_on` datetime(0) NULL DEFAULT NULL,
+    `updated_on` datetime(0) NULL DEFAULT NULL,
+    `random_seq` int(11) NULL DEFAULT NULL,
+    `secret_number` varchar(255) NULL DEFAULT NULL,
+    `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
+    `is_active` bit(1) NULL DEFAULT b'0' COMMENT '是否激活',
+    `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
+    `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
+    `is_change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '是否改档',
+    `serial_number` varchar(10) NULL DEFAULT NULL COMMENT '叫号序号',
+    `display_number` int(11) NULL DEFAULT NULL,
+    `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
+    `deviation_direction` varchar(10) NULL DEFAULT NULL COMMENT '偏差方向',
+    `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
+    INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
+    INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for mark_task_self_check
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_task_self_check` (
+    `id` BIGINT(10) NOT NULL,
+    `work_id` BIGINT(10) NOT NULL COMMENT '工作ID',
+    `subject` VARCHAR(10) NOT NULL COMMENT '科目',
+    `task_id` BIGINT(10) NOT NULL COMMENT '评卷任务ID',
+    `marker_id` BIGINT(10) NULL COMMENT '评卷员ID',
+    `stage` INT(11) NULL COMMENT '阶段',
+    `level` VARCHAR(1) NULL COMMENT '自查评卷档位',
+    `level_value` INT(1) NULL COMMENT '档位值',
+    `marking` BIT(1) NULL COMMENT '是否已评',
+    `created_on` DATETIME NULL COMMENT '创建时间',
+    `updated_on` DATETIME NULL COMMENT '修改时间',
+    PRIMARY KEY (`id`),
+    INDEX `ix_1` (`work_id` ASC, `task_id` ASC, `marker_id` ASC, `stage` ASC)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '自查任务表';
+
+-- ----------------------------
+-- Table structure for mark_user
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `mark_user`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NOT NULL,
+    `subject` varchar(50) NULL DEFAULT NULL,
+    `name` varchar(255) NULL DEFAULT NULL,
+    `password` varchar(255) NULL DEFAULT NULL,
+    `role` varchar(255) NULL DEFAULT NULL,
+    `enabled` bit(1) NOT NULL,
+    `login_name` varchar(50) NOT NULL,
+    `pw_changed_count` int(11) NOT NULL,
+    `session_id` varchar(255) NULL DEFAULT NULL,
+    `group_id` bigint(20) NULL DEFAULT NULL,
+    `mark_right` int(11) NULL DEFAULT NULL,
+    `inspect_sc` bit(1) NULL DEFAULT NULL,
+    `inspect_sm` bit(1) NULL DEFAULT NULL,
+    `inspect_sx` bit(1) NULL DEFAULT NULL,
+    `weight` double NULL DEFAULT NULL,
+    `one_click_level` bit(1) NULL DEFAULT b'0' COMMENT '科组长是否开启一键定档',
+    `standard_volume` bit(1) NOT NULL,
+    `level_callback` bit(1) NOT NULL,
+    `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
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for marker_group
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `marker_group`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NOT NULL,
+    `name` varchar(255) NULL DEFAULT NULL,
+    `subject` varchar(50) NOT NULL,
+    `stage` int(1) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for marker_group_leader
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `marker_group_leader`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NOT NULL COMMENT '工作ID',
+    `subject` varchar(50) 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) NOT NULL,
+    `marking_count` INT(10) NULL DEFAULT 0 COMMENT '评卷数量(达到自查卷分发频率值时,清零后再自增。若频率值为0,继续累加)',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for marker_group_student
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `marker_group_student`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NOT NULL,
+    `subject` varchar(10) NULL DEFAULT NULL,
+    `stage` int(1) NOT NULL COMMENT '所属阶段',
+    `group_id` bigint(20) NOT NULL COMMENT '分组ID',
+    `paper_id` bigint(20) NULL DEFAULT NULL COMMENT '试卷ID',
+    `question_id` bigint(20) NULL DEFAULT NULL COMMENT '考区ID',
+    `exam_number` varchar(50) NULL DEFAULT NULL,
+    `name` varchar(50) NULL DEFAULT NULL,
+    `area_code` varchar(45) NULL DEFAULT NULL,
+    `area_name` varchar(255) NULL DEFAULT NULL,
+    `exam_room` varchar(255) NULL DEFAULT NULL,
+    `school` varchar(255) NULL DEFAULT NULL,
+    `source_name` varchar(225) NULL DEFAULT NULL COMMENT '生源地',
+    `batch_no` bigint(20) NULL DEFAULT NULL COMMENT '批次号',
+    `used` tinyint(1) NULL DEFAULT NULL COMMENT '已否已发任务',
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for message
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `message`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NULL DEFAULT NULL COMMENT '工作ID',
+    `subject` varchar(10) NULL DEFAULT NULL COMMENT '科目',
+    `stage` int(2) NULL DEFAULT NULL COMMENT '阶段',
+    `send_user_id` bigint(20) NULL DEFAULT NULL COMMENT '发件人ID',
+    `send_user_name` varchar(45) NULL DEFAULT NULL COMMENT '发件人名称',
+    `content` varchar(500) NULL DEFAULT NULL COMMENT '消息内容',
+    `receive_user` varchar(500) NULL DEFAULT NULL COMMENT '收件人集合json',
+    `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '消息管理';
+
+-- ----------------------------
+-- Table structure for message_receive
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `message_receive`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `message_id` bigint(20) NULL DEFAULT NULL,
+    `receive_user_id` bigint(20) NULL DEFAULT NULL,
+    `is_read` tinyint(1) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE,
+    INDEX `FKsg879qydqr4dx6r0khxfkkick`(`message_id`) USING BTREE,
+    CONSTRAINT `message_receive_ibfk_1` FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+    CONSTRAINT `message_receive_ibfk_2` FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '消息发送的用户';
+
+-- ----------------------------
+-- Table structure for paper
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `paper`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NOT NULL,
+    `subject` varchar(50) NOT NULL,
+    `exam_number` varchar(50) NOT NULL,
+    `student_name` varchar(50) NOT NULL,
+    `area_code` varchar(50) NOT NULL,
+    `is_arbitrated` bit(1) NOT NULL,
+    `is_manual` bit(1) NOT NULL,
+    `is_rejected` bit(1) NOT NULL,
+    `is_tagged` bit(1) NOT NULL,
+    `level` varchar(255) NULL DEFAULT NULL,
+    `mark_by_leader` bit(1) NOT NULL,
+    `marked_logic` bit(1) NOT NULL,
+    `question_id` bigint(20) NOT NULL,
+    `question_name` varchar(255) NOT NULL,
+    `redo_level` varchar(255) NULL DEFAULT NULL,
+    `score` double NULL DEFAULT NULL,
+    `secret_number` varchar(255) NULL DEFAULT NULL,
+    `updated_on` datetime(0) NULL DEFAULT NULL,
+    `uploaded_count` int(11) NOT NULL,
+    `uploaded_on` datetime(0) NULL DEFAULT NULL,
+    `inspect_range` bigint(20) NULL DEFAULT NULL,
+    `inspect_score` double NULL DEFAULT NULL,
+    `source_name` varchar(255) NULL DEFAULT NULL,
+    `inspect_level` varchar(255) NULL DEFAULT NULL,
+    `inspector` bigint(20) NULL DEFAULT NULL,
+    `is_rough_sample` bit(1) NULL DEFAULT NULL COMMENT '粗分档标准卷',
+    `is_sample` bit(1) NOT NULL,
+    `sheet_md5` varchar(255) NULL DEFAULT NULL,
+    `slice_md5` varchar(255) NULL DEFAULT NULL,
+    `random_seq` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
+    `is_missing` bit(1) NOT NULL,
+    `exam_room` varchar(255) NULL DEFAULT NULL,
+    `is_test` int(1) NOT NULL DEFAULT 0 COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
+    `rough_batch_no` bigint(45) NULL DEFAULT NULL COMMENT '粗分档批次号',
+    `batch_no` bigint(45) NULL DEFAULT NULL COMMENT '批次号',
+    `score_batch_no` bigint(45) NULL DEFAULT NULL COMMENT '打分任务发布批次号',
+    `is_shift` bit(1) NULL DEFAULT b'0' COMMENT '是否改档',
+    `is_shift_score` bit(1) NULL DEFAULT b'0' COMMENT '是否改档打分',
+    `is_rough_one_click` bit(1) NULL DEFAULT b'0',
+    `is_one_click` bit(1) NULL DEFAULT b'0' COMMENT '是否一键定档',
+    `is_rejected_by_leader` bit(1) NULL DEFAULT b'0' COMMENT '是否科组长打回',
+    `is_relate` bit(1) NULL DEFAULT b'0' COMMENT '是否关联试卷',
+    `sort_num` int(11) NULL DEFAULT 0 COMMENT '排序值',
+    `scan_user_id` bigint(20) NULL DEFAULT NULL COMMENT '采集员ID',
+    `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
+    `rough_level` varchar(2) NULL DEFAULT NULL,
+    `redo_rough_level` varchar(2) NULL DEFAULT NULL,
+    `is_admin_mark` bit(1) NULL DEFAULT b'0' COMMENT '管理员标记',
+    `first_collect_size` INT NULL COMMENT '首次采集原图大小(KB)',
+    `size_abnormal` BIT(1) NULL DEFAULT 0 COMMENT '大小是否异常(1:异常)',
+    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 = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for param_setting
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `param_setting`  (
+    `id` bigint(10) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(10) NULL DEFAULT NULL COMMENT '工作id',
+    `collect_config` varchar(1000) NULL DEFAULT NULL COMMENT '采集规则参数',
+    `level_config` varchar(1000) NULL DEFAULT NULL COMMENT '细分档规则参数',
+    `rough_level_config` varchar(1000) NULL DEFAULT NULL COMMENT '粗分档规则参数',
+    `score_config` varchar(500) NULL DEFAULT NULL COMMENT '打分规则参数',
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '参数设置';
+
+-- ----------------------------
+-- Table structure for student
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `student`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NULL DEFAULT NULL,
+    `exam_number` varchar(50) NULL DEFAULT NULL,
+    `name` varchar(50) NULL DEFAULT NULL,
+    `area_code` varchar(255) NULL DEFAULT NULL,
+    `area_name` varchar(255) NULL DEFAULT NULL,
+    `exam_room` varchar(255) NULL DEFAULT NULL,
+    `school` varchar(255) NULL DEFAULT NULL COMMENT '学校',
+    `is_absent` bit(1) NOT NULL,
+    `upload_status` varchar(255) NULL DEFAULT NULL,
+    `source_name` varchar(255) NULL DEFAULT NULL,
+    `relate_exam_number` varchar(50) NULL DEFAULT NULL COMMENT '关联考号',
+    PRIMARY KEY (`id`) USING BTREE,
+    UNIQUE INDEX `exam_number`(`exam_number`, `work_id`) USING BTREE,
+    INDEX `idx_work_id`(`work_id`) USING BTREE,
+    INDEX `idx_student_name`(`name`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;
+
+-- ----------------------------
+-- Table structure for task_publish_setting
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `task_publish_setting`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `work_id` bigint(20) NULL DEFAULT NULL,
+    `question_id` bigint(45) NULL DEFAULT NULL COMMENT '考区',
+    `subject` varchar(50) NULL DEFAULT NULL,
+    `code` varchar(45) NULL DEFAULT NULL COMMENT '档位',
+    `total_count` int(11) NULL DEFAULT NULL COMMENT '总数量',
+    `success_count` int(11) NULL DEFAULT NULL COMMENT '已评数量',
+    `wait_count` int(11) NULL DEFAULT NULL COMMENT '待评数量',
+    `sort_rule` int(1) NULL DEFAULT NULL COMMENT '排序规则:0-乱序,1-定序',
+    `display_number` int(1) NULL DEFAULT NULL COMMENT '是否显示序号:0-否,1-是',
+    `task_count` int(11) NULL DEFAULT NULL COMMENT '本次任务数',
+    `batch_no` bigint(45) NULL DEFAULT NULL,
+    `publish_count` int(3) NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '发布打分任务';
+
+-- ----------------------------
+-- Table structure for work
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `work`  (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `name` varchar(255) NULL DEFAULT NULL,
+    `active` bit(1) NOT NULL,
+    `created_on` date NULL DEFAULT NULL,
+    PRIMARY KEY (`id`) USING BTREE
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4;

+ 37 - 0
stmms-ms-main/install/mysql/upgrade/3.1.1.sql

@@ -0,0 +1,37 @@
+USE stmms_ms;
+
+ALTER TABLE `paper`
+    ADD COLUMN `first_collect_size` INT NULL COMMENT '首次采集原图大小(KB)' AFTER `is_admin_mark`,
+    ADD COLUMN `size_abnormal` BIT(1) NULL DEFAULT 0 COMMENT '大小是否异常(1:异常)' AFTER `first_collect_size`;
+
+CREATE TABLE `mark_task_self_check` (
+       `id` BIGINT(10) NOT NULL,
+       `work_id` BIGINT(10) NOT NULL COMMENT '工作ID',
+       `subject` VARCHAR(10) NOT NULL COMMENT '科目',
+       `task_id` BIGINT(10) NOT NULL COMMENT '评卷任务ID',
+       `marker_id` BIGINT(10) NULL COMMENT '评卷员ID',
+       `stage` INT(11) NULL COMMENT '阶段',
+       `level` VARCHAR(1) NULL COMMENT '自查评卷档位',
+       `level_value` INT(1) NULL COMMENT '档位值',
+       `marking` BIT(1) NULL COMMENT '是否已评',
+       `created_on` DATETIME NULL COMMENT '创建时间',
+       `updated_on` DATETIME NULL COMMENT '修改时间',
+       PRIMARY KEY (`id`),
+       INDEX `ix_1` (`work_id` ASC, `task_id` ASC, `marker_id` ASC, `stage` ASC)
+    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '自查任务表';
+
+
+CREATE TABLE `mark_task_marker_paper` (
+         `id` BIGINT(10) NOT NULL AUTO_INCREMENT,
+         `work_id` BIGINT(10) NOT NULL COMMENT '工作ID',
+         `subject` VARCHAR(2) NOT NULL COMMENT '科目',
+         `stage` INT(11) NULL COMMENT '阶段',
+         `marker_id` BIGINT(10) NOT NULL COMMENT '评卷员ID',
+         `task_id` BIGINT(10) NOT NULL COMMENT '评卷任务ID',
+         PRIMARY KEY (`id`),
+         INDEX `ix_1` (`work_id` ASC, `subject` ASC, `stage` ASC,  `marker_id` ASC)
+        )ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '评卷员评卷任务表(自查)';
+
+
+ALTER TABLE `marker_group_leader`
+    ADD COLUMN `marking_count` INT(10) NULL DEFAULT 0 COMMENT '评卷数量(达到自查卷分发频率值时,清零后再自增。若频率值为0,继续累加)' AFTER `group_name`;

+ 20 - 0
stmms-ms-main/install/nginx/mslk.conf

@@ -0,0 +1,20 @@
+server {
+        listen 8300;
+
+        location /api/ {
+            proxy_pass http://127.0.0.1:8380;
+            proxy_read_timeout      3600;
+            proxy_set_header Host   $http_host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        }
+
+        location  / {
+           root  ../../mslk/web;
+           index  index.html index.htm;
+        }
+
+	location /upload/ {
+            alias ../../mslk/upload/;
+        }
+}

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

@@ -1,88 +0,0 @@
-db.host=localhost
-db.port=3306
-db.dbName=mslk-zxh
-db.userName=root
-db.password=12345678
-
-spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.dbName}?useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=${db.userName}
-spring.datasource.password=${db.password}
-
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-spring.datasource.test-on-borrow=true
-
-#redis
-#spring.redis.host=192.168.199.102
-#spring.redis.port=32768
-
-server.port=9000
-server.compression.enabled=true
-server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
-
-
-logging.file=./logs/sys.log
-#logging.level.root???? error
-logging.level.root=info
-logging.level.org.springframework=info
-logging.level.org.hibernate=info
-
-spring.jpa.show-sql=true
-spring.jpa.hibernate.ddl-auto=validate
-
-spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
-spring.cache.ehcache.config=classpath:ehcache.xml
-
-
-spring.http.multipart.max-file-size=10Mb
-app.config.roundUp=true
-app.config.deviation=4
-app.config.majority=true
-#??????????????,???????admin,admin1,admin2
-app.admin.loginName=admin,xf,zj
-#???????
-app.admin.password=123456
-
-#????
-#sys.config.locationTempDir=data\\msyj\\temp
-#server.tomcat.basedir=\\data\\msyj\\temp
-
-#??????
-sys.config.localhostPath=/upload
-sys.config.imageDir=upload/images
-sys.config.thumbDir=upload/thumbs
-sys.config.sheetDir=upload/sheet
-sys.config.watermark=upload/watermark
-#????????
-sys.open.imageEnc=false
-#???????????
-sys.open.customSubject=false
-
-sys.config.compression.percent=60
-sys.config.imageServer.port=9000
-sys.config.imageServer.ip=localhost
-sys.config.imageServer.aliyunOss=false
-sys.config.imageServer.dir=ms-test
-
-#??????
-web.upload-path=/Users/xiaofei/qmth/static-web/mslk/web/
-spring.mvc.static-path-pattern=/**
-spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${sys.config.localhostPath},file:${web.upload-path}
-
-app.snapshot.initsql=/Users/yuanpan/dumps/stmms-ms-2-init.sql
-app.snapshot.fdsql=/Users/yuanpan/dumps/stmms-ms-2-fendang.sql
-app.snapshot.dfsql=/Users/yuanpan/dumps/stmms-ms-2-dafen.sql
-app.snapshot.fpsql=/Users/yuanpan/dumps/stmms-ms-2-fuping.sql
-
-#???OSS??
-aliyun.oss.endpointInner=http://oss-cn-beijing-internal.aliyuncs.com
-aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
-aliyun.oss.accessKeyId=LTAIhiBoG7CsLnoy
-aliyun.oss.accessKeySecret=HqTvxO1RYiPT3SiZKv4VeoXab4AHjz
-aliyun.oss.bucket=epcc-test
-aliyun.oss.url=https://${aliyun.oss.bucket}.oss-cn-beijing.aliyuncs.com
-aliyun.oss.imageDir=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/images/ -u
-aliyun.oss.thumbDir=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/thumbs/ -u
-aliyun.oss.sheetDir=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/sheet/ -u
-aliyun.oss.watermark=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/watermark/ -u
-aliyun.oss.util=/Users/king/ossutilmac64 cp -r

+ 0 - 68
stmms-ms-main/src/main/resources/application-gz.properties

@@ -1,68 +0,0 @@
-spring.datasource.url=jdbc:mysql://127.0.0.1:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=root
-spring.datasource.password=1234
-
-#spring.datasource.url=jdbc:mysql://192.168.1.74:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
-#spring.datasource.username=root
-#spring.datasource.password=root
-
-
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-spring.datasource.test-on-borrow=true
-
-#redis
-#spring.redis.host=192.168.199.102
-#spring.redis.port=32768
-
-server.port=9000
-server.compression.enabled=true
-server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
-
-
-logging.file=./logs/sys.log
-logging.level.org.springframework=ERROR
-logging.level.org.hibernate=ERROR
-
-spring.jpa.show-sql=false
-spring.jpa.hibernate.ddl-auto=update
-
-
-spring.http.multipart.max-file-size=10Mb
-
-#表示隔多少档位才会出现仲裁
-app.config.deviation=2
-#超级管理员账号
-app.admin.loginName=admin-cy
-#超级管理员密码
-app.admin.password=123456
-#采集端-超级管理员账号
-app.client.loginName=client-cy
-#采集端-超级管理员密码
-app.client.password=123456
-#大图存放目录
-sys.config.imageDir=D:\\stmms-ms\\images
-#缩略图存放目录
-sys.config.thumbDir=D:\\stmms-ms\\thumbs
-#分数水印图存放目录
-sys.config.watermark=D:\\stmms-ms\\watermark
-#图片压缩比
-sys.config.compression.percent=60
-#图片服务器端口
-sys.config.imageServer.port=9000
-#图片服务器ip
-sys.config.imageServer.ip=192.168.1.100
-#是否开启样卷功能
-sys.config.yangjuan=false
-#分档的试卷随机捆大小
-sys.config.random-bundle-size=50
-
-
-#前端静态资源目录
-web.upload-path=D:\\stmms-ms\\
-spring.mvc.static-path-pattern=/**
-spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
-
-app.snapshot.initsql=D:\\stmms-ms\\stmms-ms-2-init.sql
-app.snapshot.fdsql=D:\\stmms-ms\\stmms-ms-2-fendang.sql
-app.snapshot.dfsql=D:\\stmms-ms\\stmms-ms-2-dafen.sql
-app.snapshot.fpsql=D:\\stmms-ms\\stmms-ms-2-fuping.sql

+ 0 - 58
stmms-ms-main/src/main/resources/application-qmth.properties

@@ -1,58 +0,0 @@
-spring.datasource.url=jdbc:mysql://127.0.0.1:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=root
-spring.datasource.password=1234
-
-#spring.datasource.url=jdbc:mysql://192.168.1.74:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
-#spring.datasource.username=root
-#spring.datasource.password=root
-
-
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-spring.datasource.test-on-borrow=true
-
-#redis
-#spring.redis.host=192.168.199.102
-#spring.redis.port=32768
-
-server.port=9000
-server.compression.enabled=true
-server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
-
-
-logging.file=./logs/sys.log
-logging.level.org.springframework=ERROR
-logging.level.org.hibernate=ERROR
-
-spring.jpa.show-sql=false
-spring.jpa.hibernate.ddl-auto=update
-
-
-spring.http.multipart.max-file-size=10Mb
-
-app.config.deviation=2
-app.admin.loginName=admin-cy
-app.admin.password=123456
-#采集端-超级管理员账号
-app.client.loginName=client-cy
-#采集端-超级管理员密码
-app.client.password=123456
-
-sys.config.imageDir=D:\\stmms-ms\\images
-sys.config.thumbDir=D:\\stmms-ms\\thumbs
-#sys.config.imageDir=.\\static\\images
-#sys.config.thumbDir=.\\static\\thumbs
-sys.config.compression.percent=60
-#sys.config.imageServer.port=3000
-sys.config.imageServer.port=9000
-sys.config.imageServer.ip=192.168.1.100
-
-
-#前端目录
-web.upload-path=D:\\stmms-ms\\
-spring.mvc.static-path-pattern=/**
-spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
-
-app.snapshot.initsql=D:\\stmms-ms\\stmms-ms-2-init.sql
-app.snapshot.fdsql=D:\\stmms-ms\\stmms-ms-2-fendang.sql
-app.snapshot.dfsql=D:\\stmms-ms\\stmms-ms-2-dafen.sql
-app.snapshot.fpsql=D:\\stmms-ms\\stmms-ms-2-fuping.sql

+ 0 - 54
stmms-ms-main/src/main/resources/application-test.properties

@@ -1,54 +0,0 @@
-spring.datasource.url=jdbc:mysql://127.0.0.1:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=root
-spring.datasource.password=1234
-
-#spring.datasource.url=jdbc:mysql://192.168.1.74:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
-#spring.datasource.username=root
-#spring.datasource.password=root
-
-
-spring.datasource.validation-query=SELECT 1 FROM DUAL
-spring.datasource.test-on-borrow=true
-
-#redis
-#spring.redis.host=192.168.199.102
-#spring.redis.port=32768
-
-server.port=8080
-server.compression.enabled=true
-server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
-
-
-logging.file=./logs/sys.log
-logging.level.org.springframework=ERROR
-logging.level.org.hibernate=ERROR
-
-spring.jpa.show-sql=false
-spring.jpa.hibernate.ddl-auto=update
-
-
-spring.http.multipart.max-file-size=10Mb
-
-app.config.deviation=2
-app.admin.loginName=admin-cy
-app.admin.password=123456
-
-sys.config.imageDir=/home/xuhuaq/stmms-ms/images
-sys.config.thumbDir=/home/xuhuaq/stmms-ms/thumbs
-#sys.config.imageDir=.\\static\\images
-#sys.config.thumbDir=.\\static\\thumbs
-sys.config.compression.percent=60
-#sys.config.imageServer.port=3000
-sys.config.imageServer.port=8080
-sys.config.imageServer.ip=118.122.113.10
-
-
-#前端目录
-web.upload-path=/home/xuhuaq/stmms-ms/
-spring.mvc.static-path-pattern=/**
-spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
-
-app.snapshot.initsql=/home/xuhuaq/stmms-ms/stmms-ms-2-init.sql
-app.snapshot.fdsql=/home/xuhuaq/stmms-ms/stmms-ms-2-fendang.sql
-app.snapshot.dfsql=/home/xuhuaq/stmms-ms/stmms-ms-2-dafen.sql
-app.snapshot.fpsql=/home/xuhuaq/stmms-ms/stmms-ms-2-fuping.sql

+ 68 - 39
stmms-ms-main/src/main/resources/application.properties

@@ -1,53 +1,82 @@
-spring.profiles.active=dev
-spring.datasource.url=jdbc:mysql://127.0.0.1:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=root
-spring.datasource.password=root
+server.port=9000
+
+db.host=localhost
+db.port=3306
+db.dbName=msyj-local-3.1.1
+db.userName=root
+db.password=12345678
+
+spring.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.dbName}?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.username=${db.userName}
+spring.datasource.password=${db.password}
 
 spring.datasource.validation-query=SELECT 1 FROM DUAL
 spring.datasource.test-on-borrow=true
 
-#redis
-#spring.redis.host=192.168.199.102a
-#spring.redis.port=32768
-
-server.tomcat.max-threads=256
-server.port=8080
 server.compression.enabled=true
-server.compression.mime-types:application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
+server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
+
+
 logging.file=./logs/sys.log
+#logging.level.root error
 logging.level.root=info
 logging.level.org.springframework=info
 logging.level.org.hibernate=info
+
 spring.jpa.show-sql=true
-spring.jpa.hibernate.ddl-auto=update
+spring.jpa.hibernate.ddl-auto=validate
+
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+spring.cache.ehcache.config=classpath:ehcache.xml
+
+
 spring.http.multipart.max-file-size=10Mb
-#\u8868\u793a\u9694\u591a\u5c11\u6863\u4f4d\u624d\u4f1a\u51fa\u73b0\u4ef2\u88c1
-app.config.deviation=2
-#\u8868\u793a\u662f\u5426\u542f\u7528\u5b9a\u6863\u65f6\u6570\u91cf\u5927\u4e8e\u534a\u6570\uff0c\u76f4\u63a5\u5b9a\u6863(\u534a\u6570\u5b9a\u6863)
-app.config.majority = true
-#\u8d85\u7ea7\u7ba1\u7406\u5458\u8d26\u53f7
-app.admin.loginName=admin-cy
-#\u8d85\u7ea7\u7ba1\u7406\u5458\u5bc6\u7801
+app.config.roundUp=true
+app.config.deviation=4
+app.config.majority=true
+#?????? admin,admin1,admin2
+app.admin.loginName=admin
+#?????
 app.admin.password=123456
-#\u5927\u56fe\u5b58\u653e\u76ee\u5f55
-sys.config.imageDir=/Users/ting.yin/Downloads/meishu/images
-#\u7f29\u7565\u56fe\u5b58\u653e\u76ee\u5f55
-sys.config.thumbDir=/Users/ting.yin/Downloads/meishu/thumbs
-#\u5206\u6570\u6c34\u5370\u56fe\u5b58\u653e\u76ee\u5f55
-sys.config.watermark=/home/xuhuaq/stmms-ms/watermark
-#sys.config.imageDir=.\\static\\images
-#sys.config.thumbDir=.\\static\\thumbs
-#\u56fe\u7247\u538b\u7f29\u6bd4
-sys.config.compression.percent=60
-#sys.config.imageServer.port=3000
-#\u56fe\u7247\u670d\u52a1\u5668\u7aef\u53e3
-sys.config.imageServer.port=8080
-#\u56fe\u7247\u670d\u52a1\u5668ip
-sys.config.imageServer.ip=118.122.113.10
+
+#????
+sys.config.localhostPath=/upload
+sys.config.imageDir=upload/images
+sys.config.thumbDir=upload/thumbs
+sys.config.sheetDir=upload/sheet
+sys.config.watermark=upload/watermark
+#??????
+sys.open.imageEnc=false
+#customSubject
+sys.open.customSubject=false
+
 sys.config.yangjuan=false
-#\u5206\u6863\u7684\u8bd5\u5377\u968f\u673a\u6346\u5927\u5c0f
-sys.config.random-bundle-size=50
-#\u524d\u7aef\u90e8\u7f72\u76ee\u5f55
-web.upload-path=/Users/ting.yin/Downloads/meishu
+sys.config.compression.percent=60
+sys.config.imageServer.port=9000
+sys.config.imageServer.ip=192.168.11.6
+sys.config.imageServer.aliyunOss=false
+sys.config.imageServer.dir=ms-test
+
+#????????
+web.upload-path=/Users/xiaofei/qmth/static-web/mslk/dist/
 spring.mvc.static-path-pattern=/**
-spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
+spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${sys.config.localhostPath},file:${web.upload-path}
+
+app.snapshot.initsql=/Users/yuanpan/dumps/stmms-ms-2-init.sql
+app.snapshot.fdsql=/Users/yuanpan/dumps/stmms-ms-2-fendang.sql
+app.snapshot.dfsql=/Users/yuanpan/dumps/stmms-ms-2-dafen.sql
+app.snapshot.fpsql=/Users/yuanpan/dumps/stmms-ms-2-fuping.sql
+
+#???OSS??
+aliyun.oss.endpointInner=http://oss-cn-beijing-internal.aliyuncs.com
+aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
+aliyun.oss.accessKeyId=LTAIhiBoG7CsLnoy
+aliyun.oss.accessKeySecret=HqTvxO1RYiPT3SiZKv4VeoXab4AHjz
+aliyun.oss.bucket=epcc-test
+aliyun.oss.url=https://${aliyun.oss.bucket}.oss-cn-beijing.aliyuncs.com
+aliyun.oss.imageDir=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/images/ -u
+aliyun.oss.thumbDir=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/thumbs/ -u
+aliyun.oss.sheetDir=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/sheet/ -u
+aliyun.oss.watermark=oss://${aliyun.oss.bucket}/${sys.config.imageServer.dir}/watermark/ -u
+aliyun.oss.util=/Users/king/ossutilmac64 cp -r

+ 52 - 5
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -33,10 +33,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.Predicate;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -72,6 +69,9 @@ public class MarkTaskApi {
     @Resource
     private MarkTaskScoreService markTaskScoreService;
 
+    @Resource
+    private MarkTaskSelfCheckService markTaskSelfCheckService;
+
     /**
      * 评卷员的评卷任务
      *
@@ -135,14 +135,21 @@ public class MarkTaskApi {
     public ResponseEntity marking(@PathVariable Long markTask, @RequestBody HashMap<String, String> body) {
         MarkStage stage = MarkStage.valueOf(body.get("stage"));
         MarkTaskDTO markTaskDTO = null;
+        boolean markingSelfTask = false;
         if (stage.equals(MarkStage.ROUGH_LEVEL)) {
             markTaskDTO = markTaskRoughLevelService.markingLevel(markTask, body);
+            markingSelfTask = markTaskSelfCheckService.updateMarkingCount(markTaskDTO.getWorkId(), markTaskDTO.getSubject(), stage, markTaskDTO.getMarkerId(), markTask);
         } else if (stage.equals(MarkStage.LEVEL)) {
             markTaskDTO = markTaskLevelService.markingLevel(markTask, body);
+            markingSelfTask = markTaskSelfCheckService.updateMarkingCount(markTaskDTO.getWorkId(), markTaskDTO.getSubject(), stage, markTaskDTO.getMarkerId(), markTask);
         } else if (stage.equals(MarkStage.SCORE)) {
             markTaskDTO = markTaskScoreService.markingScore(markTask, body);
         }
-        return new ResponseEntity(markTaskDTO, HttpStatus.OK);
+        Map map = new HashMap<>();
+        map.put("task", markTaskDTO);
+        map.put("hasSelfTask", markingSelfTask);
+
+        return new ResponseEntity(map, HttpStatus.OK);
     }
 
     /**
@@ -159,17 +166,29 @@ public class MarkTaskApi {
         }
         String[] ids = markIds.split(",");
         List<MarkTaskDTO> list = new ArrayList<>();
+        boolean markingSelfTask = false;
+        int i = 0;
         for (String id : ids) {
+            i++;
             MarkTaskDTO markTaskDTO = null;
             if (stage.equals(MarkStage.ROUGH_LEVEL)) {
                 markTaskDTO = markTaskRoughLevelService.markingLevel(Long.valueOf(id), body);
+                if (i == ids.length) {
+                    markingSelfTask = markTaskSelfCheckService.updateMarkingCount(markTaskDTO.getWorkId(), markTaskDTO.getSubject(), stage, markTaskDTO.getMarkerId(), Long.valueOf(id));
+                }
             } else if (stage.equals(MarkStage.LEVEL)) {
                 markTaskDTO = markTaskLevelService.markingLevel(Long.valueOf(id), body);
+                if (i == ids.length) {
+                    markingSelfTask = markTaskSelfCheckService.updateMarkingCount(markTaskDTO.getWorkId(), markTaskDTO.getSubject(), stage, markTaskDTO.getMarkerId(), Long.valueOf(id));
+                }
             } else if (stage.equals(MarkStage.SCORE)) {
                 markTaskDTO = markTaskScoreService.markingScore(Long.valueOf(id), body);
             }
             list.add(markTaskDTO);
         }
+        Map map = new HashMap();
+        map.put("task", list);
+        map.put("hasSelfTask", markingSelfTask);
 
         return new ResponseEntity(list, HttpStatus.OK);
     }
@@ -494,4 +513,32 @@ public class MarkTaskApi {
         }
         return null;
     }
+
+    /**
+     * 获取自查卷任务
+     * @param workId
+     * @param markerId
+     * @param subject
+     * @param stage
+     * @return
+     */
+    @GetMapping("/getSelfCheckTask")
+    public MarkTaskDTO getSelfCheckTask(@RequestParam Long workId,
+                                        @RequestParam Long markerId,
+                                        @RequestParam Subject subject,
+                                        @RequestParam MarkStage stage) {
+        return markTaskSelfCheckService.getSelfCheckTask(workId, markerId, subject, stage);
+    }
+
+    /**
+     * 自查卷档位提交
+     * @param id
+     * @param level
+     * @return
+     */
+    @PostMapping("/markingSelfCheckTask")
+    public boolean updateSelfCheckTask(@RequestParam Long id, @RequestParam String level) {
+        markTaskSelfCheckService.markingSelfCheckTask(id, level);
+        return true;
+    }
 }

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

@@ -193,6 +193,7 @@ public class PaperApi {
                                       @RequestParam(required = false) String studentName,
                                       @RequestParam(required = false) Long scanUserId,
                                       @RequestParam(required = false) Boolean isMark,
+                                      @RequestParam(required = false) Boolean sizeAbnormal, // 大小异常
                                       @RequestParam(required = false) String sortBy,
                                       Pageable pageable) {
         Sort sort = null;
@@ -234,6 +235,9 @@ public class PaperApi {
             if (isMark != null) {
                 predicates.add(builder.equal(root.get("isAdminMark"), isMark));
             }
+            if (sizeAbnormal != null) {
+                predicates.add(builder.equal(root.get("sizeAbnormal"), sizeAbnormal));
+            }
             //考生姓名
             if (studentName != null && !"".equals(studentName)) {
                 predicates.add(builder.equal(root.get("studentName"), studentName));

+ 66 - 4
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskLevelAssembler.java

@@ -7,11 +7,9 @@ import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskLevel;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskSelfCheck;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
-import cn.com.qmth.stmms.ms.core.repository.ChangeLevelRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
-import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
+import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
 import org.springframework.stereotype.Component;
 
@@ -42,6 +40,9 @@ public class MarkTaskLevelAssembler {
     @Resource
     ChangeLevelRepo changeLevelRepo;
 
+    @Resource
+    PaperRepo paperRepo;
+
     public MarkTaskDTO toDTO(MarkTaskLevel markTask) {
 
         MarkTaskDTO markTaskDTO = null;
@@ -105,8 +106,11 @@ public class MarkTaskLevelAssembler {
         if (markTask != null) {
             markTaskDTO = new MarkTaskDTO();
             markTaskDTO.setId(markTask.getId());
+            markTaskDTO.setWorkId(markTask.getWorkId());
+            markTaskDTO.setSubject(markTask.getSubject());
             markTaskDTO.setRejected(markTask.isRejected());
             markTaskDTO.setOldRejected(oldRejected);
+            markTaskDTO.setMarkerId(markTask.getMarkerId());
             markTaskDTO.setMarker(markTask.getMarkerName());
             markTaskDTO.setUpdatedOn(markTask.getUpdatedOn());
             markTaskDTO.setResult(markTask.getResult());
@@ -203,4 +207,62 @@ public class MarkTaskLevelAssembler {
         }
         return markTaskDTO;
     }
+
+    public MarkTaskDTO toSelfCheckDTO(MarkTaskLevel markTask) {
+        MarkTaskDTO markTaskDTO = null;
+        if (markTask != null) {
+            markTaskDTO = new MarkTaskDTO();
+//            markTaskDTO.setId(markTask.getId());
+//            markTaskDTO.setRejected(markTask.isRejected());
+            markTaskDTO.setMarkerId(markTask.getMarkerId());
+            MarkUser markUser = markUserRepo.findOne(markTask.getMarkerId());
+            markTaskDTO.setLoginName(markUser.getLoginName());
+            markTaskDTO.setMarker(markTask.getMarkerName());
+            markTaskDTO.setUpdatedOn(markTask.getUpdatedOn());
+//            markTaskDTO.setResult(markTask.getResult());
+            Paper paper = markTask.getPaper();
+//            markTaskDTO.setLevel(markTask.getResult());
+            markTaskDTO.setRoughLevel(markTask.getPaper().getRoughLevel());
+            markTaskDTO.setOriginLevel(markTask.getOriginLevel() == null ? "" : markTask.getOriginLevel());
+            markTaskDTO.setSn(markTask.getSecretNumber());
+//            markTaskDTO.setRedoLevel(paper.getRedoLevel());
+            String imgSrc = null;
+            String thumbSrc = null;
+            String fileName = paper.getExamNumber();
+            Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
+            //0:随机码 1:考号
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
+                fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+            }
+            if (ParamCache.collectConfigMap.get(String.valueOf(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);
+            } else {
+                imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            }
+            markTaskDTO.setThumbSrc(thumbSrc);
+            markTaskDTO.setImgSrc(imgSrc);
+//            markTaskDTO.setSample(paper.isSample());
+            markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
+            markTaskDTO.setRandomSeqNew(markTask.getRandomSeqNew());
+            markTaskDTO.setRandomSeq(markTask.getRandomSeq());
+            markTaskDTO.setPaperId(paper.getId());
+            markTaskDTO.setSerialNumber(markTask.getSerialNumber());
+            if (Objects.nonNull(markTask.getDisplayNumber())) {
+                markTaskDTO.setDisplayNumber(markTask.getDisplayNumber() == 1);
+            }
+//            markTaskDTO.setShift(paper.isShift());
+//            markTaskDTO.setShiftScore(paper.isShiftScore());
+
+//            markTaskDTO.setIsRejectedByLeader(paper.isRejectedByLeader() != null && paper.isRejectedByLeader());
+            //打回总次数
+//            int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), Objects.nonNull(paper.isRejectedByLeader()) && paper.isRejectedByLeader() ? MarkLogOperType.CALLBACK_LEVEl.getId() : MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId());
+//            markTaskDTO.setRejectedCount(rejectedCount);
+//            markTaskDTO.setDeviationDirection(markTask.getDeviationDirection());
+//            markTaskDTO.setMark(markTask.isMark());
+        }
+        return markTaskDTO;
+    }
+
 }

+ 60 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskRoughLevelAssembler.java

@@ -106,8 +106,11 @@ public class MarkTaskRoughLevelAssembler {
         if (markTask != null) {
             markTaskDTO = new MarkTaskDTO();
             markTaskDTO.setId(markTask.getId());
+            markTaskDTO.setWorkId(markTask.getWorkId());
+            markTaskDTO.setSubject(markTask.getSubject());
             markTaskDTO.setRejected(markTask.isRejected());
             markTaskDTO.setOldRejected(oldRejected);
+            markTaskDTO.setMarkerId(markTask.getMarkerId());
             markTaskDTO.setMarker(markTask.getMarkerName());
             markTaskDTO.setUpdatedOn(markTask.getUpdatedOn());
             markTaskDTO.setResult(markTask.getResult());
@@ -205,4 +208,61 @@ public class MarkTaskRoughLevelAssembler {
         }
         return markTaskDTO;
     }
+
+    public MarkTaskDTO toSelfCheckDTO(MarkTaskRoughLevel markTask) {
+        MarkTaskDTO markTaskDTO = null;
+        if (markTask != null) {
+            markTaskDTO = new MarkTaskDTO();
+            markTaskDTO.setId(markTask.getId());
+//            markTaskDTO.setRejected(markTask.isRejected());
+            markTaskDTO.setMarkerId(markTask.getMarkerId());
+            MarkUser markUser = markUserRepo.findOne(markTask.getMarkerId());
+            markTaskDTO.setLoginName(markUser.getLoginName());
+            markTaskDTO.setMarker(markTask.getMarkerName());
+            markTaskDTO.setUpdatedOn(markTask.getUpdatedOn());
+//            markTaskDTO.setResult(markTask.getResult());
+            Paper paper = markTask.getPaper();
+//            markTaskDTO.setLevel(markTask.getResult());
+//            markTaskDTO.setOriginLevel(markTask.getOriginLevel() == null ? "" : markTask.getOriginLevel());
+            markTaskDTO.setSn(markTask.getSecretNumber());
+//            markTaskDTO.setRedoLevel(paper.getRedoLevel());
+            String imgSrc = null;
+            String thumbSrc = null;
+            String fileName = paper.getExamNumber();
+            Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
+            //0:随机码 1:考号
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
+                fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+            }
+            if (ParamCache.collectConfigMap.get(String.valueOf(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);
+            } else {
+                imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            }
+            markTaskDTO.setThumbSrc(thumbSrc);
+            markTaskDTO.setImgSrc(imgSrc);
+//            markTaskDTO.setRoughSample(paper.isRoughSample());
+//            markTaskDTO.setSample(paper.isSample());
+//            markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
+            markTaskDTO.setRandomSeqNew(markTask.getRandomSeqNew());
+            markTaskDTO.setRandomSeq(markTask.getRandomSeq());
+            markTaskDTO.setPaperId(paper.getId());
+            markTaskDTO.setSerialNumber(markTask.getSerialNumber());
+            if (Objects.nonNull(markTask.getDisplayNumber())) {
+                markTaskDTO.setDisplayNumber(markTask.getDisplayNumber() == 1);
+            }
+//            markTaskDTO.setShift(paper.isShift());
+//            markTaskDTO.setShiftScore(paper.isShiftScore());
+
+//            markTaskDTO.setIsRejectedByLeader(paper.isRejectedByLeader() != null && paper.isRejectedByLeader());
+            //打回总次数
+//            int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), Objects.nonNull(paper.isRejectedByLeader()) && paper.isRejectedByLeader() ? MarkLogOperType.CALLBACK_LEVEl.getId() : MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId());
+//            markTaskDTO.setRejectedCount(rejectedCount);
+//            markTaskDTO.setDeviationDirection(markTask.getDeviationDirection());
+//            markTaskDTO.setMark(markTask.isMark());
+        }
+        return markTaskDTO;
+    }
 }

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

@@ -1,5 +1,7 @@
 package cn.com.qmth.stmms.ms.marking.dto;
 
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -11,6 +13,9 @@ public class MarkTaskDTO implements Serializable{
     private static final long serialVersionUID = -7780260418569729090L;
 
     private Long id;
+    private Long workId;
+
+    private Subject subject;
     private String sn;
     private String redoLevel;
     private String level;
@@ -45,6 +50,22 @@ public class MarkTaskDTO implements Serializable{
     private String deviationDirection;
     private Boolean isMark;
 
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public Subject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
+
     public Integer getRandomSeq() {
         return randomSeq;
     }

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

@@ -180,6 +180,7 @@ public class CheckDataService {
      */
     private List<CheckDataError> checkLevelScoreMatch(Long checkDataId, Long workId) {
         List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
+        // 查询不缺考考生
         List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
         List<CheckDataError> list = new ArrayList<>();
         if (paperList != null && !paperList.isEmpty()) {
@@ -213,7 +214,7 @@ public class CheckDataService {
                         return;
                     }
                     // 已分档并打分,进行校验
-                    if (paper.getScore().intValue() <= level.getMinScore() || paper.getScore().intValue() >= level.getMaxScore()) {
+                    if (paper.getScore().intValue() < level.getMinScore() || paper.getScore().intValue() > level.getMaxScore()) {
                         stringJoiner.add(String.format("%s档位[%s]分数[%s]不匹配", subject, paper.getLevel(), paper.getScore()));
                     }
                 });

+ 181 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskSelfCheckService.java

@@ -0,0 +1,181 @@
+package cn.com.qmth.stmms.ms.marking.service;
+
+import cn.com.qmth.stmms.ms.core.cache.ParamCache;
+import cn.com.qmth.stmms.ms.core.domain.Level;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskLevel;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskMarkerPaper;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskRoughLevel;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskSelfCheck;
+import cn.com.qmth.stmms.ms.core.repository.*;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import cn.com.qmth.stmms.ms.marking.assembler.MarkTaskLevelAssembler;
+import cn.com.qmth.stmms.ms.marking.assembler.MarkTaskRoughLevelAssembler;
+import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
+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.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.Random;
+
+/**
+ * 自查卷服务
+ */
+@Service
+public class MarkTaskSelfCheckService {
+
+    @Resource
+    private MarkTaskRoughLevelRepo markTaskRoughLevelRepo;
+
+    @Resource
+    private MarkTaskLevelRepo markTaskLevelRepo;
+
+    @Resource
+    private MarkTaskRoughLevelAssembler markTaskRoughLevelAssembler;
+
+    @Resource
+    private MarkTaskLevelAssembler markTaskLevelAssembler;
+
+    @Resource
+    private MarkTaskSelfCheckRepo markTaskSelfCheckRepo;
+
+    @Resource
+    private MarkTaskMarkerPaperRepo markTaskMarkerPaperRepo;
+
+    @Resource
+    private MarkerGroupLeaderRepo markerGroupLeaderRepo;
+
+    @Resource
+    private LevelRepo levelRepo;
+
+    /**
+     * @param workId   工作ID
+     * @param subject  科目
+     * @param stage    阶段
+     * @param markerId 评卷员ID
+     * @param taskId   正评任务ID
+     * @return 是否有自查卷
+     */
+    @Transactional
+    public boolean updateMarkingCount(Long workId, Subject subject, MarkStage stage, Long markerId, Long taskId) {
+        int selfCheckFrequency = 0;
+        if (MarkStage.ROUGH_LEVEL.equals(stage)) {
+            selfCheckFrequency = ParamCache.roughLevelConfigMap.get(String.valueOf(workId)).getSelfCheckFrequency();
+        } else if (MarkStage.LEVEL.equals(stage)) {
+            selfCheckFrequency = ParamCache.levelConfigMap.get(String.valueOf(workId)).getSelfCheckFrequency();
+        }
+
+        // 自查卷频率为0时,默认不开启自查功能
+        if (selfCheckFrequency == 0) {
+            return false;
+        }
+        // 保存评卷任务
+        addMarkerPaper(workId, subject, stage, markerId, taskId);
+
+        int count = markTaskMarkerPaperRepo.countByWorkIdAndSubjectAndStageAndMarkerId(workId, subject, stage, markerId);
+        // 更新分组中评卷老师评卷数量
+        updateMarkingCount(workId, subject, stage, markerId, count);
+
+        boolean isReturnSelf = false;
+        // 评卷数量等于频率值时
+        if (count >= selfCheckFrequency) {
+            // 生成自查卷评卷任务(当时批次中随机抽取一张)
+            isReturnSelf = saveSelfCheckTask(workId, subject, stage, markerId);
+        }
+        return isReturnSelf;
+
+    }
+
+    public boolean saveSelfCheckTask(Long workId, Subject subject, MarkStage stage, Long markerId) {
+        List<MarkTaskMarkerPaper> markTaskMarkerPaperList = markTaskMarkerPaperRepo.findByWorkIdAndSubjectAndStageAndMarkerId(workId, subject, stage, markerId);
+        Random r = new Random();
+        // 随机抽一个任务
+        int i = r.nextInt(markTaskMarkerPaperList.size());
+        MarkTaskMarkerPaper markTaskMarkerPaper = markTaskMarkerPaperList.get(i);
+        MarkTaskSelfCheck markTaskSelfCheck = new MarkTaskSelfCheck(workId, subject, markTaskMarkerPaper.getTaskId(), markerId, stage);
+        if (markTaskSelfCheck != null) {
+            markTaskSelfCheckRepo.save(markTaskSelfCheck);
+        }
+        return true;
+    }
+
+    public MarkTaskDTO getSelfCheckTask(Long workId, Long markerId, Subject subject, MarkStage stage) {
+        MarkTaskSelfCheck markTaskSelfCheck = markTaskSelfCheckRepo.findByWorkIdAndMarkerIdAndSubjectAndStageAndMarking(workId, markerId, subject, stage, false);
+        if (markTaskSelfCheck == null) {
+            return null;
+        }
+        MarkTaskDTO markTaskDTO = null;
+        if (MarkStage.ROUGH_LEVEL.equals(stage)) {
+            // 返回信息用正评任务中的信息
+            MarkTaskRoughLevel markTaskRoughLevel = markTaskRoughLevelRepo.findOne(markTaskSelfCheck.getTaskId());
+            markTaskDTO = markTaskRoughLevelAssembler.toSelfCheckDTO(markTaskRoughLevel);
+            // id用自查表中id
+            markTaskDTO.setId(markTaskSelfCheck.getId());
+        } else if (MarkStage.LEVEL.equals(stage)) {
+            MarkTaskLevel markTaskLevel = markTaskLevelRepo.findOne(markTaskSelfCheck.getTaskId());
+            markTaskDTO = markTaskLevelAssembler.toSelfCheckDTO(markTaskLevel);
+            // id用自查表中id
+            markTaskDTO.setId(markTaskSelfCheck.getId());
+        }
+        return markTaskDTO;
+    }
+
+    @Transactional
+    public boolean markingSelfCheckTask(Long id, String level) {
+        if (StringUtils.isBlank(level)) {
+            throw new RuntimeException("请选择档位");
+        }
+        MarkTaskSelfCheck markTaskSelfCheck = markTaskSelfCheckRepo.findOne(id);
+        Long workId = markTaskSelfCheck.getWorkId();
+        Subject subject = markTaskSelfCheck.getSubject();
+        MarkStage stage = markTaskSelfCheck.getStage();
+        Long markerId = markTaskSelfCheck.getMarkerId();
+        List<Level> levels = levelRepo.findByWorkIdOrderByCode(workId);
+        if (CollectionUtils.isEmpty(levels)) {
+            throw new RuntimeException("未找到分档档位信息");
+        }
+        int levelValue;
+        if (MarkStage.ROUGH_LEVEL.equals(stage)) {
+            levelValue = Integer.parseInt(level);
+        } else if (MarkStage.LEVEL.equals(stage)) {
+            Optional<Level> optional = levels.stream().filter(m -> m.getCode().equals(level)).findFirst();
+            if (!optional.isPresent()) {
+                throw new RuntimeException("未找到档位[" + level + "]的档位值数据");
+            }
+            levelValue = optional.get().getLevelValue();
+        } else {
+            throw new RuntimeException("不支持的阶段");
+        }
+        markTaskSelfCheckRepo.updateMarkingById(id, level, levelValue, StringUtils.isNotBlank(level), new Date());
+
+        // 更新分组中评卷老师评卷数量(清0)
+        updateMarkingCount(workId, subject, stage, markerId, 0);
+        // 清空评卷明细数据(mark_task_marker_paper表)
+        deleteMarkerPaper(workId, subject, stage, markerId);
+        return true;
+    }
+
+    public boolean addMarkerPaper(Long workId, Subject subject, MarkStage stage, Long markerId, Long taskId) {
+        List<MarkTaskMarkerPaper> markTaskMarkerPaperList = markTaskMarkerPaperRepo.findByWorkIdAndSubjectAndStageAndMarkerIdAndTaskId(workId, subject, stage, markerId, taskId);
+        if (CollectionUtils.isEmpty(markTaskMarkerPaperList)) {
+            MarkTaskMarkerPaper markTaskMarkerPaper = new MarkTaskMarkerPaper(workId, subject, stage, markerId, taskId);
+            markTaskMarkerPaperRepo.save(markTaskMarkerPaper);
+        }
+        return true;
+    }
+
+    public boolean updateMarkingCount(Long workId, Subject subject, MarkStage stage, Long markerId, int markingCount) {
+        markerGroupLeaderRepo.updateMarkingCountByWorkIdAndSubjectAndStageAndMarkerId(workId, subject, stage, markerId, markingCount);
+        return true;
+    }
+
+    public boolean deleteMarkerPaper(Long workId, Subject subject, MarkStage stage, Long markerId) {
+        markTaskMarkerPaperRepo.deleteByWorkIdAndSubjectAndStageAndMarkerId(workId, subject, stage, markerId);
+        return true;
+    }
+}