Explorar o código

美术阅卷11月新增需求-新增打分阶段分档配置

wangliang %!s(int64=5) %!d(string=hai) anos
pai
achega
c29e077910

+ 11 - 9
sql/stmms-ms-表创建语句.sql

@@ -32,7 +32,7 @@ CREATE TABLE `exam_question` (
   `work_id` bigint(20) NOT NULL,
   `is_test` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -119,7 +119,7 @@ CREATE TABLE `level` (
   PRIMARY KEY (`id`),
   UNIQUE KEY `idx_level_workId_code` (`work_id`,`code`),
   CONSTRAINT `FK3km0g7jbkt78oj20csqeh26f2` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -149,7 +149,7 @@ CREATE TABLE `mark_log` (
   `remark` varchar(500) DEFAULT NULL COMMENT '备注',
   `stage` bigint(20) DEFAULT NULL COMMENT '试卷阶段,0:初始,1:分档,2:打分',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='操作日志';
+) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 COMMENT='操作日志';
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -169,6 +169,7 @@ CREATE TABLE `mark_subject` (
   `sample_count` int(11) NOT NULL DEFAULT '100',
   `is_test` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
   `is_formal` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否正评,0:不是,1:是',
+  `all_level` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否全部根据档位分配完,0:不是,1:是',
   PRIMARY KEY (`id`),
   KEY `FK1tvc2mil1ebqgt08912t4hxqw` (`work_id`),
   CONSTRAINT `FK1tvc2mil1ebqgt08912t4hxqw` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`)
@@ -202,10 +203,11 @@ CREATE TABLE `mark_task` (
   `random_seq_new` bigint(20) DEFAULT NULL COMMENT '随机号',
   `is_active` bit(1) DEFAULT b'0' COMMENT '是否激活',
   `is_test` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否试评,0:不是,1:数据已导入,2:试评中',
+  `batch_no` bigint(45) DEFAULT NULL COMMENT '批次号',
   PRIMARY KEY (`id`),
   KEY `idx_mark_task_paper_id` (`paper_id`),
   CONSTRAINT `FKa6xqlu9ml2e47x1o2u2yec7vm` FOREIGN KEY (`paper_id`) REFERENCES `paper` (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=323 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -256,7 +258,7 @@ CREATE TABLE `marker_group` (
   `subject` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
   `work_id` bigint(20) NOT NULL,
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -308,7 +310,7 @@ CREATE TABLE `paper` (
   KEY `idx_paper_exam_number` (`exam_number`),
   KEY `idx_paper_area_code` (`area_code`),
   KEY `idx_paper_student_name` (`student_name`)
-) ENGINE=InnoDB AUTO_INCREMENT=385 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=427 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -351,7 +353,7 @@ CREATE TABLE `student` (
   PRIMARY KEY (`id`),
   UNIQUE KEY `exam_number` (`exam_number`,`work_id`,`is_test`),
   KEY `idx_student_name` (`name`)
-) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -367,7 +369,7 @@ CREATE TABLE `work` (
   `created_on` date DEFAULT NULL,
   `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -383,4 +385,4 @@ CREATE TABLE `work` (
 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2019-11-14 15:22:51
+-- Dump completed on 2019-11-21 13:38:45

+ 5 - 0
sql/更新脚本.sql

@@ -44,3 +44,8 @@ ALTER TABLE `mark_user` ADD COLUMN `level_callback` BIT(1) NOT NULL default fals
 -- 2019.11.14 by xf
 ALTER TABLE `mark_log`
 ADD COLUMN `work_name` VARCHAR(255) NULL COMMENT '工作名称' AFTER `work_id`;
+
+-- 2019.11.21 by wl
+ALTER TABLE mark_task ADD COLUMN `batch_no` bigint(45) COMMENT '批次号';
+
+ALTER TABLE mark_subject ADD COLUMN `all_level` BIT(1) NOT NULL DEFAULT 0 COMMENT '是否全部根据档位分配完,0:不是,1:是';

+ 48 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/ScoreConfig.java

@@ -0,0 +1,48 @@
+package cn.com.qmth.stmms.ms.commons.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Description: 打分配置
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/11/20
+ */
+@Component
+@ConfigurationProperties(prefix = "score.level", ignoreUnknownFields = false)
+public class ScoreConfig {
+
+    private boolean enable;//打分阶段配置是否启用
+
+    private List<String> exclude;//打分阶段配置过滤档位(可选一个或多个档位,多个档位用","号隔开)
+
+    private String taskSort;//打分阶段配置档位排序规则(可选random/paper)
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+
+    public List<String> getExclude() {
+        return exclude;
+    }
+
+    public void setExclude(List<String> exclude) {
+        this.exclude = exclude;
+    }
+
+    public String getTaskSort() {
+        return taskSort;
+    }
+
+    public void setTaskSort(String taskSort) {
+        this.taskSort = taskSort;
+    }
+}

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

@@ -45,6 +45,18 @@ public class MarkSubject implements Serializable {
     @Column(name = "is_formal")
     private boolean formal;//是否正评,0:不是,1:是
 
+    @Basic
+    @Column(name = "all_level")
+    private boolean allLevel;//是否全部根据档位分配完,0:不是,1:是
+
+    public boolean isAllLevel() {
+        return allLevel;
+    }
+
+    public void setAllLevel(boolean allLevel) {
+        this.allLevel = allLevel;
+    }
+
     public boolean isFormal() {
         return formal;
     }

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

@@ -84,6 +84,18 @@ public class MarkTask implements Serializable {
     @Column(name = "is_active")
     private boolean isActive;//是否激活(false:不是,true:是)
 
+    @Basic
+    @Column(name = "batch_no")
+    private Long batchNo;
+
+    public Long getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(Long batchNo) {
+        this.batchNo = batchNo;
+    }
+
     public boolean isActive() {
         return isActive;
     }

+ 8 - 2
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/LevelRepo.java

@@ -2,15 +2,21 @@ package cn.com.qmth.stmms.ms.core.repository;
 
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
 
 /**
  * Created by zhengmin on 2016/9/24.
  */
-public interface LevelRepo extends JpaRepository<Level,Long>{
+public interface LevelRepo extends JpaRepository<Level, Long> {
 
     List<Level> findByWorkId(Long workId);
 
-    Level findByWorkIdAndCode(Long workId,String code);
+    Level findByWorkIdAndCode(Long workId, String code);
+
+    @Query("select max(l.code) from Level l where l.workId = ?1")
+    String findMaxCodeByWorkId(Long workId);
+
+    List<Level> findByCodeNotIn(List<String> levelList);
 }

+ 5 - 2
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -190,10 +190,13 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     @Query(value = "SELECT count(1) from mark_task m left join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and p.is_missing = ?4 and p.batch_no = (select max(batch_no) from paper where question_id = ?5)", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long markerId, int stage, boolean isMissing, Long questionId1);
 
-    @Query(value = "SELECT count(1) from mark_task m left join paper p on m.paper_id = p.id where m.question_id = ?1 and m.stage = ?2 and m.result =?3 and p.is_missing = ?4 and p.batch_no = (select max(batch_no) from paper where question_id = ?5)", nativeQuery = true)
-    int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing, Long questionId1);
+    @Query(value = "SELECT count(1) from mark_task m left join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and m.result =?3 and p.is_missing = ?4 and p.batch_no = (select max(batch_no) from paper where question_id = ?5)", nativeQuery = true)
+    int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing, Long questionId1, Long markerId);
 
     MarkTask findByPaperIdAndSecretNumber(Long paperId, String secretNumber);
 
     MarkTask findByPaperIdAndMarkerId(Long paperId, Long markId);
+
+    @Query("select max(mt.batchNo) from MarkTask mt where mt.questionId = ?1")
+    long findByQuestionId(Long questionId);
 }

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

@@ -33,6 +33,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrue(Long workId, Subject subject, Sort sort);
 
+    List<Paper> findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndLevelIn(Long workId, Subject subject, List<String> levelList);
+
     List<Paper> findByWorkIdAndSubject(Long workId, Subject subject, Sort sort);
 
     List<Paper> findByQuestionId(Long questionId, Sort sort);
@@ -89,7 +91,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
             "FROM paper p " +
             "WHERE p.`question_id` = ? and p.is_missing = false and p.is_test = ? " +
             "GROUP BY p.`level` ORDER BY p.`level`", nativeQuery = true)
-    List<Object[]> countGroupByLevelAll(Long questionId,int test);
+    List<Object[]> countGroupByLevelAll(Long questionId, int test);
 
     /**
      * 统计科目指定试题的各档位数量

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

@@ -15,6 +15,7 @@ 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.MarkerDTO;
 import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
+import com.alibaba.fastjson.JSONObject;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -124,12 +125,11 @@ public class MakrerApi {
                         levelStatDTO.setCount(count);
                     } else {
 //                        int count = markTaskRepo.countByQuestionIdAndStageAndResult(questionId, MarkStage.LEVEL, levelStatDTO.getId().toString());
-                        int count = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.LEVEL.ordinal(), levelStatDTO.getId().toString(), false, questionId);
+                        int count = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.LEVEL.ordinal(), levelStatDTO.getId().toString(), false, questionId, marker.getId());
                         levelStatDTO.setCount(count);
                     }
                     levelStatDTOs.add(levelStatDTO);
                 });
-
         for (Level level : levels) {
             //所有档位依次比较
             long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
@@ -140,12 +140,11 @@ public class MakrerApi {
                 dto.setPercent(0.0);
 
                 //当前老师当前档位评档次数(所有考试)
-                int countNew = markTaskRepo.countByQuestionIdAndStageAndResult(questionId, MarkStage.LEVEL.ordinal(), level.getCode());
+                int countNew = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.LEVEL.ordinal(), level.getCode(), false, questionId, marker.getId());
                 dto.setCount(countNew);
                 levelStatDTOs.add(dto);
             }
         }
-
         //当前老师当前试卷的评档次数(不分档位)
         long kdtotal = markTaskRepo.countByQuestionId(questionId, questionId, marker.getId());
         //当前老师所有的评档次数(不分档位)

+ 34 - 8
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.marking.api;
 
+import cn.com.qmth.stmms.ms.commons.config.ScoreConfig;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
@@ -7,10 +8,7 @@ import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
-import cn.com.qmth.stmms.ms.core.repository.ExamQuestionRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
-import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkTaskAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
@@ -54,6 +52,12 @@ public class MarkTaskApi {
     @Autowired
     MarkUserRepo markUserRepo;
 
+    @Autowired
+    ScoreConfig scoreConfig;
+
+    @Autowired
+    LevelRepo levelRepo;
+
     /**
      * 评卷员的评卷任务
      *
@@ -73,8 +77,6 @@ public class MarkTaskApi {
                             @RequestParam Long questionId,
                             Pageable pageable) throws Exception {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
-        //查询
-        long batchNo = paperRepo.findByQuestionId(questionId);
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.equal(root.get("questionId"), questionId));
@@ -83,11 +85,31 @@ public class MarkTaskApi {
             if (level == null) {
                 predicates.add(builder.isNull(root.get("result")));
             } else if (stage == MarkStage.LEVEL) {
+                //查询
+                long batchNo = paperRepo.findByQuestionId(questionId);
                 predicates.add(builder.equal(root.get("result"), level));
                 if (!Objects.isNull(batchNo)) {
                     predicates.add(builder.equal(root.get("paper").get("batchNo"), batchNo));
                 }
             } else if (stage == MarkStage.SCORE) {
+                //查询
+                long batchNo = markTaskRepo.findByQuestionId(questionId);
+                if (!Objects.isNull(batchNo)) {
+                    predicates.add(builder.equal(root.get("batchNo"), batchNo));
+                }
+//                if (Objects.nonNull(scoreConfig) && scoreConfig.isEnable()) {
+//                    if (Objects.nonNull(scoreConfig) && Objects.nonNull(scoreConfig.getExclude()) && scoreConfig.getExclude().size() > 0) {
+//                        Expression<String> exp = root.get("paper").get("level");
+//                        predicates.add(exp.in(scoreConfig.getExclude()));
+//                    } else {
+//                        ExamQuestion examQuestion = examQuestionRepo.findOne(questionId);
+//                        if (Objects.nonNull(examQuestion)) {
+//                            String maxLevel = levelRepo.findMaxCodeByWorkId(examQuestion.getWorkId());
+//                            Expression<String> exp = root.get("paper").get("level");
+//                            predicates.add(exp.in(maxLevel));
+//                        }
+//                    }
+//                }
                 predicates.add(builder.isNotNull(root.get("result")));
             }
             if (isSample != null) {
@@ -118,8 +140,12 @@ public class MarkTaskApi {
         markTasks.getContent().forEach(m -> {
             markTaskDTOs.add(markTaskAssembler.toDTO(m));
         });
-        if (stage == MarkStage.SCORE && level == null) {
-            Collections.sort(markTaskDTOs, (MarkTaskDTO a, MarkTaskDTO b) -> a.getLevel().compareTo(b.getLevel()));
+        if (stage == MarkStage.SCORE && Objects.isNull(level)) {
+            if (Objects.nonNull(scoreConfig) && Objects.nonNull(scoreConfig.getTaskSort()) && Objects.equals("paper", scoreConfig.getTaskSort())) {
+                Collections.sort(markTaskDTOs, Comparator.comparing(MarkTaskDTO::getPaperId));
+            } else {
+                Collections.sort(markTaskDTOs, Comparator.comparing(MarkTaskDTO::getRandomSeqNew));
+            }
         } else if (stage == MarkStage.LEVEL && Objects.isNull(level)) {
             Collections.sort(markTaskDTOs, Comparator.comparing(MarkTaskDTO::getRandomSeqNew));
         }

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

@@ -65,6 +65,7 @@ public class MarkTaskAssembler {
             markTaskDTO.setSample(paper.isSample());
             markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
             markTaskDTO.setRandomSeqNew(markTask.getRandomSeqNew());
+            markTaskDTO.setPaperId(paper.getId());
         }
         return markTaskDTO;
     }
@@ -105,6 +106,7 @@ public class MarkTaskAssembler {
             markTaskDTO.setSample(paper.isSample());
             markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
             markTaskDTO.setRandomSeqNew(markTask.getRandomSeqNew());
+            markTaskDTO.setPaperId(paper.getId());
         }
         return markTaskDTO;
     }

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

@@ -26,9 +26,17 @@ public class MarkTaskDTO implements Serializable{
     private boolean isSample;
     private boolean markByLeader;
     private boolean oldRejected;
-
+    private Long paperId;
     private Long randomSeqNew;
 
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }

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

@@ -117,7 +117,13 @@ public class AssignTaskService {
             Paper paper = iterator.next();
             for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
                 Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber());
-                MarkTask markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                MarkTask markTask = null;
+                if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
+                    markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                    markTask.setBatchNo(currentTime);
+                } else {
+                    markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                }
                 markTaskRepo.save(markTask);
             }
             if (markSubject.getTest() != 1) {

+ 88 - 6
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
+import cn.com.qmth.stmms.ms.commons.config.ScoreConfig;
+import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 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.MarkRight;
@@ -15,9 +17,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -51,6 +51,12 @@ public class StageControlService {
     @Autowired
     private MarkerGroupRepo markerGroupRepo;
 
+    @Autowired
+    ScoreConfig scoreConfig;
+
+    @Autowired
+    SqlUtil sqlUtil;
+
     public static volatile Map<String, Boolean> statusMap = new Hashtable<>();
 
     /**
@@ -179,13 +185,89 @@ public class StageControlService {
             throw new RuntimeException("没有分档完成");
         }
         this.isPtFull(workId, markSubject);
-        Sort sort = new Sort("questionId");
-        List<Paper> papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrue(workId, subject, sort);
         List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
         if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("评卷员没有进行分组");
         }
+        List<Paper> papers = null;
+        //是否启用打分配置
+        if (Objects.nonNull(scoreConfig) && scoreConfig.isEnable()) {
+            //2019.11.20日加入根据配置文件打分分档
+            if (Objects.nonNull(scoreConfig) && Objects.nonNull(scoreConfig.getExclude()) && scoreConfig.getExclude().size() > 0) {
+                List<String> configLevelList = scoreConfig.getExclude();
+                configLevelList = configLevelList.stream().map(string -> string.trim().toUpperCase()).collect(Collectors.toList());
+                List<Level> levels = levelRepo.findByCodeNotIn(configLevelList);
+                List<String> levelList = levels.stream().map(Level::getCode).collect(Collectors.toList());
+                Collections.sort(levelList);
+                Object o1 = levelList.stream().map(s -> "'" + s + "'").collect(Collectors.joining(","));
+                StringJoiner joiner = new StringJoiner("");
+                joiner.add("select count(1),p.`level` from mark_task mt left join paper p on p.id = mt.paper_id where mt.stage = 2 and p.`level` in (").add(o1.toString()).add(")");
+                String sql = sqlUtil.sqlGroupBy(joiner.toString(), "p.`level`");
+                List list = sqlUtil.execSqlForMap(sql);
+                List<String> finalLevelList = new ArrayList();
+                if (Objects.isNull(list) || list.size() == 0) {
+                    finalLevelList.addAll(levelList);
+                } else {
+                    for (int i = 0; i < list.size(); i++) {
+                        Map map = (Map) list.get(i);
+                        String level = String.valueOf(map.get("level"));
+                        if (!levelList.contains(level)) {
+                            finalLevelList.add(level);
+                        }
+                    }
+                }
+                if (Objects.nonNull(list) && list.size() > 0 && finalLevelList.size() == 0) {
+                    statusMap.put(markSubject.getId(), false);
+                    throw new RuntimeException("档位:" + o1 + "已经分配过");
+                }
+                markSubject.setAllLevel(false);
+                papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndLevelIn(workId, subject, finalLevelList);
+            } else if (Objects.nonNull(scoreConfig) && Objects.nonNull(scoreConfig.getTaskSort())) {
+                if (Objects.equals("paper", scoreConfig.getTaskSort().trim()) && Objects.nonNull(scoreConfig.getExclude()) && scoreConfig.getExclude().size() == 0) {
+                    List<Level> allLevel = levelRepo.findByWorkId(workId);
+                    List<String> levelList = allLevel.stream().map(Level::getCode).collect(Collectors.toList());
+                    Collections.sort(levelList);
+                    Object o1 = levelList.stream().map(s -> "'" + s + "'").collect(Collectors.joining(","));
+                    StringJoiner joiner = new StringJoiner("");
+                    joiner.add("select count(1),p.`level` from mark_task mt left join paper p on p.id = mt.paper_id where mt.stage = 2 and p.`level` in (").add(o1.toString()).add(")");
+                    String sql = sqlUtil.sqlGroupBy(joiner.toString(), "p.`level`");
+                    List list = sqlUtil.execSqlForMap(sql);
+                    List<String> finalLevelList = new ArrayList();
+                    for (int i = 0; i < list.size(); i++) {
+                        Map map = (Map) list.get(i);
+                        String level = String.valueOf(map.get("level"));
+                        finalLevelList.add(level);
+                    }
+                    //求task任务完成度
+                    if (finalLevelList.size() > 0) {
+                        joiner = new StringJoiner("");
+                        Object o2 = finalLevelList.stream().map(s -> "'" + s + "'").collect(Collectors.joining(","));
+                        joiner.add("select count(1) as count from mark_task mt left join paper p on p.id = mt.paper_id where mt.stage = 2 and p.`level` in (").add(o2.toString()).add(")").add(" and mt.`result` is null");
+                        list = sqlUtil.execSqlForMap(joiner.toString());
+                        if (Objects.nonNull(list) && list.size() > 0) {
+                            Map map = (Map) list.get(0);
+                            int taskCount = Integer.parseInt(String.valueOf(map.get("count")));
+                            if (taskCount > 0) {
+                                statusMap.put(markSubject.getId(), false);
+                                throw new RuntimeException("档位:" + o2 + "还有任务未完成");
+                            }
+                        }
+                    }
+                    //求差值
+                    List<String> distinctIdList = levelList.stream().filter(item -> !finalLevelList.contains(item)).collect(Collectors.toList());
+                    markSubject.setAllLevel(true);
+                    papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndLevelIn(workId, subject, distinctIdList);
+                } else {
+                    statusMap.put(markSubject.getId(), false);
+                    throw new RuntimeException("请配置打分exclude");
+                }
+            }
+        } else {
+            markSubject.setAllLevel(true);
+            Sort sort = new Sort("questionId");
+            papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrue(workId, subject, sort);
+        }
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject);
     }
 
@@ -267,7 +349,7 @@ public class StageControlService {
 
         BigDecimal waitTotal = BigDecimal.valueOf(totalCount).subtract(BigDecimal.valueOf(successCount));
         //进度
-        BigDecimal progress = BigDecimal.ZERO.compareTo(BigDecimal.valueOf(totalCount)) == 0 ? BigDecimal.ZERO :BigDecimal.valueOf(successCount).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(totalCount), 2, BigDecimal.ROUND_HALF_UP);
+        BigDecimal progress = BigDecimal.ZERO.compareTo(BigDecimal.valueOf(totalCount)) == 0 ? BigDecimal.ZERO : BigDecimal.valueOf(successCount).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(totalCount), 2, BigDecimal.ROUND_HALF_UP);
 
         LevleProgressDTO progressDTO = new LevleProgressDTO();
         progressDTO.setSuccessCount(successCount);