BatchScoreTest.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import cn.com.qmth.stmms.ms.Application;
  2. import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
  3. import cn.com.qmth.stmms.ms.core.domain.Level;
  4. import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
  5. import cn.com.qmth.stmms.ms.core.domain.Paper;
  6. import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskScore;
  7. import cn.com.qmth.stmms.ms.core.repository.*;
  8. import cn.com.qmth.stmms.ms.core.vo.Subject;
  9. import org.junit.Test;
  10. import org.junit.runner.RunWith;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.boot.test.context.SpringBootTest;
  15. import org.springframework.test.context.junit4.SpringRunner;
  16. import org.springframework.util.CollectionUtils;
  17. import org.springframework.util.StringUtils;
  18. import java.util.ArrayList;
  19. import java.util.Arrays;
  20. import java.util.List;
  21. import java.util.Objects;
  22. import java.util.stream.Collectors;
  23. @RunWith(SpringRunner.class)
  24. @SpringBootTest(classes = {Application.class})
  25. // 指定启动类
  26. public class BatchScoreTest {
  27. private static final Logger logger = LoggerFactory.getLogger(BatchScoreTest.class);
  28. @Autowired
  29. private PaperRepo paperRepo;
  30. @Autowired
  31. private MarkSubjectRepo markSubjectRepo;
  32. @Autowired
  33. private MarkTaskScoreRepo markTaskScoreRepo;
  34. @Autowired
  35. private LevelRepo levelRepo;
  36. @Autowired
  37. RandomUtil randomUtil;
  38. // 工作id
  39. private static Long WORK_ID = 1L;
  40. // 生成科目
  41. private List<Subject> subjects = Arrays.asList(Subject.SC);
  42. /**
  43. * 批量打分
  44. *
  45. * @throws Exception
  46. */
  47. // @Test
  48. public void level() {
  49. List<Level> levels = levelRepo.findByWorkIdOrderByCode(WORK_ID);
  50. doScore(levels);
  51. }
  52. private void doScore(List<Level> levels) {
  53. if (CollectionUtils.isEmpty(levels)) {
  54. throw new RuntimeException("档位值不存在");
  55. }
  56. for (Subject subject : subjects) {
  57. List<Paper> list = new ArrayList<>();
  58. List<MarkTaskScore> listTask = new ArrayList<>();
  59. MarkSubject markSubject = markSubjectRepo.findOne(WORK_ID + "-" + subject.name());
  60. List<Paper> papers = paperRepo.findByWorkIdAndSubject(WORK_ID, subject);
  61. papers = papers.stream().filter(m -> Objects.nonNull(m.getScoreBatchNo()) && StringUtils.isEmpty(m.getScore())).collect(Collectors.toList());
  62. for (Paper paper : papers) {
  63. Double score = calcScore(levels, paper);
  64. paper.setScore(score);
  65. list.add(paper);
  66. List<MarkTaskScore> markTasks = markTaskScoreRepo.findByPaperIdAndStage(paper.getId(), markSubject.getStage());
  67. for (MarkTaskScore markTask : markTasks) {
  68. markTask.setResult(score.toString());
  69. listTask.add(markTask);
  70. }
  71. }
  72. List<Paper> data1 = new ArrayList<>();
  73. for (Paper p : list) {
  74. if (data1.size() == 2000) {
  75. paperRepo.save(data1);
  76. data1.clear();
  77. }
  78. data1.add(p);
  79. }
  80. //将剩下的数据也导入
  81. if (!data1.isEmpty()) {
  82. paperRepo.save(data1);
  83. }
  84. List<MarkTaskScore> data2 = new ArrayList<>();
  85. for (MarkTaskScore p : listTask) {
  86. if (data2.size() == 2000) {
  87. markTaskScoreRepo.save(data2);
  88. data2.clear();
  89. }
  90. data2.add(p);
  91. }
  92. //将剩下的数据也导入
  93. if (!data2.isEmpty()) {
  94. markTaskScoreRepo.save(data2);
  95. }
  96. }
  97. }
  98. private Double calcScore(List<Level> levels, Paper paper) {
  99. Level level = levels.stream().filter(m -> m.getCode().equals(paper.getLevel())).findFirst().orElseGet(null);
  100. Double score = 0D;
  101. if (level != null) {
  102. int random = getRandom(level.getMaxScore().intValue() - level.getMinScore().intValue());
  103. int scoreTemp = level.getMinScore().intValue() + random;
  104. if (scoreTemp - level.getMaxScore().intValue() > 0) {
  105. scoreTemp = level.getMaxScore().intValue();
  106. }
  107. score = Double.valueOf(scoreTemp);
  108. }
  109. return score;
  110. }
  111. private int getRandom(int size) {
  112. return (int) (Math.random() * size);
  113. }
  114. }