瀏覽代碼

美术阅卷11月新增需求-加入synchronize同步

wangliang 5 年之前
父節點
當前提交
8f7ec6c5c8
共有 1 個文件被更改,包括 81 次插入72 次删除
  1. 81 72
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

+ 81 - 72
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -65,87 +65,94 @@ public class MarkingService {
      * @return
      */
     @Transactional
-    public synchronized MarkTask levelMark(MarkTask markTask, String levelCode) {
+    public MarkTask levelMark(MarkTask markTask, String levelCode) {
+        long start = System.currentTimeMillis();
+        LOG.info("提交分档:{}", start);
         //TODO 回评
         //boolean isMarked = markTask.getLevel() == null;
 
         //如果已经由科组长定档,则不做处理
         Paper paper = markTask.getPaper();
-        if (paper.isMarkByLeader()) {
-            return markTask;
-        }
-        /**
-         阀值判断
+        synchronized (paper.getId()) {
+            if (paper.isMarkByLeader()) {
+                return markTask;
+            }
+            /**
+             阀值判断
 
-         //控制分档比例
-         List<Level> levels = levelRepo.findByWorkId(markTask.getWorkId());
-         Level targetLevel = null;
-         for (Level l : levels) {
-         if (l.getCode().equals(levelCode)) {
-         targetLevel = l;
-         break;
-         }
-         }
-         int pt = targetLevel.getPt();
-         int count = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndResult(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage(), levelCode);
-         int total = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStage(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage());
+             //控制分档比例
+             List<Level> levels = levelRepo.findByWorkId(markTask.getWorkId());
+             Level targetLevel = null;
+             for (Level l : levels) {
+             if (l.getCode().equals(levelCode)) {
+             targetLevel = l;
+             break;
+             }
+             }
+             int pt = targetLevel.getPt();
+             int count = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndResult(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage(), levelCode);
+             int total = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStage(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage());
 
-         if ((count + 1.0D) / total * 1.0D > pt / 100.D) {
-         throw new RuntimeException(levelCode + "档已满,占比总阀值已达" + pt + "%。");
-         }
-         //判断考点阀值是否已满
-         int kdpt = targetLevel.getKdpt();
-         int kdcount = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionIdAndResult(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage(), markTask.getQuestionId(), levelCode);
-         int kdtotal = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage(), markTask.getQuestionId());
-         if ((kdcount + 1.0D) / kdtotal * 1.0D > kdpt / 100.D) {
-         throw new RuntimeException(levelCode + "档已满,考点阀值已达" + kdpt + "%。");
-         }
-         */
+             if ((count + 1.0D) / total * 1.0D > pt / 100.D) {
+             throw new RuntimeException(levelCode + "档已满,占比总阀值已达" + pt + "%。");
+             }
+             //判断考点阀值是否已满
+             int kdpt = targetLevel.getKdpt();
+             int kdcount = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionIdAndResult(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage(), markTask.getQuestionId(), levelCode);
+             int kdtotal = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage(), markTask.getQuestionId());
+             if ((kdcount + 1.0D) / kdtotal * 1.0D > kdpt / 100.D) {
+             throw new RuntimeException(levelCode + "档已满,考点阀值已达" + kdpt + "%。");
+             }
+             */
 
-        MarkUser maker = markUserRepo.findOne(markTask.getMarkerId());
-        Level level = levelRepo.findByWorkIdAndCode(markTask.getWorkId(), levelCode);
+            MarkUser maker = markUserRepo.findOne(markTask.getMarkerId());
+            Level level = levelRepo.findByWorkIdAndCode(markTask.getWorkId(), levelCode);
 
-        markTask.setResult(levelCode);
-        markTask.setLevelValue(level.getLevelValue());
-        markTask.setRejected(false);
-        markTask.setUpdatedOn(new Date());
-        markTask.setMarkerName(maker.getName());
-        //激活试卷
+            markTask.setResult(levelCode);
+            markTask.setLevelValue(level.getLevelValue());
+            markTask.setRejected(false);
+            markTask.setUpdatedOn(new Date());
+            markTask.setMarkerName(maker.getName());
+            //激活试卷
 //        markTask.setActive(true);
 
-        markTaskRepo.save(markTask);
+            markTaskRepo.save(markTask);
 
-        //判断该任务的试卷是否所有评卷员都评完,要进行仲裁判定或定档
-        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()];
-            //定档
-            DeterResult determine = determineLevelService.determine(markingConfig.isMajority(), markTasks.toArray(sources));
-            //1.过半定档
-            if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult()) && determine.getDeterType() == DetermineLevelService.DeterType.MAJORITY) {
-                paper.determineLevel(determine.getResult());
-                paper.setMarkedLogic(false);
-                //档位落差值日志
-                levelsLog(markTasks, paper);
-            } else {
-                int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
-                boolean result = ArbitrationService.arbitrate(markingConfig.getDeviation(), values);
-                //2.最大落差超过仲裁档位,则仲裁打回
-                if (result) {
-                    //仲裁
-                    paper.arbitrate();
-                }
-                //3.最大落差未超过仲裁档位,则权重计算定档
-                else if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult()) && determine.getDeterType() == DetermineLevelService.DeterType.WEIGHT) {
+            //判断该任务的试卷是否所有评卷员都评完,要进行仲裁判定或定档
+
+            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()];
+                //定档
+                DeterResult determine = determineLevelService.determine(markingConfig.isMajority(), markTasks.toArray(sources));
+                //1.过半定档
+                if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult()) && determine.getDeterType() == DetermineLevelService.DeterType.MAJORITY) {
                     paper.determineLevel(determine.getResult());
-                    paper.setMarkedLogic(true);
+                    paper.setMarkedLogic(false);
                     //档位落差值日志
                     levelsLog(markTasks, paper);
+                } else {
+                    int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
+                    boolean result = ArbitrationService.arbitrate(markingConfig.getDeviation(), values);
+                    //2.最大落差超过仲裁档位,则仲裁打回
+                    if (result) {
+                        //仲裁
+                        paper.arbitrate();
+                    }
+                    //3.最大落差未超过仲裁档位,则权重计算定档
+                    else if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult()) && determine.getDeterType() == DetermineLevelService.DeterType.WEIGHT) {
+                        paper.determineLevel(determine.getResult());
+                        paper.setMarkedLogic(true);
+                        //档位落差值日志
+                        levelsLog(markTasks, paper);
+                    }
                 }
+                paperRepo.save(paper);
             }
-            paperRepo.save(paper);
         }
+        long end = System.currentTimeMillis();
+        LOG.info("提交分档耗时:{}", (end - start) / 1000 + "s");
         return markTask;
     }
 
@@ -280,15 +287,17 @@ public class MarkingService {
         markTask.setMarkerName(maker.getName());
         markTaskRepo.save(markTask);
         Paper paper = markTask.getPaper();
-        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();
-            //湖北省,平均分非零进一
-            double fs = markingConfig.isRoundUp() ? Math.ceil(finalScore.orElse(0)) : Math.round(finalScore.orElse(0));
-            paper.setScore(fs);
-            paperRepo.save(paper);
+        synchronized (paper.getId()) {
+            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();
+                //湖北省,平均分非零进一
+                double fs = markingConfig.isRoundUp() ? Math.ceil(finalScore.orElse(0)) : Math.round(finalScore.orElse(0));
+                paper.setScore(fs);
+                paperRepo.save(paper);
+            }
         }
         return markTask;
     }