Эх сурвалжийг харах

联考版-v3.1.0-分档模块开发阶段bug修改

xiaof 2 жил өмнө
parent
commit
c6018b8201
43 өөрчлөгдсөн 1089 нэмэгдсэн , 495 устгасан
  1. 94 3
      sql/v3.1.0表结构修改日志.sql
  2. 2 5
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/CheckDataApi.java
  3. 49 68
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/MessageApi.java
  4. 3 3
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java
  5. 2 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java
  6. 10 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/WorkOverview.java
  7. 1 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java
  8. 2 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  9. 9 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java
  10. 13 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ChangeLevel.java
  11. 11 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java
  12. 20 40
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Message.java
  13. 54 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MessageReceive.java
  14. 14 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  15. 1 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java
  16. 5 5
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/LevelConfig.java
  17. 10 3
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ChangeLevelRepo.java
  18. 1 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskLevelRepo.java
  19. 5 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkerGroupStudentRepo.java
  20. 12 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MessageReceiveRepo.java
  21. 14 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  22. 9 16
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java
  23. 11 11
      stmms-ms-main/src/test/java/BatchCreateDataTest.java
  24. 10 10
      stmms-ms-main/src/test/java/BatchLevelTest.java
  25. 10 22
      stmms-ms-main/src/test/java/BatchScoreTest.java
  26. 107 46
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ChangeLevelApi.java
  27. 26 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  28. 35 33
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  29. 9 35
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  30. 11 4
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  31. 2 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskLevelAssembler.java
  32. 1 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  33. 10 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java
  34. 9 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  35. 112 43
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java
  36. 76 27
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskLevelService.java
  37. 32 12
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskRoughLevelService.java
  38. 78 29
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskScoreService.java
  39. 1 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkerGroupLeaderService.java
  40. 1 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingLevelService.java
  41. 2 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingRoughLevelService.java
  42. 144 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MessageService.java
  43. 61 67
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 94 - 3
sql/v3.1.0表结构修改日志.sql

@@ -18,7 +18,7 @@ DROP COLUMN `image_encrypt`,
 DROP COLUMN `package_scan`,
 ADD COLUMN `collect_config` MEDIUMTEXT NULL COMMENT '采集规则参数' AFTER `work_id`,
 ADD COLUMN `level_config` MEDIUMTEXT NULL COMMENT '细分档规则参数' AFTER `collect_config`,
-ADD COLUMN `coarse_level_config` MEDIUMTEXT NULL COMMENT '粗分档规则参数' AFTER `level_config`,
+ADD COLUMN `rough_level_config` MEDIUMTEXT NULL COMMENT '粗分档规则参数' AFTER `level_config`,
 ADD COLUMN `score_config` MEDIUMTEXT NULL COMMENT '打分规则参数' AFTER `first_level_config`;
 
 
