|
@@ -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;
|
|
|
}
|