Explorar o código

联考版-v3.1.0-优化代码

xiaof %!s(int64=2) %!d(string=hai) anos
pai
achega
815f4c149a
Modificáronse 21 ficheiros con 231 adicións e 460 borrados
  1. 4 8
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/WorkApi.java
  2. 2 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java
  3. 3 5
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  4. 0 113
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/RandomUtil.java
  5. 1 3
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  6. 3 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTaskRoughLevel.java
  7. 6 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskLevelRepo.java
  8. 6 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRoughLevelRepo.java
  9. 5 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskScoreRepo.java
  10. 4 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  11. 2 5
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/StartRunning.java
  12. 41 105
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java
  13. 6 33
      stmms-ms-main/src/test/java/BatchCreateDataTest.java
  14. 1 2
      stmms-ms-main/src/test/java/BatchLevelTest.java
  15. 1 1
      stmms-ms-main/src/test/java/BatchRoughLevelTest.java
  16. 1 2
      stmms-ms-main/src/test/java/BatchScoreTest.java
  17. 12 174
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java
  18. 1 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/GroupingService.java
  19. 1 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskRoughLevelService.java
  20. 0 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java
  21. 131 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/utils/RandomUtil.java

+ 4 - 8
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/WorkApi.java

@@ -3,7 +3,7 @@ package cn.com.qmth.stmms.ms.admin.api;
 import cn.com.qmth.stmms.ms.admin.assembler.WorkOverviewAssembler;
 import cn.com.qmth.stmms.ms.admin.dto.WorkOverview;
 import cn.com.qmth.stmms.ms.admin.service.WorkService;
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
@@ -74,7 +74,7 @@ public class WorkApi {
     @RequestMapping(value = "{work}", method = RequestMethod.GET)
     public Work getOne(@PathVariable Work work) {
         if (work.isActive()) {
-            randomUtil.getRandom(work.getId(), false);
+            randomUtil.initRandom(work.getId());
         }
         int count = markTaskLevelRepo.countByWorkIdAndStageAndResultNotNull(work.getId(), MarkStage.LEVEL);
         work.setModifyOtherVal(count == 0);
@@ -90,7 +90,7 @@ public class WorkApi {
     public void create(@RequestBody Work work) {
         workService.save(work);
         //生成随机数
-        randomUtil.getRandom(work.getId(), false);
+        randomUtil.initRandom(work.getId());
     }
 
     /**
@@ -154,7 +154,7 @@ public class WorkApi {
             w.setActive(false);
             if (w.getId().equals(workId)) {
                 w.setActive(true);
-                randomUtil.getRandom(workId, false);
+                randomUtil.initRandom(workId);
             }
         }
         workRepo.save(works);
@@ -202,10 +202,6 @@ public class WorkApi {
      */
     @GetMapping("{work}/overview")
     public WorkOverview overview(@PathVariable Work work) {
-        //生成随机数,已生成的工作,直接跳过
-        if (randomUtil.getRandomMap().get(work.getId()) == null) {
-            randomUtil.getRandom(work.getId(), false);
-        }
         return workOverviewAssembler.toDTO(work);
     }
 

+ 2 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java

@@ -65,7 +65,7 @@ public class WorkOverviewAssembler {
             for (SubjectOverview so : subjectOverviews) {
                 subjectMap.put(so.getSubject(), 0L);
             }
-            for (Student student : students) {
+            students.forEach(student -> {
                 String[] uploadStatus = student.getUploadStatus().split(",");
                 for (String s : uploadStatus) {
                     if ("1".equals(s.split(":")[1])) {
@@ -76,7 +76,7 @@ public class WorkOverviewAssembler {
                         subjectMap.put(s.split(":")[0], ++c);
                     }
                 }
-            }
+            });
             for (SubjectOverview so : subjectOverviews) {
                 so.setUploadedCount(subjectMap.get(so.getSubject()));
                 so.setLeftCount(workOverview.getStuTotalCount() - workOverview.getStuAbsentCount() - so.getUploadedCount());

+ 3 - 5
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -2,13 +2,13 @@ package cn.com.qmth.stmms.ms.admin.service;
 
 import cn.com.qmth.stmms.ms.admin.dto.StudentDTO;
 import cn.com.qmth.stmms.ms.admin.dto.StudentRelateDTO;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.config.ImageCompressionConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageServerConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelError;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelReader;
@@ -208,7 +208,6 @@ public class DataUploadService {
             }
 
             List<Paper> allPapers = paperRepo.findByWorkIdAndSubjectAndTest(student.getWorkId(), subject, TrialEnum.DEFAULT.getId());
-            Map<Long, Object> randomMap = allPapers.stream().filter(m -> m.getRandomSeq() != null).collect(Collectors.toMap(Paper::getRandomSeq, Paper::getId));
 
             Paper exist = allPapers.stream().filter(m -> student.getExamNumber().equals(m.getExamNumber())).collect(Collectors.toList()).get(0);
             String sheetMD5 = DigestUtils.md5Hex(sheetIn);
@@ -223,7 +222,7 @@ public class DataUploadService {
                 paperRepo.save(exist);
             } else {
                 ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(student.getWorkId(), subject, student.getAreaCode());
-                Long random = randomUtil.getRandom(student.getWorkId(), randomMap);
+                Long random = randomUtil.randomPaper(student.getWorkId());
                 Paper paper = new Paper(student.getWorkId(), subject, examQuestion, student, false, random);
                 paper.setSheetMD5(sheetMD5);
                 paper.setSliceMD5(sliceMD5);
@@ -520,11 +519,10 @@ public class DataUploadService {
         ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(student.getWorkId(), subject, student.getAreaCode());
 
         List<Paper> allPapers = paperRepo.findByWorkIdAndSubjectAndTest(student.getWorkId(), subject, TrialEnum.DEFAULT.getId());
-        Map<Long, Object> randomMap = allPapers.stream().filter(m -> m.getRandomSeq() != null).collect(Collectors.toMap(Paper::getRandomSeq, Paper::getId));
         List<Paper> filterList = allPapers.stream().filter(m -> student.getExamNumber().equals(m.getExamNumber())).collect(Collectors.toList());
         Paper paper = filterList.isEmpty() ? null : filterList.get(0);
         if (paper == null) {
-            Long random = randomUtil.getRandom(student.getWorkId(), randomMap);
+            Long random = randomUtil.randomPaper(student.getWorkId());
             paper = new Paper(student.getWorkId(), subject, examQuestion, student, isManual, random);
         }
         paper.setUploadedOn(new Date());

+ 0 - 113
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/RandomUtil.java

@@ -1,113 +0,0 @@
-package cn.com.qmth.stmms.ms.commons.utils;
-
-import cn.com.qmth.stmms.ms.commons.threadPool.MyThreadPool;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-
-/**
- * @Description: 随机数生成工具类
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2019/10/24
- */
-@Component
-public class RandomUtil {
-    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(RandomUtil.class);
-    private final int minSize = 10000000;
-    private final int maxSize = 10000001;
-    private final int randomSize = 2000000;
-    private int randomNum = 0;
-    private Map<Long, List<Long>> randomMap = new HashMap<>();
-//    public static List<Long> randomList = new ArrayList<>();
-
-    @Autowired
-    MyThreadPool myThreadPool;
-
-    /**
-     * 根据workId随机生成百万随机数
-     *
-     * @param workId
-     * @param againRandom
-     */
-    public void getRandom(Long workId, boolean againRandom) {
-        List list = randomMap.get(workId);
-        if (Objects.isNull(list)) {
-//            randomMap.clear();
-            list = new ArrayList(randomSize);
-        }
-        if (list.size() == 0 || againRandom) {
-            long start = System.currentTimeMillis();
-            if (againRandom) {
-//                randomMap.clear();
-                list = new ArrayList(randomSize);
-                randomNum++;
-            }
-            Long randomReq = workId % 10;
-            randomReq = randomReq + randomNum;
-            if (randomReq > 9) {
-                randomReq = randomReq % 10;
-            }
-            randomReq = randomReq == 0L ? (long) (Math.random() * 9 + 1) : randomReq;
-            LOGGER.info("workId:{},开始生成随机数:{},randomReq:{}", workId, start, randomReq);
-            Long finalRandomReq = randomReq;
-            List finalList = list;
-
-            myThreadPool.arbitratePoolTaskExecutor.execute(new Runnable() {
-                @Override
-                public void run() {
-                    Set<Long> set = new HashSet<>(randomSize);
-                    for (int i = 0; i < randomSize; i++) {
-                        long id = (long) (Math.random() * minSize + maxSize * finalRandomReq);
-                        set.add(id);
-                    }
-                    finalList.addAll(set);
-                    set.clear();
-                    randomMap.put(workId, finalList);
-                    long end = System.currentTimeMillis();
-                    LOGGER.info("workId:{},生成随机数耗时:{},数据长度为:{}", workId, (end - start) / 1000 + "s", finalList.size());
-                }
-            });
-        }
-    }
-
-    /**
-     * 获取随机号
-     *
-     * @param workId 工作ID
-     * @param usedRandomMap 使用过的密号集合
-     */
-    public Long getRandom(Long workId, Map<Long, Object> usedRandomMap) throws Exception {
-        int count = 0;
-        Long random;
-        List<Long> randomList = randomMap.get(workId);
-        while (true) {
-            random = randomList.get(new Random().nextInt(randomMap.get(workId).size()));
-            if (Objects.isNull(usedRandomMap) || usedRandomMap.size() == 0) {
-                break;
-            }
-            if (!usedRandomMap.containsKey(random)) {
-                break;
-            }
-            count++;
-            if (count > 1000) {
-                getRandom(workId, true);
-                getRandom(workId, usedRandomMap);
-            }
-        }
-        // 用过的,直接移除
-        randomList.remove(random);
-        return random;
-    }
-
-    public Map<Long, List<Long>> getRandomMap() {
-        return randomMap;
-    }
-
-    public void setRandomMap(Map<Long, List<Long>> randomMap) {
-        this.randomMap = randomMap;
-    }
-}

+ 1 - 3
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java

@@ -202,9 +202,7 @@ public class Paper implements Serializable {
         this.questionId = examQuestion.getId();
         this.areaCode = examQuestion.getAreaCode();
         this.questionName = examQuestion.getName();
-        //随机号生成修改规则
-//        this.secretNumber = subject.ordinal() + examQuestion.getAreaCode() + examNumber.substring(3, examNumber.length());
-        this.secretNumber = subject.ordinal() + examQuestion.getAreaCode() + randomSeq;
+        this.secretNumber = subject.ordinal() + String.valueOf(randomSeq);
         this.randomSeq = randomSeq;
         this.isManual = isManual;
         this.uploadedOn = new Date();

+ 3 - 4
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTaskRoughLevel.java

@@ -1,6 +1,5 @@
 package cn.com.qmth.stmms.ms.core.domain.task;
 
-import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.RoughLevel;
@@ -158,7 +157,7 @@ public class MarkTaskRoughLevel implements Serializable {
         this.createdOn = new Date();
         //随机号生成修改规则
 //        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
-        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.secretNumber = stage.ordinal() + String.valueOf(randomSeqNew);
         this.randomSeqNew = randomSeqNew;
         this.isMark = false;
     }
@@ -172,7 +171,7 @@ public class MarkTaskRoughLevel implements Serializable {
         this.questionId = paper.getQuestionId();
         this.stage = stage;
         this.createdOn = new Date();
-        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.secretNumber = stage.ordinal() + String.valueOf(randomSeqNew);
         this.randomSeqNew = randomSeqNew;
         this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
         this.isSample = paper.isRoughSample();
@@ -188,7 +187,7 @@ public class MarkTaskRoughLevel implements Serializable {
         this.questionId = paper.getQuestionId();
         this.stage = stage;
         this.createdOn = new Date();
-        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
+        this.secretNumber = stage.ordinal() + String.valueOf(randomSeqNew);
         this.randomSeqNew = randomSeqNew;
         this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
         this.result = paper.getRoughLevel();

+ 6 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskLevelRepo.java

@@ -11,6 +11,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * Created by zhengmin on 2016/9/23.
@@ -127,6 +128,8 @@ public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, J
 
     List<MarkTaskLevel> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
 
+    List<MarkTaskLevel> findByWorkIdAndRandomSeqNew(Long workId, Long randomSeqNew);
+
     @Query(value = "SELECT count(1) from mark_task_level m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 0 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no = ?4 and m.is_rejected = false", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResultNull(Long questionId, Long markerId, int stage, Long batchNo);
 
@@ -204,4 +207,7 @@ public interface MarkTaskLevelRepo extends JpaRepository<MarkTaskLevel, Long>, J
     int countByWorkIdAndSubjectAndStageAndTest(Long workId, Subject subject, MarkStage stage, int id);
 
     MarkTaskLevel findByPaperIdAndMarkerId(Long markerId, Long userId);
+
+    @Query("select s.randomSeqNew from MarkTaskLevel s where s.workId = ?1")
+    Set<Long> listRandomByWorkId(Long workId);
 }

+ 6 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRoughLevelRepo.java

@@ -11,6 +11,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  *
@@ -107,6 +108,8 @@ public interface MarkTaskRoughLevelRepo extends JpaRepository<MarkTaskRoughLevel
 
     List<MarkTaskRoughLevel> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
 
+    List<MarkTaskRoughLevel> findByWorkIdAndRandomSeqNew(Long workId, Long randomSeqNew);
+
 
     @Query(value = "SELECT count(1) from mark_task_rough_level m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and m.batch_no = ?4 and m.is_rejected = false", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResultNull(Long questionId, Long markerId, int stage, Long batchNo);
@@ -171,4 +174,7 @@ public interface MarkTaskRoughLevelRepo extends JpaRepository<MarkTaskRoughLevel
     int countByWorkIdAndSubjectAndStageAndTest(Long workId, Subject subject, MarkStage stage, int id);
 
     MarkTaskRoughLevel findByPaperIdAndMarkerId(Long paperId, Long userId);
+
+    @Query("select s.randomSeqNew from MarkTaskRoughLevel s where s.workId = ?1")
+    Set<Long> listRandomByWorkId(Long id);
 }

+ 5 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskScoreRepo.java

@@ -11,6 +11,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * Created by zhengmin on 2016/9/23.
@@ -111,6 +112,8 @@ public interface MarkTaskScoreRepo extends JpaRepository<MarkTaskScore, Long>, J
 
     List<MarkTaskScore> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
 
+    List<MarkTaskScore> findByWorkIdAndRandomSeqNew(Long workId, Long randomSeqNew);
+
     @Query(value = "SELECT count(1) from mark_task_score m inner join paper p on m.paper_id = p.id and p.is_shift = 0 and p.is_shift_score = 0 and p.score_batch_no = ?4 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(Long questionId, Long markerId, int stage, Long batchNo);
 
@@ -158,4 +161,6 @@ public interface MarkTaskScoreRepo extends JpaRepository<MarkTaskScore, Long>, J
     @Query("select m.paper.id from MarkTaskScore m where m.workId = ?1 and m.questionId = ?2 and m.markerId = ?3 and m.stage = ?4 and m.batchNo = ?5 and m.isMark = true")
     List<Long> findByWorkIdAndQuestionIdAndMarkerIdAndStageAndBatchNoAndPaperIsMark(Long workId, Long questionId, Long id, MarkStage stage, Long batchNo);
 
+    @Query("select m.randomSeqNew from MarkTaskScore m where m.workId = ?1")
+    Set<Long> listRandomByWorkId(Long workId);
 }

+ 4 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java

@@ -10,6 +10,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * Created by zhengmin on 2016/9/23.
@@ -385,4 +386,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     void updatePaperAdminMarkById(Long paperId, boolean isMark);
 
     long countByWorkIdAndSubjectAndRoughLevelAndTest(Long workId, Subject subject, String valueOf, int test);
+
+    @Query("select p.randomSeq from Paper p where p.workId = ?1")
+    Set<Long> listRandomByWorkId(Long workId);
 }

+ 2 - 5
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/StartRunning.java

@@ -1,11 +1,10 @@
 package cn.com.qmth.stmms.ms;
 
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
@@ -29,15 +28,13 @@ public class StartRunning implements CommandLineRunner {
     @Resource
     RandomUtil randomUtil;
 
-
-
     @Override
     public void run(String... args) {
         LOGGER.info("服务器启动时执行 start");
         //对所有当前工作都生成随机数
         List<Work> works = workRepo.findAll();
         for (Work work : works) {
-            randomUtil.getRandom(work.getId(), false);
+            randomUtil.initRandom(work.getId());
         }
         LOGGER.info("服务器启动时执行 end");
     }

+ 41 - 105
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java

@@ -1,6 +1,5 @@
 package cn.com.qmth.stmms.ms.quartz;
 
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkTaskJob;
@@ -12,6 +11,7 @@ import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskScore;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.marking.service.MarkingLevelService;
 import cn.com.qmth.stmms.ms.marking.service.MarkingRoughLevelService;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.slf4j.LoggerFactory;
@@ -71,25 +71,23 @@ public class ScheduledTask implements InitializingBean {
     /**
      * 修复密号重复 30秒一次
      */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    public void repairRepeatSecretNumberTask() {
-        if (Objects.nonNull(randomUtil.getRandomMap()) && randomUtil.getRandomMap().size() > 0) {
-            List<Work> works = workRepo.findAll();
-            if (Objects.nonNull(works)) {
-                if (!this.repairPaper) {
-                    LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号进来了");
-                    for (Work work : works) {
-                        repairRepeatPaper(work.getId());
-                    }
-                    LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号结束了");
+//    @Scheduled(cron = "0 0/5 * * * ?")
+    public void repairSecretNumberTask() {
+        List<Work> works = workRepo.findAll();
+        if (Objects.nonNull(works)) {
+            if (!this.repairPaper) {
+                LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号进来了");
+                for (Work work : works) {
+                    repairPaper(work.getId());
                 }
-                if (!this.repairTask) {
-                    LOGGER.info("repairRepeatSecretNumberTask 修复任务密号进来了");
-                    for (Work work : works) {
-                        repairRepeatTask(work.getId());
-                    }
-                    LOGGER.info("repairRepeatSecretNumberTask 修复任务密号结束了");
+                LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号结束了");
+            }
+            if (!this.repairTask) {
+                LOGGER.info("repairRepeatSecretNumberTask 修复任务密号进来了");
+                for (Work work : works) {
+                    repairTask(work.getId());
                 }
+                LOGGER.info("repairRepeatSecretNumberTask 修复任务密号结束了");
             }
         }
     }
@@ -114,13 +112,11 @@ public class ScheduledTask implements InitializingBean {
     /**
      * 修复异步任务日志遗漏
      *
-     * @param work
+     * @param work 工作
      */
     public void repairMarkTaskJob(Work work) {
         try {
-            // todo 需要改 20220802
             List<MarkTaskJob> markTaskJobList = markTaskJobRepo.findAllByStatusIsFalseAndWorkId(work.getId());
-
             if (Objects.nonNull(markTaskJobList) && !markTaskJobList.isEmpty()) {
                 long startTime = System.currentTimeMillis();
                 this.markTaskJob = true;
@@ -162,10 +158,10 @@ public class ScheduledTask implements InitializingBean {
     /**
      * 修复试卷密号
      *
-     * @param workId
+     * @param workId 工作ID
      */
     @Transactional
-    public void repairRepeatPaper(Long workId) {
+    public void repairPaper(Long workId) {
         try {
             String sql = "select * from (select p.random_seq, count(p.random_seq) as seq from paper p where p.work_id = ? group by p.random_seq) temp where temp.seq > 1 LIMIT 500";
             List list = sqlUtil.execSqlForMapNative(sql, workId);
@@ -178,8 +174,8 @@ public class ScheduledTask implements InitializingBean {
                     List<Paper> paperList = paperRepo.findByRandomSeq(randomSeq);
                     paperList.remove(0);//删除一条
                     for (Paper paper : paperList) {
-                        Long randomNew = this.getRandomPaper(paper.getWorkId(), paper.getExamNumber());
-                        String secretNumberNew = paper.getSubject().ordinal() + paper.getAreaCode() + randomNew;
+                        Long randomNew = randomUtil.randomPaper(workId);
+                        String secretNumberNew = paper.getSubject().ordinal() + String.valueOf(randomSeq);
                         paper.setRandomSeq(randomNew);
                         paper.setSecretNumber(secretNumberNew);
                         papers.add(paper);
@@ -204,7 +200,7 @@ public class ScheduledTask implements InitializingBean {
      * @param workId 工作ID
      */
     @Transactional
-    public void repairRepeatTask(Long workId) {
+    public void repairTask(Long workId) {
         try {
             repairMarkTaskRoughLevel(workId);
             repairMarkTaskLevel(workId);
@@ -218,143 +214,83 @@ public class ScheduledTask implements InitializingBean {
     }
 
     private void repairMarkTaskRoughLevel(Long workId) {
-        String sql = "select * from (select mt.secret_number, count(mt.secret_number) as seq from mark_task_rough_level mt where mt.work_id = ? group by mt.secret_number) temp where temp.seq > 1 LIMIT 500";
+        String sql = "select mt.random_seq_new, count(1) as seq from mark_task_rough_level mt where mt.work_id = ? group by mt.random_seq_new having count(1) > 1 LIMIT 100";
         List list = sqlUtil.execSqlForMapNative(sql, workId);
         Set tasks = new HashSet();
         if (Objects.nonNull(list) && !list.isEmpty()) {
             this.repairTask = true;
             for (int i = 0; i < list.size(); i++) {
                 Map map = (Map) list.get(i);
-                String randomSeq = String.valueOf(map.get("secret_number"));
-                List<MarkTaskRoughLevel> markTaskList = markTaskRoughLevelRepo.findByWorkIdAndSecretNumber(workId, randomSeq);
+                Long randomSeq = Long.valueOf(map.get("random_seq_new").toString());
+                List<MarkTaskRoughLevel> markTaskList = markTaskRoughLevelRepo.findByWorkIdAndRandomSeqNew(workId, randomSeq);
                 markTaskList.remove(0);//删除一条
                 for (MarkTaskRoughLevel markTask : markTaskList) {
-                    Long randomNew = this.getRandomTask(markTask.getMarkerId(), markTask.getPaper().getId(), markTask.getWorkId(), markTask.getPaper().getExamNumber(), MarkStage.ROUGH_LEVEL);
-                    String secretNumberNew = markTask.getMarkerId() + markTask.getSubject().ordinal() + markTask.getPaper().getAreaCode() + randomNew;
+                    Long randomNew = randomUtil.randomRoughLevel(workId);
+                    String secretNumberNew = MarkStage.ROUGH_LEVEL.ordinal() + String.valueOf(randomNew);
+                    markTask.setRandomSeqNew(randomNew);
                     markTask.setSecretNumber(secretNumberNew);
                     tasks.add(markTask);
                 }
             }
         }
         if (!tasks.isEmpty()) {
-            LOGGER.info("需要修改的task数为:{}", tasks.size());
             markTaskRoughLevelRepo.save(tasks);
         }
     }
 
     private void repairMarkTaskLevel(Long workId) {
-        String sql = "select * from (select mt.secret_number, count(mt.secret_number) as seq from mark_task_level mt where mt.work_id = ? group by mt.secret_number) temp where temp.seq > 1 LIMIT 500";
+        String sql = "select mt.random_seq_new, count(1) as seq from mark_task_level mt where mt.work_id = ? group by mt.secret_number having count(1) > 1 LIMIT 100";
         List list = sqlUtil.execSqlForMapNative(sql, workId);
         Set tasks = new HashSet();
         if (Objects.nonNull(list) && !list.isEmpty()) {
             this.repairTask = true;
             for (int i = 0; i < list.size(); i++) {
                 Map map = (Map) list.get(i);
-                String randomSeq = String.valueOf(map.get("secret_number"));
-                List<MarkTaskLevel> markTaskList = markTaskLevelRepo.findByWorkIdAndSecretNumber(workId, randomSeq);
+                Long randomSeq = Long.valueOf(map.get("random_seq_new").toString());
+                List<MarkTaskLevel> markTaskList = markTaskLevelRepo.findByWorkIdAndRandomSeqNew(workId, randomSeq);
                 markTaskList.remove(0);//删除一条
                 for (MarkTaskLevel markTask : markTaskList) {
-                    Long randomNew = this.getRandomTask(markTask.getMarkerId(), markTask.getPaper().getId(), markTask.getWorkId(), markTask.getPaper().getExamNumber(), MarkStage.LEVEL);
-                    String secretNumberNew = markTask.getMarkerId() + markTask.getSubject().ordinal() + markTask.getPaper().getAreaCode() + randomNew;
+                    Long randomNew = randomUtil.randomLevel(workId);
+                    String secretNumberNew = MarkStage.LEVEL.ordinal() + String.valueOf(randomNew);
+                    markTask.setRandomSeqNew(randomNew);
                     markTask.setSecretNumber(secretNumberNew);
                     tasks.add(markTask);
                 }
             }
         }
         if (!tasks.isEmpty()) {
-            LOGGER.info("需要修改的task数为:{}", tasks.size());
             markTaskLevelRepo.save(tasks);
         }
     }
 
     private void repairMarkTaskScore(Long workId) {
-        String sql = "select * from (select mt.secret_number, count(mt.secret_number) as seq from mark_task_score mt where mt.work_id = ? group by mt.secret_number) temp where temp.seq > 1 LIMIT 500";
+        String sql = "select mt.random_seq_new, count(1) as seq from mark_task_score mt where mt.work_id = ? group by mt.secret_number having count(1) > 1 LIMIT 100";
         List list = sqlUtil.execSqlForMapNative(sql, workId);
         Set tasks = new HashSet();
         if (Objects.nonNull(list) && !list.isEmpty()) {
             this.repairTask = true;
             for (int i = 0; i < list.size(); i++) {
                 Map map = (Map) list.get(i);
-                String randomSeq = String.valueOf(map.get("secret_number"));
-                List<MarkTaskScore> markTaskList = markTaskScoreRepo.findByWorkIdAndSecretNumber(workId, randomSeq);
+                Long randomSeq = Long.valueOf(map.get("random_seq_new").toString());
+                List<MarkTaskScore> markTaskList = markTaskScoreRepo.findByWorkIdAndRandomSeqNew(workId, randomSeq);
                 markTaskList.remove(0);//删除一条
                 for (MarkTaskScore markTask : markTaskList) {
-                    Long randomNew = this.getRandomTask(markTask.getMarkerId(), markTask.getPaper().getId(), markTask.getWorkId(), markTask.getPaper().getExamNumber(), MarkStage.SCORE);
-                    String secretNumberNew = markTask.getMarkerId() + markTask.getSubject().ordinal() + markTask.getPaper().getAreaCode() + randomNew;
+                    Long randomNew = randomUtil.randomScore(workId);
+                    String secretNumberNew = MarkStage.SCORE + String.valueOf(randomNew);
+                    markTask.setRandomSeqNew(randomNew);
                     markTask.setSecretNumber(secretNumberNew);
                     tasks.add(markTask);
                 }
             }
         }
         if (!tasks.isEmpty()) {
-            LOGGER.info("需要修改的task数为:{}", tasks.size());
             markTaskScoreRepo.save(tasks);
         }
     }
 
-    /**
-     * 修复试卷随机号
-     *
-     * @param workId
-     * @param examNumber
-     * @return
-     */
-    private Long getRandomPaper(Long workId, String examNumber) {
-        int count = 0, result = 0;
-        Long random = 0L;
-        while (true) {
-            random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
-            result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
-            if (result == 0 && Long.parseLong(examNumber) != random) {
-                break;
-            } else {
-                count++;
-            }
-            if (count > 1000) {
-                randomUtil.getRandom(workId, true);
-                getRandomPaper(workId, examNumber);
-            }
-        }
-        return random;
-    }
-
-    /**
-     * 修复任务随机号
-     *
-     * @param markerId
-     * @param paperId
-     * @param workId
-     * @param examNumber
-     * @return
-     */
-    private Long getRandomTask(Long markerId, Long paperId, Long workId, String examNumber, MarkStage stage) {
-        int count = 0, result = 0;
-        Long random = 0L;
-        while (true) {
-            random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
-            if (MarkStage.ROUGH_LEVEL.equals(stage)) {
-                result = markTaskRoughLevelRepo.countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(markerId, paperId, workId, random);
-            } else if (MarkStage.LEVEL.equals(stage)) {
-                result = markTaskLevelRepo.countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(markerId, paperId, workId, random);
-            } else if (MarkStage.SCORE.equals(stage)) {
-                result = markTaskScoreRepo.countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(markerId, paperId, workId, random);
-            }
-            if (result == 0 && Long.parseLong(examNumber) != random) {
-                break;
-            } else {
-                count++;
-            }
-            if (count > 1000) {
-                randomUtil.getRandom(workId, true);
-                getRandomTask(markerId, paperId, workId, examNumber, stage);
-            }
-        }
-        return random;
-    }
-
     @Override
     public void afterPropertiesSet() {
-        this.repairRepeatSecretNumberTask();
+        this.repairSecretNumberTask();
         this.markTaskJob();
     }
 }

+ 6 - 33
stmms-ms-main/src/test/java/BatchCreateDataTest.java

@@ -1,15 +1,14 @@
 import cn.com.qmth.stmms.ms.Application;
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import net.coobird.thumbnailator.Thumbnails;
-import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -92,7 +91,10 @@ public class BatchCreateDataTest {
         // 生成用户
         createUser();
 
-        randomUtil.getRandom(WORK_ID, false);
+        randomUtil.randomPaper(WORK_ID);
+        randomUtil.randomRoughLevel(WORK_ID);
+        randomUtil.randomLevel(WORK_ID);
+        randomUtil.randomScore(WORK_ID);
 
         //生成exam_question信息
         List<ExamQuestion> questions = createQuestions();
@@ -303,7 +305,7 @@ public class BatchCreateDataTest {
         for (Subject subject : subjects) {
             ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(WORK_ID, subject, "1");
             for (Student student : students) {
-                Long random = getRandom(student.getWorkId(), student.getExamNumber());
+                Long random = randomUtil.randomPaper(student.getWorkId());
                 Paper paper = new Paper(student.getWorkId(), subject, examQuestion, student, false, random);
                 papers.add(paper);
             }
@@ -346,33 +348,4 @@ public class BatchCreateDataTest {
             Thumbnails.of(in).scale(1f).toFile(new File(thumbDir, student.getExamNumber() + ".jpg"));
         }
     }
-
-    /**
-     * 获取随机号
-     *
-     * @param workId
-     * @param examNumber
-     * @return
-     * @throws Exception
-     */
-    public Long getRandom(Long workId, String examNumber) throws Exception {
-        int count = 0, result = 0;
-        Long random = 0L;
-        while (true) {
-            random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
-//            random = RandomUtil.randomList.get(new Random().nextInt(RandomUtil.randomList.size()));
-            result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
-            if (result == 0 && random != Long.parseLong(examNumber.substring(3, examNumber.length()))) {
-                break;
-            } else {
-                count++;
-            }
-            if (count > 1000) {
-//                throw new Exception("重复几率较高,建议重新生成随机号");
-                randomUtil.getRandom(workId, true);
-                getRandom(workId, examNumber);
-            }
-        }
-        return random;
-    }
 }

+ 1 - 2
stmms-ms-main/src/test/java/BatchLevelTest.java

@@ -1,5 +1,5 @@
 import cn.com.qmth.stmms.ms.Application;
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
@@ -9,7 +9,6 @@ import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskLevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
-import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 1 - 1
stmms-ms-main/src/test/java/BatchRoughLevelTest.java

@@ -1,5 +1,5 @@
 import cn.com.qmth.stmms.ms.Application;
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;

+ 1 - 2
stmms-ms-main/src/test/java/BatchScoreTest.java

@@ -1,12 +1,11 @@
 import cn.com.qmth.stmms.ms.Application;
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTaskScore;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
-import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 12 - 174
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java

@@ -1,6 +1,5 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
@@ -11,6 +10,7 @@ import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -70,9 +70,6 @@ public class AssignTaskService {
         long currentTime = System.currentTimeMillis();
         List<MarkTaskRoughLevel> markTaskLevelList = new ArrayList<>();
         List<Paper> paperList = new ArrayList<>();
-        List<Object[]> markTasks = markTaskRoughLevelRepo.findAllByWorkId(markSubject.getWorkId());
-        Map<Long, Object> randomMap = new HashMap<>();
-        markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
         // 解析粗档位
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         List<RoughLevel> roughLevels = DetermineRoughLevelService.parseRoughLevels(levels);
@@ -81,14 +78,18 @@ public class AssignTaskService {
         for (Map.Entry<Long, List<Paper>> entry : groupPaperMap.entrySet()) {
             Long groupId = entry.getKey();
             List<Paper> papers = entry.getValue();
-
-            for (Paper paper : papers) {
+            papers.forEach(paper -> {
                 int markerCount = 0;
                 Set<MarkUser> markUsers = groupMap.get(groupId).getMarkers();
                 markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
                 for (MarkUser marker : markUsers) {
                     markerCount++;
-                    Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
+                    Long random = null;
+                    try {
+                        random = randomUtil.randomRoughLevel(marker.getWorkId());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
                     MarkTaskRoughLevel markTask;
                     if (paper.isRoughSample() && paper.getRoughLevel() != null) {
                         Optional<RoughLevel> optional = roughLevels.stream().filter(m -> m.getRoughCode().equals(paper.getRoughLevel())).findFirst();
@@ -108,14 +109,12 @@ public class AssignTaskService {
                     markTask.setBatchNo(currentTime);
 
                     markTaskLevelList.add(markTask);
-                    randomMap.put(random, markTask);
                 }
                 paper.setRoughBatchNo(currentTime);
                 paperList.add(paper);
-            }
+            });
         }
 
-
         List<MarkTaskRoughLevel> data = new ArrayList<>();
         //5000条提交一次
         for (MarkTaskRoughLevel markTask : markTaskLevelList) {
@@ -129,6 +128,7 @@ public class AssignTaskService {
         if (!data.isEmpty()) {
             markTaskRoughLevelRepo.save(data);
         }
+
         paperRepo.save(paperList);
     }
 
@@ -161,7 +161,7 @@ public class AssignTaskService {
                 markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
                 for (MarkUser marker : markUsers) {
                     markerCount++;
-                    Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
+                    Long random = randomUtil.randomLevel(marker.getWorkId());
                     MarkTaskLevel markTask;
                     if (paper.isSample() && paper.getLevel() != null) {
                         Level level = levels.stream().filter(m -> m.getCode().equals(paper.getLevel())).findFirst().orElseGet(null);
@@ -222,9 +222,6 @@ public class AssignTaskService {
         Iterator<Paper> iterator = papers.iterator();
         List<MarkTaskScore> markTaskScoreList = new ArrayList<>(papers.size() * sum);
         List<Paper> paperList = new ArrayList<>(papers.size());
-        List<Object[]> markTasks = markTaskScoreRepo.findAllByWorkId(markSubject.getWorkId());
-        Map<Long, Object> randomMap = new HashMap<>();
-        markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
         //定序序号记录
@@ -263,7 +260,7 @@ public class AssignTaskService {
             Set<MarkUser> markUsers = markerGroups.get(idx).getMarkers();
             markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
             for (MarkUser marker : markUsers) {
-                Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
+                Long random = randomUtil.randomScore(marker.getWorkId());
                 MarkTaskScore markTask = new MarkTaskScore(marker, paper, markSubject.getStage(), random, markSubject.getTest());
                 String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
                 if (Objects.nonNull(serialNumber)) {
@@ -279,7 +276,6 @@ public class AssignTaskService {
                 markTask.setLevel(paper.getLevel());
 
                 markTaskScoreList.add(markTask);
-                randomMap.put(random, markTask);
             }
             paper.setScoreBatchNo(currentTime);
             paperList.add(paper);
@@ -302,163 +298,6 @@ public class AssignTaskService {
         paperRepo.save(paperList);
     }
 
-    /**
-     * 分组任务模式,将该科目的评卷员分成N组,将该科目试卷平均分给这些组,每组内的评卷员每人将这些试卷打分
-     * 比如:6个评卷员分2组,有1000份试卷,每组评500份,每个评卷员评500份
-     *
-     * @param papers       试卷
-     * @param markerGroups 分组
-     * @param markSubject  科目
-     * @param taskList     打分任务
-     */
-    @Transactional
-    public void assignForGrouping(List<Paper> papers, List<MarkerGroup> markerGroups, MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
-        markerGroups = markerGroups.stream().filter(m -> m.getMarkers() != null && !m.getMarkers().isEmpty()).collect(Collectors.toList());
-        int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
-        int groupSize = markerGroups.size();
-        int idx = 0;
-        long currentTime = System.currentTimeMillis();
-        Iterator<Paper> iterator = papers.iterator();
-        List<MarkTaskLevel> markTaskLevelList = new ArrayList<>(papers.size() * sum);
-        List<MarkTaskScore> markTaskScoreList = new ArrayList<>(papers.size() * sum);
-        List<Paper> paperList = new ArrayList<>(papers.size());
-        List<Object[]> markTasks = new ArrayList<>();
-        if (MarkStage.ROUGH_LEVEL.equals(markSubject.getStage())) {
-            markTasks = markTaskRoughLevelRepo.findAllByWorkId(markSubject.getWorkId());
-        } else if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-            markTasks = markTaskLevelRepo.findAllByWorkId(markSubject.getWorkId());
-        } else if (MarkStage.SCORE.equals(markSubject.getStage())) {
-            markTasks = markTaskScoreRepo.findAllByWorkId(markSubject.getWorkId());
-        }
-        Map<Long, Object> randomMap = new HashMap<>();
-        markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
-        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
-        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
-        //定序序号记录
-        Map<String, Integer> map = new HashMap();
-        Map<String, Integer> seqNewMap = new HashMap();
-        while (iterator.hasNext()) {
-            if (idx >= groupSize) {
-                idx = 0;
-            }
-            Paper paper = iterator.next();
-            String serialNumber = null;
-            Integer displayNumber = null;
-            Integer seqNewNumber = null;
-            if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
-                //是否定序
-                int seq = 0;
-                long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
-                if (sortRule != 0) {
-                    if (map.containsKey(paper.getLevel() + idx)) {
-                        seq = map.get(paper.getLevel() + idx);
-                    }
-                    ++seq;
-                    serialNumber = paper.getLevel() + seq;
-                    //是否显示序号
-                    long display = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getDisplayNumber() == 1).count();
-                    displayNumber = (int) display;
-                    //设置新值
-                    map.put(paper.getLevel() + idx, seq);
-
-                    int seqNew = 0;
-                    if (seqNewMap.containsKey(paper.getLevel())) {
-                        seqNew = seqNewMap.get(paper.getLevel());
-                    }
-                    seqNewNumber = ++seqNew;
-                    seqNewMap.put(paper.getLevel(), seqNew);
-                }
-            }
-            int markerCount = 0;
-            Set<MarkUser> markUsers = markerGroups.get(idx).getMarkers();
-            markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
-            for (MarkUser marker : markUsers) {
-                markerCount++;
-                Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
-                if (Objects.equals(MarkStage.LEVEL, markSubject.getStage())) {
-                    MarkTaskLevel markTask = null;
-                    if (paper.isSample() && paper.getLevel() != null) {
-                        Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
-                        markTask = new MarkTaskLevel(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
-
-                        // 初始化排序值
-                        if (markerCount == markerGroups.get(idx).getMarkers().size()) {
-                            paper.setSortNum(level.getWeight() * markerCount);
-                        }
-                    } else {
-                        markTask = new MarkTaskLevel(marker, paper, markSubject.getStage(), random, markSubject.getTest());
-                    }
-                    markTask.setBatchNo(currentTime);
-
-                    markTaskLevelList.add(markTask);
-                    randomMap.put(random, markTask);
-                } else {
-                    MarkTaskScore markTask = new MarkTaskScore(marker, paper, markSubject.getStage(), random, markSubject.getTest());
-                    String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
-                    if (Objects.nonNull(serialNumber)) {
-                        //和随机数位数保持一致(8位)
-                        String randomSeqNew = String.format("%08d", seqNewNumber);
-                        markTask.setRandomSeqNew(Long.valueOf(levelValue + randomSeqNew));
-                    } else {
-                        markTask.setRandomSeqNew(Long.valueOf(levelValue + markTask.getRandomSeqNew()));
-                    }
-                    markTask.setBatchNo(currentTime);
-                    markTask.setSerialNumber(serialNumber);
-                    markTask.setDisplayNumber(displayNumber);
-                    markTask.setLevel(paper.getLevel());
-
-                    markTaskScoreList.add(markTask);
-                    randomMap.put(random, markTask);
-                }
-            }
-            if (markSubject.getTest() != 1) {
-                if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-                    paper.setBatchNo(currentTime);
-                    paperList.add(paper);
-                }
-                if (MarkStage.SCORE.equals(markSubject.getStage())) {
-                    paper.setScoreBatchNo(currentTime);
-                    paperList.add(paper);
-                }
-            } else {
-                paper.setBatchNo(currentTime);
-                paperList.add(paper);
-            }
-            idx++;
-        }
-
-        if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-            List<MarkTaskLevel> data = new ArrayList<>();
-            //5000条提交一次
-            for (MarkTaskLevel markTask : markTaskLevelList) {
-                if (data.size() == 2000) {
-                    markTaskLevelRepo.save(data);
-                    data.clear();
-                }
-                data.add(markTask);
-            }
-            //将剩下的数据也导入
-            if (!data.isEmpty()) {
-                markTaskLevelRepo.save(data);
-            }
-        } else if (MarkStage.SCORE.equals(markSubject.getStage())) {
-            List<MarkTaskScore> data = new ArrayList<>();
-            //5000条提交一次
-            for (MarkTaskScore markTask : markTaskScoreList) {
-                if (data.size() == 2000) {
-                    markTaskScoreRepo.save(data);
-                    data.clear();
-                }
-                data.add(markTask);
-            }
-            //将剩下的数据也导入
-            if (!data.isEmpty()) {
-                markTaskScoreRepo.save(data);
-            }
-        }
-        paperRepo.save(paperList);
-    }
-
     /**
      * 生成打分汇总数据
      *
@@ -576,7 +415,6 @@ public class AssignTaskService {
      * @param papersList    试卷集合
      * @param groupPaperMap 分组考生名单
      * @param taskCount     任务数量
-     * @param stage
      */
     private void randomTaskList(List<Paper> papersList, Map<Long, List<Paper>> groupPaperMap, int taskCount, MarkSubject markSubject) {
 

+ 1 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/GroupingService.java

@@ -182,7 +182,7 @@ public class GroupingService {
                 // 评卷员
                 //各评卷员评卷进度
                 List<Object[]> qStats = null;
-                Long batchNo = null;
+                Long batchNo;
                 if (MarkStage.ROUGH_LEVEL.equals(markSubject.getStage())) {
                     if (ParamCache.roughLevelConfigMap.get(String.valueOf(workId)).getLevelShowAllPaper() == 1) {
                         qStats = markTaskRoughLevelRepo.listGroupByQuestionAndMarkerId(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest(), markers);

+ 1 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkTaskRoughLevelService.java

@@ -129,7 +129,7 @@ public class MarkTaskRoughLevelService {
                     List<Paper> paperList = paperRepo.findSample(level, isSample, false, examQuestion.getSubject().name(), TrialEnum.DEFAULT.getId(), examQuestion.getAreaCode(), examQuestion.getWorkId());
                     if (Objects.nonNull(paperList) && !paperList.isEmpty()) {
                         for (Paper p : paperList) {
-                            MarkTaskRoughLevel markTask = new MarkTaskRoughLevel(markUser, p, MarkStage.LEVEL, 1L);
+                            MarkTaskRoughLevel markTask = new MarkTaskRoughLevel(markUser, p, MarkStage.ROUGH_LEVEL, 1L);
                             markTaskDTOs.add(markTaskRoughLevelAssembler.toDTO(markTask));
                         }
                     }

+ 0 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -181,7 +181,6 @@ public class StageControlService {
                 throw new RuntimeException("分配任务数量不能大于待评数量");
             }
         }
-
         Map<Long, List<Paper>> groupPaperMap = assignTaskService.assignGroupTasks(allPapers, markSubject, markerGroups, questionIdsLong, taskCount);
         assignTaskService.assignForGroupingRoughLevel(groupPaperMap, markerGroups, markSubject);
     }

+ 131 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/utils/RandomUtil.java

@@ -0,0 +1,131 @@
+package cn.com.qmth.stmms.ms.marking.utils;
+
+import cn.com.qmth.stmms.ms.core.repository.MarkTaskLevelRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkTaskRoughLevelRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkTaskScoreRepo;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import org.apache.commons.lang.math.RandomUtils;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 随机数生成工具类
+ */
+@Component
+public class RandomUtil {
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(RandomUtil.class);
+    public static final int SECRET_NUMBER_START = 100000000;
+    public static final int SECRET_NUMBER_END = 999999999;
+    private Map<Long, Set<Long>> randomPaperMap = new HashMap<>();
+    private Map<Long, Set<Long>> randomRoughLevelMap = new HashMap<>();
+    private Map<Long, Set<Long>> randomLevelMap = new HashMap<>();
+    private Map<Long, Set<Long>> randomScoreMap = new HashMap<>();
+
+    @Resource
+    private PaperRepo paperRepo;
+
+    @Resource
+    private MarkTaskRoughLevelRepo markTaskRoughLevelRepo;
+
+    @Resource
+    private MarkTaskLevelRepo markTaskLevelRepo;
+
+    @Resource
+    private MarkTaskScoreRepo markTaskScoreRepo;
+
+    public Map<Long, Set<Long>> getRandomPaperMap() {
+        return randomPaperMap;
+    }
+
+    public void setRandomPaperMap(Map<Long, Set<Long>> randomPaperMap) {
+        this.randomPaperMap = randomPaperMap;
+    }
+
+    public Map<Long, Set<Long>> getRandomRoughLevelMap() {
+        return randomRoughLevelMap;
+    }
+
+    public void setRandomRoughLevelMap(Map<Long, Set<Long>> randomRoughLevelMap) {
+        this.randomRoughLevelMap = randomRoughLevelMap;
+    }
+
+    public Map<Long, Set<Long>> getRandomLevelMap() {
+        return randomLevelMap;
+    }
+
+    public void setRandomLevelMap(Map<Long, Set<Long>> randomLevelMap) {
+        this.randomLevelMap = randomLevelMap;
+    }
+
+    public Map<Long, Set<Long>> getRandomScoreMap() {
+        return randomScoreMap;
+    }
+
+    public void setRandomScoreMap(Map<Long, Set<Long>> randomScoreMap) {
+        this.randomScoreMap = randomScoreMap;
+    }
+
+    private static Long randomLong() {
+        return (long) (RandomUtils.nextDouble() * (RandomUtil.SECRET_NUMBER_END - RandomUtil.SECRET_NUMBER_START)) + RandomUtil.SECRET_NUMBER_START;
+    }
+
+    public void initRandom(Long workId) {
+        Set<Long> paperRandoms = paperRepo.listRandomByWorkId(workId);
+        randomPaperMap.put(workId, paperRandoms);
+
+        Set<Long> markTaskRoughLevelRandoms = markTaskRoughLevelRepo.listRandomByWorkId(workId);
+        randomRoughLevelMap.put(workId, markTaskRoughLevelRandoms);
+
+        Set<Long> markTaskLevelRandoms = markTaskLevelRepo.listRandomByWorkId(workId);
+        randomRoughLevelMap.put(workId, markTaskLevelRandoms);
+
+        Set<Long> markTaskScoreRandoms = markTaskScoreRepo.listRandomByWorkId(workId);
+        randomScoreMap.put(workId, markTaskScoreRandoms);
+    }
+
+    public Long randomPaper(Long workId) {
+        Set<Long> longs = randomPaperMap.computeIfAbsent(workId, k -> new HashSet<>());
+        Long random = randomLong();
+        if (longs.contains(random)) {
+            randomPaper(workId);
+        }
+        randomPaperMap.get(workId).add(random);
+        return random;
+    }
+
+    public Long randomRoughLevel(Long workId) {
+        Set<Long> longs = randomRoughLevelMap.computeIfAbsent(workId, k -> new HashSet<>());
+        Long random = randomLong();
+        if (longs.contains(random)) {
+            randomRoughLevel(workId);
+        }
+        randomRoughLevelMap.get(workId).add(random);
+        return random;
+    }
+
+    public Long randomLevel(Long workId) {
+        Set<Long> longs = randomLevelMap.computeIfAbsent(workId, k -> new HashSet<>());
+        Long random = randomLong();
+        if (longs.contains(random)) {
+            randomLevel(workId);
+        }
+        randomLevelMap.get(workId).add(random);
+        return random;
+    }
+
+    public Long randomScore(Long workId) {
+        Set<Long> longs = randomScoreMap.computeIfAbsent(workId, k -> new HashSet<>());
+        Long random = randomLong();
+        if (longs.contains(random)) {
+            randomScore(workId);
+        }
+        randomScoreMap.get(workId).add(random);
+        return random;
+    }
+}