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

联考版-v3.1.0-基础功能修改

xiaof 2 жил өмнө
parent
commit
cc554a772b
48 өөрчлөгдсөн 2695 нэмэгдсэн , 544 устгасан
  1. 0 0
      sql/msyj-local-v3.1.0-last.sql
  2. 0 35
      sql/v3.0.0表结构修改日志.sql
  3. 50 0
      sql/v3.1.0表结构修改日志.sql
  4. 186 103
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java
  5. 2 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java
  6. 1 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/WorkApi.java
  7. 1 3
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/ScoreAssembler.java
  8. 33 18
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java
  9. 108 18
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  10. 7 3
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/WorkService.java
  11. 12 13
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BuiltInParamUtils.java
  12. 11 16
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  13. 1 1
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/OssUploadUtil.java
  14. 3 4
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java
  15. 13 6
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/ServletUtil.java
  16. 56 10
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/cache/ParamCache.java
  17. 36 5
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Level.java
  18. 4 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkStage.java
  19. 178 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkerGroupStudent.java
  20. 78 169
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java
  21. 70 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/ParamSettingTypeEnum.java
  22. 124 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/CoarseLevelConfig.java
  23. 59 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/CollectConfig.java
  24. 137 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/LevelConfig.java
  25. 59 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/ScoreConfig.java
  26. 411 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTaskLevel.java
  27. 411 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTaskScore.java
  28. 27 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/MarkerGroup.java
  29. 226 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskLevelRepo.java
  30. 226 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskScoreRepo.java
  31. 2 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkerGroupRepo.java
  32. 20 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkerGroupStudentRepo.java
  33. 8 9
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java
  34. 4 9
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/StartRunning.java
  35. 12 7
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java
  36. 1 1
      stmms-ms-main/src/main/resources/application-dev.properties
  37. 13 13
      stmms-ms-main/src/test/java/BatchCreateDataTest.java
  38. 11 9
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  39. 23 4
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  40. 5 6
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  41. 2 8
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/ChangeLevelAssembler.java
  42. 13 24
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java
  43. 8 14
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  44. 2 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java
  45. 23 9
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java
  46. 1 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkerGroupLeaderService.java
  47. 13 11
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java
  48. 4 5
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 0 - 0
sql/msyj-local-v3.0.0-last.sql → sql/msyj-local-v3.1.0-last.sql


+ 0 - 35
sql/v3.0.0表结构修改日志.sql

@@ -1,35 +0,0 @@
-ALTER TABLE `paper` ADD COLUMN `scan_user_id` BIGINT(20) NULL COMMENT '采集员ID' AFTER `sort_num`;
-
-
-ALTER TABLE `paper` ADD COLUMN `is_mark` BIT(1) NULL DEFAULT b'0'  COMMENT '是否标记' AFTER `scan_user_id`;
-
-ALTER TABLE `mark_task` ADD COLUMN `is_mark` BIT(1) NULL DEFAULT b'0'  COMMENT '是否标记' AFTER `deviation_direction`;
-
-
-ALTER TABLE `param_setting` ADD COLUMN `take_best` TINYINT(1) NULL COMMENT '取优原则(1:是、0:否)' AFTER `clear_data`;
-
-
-CREATE TABLE `check_data` (
-  `id` BIGINT(20) NOT NULL,
-  `work_id` BIGINT(20) NULL COMMENT '工作ID',
-  `check_item` VARCHAR(45) NULL COMMENT '数据校验类型',
-  `param_value` INT(3) NULL COMMENT '变量值',
-  `status` VARCHAR(45) NULL,
-  `result` TINYINT(1) NULL COMMENT '是否校验通过(1:是,0:否)',
-  `error_count` INT(7) NULL DEFAULT 0 COMMENT '未通过数量(result=0时,数量大于0)',
-  `content` MEDIUMTEXT NULL COMMENT '校验不通过考生列表',
-  `start_time` DATETIME NULL COMMENT '开始时间',
-  `end_time` DATETIME NULL COMMENT '结束时间',
-  PRIMARY KEY (`id`))
-COMMENT = '数据校验日志';
-
-
-
--- 试评修改(暂时)
-ALTER TABLE `msyj-local-v3.0.0-trial`.`mark_subject`
-DROP COLUMN `is_formal`,
-DROP COLUMN `sample_count`;
-
-
-ALTER TABLE `mark_user`
-    CHANGE COLUMN `subject` `subject` VARCHAR(50) CHARACTER SET 'utf8mb4' NULL ;

+ 50 - 0
sql/v3.1.0表结构修改日志.sql

