فهرست منبع

线上版本-谁分档谁打分-20201023

xiaof 4 سال پیش
والد
کامیت
4425b56411

+ 2 - 1
sql/美术-线上-最新数据结构-20201021.sql → sql/美术-线上-最新数据结构-20201023.sql

@@ -500,6 +500,7 @@ CREATE TABLE `param_setting` (
   `round_up` tinyint(1) DEFAULT NULL COMMENT '分数处理方式(1:四舍五入、0:非零进一)',
   `change_stage` tinyint(1) DEFAULT NULL COMMENT '改档及改档打分(1:显示、0:不显示)',
   `score_show_all_paper` tinyint(1) DEFAULT NULL COMMENT '打分阶段阅卷员是否显示所有试卷(1:是、0:否)',
+  `is_level_to_score` tinyint(1) DEFAULT NULL COMMENT '是否谁分档谁打分(1:是、0:否)',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8 COMMENT='参数设置';
 /*!40101 SET character_set_client = @saved_cs_client */;
@@ -600,4 +601,4 @@ CREATE TABLE `work` (
 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2020-10-21 14:29:40
+-- Dump completed on 2020-10-23 14:57:55

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

@@ -164,6 +164,7 @@ public class ParamApi {
         Integer roundUp = (Integer) map.get("roundUp");
         Integer changeStage = (Integer) map.get("changeStage");
         Integer scoreShowAllPaper = (Integer) map.get("scoreShowAllPaper");
+        Integer isLevelToScore = (Integer) map.get("isLevelToScore");
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
         List<MarkTask> markTasks = markTaskRepo.findByWorkId(workId);
         boolean flag = false;
@@ -182,6 +183,7 @@ public class ParamApi {
         paramSetting.setRoundUp(roundUp);
         paramSetting.setChangeStage(changeStage);
         paramSetting.setScoreShowAllPaper(scoreShowAllPaper);
+        paramSetting.setIsLevelToScore(isLevelToScore);
         paramSettingRepo.saveAndFlush(paramSetting);
         ParamCache.resetParam(paramSetting);
 

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

@@ -44,6 +44,8 @@ public class ParamSetting implements Serializable {
 
     private Integer scoreShowAllPaper;
 
+    private Integer isLevelToScore;
+
     public static ParamSetting init(){
         ParamSetting paramSetting = new ParamSetting();
         paramSetting.setPackageScan(0);
@@ -60,6 +62,8 @@ public class ParamSetting implements Serializable {
         paramSetting.setRoundUp(1);
         paramSetting.setChangeStage(0);
         paramSetting.setScoreShowAllPaper(0);
+        //是否谁分档谁打分,默认0(否)
+        paramSetting.setIsLevelToScore(0);
         return paramSetting;
     }
 
@@ -182,4 +186,12 @@ public class ParamSetting implements Serializable {
     public void setScoreShowAllPaper(Integer scoreShowAllPaper) {
         this.scoreShowAllPaper = scoreShowAllPaper;
     }
+
+    public Integer getIsLevelToScore() {
+        return isLevelToScore;
+    }
+
+    public void setIsLevelToScore(Integer isLevelToScore) {
+        this.isLevelToScore = isLevelToScore;
+    }
 }

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

@@ -162,6 +162,22 @@ public class MarkTask implements Serializable {
         this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
     }
 
+    public MarkTask(Long markerId, String markerName, Subject subject, Long workId, Paper paper, MarkStage stage, Long randomSeqNew, int test) {
+        this.markerId = markerId;
+        this.markerName = markerName;
+        this.subject = subject;
+        this.workId = workId;
+        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 = markerId + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.randomSeqNew = randomSeqNew;
+        this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
+    }
+
     public MarkTask(MarkUser marker, Paper paper, Level level, MarkStage stage, Long randomSeqNew, int test) {
         this.markerId = marker.getId();
         this.markerName = marker.getName();

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

@@ -215,4 +215,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     int countByWorkIdAndStageAndResultNotNull(Long id, MarkStage level);
 
     int countByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
+
+    List<MarkTask> findByWorkIdAndStage(Long workId, MarkStage level);
 }

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

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.marking.service;
 
 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.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -115,79 +117,124 @@ public class AssignTaskService {
      */
     @Transactional
     public void assignForGrouping(List<Paper> papers, List<MarkerGroup> markerGroups, MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
-        markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
-        int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
-        int groupSize = markerGroups.size();
-        int idx = 0;
         long currentTime = System.currentTimeMillis();
-        Iterator<Paper> iterator = papers.iterator();
-        List<MarkTask> markTaskList = new ArrayList<>(papers.size() * sum);
+        List<MarkTask> markTaskList;
         List<Paper> paperList = new ArrayList<>(papers.size());
         List<MarkTask> markTasks = markTaskRepo.findByWorkId(markSubject.getWorkId());
         Map<Long, MarkTask> randomMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getRandomSeqNew, Function.identity(), (dto1, dto2) -> dto1));
-        //定序序号记录
-        Map map = new HashMap();
-        while (iterator.hasNext()) {
-            if (idx >= groupSize) {
-                idx = 0;
-            }
-            Paper paper = iterator.next();
-            String serialNumber = null;
-            Integer displayNumber = null;
-            if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
-                //是否定序
-                int seq = 0;
+        //打分任务发布,并且是谁分档谁打分模式
+        if (Objects.equals(MarkStage.SCORE, markSubject.getStage()) && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1) {
+            //查询所有试卷各分档时任务详情
+            List<MarkTask> levelMarkTasks = markTaskRepo.findByWorkIdAndStage(markSubject.getWorkId(), MarkStage.LEVEL);
+            markTaskList = new ArrayList<>(levelMarkTasks.size());
+            //各试卷对应的分档评卷员信息
+            Map<Long, List<MarkTask>> listMap = levelMarkTasks.stream().collect(Collectors.groupingBy(item-> item.getPaper().getId()));
+            //生成打分任务
+            Map<String, AtomicInteger> integerMap = new HashMap<>();
+            for (Paper paper : papers) {
+                //是否显示序号
                 long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
+                String serialNumber = null;
+                Integer displayNumber = null;
                 if (sortRule != 0) {
-                    if (map.containsKey(paper.getLevel() + idx)) {
-                        seq = (int) map.get(paper.getLevel() + idx);
+                    AtomicInteger atomicInteger = integerMap.get(paper.getLevel());
+                    if(atomicInteger == null){
+                        atomicInteger = new AtomicInteger(0);
+                        integerMap.put(paper.getLevel(), atomicInteger);
                     }
-                    seq = ++seq;
-                    serialNumber = paper.getLevel() + seq;
+                    serialNumber = paper.getLevel() + atomicInteger.incrementAndGet();
                     //是否显示序号
                     long display = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getDisplayNumber() == 1).count();
                     displayNumber = (int) display;
-                    //设置新值
-                    map.put(paper.getLevel() + idx, seq);
                 }
-            }
-            for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
-                Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
-                MarkTask markTask = null;
-                if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
-                    markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+
+                for (MarkTask task : listMap.get(paper.getId())) {
+                    Long random = getRandom(task.getMarkerId(), paper.getId(), task.getWorkId(), paper.getExamNumber(), randomMap);
+                    MarkTask markTask = new MarkTask(task.getMarkerId(), task.getMarkerName(), task.getSubject(), task.getWorkId(), paper, markSubject.getStage(), random, markSubject.getTest());
                     markTask.setBatchNo(currentTime);
                     markTask.setSerialNumber(serialNumber);
                     markTask.setDisplayNumber(displayNumber);
-                } else {
-                    if(paper.isSample() && paper.getLevel() != null){
-                        Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
-                        markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
-                    } else {
-                        markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                    markTaskList.add(markTask);
+                    randomMap.put(random, markTask);
+                }
+                if (markSubject.getTest() != 1) {
+                    if (MarkStage.SCORE.equals(markSubject.getStage())) {
+                        paper.setScoreBatchNo(currentTime);
+                        paperList.add(paper);
                     }
                 }
-                markTaskList.add(markTask);
-                randomMap.put(random, markTask);
-//                markTaskRepo.save(markTask);
             }
-            if (markSubject.getTest() != 1) {
-                if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-                    //将paper置为激活
-                    paper.setActive(true);
-                    paper.setBatchNo(currentTime);
+        } else {
+            markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
+            int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
+            int groupSize = markerGroups.size();
+            int idx = 0;
+            Iterator<Paper> iterator = papers.iterator();
+            markTaskList = new ArrayList<>(papers.size() * sum);
+            //定序序号记录
+            Map map = new HashMap();
+            while (iterator.hasNext()) {
+                if (idx >= groupSize) {
+                    idx = 0;
+                }
+                Paper paper = iterator.next();
+                String serialNumber = null;
+                Integer displayNumber = null;
+                if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
+                    //是否定序
+                    int seq = 0;
+                    long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
+                    if (sortRule != 0) {
+                        if (map.containsKey(paper.getLevel() + idx)) {
+                            seq = (int) map.get(paper.getLevel() + idx);
+                        }
+                        seq = ++seq;
+                        serialNumber = paper.getLevel() + seq;
+                        //是否显示序号
+                        long display = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getDisplayNumber() == 1).count();
+                        displayNumber = (int) display;
+                        //设置新值
+                        map.put(paper.getLevel() + idx, seq);
+                    }
+                }
+                for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
+                    Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
+                    MarkTask markTask = null;
+                    if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
+                        markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                        markTask.setBatchNo(currentTime);
+                        markTask.setSerialNumber(serialNumber);
+                        markTask.setDisplayNumber(displayNumber);
+                    } else {
+                        if (paper.isSample() && paper.getLevel() != null) {
+                            Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
+                            markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
+                        } else {
+                            markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                        }
+                    }
+                    markTaskList.add(markTask);
+                    randomMap.put(random, markTask);
+//                markTaskRepo.save(markTask);
+                }
+                if (markSubject.getTest() != 1) {
+                    if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+                        //将paper置为激活
+                        paper.setActive(true);
+                        paper.setBatchNo(currentTime);
 //                    paperRepo.save(paper);
-                    paperList.add(paper);
-                    //更新subject表formal为正试评卷
+                        paperList.add(paper);
+                        //更新subject表formal为正试评卷
 //                    markSubject.setFormal(true);
 //                    markSubjectRepo.saveAndFlush(markSubject);
+                    }
+                    if (MarkStage.SCORE.equals(markSubject.getStage())) {
+                        paper.setScoreBatchNo(currentTime);
+                        paperList.add(paper);
+                    }
                 }
-                if (MarkStage.SCORE.equals(markSubject.getStage())) {
-                    paper.setScoreBatchNo(currentTime);
-                    paperList.add(paper);
-                }
+                idx++;
             }
-            idx++;
         }
         markTaskRepo.save(markTaskList);
         paperRepo.save(paperList);
@@ -197,14 +244,14 @@ public class AssignTaskService {
             markSubjectRepo.saveAndFlush(markSubject);
         }
         //只有全部任务投放完成,才能删除分组
-        int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
+        /*int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
         //进入分档阶段后,清空当前分组,以便打分阶段前重新分组
         if (MarkStage.LEVEL.equals(markSubject.getStage()) && count == 0) {
             for (MarkerGroup markerGroup : markerGroups) {
                 markerGroup.setMarkers(null);
             }
             markerGroupRepo.delete(markerGroups);
-        }
+        }*/
 //        if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
 //            //初始化打分任务数据
 //            initTaskPublishData(markSubject);
@@ -213,17 +260,22 @@ public class AssignTaskService {
     }
 
     @Transactional
-    public void assignForGroupingScore(MarkSubject markSubject) {
+    public void assignForGroupingScore(MarkSubject markSubject, List<MarkerGroup> markerGroups) {
         if (markSubject.getTest() != 1) {
             //更新subject表formal为正试评卷
             markSubject.setFormal(true);
             markSubjectRepo.saveAndFlush(markSubject);
         }
         int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
+        //进入打分阶段后,清空当前分组,以便打分阶段前重新分组
         if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
+            for (MarkerGroup markerGroup : markerGroups) {
+                markerGroup.setMarkers(null);
+            }
+            markerGroupRepo.delete(markerGroups);
+
             //初始化打分任务数据
             initTaskPublishData(markSubject);
-
         }
     }
 

+ 27 - 14
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -2,6 +2,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.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.MarkRight;
@@ -339,13 +340,13 @@ public class StageControlService {
             throw new RuntimeException("没有分档完成");
         }
         this.isPtFull(workId, markSubject);
-        /*List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
-        if (markerGroups.size() == 0) {
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+        /*if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("评卷员没有进行分组");
         }*/
         markSubject.setAllLevel(true);
-        assignTaskService.assignForGroupingScore(markSubject);
+        assignTaskService.assignForGroupingScore(markSubject, markerGroups);
     }
 
     @Transactional
@@ -364,16 +365,20 @@ public class StageControlService {
             throw new RuntimeException("没有分档完成");
         }
         this.isPtFull(workId, markSubject);
-        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
-        if (markerGroups.size() == 0) {
-            statusMap.put(markSubject.getId(), false);
-            throw new RuntimeException("评卷员没有进行分组");
-        }
-
-        for (MarkerGroup markerGroup : markerGroups) {
-            if(markerGroup.getMarkers().size() == 0){
+        //打分随机发任务校验分组
+        List<MarkerGroup> markerGroups = null;
+        if(ParamCache.paramMap.get(workId).getIsLevelToScore() == 0) {
+            markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+            if (markerGroups.size() == 0) {
                 statusMap.put(markSubject.getId(), false);
-                throw new RuntimeException("分组里没有评卷员");
+                throw new RuntimeException("评卷员没有进行分组");
+            }
+
+            for (MarkerGroup markerGroup : markerGroups) {
+                if (markerGroup.getMarkers().size() == 0) {
+                    statusMap.put(markSubject.getId(), false);
+                    throw new RuntimeException("分组里没有评卷员");
+                }
             }
         }
 
@@ -402,14 +407,22 @@ public class StageControlService {
         Sort sort = new Sort("questionId", "level");
         List<Paper> papers;
         //questionId为空,为所有考区
+        int totalCount = taskList.stream().mapToInt(TaskPublishSetting::getTotalCount).sum();
+
+        //谁分档谁打分时,必须一次发布所有任务
+        if(ParamCache.paramMap.get(workId).getIsLevelToScore() == 1){
+            if (totalCount - totalTaskCount != 0) {
+                statusMap.put(markSubject.getId(), false);
+                throw new RuntimeException("谁分档谁打分时,要发布所有任务");
+            }
+        }
         if (Objects.isNull(questionId)) {
-            int totalCount = taskList.stream().mapToInt(TaskPublishSetting::getTotalCount).sum();
             int successCount = taskList.stream().mapToInt(TaskPublishSetting::getSuccessCount).sum();
             papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, subject, sort);
             if (successCount > 0) {
                 statusMap.put(markSubject.getId(), false);
                 throw new RuntimeException("单考区发布过任务,不能再发布所有考区任务");
-            } else if (totalTaskCount - totalCount != 0) {
+            } else if (totalCount - totalTaskCount != 0) {
                 statusMap.put(markSubject.getId(), false);
                 throw new RuntimeException("选择所有考区时,要发布所有任务");
             }