소스 검색

美术阅卷11月新增需求-修改synchronize同步

wangliang 5 년 전
부모
커밋
105155b680

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

@@ -173,11 +173,15 @@ public class MarkTaskApi {
         }
         switch (stage) {
             case LEVEL:
-                markingService.levelMark(markTask, result);
+                synchronized (this) {
+                    markingService.levelMark(markTask, result);
+                }
                 break;
             case SCORE:
                 Integer score = Integer.parseInt(result);
-                markingService.scoring(markTask, score);
+                synchronized (this) {
+                    markingService.scoring(markTask, score);
+                }
                 break;
         }
         return new ResponseEntity(markTaskAssembler.toDTO(markTask, oldRejected), HttpStatus.OK);

+ 71 - 75
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -73,83 +73,81 @@ public class MarkingService {
 
         //如果已经由科组长定档,则不做处理
         Paper paper = markTask.getPaper();
-        synchronized (paper.getId()) {
-            if (paper.isMarkByLeader()) {
-                return markTask;
-            }
-            /**
-             阀值判断
+        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) {
+        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) {
                     paper.determineLevel(determine.getResult());
-                    paper.setMarkedLogic(false);
+                    paper.setMarkedLogic(true);
                     //档位落差值日志
                     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");
@@ -287,17 +285,15 @@ public class MarkingService {
         markTask.setMarkerName(maker.getName());
         markTaskRepo.save(markTask);
         Paper paper = markTask.getPaper();
-        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);
-            }
+        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;
     }