@@ -28,6 +28,7 @@ CREATE TABLE `marker_group_student`  (
                                          `subject` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
                                          `stage` int(1) NOT NULL COMMENT '所属阶段',
                                          `group_id` bigint(20) NOT NULL COMMENT '分组ID',
+                                         `paper_id` bigint(20) NOT NULL COMMENT '试卷ID',
                                          `exam_number` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
                                          `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
                                          `area_code` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
@@ -46,5 +47,95 @@ ALTER TABLE `marker_group`
     ADD COLUMN `stage` INT(1) NULL AFTER `subject`;
 
 ALTER TABLE `level`
-    ADD COLUMN `coarse_code` VARCHAR(50) NULL COMMENT '粗分档档位' AFTER `kdpt`,
-ADD COLUMN `coarse_weight` INT(11) NULL COMMENT '粗分档典型值' AFTER `coarse_code`;
+    ADD COLUMN `rough_code` varchar(2) NULL COMMENT '粗分档档位' AFTER `kdpt`,
+    ADD COLUMN `rough_weight` INT(11) NULL COMMENT '粗分档典型值' AFTER `rough_code`;
+
+CREATE TABLE `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) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+  `origin_level` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `question_id` bigint(20) NULL DEFAULT NULL,
+  `result` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `level` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '最终档位(和paper表中level一致)',
+  `stage` int(11) NOT NULL,
+  `subject` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `created_on` datetime(0) NULL DEFAULT NULL,
+  `updated_on` datetime(0) NULL DEFAULT NULL,
+  `random_seq` int(11) NULL DEFAULT NULL,
+  `secret_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
+  `random_seq_new` bigint(20) NULL DEFAULT NULL COMMENT '随机号',
+  `is_active` bit(1) NULL DEFAULT b'0' COMMENT '是否激活',
+  `is_test` tinyint(4) 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) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '叫号序号',
+  `display_number` int(11) NULL DEFAULT NULL,
+  `is_sample` bit(1) NULL DEFAULT NULL COMMENT '是否标准卷',
+  `deviation_direction` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '偏差方向',
+  `is_mark` bit(1) NULL DEFAULT b'0' COMMENT '是否标记',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_mark_task_paper_id`(`paper_id`) USING BTREE,
+  INDEX `question_id`(`question_id`, `marker_id`, `stage`, `result`, `is_rejected`, `random_seq`, `random_seq_new`) USING BTREE,
+  INDEX `idx_union_1`(`marker_id`, `stage`, `result`, `random_seq`, `random_seq_new`) USING BTREE,
+  CONSTRAINT `mark_task_rough_level_ibfk_1` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_10` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_11` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_12` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_13` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_14` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_15` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_2` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_3` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_4` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_5` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_6` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_7` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_8` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+  CONSTRAINT `mark_task_rough_level_ibfk_9` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 152 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+
+ALTER TABLE `paper`
+    ADD COLUMN `is_rough_sample` BIT(1) NULL DEFAULT NULL COMMENT '粗分档标准卷' ,
+    ADD COLUMN `rough_level` varchar(2) NULL COMMENT '粗分档档位' AFTER `is_tagged`,
+    ADD COLUMN `redo_rough_level` VARCHAR(5) NULL COMMENT '粗分档建议档位' AFTER `rough_level`,
+    ADD COLUMN `rough_batch_no` BIGINT(45) NULL COMMENT '粗分档批次号' AFTER `is_active`,
+    ADD COLUMN `is_rough_arbitrated` BIT(1) NULL COMMENT '粗分档仲裁' AFTER `is_mark`,
+    ADD COLUMN `is_rough_manual` BIT(1) NULL AFTER `is_rough_arbitrated`,
+    ADD COLUMN `is_rough_rejected` BIT(1) NULL COMMENT '粗分档打回' AFTER `is_rough_manual`,
+    ADD COLUMN `is_rough_mark` BIT(1) NULL COMMENT '粗分档标记' AFTER `is_rough_rejected`;
+
+ALTER TABLE `paper`
+    ADD COLUMN `is_rough_shift` BIT(1) NULL AFTER `redo_rough_level`,
+ADD COLUMN `is_rough_shift_score` BIT(1) NULL AFTER `is_rough_shift`;
+
+
+CREATE TABLE `message` (
+                       `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+                       `work_id` BIGINT(20) NULL COMMENT '工作ID',
+                       `subject` VARCHAR(10) NULL COMMENT '科目',
+                       `stage` INT(2) NULL COMMENT '阶段',
+                       `send_user_id` BIGINT(20) NULL COMMENT '发件人ID',
+                       `send_user_name` VARCHAR(45) NULL COMMENT '发件人名称',
+                       `content` VARCHAR(500) NULL COMMENT '消息内容',
+                       `receive_user` MEDIUMTEXT NULL COMMENT '收件人集合json',
+                       `create_time` DATETIME NULL COMMENT '创建时间',
+                       PRIMARY KEY (`id`))
+    COMMENT = '消息管理';
+
+CREATE TABLE `message_receive` (
+                              `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+                              `message_id` BIGINT(20) NULL,
+                              `receive_user_id` BIGINT(20) NULL,
+                              `is_read` tinyint(1) NULL,
+                              PRIMARY KEY (`id`))
+    COMMENT = '消息发送的用户';
+
+
+ALTER TABLE `change_level`
+    ADD COLUMN `stage` INT(2) NULL COMMENT '阶段' AFTER `subject`;

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

@@ -5,10 +5,7 @@ import cn.com.qmth.stmms.ms.core.domain.enums.CheckDataStatusEnum;
 import cn.com.qmth.stmms.ms.core.domain.enums.CheckItemEnum;
 import cn.com.qmth.stmms.ms.core.repository.CheckDataRepo;
 import cn.com.qmth.stmms.ms.marking.service.CheckDataService;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -31,7 +28,7 @@ public class CheckDataApi {
      *
      * @param workId 工作ID
      */
-    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    @GetMapping("/list")
     public List<CheckData> list(@RequestParam Long workId) {
         return checkDataRepo.findByWorkId(workId);
     }

+ 49 - 68
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/MessageApi.java

@@ -1,23 +1,17 @@
 package cn.com.qmth.stmms.ms.admin.api;
 
-import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.Message;
-import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
-import cn.com.qmth.stmms.ms.core.repository.MessageRepo;
+import cn.com.qmth.stmms.ms.core.domain.MessageReceive;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import cn.com.qmth.stmms.ms.marking.service.MessageService;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.jpa.domain.Specification;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import javax.persistence.criteria.Predicate;
-import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -28,81 +22,68 @@ import java.util.List;
 public class MessageApi {
 
     @Resource
-    private MessageRepo messageRepo;
+    MessageService messageService;
 
-    @PostMapping("/save")
-    public void save(@RequestBody JSONObject data) {
-        Long workId = ServletUtil.getWordId();
-        List<MarkUser> markUsers = JSONObject.parseArray(data.getString("markers"), MarkUser.class);
-        List<Message> messages = new ArrayList<>();
-        long time = System.currentTimeMillis();
-        for (MarkUser markUser : markUsers) {
-            Message message = new Message();
-            message.setWorkId(workId);
-            message.setSubject(Subject.valueOf(data.getString("subject")));
-            message.setMarkerId(markUser.getId());
-            message.setMarkerName(markUser.getName());
-            message.setMarkerLeaderId(data.getLong("markerLeaderId"));
-            message.setMarkerLeaderName(data.getString("markerLeaderName"));
-            message.setContent(data.getString("content"));
-            message.setCreateTime(time);
-            message.setRead(false);
-            messages.add(message);
-        }
-        messageRepo.save(messages);
+    @PostMapping("/send")
+    public Message save(@RequestBody String data) {
+        return messageService.sendMessage(data);
     }
 
     /**
      * 评卷员查询消息
      *
-     * @param subject  科目
-     * @param stage    阶段
-     * @param markerId 评卷员ID
-     * @param lastId   上次最后一次查询的消息ID最大值
-     * @param pageable 分页
+     * @param subject       科目
+     * @param stage         阶段
+     * @param receiveUserId 评卷员ID
+     * @param lastId        上次最后一次查询的消息ID最大值
+     * @param pageable      分页
      */
-    @GetMapping("/list_by_marker")
-    public Page<Message> listByMarker(@RequestParam Subject subject,
-                                      @RequestParam MarkStage stage,
-                                      @RequestParam Long markerId,
-                                      @RequestParam Long lastId,
-                                      Pageable pageable) {
-        Long workId = ServletUtil.getWordId();
-        Specification<Message> specification = (root, query, builder) -> {
-            List<Predicate> predicates = new ArrayList<>();
-            if (lastId != null) {
-                predicates.add(builder.gt(root.get("id"), lastId));
-            }
-            predicates.add(builder.equal(root.get("workId"), workId));
-            predicates.add(builder.equal(root.get("subject"), subject));
-            predicates.add(builder.equal(root.get("stage"), stage));
-            predicates.add(builder.equal(root.get("markerId"), markerId));
-            predicates.add(builder.equal(root.get("read"), false));
-
-            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
-        };
+    @GetMapping("/page_receive")
+    public Page<MessageReceive> listByMarker(@RequestParam Subject subject,
+                                             @RequestParam MarkStage stage,
+                                             @RequestParam Long receiveUserId,
+                                             @RequestParam Long lastId,
+                                             Pageable pageable) {
+        return messageService.listByReceiveUserIdAll(subject, stage, receiveUserId, lastId, pageable);
+    }
 
-        Sort sort = new Sort(Sort.Direction.DESC, "id");
-        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
-        return messageRepo.findAll(specification, pageable1);
+    /**
+     * 评卷员查询消息
+     *
+     * @param subject       科目
+     * @param stage         阶段
+     * @param receiveUserId 收件人ID
+     */
+    @GetMapping("/list_receive_unread")
+    public List<MessageReceive> listByMarker(@RequestParam Subject subject,
+                                             @RequestParam MarkStage stage,
+                                             @RequestParam Long receiveUserId) {
+        return messageService.listByReceiveUserIdRead(subject, stage, receiveUserId);
     }
 
-    @GetMapping("/list_by_marker_leader")
-    public void listByMarkerLeader(@RequestParam Subject subject,
-                                   @RequestParam MarkStage stage,
-                                   @RequestParam Long markerLeaderId) {
+    /**
+     * @param subject    科目
+     * @param stage      阶段
+     * @param sendUserId 发件人ID
+     * @param pageable   分页
+     */
+    @GetMapping("/page_send")
+    public Page<Message> listBySendUserId(@RequestParam Subject subject,
+                                          @RequestParam MarkStage stage,
+                                          @RequestParam Long sendUserId,
+                                          Pageable pageable) {
+        return messageService.listBySendUserIdAll(subject, stage, sendUserId, pageable);
     }
 
     /**
      * 标记已读
      *
-     * @param id 消息ID
+     * @param object 消息ID
      */
-    @GetMapping("/read/{id}")
-    public void listByMarkerLeader(@PathVariable Long id) {
-        Message message = messageRepo.findOne(id);
-        message.setRead(true);
-        messageRepo.save(message);
+    @PostMapping("/read")
+    public void listByMarkerLeader(@RequestBody JSONObject object) {
+        List<Long> ids = JSON.parseArray(object.getString("ids"), Long.class);
+        messageService.markRead(ids);
     }
 
 }

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

@@ -119,7 +119,7 @@ public class ParamApi {
         Integer levelShowAllPaper = object.getInteger("levelShowAllPaper");
         Integer propDenominator = object.getInteger("propDenominator");
         Integer showStandardPaperManage = object.getInteger("showStandardPaperManage");
-        Integer roughLevel = object.getInteger("roughLevel");
+        Integer roughLevelEnable = object.getInteger("roughLevelEnable");
         Integer removeHighAndLow = object.getInteger("removeHighAndLow");
 
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNot(workId, TrialEnum.DEFAULT.ordinal());
@@ -142,7 +142,7 @@ public class ParamApi {
             if (!Objects.equals(majority, oldLevelConfig.getMajority())) {
                 throw new RuntimeException("该评卷工作已有评卷数据,不能修改【是否过半定档】参数");
             }
-            if (!Objects.equals(roughLevel, oldLevelConfig.getRoughLevel())) {
+            if (!Objects.equals(roughLevelEnable, oldLevelConfig.getRoughLevelEnable())) {
                 throw new RuntimeException("该评卷工作已有评卷数据,不能修改【是否增加粗档位环节】参数");
             }
             if (!Objects.equals(removeHighAndLow, oldLevelConfig.getRemoveHighAndLow())) {
@@ -158,7 +158,7 @@ public class ParamApi {
         oldLevelConfig.setPropDenominator(propDenominator);
         oldLevelConfig.setShowStandardPaperManage(showStandardPaperManage);
         oldLevelConfig.setClearData(clearData);
-        oldLevelConfig.setRoughLevel(roughLevel);
+        oldLevelConfig.setRoughLevelEnable(roughLevelEnable);
         oldLevelConfig.setRemoveHighAndLow(removeHighAndLow);
 
         paramSetting.setLevelConfig(JSON.toJSONString(oldLevelConfig));

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

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.admin.assembler;
 
 import cn.com.qmth.stmms.ms.admin.dto.SubjectOverview;
 import cn.com.qmth.stmms.ms.admin.dto.WorkOverview;
+import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.Student;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
@@ -81,6 +82,7 @@ public class WorkOverviewAssembler {
                 so.setLeftCount(workOverview.getStuTotalCount() - workOverview.getStuAbsentCount() - so.getUploadedCount());
             }
             workOverview.setSubjectOverviews(subjectOverviews);
+            workOverview.setRoughLevelEnable(ParamCache.levelConfigMap.get(String.valueOf(work.getId())).getRoughLevelEnable() == 1);
         }
         return workOverview;
     }

+ 10 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/WorkOverview.java

@@ -45,6 +45,8 @@ public class WorkOverview implements Serializable{
      */
     private long questionCount;
 
+    private boolean roughLevelEnable;
+
     private List<SubjectOverview> subjectOverviews = new ArrayList<>();
 
     public String getWorkName() {
@@ -110,6 +112,14 @@ public class WorkOverview implements Serializable{
     public void setStuUploadedCount(long stuUploadedCount) {
         this.stuUploadedCount = stuUploadedCount;
     }
+
+    public boolean isRoughLevelEnable() {
+        return roughLevelEnable;
+    }
+
+    public void setRoughLevelEnable(boolean roughLevelEnable) {
+        this.roughLevelEnable = roughLevelEnable;
+    }
 }
 
 

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

@@ -156,7 +156,7 @@ public class PaperExporter {
     @GetMapping("{workId}/mark")
     public void exportMark(@PathVariable Long workId, HttpServletResponse response) {
         List<MarkExpDTO> markExpDTOS = new ArrayList<>();
-        List<Paper> papers = paperRepo.findByWorkIdAndIsMarkTrue(workId);
+        List<Paper> papers = paperRepo.findByWorkIdAndIsAdminMarkTrue(workId);
         for (Paper paper : papers) {
             MarkExpDTO markExpDTO = new MarkExpDTO();
             markExpDTO.setWorkId(workId);

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

@@ -410,7 +410,7 @@ public class DataUploadService {
 
         MarkStage stage = markSubject.getStage();
         if(MarkStage.INIT.equals(markSubject.getStage())){
-            if(ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevel() == 1){
+            if(ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevelEnable() == 1){
                 stage = MarkStage.ROUGH_LEVEL;
             } else {
                 stage = MarkStage.LEVEL;
@@ -658,7 +658,7 @@ public class DataUploadService {
 
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
         //只能第一次分档才能导入
-        Integer roughLevel = ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevel();
+        Integer roughLevel = ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevelEnable();
         // todo 增加校验
         /*if ((roughLevel == 1 && !stage.equals(MarkStage.INIT))
                 || (roughLevel == 0 && !stage.equals(MarkStage.LEVEL))) {

+ 9 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java

@@ -78,6 +78,9 @@ public class TrialService {
     @Autowired
     MarkerGroupLeaderRepo markerGroupLeaderRepo;
 
+    @Resource
+    MarkerGroupStudentRepo markerGroupStudentRepo;
+
     /**
      * 检查任务状态
      *
@@ -108,18 +111,22 @@ public class TrialService {
         if (Objects.isNull(work)) {
             throw new RuntimeException("没有此工作区");
         }
+
         List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase())).collect(Collectors.toList());
         MarkSubject markSubject = markSubjectList.get(0);
         //分配任务
         Map<String, Integer> map = new HashMap();
         map.put("taskCount", 0);
-        stageControlService.goNext(markSubject, map);
+        stageControlService.createTask(markSubject, map);
         //修改科目test
         markSubject.setTest(TrialEnum.START_TRIAL.getId());
         markSubjectRepo.save(markSubject);
 
         //修改试卷test
         paperRepo.updateByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId(), TrialEnum.START_TRIAL.getId());
+
+        // 清除分组中导入的名单
+        markerGroupStudentRepo.deleteByWorkIdAndSubjectAndStageAndUsed(workId, subject, markSubject.getStage(), false);
     }
 
     /**
@@ -140,7 +147,7 @@ public class TrialService {
         // 开启粗分档且当前在粗分档试评,则重置为INIT
         // 开启粗分档且当前在细分档试评,则重置为ROUGH_LEVEL
         // 未开启粗分档(当前只能在细分档试评),则重置为INIT
-        boolean roughLevel = ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevel() == 1;
+        boolean roughLevel = ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevelEnable() == 1;
         MarkStage stage = roughLevel && MarkStage.LEVEL.equals(markSubject.getStage()) ? MarkStage.ROUGH_LEVEL : MarkStage.INIT;
         markSubject.setStage(stage);
         markSubject.setSampleCount(0);

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

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.ms.core.domain;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 
 @Entity
@@ -17,6 +18,10 @@ public class ChangeLevel {
 
     private String subject;
 
+    @NotNull
+    @Enumerated(value = EnumType.ORDINAL)
+    private MarkStage stage;
+
     private Long paperId;
 
     private String originalLevel;
@@ -63,6 +68,14 @@ public class ChangeLevel {
         this.subject = subject;
     }
 
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
     public Long getPaperId() {
         return paperId;
     }

+ 11 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java

@@ -50,6 +50,9 @@ public class MarkSubject implements Serializable {
     @Transient
     private boolean formal = false;
 
+    @Transient
+    private boolean roughLevelEnable;
+
     public boolean isAllLevel() {
         return allLevel;
     }
@@ -161,4 +164,12 @@ public class MarkSubject implements Serializable {
     public void setFormal(boolean formal) {
         this.formal = formal;
     }
+
+    public boolean isRoughLevelEnable() {
+        return roughLevelEnable;
+    }
+
+    public void setRoughLevelEnable(boolean roughLevelEnable) {
+        this.roughLevelEnable = roughLevelEnable;
+    }
 }

+ 20 - 40
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Message.java

@@ -21,19 +21,15 @@ public class Message {
     @Enumerated(value = EnumType.ORDINAL)
     private MarkStage stage;
 
-    private Long markerId;
+    private Long sendUserId;
 
-    private String markerName;
-
-    private Long markerLeaderId;
-
-    private String markerLeaderName;
+    private String sendUserName;
 
     private String content;
 
-    private Long createTime;
+    private String receiveUser;
 
-    private Boolean read;
+    private Date createTime;
 
     public Long getId() {
         return id;
@@ -67,36 +63,20 @@ public class Message {
         this.stage = stage;
     }
 
-    public Long getMarkerId() {
-        return markerId;
-    }
-
-    public void setMarkerId(Long markerId) {
-        this.markerId = markerId;
-    }
-
-    public String getMarkerName() {
-        return markerName;
-    }
-
-    public void setMarkerName(String markerName) {
-        this.markerName = markerName;
-    }
-
-    public Long getMarkerLeaderId() {
-        return markerLeaderId;
+    public Long getSendUserId() {
+        return sendUserId;
     }
 
-    public void setMarkerLeaderId(Long markerLeaderId) {
-        this.markerLeaderId = markerLeaderId;
+    public void setSendUserId(Long sendUserId) {
+        this.sendUserId = sendUserId;
     }
 
-    public String getMarkerLeaderName() {
-        return markerLeaderName;
+    public String getSendUserName() {
+        return sendUserName;
     }
 
-    public void setMarkerLeaderName(String markerLeaderName) {
-        this.markerLeaderName = markerLeaderName;
+    public void setSendUserName(String sendUserName) {
+        this.sendUserName = sendUserName;
     }
 
     public String getContent() {
@@ -107,19 +87,19 @@ public class Message {
         this.content = content;
     }
 
-    public Long getCreateTime() {
-        return createTime;
+    public String getReceiveUser() {
+        return receiveUser;
     }
 
-    public void setCreateTime(Long createTime) {
-        this.createTime = createTime;
+    public void setReceiveUser(String receiveUser) {
+        this.receiveUser = receiveUser;
     }
 
-    public Boolean getRead() {
-        return read;
+    public Date getCreateTime() {
+        return createTime;
     }
 
-    public void setRead(Boolean read) {
-        this.read = read;
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 }

+ 54 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MessageReceive.java

@@ -0,0 +1,54 @@
+package cn.com.qmth.stmms.ms.core.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "message_receive")
+public class MessageReceive {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @NotNull
+    @ManyToOne
+    @JoinColumn(name = "messageId")
+    private Message message;
+
+    private Long receiveUserId;
+
+    private Boolean isRead;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Message getMessage() {
+        return message;
+    }
+
+    public void setMessage(Message message) {
+        this.message = message;
+    }
+
+    public Long getReceiveUserId() {
+        return receiveUserId;
+    }
+
+    public void setReceiveUserId(Long receiveUserId) {
+        this.receiveUserId = receiveUserId;
+    }
+
+    public Boolean getRead() {
+        return isRead;
+    }
+
+    public void setRead(Boolean read) {
+        isRead = read;
+    }
+}

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

@@ -160,10 +160,15 @@ public class Paper implements Serializable {
     private Long scanUserId;
 
     /**
-     * 是否标记
+     * 是否标记(科组长)
      */
     private boolean isMark;
 
+    /**
+     * 是否标记(管理员)
+     */
+    private boolean isAdminMark;
+
     public int getTest() {
         return test;
     }
@@ -653,4 +658,12 @@ public class Paper implements Serializable {
     public void setRoughBatchNo(Long roughBatchNo) {
         this.roughBatchNo = roughBatchNo;
     }
+
+    public boolean isAdminMark() {
+        return isAdminMark;
+    }
+
+    public void setAdminMark(boolean adminMark) {
+        isAdminMark = adminMark;
+    }
 }

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

@@ -60,7 +60,7 @@ public class ParamSetting implements Serializable {
         levelConfig.setPropDenominator(1);//档位百分比分母
         levelConfig.setShowStandardPaperManage(1);//是否显示标准卷管理
         levelConfig.setClearData(0);//是否显示清除当前阅卷数据
-        levelConfig.setRoughLevel(0);//是否开启粗分档
+        levelConfig.setRoughLevelEnable(0);//是否开启粗分档
         levelConfig.setRemoveHighAndLow(0);//是否开启去高去低再加权评卷
         paramSetting.setLevelConfig(JSON.toJSONString(levelConfig));
 

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

@@ -48,7 +48,7 @@ public class LevelConfig {
     /**
      * 是否增加粗分档
      */
-    private Integer roughLevel;
+    private Integer roughLevelEnable;
 
     /**
      * 是否开启去高去低再加权评卷
@@ -119,12 +119,12 @@ public class LevelConfig {
         this.clearData = clearData;
     }
 
-    public Integer getRoughLevel() {
-        return roughLevel;
+    public Integer getRoughLevelEnable() {
+        return roughLevelEnable;
     }
 
-    public void setRoughLevel(Integer roughLevel) {
-        this.roughLevel = roughLevel;
+    public void setRoughLevelEnable(Integer roughLevelEnable) {
+        this.roughLevelEnable = roughLevelEnable;
     }
 
     public Integer getRemoveHighAndLow() {

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

@@ -1,9 +1,7 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
 import cn.com.qmth.stmms.ms.core.domain.ChangeLevel;
-import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
-import org.springframework.data.domain.Pageable;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
@@ -26,4 +24,13 @@ public interface ChangeLevelRepo extends JpaRepository<ChangeLevel, Long>, JpaSp
     ChangeLevel findByWorkIdAndSubjectAndPaperIdAndAuditStatusAndIsCurr(Long workId, String name, Long paperId);
 
     void deleteByWorkIdAndSubject(Long workId, String name);
+
+    @Query("select s from ChangeLevel s where s.workId = ?1 and s.subject = ?2 and s.stage = ?3 and s.paperId = ?4 and s.auditStatus = 1 and s.isCurr = 1")
+    ChangeLevel findByWorkIdAndSubjectAndStageAndPaperIdAndAuditStatusAndIsCurr(Long workId, String name, MarkStage stage, Long paperId);
+
+    @Query("select s from ChangeLevel s where s.workId = ?1 and s.subject = ?2 and s.stage = ?3 and s.paperId = ?4")
+    List<ChangeLevel> findAllByWorkIdAndSubjectAndStageAndPaperId(Long workId, String name, MarkStage stage, Long paperId);
+
+    @Query("select s from ChangeLevel s where s.workId = ?1 and s.subject = ?2 and s.stage = ?3 and s.paperId = ?4 and s.auditStatus = 0")
+    ChangeLevel findByWorkIdAndSubjectAndStageAndPaperId(Long workId, String name, MarkStage stage, Long paperId);
 }

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

@@ -207,7 +207,7 @@ public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, J
     List<Object[]> findAllByWorkId(Long workId);
 
     @Modifying
-    @Query(value = "update mark_task m set m.level = ?1 where m.paper_id = ?2", nativeQuery = true)
+    @Query(value = "update mark_task_level m set m.level = ?1 where m.paper_id = ?2", nativeQuery = true)
     void updateLevelByPaperId(String level, Long id);
 
     @Query("select s.paper from MarkTaskLevel s where s.workId = :workId and s.subject = :subject and s.stage = :stage and s.markerId in (:markers)")

+ 5 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkerGroupStudentRepo.java

@@ -25,4 +25,9 @@ public interface MarkerGroupStudentRepo extends JpaRepository<MarkerGroupStudent
     long countByGroupIdAndUsed(Long groupId, boolean used);
 
     long countByWorkIdAndSubjectAndStageAndUsed(Long workId, Subject subject, MarkStage stage, boolean b);
+
+    @Transactional
+    @Modifying
+    @Query("delete from MarkerGroupStudent s where s.workId = ?1 and s.subject = ?2 and s.stage = ?3 and s.used = ?4")
+    void deleteByWorkIdAndSubjectAndStageAndUsed(Long workId, Subject subject, MarkStage stage, boolean used);
 }

+ 12 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MessageReceiveRepo.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.MessageReceive;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+/**
+ *
+ */
+public interface MessageReceiveRepo extends JpaRepository<MessageReceive, Long>, JpaSpecificationExecutor<MessageReceive> {
+
+}

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

@@ -314,6 +314,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByWorkIdAndSubjectAndQuestionIdAndIsMissingAndTestAndLevelIsNull(Long workId, Subject valueOf, Long questionId, boolean b, int ordinal);
 
+    List<Paper> findByWorkIdAndSubjectAndQuestionIdAndIsMissingAndTestAndRoughLevelIsNull(Long workId, Subject valueOf, Long questionId, boolean b, int ordinal);
+
     long countByWorkIdAndQuestionIdAndIsMissingIsFalse(Long workId, Long questionId);
 
     @Modifying
@@ -361,7 +363,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByWorkIdAndIsMissing(Long workId, boolean missing);
 
-    List<Paper> findByWorkIdAndIsMarkTrue(Long workId);
+    List<Paper> findByWorkIdAndIsAdminMarkTrue(Long workId);
 
     @Modifying
     @Query("update Paper p set p.test = ?3, p.active = false, p.batchNo = null where p.workId = ?1 and p.test = ?2")
@@ -391,4 +393,15 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     long countByWorkIdAndSubjectAndRoughLevelAndIdIn(Long workId, Subject subject, String valueOf, List<Long> finalPaperIds);
 
+    List<Paper> findByWorkIdAndQuestionIdAndSubjectAndLevelAndScoreBatchNoIsNull(Long workId, Long questionId0, Subject subject, String code, Sort sort);
+
+    List<Paper> findByWorkIdAndSubjectAndLevelNotNullAndScoreBatchNoIsNull(Long workId, Subject subject, Sort sort);
+
+    int countByWorkIdAndSubjectAndRoughLevelIsNullAndIsMissingFalseAndRoughBatchNoIsNullAndTest(Long workId, Subject subject, int test);
+
+    int countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndBatchNoIsNullAndTest(Long workId, Subject subject, int test);
+
+    @Modifying
+    @Query("update Paper s set s.isAdminMark = ?2 where s.id = ?1")
+    void updatePaperAdminMarkById(Long paperId, boolean isMark);
 }

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

@@ -2,22 +2,15 @@ package cn.com.qmth.stmms.ms.quartz;
 
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
-import cn.com.qmth.stmms.ms.core.cache.ParamCache;
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkTaskJob;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Work;
-import cn.com.qmth.stmms.ms.core.domain.paramsetting.LevelConfig;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskJobRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.log.aop.MarkLogAop;
 import cn.com.qmth.stmms.ms.marking.config.MarkingConfig;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.scheduling.annotation.Async;
@@ -49,9 +42,6 @@ public class ScheduledTask implements InitializingBean {
     @Resource
     PaperRepo paperRepo;
 
-    @Resource
-    MarkTaskRepo markTaskRepo;
-
     @Resource
     WorkRepo workRepo;
 
@@ -114,7 +104,8 @@ public class ScheduledTask implements InitializingBean {
     public void repairMarkTaskJob(Work work) {
         try {
             List<MarkTaskJob> markTaskJobList = markTaskJobRepo.findAllByStatusIsFalseAndWorkId(work.getId());
-            if (Objects.nonNull(markTaskJobList) && !markTaskJobList.isEmpty()) {
+            // todo 需要改 20220802
+            /*if (Objects.nonNull(markTaskJobList) && !markTaskJobList.isEmpty()) {
                 long startTime = System.currentTimeMillis();
                 this.markTaskJob = true;
                 for (MarkTaskJob m : markTaskJobList) {
@@ -137,7 +128,7 @@ public class ScheduledTask implements InitializingBean {
                         }
                     }
                 }
-            }
+            }*/
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException(e);
@@ -196,7 +187,8 @@ public class ScheduledTask implements InitializingBean {
             String sql = "select * from (select mt.secret_number, count(mt.secret_number) as seq from mark_task mt where mt.work_id = ? group by mt.secret_number) temp where temp.seq > 1 LIMIT 500";
             List list = sqlUtil.execSqlForMapNative(sql, workId);
             Set tasks = new HashSet();
-            if (Objects.nonNull(list) && list.size() > 0) {
+            // todo 需要改 20220802
+            /*if (Objects.nonNull(list) && list.size() > 0) {
                 this.repairTask = true;
                 for (int i = 0; i < list.size(); i++) {
                     Map map = (Map) list.get(i);
@@ -215,7 +207,7 @@ public class ScheduledTask implements InitializingBean {
             if (Objects.nonNull(tasks) && tasks.size() > 0) {
                 LOGGER.info("需要修改的task数为:{}", tasks.size());
                 markTaskRepo.save(tasks);
-            }
+            }*/
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException(e);
@@ -262,7 +254,8 @@ public class ScheduledTask implements InitializingBean {
     private Long getRandomTask(Long markerId, Long paperId, Long workId, String examNumber) {
         int count = 0, result = 0;
         Long random = 0L;
-        while (true) {
+        // todo 需要改 20220802
+        /*while (true) {
             random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
             result = markTaskRepo.countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(markerId, paperId, workId, random);
             if (result == 0 && Long.parseLong(examNumber) != random) {
@@ -274,7 +267,7 @@ public class ScheduledTask implements InitializingBean {
                 randomUtil.getRandom(workId, true);
                 getRandomTask(markerId, paperId, workId, examNumber);
             }
-        }
+        }*/
         return random;
     }
 

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

@@ -172,17 +172,17 @@ public class BatchCreateDataTest {
         paramSettingRepo.save(paramSetting);
 
         //默认增加档位
-        Level aLevel = new Level(WORK_ID, "A", 0, 100, 90, Level.LevelType.ADMITED, 95, "", 93);
-        Level bLevel = new Level(WORK_ID, "B", 1, 89, 85, Level.LevelType.ADMITED, 87, "", 93);
-        Level cLevel = new Level(WORK_ID, "C", 2, 84, 80, Level.LevelType.ADMITED, 82, "", 80);
-        Level dLevel = new Level(WORK_ID, "D", 3, 79, 75, Level.LevelType.ADMITED, 77, "", 80);
-        Level eLevel = new Level(WORK_ID, "E", 4, 74, 70, Level.LevelType.ADMITED, 72, "", 68);
-        Level fLevel = new Level(WORK_ID, "F", 5, 69, 65, Level.LevelType.ADMITED, 67, "", 68);
-        Level gLevel = new Level(WORK_ID, "G", 6, 64, 60, Level.LevelType.ADMITED, 62, "", 68);
-        Level hLevel = new Level(WORK_ID, "H", 7, 59, 55, Level.LevelType.ADMITED, 57, "", 55);
-        Level iLevel = new Level(WORK_ID, "I", 8, 54, 50, Level.LevelType.ADMITED, 52, "", 55);
-        Level jLevel = new Level(WORK_ID, "J", 9, 49, 45, Level.LevelType.ADMITED, 47, "", 35);
-        Level kLevel = new Level(WORK_ID, "K", 10, 44, 0, Level.LevelType.ADMITED, 40, "", 35);
+        Level aLevel = new Level(WORK_ID, "A", 0, 100, 90, Level.LevelType.ADMITED, 95, "1", 93);
+        Level bLevel = new Level(WORK_ID, "B", 1, 89, 85, Level.LevelType.ADMITED, 87, "1", 93);
+        Level cLevel = new Level(WORK_ID, "C", 2, 84, 80, Level.LevelType.ADMITED, 82, "2", 80);
+        Level dLevel = new Level(WORK_ID, "D", 3, 79, 75, Level.LevelType.ADMITED, 77, "2", 80);
+        Level eLevel = new Level(WORK_ID, "E", 4, 74, 70, Level.LevelType.ADMITED, 72, "3", 68);
+        Level fLevel = new Level(WORK_ID, "F", 5, 69, 65, Level.LevelType.ADMITED, 67, "3", 68);
+        Level gLevel = new Level(WORK_ID, "G", 6, 64, 60, Level.LevelType.ADMITED, 62, "3", 68);
+        Level hLevel = new Level(WORK_ID, "H", 7, 59, 55, Level.LevelType.ADMITED, 57, "4", 55);
+        Level iLevel = new Level(WORK_ID, "I", 8, 54, 50, Level.LevelType.ADMITED, 52, "4", 55);
+        Level jLevel = new Level(WORK_ID, "J", 9, 49, 45, Level.LevelType.ADMITED, 47, "5", 35);
+        Level kLevel = new Level(WORK_ID, "K", 10, 44, 0, Level.LevelType.ADMITED, 40, "5", 35);
         List<Level> levels = Arrays.asList(aLevel, bLevel, cLevel, dLevel, eLevel, fLevel, gLevel, hLevel, iLevel, jLevel, kLevel);
         levelRepo.save(levels);
     }

+ 10 - 10
stmms-ms-main/src/test/java/BatchLevelTest.java

@@ -3,10 +3,10 @@ import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskLevel;
 import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkTaskLevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.junit.Test;
@@ -39,7 +39,7 @@ public class BatchLevelTest {
     private MarkSubjectRepo markSubjectRepo;
 
     @Autowired
-    private MarkTaskRepo markTaskRepo;
+    private MarkTaskLevelRepo markTaskLevelRepo;
 
     @Autowired
     private LevelRepo levelRepo;
@@ -70,7 +70,7 @@ public class BatchLevelTest {
 
         for (Subject subject : subjects) {
             List<Paper> list = new ArrayList<>();
-            List<MarkTask> listTask = new ArrayList<>();
+            List<MarkTaskLevel> listTask = new ArrayList<>();
 
             MarkSubject markSubject = markSubjectRepo.findOne(WORK_ID + "-" + subject.name());
             List<Paper> papers = paperRepo.findByWorkIdAndSubject(WORK_ID, subject);
@@ -80,8 +80,8 @@ public class BatchLevelTest {
                 paper.setLevel(level);
                 list.add(paper);
 
-                List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markSubject.getStage());
-                for (MarkTask markTask : markTasks) {
+                List<MarkTaskLevel> markTasks = markTaskLevelRepo.findByPaperIdAndStage(paper.getId(), markSubject.getStage());
+                for (MarkTaskLevel markTask : markTasks) {
                     markTask.setResult(level);
                     markTask.setLevel(level);
                     listTask.add(markTask);
@@ -100,17 +100,17 @@ public class BatchLevelTest {
                 paperRepo.save(data1);
             }
 
-            List<MarkTask> data2 = new ArrayList<>();
-            for (MarkTask p : listTask) {
+            List<MarkTaskLevel> data2 = new ArrayList<>();
+            for (MarkTaskLevel p : listTask) {
                 if (data2.size() == 2000) {
-                    markTaskRepo.save(data2);
+                    markTaskLevelRepo.save(data2);
                     data2.clear();
                 }
                 data2.add(p);
             }
             //将剩下的数据也导入
             if (!data2.isEmpty()) {
-                markTaskRepo.save(data2);
+                markTaskLevelRepo.save(data2);
             }
         }
 

+ 10 - 22
stmms-ms-main/src/test/java/BatchScoreTest.java

@@ -3,7 +3,7 @@ import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskScore;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.junit.Test;
@@ -29,26 +29,14 @@ public class BatchScoreTest {
 
     private static final Logger logger = LoggerFactory.getLogger(BatchScoreTest.class);
 
-    @Autowired
-    private ExamQuestionRepo examQuestionRepo;
-
-    @Autowired
-    private StudentRepo studentRepo;
-
     @Autowired
     private PaperRepo paperRepo;
 
-    @Autowired
-    private WorkRepo workRepo;
-
     @Autowired
     private MarkSubjectRepo markSubjectRepo;
 
     @Autowired
-    private MarkUserRepo markUserRepo;
-
-    @Autowired
-    private MarkTaskRepo markTaskRepo;
+    private MarkTaskScoreRepo markTaskScoreRepo;
 
     @Autowired
     private LevelRepo levelRepo;
@@ -79,7 +67,7 @@ public class BatchScoreTest {
 
         for (Subject subject : subjects) {
             List<Paper> list = new ArrayList<>();
-            List<MarkTask> listTask = new ArrayList<>();
+            List<MarkTaskScore> listTask = new ArrayList<>();
 
             MarkSubject markSubject = markSubjectRepo.findOne(WORK_ID + "-" + subject.name());
             List<Paper> papers = paperRepo.findByWorkIdAndSubject(WORK_ID, subject);
@@ -89,8 +77,8 @@ public class BatchScoreTest {
                 paper.setScore(score);
                 list.add(paper);
 
-                List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markSubject.getStage());
-                for (MarkTask markTask : markTasks) {
+                List<MarkTaskScore> markTasks = markTaskScoreRepo.findByPaperIdAndStage(paper.getId(), markSubject.getStage());
+                for (MarkTaskScore markTask : markTasks) {
                     markTask.setResult(score.toString());
                     listTask.add(markTask);
                 }
@@ -108,17 +96,17 @@ public class BatchScoreTest {
                 paperRepo.save(data1);
             }
 
-            List<MarkTask> data2 = new ArrayList<>();
-            for (MarkTask p : listTask) {
+            List<MarkTaskScore> data2 = new ArrayList<>();
+            for (MarkTaskScore p : listTask) {
                 if (data2.size() == 2000) {
-                    markTaskRepo.save(data2);
+                    markTaskScoreRepo.save(data2);
                     data2.clear();
                 }
                 data2.add(p);
             }
             //将剩下的数据也导入
             if (!data2.isEmpty()) {
-                markTaskRepo.save(data2);
+                markTaskScoreRepo.save(data2);
             }
         }
 
@@ -130,7 +118,7 @@ public class BatchScoreTest {
         if (level != null) {
             int random = getRandom(level.getMaxScore().intValue() - level.getMinScore().intValue());
             int scoreTemp = level.getMinScore().intValue() + random;
-            if(scoreTemp - level.getMaxScore().intValue() > 0){
+            if (scoreTemp - level.getMaxScore().intValue() > 0) {
                 scoreTemp = level.getMaxScore().intValue();
             }
             score = Double.valueOf(scoreTemp);

+ 107 - 46
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ChangeLevelApi.java

@@ -1,8 +1,10 @@
 package cn.com.qmth.stmms.ms.marking.api;
 
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
+import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
 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.task.MarkTaskScore;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.repository.*;
@@ -10,6 +12,7 @@ import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.ChangeLevelAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.ChangeLevelDTO;
 import cn.com.qmth.stmms.ms.marking.service.MarkingLevelService;
+import cn.com.qmth.stmms.ms.marking.service.MarkingRoughLevelService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -39,6 +42,9 @@ public class ChangeLevelApi {
     @Autowired
     private ChangeLevelRepo changeLevelRepo;
 
+    @Resource
+    private MarkTaskRoughLevelRepo markTaskRoughLevelRepo;
+
     @Resource
     private MarkTaskLevelRepo markTaskLevelRepo;
 
@@ -48,6 +54,9 @@ public class ChangeLevelApi {
     @Resource
     private ChangeLevelAssembler changeLevelAssembler;
 
+    @Resource
+    private MarkingRoughLevelService markingRoughLevelService;
+
     @Resource
     private MarkingLevelService markingLevelService;
 
@@ -71,7 +80,7 @@ public class ChangeLevelApi {
      * @param subject    科目
      * @param status     状态
      */
-    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    @GetMapping("/list")
     public PageableDTO changeLevel(@RequestParam(required = false) Long workId,
                                    @RequestParam(required = false) Long questionId,
                                    @RequestParam(required = false) String subject,
@@ -80,16 +89,16 @@ public class ChangeLevelApi {
                                    Pageable pageable) {
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject);
         List<ChangeLevelDTO> levelDTOs = new ArrayList<>();
-        Specification<Paper> specification = (root, query, builder) -> {
+        Specification<ChangeLevel> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             if (!StringUtils.isEmpty(workId)) {
                 predicates.add(builder.equal(root.get("workId"), workId));
             }
             if (!StringUtils.isEmpty(questionId)) {
-                List<Paper> papers;
+                List<Paper> papers = null;
                 if ("1".equals(type)) {
                     papers = paperRepo.findByWorkIdAndSubjectAndQuestionIdAndIsMissingAndTest(workId, Subject.valueOf(subject), questionId, false, markSubject.getTest());
-                    if (papers != null && papers.size() > 0) {
+                    if (papers != null && !papers.isEmpty()) {
                         CriteriaBuilder.In<Object> in = builder.in(root.get("paperId"));
                         for (Paper paper : papers) {
                             in.value(paper.getId());
@@ -97,8 +106,12 @@ public class ChangeLevelApi {
                         predicates.add(builder.and(builder.and(in)));
                     }
                 } else {
-                    papers = paperRepo.findByWorkIdAndSubjectAndQuestionIdAndIsMissingAndTestAndLevelIsNull(workId, Subject.valueOf(subject), questionId, false, markSubject.getTest());
-                    if (papers != null && papers.size() > 0) {
+                    if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+                        papers = paperRepo.findByWorkIdAndSubjectAndQuestionIdAndIsMissingAndTestAndRoughLevelIsNull(workId, Subject.valueOf(subject), questionId, false, markSubject.getTest());
+                    } else if (MarkStage.SCORE.equals(markSubject.getStage())) {
+                        papers = paperRepo.findByWorkIdAndSubjectAndQuestionIdAndIsMissingAndTestAndLevelIsNull(workId, Subject.valueOf(subject), questionId, false, markSubject.getTest());
+                    }
+                    if (papers != null && !papers.isEmpty()) {
                         CriteriaBuilder.In<Object> in = builder.in(root.get("paperId"));
                         for (Paper paper : papers) {
                             in.value(paper.getId());
@@ -117,7 +130,7 @@ public class ChangeLevelApi {
             }
             //改档处理
             if ("1".equals(type)) {
-                if (!StringUtils.isEmpty(status) && !StringUtils.isEmpty(status)) {
+                if (!StringUtils.isEmpty(status)) {
                     if (Objects.equals(status, "0")) {
                         predicates.add(builder.equal(root.get("auditStatus"), status));
                     } else {
@@ -125,7 +138,7 @@ public class ChangeLevelApi {
                     }
                 }
             } else {
-                if (!StringUtils.isEmpty(status) && !StringUtils.isEmpty(status)) {
+                if (!StringUtils.isEmpty(status)) {
                     if (Objects.equals(status, "0")) {
                         predicates.add(builder.equal(root.get("auditStatus"), status));
                     } else {
@@ -140,7 +153,6 @@ public class ChangeLevelApi {
 
         Page<ChangeLevel> levels = changeLevelRepo.findAll(specification, pageable);
 
-//        PageInfo<Map> pageInfo = sqlUtil.execSqlForListPageInfo(sql.toString(), pageable.getPageNumber(), pageable.getPageSize(), null);
         levels.getContent().forEach(m -> {
             levelDTOs.add(changeLevelAssembler.toDTO(m));
         });
@@ -150,56 +162,83 @@ public class ChangeLevelApi {
     /**
      * 科组长改档申请
      *
-     * @param markSubject
-     * @param paperId
-     * @param level
-     * @return
+     * @param markSubject 科目
+     * @param paperId     试卷
+     * @param level       档位
      */
-    @RequestMapping(value = "{markSubject}/changeLevel", method = RequestMethod.POST)
+    @PostMapping("{markSubject}/changeLevel")
     @Transactional
     public ResponseEntity changeLevel(@PathVariable MarkSubject markSubject,
                                       @RequestParam Long paperId,
                                       @RequestParam String level,
                                       @RequestParam Long userId) {
-        //只有打分阶段才能改档
-        if (!Objects.equals(markSubject.getStage().name(), MarkStage.SCORE.name())) {
-            throw new RuntimeException("只有打分阶段才允许改档");
+        boolean roughLevelEnable = ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevelEnable() == 1;
+        if (!roughLevelEnable) {
+            //只有打分阶段才能改档
+            if (!Objects.equals(markSubject.getStage(), MarkStage.SCORE)) {
+                throw new RuntimeException("未开启粗分档,只有打分阶段才允许改档");
+            }
+        } else {
+            //只有打分阶段才能改档
+            if (!Objects.equals(markSubject.getStage(), MarkStage.LEVEL)
+                    && !Objects.equals(markSubject.getStage(), MarkStage.SCORE)) {
+                throw new RuntimeException("已开启粗分档,只有细分档阶段或者打分阶段才允许改档");
+            }
         }
+
         Paper paper = paperRepo.findOne(paperId);
         MarkUser markUser = markUserRepo.findOne(userId);
 
         //
-        ChangeLevel changeLevelCurr = changeLevelRepo.findByWorkIdAndSubjectAndPaperIdAndAuditStatusAndIsCurr(markSubject.getWorkId(), markSubject.getSubject().name(), paperId);
+        ChangeLevel changeLevelCurr = changeLevelRepo.findByWorkIdAndSubjectAndStageAndPaperIdAndAuditStatusAndIsCurr(markSubject.getWorkId(), markSubject.getSubject().name(), markSubject.getStage(), paperId);
         if (changeLevelCurr != null) {
-            if (Objects.isNull(paper.getLevel())) {
-                throw new RuntimeException("纪检员已同意,请评卷员先完成改档");
-            }
-            if (Objects.isNull(paper.getScore())) {
-                throw new RuntimeException("改档已完成,请评卷员完成改档打分");
+            if (MarkStage.LEVEL.equals(changeLevelCurr.getStage())) {
+                if (Objects.isNull(paper.getRoughLevel())) {
+                    throw new RuntimeException("纪检员已同意,请评卷员先完成改大档");
+                }
+                if (Objects.isNull(paper.getLevel())) {
+                    throw new RuntimeException("改档已完成,请评卷员完成改小档");
+                }
+            } else if (MarkStage.SCORE.equals(changeLevelCurr.getStage())) {
+                if (Objects.isNull(paper.getLevel())) {
+                    throw new RuntimeException("纪检员已同意,请评卷员先完成改档");
+                }
+                if (Objects.isNull(paper.getScore())) {
+                    throw new RuntimeException("改档已完成,请评卷员完成改档打分");
+                }
             }
         }
 
-        List<ChangeLevel> list = changeLevelRepo.findAllByWorkIdAndSubjectAndPaperId(markSubject.getWorkId(), markSubject.getSubject().name(), paperId);
+        List<ChangeLevel> list = changeLevelRepo.findAllByWorkIdAndSubjectAndStageAndPaperId(markSubject.getWorkId(), markSubject.getSubject().name(), markSubject.getStage(), paperId);
         list.stream().map(m -> {
             m.setIsCurr(0);
             return m;
         }).collect(Collectors.toList());
         changeLevelRepo.save(list);
 
-        ChangeLevel changeLevel = changeLevelRepo.findByWorkIdAndSubjectAndPaperId(markSubject.getWorkId(), markSubject.getSubject().name(), paperId);
+        ChangeLevel changeLevel = changeLevelRepo.findByWorkIdAndSubjectAndStageAndPaperId(markSubject.getWorkId(), markSubject.getSubject().name(), markSubject.getStage(), paperId);
         if (changeLevel == null) {
             changeLevel = new ChangeLevel();
             changeLevel.setWorkId(markSubject.getWorkId());
             changeLevel.setSubject(markSubject.getSubject().name());
+            changeLevel.setStage(markSubject.getStage());
             changeLevel.setPaperId(paperId);
-            changeLevel.setOriginalLevel(paper.getLevel());
+            if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+                changeLevel.setOriginalLevel(paper.getRoughLevel());
+            } else if (MarkStage.SCORE.equals(markSubject.getStage())) {
+                changeLevel.setOriginalLevel(paper.getLevel());
+            }
             changeLevel.setSuggestLevel(level);
             changeLevel.setAuditStatus(0);
             changeLevel.setCreateId(markUser.getId());
             changeLevel.setCreateDate(new Date());
             changeLevel.setIsCurr(1);
         } else {
-            changeLevel.setOriginalLevel(paper.getLevel());
+            if (MarkStage.LEVEL.equals(changeLevel.getStage())) {
+                changeLevel.setOriginalLevel(paper.getRoughLevel());
+            } else if (MarkStage.SCORE.equals(changeLevel.getStage())) {
+                changeLevel.setOriginalLevel(paper.getLevel());
+            }
             changeLevel.setSuggestLevel(level);
             changeLevel.setCreateId(markUser.getId());
             changeLevel.setCreateDate(new Date());
@@ -218,11 +257,10 @@ public class ChangeLevelApi {
     /**
      * 科组长改档审核
      *
-     * @param id
-     * @param auditStatus
-     * @return
+     * @param id          id
+     * @param auditStatus 审核状态
      */
-    @RequestMapping(value = "/changeLevelAudit", method = RequestMethod.POST)
+    @PostMapping("/changeLevelAudit")
     @Transactional
     public ResponseEntity changeLevelAudit(@RequestParam Long id,
                                            @RequestParam Integer auditStatus,
@@ -233,24 +271,47 @@ public class ChangeLevelApi {
         //同意
         if (auditStatus == 1) {
             Paper paper = paperRepo.findOne(changeLevel.getPaperId());
-            //重置分数
-            paper.setScore(null);
+
+            if (MarkStage.LEVEL.equals(changeLevel.getStage())) {
+                //重置细分档档位
+                paper.setLevel(null);
+
+                List<MarkTaskRoughLevel> markTasks = markTaskRoughLevelRepo.findByPaperId(paper.getId());
+                List<String> ranges = markTasks.stream().map(m -> m.getMarkerId().toString()).collect(Collectors.toList());
+                markingRoughLevelService.reject(paper, changeLevel.getSuggestLevel(), String.join(",", ranges));
+
+                //重置已经打分的数据
+                List<MarkTaskLevel> markTasksLevels = markTaskLevelRepo.findByPaperId(paper.getId());
+                if (markTasksLevels != null && !markTasksLevels.isEmpty()) {
+                    markTasksLevels.forEach(o -> {
+                        o.setResult(null);
+                        o.setLevel(null);
+                    });
+                    markTaskLevelRepo.save(markTasksLevels);
+                }
+            } else if (MarkStage.SCORE.equals(changeLevel.getStage())) {
+                //重置分数
+                paper.setScore(null);
+
+                List<MarkTaskLevel> markTasks = markTaskLevelRepo.findByPaperId(paper.getId());
+                List<String> ranges = markTasks.stream().map(m -> m.getMarkerId().toString()).collect(Collectors.toList());
+                markingLevelService.reject(paper, changeLevel.getSuggestLevel(), String.join(",", ranges));
+
+                //重置已经打分的数据
+                List<MarkTaskScore> markTasksScore = markTaskScoreRepo.findByPaperId(paper.getId());
+                if (markTasksScore != null && !markTasksScore.isEmpty()) {
+                    markTasksScore.forEach(o -> {
+                        o.setResult(null);
+                        o.setLevel(null);
+                    });
+                    markTaskScoreRepo.save(markTasksScore);
+                }
+            }
             //状态设置
             paper.setShift(true);
             paper.setShiftScore(true);
-            List<MarkTaskLevel> markTasks = markTaskLevelRepo.findByPaperId(paper.getId());
-            List<String> ranges = markTasks.stream().map(m -> m.getMarkerId().toString()).collect(Collectors.toList());
-            markingLevelService.reject(paper, changeLevel.getSuggestLevel(), String.join(",", ranges));
-
-            //重置已经打分的数据
-            List<MarkTaskScore> markTasksScore = markTaskScoreRepo.findByPaperId(paper.getId());
-            if (markTasksScore != null && !markTasksScore.isEmpty()) {
-                markTasksScore.forEach(o -> {
-                    o.setResult(null);
-                    o.setLevel(null);
-                });
-                markTaskScoreRepo.save(markTasksScore);
-            }
+
+            paperRepo.save(paper);
 
             //记录日志
             MarkUser markUser = markUserRepo.findOne(userId);

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

@@ -489,6 +489,32 @@ public class MakrerApi {
 
         long finalKdtotal = kdtotal;
         long finalTotal = total;
+
+        LevelStatDTO nullLevelStatDto = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals("null")).findFirst().get();
+
+        if(nullLevelStatDto ==null) {
+            LevelStatDTO levelStatDTO = new LevelStatDTO();
+            //求任务数为null的条数
+            int totalCount = markTaskLevelRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), batchNo);
+            levelStatDTO.setCount(totalCount);
+            //查询改档
+            int shiftCount = markTaskRoughLevelRepo.countShiftByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.ROUGH_LEVEL.ordinal(), false);
+            levelStatDTO.setShift(shiftCount);
+            //查询改档打分
+            int shiftScoreCount = markTaskLevelRepo.countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
+            levelStatDTO.setShiftScore(shiftScoreCount);
+            levelStatDTOs.add(levelStatDTO);
+        } else {
+            int totalCount = markTaskLevelRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), batchNo);
+            nullLevelStatDto.setCount(totalCount);
+            //查询改档
+            int shiftCount = markTaskRoughLevelRepo.countShiftByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.ROUGH_LEVEL.ordinal(), false);
+            nullLevelStatDto.setShift(shiftCount);
+            //查询改档打分
+            int shiftScoreCount = markTaskLevelRepo.countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal());
+            nullLevelStatDto.setShiftScore(shiftScoreCount);
+        }
+
         levelStatDTOs.forEach(o -> {
             if (o.getId() != null) {
                 //当前老师各档位数量

+ 35 - 33
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java

@@ -100,7 +100,7 @@ public class MarkSubjectApi {
                             @RequestParam Subject subject) {
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
         if (MarkStage.INIT.equals(markSubject.getStage())) {
-            if (ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevel() == 1) {
+            if (ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevelEnable() == 1) {
                 markSubject.setStage(MarkStage.ROUGH_LEVEL);
             } else {
                 markSubject.setStage(MarkStage.LEVEL);
@@ -110,40 +110,22 @@ public class MarkSubjectApi {
             //是否有未结束的分档任务
             int count = paperRepo.countByWorkIdAndSubjectAndRoughLevelIsNullAndIsMissingFalseAndRoughBatchNoNotNullAndTest(workId, subject, markSubject.getTest());
             if (count > 0) {
-                throw new RuntimeException("没有分档完成");
+                throw new RuntimeException("评卷任务没有分档完成");
             }
-        } else if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-            markSubject.setStage(MarkStage.SCORE);
-            //是否有未结束的分档任务
-            int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndBatchNoNotNullAndTest(workId, subject, markSubject.getTest());
+            count = paperRepo.countByWorkIdAndSubjectAndRoughLevelIsNullAndIsMissingFalseAndRoughBatchNoIsNullAndTest(workId, subject, markSubject.getTest());
             if (count > 0) {
-                throw new RuntimeException("没有分档完成");
+                throw new RuntimeException("有未发布的评卷任务");
             }
+        } else if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+            markSubject.setStage(MarkStage.SCORE);
+            stageControlService.enterToScoreStage(markSubject);
         }
         markSubjectRepo.save(markSubject);
 
-        // 清除用户分组
+        // 清除用户表中分组ID
         markUserRepo.updateGroupIdByWorkIdAndSubject(workId, subject);
-    }
 
-    /**
-     * 当个评卷科目信息
-     *
-     * @param markSubjectId 评卷科目id
-     */
-    @GetMapping("{markSubjectId}")
-    public MarkSubject get(@PathVariable String markSubjectId) {
-        MarkSubject markSubject = markSubjectRepo.findOne(markSubjectId);
-        if (markSubject.getTest() == 0) {
-            int count = 0;
-            if (MarkStage.ROUGH_LEVEL.equals(markSubject.getStage())) {
-                count = markTaskRoughLevelRepo.countByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage());
-            } else if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-                count = markTaskLevelRepo.countByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage());
-            }
-            markSubject.setFormal(count > 0);
-        }
-        return markSubject;
+        stageControlService.logoutAndBackupDb(markSubject);
     }
 
     /**
@@ -152,8 +134,8 @@ public class MarkSubjectApi {
      * @param markSubject 评卷科目id
      */
     @PatchMapping("{markSubject}")
-    public void goNext(@PathVariable MarkSubject markSubject, @RequestBody Map map) throws Exception {
-        stageControlService.goNext(markSubject, map);
+    public void createTask(@PathVariable MarkSubject markSubject, @RequestBody Map map) throws Exception {
+        stageControlService.createTask(markSubject, map);
     }
 
     /**
@@ -161,18 +143,38 @@ public class MarkSubjectApi {
      *
      * @param markSubject 评卷科目id
      */
-    @RequestMapping(value = "{markSubject}/publishScore", method = RequestMethod.POST)
+    @PostMapping("{markSubject}/publishScore")
     public void publishScore(@PathVariable MarkSubject markSubject, @RequestBody Map map) throws Exception {
         Object questionId = map.get("questionId");
         List<TaskPublishSetting> taskList = JSONObject.parseArray(JSONObject.toJSONString(map.get("taskList")), TaskPublishSetting.class);
         stageControlService.enterScoreStage(markSubject, taskList, questionId);
     }
 
+    /**
+     * 单个评卷科目信息
+     *
+     * @param markSubjectId 评卷科目id
+     */
+    @GetMapping("/{markSubjectId}")
+    public MarkSubject get(@PathVariable String markSubjectId) {
+        MarkSubject markSubject = markSubjectRepo.findOne(markSubjectId);
+        if (markSubject.getTest() == 0) {
+            int count = 0;
+            if (MarkStage.ROUGH_LEVEL.equals(markSubject.getStage())) {
+                count = markTaskRoughLevelRepo.countByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage());
+            } else if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+                count = markTaskLevelRepo.countByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage());
+            }
+            markSubject.setFormal(count > 0);
+            markSubject.setRoughLevelEnable(ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevelEnable() == 1);
+        }
+        return markSubject;
+    }
+
     /**
      * 该评卷科目下的评卷员列表
      *
      * @param markSubject 评卷科目id
-     * @return
      */
     @RequestMapping(value = "{markSubject}/markers", method = RequestMethod.GET)
     public List<MarkUser> markUsers(@PathVariable MarkSubject markSubject) {
@@ -576,7 +578,7 @@ public class MarkSubjectApi {
     public List<MarkerGroup> getMarkerGroups(@PathVariable MarkSubject markSubject) {
         MarkStage stage = markSubject.getStage();
         if (MarkStage.INIT.equals(markSubject.getStage())) {
-            if (ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevel() == 1) {
+            if (ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevelEnable() == 1) {
                 stage = MarkStage.ROUGH_LEVEL;
             } else {
                 stage = MarkStage.LEVEL;
@@ -623,7 +625,7 @@ public class MarkSubjectApi {
         markerGroup.setSubject(markSubject.getSubject());
         MarkStage stage = markSubject.getStage();
         if (markSubject.getStage().equals(MarkStage.INIT)) {
-            if (ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevel() == 1) {
+            if (ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevelEnable() == 1) {
                 stage = MarkStage.ROUGH_LEVEL;
             } else {
                 stage = MarkStage.LEVEL;

+ 9 - 35
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -105,9 +105,10 @@ public class MarkTaskApi {
             return markTaskRoughLevelService.listMarkTaskLevel(markerId, isSample, reject, level, questionId, areaCode, pageable);
         } else if (MarkStage.LEVEL.equals(stage)) {
             return markTaskLevelService.listMarkTaskLevel(markerId, isSample, reject, level, questionId, areaCode, pageable);
-        } else {
+        } else if (MarkStage.SCORE.equals(stage)) {
             return markTaskScoreService.listMarkTaskScore(markerId, isSample, reject, level, questionId, areaCode, pageable);
         }
+        return null;
     }
 
     /**
@@ -115,52 +116,23 @@ public class MarkTaskApi {
      *
      * @param markerId   评卷员用户id
      * @param questionId 试题id
-     * @return
      */
-    @RequestMapping(value = "/shift", method = RequestMethod.GET)
+    @GetMapping("/shift")
     public PageableDTO list(@RequestParam Long markerId,
                             @RequestParam(required = false) Long workId,
+                            @RequestParam MarkStage stage,
                             @RequestParam(required = false) Boolean isShift,
                             @RequestParam(required = false) Boolean isShiftScore,
                             @RequestParam Long questionId,
                             Pageable pageable) {
 
-        if (isShift != null && isShift) {
+        if (MarkStage.LEVEL.equals(stage)) {
             return markTaskLevelService.shiftLevel(markerId, workId, isShift, isShiftScore, questionId, pageable);
-        }
-        if (isShiftScore != null && isShiftScore && !isShift && isShiftScore) {
+        } else if (MarkStage.SCORE.equals(stage)) {
             return markTaskScoreService.shiftScore(markerId, workId, isShift, isShiftScore, questionId, pageable);
         }
         return null;
 
-//        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
-//        Specification<MarkTask> specification = (root, query, builder) -> {
-//            List<Predicate> predicates = new ArrayList<>();
-//            predicates.add(builder.equal(root.get("questionId"), questionId));
-//            predicates.add(builder.equal(root.get("markerId"), markerId));
-//            if (isShift != null) {
-//                //查询
-//                predicates.add(builder.equal(root.get("paper").get("isShift"), isShift));
-//                if (isShift) {
-//                    predicates.add(builder.equal(root.get("stage"), MarkStage.LEVEL));
-//                    predicates.add(builder.isNull(root.get("result")));
-//                }
-//            }
-//            if (isShiftScore != null && isShiftScore && !isShift) {
-//                predicates.add(builder.equal(root.get("paper").get("isShiftScore"), isShiftScore));
-//                if (isShiftScore) {
-//                    predicates.add(builder.equal(root.get("stage"), MarkStage.SCORE));
-//                    predicates.add(builder.isNull(root.get("result")));
-//                }
-//            }
-//            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
-//        };
-//        Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
-//        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
-//        Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
-//
-//        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskAssembler.toShiftDTO(m)));
-//        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
     }
 
     /**
@@ -428,7 +400,9 @@ public class MarkTaskApi {
                                     @RequestParam MarkStage stage,
                                     @RequestParam Long markerId,
                                     Pageable pageable) {
-        if (stage.equals(MarkStage.LEVEL)) {
+        if (stage.equals(MarkStage.ROUGH_LEVEL)) {
+            return markTaskRoughLevelService.listMarkedTaskLevel(workId, subject, markerId, pageable);
+        } else if (stage.equals(MarkStage.LEVEL)) {
             return markTaskLevelService.listMarkedTaskLevel(workId, subject, markerId, pageable);
         } else if (stage.equals(MarkStage.SCORE)) {
             return markTaskScoreService.listMarkedTaskScore(workId, subject, markerId, pageable);

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

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.ms.marking.api;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
+import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
@@ -12,6 +13,7 @@ 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.task.MarkTaskScore;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
+import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkTaskLevelAssembler;
@@ -223,7 +225,7 @@ public class PaperApi {
                 predicates.add(builder.equal(root.get("isRelate"), isRelate));
             }
             if (isMark != null) {
-                predicates.add(builder.equal(root.get("isMark"), isMark));
+                predicates.add(builder.equal(root.get("isAdminMark"), isMark));
             }
             //考生姓名
             if (studentName != null && !"".equals(studentName)) {
@@ -616,6 +618,7 @@ public class PaperApi {
         for (Map.Entry<String, List<Paper>> entry : groupPaper.entrySet()) {
             JSONObject object = new JSONObject();
             String key = entry.getKey();
+            object.put("roughLevelEnable", ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevelEnable() == 1);
             object.put("examNumber", key.split(":")[0]);
             object.put("name", key.split(":")[1]);
 
@@ -812,10 +815,14 @@ public class PaperApi {
      * @param paperId 试卷ID
      * @param isMark  标记状态
      */
-    @RequestMapping(value = "/mark_paper", method = RequestMethod.POST)
+    @PostMapping("/mark_paper")
     @Transactional
-    public Object markPaper(@RequestParam Long paperId, @RequestParam boolean isMark) {
-        paperRepo.updatePaperMarkById(paperId, isMark);
+    public Object markPaper(@RequestParam Long paperId, @RequestParam boolean isMark, @RequestParam Role role) {
+        if (Role.ADMIN.equals(role)) {
+            paperRepo.updatePaperAdminMarkById(paperId, isMark);
+        } else if (Role.MARK_LEADER.equals(role)) {
+            paperRepo.updatePaperMarkById(paperId, isMark);
+        }
         return true;
     }
 

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

@@ -60,6 +60,7 @@ public class MarkTaskLevelAssembler {
             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());
@@ -170,7 +171,7 @@ public class MarkTaskLevelAssembler {
                 markTaskDTO.setOriginLevel(changeLevel != null ? changeLevel.getOriginalLevel() : "");
             }
             if (paper.isShiftScore()) {
-                markTaskDTO.setLevel(paper.getLevel());
+                markTaskDTO.setRoughLevel(paper.getRoughLevel());
             }
             markTaskDTO.setSn(markTask.getSecretNumber());
             markTaskDTO.setRedoLevel(paper.getRedoLevel());

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

@@ -190,6 +190,7 @@ public class PaperAssembler {
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setStudentName(student.getName());
             paperDTO.setMark(paper.isMark());
+            paperDTO.setAdminMark(paper.isAdminMark());
         }
         return paperDTO;
     }

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

@@ -14,6 +14,7 @@ public class MarkTaskDTO implements Serializable{
     private String sn;
     private String redoLevel;
     private String level;
+    private String roughLevel;
     private Double score;
     private Object result;
     private String originLevel;
@@ -143,6 +144,14 @@ public class MarkTaskDTO implements Serializable{
         this.level = level;
     }
 
+    public String getRoughLevel() {
+        return roughLevel;
+    }
+
+    public void setRoughLevel(String roughLevel) {
+        this.roughLevel = roughLevel;
+    }
+
     public Double getScore() {
         return score;
     }
@@ -278,4 +287,5 @@ public class MarkTaskDTO implements Serializable{
     public void setMark(Boolean mark) {
         isMark = mark;
     }
+
 }

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

@@ -56,6 +56,7 @@ public class PaperDTO implements Serializable{
     private String studentName;
     private boolean isOneClick;
     private boolean isMark;
+    private boolean isAdminMark;
     private String secretNumber;
     private Long scanUserId;
     private List<MarkTaskDTO> markResults = new ArrayList<>();
@@ -352,6 +353,14 @@ public class PaperDTO implements Serializable{
         isMark = mark;
     }
 
+    public boolean isAdminMark() {
+        return isAdminMark;
+    }
+
+    public void setAdminMark(boolean adminMark) {
+        isAdminMark = adminMark;
+    }
+
     public String getSecretNumber() {
         return secretNumber;
     }

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

@@ -1,9 +1,7 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
-import cn.com.qmth.stmms.ms.commons.utils.DbBackupUtils;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
-import cn.com.qmth.stmms.ms.core.cache.CacheService;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskLevel;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskRoughLevel;
@@ -15,7 +13,6 @@ import cn.com.qmth.stmms.ms.core.repository.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
@@ -56,17 +53,11 @@ public class AssignTaskService {
     @Autowired
     SqlUtil sqlUtil;
 
-    @Autowired
-    DbBackupUtils dbBackupUtils;
-
-    @Autowired
-    CacheService cacheService;
-
     @Autowired
     MarkUserRepo markUserRepo;
 
     /**
-     * 分档任务发布
+     * 细分档任务发布
      *
      * @param groupPaperMap 各分组待发试卷集合
      * @param markerGroups  所有分组
@@ -112,7 +103,6 @@ public class AssignTaskService {
                     markTaskLevelList.add(markTask);
                     randomMap.put(random, markTask);
                 }
-//                paper.setActive(true);
                 paper.setRoughBatchNo(currentTime);
                 paperList.add(paper);
             }
@@ -136,7 +126,7 @@ public class AssignTaskService {
     }
 
     /**
-     * 分档任务发布
+     * 分档任务发布
      *
      * @param groupPaperMap 各分组待发试卷集合
      * @param markerGroups  所有分组
@@ -182,7 +172,6 @@ public class AssignTaskService {
                     markTaskLevelList.add(markTask);
                     randomMap.put(random, markTask);
                 }
-//                paper.setActive(true);
                 paper.setBatchNo(currentTime);
                 paperList.add(paper);
             }
@@ -205,6 +194,107 @@ public class AssignTaskService {
         paperRepo.save(paperList);
     }
 
+    /**
+     * 打分任务发布
+     * <p>
+     * 分组任务模式,将该科目的评卷员分成N组,将该科目试卷平均分给这些组,每组内的评卷员每人将这些试卷打分
+     * 比如:6个评卷员分2组,有1000份试卷,每组评500份,每个评卷员评500份
+     *
+     * @param papers       试卷
+     * @param markerGroups 分组
+     * @param markSubject  科目
+     * @param taskList     打分任务
+     */
+    @Transactional
+    public void assignForGroupingScore(List<Paper> papers, List<MarkerGroup> markerGroups, MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
+        markerGroups = markerGroups.stream().filter(m -> m.getMarkers() != null && !m.getMarkers().isEmpty()).collect(Collectors.toList());
+        int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
+        int groupSize = markerGroups.size();
+        int idx = 0;
+        long currentTime = System.currentTimeMillis();
+        Iterator<Paper> iterator = papers.iterator();
+        List<MarkTaskScore> markTaskScoreList = new ArrayList<>(papers.size() * sum);
+        List<Paper> paperList = new ArrayList<>(papers.size());
+        List<Object[]> markTasks = markTaskScoreRepo.findAllByWorkId(markSubject.getWorkId());
+        Map<Long, Object> randomMap = new HashMap<>();
+        markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
+        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
+        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
+        //定序序号记录
+        Map<String, Integer> map = new HashMap();
+        Map<String, Integer> seqNewMap = new HashMap();
+        while (iterator.hasNext()) {
+            if (idx >= groupSize) {
+                idx = 0;
+            }
+            Paper paper = iterator.next();
+            String serialNumber = null;
+            Integer displayNumber = null;
+            Integer seqNewNumber = null;
+            //是否定序
+            int seq = 0;
+            long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
+            if (sortRule != 0) {
+                if (map.containsKey(paper.getLevel() + idx)) {
+                    seq = map.get(paper.getLevel() + idx);
+                }
+                ++seq;
+                serialNumber = paper.getLevel() + seq;
+                //是否显示序号
+                long display = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getDisplayNumber() == 1).count();
+                displayNumber = (int) display;
+                //设置新值
+                map.put(paper.getLevel() + idx, seq);
+
+                int seqNew = 0;
+                if (seqNewMap.containsKey(paper.getLevel())) {
+                    seqNew = seqNewMap.get(paper.getLevel());
+                }
+                seqNewNumber = ++seqNew;
+                seqNewMap.put(paper.getLevel(), seqNew);
+            }
+            Set<MarkUser> markUsers = markerGroups.get(idx).getMarkers();
+            markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
+            for (MarkUser marker : markUsers) {
+                Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
+                MarkTaskScore markTask = new MarkTaskScore(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
+                if (Objects.nonNull(serialNumber)) {
+                    //和随机数位数保持一致(8位)
+                    String randomSeqNew = String.format("%08d", seqNewNumber);
+                    markTask.setRandomSeqNew(Long.valueOf(levelValue + randomSeqNew));
+                } else {
+                    markTask.setRandomSeqNew(Long.valueOf(levelValue + markTask.getRandomSeqNew()));
+                }
+                markTask.setBatchNo(currentTime);
+                markTask.setSerialNumber(serialNumber);
+                markTask.setDisplayNumber(displayNumber);
+                markTask.setLevel(paper.getLevel());
+
+                markTaskScoreList.add(markTask);
+                randomMap.put(random, markTask);
+            }
+            paper.setScoreBatchNo(currentTime);
+            paperList.add(paper);
+            idx++;
+        }
+
+        List<MarkTaskScore> data = new ArrayList<>();
+        //5000条提交一次
+        for (MarkTaskScore markTask : markTaskScoreList) {
+            if (data.size() == 2000) {
+                markTaskScoreRepo.save(data);
+                data.clear();
+            }
+            data.add(markTask);
+        }
+        //将剩下的数据也导入
+        if (!data.isEmpty()) {
+            markTaskScoreRepo.save(data);
+        }
+        paperRepo.save(paperList);
+    }
+
     /**
      * 分组任务模式,将该科目的评卷员分成N组,将该科目试卷平均分给这些组,每组内的评卷员每人将这些试卷打分
      * 比如:6个评卷员分2组,有1000份试卷,每组评500份,每个评卷员评500份
@@ -365,32 +455,13 @@ public class AssignTaskService {
         paperRepo.save(paperList);
     }
 
-    @Transactional
-    public void assignForGroupingScore(MarkSubject markSubject, List<MarkerGroup> markerGroups) {
-        //只有全部任务投放完成,才能删除分组
-        int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getTest());
-        if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
-            /*for (MarkerGroup markerGroup : markerGroups) {
-                markerGroup.setMarkers(null);
-            }
-            markerGroupRepo.delete(markerGroups);*/
-            //初始化打分任务数据
-            initTaskPublishData(markSubject.getWorkId(), markSubject.getSubject().name());
-
-        }
-
-        // 所有用户强制退出
-        List<MarkUser> userList = markUserRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
-        userList = userList.stream().filter(m -> Role.MARKER.equals(m.getRole()) || Role.MARK_LEADER.equals(m.getRole())).collect(Collectors.toList());
-        if (!CollectionUtils.isEmpty(userList)) {
-            for (MarkUser user : userList) {
-                cacheService.deleteTokenCache(user.getId().toString());
-            }
-        }
-        dbBackupUtils.startBackup(markSubject.getWorkId(), "分档");
-    }
-
-    public void initTaskPublishData(Long workId, String suject) {
+    /**
+     * 生成打分汇总数据
+     *
+     * @param workId  工作ID
+     * @param subject 科目
+     */
+    public void initTaskPublishData(Long workId, String subject) {
         StringBuffer sql = new StringBuffer();
         sql.append("  SELECT                                                                    ");
         sql.append("          p.work_id workId,                                                  ");
@@ -398,16 +469,14 @@ public class AssignTaskService {
         sql.append("          p.subject,                                                         ");
         sql.append("          p.level,                                                           ");
         sql.append("              COUNT(1) AS totalCount                                         ");
-//        sql.append("              SUM(IF(p.score IS NOT NULL, 1, 0)) successCount,             ");
-//        sql.append("              SUM(IF(p.score IS NULL, 1, 0)) waitCount                     ");
         sql.append("      FROM                                                                   ");
         sql.append("          paper p                                                            ");
         sql.append("      WHERE                                                                  ");
-        sql.append("          p.work_id = '" + workId + "' AND p.subject = '" + suject + "'      ");
+        sql.append("          p.work_id = '" + workId + "' AND p.subject = '" + subject + "'      ");
         sql.append("              AND p.is_test = 0                                              ");
         sql.append("              AND p.level IS NOT NULL                                        ");
         sql.append("              AND p.is_missing = FALSE                                       ");
-        sql.append("              AND p.is_active = TRUE                                         ");
+        sql.append("              AND p.batch_no is not null                                     ");
         sql.append("      GROUP BY p.work_id , p.question_id, p.subject , p.level                ");
         sql.append("  ORDER BY p.level                                                            ");
         List list = sqlUtil.execSqlForMap(sql.toString());

+ 76 - 27
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskLevelService.java

@@ -11,10 +11,13 @@ import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 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.domain.user.Role;
 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.assembler.PaperAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
@@ -48,12 +51,18 @@ public class MarkTaskLevelService {
     @Resource
     private MarkSubjectRepo markSubjectRepo;
 
+    @Resource
+    private MarkTaskRoughLevelRepo markTaskRoughLevelRepo;
+
     @Resource
     private MarkTaskLevelRepo markTaskLevelRepo;
 
     @Resource
     private ExamQuestionRepo examQuestionRepo;
 
+    @Resource
+    private MarkTaskRoughLevelAssembler markTaskRoughLevelAssembler;
+
     @Resource
     private MarkTaskLevelAssembler markTaskLevelAssembler;
 
@@ -104,6 +113,8 @@ public class MarkTaskLevelService {
             }
             if (reject != null && reject) {
                 onPredicates.add(builder.equal(join.get("isRejected"), reject));
+                onPredicates.add(builder.equal(join.get("isShift"), false));
+                onPredicates.add(builder.equal(join.get("isShiftScore"), false));
             } else {
                 predicates.add(builder.equal(root.get("isRejected"), reject));
             }
@@ -222,19 +233,38 @@ public class MarkTaskLevelService {
     }
 
     public PageableDTO listMarkedTaskLevel(Long workId, Subject subject, Long markerId, Pageable pageable) {
-        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
-        Specification<MarkTaskLevel> specification = (root, query, builder) -> {
-            List<Predicate> predicates = new ArrayList<>();
-            predicates.add(builder.equal(root.get("workId"), workId));
-            predicates.add(builder.equal(root.get("subject"), subject));
-            predicates.add(builder.equal(root.get("markerId"), markerId));
-            predicates.add(builder.equal(root.get("isMark"), true));
-            return builder.and(predicates.toArray(new Predicate[0]));
-        };
-        Page<MarkTaskLevel> markTasks = markTaskLevelRepo.findAll(specification, pageable);
+        MarkUser markUser = markUserRepo.findOne(markerId);
+        if (Role.MARKER.equals(markUser.getRole())) {
+            List<PaperDTO> paperDTOS = new ArrayList<>();
+            Specification<MarkTaskLevel> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"), workId));
+                predicates.add(builder.equal(root.get("subject"), subject));
+                predicates.add(builder.equal(root.get("stage"), MarkStage.LEVEL));
+                predicates.add(builder.equal(root.get("markerId"), markerId));
+                predicates.add(builder.equal(root.get("isMark"), true));
+                return builder.and(predicates.toArray(new Predicate[0]));
+            };
+            Page<MarkTaskLevel> markTasks = markTaskLevelRepo.findAll(specification, pageable);
 
-        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskLevelAssembler.toDTO(m)));
-        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+            markTasks.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m.getPaper())));
+            return new PageableDTO(paperDTOS, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        } else if (Role.MARK_LEADER.equals(markUser.getRole())) {
+            List<PaperDTO> paperDTOS = new ArrayList<>();
+            Specification<Paper> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"), workId));
+                predicates.add(builder.equal(root.get("subject"), subject));
+                predicates.add(builder.equal(root.get("isMark"), true));
+                return builder.and(predicates.toArray(new Predicate[0]));
+            };
+            Page<Paper> papers = paperRepo.findAll(specification, pageable);
+
+            papers.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m)));
+            return new PageableDTO(paperDTOS, papers.getTotalElements(), papers.getTotalPages(), pageable.getPageNumber());
+        } else {
+            throw new RuntimeException("当前角色无法查询标记试卷");
+        }
     }
 
     public List<MarkTaskLevel> getBySecretNumberLevel(Long workId, Subject subject, String secretNumber, int test) {
@@ -243,22 +273,41 @@ public class MarkTaskLevelService {
 
     public PageableDTO shiftLevel(Long markerId, Long workId, Boolean isShift, Boolean isShiftScore, Long questionId, Pageable pageable) {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
-        Specification<MarkTaskLevel> specification = (root, query, builder) -> {
-            List<Predicate> predicates = new ArrayList<>();
-            predicates.add(builder.equal(root.get("questionId"), questionId));
-            predicates.add(builder.equal(root.get("markerId"), markerId));
-            //查询
-            predicates.add(builder.equal(root.get("paper").get("isShift"), isShift));
-            predicates.add(builder.equal(root.get("stage"), MarkStage.LEVEL));
-            predicates.add(builder.isNull(root.get("result")));
-            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
-        };
-        Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
-        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
-        Page<MarkTaskLevel> markTasks = markTaskLevelRepo.findAll(specification, pageable1);
+        if (isShift) {
+            Specification<MarkTaskRoughLevel> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("questionId"), questionId));
+                predicates.add(builder.equal(root.get("markerId"), markerId));
+                //查询
+                predicates.add(builder.equal(root.get("paper").get("isShift"), isShift));
+                predicates.add(builder.equal(root.get("stage"), MarkStage.ROUGH_LEVEL));
+                predicates.add(builder.isNull(root.get("result")));
+                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            };
+            Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
+            Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+            Page<MarkTaskRoughLevel> markTasks = markTaskRoughLevelRepo.findAll(specification, pageable1);
 
-        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskLevelAssembler.toShiftDTO(m)));
-        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+            markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskRoughLevelAssembler.toShiftDTO(m)));
+            return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        } else if (isShiftScore) {
+            Specification<MarkTaskRoughLevel> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("questionId"), questionId));
+                predicates.add(builder.equal(root.get("markerId"), markerId));
+                predicates.add(builder.equal(root.get("paper").get("isShiftScore"), isShiftScore));
+                predicates.add(builder.equal(root.get("stage"), MarkStage.LEVEL));
+                predicates.add(builder.isNull(root.get("result")));
+                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            };
+            Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
+            Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+            Page<MarkTaskLevel> markTasks = markTaskLevelRepo.findAll(specification, pageable1);
+
+            markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskLevelAssembler.toShiftDTO(m)));
+            return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        }
+        return null;
     }
 
     public PaperDTO getByTaskSecretNumberLevel(Long questionId, String sn) {

+ 32 - 12
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskRoughLevelService.java

@@ -13,6 +13,7 @@ import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 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.domain.user.Role;
 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.MarkTaskRoughLevelAssembler;
@@ -223,19 +224,38 @@ public class MarkTaskRoughLevelService {
     }
 
     public PageableDTO listMarkedTaskLevel(Long workId, Subject subject, Long markerId, Pageable pageable) {
-        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
-        Specification<MarkTaskLevel> specification = (root, query, builder) -> {
-            List<Predicate> predicates = new ArrayList<>();
-            predicates.add(builder.equal(root.get("workId"), workId));
-            predicates.add(builder.equal(root.get("subject"), subject));
-            predicates.add(builder.equal(root.get("markerId"), markerId));
-            predicates.add(builder.equal(root.get("isMark"), true));
-            return builder.and(predicates.toArray(new Predicate[0]));
-        };
-        Page<MarkTaskRoughLevel> markTasks = markTaskRoughLevelRepo.findAll(specification, pageable);
+        MarkUser markUser = markUserRepo.findOne(markerId);
+        if(Role.MARKER.equals(markUser.getRole())) {
+            List<PaperDTO> paperDTOS = new ArrayList<>();
+            Specification<MarkTaskRoughLevel> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"), workId));
+                predicates.add(builder.equal(root.get("subject"), subject));
+                predicates.add(builder.equal(root.get("stage"), MarkStage.ROUGH_LEVEL));
+                predicates.add(builder.equal(root.get("markerId"), markerId));
+                predicates.add(builder.equal(root.get("isMark"), true));
+                return builder.and(predicates.toArray(new Predicate[0]));
+            };
+            Page<MarkTaskRoughLevel> markTasks = markTaskRoughLevelRepo.findAll(specification, pageable);
 
-        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskRoughLevelAssembler.toDTO(m)));
-        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+            markTasks.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m.getPaper())));
+            return new PageableDTO(paperDTOS, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        } else if(Role.MARK_LEADER.equals(markUser.getRole())){
+            List<PaperDTO> paperDTOS = new ArrayList<>();
+            Specification<Paper> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"), workId));
+                predicates.add(builder.equal(root.get("subject"), subject));
+                predicates.add(builder.equal(root.get("isMark"), true));
+                return builder.and(predicates.toArray(new Predicate[0]));
+            };
+            Page<Paper> papers = paperRepo.findAll(specification, pageable);
+
+            papers.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m)));
+            return new PageableDTO(paperDTOS, papers.getTotalElements(), papers.getTotalPages(), pageable.getPageNumber());
+        } else {
+            throw new RuntimeException("当前角色无法查询标记试卷");
+        }
     }
 
     public List<MarkTaskRoughLevel> getBySecretNumberLevel(Long workId, Subject subject, String secretNumber, int test) {

+ 78 - 29
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskScoreService.java

@@ -10,10 +10,13 @@ import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskLevel;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskScore;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
 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.MarkTaskScoreAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
@@ -48,6 +51,9 @@ public class MarkTaskScoreService {
     @Resource
     private MarkSubjectRepo markSubjectRepo;
 
+    @Resource
+    private MarkTaskLevelRepo markTaskLevelRepo;
+
     @Resource
     private MarkTaskScoreRepo markTaskScoreRepo;
 
@@ -63,6 +69,9 @@ public class MarkTaskScoreService {
     @Resource
     private PaperAssembler paperAssembler;
 
+    @Resource
+    private MarkTaskLevelAssembler markTaskLevelAssembler;
+
     @Resource
     private MarkTaskScoreAssembler markTaskScoreAssembler;
 
@@ -108,7 +117,7 @@ public class MarkTaskScoreService {
             } else {
                 predicates.add(builder.equal(root.get("isRejected"), reject));
             }
-            onPredicates.add(builder.equal(join.get("active"), true));
+            onPredicates.add(builder.isNotNull(join.get("batchNo")));
             //过滤考区
             if (Objects.nonNull(areaCode)) {
                 onPredicates.add(builder.equal(join.get("areaCode"), areaCode));
@@ -120,7 +129,7 @@ public class MarkTaskScoreService {
         Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
         Page<MarkTaskScore> markTasks = markTaskScoreRepo.findAll(specification, pageable1);
 
-        if (Objects.isNull(markTasks) || markTasks.getContent().size() == 0) {
+        if (Objects.isNull(markTasks) || markTasks.getContent().isEmpty()) {
             if (Objects.nonNull(isSample) && isSample) {
                 ExamQuestion examQuestion = examQuestionRepo.findOne(questionId);
                 MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + examQuestion.getSubject());
@@ -203,19 +212,38 @@ public class MarkTaskScoreService {
     }
 
     public PageableDTO listMarkedTaskScore(Long workId, Subject subject, Long markerId, Pageable pageable) {
-        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
-        Specification<MarkTaskScore> specification = (root, query, builder) -> {
-            List<Predicate> predicates = new ArrayList<>();
-            predicates.add(builder.equal(root.get("workId"), workId));
-            predicates.add(builder.equal(root.get("subject"), subject));
-            predicates.add(builder.equal(root.get("markerId"), markerId));
-            predicates.add(builder.equal(root.get("isMark"), true));
-            return builder.and(predicates.toArray(new Predicate[0]));
-        };
-        Page<MarkTaskScore> markTasks = markTaskScoreRepo.findAll(specification, pageable);
+        MarkUser markUser = markUserRepo.findOne(markerId);
+        if (Role.MARKER.equals(markUser.getRole())) {
+            List<PaperDTO> paperDTOS = new ArrayList<>();
+            Specification<MarkTaskScore> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"), workId));
+                predicates.add(builder.equal(root.get("subject"), subject));
+                predicates.add(builder.equal(root.get("stage"), MarkStage.SCORE));
+                predicates.add(builder.equal(root.get("markerId"), markerId));
+                predicates.add(builder.equal(root.get("isMark"), true));
+                return builder.and(predicates.toArray(new Predicate[0]));
+            };
+            Page<MarkTaskScore> markTasks = markTaskScoreRepo.findAll(specification, pageable);
 
-        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskScoreAssembler.toDTO(m)));
-        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+            markTasks.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m.getPaper())));
+            return new PageableDTO(paperDTOS, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        } else if (Role.MARK_LEADER.equals(markUser.getRole())) {
+            List<PaperDTO> paperDTOS = new ArrayList<>();
+            Specification<Paper> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"), workId));
+                predicates.add(builder.equal(root.get("subject"), subject));
+                predicates.add(builder.equal(root.get("isMark"), true));
+                return builder.and(predicates.toArray(new Predicate[0]));
+            };
+            Page<Paper> papers = paperRepo.findAll(specification, pageable);
+
+            papers.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m)));
+            return new PageableDTO(paperDTOS, papers.getTotalElements(), papers.getTotalPages(), pageable.getPageNumber());
+        } else {
+            throw new RuntimeException("当前角色无法查询标记试卷");
+        }
     }
 
     public List<MarkTaskScore> getBySecretNumberScore(Long workId, Subject subject, String secretNumber, int test) {
@@ -223,22 +251,43 @@ public class MarkTaskScoreService {
     }
 
     public PageableDTO shiftScore(Long markerId, Long workId, Boolean isShift, Boolean isShiftScore, Long questionId, Pageable pageable) {
-        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
-        Specification<MarkTaskScore> specification = (root, query, builder) -> {
-            List<Predicate> predicates = new ArrayList<>();
-            predicates.add(builder.equal(root.get("questionId"), questionId));
-            predicates.add(builder.equal(root.get("markerId"), markerId));
-            predicates.add(builder.equal(root.get("paper").get("isShiftScore"), isShiftScore));
-            predicates.add(builder.equal(root.get("stage"), MarkStage.SCORE));
-            predicates.add(builder.isNull(root.get("result")));
-            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
-        };
-        Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
-        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
-        Page<MarkTaskScore> markTasks = markTaskScoreRepo.findAll(specification, pageable1);
+        if (isShift) {
+            List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
+            Specification<MarkTaskLevel> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("questionId"), questionId));
+                predicates.add(builder.equal(root.get("markerId"), markerId));
+                //查询
+                predicates.add(builder.equal(root.get("paper").get("isShift"), isShift));
+                predicates.add(builder.equal(root.get("stage"), MarkStage.LEVEL));
+                predicates.add(builder.isNull(root.get("result")));
+                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            };
+            Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
+            Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+            Page<MarkTaskLevel> markTasks = markTaskLevelRepo.findAll(specification, pageable1);
 
-        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskScoreAssembler.toShiftDTO(m)));
-        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+            markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskLevelAssembler.toShiftDTO(m)));
+            return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        } else if (isShiftScore) {
+            List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
+            Specification<MarkTaskScore> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("questionId"), questionId));
+                predicates.add(builder.equal(root.get("markerId"), markerId));
+                predicates.add(builder.equal(root.get("paper").get("isShiftScore"), isShiftScore));
+                predicates.add(builder.equal(root.get("stage"), MarkStage.SCORE));
+                predicates.add(builder.isNull(root.get("result")));
+                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            };
+            Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
+            Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+            Page<MarkTaskScore> markTasks = markTaskScoreRepo.findAll(specification, pageable1);
+
+            markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskScoreAssembler.toShiftDTO(m)));
+            return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        }
+        return null;
     }
 
     public PaperDTO getByTaskSecretNumberLevel(Long questionId, String sn) {

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

@@ -92,7 +92,7 @@ public class MarkerGroupLeaderService {
         int count = 0;
         MarkStage stage = markSubject.getStage();
         if (MarkStage.INIT.equals(markSubject.getStage())) {
-            if (ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevel() == 1) {
+            if (ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevelEnable() == 1) {
                 stage = MarkStage.ROUGH_LEVEL;
                 count = markTaskRoughLevelRepo.countByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), stage);
             } else {

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

@@ -153,6 +153,7 @@ public class MarkingLevelService {
             }
             //改档后重新分档,状态改为false
             paper.setShift(false);
+            paper.setShiftScore(false);
             //重新分档,打回科组长打回状态改为false
             paper.setRejectedByLeader(false);
             paper.setSortNum(calcSortNum(paper, markTasks, levels));

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

@@ -96,7 +96,7 @@ public class MarkingRoughLevelService {
 
         //如果已经由科组长定档,则不做处理
         Paper paper = markTask.getPaper();
-        if (paper.isMarkByLeader() && Objects.nonNull(paper.getLevel())) {
+        if (paper.isMarkByLeader() && Objects.nonNull(paper.getRoughLevel())) {
             return markTask;
         }
 
@@ -153,7 +153,7 @@ public class MarkingRoughLevelService {
             paperRepo.save(paper);
 
             //同步mark_task表中level
-            markTaskLevelRepo.updateLevelByPaperId(paper.getLevel(), paper.getId());
+            markTaskRoughLevelRepo.updateLevelByPaperId(paper.getRoughLevel(), paper.getId());
         }
         long end = System.currentTimeMillis();
         LOG.info("提交分档耗时:{}", (end - start) / 1000 + "s");

+ 144 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MessageService.java

@@ -0,0 +1,144 @@
+package cn.com.qmth.stmms.ms.marking.service;
+
+import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.Message;
+import cn.com.qmth.stmms.ms.core.domain.MessageReceive;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.repository.MessageReceiveRepo;
+import cn.com.qmth.stmms.ms.core.repository.MessageRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.persistence.criteria.Predicate;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 消息服务类型Created by zhengmin on 2016/9/23.
+ */
+@Service
+public class MessageService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MessageService.class);
+
+    @Resource
+    private MessageRepo messageRepo;
+
+    @Resource
+    private MessageReceiveRepo messageReceiveRepo;
+
+    @Transactional
+    public Message sendMessage(String data) {
+        Long workId = ServletUtil.getWordId();
+        JSONObject object = JSON.parseObject(data, JSONObject.class);
+        String markers = object.getString("markers");
+        List<MarkUser> markUsers = JSON.parseArray(markers, MarkUser.class);
+        if (markUsers.isEmpty()) {
+            throw new RuntimeException("没有指定接收用户");
+        }
+        // 保存消息
+        Message message = new Message();
+        message.setWorkId(workId);
+        message.setSubject(Subject.valueOf(object.getString("subject")));
+        message.setStage(MarkStage.valueOf(object.getString("stage")));
+        message.setSendUserId(object.getLong("sendUserId"));
+        message.setSendUserName(object.getString("sendUserName"));
+        message.setContent(object.getString("content"));
+        message.setReceiveUser(markers);
+        message.setCreateTime(new Date());
+        messageRepo.saveAndFlush(message);
+
+        List<MessageReceive> messageReceives = new ArrayList<>();
+        for (MarkUser markUser : markUsers) {
+            MessageReceive messageReceive = new MessageReceive();
+            messageReceive.setMessage(message);
+            messageReceive.setReceiveUserId(markUser.getId());
+            messageReceive.setRead(false);
+            messageReceives.add(messageReceive);
+        }
+        messageReceiveRepo.save(messageReceives);
+        return message;
+    }
+
+
+    public Page<MessageReceive> listByReceiveUserIdAll(Subject subject, MarkStage stage, Long receiveUserId, Long lastId, Pageable pageable) {
+        Long workId = ServletUtil.getWordId();
+        Specification<MessageReceive> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (lastId != null) {
+                predicates.add(builder.gt(root.get("id"), lastId));
+            }
+            predicates.add(builder.equal(root.get("message").get("workId"), workId));
+            predicates.add(builder.equal(root.get("message").get("subject"), subject));
+            predicates.add(builder.equal(root.get("message").get("stage"), stage));
+            predicates.add(builder.equal(root.get("receiveUserId"), receiveUserId));
+
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        Sort sort = new Sort(Sort.Direction.DESC, "id");
+        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+        return messageReceiveRepo.findAll(specification, pageable1);
+    }
+
+    public List<MessageReceive> listByReceiveUserIdRead(Subject subject, MarkStage stage, Long receiveUserId) {
+        Long workId = ServletUtil.getWordId();
+        Specification<MessageReceive> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("message").get("workId"), workId));
+            predicates.add(builder.equal(root.get("message").get("subject"), subject));
+            predicates.add(builder.equal(root.get("message").get("stage"), stage));
+            predicates.add(builder.equal(root.get("receiveUserId"), receiveUserId));
+            predicates.add(builder.equal(root.get("isRead"), false));
+
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        Sort sort = new Sort(Sort.Direction.ASC, "id");
+        return messageReceiveRepo.findAll(specification, sort);
+    }
+
+    public Page<Message> listBySendUserIdAll(Subject subject, MarkStage stage, Long sendUserId, Pageable pageable) {
+        Long workId = ServletUtil.getWordId();
+        Specification<Message> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("workId"), workId));
+            predicates.add(builder.equal(root.get("subject"), subject));
+            predicates.add(builder.equal(root.get("stage"), stage));
+            predicates.add(builder.equal(root.get("sendUserId"), sendUserId));
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        Sort sort = new Sort(Sort.Direction.DESC, "id");
+        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+        return messageRepo.findAll(specification, pageable1);
+    }
+
+    /**
+     * 标记已读
+     *
+     * @param ids ids
+     */
+    public void markRead(List<Long> ids) {
+        List<MessageReceive> messageReceives = new ArrayList<>();
+        for (Long id : ids) {
+            MessageReceive messageReceive = messageReceiveRepo.findOne(id);
+            messageReceive.setRead(true);
+            messageReceives.add(messageReceive);
+        }
+        messageReceiveRepo.save(messageReceives);
+    }
+}

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

@@ -1,7 +1,9 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
 import cn.com.qmth.stmms.ms.commons.config.ScoreConfig;
+import cn.com.qmth.stmms.ms.commons.utils.DbBackupUtils;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
+import cn.com.qmth.stmms.ms.core.cache.CacheService;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
@@ -16,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -68,6 +71,12 @@ public class StageControlService {
     @Autowired
     SqlUtil sqlUtil;
 
+    @Autowired
+    DbBackupUtils dbBackupUtils;
+
+    @Autowired
+    CacheService cacheService;
+
     public static volatile Map<String, Boolean> statusMap = new Hashtable<>();
 
     /**
@@ -76,41 +85,18 @@ public class StageControlService {
      * @param markSubject 科目
      */
     @Transactional
-    public void goNext(MarkSubject markSubject, Map<String, Integer> map) throws Exception {
+    public void createTask(MarkSubject markSubject, Map<String, Integer> map) throws Exception {
         if (statusMap.get(markSubject.getId()) != null && statusMap.get(markSubject.getId())) {
             return;
         }
         statusMap.put(markSubject.getId(), true);
         MarkStage markStage = markSubject.getStage();
-        //是否还有未投放的试卷
-//        int waitCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getTest());
-//        if (waitCount > 0 && markStage.equals(MarkStage.LEVEL)) {
-//            markStage = MarkStage.INIT;
-//        }
-        /*if (MarkStage.INIT.equals(markStage)) {
-            // 开启粗分档
-            if (ParamCache.levelConfigMap.get(String.valueOf(markSubject.getWorkId())).getRoughLevel() == 1) {
-                markSubject.setStage(MarkStage.ROUGH_LEVEL);
-                int taskCount = (int) map.get("taskCount");
-                Object questionId = map.get("questionId");
-                enterRoughLevelStage(markSubject, taskCount, questionId);
-            } else {
-                markSubject.setStage(MarkStage.LEVEL);
-                int taskCount = (int) map.get("taskCount");
-                Object questionId = map.get("questionId");
-                enterLevelStage(markSubject, taskCount, questionId);
-            }
-        } else*/
         if (MarkStage.ROUGH_LEVEL.equals(markStage)) {
-//            markSubject.setStage(MarkStage.LEVEL);
-            int taskCount = (int) map.get("taskCount");
+            int taskCount = map.get("taskCount");
             Object questionId = map.get("questionId");
-//            enterLevelStage(markSubject, taskCount, questionId);
             enterRoughLevelStage(markSubject, taskCount, questionId);
         } else if (MarkStage.LEVEL.equals(markStage)) {
-//            markSubject.setStage(MarkStage.SCORE);
-//            enterToScoreStage(markSubject);
-            int taskCount = (int) map.get("taskCount");
+            int taskCount = map.get("taskCount");
             Object questionId = map.get("questionId");
             enterLevelStage(markSubject, taskCount, questionId);
         } else if (MarkStage.SCORE.equals(markStage)) {
@@ -454,53 +440,52 @@ public class StageControlService {
     public void enterToScoreStage(MarkSubject markSubject) {
         Long workId = markSubject.getWorkId();
         Subject subject = markSubject.getSubject();
-        List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
-        List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_SCORING).collect(Collectors.toList());
-        if (levelMarkers.size() == 0) {
-            statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("没有设定评卷员");
-        }
         int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndBatchNoNotNullAndTest(workId, subject, markSubject.getTest());
         if (count > 0) {
             statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("没有分档完成");
+            throw new RuntimeException("评卷任务没有分档完成");
+        }
+        count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndBatchNoIsNullAndTest(workId, subject, markSubject.getTest());
+        if (count > 0) {
+            throw new RuntimeException("有未发布的评卷任务");
         }
         this.isPtFull(workId, markSubject);
-        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(workId, subject, markSubject.getStage());
-        /*if (markerGroups.size() == 0) {
-            statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("评卷员没有进行分组");
-        }*/
         markSubject.setAllLevel(true);
-        assignTaskService.assignForGroupingScore(markSubject, markerGroups);
+        assignTaskService.initTaskPublishData(workId, subject.name());
     }
 
     @Transactional
     public void enterScoreStage(MarkSubject markSubject, List<TaskPublishSetting> taskList, Object questionId) throws Exception {
         Long workId = markSubject.getWorkId();
         Subject subject = markSubject.getSubject();
-        List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
-        List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_SCORING).collect(Collectors.toList());
-        if (levelMarkers.size() == 0) {
+
+        //已发布任务是否都已完成
+        int waitCount = paperRepo.countByWorkIdAndSubjectAndScoreBatchNoIsNotNullAndScoreIsNull(workId, subject);
+        if (waitCount > 0) {
             statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("没有设定评卷员");
+            throw new RuntimeException("没有打分完成");
         }
-        int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndBatchNoNotNullAndTest(workId, subject, markSubject.getTest());
-        if (count > 0) {
+
+        // 校验阈值
+        this.isPtFull(workId, markSubject);
+
+        List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
+        List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_SCORING).collect(Collectors.toList());
+        if (levelMarkers.isEmpty()) {
             statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("没有分档完成");
+            throw new RuntimeException("没有设置评卷员");
         }
-        this.isPtFull(workId, markSubject);
+
         List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(workId, subject, markSubject.getStage());
-        if (markerGroups.size() == 0) {
+        if (markerGroups.isEmpty()) {
             statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("评卷员没有进行分组");
+            throw new RuntimeException("没有设置分组");
         }
 
         for (MarkerGroup markerGroup : markerGroups) {
-            if (markerGroup.getMarkers().size() == 0) {
+            if (markerGroup.getMarkers().isEmpty()) {
                 statusMap.put(markSubject.getId(), false);
-                throw new RuntimeException("分组没有评卷员");
+                throw new RuntimeException("分组没有绑定评卷员");
             }
         }
 
@@ -511,12 +496,6 @@ public class StageControlService {
                 throw new RuntimeException(taskPublishSetting.getCode() + "档位本次任务数量必须小于等于未评数量");
             }
         }
-        //已发布任务是否都已完成
-        int waitCount = paperRepo.countByWorkIdAndSubjectAndScoreBatchNoIsNotNullAndScoreIsNull(workId, subject);
-        if (waitCount > 0) {
-            statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("没有打分完成");
-        }
 
         //总的发布任务数
         int totalTaskCount = taskList.stream().map(m -> {
@@ -532,30 +511,28 @@ public class StageControlService {
         if (Objects.isNull(questionId)) {
             int totalCount = taskList.stream().mapToInt(TaskPublishSetting::getTotalCount).sum();
             int successCount = taskList.stream().mapToInt(TaskPublishSetting::getSuccessCount).sum();
-            papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, subject, sort);
+            papers = paperRepo.findByWorkIdAndSubjectAndLevelNotNullAndScoreBatchNoIsNull(workId, subject, sort);
             if (successCount > 0) {
                 statusMap.put(markSubject.getId(), false);
                 throw new RuntimeException("单考区发布过任务,不能再发布所有考区任务");
             } else if (totalTaskCount - totalCount != 0) {
                 statusMap.put(markSubject.getId(), false);
-                throw new RuntimeException("选择所有考区时,发布所有任务");
+                throw new RuntimeException("选择所有考区时,必须一次发布所有任务");
             }
         } else {
             Long questionId0 = Long.valueOf(questionId.toString());
-//            papers = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, questionId0, subject, sort);
             papers = new ArrayList<>();
             for (TaskPublishSetting taskPublishSetting : taskList) {
                 if (taskPublishSetting.getTaskCount() == 0) {
                     continue;
                 }
-                List<Paper> paperList = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndLevelAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, questionId0, subject, taskPublishSetting.getCode(), sort);
+                List<Paper> paperList = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndLevelAndScoreBatchNoIsNull(workId, questionId0, subject, taskPublishSetting.getCode(), sort);
                 List<Paper> subPaperList = paperList.subList(0, taskPublishSetting.getTaskCount());
                 papers.addAll(subPaperList);
             }
         }
-//        papers = papers.subList(0, totalTaskCount);
 
-        assignTaskService.assignForGrouping(papers, markerGroups, markSubject, taskList);
+        assignTaskService.assignForGroupingScore(papers, markerGroups, markSubject, taskList);
 
         //保存发布数据
         int max = taskPublishSettingRepo.maxPublishCount(workId, subject.name());
@@ -613,8 +590,8 @@ public class StageControlService {
     }
 
     /**
-     * @param workId
-     * @param markSubject
+     * @param workId      工作ID
+     * @param markSubject 科目
      */
     private void isPtFull(Long workId, MarkSubject markSubject) {
         //控制分档比例
@@ -626,7 +603,7 @@ public class StageControlService {
 
             if ((count * 1.0D) / total * 1.0D > pt / 100.D) {
                 statusMap.put(markSubject.getId(), false);
-                throw new RuntimeException(targetLevel.getCode() + "档已满,占比总阀值已达" + pt + "%");
+                throw new RuntimeException(targetLevel.getCode() + "档已满,占比总阀值已达" + pt + "%");
             }
             //判断考点阀值是否已满
             int kdpt = targetLevel.getKdpt();
@@ -760,7 +737,7 @@ public class StageControlService {
         List<Paper> allPapers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false, markSubject.getTest());
         MarkStage stage = markSubject.getStage();
         if (MarkStage.INIT.equals(markSubject.getStage())) {
-            if (ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevel() == 1) {
+            if (ParamCache.levelConfigMap.get(String.valueOf(workId)).getRoughLevelEnable() == 1) {
                 stage = MarkStage.ROUGH_LEVEL;
             } else {
                 stage = MarkStage.LEVEL;
@@ -825,4 +802,21 @@ public class StageControlService {
         return list;
     }
 
+    /**
+     * 用户强制退出且做数据库备份
+     *
+     * @param markSubject 科目
+     */
+    public void logoutAndBackupDb(MarkSubject markSubject) {
+        // 所有用户强制退出
+        List<MarkUser> userList = markUserRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
+        userList = userList.stream().filter(m -> Role.MARKER.equals(m.getRole()) || Role.MARK_LEADER.equals(m.getRole())).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(userList)) {
+            for (MarkUser user : userList) {
+                cacheService.deleteTokenCache(user.getId().toString());
+            }
+        }
+        dbBackupUtils.startBackup(markSubject.getWorkId(), markSubject.getStage().name());
+    }
+
 }