@@ -0,0 +1,50 @@
+ALTER TABLE `msyj-local-v3.1.0`.`param_setting`
+DROP COLUMN `take_best`,
+DROP COLUMN `clear_data`,
+DROP COLUMN `show_standard_paper_manage`,
+DROP COLUMN `auto_callback_show_deviation`,
+DROP COLUMN `prop_denominator`,
+DROP COLUMN `score_show_all_paper`,
+DROP COLUMN `change_stage`,
+DROP COLUMN `round_up`,
+DROP COLUMN `level_show_all_paper`,
+DROP COLUMN `cumulative_error`,
+DROP COLUMN `majority`,
+DROP COLUMN `auto_callback`,
+DROP COLUMN `deviation`,
+DROP COLUMN `paper_stage`,
+DROP COLUMN `name_rule`,
+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 `score_config` MEDIUMTEXT NULL COMMENT '打分规则参数' AFTER `first_level_config`;
+
+
+CREATE TABLE `marker_group_student`  (
+                                         `id` bigint(20) NOT NULL AUTO_INCREMENT,
+                                         `work_id` bigint(20) NOT NULL,
+                                         `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',
+                                         `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,
+                                         `area_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+                                         `exam_room` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+                                         `school` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+                                         `source_name` varchar(225) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生源地',
+                                         `group_id` bigint(20) NOT NULL COMMENT '批次号',
+                                         `used` tinyint(1) NULL DEFAULT NULL COMMENT '已否已发任务',
+                                         PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
+
+
+ALTER TABLE `marker_group`
+    CHANGE COLUMN `work_id` `work_id` BIGINT(20) NOT NULL AFTER `id`,
+    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`;

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

@@ -1,21 +1,28 @@
 package cn.com.qmth.stmms.ms.admin.api;
 
+import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 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.ParamSetting;
+import cn.com.qmth.stmms.ms.core.domain.enums.ParamSettingTypeEnum;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.CoarseLevelConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.CollectConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.LevelConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.ScoreConfig;
 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.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.ParamSettingRepo;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -25,16 +32,16 @@ import java.util.Objects;
 @RequestMapping("/api/param")
 public class ParamApi {
 
-    @Autowired
+    @Resource
     private ParamSettingRepo paramSettingRepo;
 
-    @Autowired
+    @Resource
     private PaperRepo paperRepo;
 
-    @Autowired
+    @Resource
     private MarkSubjectRepo markSubjectRepo;
 
-    @Autowired
+    @Resource
     private MarkTaskRepo markTaskRepo;
 
     /**
@@ -42,7 +49,7 @@ public class ParamApi {
      *
      * @param workId 工作Id
      */
-    @RequestMapping(value = "/getParam", method = RequestMethod.GET)
+    @GetMapping("/getParam")
     public ParamSetting getOne(@RequestParam Long workId) {
         return paramSettingRepo.findByWorkId(workId);
     }
@@ -50,144 +57,220 @@ public class ParamApi {
     /**
      * 更新采集参数
      *
-     * @param workId
-     * @param packageScan
-     * @param imageEncrypt
-     * @param nameRule
-     * @param paperStage
-     * @return
+     * @param data data
      */
-    @RequestMapping(value = "/collect", method = RequestMethod.POST)
-    public ResponseEntity updateCollectParam(@RequestParam Long workId,
-                                             @RequestParam Integer packageScan,
-                                             @RequestParam Integer imageEncrypt,
-                                             @RequestParam Integer nameRule,
-                                             @RequestParam Integer paperStage) {
+    @PostMapping("/collect")
+    public ResponseEntity updateCollectParam(@RequestBody String data) {
+        JSONObject object = JSON.parseObject(data);
+        Integer packageScan = object.getInteger("packageScan");
+        Integer imageEncrypt = object.getInteger("imageEncrypt");
+        Integer nameRule = object.getInteger("nameRule");
+        Integer paperStage = object.getInteger("paperStage");
+
+        Long workId = ServletUtil.getWordId();
         //保存采集参数
         ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
         if (paramSetting == null) {
-            paramSetting = ParamSetting.init();
+            paramSetting = ParamSetting.init(workId);
         }
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
-        if (countMarkTasks > 0
-                && !Objects.equals(packageScan, paramSetting.getPackageScan())) {
-            throw new RuntimeException("该评卷工作当前不是采集阶段,不能修改是否整包扫描参数");
+
+        CollectConfig oldCollectConfig = JSON.parseObject(paramSetting.getCollectConfig(), CollectConfig.class);
+        if (countMarkTasks > 0 && !Objects.equals(packageScan, oldCollectConfig.getPackageScan())) {
+            throw new RuntimeException("该评卷工作当前不是采集阶段,不能修改是【否整包扫描】参数");
         }
         //有采集数据,不能修改采集参数
         List<Paper> papers = paperRepo.findByWorkId(workId);
-        if (papers != null && papers.size() > 0) {
-            if (!Objects.equals(imageEncrypt, paramSetting.getImageEncrypt())
-                    || !Objects.equals(nameRule, paramSetting.getNameRule())
-                    || !Objects.equals(paperStage, paramSetting.getPaperStage())) {
-                throw new RuntimeException("该评卷工作已有采集数据,不能修改图片是否加密、图片命名规则、试卷档位参数");
+        if (papers != null && !papers.isEmpty()) {
+            if (!Objects.equals(imageEncrypt, oldCollectConfig.getImageEncrypt())) {
+                throw new RuntimeException("该评卷工作已有采集数据,不能修改【图片是否加密】参数");
+            }
+            if (!Objects.equals(nameRule, oldCollectConfig.getNameRule())) {
+                throw new RuntimeException("该评卷工作已有采集数据,不能修改【图片命名规则】参数");
+            }
+            if (!Objects.equals(paperStage, oldCollectConfig.getPaperStage())) {
+                throw new RuntimeException("该评卷工作已有采集数据,不能修改【试卷档位】参数");
             }
         }
-//        if(paramSetting.getPaperStage() == 1 && !Objects.equals(paperStage, paramSetting.getPaperStage())){
-//            throw new RuntimeException("试卷档位已经设置,不能修改");
-//        }
-
-        paramSetting.setPackageScan(packageScan);
-        paramSetting.setImageEncrypt(imageEncrypt);
-        paramSetting.setNameRule(nameRule);
-        paramSetting.setPaperStage(paperStage);
+
+        oldCollectConfig.setPackageScan(packageScan);
+        oldCollectConfig.setImageEncrypt(imageEncrypt);
+        oldCollectConfig.setNameRule(nameRule);
+        oldCollectConfig.setPaperStage(paperStage);
+        paramSetting.setCollectConfig(JSON.toJSONString(oldCollectConfig));
         paramSettingRepo.saveAndFlush(paramSetting);
-        ParamCache.resetParam(paramSetting);
+        ParamCache.cacheParam(ParamSettingTypeEnum.COLLECT, workId, paramSetting.getCollectConfig());
 
         return new ResponseEntity(HttpStatus.OK);
     }
 
     /**
-     * 更新分档规则参数
+     * 分档规则参数
      *
-     * @param workId                    工作ID
-     * @param deviation                 仲裁档位差
-     * @param autoCallback              是否自动打回
-     * @param majority                  是否过半定档
-     * @param clearData
-     * @param cumulativeError           打回累计误差
-     * @param levelShowAllPaper         分档阶段阅卷员是否显示所有试卷
-     * @param propDenominator           档位百分比分母(1: "全部考生数", 2: "去掉缺考考生数")
-     * @param autoCallbackShowDeviation 自动打回时显示偏差
-     * @param showStandardPaperManage
-     * @param takeBest                  取优原则
+     * @param data data
      */
-    @RequestMapping(value = "/level", method = RequestMethod.POST)
-    public ResponseEntity updateLevelParam(@RequestParam Long workId,
-                                           @RequestParam Integer deviation,
-                                           @RequestParam Integer autoCallback,
-                                           @RequestParam Integer majority,
-                                           @RequestParam Integer clearData,
-                                           @RequestParam Integer cumulativeError,
-                                           @RequestParam Integer levelShowAllPaper,
-                                           @RequestParam Integer propDenominator,
-                                           @RequestParam Integer autoCallbackShowDeviation,
-                                           @RequestParam Integer showStandardPaperManage,
-                                           @RequestParam Integer takeBest) {
+    @PostMapping("/level")
+    public ResponseEntity updateLevelParam(@RequestBody String data) {
+        Long workId = ServletUtil.getWordId();
+        JSONObject object = JSON.parseObject(data);
+        Integer deviation = object.getInteger("deviation");
+        Integer autoCallback = object.getInteger("autoCallback");
+        Integer majority = object.getInteger("majority");
+        Integer takeBest = object.getInteger("takeBest");
+        Integer clearData = object.getInteger("clearData");
+        Integer levelShowAllPaper = object.getInteger("levelShowAllPaper");
+        Integer propDenominator = object.getInteger("propDenominator");
+        Integer showStandardPaperManage = object.getInteger("showStandardPaperManage");
+        Integer coarseLevel = object.getInteger("coarseLevel");
+        Integer removeHighAndLow = object.getInteger("removeHighAndLow");
+
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNot(workId, TrialEnum.DEFAULT.ordinal());
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
-        boolean flag = false;
-        if ((markSubjects == null || markSubjects.size() == 0) && countMarkTasks > 0) {
-            flag = true;
-        }
-
         //保存分档参数
         ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
-        if (flag && (!Objects.equals(deviation, paramSetting.getDeviation())
-                || !Objects.equals(autoCallback, paramSetting.getAutoCallback())
-                || !Objects.equals(majority, paramSetting.getMajority())
-                || !Objects.equals(cumulativeError, paramSetting.getCumulativeError()))) {
-            throw new RuntimeException("该评卷工作已有评卷数据,不能修改仲裁档位差、系统自动打回、是否过半定档参数");
-        }
         if (paramSetting == null) {
-            paramSetting = ParamSetting.init();
+            paramSetting = ParamSetting.init(workId);
         }
-        paramSetting.setDeviation(deviation);
-        paramSetting.setAutoCallback(autoCallback);
-        paramSetting.setMajority(majority);
-        paramSetting.setCumulativeError(cumulativeError);
-        paramSetting.setLevelShowAllPaper(levelShowAllPaper);
-        paramSetting.setPropDenominator(propDenominator);
-        paramSetting.setClearData(clearData);
-        paramSetting.setAutoCallbackShowDeviation(autoCallbackShowDeviation);
-        paramSetting.setShowStandardPaperManage(showStandardPaperManage);
-        paramSetting.setTakeBest(takeBest);
+
+        LevelConfig oldLevelConfig = JSON.parseObject(paramSetting.getLevelConfig(), LevelConfig.class);
+        if ((markSubjects == null || markSubjects.isEmpty()) && countMarkTasks > 0) {
+            if (!Objects.equals(deviation, oldLevelConfig.getDeviation())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【仲裁档位差】参数");
+            }
+            if (!Objects.equals(autoCallback, oldLevelConfig.getAutoCallback())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修【系统自动打回】参数");
+            }
+            if (!Objects.equals(majority, oldLevelConfig.getMajority())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【是否过半定档】参数");
+            }
+            if (!Objects.equals(coarseLevel, oldLevelConfig.getCoarseLevel())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【是否增加粗档位环节】参数");
+            }
+            if (!Objects.equals(removeHighAndLow, oldLevelConfig.getRemoveHighAndLow())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【是否开启去高去低再加权评卷】参数");
+            }
+        }
+
+        oldLevelConfig.setDeviation(deviation);
+        oldLevelConfig.setAutoCallback(autoCallback);
+        oldLevelConfig.setMajority(majority);
+        oldLevelConfig.setTakeBest(takeBest);
+        oldLevelConfig.setLevelShowAllPaper(levelShowAllPaper);
+        oldLevelConfig.setPropDenominator(propDenominator);
+        oldLevelConfig.setShowStandardPaperManage(showStandardPaperManage);
+        oldLevelConfig.setClearData(clearData);
+        oldLevelConfig.setCoarseLevel(coarseLevel);
+        oldLevelConfig.setRemoveHighAndLow(removeHighAndLow);
+
+        paramSetting.setLevelConfig(JSON.toJSONString(oldLevelConfig));
         paramSettingRepo.saveAndFlush(paramSetting);
-        ParamCache.resetParam(paramSetting);
+        ParamCache.cacheParam(ParamSettingTypeEnum.LEVEL, workId, paramSetting.getLevelConfig());
 
         return new ResponseEntity(HttpStatus.OK);
     }
 
     /**
-     * 打分改档参数
+     * 粗分档规则参数
      *
-     * @return
+     * @param data data
      */
-    @RequestMapping(value = "/score", method = RequestMethod.POST)
-    public ResponseEntity updateScoreParam(@RequestBody Map map) {
-        Long workId = Long.valueOf(map.get("workId").toString());
-        Integer roundUp = (Integer) map.get("roundUp");
-        Integer changeStage = (Integer) map.get("changeStage");
-        Integer scoreShowAllPaper = (Integer) map.get("scoreShowAllPaper");
+    @PostMapping("/coarse_level")
+    public ResponseEntity updateFirstLevelParam(@RequestBody String data) {
+        Long workId = ServletUtil.getWordId();
+        JSONObject object = JSON.parseObject(data);
+        Integer deviation = object.getInteger("deviation");
+        Integer autoCallback = object.getInteger("autoCallback");
+        Integer majority = object.getInteger("majority");
+        Integer takeBest = object.getInteger("takeBest");
+        Integer clearData = object.getInteger("clearData");
+        Integer levelShowAllPaper = object.getInteger("levelShowAllPaper");
+        Integer propDenominator = object.getInteger("propDenominator");
+        Integer showStandardPaperManage = object.getInteger("showStandardPaperManage");
+        Integer removeHighAndLow = object.getInteger("removeHighAndLow");
+
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNot(workId, TrialEnum.DEFAULT.ordinal());
+        // todo 需要改查询表 20220728
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
-        boolean flag = false;
-        if ((markSubjects == null || markSubjects.size() == 0) && countMarkTasks > 0) {
-            flag = true;
+        //保存分档参数
+        ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
+        if (paramSetting == null) {
+            paramSetting = ParamSetting.init(workId);
         }
 
+        CoarseLevelConfig oldCoarseLevelConfig = JSON.parseObject(paramSetting.getCoarseLevelConfig(), CoarseLevelConfig.class);
+        if ((markSubjects == null || markSubjects.isEmpty()) && countMarkTasks > 0) {
+            if (!Objects.equals(deviation, oldCoarseLevelConfig.getDeviation())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【仲裁档位差】参数");
+            }
+            if (!Objects.equals(autoCallback, oldCoarseLevelConfig.getAutoCallback())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修【系统自动打回】参数");
+            }
+            if (!Objects.equals(majority, oldCoarseLevelConfig.getMajority())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【是否过半定档】参数");
+            }
+            if (!Objects.equals(removeHighAndLow, oldCoarseLevelConfig.getRemoveHighAndLow())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【是否开启去高去低再加权评卷】参数");
+            }
+        }
+
+        oldCoarseLevelConfig.setDeviation(deviation);
+        oldCoarseLevelConfig.setAutoCallback(autoCallback);
+        oldCoarseLevelConfig.setMajority(majority);
+        oldCoarseLevelConfig.setTakeBest(takeBest);
+        oldCoarseLevelConfig.setLevelShowAllPaper(levelShowAllPaper);
+        oldCoarseLevelConfig.setPropDenominator(propDenominator);
+        oldCoarseLevelConfig.setShowStandardPaperManage(showStandardPaperManage);
+        oldCoarseLevelConfig.setClearData(clearData);
+        oldCoarseLevelConfig.setRemoveHighAndLow(removeHighAndLow);
+
+        paramSetting.setCoarseLevelConfig(JSON.toJSONString(oldCoarseLevelConfig));
+        paramSettingRepo.saveAndFlush(paramSetting);
+        ParamCache.cacheParam(ParamSettingTypeEnum.FIRST_LEVEL, workId, paramSetting.getCoarseLevelConfig());
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
+    /**
+     * 打分改档参数
+     *
+     * @param data data
+     */
+    @PostMapping("/score")
+    public ResponseEntity updateScoreParam(@RequestBody String data) {
+        Long workId = ServletUtil.getWordId();
+        JSONObject object = JSON.parseObject(data);
+        Integer roundUp = object.getInteger("roundUp");
+        Integer changeStage = object.getInteger("changeStage");
+        Integer scoreShowAllPaper = object.getInteger("scoreShowAllPaper");
+        Integer removeHighAndLow = object.getInteger("removeHighAndLow");
+
         //保存打分参数
         ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
-        if (flag && (!Objects.equals(roundUp, paramSetting.getRoundUp()))) {
-            throw new RuntimeException("该评卷工作已有评卷数据,不能修改分数处理方式参数");
-        }
         if (paramSetting == null) {
-            paramSetting = ParamSetting.init();
+            paramSetting = ParamSetting.init(workId);
+        }
+
+        ScoreConfig oldScoreConfig = JSON.parseObject(paramSetting.getScoreConfig(), ScoreConfig.class);
+        List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNot(workId, TrialEnum.DEFAULT.ordinal());
+        // todo 更新查询表 20220801
+        int countMarkTasks = markTaskRepo.countByWorkId(workId);
+        if ((markSubjects == null || markSubjects.isEmpty()) && countMarkTasks > 0) {
+            if (!Objects.equals(roundUp, oldScoreConfig.getRoundUp())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【分数处理方式】参数");
+            }
+            if (!Objects.equals(removeHighAndLow, oldScoreConfig.getRemoveHighAndLow())) {
+                throw new RuntimeException("该评卷工作已有评卷数据,不能修改【分数计算方式】参数");
+            }
         }
-        paramSetting.setRoundUp(roundUp);
-        paramSetting.setChangeStage(changeStage);
-        paramSetting.setScoreShowAllPaper(scoreShowAllPaper);
+
+        oldScoreConfig.setRoundUp(roundUp);
+        oldScoreConfig.setChangeStage(changeStage);
+        oldScoreConfig.setScoreShowAllPaper(scoreShowAllPaper);
+        oldScoreConfig.setRemoveHighAndLow(removeHighAndLow);
+
+        paramSetting.setScoreConfig(JSON.toJSONString(oldScoreConfig));
         paramSettingRepo.saveAndFlush(paramSetting);
-        ParamCache.resetParam(paramSetting);
+        ParamCache.cacheParam(ParamSettingTypeEnum.SCORE, workId, paramSetting.getScoreConfig());
 
         return new ResponseEntity(HttpStatus.OK);
     }

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

@@ -280,7 +280,7 @@ public class ScoreApi {
                     String watermarkFile = null;
                     String imageMd5 = null;
                     StringJoiner watermarkSj = null;
-                    if (ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                    if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                         Student student = studentRepo.findByWorkIdAndExamNumber(workId, examNumber);
                         imageMd5 = MD5Util.getImageRuleMd5(workId, subject.ordinal(), areaCode, examNumber, student.getId());
 
@@ -314,7 +314,7 @@ public class ScoreApi {
                     String text = new String(txt.getBytes(), Charset.forName("UTF-8"));
 //                    WaterMarkUtils.addWaterMark(imageFile, watermarkFile, text, color, font);
                     try {
-                        if (ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                        if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                             WaterMarkUtils.addTextWatermarkNew(imageMd5, text, "jpg", imageFile, watermarkFile);
                         } else {
                             File watermarkF = WaterMarkUtils.addTextWatermark(text, "jpg", imageFile, watermarkFile);

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

@@ -90,7 +90,7 @@ public class WorkApi {
     public void create(@RequestBody Work work) {
         workService.save(work);
         //生成随机数
-//        randomUtil.getRandom(work.getId(), false);
+        randomUtil.getRandom(work.getId(), false);
     }
 
     /**

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

@@ -7,7 +7,6 @@ import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Student;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -40,8 +39,7 @@ public class ScoreAssembler {
 
                 String fileName = p.getExamNumber();
                 //0:随机码 1:考号
-                if(ParamCache.paramMap.get(p.getWorkId()).getNameRule() == 1){
-//                    fileName = DigestUtils.md5Hex(p.getSubject().name() + fileName);
+                if (ParamCache.collectConfigMap.get(String.valueOf(p.getWorkId())).getNameRule() == 1) {
                     fileName = MD5Util.getImageRuleMd5(p.getWorkId(), p.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
                 }
                 String imgSrc = systemConfig.getImageUrl(p.getWorkId(), p.getSubject().toString(), p.getAreaCode(), fileName);

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

@@ -4,12 +4,10 @@ import cn.com.qmth.stmms.ms.admin.dto.StudentDTO;
 import cn.com.qmth.stmms.ms.admin.service.DataUploadService;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelError;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
@@ -27,25 +25,26 @@ public class StudentImporter {
 
     /**
      * 考生导入
-     * @param workId 工作Id
+     *
+     * @param workId   工作Id
      * @param isAbsent 是否缺考
-     * @param file 考生文件
+     * @param file     考生文件
      */
-    @RequestMapping(method = RequestMethod.POST)
+    @PostMapping
     public List<ExcelError> batchAll(@RequestParam Long workId,
-                                     @RequestParam(required = false, defaultValue = "false") boolean isAbsent, @RequestParam MultipartFile file)
-            throws Exception {
+                                     @RequestParam(required = false, defaultValue = "false") boolean isAbsent,
+                                     @RequestParam MultipartFile file) throws Exception {
         return dataUploadService.uploadStudents(workId, isAbsent, file.getInputStream());
     }
 
     /**
      * 试评考生导入
      *
-     * @param workId 工作ID
+     * @param workId  工作ID
      * @param subject 科目
-     * @param file 试评文件
+     * @param file    试评文件
      */
-    @RequestMapping(value = "batchAllForTrial", method = RequestMethod.POST)
+    @PostMapping("batchAllForTrial")
     public List<ExcelError> batchAllForTrial(
             @RequestParam Long workId,
             @RequestParam Subject subject,
@@ -54,9 +53,9 @@ public class StudentImporter {
         return dataUploadService.uploadStudentsForTrial(workId, subject, file.getInputStream());
     }
 
-    @RequestMapping(method = RequestMethod.GET)
+    @GetMapping
     public void download(HttpServletResponse response) {
-        List<StudentDTO> studentDTOs = new ArrayList<StudentDTO>();
+        List<StudentDTO> studentDTOs = new ArrayList<>();
         StudentDTO dto = new StudentDTO();
 
         dto.setExamNumber("5360001");
@@ -72,15 +71,31 @@ public class StudentImporter {
 
     /**
      * 导入考生关联信息
+     *
      * @param workId
      * @param file
      * @return
      * @throws IOException
      */
-    @RequestMapping(value = "/relateStudent", method = RequestMethod.POST)
-    public List<ExcelError> batchAll(@RequestParam Long workId,
-                                     @RequestParam MultipartFile file)
-            throws Exception {
+    @PostMapping("/relateStudent")
+    public List<ExcelError> relateStudent(@RequestParam Long workId,
+                                          @RequestParam MultipartFile file) throws Exception {
         return dataUploadService.uploadStudentRelate(workId, file.getInputStream());
     }
+
+    /**
+     * 导入考生关联信息
+     *
+     * @param subject
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    @PostMapping("/import_group_student")
+    public List<ExcelError> groupStudent(@RequestParam Subject subject,
+                                         @RequestParam MarkStage stage,
+                                         @RequestParam Long groupId,
+                                         @RequestParam MultipartFile file) throws Exception {
+        return dataUploadService.uploadGroupStudent(subject, stage, groupId, file.getInputStream());
+    }
 }

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

@@ -9,6 +9,7 @@ import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelError;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelReader;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelReaderHandle;
@@ -23,6 +24,7 @@ import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -79,6 +81,9 @@ public class DataUploadService {
     @Autowired
     MarkSubjectRepo markSubjectRepo;
 
+    @Resource
+    MarkerGroupStudentRepo markerGroupStudentRepo;
+
     @Autowired
     WorkRepo workRepo;
 
@@ -109,7 +114,7 @@ public class DataUploadService {
             if (imageConfig.isCustomSubject()) {
                 subject = Subject.CUSTOM;
             }
-            if (ParamCache.paramMap.get(student.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(student.getWorkId())).getImageEncrypt() == 1) {
                 //保存裁切原图+文件名加密
                 String imageDir = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject
                         + File.separator + student.getAreaCode();
@@ -371,36 +376,36 @@ public class DataUploadService {
     public List<ExcelError> uploadStudentsForTrial(Long workId, Subject subject, InputStream inputStream) throws Exception {
         Work work = workRepo.findOne(workId);
         if (Objects.isNull(work)) {
-            throw new Exception("没有此工作区");
+            throw new RuntimeException("没有此工作区");
         }
         long count = paperRepo.countByWorkIdAndSubject(workId, subject);
         if (count == 0) {
-            throw new Exception("没有采集数据,不能导入试评数据");
+            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);
         if (markSubject.getTest() == TrialEnum.START_TRIAL.getId()) {
-            throw new Exception("已经开始试评,请先结束试评再重新导入数据");
+            throw new RuntimeException("已经开始试评,请先结束试评再重新导入数据");
         }
 
         List<Level> levels = levelRepo.findByWorkId(workId);
-        if (levels.size() == 0) {
+        if (levels == null || levels.isEmpty()) {
             throw new RuntimeException("没有设定档位");
         }
 
         List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
         List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_LEVELING).collect(Collectors.toList());
-        if (levelMarkers.size() == 0) {
+        if (levelMarkers.isEmpty()) {
             throw new RuntimeException("没有设定评卷员");
         }
 
         List<MarkUser> markerLeader = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARK_LEADER);
-        if (markerLeader.size() == 0) {
+        if (markerLeader == null || markerLeader.isEmpty()) {
             throw new RuntimeException("没有设定科组长");
         }
 
-        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
-        if (markerGroups.size() == 0) {
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(workId, subject, markSubject.getStage());
+        if (markerGroups == null || markerGroups.isEmpty()) {
             throw new RuntimeException("评卷员没有进行分组");
         }
 
@@ -418,7 +423,6 @@ public class DataUploadService {
 
         ExcelReader excelReader = new ExcelReader(StudentDTO.class);
 
-//        List<Student> studentList = new ArrayList<>();
         List<Paper> paperList = new ArrayList<>();
 
         List<ExcelError> excelErrors = excelReader.reader(inputStream, obj -> {
@@ -432,10 +436,8 @@ public class DataUploadService {
                 Student student = studentMap.get(dto.getExamNumber());
                 if (student == null) {
                     return null;
-//                        throw new Exception("没有学生" + dto.getName() + "信息");
                 }
                 if (!student.getUploadStatus().contains(subject + ":1")) {
-//                        throw new Exception("学生" + student.getName() + "未采集完试卷");
                     return null;
                 }
 
@@ -445,9 +447,6 @@ public class DataUploadService {
                 if (Objects.isNull(paper) || paper.getIsMissing()) {
                     return null;
                 }
-
-//                studentList.add(student);
-
                 paperList.add(paper);
             } catch (Exception e) {
                 ExcelError excelError = new ExcelError();
@@ -540,12 +539,11 @@ public class DataUploadService {
             String slicePath = null;
             String fileName = student.getExamNumber();
             //0:随机码 1:考号
-            if (ParamCache.paramMap.get(student.getWorkId()).getNameRule() == 1) {
-//            fileName = DigestUtils.md5Hex(subject.name() + fileName);
+            if (ParamCache.collectConfigMap.get(String.valueOf(student.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
             //图片是否加密
-            Integer imageEnc = Optional.ofNullable(ParamCache.paramMap.get(student.getWorkId()).getImageEncrypt()).orElse(0);
+            Integer imageEnc = Optional.ofNullable(ParamCache.collectConfigMap.get(String.valueOf(student.getWorkId())).getImageEncrypt()).orElse(0);
             if (imageEnc == 1) {
                 String imageMd5 = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
                 sheetPath = systemConfig.getSheetDir() + File.separator + student.getWorkId() + File.separator + subject
@@ -690,6 +688,98 @@ public class DataUploadService {
         return true;
     }
 
+    @Transactional
+    public List<ExcelError> uploadGroupStudent(Subject subject, MarkStage stage, Long groupId, InputStream inputStream) throws Exception {
+        Long workId = ServletUtil.getWordId();
+        //只能第一次分档才能导入
+        Integer coarseLevel = ParamCache.levelConfigMap.get(String.valueOf(workId)).getCoarseLevel();
+        if ((coarseLevel == 1 && !stage.equals(MarkStage.COARSE_LEVEL))
+                || (coarseLevel == 0 && !stage.equals(MarkStage.LEVEL))) {
+            throw new RuntimeException("当前阶段不能导入考生数据");
+        }
+
+        // 删除
+        markerGroupStudentRepo.deleteByGroupIdAndUsed(groupId, false);
+
+        // 查询考生
+        List<Student> studentList = studentRepo.findByWorkId(workId);
+        if (studentList == null || studentList.isEmpty()) {
+            throw new RuntimeException("没有考生信息");
+        }
+        Map<String, Student> studentMap = studentList.stream().collect(Collectors.toMap(Student::getExamNumber, Function.identity()));
+
+        // 查询已发布任务的所有试卷
+        List<Paper> paperList = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrue(workId, subject, null);
+        Map<String, Paper> paperMap = null;
+        if (paperList != null && !paperList.isEmpty()) {
+            paperMap = paperList.stream().collect(Collectors.toMap(Paper::getExamNumber, Function.identity()));
+        }
+        final Map<String, Paper> finalPaperMap = paperMap;
+        // 查询【工作+科目+阶段】下所有数据
+        List<MarkerGroupStudent> markerGroupStudents = markerGroupStudentRepo.findByWorkIdAndSubjectAndStageAndUsed(workId, subject, stage, false);
+        Map<String, MarkerGroupStudent> markerGroupStudentMap = null;
+        if (markerGroupStudents != null && !markerGroupStudents.isEmpty()) {
+            // 别的人组
+            markerGroupStudentMap = markerGroupStudents.stream().filter(m -> !m.getGroupId().equals(groupId)).collect(Collectors.toMap(MarkerGroupStudent::getExamNumber, Function.identity()));
+        }
+        final Map<String, MarkerGroupStudent> finalMarkerGroupStudentMap = markerGroupStudentMap;
+
+        List<MarkerGroupStudent> markerGroupStudentList = new ArrayList<>();
+        long batchNo = System.currentTimeMillis();
+        ExcelReader excelReader = new ExcelReader(MarkerGroupStudent.class);
+        List<ExcelError> excelErrors = excelReader.reader(inputStream, obj -> {
+            try {
+                StudentDTO dto = (StudentDTO) obj;
+                String examNumber = dto.getExamNumber();
+                if (StringUtils.isBlank(examNumber)) {
+                    throw new RuntimeException("准考证号不能为空");
+                }
+
+                if (studentMap.get(examNumber) == null) {
+                    throw new RuntimeException(String.format("考生管理中未查到[%s]考生", examNumber));
+                }
+
+                if (finalPaperMap != null && finalPaperMap.get(examNumber) != null) {
+                    throw new RuntimeException(String.format("考生[%s]已经发布任务,不能重复导入", examNumber));
+                }
+
+                if (finalMarkerGroupStudentMap != null && finalMarkerGroupStudentMap.get(examNumber) != null) {
+                    throw new RuntimeException(String.format("考生[%s]已经导入其它分组,不能重复导入", examNumber));
+                }
+
+                MarkerGroupStudent markerGroupStudent = new MarkerGroupStudent(workId, stage, subject, groupId, dto.getExamNumber(), dto.getName(), dto.getAreaCode(), dto.getAreaName(), dto.getExamRoom(), dto.getSchool(), dto.getSourceName(), batchNo);
+                markerGroupStudentList.add(markerGroupStudent);
+                return null;
+            } catch (RuntimeException e) {
+                //手动回滚
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                ExcelError excelError = new ExcelError();
+                excelError.setExcelErrorType(e.getMessage());
+                return excelError;
+            }
+        });
+        String errors = errorsString(excelErrors);
+        if (errors.length() > 0) {
+            throw new RuntimeException(errors);
+        }
+
+        if (!CollectionUtils.isEmpty(markerGroupStudentList)) {
+            List<MarkerGroupStudent> data = new ArrayList<>();
+            for (MarkerGroupStudent stu : markerGroupStudentList) {
+                if (data.size() == 2000) {
+                    markerGroupStudentRepo.save(data);
+                    data.clear();
+                }
+                data.add(stu);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                markerGroupStudentRepo.save(data);
+            }
+        }
+        return excelErrors;
+    }
+
     /**
      * 拼接导入异常信息
      *

+ 7 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/WorkService.java

@@ -7,6 +7,7 @@ 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.ParamSetting;
 import cn.com.qmth.stmms.ms.core.domain.Work;
+import cn.com.qmth.stmms.ms.core.domain.enums.ParamSettingTypeEnum;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
@@ -88,10 +89,13 @@ public class WorkService {
         }
 
         //新增工作的同时,初始化该工作的全局参数
-        ParamSetting paramSetting = ParamSetting.init();
-        paramSetting.setWorkId(work.getId());
+        ParamSetting paramSetting = ParamSetting.init(work.getId());
         paramSettingRepo.save(paramSetting);
-        ParamCache.resetParam(paramSetting);
+
+        ParamCache.cacheParam(ParamSettingTypeEnum.COLLECT, work.getId(), paramSetting.getCollectConfig());
+        ParamCache.cacheParam(ParamSettingTypeEnum.FIRST_LEVEL, work.getId(), paramSetting.getCoarseLevelConfig());
+        ParamCache.cacheParam(ParamSettingTypeEnum.LEVEL, work.getId(), paramSetting.getLevelConfig());
+        ParamCache.cacheParam(ParamSettingTypeEnum.SCORE, work.getId(), paramSetting.getScoreConfig());
 
         // 设置默认档位
         bultInAccountUtil.createLevels(work.getId());

+ 12 - 13
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BuiltInParamUtils.java

@@ -7,7 +7,6 @@ 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.LevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.stereotype.Component;
 
@@ -33,18 +32,18 @@ public class BuiltInParamUtils {
      */
     public void createLevels(Long workId) {
         //默认增加档位
-        Level A = new Level(workId, "A", 0, 100, 90, Level.LevelType.ADMITED, 95);
-        Level B = new Level(workId, "B", 1, 89, 85, Level.LevelType.ADMITED, 87);
-        Level C = new Level(workId, "C", 2, 84, 80, Level.LevelType.ADMITED, 82);
-        Level D = new Level(workId, "D", 3, 79, 75, Level.LevelType.ADMITED, 77);
-        Level E = new Level(workId, "E", 4, 74, 70, Level.LevelType.ADMITED, 72);
-        Level F = new Level(workId, "F", 5, 69, 65, Level.LevelType.ADMITED, 67);
-        Level G = new Level(workId, "G", 6, 64, 60, Level.LevelType.ADMITED, 62);
-        Level H = new Level(workId, "H", 7, 59, 55, Level.LevelType.ADMITED, 57);
-        Level I = new Level(workId, "I", 8, 54, 50, Level.LevelType.ADMITED, 52);
-        Level J = new Level(workId, "J", 9, 49, 45, Level.LevelType.ADMITED, 47);
-        Level K = new Level(workId, "K", 10, 44, 0, Level.LevelType.ADMITED, 40);
-        List<Level> levels = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K);
+        Level aLevel = new Level(workId, "A", 0, 100, 90, Level.LevelType.ADMITED, 95, "一", 93);
+        Level bLevel = new Level(workId, "B", 1, 89, 85, Level.LevelType.ADMITED, 87, "一", 93);
+        Level cLevel = new Level(workId, "C", 2, 84, 80, Level.LevelType.ADMITED, 82, "二", 80);
+        Level dLevel = new Level(workId, "D", 3, 79, 75, Level.LevelType.ADMITED, 77, "二", 80);
+        Level eLevel = new Level(workId, "E", 4, 74, 70, Level.LevelType.ADMITED, 72, "三", 68);
+        Level fLevel = new Level(workId, "F", 5, 69, 65, Level.LevelType.ADMITED, 67, "三", 68);
+        Level gLevel = new Level(workId, "G", 6, 64, 60, Level.LevelType.ADMITED, 62, "三", 68);
+        Level hLevel = new Level(workId, "H", 7, 59, 55, Level.LevelType.ADMITED, 57, "四", 55);
+        Level iLevel = new Level(workId, "I", 8, 54, 50, Level.LevelType.ADMITED, 52, "四", 55);
+        Level jLevel = new Level(workId, "J", 9, 49, 45, Level.LevelType.ADMITED, 47, "五", 35);
+        Level kLevel = new Level(workId, "K", 10, 44, 0, Level.LevelType.ADMITED, 40, "五", 35);
+        List<Level> levels = Arrays.asList(aLevel, bLevel, cLevel, dLevel, eLevel, fLevel, gLevel, hLevel, iLevel, jLevel, kLevel);
         levelRepo.save(levels);
     }
 

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

@@ -12,13 +12,10 @@ import cn.com.qmth.stmms.ms.commons.utils.*;
 import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.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.PaperAssembler;
-import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import net.coobird.thumbnailator.Thumbnails;
 import net.coobird.thumbnailator.geometry.Positions;
 import net.sf.json.JSONObject;
@@ -159,7 +156,7 @@ public class CollectApi {
             loginDTO.setUserId(markUser.getId());
             loginDTO.setExamId(markUser.getWorkId());
             loginDTO.setExamName(activeWork.getName());
-            loginDTO.setImageEnc(ParamCache.paramMap.get(activeWork.getId()).getImageEncrypt() == 1);
+            loginDTO.setImageEnc(ParamCache.collectConfigMap.get(String.valueOf(activeWork.getId())).getImageEncrypt() == 1);
         }
         List<CollectSubjectDTO> collectSubjectDTOs = new ArrayList<>();
         activeWork.getSubjects().forEach(s -> {
@@ -603,8 +600,7 @@ public class CollectApi {
 //        }
         String fileName = student.getExamNumber();
         //0:随机码 1:考号
-        if (ParamCache.paramMap.get(student.getWorkId()).getNameRule() == 1) {
-//            fileName = DigestUtils.md5Hex(subject.name() + fileName);
+        if (ParamCache.collectConfigMap.get(String.valueOf(student.getWorkId())).getNameRule() == 1) {
             fileName = MD5Util.getImageRuleMd5(workId, subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
         }
 //        File outSheetFile = new File(saveSheetPath + File.separator + fileName + ".jpg");
@@ -672,8 +668,7 @@ public class CollectApi {
         }
         String fileName = student.getExamNumber();
         //0:随机码 1:考号
-        if (ParamCache.paramMap.get(student.getWorkId()).getNameRule() == 1) {
-//            fileName = DigestUtils.md5Hex(subject.name() + fileName);
+        if (ParamCache.collectConfigMap.get(String.valueOf(student.getWorkId())).getNameRule() == 1) {
             fileName = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
         }
         File outFile = new File(savePath + File.separator + fileName + ".jpg");
@@ -877,7 +872,7 @@ public class CollectApi {
 
                             String fileName = examNumber;
                             //图片加密、命名规则为随机码的,都是需要md5
-                            if (ParamCache.paramMap.get(workId).getNameRule() == 1 || ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                            if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getNameRule() == 1 || ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                                 fileName = MD5Util.getImageRuleMd5(workId, subject1.ordinal(), areaCode, examNumber, studentId);
                             }
 
@@ -976,7 +971,7 @@ public class CollectApi {
                                     //读取指定路径下面的文件
                                     inputStream = new FileInputStream(file);
                                     outputStream = new FileOutputStream(expFile);
-                                    if (ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                                    if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                                         outputStream = SystemConstant.writeStream(inputStream, outputStream);
                                     } else {
                                         outputStream = SystemConstant.writeStreamFomal(inputStream, outputStream);
@@ -1068,7 +1063,7 @@ public class CollectApi {
 
                 String fileName = examNumber;
                 //图片加密、命名规则为随机码的,都是需要md5
-                if (ParamCache.paramMap.get(workId).getNameRule() == 1 || ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getNameRule() == 1 || ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                     fileName = MD5Util.getImageRuleMd5(workId, subject1.ordinal(), areaCode, examNumber, studentId);
                 }
                 String path;
@@ -1103,7 +1098,7 @@ public class CollectApi {
                 //读取指定路径下面的文件
                 inputStream = new FileInputStream(file);
                 outputStream = new FileOutputStream(expFile);
-                if (ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                     outputStream = SystemConstant.writeStream(inputStream, outputStream);
                 } else {
                     outputStream = SystemConstant.writeStreamFomal(inputStream, outputStream);
@@ -1206,7 +1201,7 @@ public class CollectApi {
         } else {
             throw new RuntimeException("图片类型有误");
         }
-        if (paperList != null && paperList.size() > 0) {
+        if (paperList != null && !paperList.isEmpty()) {
             paperList.stream().map(m -> {
                 Long studentId = Long.valueOf(m.get("studentId").toString());
                 String subject = m.get("subject").toString();
@@ -1216,7 +1211,7 @@ public class CollectApi {
                 //默认命名为考号
                 String fileName = examNumber;
                 //图片加密、命名规则为随机码的,都是需要md5
-                if (ParamCache.paramMap.get(workId).getNameRule() == 1 || ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getNameRule() == 1 || ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                     fileName = MD5Util.getImageRuleMd5(workId, subject1.ordinal(), areaCode, examNumber, studentId);
                 }
                 String filePath = null;
@@ -1271,7 +1266,7 @@ public class CollectApi {
                 //默认命名为考号
                 String fileName = examNumber;
                 //图片加密、命名规则为随机码的,都是需要md5
-                if (ParamCache.paramMap.get(workId).getNameRule() == 1 || ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getNameRule() == 1 || ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                     fileName = MD5Util.getImageRuleMd5(workId, subject1.ordinal(), areaCode, examNumber, studentId);
                 }
 
@@ -1346,7 +1341,7 @@ public class CollectApi {
                         //读取指定路径下面的文件
                         inputStream = new FileInputStream(file);
                         outputStream = new FileOutputStream(expFile);
-                        if (ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                        if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                             outputStream = SystemConstant.writeStream(inputStream, outputStream);
                         } else {
                             outputStream = SystemConstant.writeStreamFomal(inputStream, outputStream);

+ 1 - 1
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/OssUploadUtil.java

@@ -78,7 +78,7 @@ public class OssUploadUtil {
             att.setTime(new Date());
             String fileName = student.getExamNumber();
             //0:随机码 1:考号
-            if (ParamCache.paramMap.get(student.getWorkId()).getNameRule() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(student.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
             StringJoiner ossSavePath = new StringJoiner("/").add(imageServerConfig.getDir()).add(dir.replace("\\", "/")).add(String.valueOf(student.getWorkId())).add(subject.name()).add(student.getAreaCode());

+ 3 - 4
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java

@@ -11,7 +11,6 @@ import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Student;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import org.apache.commons.codec.digest.DigestUtils;
@@ -59,7 +58,7 @@ public class RotateTask implements Runnable {
             String sliceMD5 = null;
 
             LOGGER.info("准备生成缩略和裁切旋转图:{}, paperId:{}", start, paper.getId());
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 try {
                     Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
                     String imageMd5 = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), paper.getAreaCode(), paper.getExamNumber(), student.getId());
@@ -185,7 +184,7 @@ public class RotateTask implements Runnable {
                 } else if (!imageConfig.isCustomSubject() && imageServerConfig.isAliyunOss()) {
                     String fileName = paper.getExamNumber();
                     Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
-                    if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+                    if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                         fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), paper.getExamNumber(), student.getId());
                     }
                     long s0 = System.currentTimeMillis();
@@ -227,7 +226,7 @@ public class RotateTask implements Runnable {
                     imageFile.delete();
                 } else {
                     String fileName = paper.getExamNumber();
-                    if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+                    if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                         Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
                         fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), paper.getExamNumber(), student.getId());
                     }

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

@@ -13,8 +13,6 @@ public class ServletUtil {
 
     /**
      * 获取HttpServletRequest
-     *
-     * @return
      */
     public static HttpServletRequest getRequest() {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
@@ -23,21 +21,30 @@ public class ServletUtil {
 
     /**
      * 获取用户ID
-     * @return
      */
     public static Long getUserId() {
         HttpServletRequest request = getRequest();
         String userId = request.getHeader("userId");
+        if (StringUtils.isBlank(userId)) {
+            throw new RuntimeException("未获取到userID");
+        }
         return StringUtils.isBlank(userId) ? null : Long.valueOf(userId);
     }
 
     /**
      * 获取工作ID
-     * @return
      */
     public static Long getWordId() {
         HttpServletRequest request = getRequest();
-        String workId = request.getHeader("examId");
-        return StringUtils.isBlank(workId) ? null : Long.valueOf(workId);
+        // 后台取值为workId
+        String workId = request.getHeader("workId");
+        if (StringUtils.isBlank(workId)) {
+            // 采集端取值为examId
+            workId = request.getHeader("examId");
+        }
+        if (StringUtils.isBlank(workId)) {
+            throw new RuntimeException("未获取到workID");
+        }
+        return Long.valueOf(workId);
     }
 }

+ 56 - 10
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/cache/ParamCache.java

@@ -1,15 +1,20 @@
 package cn.com.qmth.stmms.ms.core.cache;
 
 import cn.com.qmth.stmms.ms.core.domain.ParamSetting;
+import cn.com.qmth.stmms.ms.core.domain.enums.ParamSettingTypeEnum;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.CollectConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.CoarseLevelConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.LevelConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.ScoreConfig;
 import cn.com.qmth.stmms.ms.core.repository.ParamSettingRepo;
-import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.JSON;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.annotation.Resource;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -18,9 +23,12 @@ import java.util.Map;
 public class ParamCache {
     private static final Logger LOGGER = LoggerFactory.getLogger(ParamCache.class);
 
-    public static Map<Long, ParamSetting> paramMap = new HashMap<>();
+    public static Map<String, CollectConfig> collectConfigMap = new HashMap<>();
+    public static Map<String, CoarseLevelConfig> firstLevelConfigMap = new HashMap<>();
+    public static Map<String, LevelConfig> levelConfigMap = new HashMap<>();
+    public static Map<String, ScoreConfig> scoreConfigMap = new HashMap<>();
 
-    @Autowired
+    @Resource
     private ParamSettingRepo paramSettingRepo;
 
     @PostConstruct
@@ -28,19 +36,57 @@ public class ParamCache {
         //系统启动中。。。加载codeMap
         List<ParamSetting> paramSettings = paramSettingRepo.findAll();
         for (ParamSetting param : paramSettings) {
-            paramMap.put(param.getWorkId(), param);
+            // 采集
+            cacheParam(ParamSettingTypeEnum.COLLECT, param.getWorkId(), param.getCollectConfig());
+            // 粗分档
+            cacheParam(ParamSettingTypeEnum.FIRST_LEVEL, param.getWorkId(), param.getCoarseLevelConfig());
+            // 细分档
+            cacheParam(ParamSettingTypeEnum.LEVEL, param.getWorkId(), param.getLevelConfig());
+            // 打分
+            cacheParam(ParamSettingTypeEnum.SCORE, param.getWorkId(), param.getScoreConfig());
         }
-        LOGGER.info("加载参数成功:{}", JSONObject.toJSONString(paramMap));
+        LOGGER.info("加载采集参数成功:{}", JSON.toJSONString(collectConfigMap));
+        LOGGER.info("加载粗分档参数成功:{}", JSON.toJSONString(firstLevelConfigMap));
+        LOGGER.info("加载细分档参数成功:{}", JSON.toJSONString(levelConfigMap));
+        LOGGER.info("加载打分参数成功:{}", JSON.toJSONString(scoreConfigMap));
     }
 
     @PreDestroy
     public void destroy() {
         //系统运行结束
-        paramMap.clear();
+        collectConfigMap.clear();
+        firstLevelConfigMap.clear();
+        levelConfigMap.clear();
+        scoreConfigMap.clear();
     }
 
-    public static void resetParam(ParamSetting paramSetting) {
-        paramMap.put(paramSetting.getWorkId(), paramSetting);
-        LOGGER.info("修改参数后重新加载成功:{}", JSONObject.toJSONString(paramMap));
+    /**
+     * 缓存值
+     *
+     * @param typeEnum 类型
+     * @param workId   工作ID
+     * @param value    参数值
+     */
+    public static void cacheParam(ParamSettingTypeEnum typeEnum, Long workId, String value) {
+        // 采集
+        if (ParamSettingTypeEnum.COLLECT.equals(typeEnum)) {
+            CollectConfig collectConfig = JSON.parseObject(value, CollectConfig.class);
+            collectConfigMap.put(String.valueOf(workId), collectConfig);
+        }
+        // 粗分档
+        if (ParamSettingTypeEnum.FIRST_LEVEL.equals(typeEnum)) {
+            CoarseLevelConfig firstLevelConfig = JSON.parseObject(value, CoarseLevelConfig.class);
+            firstLevelConfigMap.put(String.valueOf(workId), firstLevelConfig);
+        }
+        // 细分档
+        if (ParamSettingTypeEnum.LEVEL.equals(typeEnum)) {
+            LevelConfig levelConfig = JSON.parseObject(value, LevelConfig.class);
+            levelConfigMap.put(String.valueOf(workId), levelConfig);
+        }
+        // 打分
+        if (ParamSettingTypeEnum.SCORE.equals(typeEnum)) {
+            ScoreConfig scoreConfig = JSON.parseObject(value, ScoreConfig.class);
+            scoreConfigMap.put(String.valueOf(workId), scoreConfig);
+        }
     }
 }

+ 36 - 5
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Level.java

@@ -10,8 +10,8 @@ import java.io.Serializable;
  */
 @Entity
 @Table(indexes = {
-        @Index(name = "idx_level_workId_code",columnList = "workId,code",unique = true)})
-public class Level implements Serializable{
+        @Index(name = "idx_level_workId_code", columnList = "workId,code", unique = true)})
+public class Level implements Serializable {
 
 
     private static final long serialVersionUID = -5290818783456310642L;
@@ -40,7 +40,7 @@ public class Level implements Serializable{
         this.id = id;
     }
 
-    public static enum LevelType{
+    public static enum LevelType {
         /**
          * 非录取
          */
@@ -93,9 +93,22 @@ public class Level implements Serializable{
      */
     private int kdpt = 0;
 
-    public Level(){}
+    /**
+     * 粗分档档位
+     */
+    @NotNull
+    private String coarseCode;
+
+    /**
+     * 粗分档典型值
+     */
+    @NotNull
+    private Integer coarseWeight;
+
+    public Level() {
+    }
 
-    public Level(Long workId,String code, int levelValue, int maxScore, int minScore, LevelType levelType,Integer weight) {
+    public Level(Long workId, String code, int levelValue, int maxScore, int minScore, LevelType levelType, Integer weight, String coarseCode, Integer coarseWeight) {
         this.workId = workId;
         this.code = code;
         this.levelValue = levelValue;
@@ -103,6 +116,8 @@ public class Level implements Serializable{
         this.minScore = minScore;
         this.levelType = levelType;
         this.weight = weight;
+        this.coarseCode = coarseCode;
+        this.coarseWeight = coarseWeight;
         this.pt = 100;
         this.kdpt = 100;
     }
@@ -178,4 +193,20 @@ public class Level implements Serializable{
     public void setKdpt(int kdpt) {
         this.kdpt = kdpt;
     }
+
+    public String getCoarseCode() {
+        return coarseCode;
+    }
+
+    public void setCoarseCode(String coarseCode) {
+        this.coarseCode = coarseCode;
+    }
+
+    public Integer getCoarseWeight() {
+        return coarseWeight;
+    }
+
+    public void setCoarseWeight(Integer coarseWeight) {
+        this.coarseWeight = coarseWeight;
+    }
 }

+ 4 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkStage.java

@@ -10,6 +10,10 @@ public enum MarkStage {
      * 初始
      */
     INIT,
+    /**
+     * 粗分档
+     */
+    COARSE_LEVEL,
     /**
      * 分档
      */

+ 178 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkerGroupStudent.java

@@ -0,0 +1,178 @@
+package cn.com.qmth.stmms.ms.core.domain;
+
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * 分组考生信息
+ */
+@Entity
+@Table(name = "marker_group_student")
+public class MarkerGroupStudent implements Serializable {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    private Long workId;
+
+    private Subject subject;
+
+    private MarkStage stage;
+
+    private Long groupId;
+
+    private String examNumber;
+
+    private String name;
+
+    private String areaCode;
+
+    private String areaName;
+
+    private String examRoom;
+
+    private String school;
+
+    private String sourceName;
+
+    private Long batchNo;
+
+    private Boolean used;
+
+    public MarkerGroupStudent() {
+    }
+
+    public MarkerGroupStudent(Long workId, MarkStage stage, Subject subject, Long groupId, String examNumber, String name, String areaCode, String areaName, String examRoom, String school, String sourceName, Long batchNo) {
+        this.workId = workId;
+        this.subject = subject;
+        this.stage = stage;
+        this.groupId = groupId;
+        this.examNumber = examNumber;
+        this.name = name;
+        this.areaCode = areaCode;
+        this.areaName = areaName;
+        this.examRoom = examRoom;
+        this.school = school;
+        this.sourceName = sourceName;
+        this.batchNo = batchNo;
+        this.used = false; // 默认未使用
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public Subject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
+
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
+    public Long getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(Long groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getSchool() {
+        return school;
+    }
+
+    public void setSchool(String school) {
+        this.school = school;
+    }
+
+    public String getSourceName() {
+        return sourceName;
+    }
+
+    public void setSourceName(String sourceName) {
+        this.sourceName = sourceName;
+    }
+
+    public Long getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(Long batchNo) {
+        this.batchNo = batchNo;
+    }
+
+    public Boolean getUsed() {
+        return used;
+    }
+
+    public void setUsed(Boolean used) {
+        this.used = used;
+    }
+}

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

@@ -1,6 +1,14 @@
 package cn.com.qmth.stmms.ms.core.domain;
 
-import javax.persistence.*;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.CollectConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.LevelConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.ScoreConfig;
+import com.alibaba.fastjson.JSON;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
@@ -18,61 +26,66 @@ public class ParamSetting implements Serializable {
     @NotNull
     private Long workId;
 
-    private Integer packageScan;
+    // 采集参数
+    private String collectConfig;
 
-    private Integer imageEncrypt;
+    // 粗分档参数
+    private String coarseLevelConfig;
 
-    private Integer nameRule;
+    // 细分档参数
+    private String levelConfig;
 
-    private Integer paperStage;
+    // 打分参数
+    private String scoreConfig;
 
-    private Integer deviation;
 
-    private Integer autoCallback;
-
-    private Integer majority;
-
-    private Integer cumulativeError;
-
-    private Integer levelShowAllPaper;
-
-    private Integer roundUp;
-
-    private Integer clearData;
-
-    private Integer changeStage;
-
-    private Integer scoreShowAllPaper;
-
-    private Integer propDenominator;
-
-    private Integer autoCallbackShowDeviation;
-
-    private Integer showStandardPaperManage;
-
-    private Integer takeBest;
-
-
-    public static ParamSetting init(){
+    public static ParamSetting init(Long workId) {
         ParamSetting paramSetting = new ParamSetting();
-        paramSetting.setPackageScan(0);
-        paramSetting.setImageEncrypt(0);
-        paramSetting.setNameRule(0);
-        paramSetting.setPaperStage(0);
-        //仲裁档位差,默认4
-        paramSetting.setDeviation(4);
-        paramSetting.setAutoCallback(0);
-        paramSetting.setMajority(1);
-        paramSetting.setLevelShowAllPaper(0);
-        paramSetting.setRoundUp(1);
-        paramSetting.setClearData(0);
-        paramSetting.setChangeStage(0);
-        paramSetting.setScoreShowAllPaper(0);
-        paramSetting.setPropDenominator(1);
-        paramSetting.setAutoCallbackShowDeviation(1);
-        paramSetting.setShowStandardPaperManage(1);
+        paramSetting.setWorkId(workId);
+        // 粗分档参数
+        CollectConfig collectConfig = new CollectConfig();
+        collectConfig.setPackageScan(0); //是否整包扫描
+        collectConfig.setImageEncrypt(0); //图片是否加密
+        collectConfig.setNameRule(0); //图片命名规则
+        collectConfig.setPaperStage(0);//试卷档位
+        paramSetting.setCollectConfig(JSON.toJSONString(collectConfig));
+
+        // 细分档参数
+        LevelConfig levelConfig = new LevelConfig();
+        levelConfig.setDeviation(4);//仲裁档位差
+        levelConfig.setAutoCallback(0);//是否自动打回
+        levelConfig.setMajority(1);//是否过半定档
+        levelConfig.setTakeBest(1);//取优原则
+        levelConfig.setLevelShowAllPaper(0);//阅卷员是否显示所有试卷
+        levelConfig.setPropDenominator(1);//档位百分比分母
+        levelConfig.setShowStandardPaperManage(1);//是否显示标准卷管理
+        levelConfig.setClearData(0);//是否显示清除当前阅卷数据
+        levelConfig.setCoarseLevel(0);//是否开启粗分档
+        levelConfig.setRemoveHighAndLow(0);//是否开启去高去低再加权评卷
+        paramSetting.setLevelConfig(JSON.toJSONString(levelConfig));
+
+        // 粗分档参数
+        LevelConfig coarseLevelConfig = new LevelConfig();
+        coarseLevelConfig.setAutoCallback(0);//是否自动打回
+        coarseLevelConfig.setDeviation(4);//仲裁档位差
+        coarseLevelConfig.setMajority(1);//是否过半定档
+        coarseLevelConfig.setTakeBest(1);//取优原则
+        coarseLevelConfig.setLevelShowAllPaper(0);//阅卷员是否显示所有试卷
+        coarseLevelConfig.setPropDenominator(1);//档位百分比分母
+        coarseLevelConfig.setClearData(0);//是否显示清除当前阅卷数据
+        coarseLevelConfig.setShowStandardPaperManage(1);//是否显示标准卷管理
+        coarseLevelConfig.setRemoveHighAndLow(0);//是否开启去高去低再加权评卷
+        paramSetting.setCoarseLevelConfig(JSON.toJSONString(coarseLevelConfig));
+
+        // 打分参数
+        ScoreConfig scoreConfig = new ScoreConfig();
+        scoreConfig.setRoundUp(1);//分数处理方式
+        scoreConfig.setChangeStage(0);//阅卷员是否显示改档及改档打分
+        scoreConfig.setScoreShowAllPaper(0); //阅卷员是否显示所有试卷
+        scoreConfig.setRemoveHighAndLow(0);// 分数计算方式(1:去高去低加权平均,0:全部加权平均)
+        paramSetting.setScoreConfig(JSON.toJSONString(scoreConfig));
+
         // 取优原则默认开启
-        paramSetting.setTakeBest(1);
         return paramSetting;
     }
 
@@ -92,139 +105,35 @@ public class ParamSetting implements Serializable {
         this.workId = workId;
     }
 
-    public Integer getPackageScan() {
-        return packageScan;
-    }
-
-    public void setPackageScan(Integer packageScan) {
-        this.packageScan = packageScan;
-    }
-
-    public Integer getImageEncrypt() {
-        return imageEncrypt;
-    }
-
-    public void setImageEncrypt(Integer imageEncrypt) {
-        this.imageEncrypt = imageEncrypt;
-    }
-
-    public Integer getNameRule() {
-        return nameRule;
-    }
-
-    public void setNameRule(Integer nameRule) {
-        this.nameRule = nameRule;
-    }
-
-    public Integer getPaperStage() {
-        return paperStage;
-    }
-
-    public void setPaperStage(Integer paperStage) {
-        this.paperStage = paperStage;
-    }
-
-    public Integer getDeviation() {
-        return deviation;
-    }
-
-    public void setDeviation(Integer deviation) {
-        this.deviation = deviation;
-    }
-
-    public Integer getAutoCallback() {
-        return autoCallback;
-    }
-
-    public void setAutoCallback(Integer autoCallback) {
-        this.autoCallback = autoCallback;
-    }
-
-    public Integer getMajority() {
-        return majority;
-    }
-
-    public void setMajority(Integer majority) {
-        this.majority = majority;
-    }
-
-    public Integer getCumulativeError() {
-        return cumulativeError;
-    }
-
-    public void setCumulativeError(Integer cumulativeError) {
-        this.cumulativeError = cumulativeError;
-    }
-
-    public Integer getLevelShowAllPaper() {
-        return levelShowAllPaper;
-    }
-
-    public void setLevelShowAllPaper(Integer levelShowAllPaper) {
-        this.levelShowAllPaper = levelShowAllPaper;
-    }
-
-    public Integer getRoundUp() {
-        return roundUp;
-    }
-
-    public void setRoundUp(Integer roundUp) {
-        this.roundUp = roundUp;
-    }
-
-    public Integer getClearData() {
-        return clearData;
-    }
-
-    public void setClearData(Integer clearData) {
-        this.clearData = clearData;
-    }
-
-    public Integer getChangeStage() {
-        return changeStage;
-    }
-
-    public void setChangeStage(Integer changeStage) {
-        this.changeStage = changeStage;
-    }
-
-    public Integer getScoreShowAllPaper() {
-        return scoreShowAllPaper;
-    }
-
-    public void setScoreShowAllPaper(Integer scoreShowAllPaper) {
-        this.scoreShowAllPaper = scoreShowAllPaper;
-    }
-
-    public Integer getPropDenominator() {
-        return propDenominator;
+    public String getCollectConfig() {
+        return collectConfig;
     }
 
-    public void setPropDenominator(Integer propDenominator) {
-        this.propDenominator = propDenominator;
+    public void setCollectConfig(String collectConfig) {
+        this.collectConfig = collectConfig;
     }
 
-    public Integer getAutoCallbackShowDeviation() {
-        return autoCallbackShowDeviation;
+    public String getCoarseLevelConfig() {
+        return coarseLevelConfig;
     }
 
-    public void setAutoCallbackShowDeviation(Integer autoCallbackShowDeviation) {
-        this.autoCallbackShowDeviation = autoCallbackShowDeviation;
+    public void setCoarseLevelConfig(String coarseLevelConfig) {
+        this.coarseLevelConfig = coarseLevelConfig;
     }
 
-    public Integer getShowStandardPaperManage() {
-        return showStandardPaperManage;
+    public String getLevelConfig() {
+        return levelConfig;
     }
 
-    public void setShowStandardPaperManage(Integer showStandardPaperManage) {
-        this.showStandardPaperManage = showStandardPaperManage;
+    public void setLevelConfig(String levelConfig) {
+        this.levelConfig = levelConfig;
     }
 
-    public Integer getTakeBest() {
-        return takeBest;
+    public String getScoreConfig() {
+        return scoreConfig;
     }
 
-    public void setTakeBest(Integer takeBest) {
-        this.takeBest = takeBest;
+    public void setScoreConfig(String scoreConfig) {
+        this.scoreConfig = scoreConfig;
     }
 }

+ 70 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/ParamSettingTypeEnum.java

@@ -0,0 +1,70 @@
+package cn.com.qmth.stmms.ms.core.domain.enums;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 参数设置类型
+ */
+public enum ParamSettingTypeEnum {
+
+    /**
+     * 采集参数
+     */
+    COLLECT("COLLECT", "采集参数"),
+    /**
+     * 粗分档参数
+     */
+    FIRST_LEVEL("FIRST_LEVEL", "粗分档参数"),
+    /**
+     * 细分档参数
+     */
+    LEVEL("LEVEL", "细分档参数"),
+    /**
+     * 打分参数
+     */
+    SCORE("SCORE", "打分参数");
+
+    private String code;
+
+    private String name;
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+
+    ParamSettingTypeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public static ParamSettingTypeEnum findById(String code) {
+        for (ParamSettingTypeEnum account : ParamSettingTypeEnum.values()) {
+            if (Objects.equals(account.code, code)) {
+                return account;
+            }
+        }
+        return null;
+    }
+
+    public static List<JSONObject> list() {
+        List<JSONObject> list = new ArrayList<>();
+        for (ParamSettingTypeEnum account : ParamSettingTypeEnum.values()) {
+            JSONObject object = new JSONObject();
+            object.put("code", account.code);
+            object.put("name", account.name);
+            object.put("type", account.name());
+            list.add(object);
+        }
+        return list;
+    }
+
+}

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

@@ -0,0 +1,124 @@
+package cn.com.qmth.stmms.ms.core.domain.paramsetting;
+
+/**
+ * 粗分档参数
+ */
+public class CoarseLevelConfig {
+
+    /**
+     * 仲裁档位差
+     */
+    private Integer deviation;
+
+    /**
+     * 是否自动打回
+     */
+    private Integer autoCallback;
+
+    /**
+     * 是否过半定档
+     */
+    private Integer majority;
+
+    /**
+     * 取优原则
+     */
+    private Integer takeBest;
+
+    /**
+     * 阅卷员是否显示所有试卷
+     */
+    private Integer levelShowAllPaper;
+
+    /**
+     * 档位百分比分母
+     */
+    private Integer propDenominator;
+
+    /**
+     * 是否显示标准卷管理
+     */
+    private Integer showStandardPaperManage;
+
+    /**
+     * 是否显示清除当前阅卷数据
+     */
+    private Integer clearData;
+
+    /**
+     * 是否开启去高去低再加权评卷
+     */
+    private Integer removeHighAndLow;
+
+    public Integer getDeviation() {
+        return deviation;
+    }
+
+    public void setDeviation(Integer deviation) {
+        this.deviation = deviation;
+    }
+
+    public Integer getAutoCallback() {
+        return autoCallback;
+    }
+
+    public void setAutoCallback(Integer autoCallback) {
+        this.autoCallback = autoCallback;
+    }
+
+    public Integer getMajority() {
+        return majority;
+    }
+
+    public void setMajority(Integer majority) {
+        this.majority = majority;
+    }
+
+    public Integer getTakeBest() {
+        return takeBest;
+    }
+
+    public void setTakeBest(Integer takeBest) {
+        this.takeBest = takeBest;
+    }
+
+    public Integer getLevelShowAllPaper() {
+        return levelShowAllPaper;
+    }
+
+    public void setLevelShowAllPaper(Integer levelShowAllPaper) {
+        this.levelShowAllPaper = levelShowAllPaper;
+    }
+
+    public Integer getPropDenominator() {
+        return propDenominator;
+    }
+
+    public void setPropDenominator(Integer propDenominator) {
+        this.propDenominator = propDenominator;
+    }
+
+    public Integer getShowStandardPaperManage() {
+        return showStandardPaperManage;
+    }
+
+    public void setShowStandardPaperManage(Integer showStandardPaperManage) {
+        this.showStandardPaperManage = showStandardPaperManage;
+    }
+
+    public Integer getClearData() {
+        return clearData;
+    }
+
+    public void setClearData(Integer clearData) {
+        this.clearData = clearData;
+    }
+
+    public Integer getRemoveHighAndLow() {
+        return removeHighAndLow;
+    }
+
+    public void setRemoveHighAndLow(Integer removeHighAndLow) {
+        this.removeHighAndLow = removeHighAndLow;
+    }
+}

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

@@ -0,0 +1,59 @@
+package cn.com.qmth.stmms.ms.core.domain.paramsetting;
+
+/**
+ * 采集参数
+ */
+public class CollectConfig {
+
+    /**
+     * 是否整包扫描
+     */
+    private Integer packageScan;
+
+    /**
+     * 图片是否加密
+     */
+    private Integer imageEncrypt;
+
+    /**
+     * 图片命名规则
+     */
+    private Integer nameRule;
+
+    /**
+     * 试卷档位
+     */
+    private Integer paperStage;
+
+    public Integer getPackageScan() {
+        return packageScan;
+    }
+
+    public void setPackageScan(Integer packageScan) {
+        this.packageScan = packageScan;
+    }
+
+    public Integer getImageEncrypt() {
+        return imageEncrypt;
+    }
+
+    public void setImageEncrypt(Integer imageEncrypt) {
+        this.imageEncrypt = imageEncrypt;
+    }
+
+    public Integer getNameRule() {
+        return nameRule;
+    }
+
+    public void setNameRule(Integer nameRule) {
+        this.nameRule = nameRule;
+    }
+
+    public Integer getPaperStage() {
+        return paperStage;
+    }
+
+    public void setPaperStage(Integer paperStage) {
+        this.paperStage = paperStage;
+    }
+}

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

@@ -0,0 +1,137 @@
+package cn.com.qmth.stmms.ms.core.domain.paramsetting;
+
+/**
+ * 细分档参数
+ */
+public class LevelConfig {
+
+    /**
+     * 仲裁档位差
+     */
+    private Integer deviation;
+
+    /**
+     * 是否自动打回
+     */
+    private Integer autoCallback;
+
+    /**
+     * 是否过半定档
+     */
+    private Integer majority;
+
+    /**
+     * 取优原则
+     */
+    private Integer takeBest;
+
+    /**
+     * 阅卷员是否显示所有试卷
+     */
+    private Integer levelShowAllPaper;
+
+    /**
+     * 档位百分比分母
+     */
+    private Integer propDenominator;
+
+    /**
+     * 是否显示标准卷管理
+     */
+    private Integer showStandardPaperManage;
+
+    /**
+     * 是否显示清除当前阅卷数据
+     */
+    private Integer clearData;
+
+    /**
+     * 是否增加粗分档
+     */
+    private Integer coarseLevel;
+
+    /**
+     * 是否开启去高去低再加权评卷
+     */
+    private Integer removeHighAndLow;
+
+    public Integer getDeviation() {
+        return deviation;
+    }
+
+    public void setDeviation(Integer deviation) {
+        this.deviation = deviation;
+    }
+
+    public Integer getAutoCallback() {
+        return autoCallback;
+    }
+
+    public void setAutoCallback(Integer autoCallback) {
+        this.autoCallback = autoCallback;
+    }
+
+    public Integer getMajority() {
+        return majority;
+    }
+
+    public void setMajority(Integer majority) {
+        this.majority = majority;
+    }
+
+    public Integer getTakeBest() {
+        return takeBest;
+    }
+
+    public void setTakeBest(Integer takeBest) {
+        this.takeBest = takeBest;
+    }
+
+    public Integer getLevelShowAllPaper() {
+        return levelShowAllPaper;
+    }
+
+    public void setLevelShowAllPaper(Integer levelShowAllPaper) {
+        this.levelShowAllPaper = levelShowAllPaper;
+    }
+
+    public Integer getPropDenominator() {
+        return propDenominator;
+    }
+
+    public void setPropDenominator(Integer propDenominator) {
+        this.propDenominator = propDenominator;
+    }
+
+    public Integer getShowStandardPaperManage() {
+        return showStandardPaperManage;
+    }
+
+    public void setShowStandardPaperManage(Integer showStandardPaperManage) {
+        this.showStandardPaperManage = showStandardPaperManage;
+    }
+
+    public Integer getClearData() {
+        return clearData;
+    }
+
+    public void setClearData(Integer clearData) {
+        this.clearData = clearData;
+    }
+
+    public Integer getCoarseLevel() {
+        return coarseLevel;
+    }
+
+    public void setCoarseLevel(Integer coarseLevel) {
+        this.coarseLevel = coarseLevel;
+    }
+
+    public Integer getRemoveHighAndLow() {
+        return removeHighAndLow;
+    }
+
+    public void setRemoveHighAndLow(Integer removeHighAndLow) {
+        this.removeHighAndLow = removeHighAndLow;
+    }
+}

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

@@ -0,0 +1,59 @@
+package cn.com.qmth.stmms.ms.core.domain.paramsetting;
+
+/**
+ * 打分参数
+ */
+public class ScoreConfig {
+
+    /**
+     * 分数处理方式
+     */
+    private Integer roundUp;
+
+    /**
+     * 阅卷员是否显示改档及改档打分
+     */
+    private Integer changeStage;
+
+    /**
+     * 阅卷员是否显示所有试卷
+     */
+    private Integer scoreShowAllPaper;
+
+    /**
+     * 是否开启去高去低再加权评卷
+     */
+    private Integer removeHighAndLow;
+
+    public Integer getRoundUp() {
+        return roundUp;
+    }
+
+    public void setRoundUp(Integer roundUp) {
+        this.roundUp = roundUp;
+    }
+
+    public Integer getChangeStage() {
+        return changeStage;
+    }
+
+    public void setChangeStage(Integer changeStage) {
+        this.changeStage = changeStage;
+    }
+
+    public Integer getScoreShowAllPaper() {
+        return scoreShowAllPaper;
+    }
+
+    public void setScoreShowAllPaper(Integer scoreShowAllPaper) {
+        this.scoreShowAllPaper = scoreShowAllPaper;
+    }
+
+    public Integer getRemoveHighAndLow() {
+        return removeHighAndLow;
+    }
+
+    public void setRemoveHighAndLow(Integer removeHighAndLow) {
+        this.removeHighAndLow = removeHighAndLow;
+    }
+}

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

@@ -0,0 +1,411 @@
+package cn.com.qmth.stmms.ms.core.domain.task;
+
+import cn.com.qmth.stmms.ms.core.domain.Level;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 评卷任务
+ * Created by zhengmin on 2016/9/22.
+ */
+@Entity
+@Table(indexes = {
+        @Index(name = "idx_mark_task_paper_id", columnList = "paperId")})
+public class MarkTaskLevel implements Serializable {
+
+    private static final long serialVersionUID = -1095989485341316938L;
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @NotNull
+    private Long markerId;
+
+
+    @NotNull
+    private String markerName;
+
+    @Enumerated(value = EnumType.STRING)
+    private Subject subject;
+
+    @NotNull
+    private Long workId;
+
+    @NotNull
+    @ManyToOne
+    @JoinColumn(name = "paperId")
+    private Paper paper;
+
+    private Long questionId;
+
+    private String result;
+
+    private String level;
+
+    private String originLevel;
+
+    private Integer levelValue;
+
+    @NotNull
+    @Enumerated(value = EnumType.ORDINAL)
+    private MarkStage stage;
+
+    /**
+     * 是否被打回重评
+     */
+    private boolean isRejected;
+
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date createdOn;
+
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date updatedOn;
+
+
+    private Integer randomSeq;
+    /**
+     * 密号
+     */
+    private String secretNumber;
+
+    private Long randomSeqNew;
+
+    @Basic
+    @Column(name = "is_test")
+    private int test; //是否试评,1:数据已导入,2:试评中
+
+    @Basic
+    @Column(name = "is_active")
+    private boolean isActive;//是否激活(false:不是,true:是)
+
+    @Basic
+    @Column(name = "batch_no")
+    private Long batchNo;
+
+    private String serialNumber;
+
+    private Integer displayNumber;
+
+    //是否标准卷
+    private boolean isSample;
+
+    /**
+     * 计算偏差范围使用
+     */
+    @Transient
+    private String dateMineResult;
+
+    private String deviationDirection;
+
+    /**
+     * 是否标记
+     */
+    private boolean isMark;
+
+    public Long getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(Long batchNo) {
+        this.batchNo = batchNo;
+    }
+
+    public boolean isActive() {
+        return isActive;
+    }
+
+    public void setActive(boolean active) {
+        isActive = active;
+    }
+
+    public int getTest() {
+        return test;
+    }
+
+    public void setTest(int test) {
+        this.test = test;
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getRandomSeqNew() {
+        return randomSeqNew;
+    }
+
+    public void setRandomSeqNew(Long randomSeqNew) {
+        this.randomSeqNew = randomSeqNew;
+    }
+
+    public MarkTaskLevel(MarkUser marker, Paper paper, MarkStage stage, Long randomSeqNew) {
+        this.markerId = marker.getId();
+        this.markerName = marker.getName();
+        this.subject = marker.getSubject();
+        this.workId = marker.getWorkId();
+        this.paper = paper;
+        this.questionId = paper.getQuestionId();
+        this.stage = stage;
+        this.createdOn = new Date();
+        //随机号生成修改规则
+//        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
+        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.randomSeqNew = randomSeqNew;
+        this.isMark = false;
+    }
+
+    public MarkTaskLevel(MarkUser marker, Paper paper, MarkStage stage, Long randomSeqNew, int test) {
+        this.markerId = marker.getId();
+        this.markerName = marker.getName();
+        this.subject = marker.getSubject();
+        this.workId = marker.getWorkId();
+        this.paper = paper;
+        this.questionId = paper.getQuestionId();
+        this.stage = stage;
+        this.createdOn = new Date();
+        //随机号生成修改规则
+//        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
+        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.randomSeqNew = randomSeqNew;
+        this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
+        this.isSample = paper.isSample();
+        this.isMark = false;
+    }
+
+    public MarkTaskLevel(MarkUser marker, Paper paper, Level level, MarkStage stage, Long randomSeqNew, int test) {
+        this.markerId = marker.getId();
+        this.markerName = marker.getName();
+        this.subject = marker.getSubject();
+        this.workId = marker.getWorkId();
+        this.paper = paper;
+        this.questionId = paper.getQuestionId();
+        this.stage = stage;
+        this.createdOn = new Date();
+        //随机号生成修改规则
+//        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
+        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.randomSeqNew = randomSeqNew;
+        this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
+
+        this.result = paper.getLevel();
+        this.level = paper.getLevel();
+        this.isSample = paper.isSample();
+        this.levelValue = level.getLevelValue();
+        this.updatedOn = new Date();
+        this.isMark = false;
+    }
+
+    /**
+     * 成绩查询使用
+     *
+     * @param id           任务ID
+     * @param markerId     评卷员Id
+     * @param markerName   评卷员名称
+     * @param result       结果
+     * @param secretNumber 任务密号
+     */
+    public MarkTaskLevel(Long id, Long markerId, String markerName, String result, String secretNumber, MarkStage stage) {
+        this.id = id;
+        this.markerId = markerId;
+        this.markerName = markerName;
+        this.result = result;
+        this.secretNumber = secretNumber;
+        this.stage = stage;
+    }
+
+    public MarkTaskLevel() {
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
+    public Date getCreatedOn() {
+        return createdOn;
+    }
+
+    public void setCreatedOn(Date createdOn) {
+        this.createdOn = createdOn;
+    }
+
+    public Date getUpdatedOn() {
+        return updatedOn;
+    }
+
+    public void setUpdatedOn(Date updatedOn) {
+        this.updatedOn = updatedOn;
+    }
+
+    public boolean isRejected() {
+        return isRejected;
+    }
+
+    public void setRejected(boolean rejected) {
+        isRejected = rejected;
+    }
+
+    public Subject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public Integer getLevelValue() {
+        return levelValue;
+    }
+
+    public void setLevelValue(Integer levelValue) {
+        this.levelValue = levelValue;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public Long getMarkerId() {
+        return markerId;
+    }
+
+    public void setMarkerId(Long markerId) {
+        this.markerId = markerId;
+    }
+
+    public Paper getPaper() {
+        return paper;
+    }
+
+    public void setPaper(Paper paper) {
+        this.paper = paper;
+    }
+
+    public String getMarkerName() {
+        return markerName;
+    }
+
+    public void setMarkerName(String markerName) {
+        this.markerName = markerName;
+    }
+
+    public String getOriginLevel() {
+        return originLevel;
+    }
+
+    public void setOriginLevel(String originLevel) {
+        this.originLevel = originLevel;
+    }
+
+    public Integer getRandomSeq() {
+        return randomSeq;
+    }
+
+    public void setRandomSeq(Integer randomSeq) {
+        this.randomSeq = randomSeq;
+    }
+
+    public String getSecretNumber() {
+        return secretNumber;
+    }
+
+    public void setSecretNumber(String secretNumber) {
+        this.secretNumber = secretNumber;
+    }
+
+    public String getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(String serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+    public Integer getDisplayNumber() {
+        return displayNumber;
+    }
+
+    public void setDisplayNumber(Integer displayNumber) {
+        this.displayNumber = displayNumber;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public boolean isSample() {
+        return isSample;
+    }
+
+    public void setSample(boolean sample) {
+        isSample = sample;
+    }
+
+    public String getDateMineResult() {
+        return dateMineResult;
+    }
+
+    public void setDateMineResult(String dateMineResult) {
+        this.dateMineResult = dateMineResult;
+    }
+
+    public String getDeviationDirection() {
+        return deviationDirection;
+    }
+
+    public void setDeviationDirection(String deviationDirection) {
+        this.deviationDirection = deviationDirection;
+    }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
+}

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

@@ -0,0 +1,411 @@
+package cn.com.qmth.stmms.ms.core.domain.task;
+
+import cn.com.qmth.stmms.ms.core.domain.Level;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 评卷任务
+ * Created by zhengmin on 2016/9/22.
+ */
+@Entity
+@Table(indexes = {
+        @Index(name = "idx_mark_task_paper_id", columnList = "paperId")})
+public class MarkTaskScore implements Serializable {
+
+    private static final long serialVersionUID = -1095989485341316938L;
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @NotNull
+    private Long markerId;
+
+
+    @NotNull
+    private String markerName;
+
+    @Enumerated(value = EnumType.STRING)
+    private Subject subject;
+
+    @NotNull
+    private Long workId;
+
+    @NotNull
+    @ManyToOne
+    @JoinColumn(name = "paperId")
+    private Paper paper;
+
+    private Long questionId;
+
+    private String result;
+
+    private String level;
+
+    private String originLevel;
+
+    private Integer levelValue;
+
+    @NotNull
+    @Enumerated(value = EnumType.ORDINAL)
+    private MarkStage stage;
+
+    /**
+     * 是否被打回重评
+     */
+    private boolean isRejected;
+
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date createdOn;
+
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date updatedOn;
+
+
+    private Integer randomSeq;
+    /**
+     * 密号
+     */
+    private String secretNumber;
+
+    private Long randomSeqNew;
+
+    @Basic
+    @Column(name = "is_test")
+    private int test; //是否试评,1:数据已导入,2:试评中
+
+    @Basic
+    @Column(name = "is_active")
+    private boolean isActive;//是否激活(false:不是,true:是)
+
+    @Basic
+    @Column(name = "batch_no")
+    private Long batchNo;
+
+    private String serialNumber;
+
+    private Integer displayNumber;
+
+    //是否标准卷
+    private boolean isSample;
+
+    /**
+     * 计算偏差范围使用
+     */
+    @Transient
+    private String dateMineResult;
+
+    private String deviationDirection;
+
+    /**
+     * 是否标记
+     */
+    private boolean isMark;
+
+    public Long getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(Long batchNo) {
+        this.batchNo = batchNo;
+    }
+
+    public boolean isActive() {
+        return isActive;
+    }
+
+    public void setActive(boolean active) {
+        isActive = active;
+    }
+
+    public int getTest() {
+        return test;
+    }
+
+    public void setTest(int test) {
+        this.test = test;
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getRandomSeqNew() {
+        return randomSeqNew;
+    }
+
+    public void setRandomSeqNew(Long randomSeqNew) {
+        this.randomSeqNew = randomSeqNew;
+    }
+
+    public MarkTaskScore(MarkUser marker, Paper paper, MarkStage stage, Long randomSeqNew) {
+        this.markerId = marker.getId();
+        this.markerName = marker.getName();
+        this.subject = marker.getSubject();
+        this.workId = marker.getWorkId();
+        this.paper = paper;
+        this.questionId = paper.getQuestionId();
+        this.stage = stage;
+        this.createdOn = new Date();
+        //随机号生成修改规则
+//        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
+        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.randomSeqNew = randomSeqNew;
+        this.isMark = false;
+    }
+
+    public MarkTaskScore(MarkUser marker, Paper paper, MarkStage stage, Long randomSeqNew, int test) {
+        this.markerId = marker.getId();
+        this.markerName = marker.getName();
+        this.subject = marker.getSubject();
+        this.workId = marker.getWorkId();
+        this.paper = paper;
+        this.questionId = paper.getQuestionId();
+        this.stage = stage;
+        this.createdOn = new Date();
+        //随机号生成修改规则
+//        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
+        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.randomSeqNew = randomSeqNew;
+        this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
+        this.isSample = paper.isSample();
+        this.isMark = false;
+    }
+
+    public MarkTaskScore(MarkUser marker, Paper paper, Level level, MarkStage stage, Long randomSeqNew, int test) {
+        this.markerId = marker.getId();
+        this.markerName = marker.getName();
+        this.subject = marker.getSubject();
+        this.workId = marker.getWorkId();
+        this.paper = paper;
+        this.questionId = paper.getQuestionId();
+        this.stage = stage;
+        this.createdOn = new Date();
+        //随机号生成修改规则
+//        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
+        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.randomSeqNew = randomSeqNew;
+        this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
+
+        this.result = paper.getLevel();
+        this.level = paper.getLevel();
+        this.isSample = paper.isSample();
+        this.levelValue = level.getLevelValue();
+        this.updatedOn = new Date();
+        this.isMark = false;
+    }
+
+    /**
+     * 成绩查询使用
+     *
+     * @param id           任务ID
+     * @param markerId     评卷员Id
+     * @param markerName   评卷员名称
+     * @param result       结果
+     * @param secretNumber 任务密号
+     */
+    public MarkTaskScore(Long id, Long markerId, String markerName, String result, String secretNumber, MarkStage stage) {
+        this.id = id;
+        this.markerId = markerId;
+        this.markerName = markerName;
+        this.result = result;
+        this.secretNumber = secretNumber;
+        this.stage = stage;
+    }
+
+    public MarkTaskScore() {
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
+    public Date getCreatedOn() {
+        return createdOn;
+    }
+
+    public void setCreatedOn(Date createdOn) {
+        this.createdOn = createdOn;
+    }
+
+    public Date getUpdatedOn() {
+        return updatedOn;
+    }
+
+    public void setUpdatedOn(Date updatedOn) {
+        this.updatedOn = updatedOn;
+    }
+
+    public boolean isRejected() {
+        return isRejected;
+    }
+
+    public void setRejected(boolean rejected) {
+        isRejected = rejected;
+    }
+
+    public Subject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public Integer getLevelValue() {
+        return levelValue;
+    }
+
+    public void setLevelValue(Integer levelValue) {
+        this.levelValue = levelValue;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public Long getMarkerId() {
+        return markerId;
+    }
+
+    public void setMarkerId(Long markerId) {
+        this.markerId = markerId;
+    }
+
+    public Paper getPaper() {
+        return paper;
+    }
+
+    public void setPaper(Paper paper) {
+        this.paper = paper;
+    }
+
+    public String getMarkerName() {
+        return markerName;
+    }
+
+    public void setMarkerName(String markerName) {
+        this.markerName = markerName;
+    }
+
+    public String getOriginLevel() {
+        return originLevel;
+    }
+
+    public void setOriginLevel(String originLevel) {
+        this.originLevel = originLevel;
+    }
+
+    public Integer getRandomSeq() {
+        return randomSeq;
+    }
+
+    public void setRandomSeq(Integer randomSeq) {
+        this.randomSeq = randomSeq;
+    }
+
+    public String getSecretNumber() {
+        return secretNumber;
+    }
+
+    public void setSecretNumber(String secretNumber) {
+        this.secretNumber = secretNumber;
+    }
+
+    public String getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(String serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+    public Integer getDisplayNumber() {
+        return displayNumber;
+    }
+
+    public void setDisplayNumber(Integer displayNumber) {
+        this.displayNumber = displayNumber;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public boolean isSample() {
+        return isSample;
+    }
+
+    public void setSample(boolean sample) {
+        isSample = sample;
+    }
+
+    public String getDateMineResult() {
+        return dateMineResult;
+    }
+
+    public void setDateMineResult(String dateMineResult) {
+        this.dateMineResult = dateMineResult;
+    }
+
+    public String getDeviationDirection() {
+        return deviationDirection;
+    }
+
+    public void setDeviationDirection(String deviationDirection) {
+        this.deviationDirection = deviationDirection;
+    }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
+}

+ 27 - 4
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/MarkerGroup.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.core.domain.user;
 
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 
 import javax.persistence.*;
@@ -10,16 +11,18 @@ import java.util.Set;
 
 /**
  * 评卷员组
- * Created by zhengmin on 2016/9/22.
  */
 @Entity
-public class MarkerGroup implements Serializable{
+public class MarkerGroup implements Serializable {
 
     private static final long serialVersionUID = 966105324299193932L;
     @Id
     @GeneratedValue
     private Long id;
 
+    @NotNull
+    private Long workId;
+
     private String name;
 
     @OneToMany
@@ -31,7 +34,11 @@ public class MarkerGroup implements Serializable{
     private Subject subject;
 
     @NotNull
-    private Long workId;
+    @Enumerated(value = EnumType.STRING)
+    private MarkStage stage;
+
+    @Transient
+    private Boolean hasStudent;
 
     public Long getId() {
         return id;
@@ -57,7 +64,7 @@ public class MarkerGroup implements Serializable{
         this.markers = markers;
     }
 
-    public void addMarker(MarkUser marker){
+    public void addMarker(MarkUser marker) {
         this.markers.add(marker);
     }
 
@@ -69,6 +76,14 @@ public class MarkerGroup implements Serializable{
         this.subject = subject;
     }
 
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
     public Long getWorkId() {
         return workId;
     }
@@ -76,4 +91,12 @@ public class MarkerGroup implements Serializable{
     public void setWorkId(Long workId) {
         this.workId = workId;
     }
+
+    public Boolean getHasStudent() {
+        return hasStudent;
+    }
+
+    public void setHasStudent(Boolean hasStudent) {
+        this.hasStudent = hasStudent;
+    }
 }

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

@@ -0,0 +1,226 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskLevel;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+/**
+ * Created by zhengmin on 2016/9/23.
+ */
+public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, JpaSpecificationExecutor {
+
+    int countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(Long markerId, Long paperId, Long randomSeqNew, Long workId);
+
+    List<MarkTaskLevel> findByWorkIdAndStageAndPaperId(Long workId, MarkStage stage, Long paperId);
+
+    /**
+     * 查询指定阶段试卷的评卷任务
+     *
+     * @param paperId 试卷id
+     * @param stage   评卷阶段
+     */
+    List<MarkTaskLevel> findByPaperIdAndStage(Long paperId, MarkStage stage);
+
+    @Query(value = "select new MarkTaskLevel(m.id, m.markerId , m.markerName, m.result, m.secretNumber, m.stage) from MarkTask m where m.paper.id = ?1 and m.stage = ?2")
+    List<MarkTaskLevel> findByPaperIdAndStageNative(Long id, MarkStage level);
+
+    /**
+     * 评卷员任务数量
+     *
+     * @param markerId 评卷员ID
+     */
+    long countByMarkerId(Long markerId);
+
+    @Query(value = "select count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?3 and m.batch_no = ?2", nativeQuery = true)
+    long countByQuestionIdAndBatchNo(Long questionId, Long batchNo, Long markerId);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.score_batch_no = ?5 and p.level = ?4 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.level = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
+
+    /**
+     * 查询评卷员的评卷任务
+     *
+     * @param markerId 评卷员ID
+     * @param stage    阶段
+     */
+    @Query(value = "select mt from MarkTask mt left outer join fetch mt.paper where mt.markerId = ? and mt.stage = ?")
+    List<MarkTaskLevel> findByMarkerIdAndStage(Long markerId, MarkStage stage);
+
+    /**
+     * 删除评卷员所有任务
+     *
+     * @param subject 科目
+     * @param stage   阶段
+     */
+    Long deleteByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
+
+    /**
+     * 统计评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param markerId 评卷员ID
+     * @param stageId  阶段
+     * @param test     试评状态
+     */
+    @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
+            "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+    List<Object[]> countGroupByQuestion(Long markerId, Integer stageId, int test);
+
+    /**
+     * 统计各评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param workId  工作ID
+     * @param subject 科目
+     * @param stageId 阶段
+     * @param test    试评状态
+     * @param batchNo 批次号
+     * @param markers 评卷员ID集合
+     */
+    @Query(value = "SELECT q.`id`,t.`marker_id` markerId,mu.login_name loginName,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount, SUM(t.is_rejected) rejectedCount, q.area_code areaCode " +
+            "FROM mark_task t LEFT JOIN mark_user mu on t.marker_id = mu.id LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.work_id = :workId and t.subject = :subject and t.stage = :stageId and p.is_missing = false and p.is_test = :test and p.batch_no = :batchNo and t.marker_id in (:markers) GROUP BY t.marker_id,mu.login_name, t.`marker_name` ORDER BY q.`id`,t.marker_id", nativeQuery = true)
+    List<Object[]> listGroupByQuestionAndMarkerAndBatchNoAndMarkerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("test") int test, @Param("batchNo") Long batchNo, @Param("markers") List<Long> markers);
+
+    /**
+     * 考区已评数及总数(分档阶段)
+     *
+     * @param workId 工作ID
+     * @param name   科目
+     */
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`score` IS NULL,1,0)) leftCount,COUNT(p.question_id) totalCount " +
+            "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
+            "p.work_id = ? and p.subject = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name);
+
+    /**
+     * 考区已评数及总数(分档阶段)
+     *
+     * @param workId 工作ID
+     * @param name   科目
+     * @param test   试评状态
+     */
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`level` IS NULL or (p.level is not null and p.is_active = 0),1,0)) leftCount,COUNT(p.question_id) totalCount " +
+            "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
+            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name, int test);
+
+    /**
+     * 统计评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param markerId 评卷员ID
+     * @param stageId  阶段
+     */
+    @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
+            "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+    List<Object[]> countGroupByQuestion(Long markerId, Integer stageId);
+
+    /**
+     * 统计各评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param workId  工作ID
+     * @param subject 科目
+     * @param stageId 阶段
+     * @param batchNo 批次号
+     * @param markers 评卷员ID集合
+     */
+    @Query(value = "SELECT q.`id`,t.`marker_id` markerId,mu.login_name loginName,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount,SUM(t.is_rejected) rejectedCount, q.area_code areaCode " +
+            "FROM mark_task t LEFT JOIN mark_user mu on t.marker_id = mu.id LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.work_id = :workId and t.subject = :subject and t.stage = :stageId and p.score_batch_no = :batchNo and t.`marker_id` in (:markers) and p.is_missing = false GROUP BY t.marker_id,mu.login_name, t.`marker_name` ORDER BY q.`id`, t.`marker_id`", nativeQuery = true)
+    List<Object[]> listGroupByQuestionAndMarkerAndScoreBatchNoAndMakerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("batchNo") Long batchNo, @Param("markers") List<Long> markers);
+
+    /**
+     * 统计指定试卷的所有任务数量
+     *
+     * @param id 试卷ID
+     */
+    Long countByPaperId(Long id);
+
+    List<MarkTaskLevel> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
+
+    @Query(value = "SELECT max(t.randomSeq) FROM MarkTaskLevel t " +
+            "WHERE t.workId = ?1 and t.subject = ?2 and t.markerId = ?3 and t.stage = ?4 and t.questionId = ?5 ")
+    Integer findRandomSeqByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId);
+
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no = ?4 and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultNull(Long questionId, Long markerId, int stage, Long batchNo);
+
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 0 and p.score_batch_no = ?4 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(Long questionId, Long markerId, int stage, Long batchNo);
+
+    MarkTaskLevel findByPaperIdAndMarkerId(Long paperId, Long markId);
+
+    List<MarkTaskLevel> findByWorkId(Long workId);
+
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.is_shift = 1 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countShiftByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long id, int ordinal, boolean b);
+
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 1 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(Long questionId, Long id, int ordinal);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2", nativeQuery = true)
+    long countByQuestionIdAll(Long questionId, Long markId);
+
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no is not null and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(Long questionId, Long markerId, int stage);
+
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and  m.batch_no is not null and m.is_rejected = true", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(Long questionId, Long markerId, int ordinal);
+
+    @Query(value = "select * from mark_task where work_id = ?1 and subject = ?2 and marker_id = ?3 and stage = ?4 limit 1", nativeQuery = true)
+    List<MarkTaskLevel> findByWorkIdAndSubjectAndMarkerIdAndStageLimit(Long workId, String subject, Long valueOf, int stage);
+
+    int countByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
+
+    int countByWorkIdAndStageAndResultNotNull(Long id, MarkStage level);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.work_id = ?1 and m.subject = ?2 and m.marker_id = ?3 and m.stage = ?4 and m.result is null and p.is_shift = true", nativeQuery = true)
+    int countByWorkIdAndSubjectAndMarkerIdAndStageAndShiftAndResult(Long workId, String subject, Long valueOf, int stage);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.work_id = ?1 and m.subject = ?2 and m.marker_id = ?3 and m.stage = ?4 and m.result is null and p.is_shift_score = 1", nativeQuery = true)
+    int countByWorkIdAndSubjectAndMarkerIdAndStageAndShiftScoreAndResult(Long workId, String subject, Long valueOf, int stage);
+
+    @Query(value = "select count(1) from mark_task m where m.work_id = ?1 and m.subject = ?2 and m.marker_id = ?3 and m.stage = ?4 and m.is_rejected = 1", nativeQuery = true)
+    int findByWorkIdAndSubjectAndMarkerIdAndStageReject(Long workId, String subject, Long valueOf, int stage);
+
+    @Query(value = "select count(1) from mark_task m where m.work_id = ?1", nativeQuery = true)
+    int countByWorkId(Long workId);
+
+    @Query(value = "select id, random_seq_new randomSeqNew from mark_task m where m.work_id = ?1", nativeQuery = true)
+    List<Object[]> findAllByWorkId(Long workId);
+
+    @Modifying
+    @Query(value = "update mark_task m set m.level = ?1 where m.paper_id = ?2", nativeQuery = true)
+    void updateLevelByPaperId(String level, Long id);
+
+    @Query("select s.paper from MarkTaskLevel s where s.workId = :workId and s.subject = :subject and s.stage = :stage and s.markerId in (:markers)")
+    List<Paper> findByWorkIdAndSubjectAndStageAndMarkerIdIn(@Param("workId") Long workId, @Param("subject") Subject subject, @Param("stage") MarkStage stage, @Param("markers") List<Long> markers);
+
+    @Query(value = "select s.paper_id, s.marker_id from mark_task s where s.work_id = :workId and s.subject = :subject and s.stage = :stage", nativeQuery = true)
+    List<Object[]> findByWorkIdAndSubjectAndStage(@Param("workId") Long workId, @Param("subject") String subject, @Param("stage") int stage);
+
+    List<MarkTaskLevel> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
+
+    @Modifying
+    @Query("update MarkTaskLevel m set m.isMark = ?2 where m.id = ?1")
+    void updateMarkTaskMarkById(Long markTaskId, Boolean isMark);
+
+    void deleteByWorkIdAndSubject(Long workId, Subject subject);
+}

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

@@ -0,0 +1,226 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskScore;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+/**
+ * Created by zhengmin on 2016/9/23.
+ */
+public interface MarkTaskScoreRepo extends JpaRepository<MarkTaskScore, Long>, JpaSpecificationExecutor {
+
+    int countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(Long markerId, Long paperId, Long randomSeqNew, Long workId);
+
+    List<MarkTaskScore> findByWorkIdAndStageAndPaperId(Long workId, MarkStage stage, Long paperId);
+
+    /**
+     * 查询指定阶段试卷的评卷任务
+     *
+     * @param paperId 试卷id
+     * @param stage   评卷阶段
+     */
+    List<MarkTaskScore> findByPaperIdAndStage(Long paperId, MarkStage stage);
+
+    @Query(value = "select new MarkTaskScore(m.id, m.markerId , m.markerName, m.result, m.secretNumber, m.stage) from MarkTask m where m.paper.id = ?1 and m.stage = ?2")
+    List<MarkTaskScore> findByPaperIdAndStageNative(Long id, MarkStage level);
+
+    /**
+     * 评卷员任务数量
+     *
+     * @param markerId 评卷员ID
+     */
+    long countByMarkerId(Long markerId);
+
+    @Query(value = "select count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?3 and m.batch_no = ?2", nativeQuery = true)
+    long countByQuestionIdAndBatchNo(Long questionId, Long batchNo, Long markerId);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.score_batch_no = ?5 and p.level = ?4 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.level = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
+
+    /**
+     * 查询评卷员的评卷任务
+     *
+     * @param markerId 评卷员ID
+     * @param stage    阶段
+     */
+    @Query(value = "select mt from MarkTask mt left outer join fetch mt.paper where mt.markerId = ? and mt.stage = ?")
+    List<MarkTaskScore> findByMarkerIdAndStage(Long markerId, MarkStage stage);
+
+    /**
+     * 删除评卷员所有任务
+     *
+     * @param subject 科目
+     * @param stage   阶段
+     */
+    Long deleteByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
+
+    /**
+     * 统计评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param markerId 评卷员ID
+     * @param stageId  阶段
+     * @param test     试评状态
+     */
+    @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
+            "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+    List<Object[]> countGroupByQuestion(Long markerId, Integer stageId, int test);
+
+    /**
+     * 统计各评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param workId  工作ID
+     * @param subject 科目
+     * @param stageId 阶段
+     * @param test    试评状态
+     * @param batchNo 批次号
+     * @param markers 评卷员ID集合
+     */
+    @Query(value = "SELECT q.`id`,t.`marker_id` markerId,mu.login_name loginName,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount, SUM(t.is_rejected) rejectedCount, q.area_code areaCode " +
+            "FROM mark_task t LEFT JOIN mark_user mu on t.marker_id = mu.id LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.work_id = :workId and t.subject = :subject and t.stage = :stageId and p.is_missing = false and p.is_test = :test and p.batch_no = :batchNo and t.marker_id in (:markers) GROUP BY t.marker_id,mu.login_name, t.`marker_name` ORDER BY q.`id`,t.marker_id", nativeQuery = true)
+    List<Object[]> listGroupByQuestionAndMarkerAndBatchNoAndMarkerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("test") int test, @Param("batchNo") Long batchNo, @Param("markers") List<Long> markers);
+
+    /**
+     * 考区已评数及总数(分档阶段)
+     *
+     * @param workId 工作ID
+     * @param name   科目
+     */
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`score` IS NULL,1,0)) leftCount,COUNT(p.question_id) totalCount " +
+            "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
+            "p.work_id = ? and p.subject = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name);
+
+    /**
+     * 考区已评数及总数(分档阶段)
+     *
+     * @param workId 工作ID
+     * @param name   科目
+     * @param test   试评状态
+     */
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`level` IS NULL or (p.level is not null and p.is_active = 0),1,0)) leftCount,COUNT(p.question_id) totalCount " +
+            "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
+            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name, int test);
+
+    /**
+     * 统计评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param markerId 评卷员ID
+     * @param stageId  阶段
+     */
+    @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
+            "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.`marker_id` = ? and t.stage = ? and p.is_missing = false GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+    List<Object[]> countGroupByQuestion(Long markerId, Integer stageId);
+
+    /**
+     * 统计各评卷员各试题已评数及总数(分档阶段)
+     *
+     * @param workId  工作ID
+     * @param subject 科目
+     * @param stageId 阶段
+     * @param batchNo 批次号
+     * @param markers 评卷员ID集合
+     */
+    @Query(value = "SELECT q.`id`,t.`marker_id` markerId,mu.login_name loginName,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount,SUM(t.is_rejected) rejectedCount, q.area_code areaCode " +
+            "FROM mark_task t LEFT JOIN mark_user mu on t.marker_id = mu.id LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
+            "t.work_id = :workId and t.subject = :subject and t.stage = :stageId and p.score_batch_no = :batchNo and t.`marker_id` in (:markers) and p.is_missing = false GROUP BY t.marker_id,mu.login_name, t.`marker_name` ORDER BY q.`id`, t.`marker_id`", nativeQuery = true)
+    List<Object[]> listGroupByQuestionAndMarkerAndScoreBatchNoAndMakerId(@Param("workId") Long workId, @Param("subject") String subject, @Param("stageId") Integer stageId, @Param("batchNo") Long batchNo, @Param("markers") List<Long> markers);
+
+    /**
+     * 统计指定试卷的所有任务数量
+     *
+     * @param id 试卷ID
+     */
+    Long countByPaperId(Long id);
+
+    List<MarkTaskScore> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
+
+    @Query(value = "SELECT max(t.randomSeq) FROM MarkTaskScore t " +
+            "WHERE t.workId = ?1 and t.subject = ?2 and t.markerId = ?3 and t.stage = ?4 and t.questionId = ?5 ")
+    Integer findRandomSeqByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId);
+
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no = ?4 and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultNull(Long questionId, Long markerId, int stage, Long batchNo);
+
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 0 and p.score_batch_no = ?4 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(Long questionId, Long markerId, int stage, Long batchNo);
+
+    MarkTaskScore findByPaperIdAndMarkerId(Long paperId, Long markId);
+
+    List<MarkTaskScore> findByWorkId(Long workId);
+
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.is_shift = 1 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countShiftByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long id, int ordinal, boolean b);
+
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 1 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countShiftScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(Long questionId, Long id, int ordinal);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2", nativeQuery = true)
+    long countByQuestionIdAll(Long questionId, Long markId);
+
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no is not null and m.is_rejected = false", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(Long questionId, Long markerId, int stage);
+
+    @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and  m.batch_no is not null and m.is_rejected = true", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(Long questionId, Long markerId, int ordinal);
+
+    @Query(value = "select * from mark_task where work_id = ?1 and subject = ?2 and marker_id = ?3 and stage = ?4 limit 1", nativeQuery = true)
+    List<MarkTaskScore> findByWorkIdAndSubjectAndMarkerIdAndStageLimit(Long workId, String subject, Long valueOf, int stage);
+
+    int countByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
+
+    int countByWorkIdAndStageAndResultNotNull(Long id, MarkStage level);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.work_id = ?1 and m.subject = ?2 and m.marker_id = ?3 and m.stage = ?4 and m.result is null and p.is_shift = true", nativeQuery = true)
+    int countByWorkIdAndSubjectAndMarkerIdAndStageAndShiftAndResult(Long workId, String subject, Long valueOf, int stage);
+
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.work_id = ?1 and m.subject = ?2 and m.marker_id = ?3 and m.stage = ?4 and m.result is null and p.is_shift_score = 1", nativeQuery = true)
+    int countByWorkIdAndSubjectAndMarkerIdAndStageAndShiftScoreAndResult(Long workId, String subject, Long valueOf, int stage);
+
+    @Query(value = "select count(1) from mark_task m where m.work_id = ?1 and m.subject = ?2 and m.marker_id = ?3 and m.stage = ?4 and m.is_rejected = 1", nativeQuery = true)
+    int findByWorkIdAndSubjectAndMarkerIdAndStageReject(Long workId, String subject, Long valueOf, int stage);
+
+    @Query(value = "select count(1) from mark_task m where m.work_id = ?1", nativeQuery = true)
+    int countByWorkId(Long workId);
+
+    @Query(value = "select id, random_seq_new randomSeqNew from mark_task m where m.work_id = ?1", nativeQuery = true)
+    List<Object[]> findAllByWorkId(Long workId);
+
+    @Modifying
+    @Query(value = "update mark_task m set m.level = ?1 where m.paper_id = ?2", nativeQuery = true)
+    void updateLevelByPaperId(String level, Long id);
+
+    @Query("select s.paper from MarkTaskScore s where s.workId = :workId and s.subject = :subject and s.stage = :stage and s.markerId in (:markers)")
+    List<Paper> findByWorkIdAndSubjectAndStageAndMarkerIdIn(@Param("workId") Long workId, @Param("subject") Subject subject, @Param("stage") MarkStage stage, @Param("markers") List<Long> markers);
+
+    @Query(value = "select s.paper_id, s.marker_id from mark_task s where s.work_id = :workId and s.subject = :subject and s.stage = :stage", nativeQuery = true)
+    List<Object[]> findByWorkIdAndSubjectAndStage(@Param("workId") Long workId, @Param("subject") String subject, @Param("stage") int stage);
+
+    List<MarkTaskScore> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
+
+    @Modifying
+    @Query("update MarkTaskScore m set m.isMark = ?2 where m.id = ?1")
+    void updateMarkTaskMarkById(Long markTaskId, Boolean isMark);
+
+    void deleteByWorkIdAndSubject(Long workId, Subject subject);
+}

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

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -11,7 +12,7 @@ import java.util.List;
  */
 public interface MarkerGroupRepo extends JpaRepository<MarkerGroup, Long> {
 
-    List<MarkerGroup> findByWorkIdAndSubject(Long workId, Subject subject);
+    List<MarkerGroup> findByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
 
     void deleteBySubjectAndWorkId(Subject subject, Long workId);
 }

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

@@ -0,0 +1,20 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.MarkerGroupStudent;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * 分组考生
+ */
+public interface MarkerGroupStudentRepo extends JpaRepository<MarkerGroupStudent, Long> {
+
+    void deleteByGroupIdAndUsed(Long groupId, boolean b);
+
+    List<MarkerGroupStudent> findByWorkIdAndSubjectAndStageAndUsed(Long workId, Subject subject, MarkStage stage, boolean used);
+
+    long countByGroupIdAndUsed(Long groupId, boolean used);
+}

+ 8 - 9
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java

@@ -3,7 +3,6 @@ package cn.com.qmth.stmms.ms.log.aop;
 import cn.com.qmth.stmms.ms.commons.config.LevelConfig;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateCallback;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateResult;
-import cn.com.qmth.stmms.ms.commons.utils.AesUtil;
 import cn.com.qmth.stmms.ms.commons.utils.EncrypAES;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
@@ -217,13 +216,13 @@ public class MarkLogAop {
         if (markStage.ordinal() == 1 && paper.isMarkByLeader()) {//分档,如果已经有科组长定档,则不允许评卷员再分档
             return;
         } else if (markStage.ordinal() == 1 && oldRejected && !isRejected) {//档位打回回评
-            if(oldShift){
+            if (oldShift) {
                 operType = MarkLogOperType.CHANGE_LEVEL.getId();
             } else {
                 operType = MarkLogOperType.CALLBACK_ONCE_LEVEL.getId();
             }
         } else if (markStage.ordinal() == 2) {//打分
-            if(oldShiftScore){
+            if (oldShiftScore) {
                 operType = MarkLogOperType.CHANGE_SCORE.getId();
             } else {
                 operType = MarkLogOperType.SCORE.getId();
@@ -236,7 +235,7 @@ public class MarkLogAop {
             MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(markUser.getId(), MarkLogOperType.CALLBACK_ONCE_LEVEL.getId(), markUser.getSubject().toString(), paper.getExamNumber());
             if (Objects.isNull(markLogPrev)) {//如果为null,则再查分档和回评档位
                 if (oldRejected && !isRejected) {//档位打回
-                    if(oldShift){
+                    if (oldShift) {
                         operType = MarkLogOperType.CHANGE_LEVEL.getId();
                     } else {
                         operType = MarkLogOperType.CALLBACK_ONCE_LEVEL.getId();
@@ -276,16 +275,16 @@ public class MarkLogAop {
         markLogRepo.save(markLog);
         //20191107wangliang加入仲裁自动打回算法 start
         if (markStage.ordinal() == 1 && paper.isArbitrated()) {
-            if (ParamCache.paramMap.get(work.getId()).getAutoCallback() == 1) {//为true则自动打回
+            if (ParamCache.levelConfigMap.get(String.valueOf(work.getId())).getAutoCallback() == 1) {//为true则自动打回
                 List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markStage);
                 JSONObject js = new JSONObject();
                 js.put("paperId", paper.getId());
                 js.put("type", "autoCallback");
-                Integer deviation = Optional.ofNullable(ParamCache.paramMap.get(work.getId()).getDeviation()).orElse(3);
-                js.put("deviation", deviation.intValue());
+                Integer deviation = Optional.ofNullable(ParamCache.levelConfigMap.get(String.valueOf(work.getId())).getDeviation()).orElse(3);
+                js.put("deviation", deviation);
                 MarkTaskJob markTaskJob = new MarkTaskJob(js.toJSONString(), false, paper.getWorkId());
                 markTaskJobRepo.save(markTaskJob);
-                autoCallback(markTasks, deviation.intValue(), paper, markTaskJob, work.getName(), daterMineResult);
+                autoCallback(markTasks, deviation, paper, markTaskJob, work.getName(), daterMineResult);
             }
         }
         //20191107wangliang加入仲裁自动打回算法 end
@@ -424,7 +423,7 @@ public class MarkLogAop {
             // markLeaderId是批量打回小工具中的参数
             userId = StringUtils.isBlank(userId) || (StringUtils.isNotBlank(userId) && "0".equals(userId)) ? request.getHeader("markLeaderId") : userId;
             markUser = markUserRepo.findOne(Long.valueOf(userId));
-            if(Objects.isNull(markUser)) {
+            if (Objects.isNull(markUser)) {
                 String[] strs = token.split("#");
                 markUser = strs == null || strs[2] == null || strs[2] == "null" ? null : markUserRepo.findOne(Long.parseLong(strs[2]));
             }

+ 4 - 9
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/StartRunning.java

@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 /**
@@ -22,10 +23,10 @@ import java.util.List;
 public class StartRunning implements CommandLineRunner {
     private static Logger LOGGER = LoggerFactory.getLogger(StartRunning.class);
 
-    @Autowired
+    @Resource
     WorkRepo workRepo;
 
-    @Autowired
+    @Resource
     RandomUtil randomUtil;
 
 
@@ -33,14 +34,8 @@ public class StartRunning implements CommandLineRunner {
     @Override
     public void run(String... args) {
         LOGGER.info("服务器启动时执行 start");
-        /*Work work = workRepo.findByActiveTrue();
-        if (Objects.isNull(work)) {
-            LOGGER.info("没有创建工作区");
-        } else {
-            randomUtil.getRandom(work.getId(), false);
-        }*/
         //对所有当前工作都生成随机数
-        List<Work> works = workRepo.findAllByActiveTrue();
+        List<Work> works = workRepo.findAll();
         for (Work work : works) {
             randomUtil.getRandom(work.getId(), false);
         }

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

@@ -3,7 +3,11 @@ 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.*;
+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;
@@ -12,6 +16,7 @@ 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;
@@ -109,24 +114,24 @@ public class ScheduledTask implements InitializingBean {
     public void repairMarkTaskJob(Work work) {
         try {
             List<MarkTaskJob> markTaskJobList = markTaskJobRepo.findAllByStatusIsFalseAndWorkId(work.getId());
-            if (Objects.nonNull(markTaskJobList) && markTaskJobList.size() > 0) {
+            if (Objects.nonNull(markTaskJobList) && !markTaskJobList.isEmpty()) {
                 long startTime = System.currentTimeMillis();
                 this.markTaskJob = true;
                 for (MarkTaskJob m : markTaskJobList) {
                     long createTime = m.getCreateTime().getTime();
                     if ((startTime - createTime) / 1000 > 60) {
-                        JSONObject jsonObject = JSONObject.parseObject(m.getDataObject());
+                        JSONObject jsonObject = JSON.parseObject(m.getDataObject());
                         String type = String.valueOf(jsonObject.get("type"));
                         Long paperId = Long.parseLong(String.valueOf(jsonObject.get("paperId")));
                         Paper paper = paperRepo.findOne(paperId);
                         List<MarkTask> markTaskList = markTaskRepo.findByWorkIdAndStageAndPaperId(work.getId(), MarkStage.LEVEL, paperId);
-                        if (Objects.nonNull(markTaskList) && markTaskList.size() > 0) {
+                        if (Objects.nonNull(markTaskList) && !markTaskList.isEmpty()) {
                             if (Objects.equals("levelsLog", type)) {
                                 markingService.levelsLog(markTaskList, paper, m);//档位差日志记录
                             } else if (Objects.equals("autoCallback", type)) {
-                                ParamSetting paramSetting = ParamCache.paramMap.get(work.getId());
-                                Integer deviationParam = paramSetting == null ? 3 : paramSetting.getDeviation();
-                                Integer deviation = jsonObject.get("deviation") == null ? deviationParam.intValue() : Integer.parseInt(String.valueOf(jsonObject.get("deviation")));
+                                LevelConfig levelConfig = ParamCache.levelConfigMap.get(String.valueOf(work.getId()));
+                                Integer deviationParam = levelConfig == null ? 3 : levelConfig.getDeviation();
+                                Integer deviation = jsonObject.get("deviation") == null ? deviationParam : Integer.parseInt(String.valueOf(jsonObject.get("deviation")));
                                 markLogAop.autoCallback(markTaskList, deviation, paper, m, work.getName(), null);//自动打回记录
                             }
                         }

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

@@ -96,7 +96,7 @@ score.level.taskSort=paper
 #score.level.taskSort=paper
 
 #\u524D\u7AEF\u9759\u6001\u8D44\u6E90\u76EE\u5F55
-web.upload-path=D:\\company\\qmth\\bat-pro\\msyj\\local\\msyj-local-v3.0.0-nginx\\dist\\
+web.upload-path=D:\\company\\qmth\\bat-pro\\msyj\\local\\msyj-local-v3.1.0-nginx\\dist\\
 spring.mvc.static-path-pattern=/**
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${sys.config.localhostPath},file:${web.upload-path}
 

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

@@ -167,23 +167,23 @@ public class BatchCreateDataTest {
         }
 
         //新增工作的同时,初始化该工作的全局参数
-        ParamSetting paramSetting = ParamSetting.init();
+        ParamSetting paramSetting = ParamSetting.init(WORK_ID);
         paramSetting.setWorkId(WORK_ID);
         paramSettingRepo.save(paramSetting);
 
         //默认增加档位
-        Level A = new Level(WORK_ID, "A",0, 100, 90, Level.LevelType.ADMITED, 95);
-        Level B = new Level(WORK_ID, "B",1, 89, 85, Level.LevelType.ADMITED, 87);
-        Level C = new Level(WORK_ID, "C",2, 84, 80, Level.LevelType.ADMITED, 82);
-        Level D = new Level(WORK_ID, "D",3, 79, 75, Level.LevelType.ADMITED, 77);
-        Level E = new Level(WORK_ID, "E",4, 74, 70, Level.LevelType.ADMITED, 72);
-        Level F = new Level(WORK_ID, "F",5, 69, 65, Level.LevelType.ADMITED, 67);
-        Level G = new Level(WORK_ID, "G",6, 64, 60, Level.LevelType.ADMITED, 62);
-        Level H = new Level(WORK_ID, "H",7, 59, 55, Level.LevelType.ADMITED, 57);
-        Level I = new Level(WORK_ID, "I",8, 54, 50, Level.LevelType.ADMITED, 52);
-        Level J = new Level(WORK_ID, "J",9, 49, 45, Level.LevelType.ADMITED, 47);
-        Level K = new Level(WORK_ID, "K",10, 44, 0, Level.LevelType.ADMITED, 40);
-        List<Level> levels = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K);
+        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);
+        List<Level> levels = Arrays.asList(aLevel, bLevel, cLevel, dLevel, eLevel, fLevel, gLevel, hLevel, iLevel, jLevel, kLevel);
         levelRepo.save(levels);
     }
 

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

@@ -9,7 +9,6 @@ import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Student;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
@@ -19,7 +18,10 @@ import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.LevelStatAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkerAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.QuestionStatAssembler;
-import cn.com.qmth.stmms.ms.marking.dto.*;
+import cn.com.qmth.stmms.ms.marking.dto.LevelStatDTO;
+import cn.com.qmth.stmms.ms.marking.dto.LevleProgressDTO;
+import cn.com.qmth.stmms.ms.marking.dto.MarkerDTO;
+import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
 import cn.com.qmth.stmms.ms.marking.service.GroupingService;
 import cn.com.qmth.stmms.ms.marking.service.MarkerGroupLeaderService;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
@@ -161,8 +163,8 @@ public class MakrerApi {
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
 
-        Integer levelShowAllPaper = ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper();
-        Integer propDenominator = ParamCache.paramMap.get(marker.getWorkId()).getPropDenominator();
+        Integer levelShowAllPaper = ParamCache.levelConfigMap.get(String.valueOf(marker.getWorkId())).getLevelShowAllPaper();
+        Integer propDenominator = ParamCache.levelConfigMap.get(String.valueOf(marker.getWorkId())).getPropDenominator();
         Long batchNo = null;
         if (levelShowAllPaper == 0) {
             batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
@@ -285,8 +287,8 @@ public class MakrerApi {
         MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
-        Integer levelShowAllPaper = ParamCache.paramMap.get(marker.getWorkId()).getLevelShowAllPaper();
-        Integer propDenominator = ParamCache.paramMap.get(marker.getWorkId()).getPropDenominator();
+        Integer levelShowAllPaper = ParamCache.levelConfigMap.get(String.valueOf(marker.getWorkId())).getLevelShowAllPaper();
+        Integer propDenominator = ParamCache.levelConfigMap.get(String.valueOf(marker.getWorkId())).getPropDenominator();
         Long batchNo = null;
         if (levelShowAllPaper == 0) {
             batchNo = paperRepo.findMaxBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
@@ -469,7 +471,7 @@ public class MakrerApi {
                 o.setGpercent(gbd.doubleValue());
 
                 int count;
-                if (ParamCache.paramMap.get(marker.getWorkId()).getScoreShowAllPaper() == 1) {
+                if (ParamCache.scoreConfigMap.get(String.valueOf(marker.getWorkId())).getScoreShowAllPaper() == 1) {
                     count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString());
                 } else {
                     count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString(), batchNo);
@@ -553,7 +555,7 @@ public class MakrerApi {
                 o.setFinalTotal(Math.toIntExact(finalTotal));
 
                 int count;
-                if (ParamCache.paramMap.get(marker.getWorkId()).getScoreShowAllPaper() == 1) {
+                if (ParamCache.scoreConfigMap.get(String.valueOf(marker.getWorkId())).getScoreShowAllPaper() == 1) {
                     count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString());
                 } else {
                     count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString(), batchNo);
@@ -666,7 +668,7 @@ public class MakrerApi {
         List<Long> userMarkLeaders = new ArrayList<>();
         groupingService.getGroupMarkersProgress(workId, markSubject, userMarkLeaders, markerId, isTotalMarkLeader, objectMap);
 
-        if(isTotalMarkLeader) {
+        if (isTotalMarkLeader) {
             //科组长
             groupingService.getMakerLeaderProgress(workId, subject, userMarkLeaders, objectMap);
         }

+ 23 - 4
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java

@@ -9,17 +9,16 @@ import cn.com.qmth.stmms.ms.marking.assembler.QuestionStatAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.LevelStatDTO;
 import cn.com.qmth.stmms.ms.marking.dto.LevleProgressDTO;
 import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
-import cn.com.qmth.stmms.ms.marking.service.GroupingService;
 import cn.com.qmth.stmms.ms.marking.service.MarkerGroupLeaderService;
 import cn.com.qmth.stmms.ms.marking.service.StageControlService;
 import com.alibaba.fastjson.JSONObject;
-import org.hibernate.annotations.NaturalId;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -64,6 +63,9 @@ public class MarkSubjectApi {
     @Autowired
     MarkTaskRepo markTaskRepo;
 
+    @Resource
+    MarkerGroupStudentRepo markerGroupStudentRepo;
+
     @Autowired
     MarkerGroupLeaderService markerGroupLeaderService;
 
@@ -393,7 +395,12 @@ public class MarkSubjectApi {
      */
     @RequestMapping(value = "{markSubject}/markergroups", method = RequestMethod.GET)
     public List<MarkerGroup> getMarkerGroups(@PathVariable MarkSubject markSubject) {
-        return markerGroupRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage());
+        markerGroups.forEach(m -> {
+            long count = markerGroupStudentRepo.countByGroupIdAndUsed(m.getId(), false);
+            m.setHasStudent(count > 0);
+        });
+        return markerGroups;
     }
 
     /**
@@ -404,7 +411,7 @@ public class MarkSubjectApi {
      */
     @RequestMapping(value = "{markSubject}/markergroups", method = RequestMethod.POST)
     public MarkerGroup createMarkerGroup(@PathVariable MarkSubject markSubject, @RequestBody MarkerGroup markerGroup) {
-        if (markerGroup.getMarkers().size() == 0) {
+        if (markerGroup.getMarkers().isEmpty()) {
             throw new RuntimeException("不可创建空分组");
         }
         if (MarkStage.LEVEL == markSubject.getStage() || MarkStage.SCORE == markSubject.getStage()) {
@@ -416,9 +423,21 @@ public class MarkSubjectApi {
 
         markerGroup.setWorkId(markSubject.getWorkId());
         markerGroup.setSubject(markSubject.getSubject());
+        markerGroup.setStage(markSubject.getStage());
         return markerGroupLeaderService.save(markerGroup, markSubject.getStage().equals(MarkStage.INIT) ? MarkStage.LEVEL : markSubject.getStage());
     }
 
+    /**
+     * 删除评卷组考生名单
+     *
+     * @param markSubject 评卷科目ID
+     * @param groupId     评卷组ID
+     */
+    @PostMapping("/marker_groups_student/{markSubject}/{groupId}")
+    public void deleteMarkerGroupStudent(@PathVariable MarkSubject markSubject, @PathVariable Long groupId) {
+        markerGroupStudentRepo.deleteByGroupIdAndUsed(groupId, false);
+    }
+
     /**
      * 修改评卷组名
      *

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

@@ -119,21 +119,21 @@ public class MarkTaskApi {
         Long scoreBatchNo = null;
         if (stage == MarkStage.LEVEL) {
             List<Object> batchNos = paperRepo.findBatchNoByWorkIdAndSubject(workId, markUser.getSubject().name());
-            if (batchNos != null && batchNos.size() > 0) {
+            if (batchNos != null && !batchNos.isEmpty()) {
                 Object object = batchNos.get(0);
                 batchNo = Long.valueOf(object.toString());
             }
         } else if (stage == MarkStage.SCORE) {
             List<Object> batchNos = paperRepo.findScoreBatchNoByWorkIdAndSubject(workId, markUser.getSubject().name());
-            if (batchNos != null && batchNos.size() > 0) {
+            if (batchNos != null && !batchNos.isEmpty()) {
                 Object object = batchNos.get(0);
                 scoreBatchNo = Long.valueOf(object.toString());
             }
         }
         Long finalBatchNo = batchNo;
         Long finalScoreBatchNo = scoreBatchNo;
-        Integer levelShowAllPaper = ParamCache.paramMap.get(workId).getLevelShowAllPaper();
-        Integer scoreShowAllPaper = ParamCache.paramMap.get(workId).getScoreShowAllPaper();
+        Integer levelShowAllPaper = ParamCache.levelConfigMap.get(String.valueOf(workId)).getLevelShowAllPaper();
+        Integer scoreShowAllPaper = ParamCache.scoreConfigMap.get(String.valueOf(workId)).getScoreShowAllPaper();
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             List<Predicate> onPredicates = new ArrayList<>();
@@ -194,7 +194,7 @@ public class MarkTaskApi {
                 MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + examQuestion.getSubject());
                 if (markSubject.getTest() == TrialEnum.DEFAULT.getId()) {
                     List<Paper> paperList = paperRepo.findSample(level, isSample, false, examQuestion.getSubject().name(), TrialEnum.DEFAULT.getId(), examQuestion.getAreaCode(), examQuestion.getWorkId());
-                    if (Objects.nonNull(paperList) && paperList.size() > 0) {
+                    if (Objects.nonNull(paperList) && !paperList.isEmpty()) {
                         for (Paper p : paperList) {
                             MarkTask markTask = new MarkTask(markUser, p, stage, 1L);
                             markTaskDTOs.add(markTaskAssembler.toDTO(markTask));
@@ -285,7 +285,6 @@ public class MarkTaskApi {
      *
      * @param markTask 评卷你任务id
      * @param body     评卷内容
-     * @return
      */
     @RequestMapping(value = "{markTask}", method = RequestMethod.PATCH)
     public ResponseEntity marking(@PathVariable MarkTask markTask, @RequestBody HashMap<String, String> body) {

+ 2 - 8
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/ChangeLevelAssembler.java

@@ -8,18 +8,13 @@ import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 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.domain.Student;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.dto.ChangeLevelDTO;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.Date;
-import java.util.Map;
-
 @Component
 public class ChangeLevelAssembler {
 
@@ -57,11 +52,10 @@ public class ChangeLevelAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(workId, examNumber);
             //0:随机码 1:考号
-            if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
-//                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(workId, subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(workId)).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(workId, subject.ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(workId, subject.ordinal(), student.getId(), SystemConstant.THUMB);
             } else {

+ 13 - 24
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java

@@ -6,7 +6,6 @@ import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.repository.ChangeLevelRepo;
@@ -14,7 +13,6 @@ import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -60,7 +58,7 @@ public class MarkTaskAssembler {
             Paper paper = markTask.getPaper();
             if (markTask.getStage() == MarkStage.LEVEL) {
                 markTaskDTO.setLevel(markTask.getResult());
-                markTaskDTO.setOriginLevel(markTask.getOriginLevel() == null ? "":markTask.getOriginLevel());
+                markTaskDTO.setOriginLevel(markTask.getOriginLevel() == null ? "" : markTask.getOriginLevel());
             } else {
                 markTaskDTO.setLevel(paper.getLevel());
             }
@@ -71,19 +69,16 @@ public class MarkTaskAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
             //0:随机码 1:考号
-            if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
-//                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
             } else {
                 imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
                 thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
             }
-//            String imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
-//            String thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             markTaskDTO.setThumbSrc(thumbSrc);
             markTaskDTO.setImgSrc(imgSrc);
             markTaskDTO.setSample(paper.isSample());
@@ -92,13 +87,13 @@ public class MarkTaskAssembler {
             markTaskDTO.setRandomSeq(markTask.getRandomSeq());
             markTaskDTO.setPaperId(paper.getId());
             markTaskDTO.setSerialNumber(markTask.getSerialNumber());
-            if(Objects.nonNull(markTask.getDisplayNumber())) {
+            if (Objects.nonNull(markTask.getDisplayNumber())) {
                 markTaskDTO.setDisplayNumber(markTask.getDisplayNumber() == 1);
             }
             markTaskDTO.setShift(paper.isShift());
             markTaskDTO.setShiftScore(paper.isShiftScore());
 
-            markTaskDTO.setIsRejectedByLeader(paper.isRejectedByLeader() == null ? false : paper.isRejectedByLeader());
+            markTaskDTO.setIsRejectedByLeader(paper.isRejectedByLeader() != null && paper.isRejectedByLeader());
             //打回总次数
             int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), Objects.nonNull(paper.isRejectedByLeader()) && paper.isRejectedByLeader() ? MarkLogOperType.CALLBACK_LEVEl.getId() : MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId());
             markTaskDTO.setRejectedCount(rejectedCount);
@@ -132,19 +127,16 @@ public class MarkTaskAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
             //0:随机码 1:考号
-            if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
-//                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
             } else {
                 imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
                 thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
             }
-//            String imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
-//            String thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             markTaskDTO.setThumbSrc(thumbSrc);
             markTaskDTO.setImgSrc(imgSrc);
             markTaskDTO.setSample(paper.isSample());
@@ -161,6 +153,7 @@ public class MarkTaskAssembler {
 
     /**
      * 改档,改档打分
+     *
      * @param markTask
      * @return
      */
@@ -178,11 +171,10 @@ public class MarkTaskAssembler {
             Paper paper = markTask.getPaper();
             if (paper.isShift()) {
                 markTaskDTO.setLevel(markTask.getResult());
-//                markTaskDTO.setOriginLevel(markTask.getOriginLevel());
                 ChangeLevel changeLevel = changeLevelRepo.findByWorkIdAndSubjectAndPaperIdAndAuditStatusAndIsCurr(markTask.getWorkId(), markTask.getSubject().name(), paper.getId());
-                markTaskDTO.setOriginLevel(changeLevel != null ? changeLevel.getOriginalLevel(): "");
+                markTaskDTO.setOriginLevel(changeLevel != null ? changeLevel.getOriginalLevel() : "");
             }
-            if(paper.isShiftScore()){
+            if (paper.isShiftScore()) {
                 markTaskDTO.setLevel(paper.getLevel());
             }
             markTaskDTO.setSn(markTask.getSecretNumber());
@@ -192,19 +184,16 @@ public class MarkTaskAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
             //0:随机码 1:考号
-            if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
-//                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
             } else {
                 imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
                 thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
             }
-//            String imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
-//            String thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             markTaskDTO.setThumbSrc(thumbSrc);
             markTaskDTO.setImgSrc(imgSrc);
             markTaskDTO.setSample(paper.isSample());
@@ -213,7 +202,7 @@ public class MarkTaskAssembler {
             markTaskDTO.setRandomSeq(markTask.getRandomSeq());
             markTaskDTO.setPaperId(paper.getId());
             markTaskDTO.setSerialNumber(markTask.getSerialNumber());
-            if(Objects.nonNull(markTask.getDisplayNumber())) {
+            if (Objects.nonNull(markTask.getDisplayNumber())) {
                 markTaskDTO.setDisplayNumber(markTask.getDisplayNumber() == 1);
             }
             markTaskDTO.setShift(paper.isShift());

+ 8 - 14
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -6,7 +6,6 @@ import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
@@ -58,10 +57,10 @@ public class PaperAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
             //0:随机码 1:考号
-            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
                 sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
@@ -72,8 +71,6 @@ public class PaperAssembler {
             }
             //查询阶段
             MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
-
-
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setPaperId(paper.getId());
@@ -92,8 +89,6 @@ public class PaperAssembler {
             paperDTO.setRedoLevel(paper.getRedoLevel());
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
             paperDTO.setSecretNumber(paper.getSecretNumber());
-//            String imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
-//            String thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setThumbSrc(thumbSrc);
             paperDTO.setSheetSrc(sheetSrc);
@@ -142,10 +137,10 @@ public class PaperAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
             //0:随机码 1:考号
-            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
                 if (paper.isManual() && Objects.nonNull(isManual) && isManual) {
@@ -209,10 +204,10 @@ public class PaperAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
             //0:随机码 1:考号
-            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
                 sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
@@ -279,11 +274,10 @@ public class PaperAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumber(paper.getWorkId(), paper.getExamNumber());
             //0:随机码 1:考号
-            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
-//            fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getNameRule() == 1) {
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
-            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+            if (ParamCache.collectConfigMap.get(String.valueOf(paper.getWorkId())).getImageEncrypt() == 1) {
                 imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
                 thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
                 sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);

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

@@ -280,10 +280,10 @@ public class AssignTaskService {
         //只有全部任务投放完成,才能删除分组
         int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getTest());
         if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
-            for (MarkerGroup markerGroup : markerGroups) {
+            /*for (MarkerGroup markerGroup : markerGroups) {
                 markerGroup.setMarkers(null);
             }
-            markerGroupRepo.delete(markerGroups);
+            markerGroupRepo.delete(markerGroups);*/
             //初始化打分任务数据
             initTaskPublishData(markSubject.getWorkId(), markSubject.getSubject().name());
 

+ 23 - 9
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
+import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
@@ -42,20 +43,24 @@ public class DetermineLevelService {
     /**
      * 计算定档值(规则:1.不是过半定档,取权重,2.是过半定档,没有取优,取过半定档,3.是过半定档,是取优,取过半定档和权重最优值)
      *
-     * @param majority 是否过半定档
-     * @param taskBest 是否取优
-     * @param tasks    任务集合
+     * @param workId    工作ID
+     * @param markTasks 任务集合
      */
-    public DeterResult determine(boolean majority, boolean taskBest, List<Level> levels, MarkTask... tasks) {
+    public DeterResult determine(Long workId, List<Level> levels, List<MarkTask> markTasks) {
+        // 是否过半定档(1:是)
+        boolean majority = Optional.ofNullable(ParamCache.levelConfigMap.get(String.valueOf(String.valueOf(workId))).getMajority()).orElse(1) == 1;
         DeterResult majorityResult = null;
         DeterResult weightResult = null;
         if (majority) {
+            MarkTask[] tasks = markTasks.toArray(new MarkTask[0]);
             majorityResult = calcMajority(tasks);
         }
-        weightResult = calcWeight(levels, tasks);
+        weightResult = calcWeight(workId, levels, markTasks);
 
         if (majorityResult != null) {
-            if (taskBest) {
+            // 是否取优(过半定档和权重,取最优值)
+            boolean takeBest = Optional.ofNullable(ParamCache.levelConfigMap.get(String.valueOf(String.valueOf(workId))).getTakeBest()).orElse(1) == 1;
+            if (takeBest) {
                 Map<String, Integer> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getLevelValue));
                 // 取优
                 int majorityLevelValue = levelMap.get(majorityResult.getResult());
@@ -77,15 +82,24 @@ public class DetermineLevelService {
     /**
      * 计算权重值
      *
-     * @param tasks 任务集合
+     * @param markTasks 任务集合
      */
-    private DeterResult calcWeight(List<Level> levels, MarkTask[] tasks) {
+    private DeterResult calcWeight(Long workId, List<Level> levels, List<MarkTask> markTasks) {
+        // 是否开启去高去低再加权评卷(1:是, 0:否,默认0)
+        boolean removeHighAndLow = Optional.ofNullable(ParamCache.levelConfigMap.get(String.valueOf(String.valueOf(workId))).getRemoveHighAndLow()).orElse(0) == 1;
+        if (removeHighAndLow && markTasks.size() > 2) {
+            markTasks.sort((Comparator.comparing(MarkTask::getResult)));
+            markTasks.remove(0);//去掉最大值
+            markTasks.remove(markTasks.size() - 1);//去掉最小值
+        }
+
+        MarkTask[] tasks = markTasks.toArray(new MarkTask[0]);
         //通过权重计算,平均值四舍五入
         double[] values = new double[tasks.length];
         double[] weights = new double[tasks.length];
         for (int i = 0; i < tasks.length; i++) {
             String levelResult = tasks[i].getResult();
-            Level level = levels.stream().filter(m->m.getCode().equals(levelResult)).findFirst().orElse(null);
+            Level level = levels.stream().filter(m -> m.getCode().equals(levelResult)).findFirst().orElse(null);
             if (level == null) {
                 throw new RuntimeException("无此档位");
             }

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

@@ -122,7 +122,7 @@ public class MarkerGroupLeaderService {
             }
             return mapList;
         }
-        return null;
+        return new ArrayList<>();
     }
 
     /**

+ 13 - 11
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -125,13 +125,8 @@ public class MarkingService {
         List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markTask.getStage());
         long leftCount = markTasks.stream().filter(i -> i.getResult() == null).count();
         if (leftCount == 0) {
-            MarkTask[] sources = new MarkTask[markTasks.size()];
             //定档
-            // 是否过半定档(1:是)
-            Integer majority = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getMajority()).orElse(1);
-            // 是否取优(过半定档和权重,取最优值)
-            Integer takeBest = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getTakeBest()).orElse(1);
-            DeterResult determine = determineLevelService.determine(majority == 1, takeBest == 1, levels, markTasks.toArray(sources));
+            DeterResult determine = determineLevelService.determine(markTask.getWorkId(), levels, markTasks);
             if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult())) {
                 markTask.setDateMineResult(determine.getResult());
             }
@@ -143,7 +138,7 @@ public class MarkingService {
                 levelsLog(markTasks, paper);
             } else {
                 int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
-                Integer deviation = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getDeviation()).orElse(3);
+                Integer deviation = Optional.ofNullable(ParamCache.levelConfigMap.get(String.valueOf(markTask.getWorkId())).getDeviation()).orElse(3);
                 boolean result = ArbitrationService.arbitrate(deviation, values);
                 //2.最大落差超过仲裁档位,则仲裁打回
                 if (result) {
@@ -367,11 +362,18 @@ public class MarkingService {
         List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markTask.getStage());
         long leftCount = markTasks.stream().filter(i -> i.getResult() == null).count();
         if (leftCount == 0) {
-            OptionalDouble finalScore = markTasks.stream().map(m -> m.getResult())
-                    .mapToInt(Integer::valueOf).average();
+            // 分数计算方式 (1:去高去低再加权评卷, 0:全部加权平均,默认0)
+            boolean removeHighAndLow = Optional.ofNullable(ParamCache.scoreConfigMap.get(String.valueOf(String.valueOf(markTask.getWorkId()))).getRemoveHighAndLow()).orElse(0) == 1;
+            if (removeHighAndLow) {
+                markTasks.sort(Comparator.comparingInt(x -> Integer.parseInt(x.getResult())));
+                markTasks.remove(0);//去掉最大值
+                markTasks.remove(markTasks.size() - 1);//去掉最小值
+            }
+
+            OptionalDouble finalScore = markTasks.stream().map(MarkTask::getResult).mapToInt(Integer::valueOf).average();
             //湖北省,平均分非零进一
-            Integer roundUp = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getRoundUp()).orElse(1);
-            double fs = roundUp.intValue() == 0 ? Math.ceil(finalScore.orElse(0)) : Math.round(finalScore.orElse(0));
+            Integer roundUp = Optional.ofNullable(ParamCache.scoreConfigMap.get(String.valueOf(markTask.getWorkId())).getRoundUp()).orElse(1);
+            double fs = roundUp == 0 ? Math.ceil(finalScore.orElse(0)) : Math.round(finalScore.orElse(0));
             paper.setScore(fs);
             //改档打分完成,更新状态为false
             paper.setShiftScore(false);

+ 4 - 5
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -88,7 +88,6 @@ public class StageControlService {
                 break;
             case LEVEL:
                 markSubject.setStage(MarkStage.SCORE);
-//                enterScoreStage(markSubject);
                 enterToScoreStage(markSubject);
                 break;
             case SCORE:
@@ -145,7 +144,7 @@ public class StageControlService {
         }
         levelRepo.save(levels);
         //assignTaskService.assignForAll(papers, levelMarkers, markSubject);
-        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(workId, subject, markSubject.getStage());
         if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("评卷员没有进行分组");
@@ -242,7 +241,7 @@ public class StageControlService {
             throw new RuntimeException("没有分档完成");
         }
         this.isPtFull(workId, markSubject);
-        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(workId, subject, markSubject.getStage());
         if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("评卷员没有进行分组");
@@ -356,7 +355,7 @@ public class StageControlService {
             throw new RuntimeException("没有分档完成");
         }
         this.isPtFull(workId, markSubject);
-        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(workId, subject, markSubject.getStage());
         /*if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("评卷员没有进行分组");
@@ -381,7 +380,7 @@ public class StageControlService {
             throw new RuntimeException("没有分档完成");
         }
         this.isPtFull(workId, markSubject);
-        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubjectAndStage(workId, subject, markSubject.getStage());
         if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("评卷员没有进行分组");