Browse Source

机构版-迭代

xiaof 4 years ago
parent
commit
4dc8e54583

+ 2 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/UserExporter.java

@@ -10,6 +10,7 @@ import cn.com.qmth.stmms.ms.core.domain.Student;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 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.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
@@ -51,7 +52,7 @@ public class UserExporter {
         List<MarkUserDTO> markUserDTOs = new ArrayList<>();
         Stream<MarkUser> markUserStream = markUserRepo.findByWorkId(workId).stream();
         if (subject != null) {
-            markUserStream = markUserStream.filter(u -> u.getSubject().name() == subject.name());
+            markUserStream = markUserStream.filter(u -> u.getSubject().name() == subject.name() && (Role.MARKER.equals(u.getRole()) || Role.MARK_LEADER.equals(u.getRole())));
         }
         markUserStream.forEach(u -> {
             markUserDTOs.add(markUserAssembler.toDTO(u));

+ 9 - 4
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -241,7 +241,7 @@ public class DataUploadService {
         if (papers != null && papers.size() > 0) {
             throw new Exception("已有采集数据,不能导入考生数据");
         }
-        examQuestionRepo.deleteByWorkId(workId);
+
         List<Student> studentList = new ArrayList<>();
 
         ExcelReader excelReader = new ExcelReader(StudentDTO.class);
@@ -266,6 +266,7 @@ public class DataUploadService {
 
                     long isExist = examQuestionRepo.countByWorkIdAndAreaCode(workId, dto.getAreaCode());
                     if (isExist == 0) {
+                        examQuestionRepo.deleteByWorkIdAndAreaCode(workId, dto.getAreaCode());
                         if (!imageConfig.isCustomSubject()) {
                             for (Subject subject : Subject.values()) {
                                 ExamQuestion question = new ExamQuestion(dto.getAreaCode(), subject, workId, dto.getAreaName());
@@ -646,15 +647,19 @@ public class DataUploadService {
         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()))) {
+            String examNumberSub;
+            if(examNumber.length() > 3){
+                examNumberSub = examNumber.substring(3);
+            } else {
+                examNumberSub = examNumber;
+            }
+            if (result == 0 && !random.toString().equals(examNumberSub)) {
                 break;
             } else {
                 count++;
             }
             if (count > 1000) {
-//                throw new Exception("重复几率较高,建议重新生成随机号");
                 randomUtil.getRandom(workId, true);
                 getRandom(workId, examNumber);
             }

+ 2 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ExamQuestionRepo.java

@@ -39,4 +39,6 @@ public interface ExamQuestionRepo extends JpaRepository<ExamQuestion, Long> {
     List<Object[]> findByWorkId(Long workId);
 
     List<ExamQuestion> findByWorkIdAndSubjectAndTestNot(Long workId, Subject subject, int id);
+
+    void deleteByWorkIdAndAreaCode(Long workId, String areaCode);
 }

+ 7 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -263,4 +263,11 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
 
 
     List<MarkTask> findByWorkIdAndQuestionIdAndStageAndManualScore(Long workId, Long questionId, MarkStage score, int i);
+
+    List<MarkTask> findByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage level);
+
+    List<MarkTask> findByPaperIdInAndStage(List<Long> paperIds, MarkStage stage);
+
+    @Query(value = "select distinct cast(m.paper_id as char) paperId from mark_task m inner join paper p on m.paper_id = p.id and m.stage = ?3 where p.work_id = ?1 and p.subject = ?2 and m.manual_score = 1", nativeQuery = true)
+    List<String> findByWorkIdAndSubjectAndStageAndManualScore(Long workId, String subject, int stage);
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
 import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -385,9 +386,6 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTestAndLevelIsNull(Long workId, Subject valueOf, Long questionId, boolean b, int ordinal);
 
-    @Query(value = "select count(distinct p.id) from mark_task m inner join paper p on m.paper_id = p.id and m.stage = ?3 where p.work_id = ?1 and p.subject = ?2 and m.manual_score = 1", nativeQuery = true)
-    int countByWorkIdAndSubjectAndStageAndManualScore(Long workId, String subject, int stage);
-
     long countByWorkIdAndQuestionIdAndIsMissingIsFalse(Long workId, Long questionId);
 
     @Modifying
@@ -395,7 +393,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     void updateScoreByWorkIdAndSubject(Long workId, String subject);
 
     @Modifying
-    @Query(value = "update paper p set p.level = case p.is_sample when true then p.level else null end,p.sort_num = case p.is_sample when true then p.sort_num else null end, p.redo_level = null, p.batch_no = null, p.is_active = false, p.is_arbitrated = false, p.is_manual = false, p.is_rejected = false, p.is_tagged = false, p.mark_by_leader = false, p.is_one_click = false where p.work_id = ?1 and p.subject = ?2", nativeQuery = true)
+    @Query(value = "update paper p set p.level = case p.is_sample when true then p.level else null end,p.sort_num = case p.is_sample when true then p.sort_num else null end, p.redo_level = null, p.batch_no = null, p.is_active = false, p.is_arbitrated = false, p.is_rejected = false, p.is_tagged = false, p.mark_by_leader = false, p.is_one_click = false where p.work_id = ?1 and p.subject = ?2", nativeQuery = true)
     void updateLevelByWorkIdAndSubject(Long workId, String subject);
 
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);

+ 13 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/specification/StudentSpecification.java

@@ -179,6 +179,19 @@ public class StudentSpecification extends PagingAndSortingSpecification {
                     } else {
                         predicates.add(cb.equal(root.get("uploadStatus"), "SX:0,SC:0,SM:0"));
                     }
+
+                    // 未上传考生不包含标记缺考
+                    if (Subject.SC.name().equals(getSubject())) {
+                        predicates.add(cb.equal(root.get("scMissing"), false));
+                    } else if (Subject.SX.name().equals(getSubject())) {
+                        predicates.add(cb.equal(root.get("sxMissing"), false));
+                    } else if (Subject.SM.name().equals(getSubject())) {
+                        predicates.add(cb.equal(root.get("smMissing"), false));
+                    } else {
+                        predicates.add(cb.equal(root.get("scMissing"), false));
+                        predicates.add(cb.equal(root.get("sxMissing"), false));
+                        predicates.add(cb.equal(root.get("smMissing"), false));
+                    }
                 } else if (getUpload() != null && getUpload()) {
                     if (Objects.nonNull(getSubject()) && !getSubject().isEmpty()) {
                         predicates.add(cb.like(root.get("uploadStatus"), "%" + getSubject() + ":1" + "%"));

+ 15 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.marking.api;
 
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 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.MarkerGroup;
@@ -23,6 +24,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -216,8 +218,19 @@ public class MarkSubjectApi {
         // 输分试卷
         LevelStatDTO manualScoreDTO = new LevelStatDTO();
         manualScoreDTO.setId("manualScore");
-        int manualCount = paperRepo.countByWorkIdAndSubjectAndStageAndManualScore(markSubject.getWorkId(), markSubject.getSubject().name(), MarkStage.SCORE.ordinal());
-        manualScoreDTO.setCount(manualCount);
+        List<String> markTaskPaperIds = markTaskRepo.findByWorkIdAndSubjectAndStageAndManualScore(markSubject.getWorkId(), markSubject.getSubject().name(), MarkStage.SCORE.ordinal());
+        List<Long> paperIds = markTaskPaperIds.stream().map(m-> Long.parseLong(m)).collect(Collectors.toList());
+        List<MarkTask> markTaskList = markTaskRepo.findByPaperIdInAndStage(paperIds, MarkStage.SCORE);
+        Map<Long, List<MarkTask>> markTaskMap = markTaskList.stream().collect(Collectors.groupingBy(m->m.getPaper().getId()));
+        Set<Long> paperIdSet = new HashSet();
+        for (Map.Entry<Long, List<MarkTask>> entry : markTaskMap.entrySet()) {
+            long count = entry.getValue().stream().filter(m->Objects.isNull(m.getResult())).count();
+            if(count == 0){
+                paperIdSet.add(entry.getKey());
+            }
+
+        }
+        manualScoreDTO.setCount(paperIdSet.size());
         levelStatDTOs.add(manualScoreDTO);
 
         Collections.sort(levelStatDTOs, (o1, o2) -> {

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

@@ -285,7 +285,7 @@ public class MarkTaskApi {
         Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
 
-        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskAssembler.toShiftDTO(m)));
+        markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskAssembler.toManualDTO(m)));
         return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
     }
 

+ 14 - 3
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -282,13 +282,24 @@ public class PaperApi {
                                        @RequestParam Long questionId,
                                        Pageable pageable) {
         List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndQuestionIdAndStageAndManualScore(workId, questionId, MarkStage.SCORE, 1);
-        Set<Long> paperIds = markTasks.stream().map(m->m.getPaper().getId()).collect(Collectors.toSet());
+        List<Long> paperIds = markTasks.stream().map(m->m.getPaper().getId()).distinct().collect(Collectors.toList());
+        List<MarkTask> markTaskList = markTaskRepo.findByPaperIdInAndStage(paperIds, MarkStage.SCORE);
+        Map<Long, List<MarkTask>> markTaskMap = markTaskList.stream().collect(Collectors.groupingBy(m->m.getPaper().getId()));
+        Set<Long> paperIdSet = new HashSet();
+        for (Map.Entry<Long, List<MarkTask>> entry : markTaskMap.entrySet()) {
+            long count = entry.getValue().stream().filter(m->Objects.isNull(m.getResult())).count();
+            if(count == 0){
+                paperIdSet.add(entry.getKey());
+            }
+
+        }
+
         Specification<Paper> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.isNotNull(root.get("score")));
-            if (paperIds != null && paperIds.size() > 0) {
+            if (paperIdSet != null && paperIdSet.size() > 0) {
                 CriteriaBuilder.In<Object> in = builder.in(root.get("id"));
-                for (Long paperId : paperIds) {
+                for (Long paperId : paperIdSet) {
                     in.value(paperId);
                 }
                 predicates.add(builder.and(builder.and(in)));

+ 63 - 8
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java

@@ -60,7 +60,7 @@ public class MarkTaskAssembler {
             Paper paper = markTask.getPaper();
             if (markTask.getStage() == MarkStage.LEVEL) {
                 markTaskDTO.setLevel(markTask.getResult());
-                markTaskDTO.setOriginLevel(markTask.getOriginLevel() == null ? "":markTask.getOriginLevel());
+                markTaskDTO.setOriginLevel(markTask.getOriginLevel() == null ? "" : markTask.getOriginLevel());
             } else {
                 markTaskDTO.setLevel(paper.getLevel());
             }
@@ -71,7 +71,7 @@ public class MarkTaskAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
             //0:随机码 1:考号
-            if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
+            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
 //                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
@@ -92,7 +92,7 @@ public class MarkTaskAssembler {
             markTaskDTO.setRandomSeq(markTask.getRandomSeq());
             markTaskDTO.setPaperId(paper.getId());
             markTaskDTO.setSerialNumber(markTask.getSerialNumber());
-            if(Objects.nonNull(markTask.getDisplayNumber())) {
+            if (Objects.nonNull(markTask.getDisplayNumber())) {
                 markTaskDTO.setDisplayNumber(markTask.getDisplayNumber() == 1);
             }
             markTaskDTO.setShift(paper.isShift());
@@ -131,7 +131,7 @@ public class MarkTaskAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
             //0:随机码 1:考号
-            if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
+            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
 //                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
@@ -160,6 +160,7 @@ public class MarkTaskAssembler {
 
     /**
      * 改档,改档打分
+     *
      * @param markTask
      * @return
      */
@@ -179,9 +180,9 @@ public class MarkTaskAssembler {
                 markTaskDTO.setLevel(markTask.getResult());
 //                markTaskDTO.setOriginLevel(markTask.getOriginLevel());
                 ChangeLevel changeLevel = changeLevelRepo.findByWorkIdAndSubjectAndPaperIdAndAuditStatusAndIsCurr(markTask.getWorkId(), markTask.getSubject().name(), paper.getId());
-                markTaskDTO.setOriginLevel(changeLevel != null ? changeLevel.getOriginalLevel(): "");
+                markTaskDTO.setOriginLevel(changeLevel != null ? changeLevel.getOriginalLevel() : "");
             }
-            if(paper.isShiftScore()){
+            if (paper.isShiftScore()) {
                 markTaskDTO.setLevel(paper.getLevel());
             }
             markTaskDTO.setSn(markTask.getSecretNumber());
@@ -191,7 +192,7 @@ public class MarkTaskAssembler {
             String fileName = paper.getExamNumber();
             Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
             //0:随机码 1:考号
-            if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
+            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
 //                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
                 fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
@@ -212,7 +213,61 @@ public class MarkTaskAssembler {
             markTaskDTO.setRandomSeq(markTask.getRandomSeq());
             markTaskDTO.setPaperId(paper.getId());
             markTaskDTO.setSerialNumber(markTask.getSerialNumber());
-            if(Objects.nonNull(markTask.getDisplayNumber())) {
+            if (Objects.nonNull(markTask.getDisplayNumber())) {
+                markTaskDTO.setDisplayNumber(markTask.getDisplayNumber() == 1);
+            }
+            markTaskDTO.setShift(paper.isShift());
+            markTaskDTO.setShiftScore(paper.isShiftScore());
+        }
+        return markTaskDTO;
+    }
+
+    /**
+     * 输分试卷
+     * @param markTask
+     * @return
+     */
+    public MarkTaskDTO toManualDTO(MarkTask markTask) {
+        MarkTaskDTO markTaskDTO = null;
+        if (markTask != null) {
+            markTaskDTO = new MarkTaskDTO();
+            markTaskDTO.setId(markTask.getId());
+            markTaskDTO.setRejected(markTask.isRejected());
+            markTaskDTO.setMarkerId(markTask.getMarkerId());
+            markTaskDTO.setMarker(markTask.getMarkerName());
+            markTaskDTO.setUpdatedOn(markTask.getUpdatedOn());
+            markTaskDTO.setResult(markTask.getResult());
+            Paper paper = markTask.getPaper();
+            markTaskDTO.setLevel(paper.getLevel());
+            markTaskDTO.setSn(markTask.getSecretNumber());
+            markTaskDTO.setRedoLevel(paper.getRedoLevel());
+            String imgSrc = null;
+            String thumbSrc = null;
+            String fileName = paper.getExamNumber();
+            Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+            //0:随机码 1:考号
+            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+//                fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
+                fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+            }
+            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+                imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
+                thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
+            } else {
+                imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            }
+//            String imgSrc = systemConfig.getImageUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
+//            String thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
+            markTaskDTO.setThumbSrc(thumbSrc);
+            markTaskDTO.setImgSrc(imgSrc);
+            markTaskDTO.setSample(paper.isSample());
+            markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
+            markTaskDTO.setRandomSeqNew(markTask.getRandomSeqNew());
+            markTaskDTO.setRandomSeq(markTask.getRandomSeq());
+            markTaskDTO.setPaperId(paper.getId());
+            markTaskDTO.setSerialNumber(markTask.getSerialNumber());
+            if (Objects.nonNull(markTask.getDisplayNumber())) {
                 markTaskDTO.setDisplayNumber(markTask.getDisplayNumber() == 1);
             }
             markTaskDTO.setShift(paper.isShift());

+ 144 - 67
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
+import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.utils.DbBackupUtils;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
@@ -17,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -128,63 +130,65 @@ public class AssignTaskService {
      */
     @Transactional
     public void assignForGrouping(List<Paper> papers, List<MarkerGroup> markerGroups, MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
-        markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).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<MarkTask> markTaskList = new ArrayList<>(papers.size() * sum);
+
+        List<MarkTask> markTaskList;
         List<Paper> paperList = new ArrayList<>(papers.size());
-//        List<MarkTask> markTasks = markTaskRepo.findByWorkId(markSubject.getWorkId());
-//        Map<Long, MarkTask> randomMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getRandomSeqNew, Function.identity(), (dto1, dto2) -> dto1));
-        List<Object[]> markTasks = markTaskRepo.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));
+
+        Iterator<Paper> iterator = papers.iterator();
         //定序序号记录
         Map map = new HashMap();
         Map 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())) {
+        long currentTime = System.currentTimeMillis();
+
+        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
+        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
+
+        List<Object[]> markTasks = markTaskRepo.findAllByWorkId(markSubject.getWorkId());
+        Map<Long, Object> randomMap = new HashMap<>();
+        markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
+        // 谁分档谁打分
+        if(Objects.equals(MarkStage.SCORE, markSubject.getStage()) && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1){
+            // 查询所有分档
+            List<MarkTask> markTasksLevels = markTaskRepo.findByWorkIdAndSubjectAndStage(markSubject.getWorkId(),markSubject.getSubject(), MarkStage.LEVEL);
+            markTaskList = new ArrayList<>(markTasksLevels.size());
+            Map<Long, List<MarkTask>> markerMap = markTasksLevels.stream().collect(Collectors.groupingBy(m->m.getPaper().getId()));
+            Map<String, AtomicInteger> integerMap = new HashMap<>();
+
+            while (iterator.hasNext()) {
+                Paper paper = iterator.next();
+                String serialNumber = null;
+                Integer displayNumber = null;
+                Integer seqNewNumber = null;
                 //是否定序
-                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 = (int) map.get(paper.getLevel() + idx);
+                    AtomicInteger atomicInteger = integerMap.get(paper.getLevel());
+                    if(atomicInteger == null){
+                        atomicInteger = new AtomicInteger(0);
+                        integerMap.put(paper.getLevel(), atomicInteger);
                     }
-                    seq = ++seq;
-                    serialNumber = paper.getLevel() + seq;
+                    serialNumber = paper.getLevel() + atomicInteger.incrementAndGet();
                     //是否显示序号
                     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())){
+                    if (seqNewMap.containsKey(paper.getLevel())) {
                         seqNew = (int) seqNewMap.get(paper.getLevel());
                     }
                     seqNewNumber = ++seqNew;
                     seqNewMap.put(paper.getLevel(), seqNew);
                 }
-            }
-            int markerCount = 0;
-            for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
-                markerCount ++ ;
-                Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
-                MarkTask markTask = null;
-                if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
-                    markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+
+                List<MarkTask> markTask1 = markerMap.get(paper.getId());
+                for (MarkTask mt : markTask1) {
+                    MarkUser marker = new MarkUser();
+                    marker.setId(mt.getMarkerId());
+                    marker.setName(mt.getMarkerName());
+                    marker.setWorkId(mt.getWorkId());
+                    marker.setSubject(mt.getSubject());
+                    Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
+                    MarkTask markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
                     String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
                     if (Objects.nonNull(serialNumber)) {
                         //和随机数位数保持一致(8位)
@@ -197,42 +201,116 @@ public class AssignTaskService {
                     markTask.setSerialNumber(serialNumber);
                     markTask.setDisplayNumber(displayNumber);
                     markTask.setLevel(paper.getLevel());
+
+                    markTaskList.add(markTask);
+                    randomMap.put(random, markTask);
+                }
+
+                if (markSubject.getTest() != 1) {
+                    if (MarkStage.SCORE.equals(markSubject.getStage())) {
+                        paper.setScoreBatchNo(currentTime);
+                        paperList.add(paper);
+                    }
                 } else {
-                    if (paper.isSample() && paper.getLevel() != null) {
-                        Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
-                        markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
+                    paper.setBatchNo(currentTime);
+                    paperList.add(paper);
+                }
+            }
 
-                        // 初始化排序值
-                        if(markerCount == markerGroups.get(idx).getMarkers().size()){
-                            paper.setSortNum(level.getWeight() * markerCount);
+        } else {
+            markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
+            int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
+            int groupSize = markerGroups.size();
+            int idx = 0;
+            markTaskList = new ArrayList<>(papers.size() * sum);
+            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 = (int) map.get(paper.getLevel() + idx);
                         }
-                    } else {
+                        seq = ++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 = (int) seqNewMap.get(paper.getLevel());
+                        }
+                        seqNewNumber = ++seqNew;
+                        seqNewMap.put(paper.getLevel(), seqNew);
+                    }
+                }
+                int markerCount = 0;
+                for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
+                    markerCount++;
+                    Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
+                    MarkTask markTask;
+                    if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
                         markTask = new MarkTask(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());
+                    } else {
+                        if (paper.isSample() && paper.getLevel() != null) {
+                            Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
+                            markTask = new MarkTask(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
+
+                            // 初始化排序值
+                            if (markerCount == markerGroups.get(idx).getMarkers().size()) {
+                                paper.setSortNum(level.getWeight() * markerCount);
+                            }
+                        } else {
+                            markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
+                        }
+                        markTask.setBatchNo(currentTime);
                     }
-                    markTask.setBatchNo(currentTime);
+                    markTaskList.add(markTask);
+                    randomMap.put(random, markTask);
                 }
-                markTaskList.add(markTask);
-                randomMap.put(random, markTask);
-            }
-            if (markSubject.getTest() != 1) {
-                if (MarkStage.LEVEL.equals(markSubject.getStage())) {
-                    //将paper置为激活
-                    paper.setActive(true);
-                    paper.setBatchNo(currentTime);
-                    paperList.add(paper);
-                    //更新subject表formal为正试评卷
+                if (markSubject.getTest() != 1) {
+                    if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+                        //将paper置为激活
+                        paper.setActive(true);
+                        paper.setBatchNo(currentTime);
+                        paperList.add(paper);
+                        //更新subject表formal为正试评卷
 //                    markSubject.setFormal(true);
 //                    markSubjectRepo.saveAndFlush(markSubject);
-                }
-                if (MarkStage.SCORE.equals(markSubject.getStage())) {
-                    paper.setScoreBatchNo(currentTime);
+                    }
+                    if (MarkStage.SCORE.equals(markSubject.getStage())) {
+                        paper.setScoreBatchNo(currentTime);
+                        paperList.add(paper);
+                    }
+                } else {
+                    paper.setBatchNo(currentTime);
                     paperList.add(paper);
                 }
-            } else {
-                paper.setBatchNo(currentTime);
-                paperList.add(paper);
+                idx++;
             }
-            idx++;
         }
 
         List<MarkTask> data = new ArrayList<>();
@@ -249,7 +327,6 @@ public class AssignTaskService {
             markTaskRepo.save(data);
         }
 
-//        markTaskRepo.save(markTaskList);
         paperRepo.save(paperList);
         if (markSubject.getTest() != 1) {
             //更新subject表formal为正试评卷
@@ -257,14 +334,14 @@ public class AssignTaskService {
             markSubjectRepo.saveAndFlush(markSubject);
         }
         //只有全部任务投放完成,才能删除分组
-        int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
+        /*int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
         //进入分档阶段后,清空当前分组,以便打分阶段前重新分组
         if (MarkStage.LEVEL.equals(markSubject.getStage()) && count == 0) {
             for (MarkerGroup markerGroup : markerGroups) {
                 markerGroup.setMarkers(null);
             }
             markerGroupRepo.delete(markerGroups);
-        }
+        }*/
 //        if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
 //            //初始化打分任务数据
 //            initTaskPublishData(markSubject);

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

@@ -442,7 +442,7 @@ public class StageControlService {
 
         //保存发布数据
         int max = taskPublishSettingRepo.maxPublishCount(workId, subject.name());
-        long scoreBatchNo = papers.get(0).getScoreBatchNo();
+        Long scoreBatchNo = papers.get(0).getScoreBatchNo();
         List<TaskPublishSetting> taskListAll = taskPublishSettingRepo.findByWorkIdAndSubjectAndPublishCount(workId, subject.name(), max);
         if (Objects.isNull(questionId)) {
             Map<String, TaskPublishSetting> map = taskList.stream().collect(Collectors.toMap(TaskPublishSetting::getCode, p -> p));