|
@@ -4,8 +4,12 @@ import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.OptionalDouble;
|
|
|
|
|
|
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
|
|
|
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
|
|
|
import cn.com.qmth.stmms.ms.marking.config.MarkingConfig;
|
|
|
import cn.com.qmth.stmms.ms.marking.service.arbitration.ArbitrationService;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -25,6 +29,7 @@ import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
|
|
|
@Service
|
|
|
public class MarkingService {
|
|
|
|
|
|
+ private static final Logger LOG = LoggerFactory.getLogger(MarkingService.class);
|
|
|
@Autowired
|
|
|
private MarkingConfig markingConfig;
|
|
|
|
|
@@ -34,6 +39,9 @@ public class MarkingService {
|
|
|
@Autowired
|
|
|
private MarkTaskRepo markTaskRepo;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private MarkUserRepo markUserRepo;
|
|
|
+
|
|
|
@Autowired
|
|
|
private PaperRepo paperRepo;
|
|
|
|
|
@@ -42,47 +50,70 @@ public class MarkingService {
|
|
|
|
|
|
/**
|
|
|
* 提交分档。如果每个评卷都提交了,则进行仲裁判定,如果没有触发仲裁就定档
|
|
|
+ *
|
|
|
* @param markTask
|
|
|
* @param levelCode
|
|
|
* @return
|
|
|
*/
|
|
|
@Transactional
|
|
|
- public synchronized MarkTask levelMark(MarkTask markTask, String levelCode){
|
|
|
- //TODO 回评
|
|
|
+ public synchronized MarkTask levelMark(MarkTask markTask, String levelCode) {
|
|
|
+ //TODO 回评
|
|
|
//boolean isMarked = markTask.getLevel() == null;
|
|
|
-
|
|
|
+
|
|
|
//如果已经由科组长定档,则不做处理
|
|
|
Paper paper = markTask.getPaper();
|
|
|
- Level level = levelRepo.findByWorkIdAndCode(markTask.getWorkId(),levelCode);
|
|
|
+ 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());
|
|
|
+
|
|
|
+ LOG.info("pt = {}, count = {}, total = {}", pt, count, total);
|
|
|
+ if ((count + 1.0D) / total * 1.0D > pt / 100.D) {
|
|
|
+
|
|
|
+ throw new RuntimeException(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());
|
|
|
+
|
|
|
markTaskRepo.save(markTask);
|
|
|
|
|
|
//判断该任务的试卷是否所有评卷员都评完,要进行仲裁判定或定档
|
|
|
- if(paper.isMarkByLeader()){
|
|
|
- return markTask;
|
|
|
- }
|
|
|
- List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(),markTask.getStage());
|
|
|
+ List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markTask.getStage());
|
|
|
long leftCount = markTasks.stream().filter(i -> i.getResult() == null).count();
|
|
|
- if(leftCount == 0){
|
|
|
+ if (leftCount == 0) {
|
|
|
MarkTask[] sources = new MarkTask[markTasks.size()];
|
|
|
int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
|
|
|
- boolean result = ArbitrationService.arbitrate(markingConfig.getDeviation(),values);
|
|
|
- if(result){
|
|
|
+ boolean result = ArbitrationService.arbitrate(markingConfig.getDeviation(), values);
|
|
|
+ if (result) {
|
|
|
//仲裁
|
|
|
paper.arbitrate();
|
|
|
- }
|
|
|
- else{
|
|
|
+ } else {
|
|
|
//定档
|
|
|
DeterResult determine = determineLevelService.determine(markTasks.toArray(sources));
|
|
|
paper.determineLevel(determine.getResult());
|
|
|
- if(determine.getDeterType() == DetermineLevelService.DeterType.WEIGHT){
|
|
|
+ if (determine.getDeterType() == DetermineLevelService.DeterType.WEIGHT) {
|
|
|
paper.setMarkedLogic(true);
|
|
|
- }
|
|
|
- else{
|
|
|
+ } else {
|
|
|
paper.setMarkedLogic(false);
|
|
|
}
|
|
|
}
|
|
@@ -93,16 +124,17 @@ public class MarkingService {
|
|
|
|
|
|
/**
|
|
|
* 直接给试卷分档
|
|
|
+ *
|
|
|
* @param paper
|
|
|
* @param level
|
|
|
*/
|
|
|
@Transactional
|
|
|
- public Paper levelMarkPaper(Paper paper,String level){
|
|
|
+ public Paper levelMarkPaper(Paper paper, String level) {
|
|
|
paper.determineLevel(level);
|
|
|
paper.setMarkByLeader(true);
|
|
|
paperRepo.save(paper);
|
|
|
- List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(),MarkStage.LEVEL);
|
|
|
- for(MarkTask markTask : markTasks){
|
|
|
+ List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
|
|
|
+ for (MarkTask markTask : markTasks) {
|
|
|
markTask.setResult(level);
|
|
|
}
|
|
|
markTaskRepo.save(markTasks);
|
|
@@ -114,15 +146,16 @@ public class MarkingService {
|
|
|
* 更新试卷状态
|
|
|
* 更新评卷任务状态为打回
|
|
|
* 如果评卷任务的档位和建议档位一致,不打回该任务
|
|
|
+ *
|
|
|
* @param paper
|
|
|
* @param redoLevel 建议重评档位
|
|
|
*/
|
|
|
@Transactional
|
|
|
- public Paper reject(Paper paper,String redoLevel){
|
|
|
+ public Paper reject(Paper paper, String redoLevel) {
|
|
|
paper.reject(redoLevel);
|
|
|
List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
|
|
|
- for(MarkTask markTask : markTasks){
|
|
|
- if(markTask.getResult() != null && !markTask.getResult().toString().equals(redoLevel)) {
|
|
|
+ for (MarkTask markTask : markTasks) {
|
|
|
+ if (markTask.getResult() != null && !markTask.getResult().toString().equals(redoLevel)) {
|
|
|
markTask.setRejected(true);
|
|
|
markTask.setOriginLevel(markTask.getResult());
|
|
|
markTask.setResult(null);
|
|
@@ -135,21 +168,24 @@ public class MarkingService {
|
|
|
|
|
|
/**
|
|
|
* 打分。取出组内所有评分,如果都给了分,取平均分更新试卷成绩
|
|
|
+ *
|
|
|
* @param markTask
|
|
|
* @param score
|
|
|
*/
|
|
|
@Transactional
|
|
|
- public MarkTask scoring(MarkTask markTask,int score){
|
|
|
- if(markTask.getStage() != MarkStage.SCORE){
|
|
|
+ public MarkTask scoring(MarkTask markTask, int score) {
|
|
|
+ if (markTask.getStage() != MarkStage.SCORE) {
|
|
|
throw new RuntimeException("该任务不是打分任务");
|
|
|
}
|
|
|
markTask.setResult(String.valueOf(score));
|
|
|
markTask.setUpdatedOn(new Date());
|
|
|
+ MarkUser maker = markUserRepo.findOne(markTask.getMarkerId());
|
|
|
+ markTask.setMarkerName(maker.getName());
|
|
|
markTaskRepo.save(markTask);
|
|
|
Paper paper = markTask.getPaper();
|
|
|
- List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(),markTask.getStage());
|
|
|
+ List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markTask.getStage());
|
|
|
long leftCount = markTasks.stream().filter(i -> i.getResult() == null).count();
|
|
|
- if(leftCount == 0){
|
|
|
+ if (leftCount == 0) {
|
|
|
OptionalDouble finalScore = markTasks.stream().map(m -> m.getResult())
|
|
|
.mapToInt(Integer::valueOf).average();
|
|
|
double fs = Math.round(finalScore.orElse(0));
|