Bladeren bron

新需求提交-0725

xiaof 4 jaren geleden
bovenliggende
commit
ae57cc4332

+ 39 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/SampleExpDTO.java

@@ -0,0 +1,39 @@
+package cn.com.qmth.stmms.ms.admin.dto;
+
+import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelProperty;
+
+public class SampleExpDTO {
+
+    @ExcelProperty(name = "科目", index = 0, type = 1)
+    private String subject;
+
+    @ExcelProperty(name = "考号", index = 1, type = 1)
+    private String examNumber;
+
+    @ExcelProperty(name = "标准卷档位", index = 2, type = 1)
+    private String level;
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+}

+ 33 - 4
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java

@@ -1,21 +1,24 @@
 package cn.com.qmth.stmms.ms.admin.exporter;
 package cn.com.qmth.stmms.ms.admin.exporter;
 
 
 import cn.com.qmth.stmms.ms.admin.dto.PaperExpDTO;
 import cn.com.qmth.stmms.ms.admin.dto.PaperExpDTO;
+import cn.com.qmth.stmms.ms.admin.dto.SampleExpDTO;
 import cn.com.qmth.stmms.ms.admin.dto.ScoreDTO;
 import cn.com.qmth.stmms.ms.admin.dto.ScoreDTO;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
+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.Paper;
+import cn.com.qmth.stmms.ms.core.domain.Work;
+import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -28,6 +31,9 @@ public class PaperExporter {
     @Autowired
     @Autowired
     private PaperRepo paperRepo;
     private PaperRepo paperRepo;
 
 
+    @Autowired
+    private MarkSubjectRepo markSubjectRepo;
+
     @Value("${sys.config.imageDir}")
     @Value("${sys.config.imageDir}")
     private String imagesFolder;
     private String imagesFolder;
 
 
@@ -49,4 +55,27 @@ public class PaperExporter {
 
 
         ExportUtils.exportEXCEL("错误试卷", PaperExpDTO.class, expPapers.stream().sorted((p1, p2) -> p1.getExamNumber().compareTo(p2.getExamNumber())).collect(Collectors.toList()), response);
         ExportUtils.exportEXCEL("错误试卷", PaperExpDTO.class, expPapers.stream().sorted((p1, p2) -> p1.getExamNumber().compareTo(p2.getExamNumber())).collect(Collectors.toList()), response);
     }
     }
+
+    /**
+     * 导出标准卷信息
+     * @param workId
+     * @param subject
+     * @param response
+     */
+    @GetMapping("{workId}/{subject}/sample")
+    public void exportSample(@PathVariable Long workId, @PathVariable Subject subject, HttpServletResponse response){
+        MarkSubject markSubject = markSubjectRepo.findOne(workId+"-"+subject.name());
+        //科目名称
+        String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
+        List<SampleExpDTO> sampleExpDTOS = new ArrayList<>();
+        List<Paper> papers = paperRepo.findByWorkIdAndSubjectAndIsSampleTrue(workId, subject);
+        for (Paper paper : papers) {
+            SampleExpDTO sampleExpDTO = new SampleExpDTO();
+            sampleExpDTO.setSubject(subjectName);
+            sampleExpDTO.setExamNumber(paper.getExamNumber());
+            sampleExpDTO.setLevel(paper.getLevel());
+            sampleExpDTOS.add(sampleExpDTO);
+        }
+        ExportUtils.exportEXCEL("标准卷信息", SampleExpDTO.class, sampleExpDTOS, response);
+    }
 }
 }

+ 3 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java

@@ -100,7 +100,9 @@ public class TrialService {
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
         MarkSubject markSubject = markSubjectList.get(0);
         MarkSubject markSubject = markSubjectList.get(0);
         //分配任务
         //分配任务
-        stageControlService.goNext(markSubject, 0, null);
+        Map map = new HashMap();
+        map.put("taskCount", 0);
+        stageControlService.goNext(markSubject, map);
         //修改科目test
         //修改科目test
         markSubject.setTest(TrialEnum.START_TRIAL.getId());
         markSubject.setTest(TrialEnum.START_TRIAL.getId());
         markSubjectRepo.save(markSubject);
         markSubjectRepo.save(markSubject);

+ 20 - 10
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -41,9 +41,15 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no = ?2 where m.question_id = ?1 and m.marker_id = ?3", nativeQuery = true)
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.batch_no = ?2 where m.question_id = ?1 and m.marker_id = ?3", nativeQuery = true)
     long countByQuestionId(Long questionId, Long batchNo, Long markerId);
     long countByQuestionId(Long questionId, Long batchNo, Long markerId);
 
 
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.score_batch_no = ?2 where m.question_id = ?1 and m.marker_id = ?3", nativeQuery = true)
+    long countScoreByQuestionId(Long questionId, Long batchNo, Long markerId);
+
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and p.batch_no = ?5", nativeQuery = true)
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result = ?4 and p.batch_no = ?5", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
     int countByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
 
 
+    @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and p.level = ?4 and p.score_batch_no = ?5 and m.result is not null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResult(Long questionId, Long markerId, int stage, String result, Long batchNo);
+
     /**
     /**
      * 查询评卷员的评卷任务
      * 查询评卷员的评卷任务
      *
      *
@@ -101,26 +107,24 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      *
      *
      *
      *
      * @param name
      * @param name
-     * @param stageId
      * @return
      * @return
      */
      */
-    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount " +
-            "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
-    List<Object[]> listGroupByAreaName(Long workId, String name, Integer stageId);
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`score` IS NULL,1,0)) leftCount,COUNT(p.question_id) totalCount " +
+            "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
+            "p.work_id = ? and p.subject = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name);
 
 
     /**
     /**
      * 考区已评数及总数(分档阶段)
      * 考区已评数及总数(分档阶段)
      *
      *
      *
      *
      * @param name
      * @param name
-     * @param stageId
      * @return
      * @return
      */
      */
-    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount " +
-            "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
-    List<Object[]> listGroupByAreaName(Long workId, String name, Integer stageId, int test);
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`level` IS NULL,1,0)) leftCount,COUNT(p.question_id) totalCount " +
+            "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
+            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name, int test);
 
 
     /**
     /**
      * 统计评卷员各试题已评数及总数(分档阶段)
      * 统计评卷员各试题已评数及总数(分档阶段)
@@ -160,9 +164,15 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long markerId, int stage, boolean isMissing, Long batchNo);
     int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long markerId, int stage, boolean isMissing, Long batchNo);
 
 
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null", nativeQuery = true)
+    int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long markerId, int stage, boolean isMissing, Long batchNo);
+
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and m.result =?3", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and m.result =?3", nativeQuery = true)
     int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing,Long batchNo,Long markerId);
     int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing,Long batchNo,Long markerId);
 
 
+    @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and p.level =?3 and m.result is not null", nativeQuery = true)
+    int countScoreByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing,Long batchNo,Long markerId);
+
     MarkTask findByPaperIdAndMarkerId(Long paperId, Long markId);
     MarkTask findByPaperIdAndMarkerId(Long paperId, Long markId);
 
 
     List<MarkTask> findByWorkId(Long workId);
     List<MarkTask> findByWorkId(Long workId);

+ 23 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java

@@ -83,6 +83,23 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
             "GROUP BY p.`level` ORDER BY p.`level`", nativeQuery = true)
             "GROUP BY p.`level` ORDER BY p.`level`", nativeQuery = true)
     List<Object[]> countGroupByLevel(Long questionId, Long batchNo);
     List<Object[]> countGroupByLevel(Long questionId, Long batchNo);
 
 
+    /**
+     * 统计科目指定试题的各档位打分数量
+     *
+     * @param questionId
+     * @return
+     */
+    @Query(value = "SELECT p.`score`,count(*)," +
+            "SUM(IF(p.`is_rejected` = 1, 1, 0))," +
+            "SUM(IF(p.`is_arbitrated` = 1, 1, 0))," +
+            "SUM(IF(p.`is_shift` = 1, 1, 0))," +
+            "SUM(IF(p.`is_shift_score` = 1, 1, 0))" +
+            "FROM paper p " +
+            "WHERE p.`question_id` = ? and p.is_missing = false " +
+            "AND p.score_batch_no = ? " +
+            "GROUP BY p.`score` ORDER BY p.`score`", nativeQuery = true)
+    List<Object[]> countScoreGroupByLevel(Long questionId, Long batchNo);
+
     /**
     /**
      * 统计科目指定试题的各档位数量
      * 统计科目指定试题的各档位数量
      *
      *
@@ -281,7 +298,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
 
     int countByWorkIdAndSubjectAndIsMissingFalseAndTestAndQuestionId(Long workId, Subject subject, int test, Long questionId);
     int countByWorkIdAndSubjectAndIsMissingFalseAndTestAndQuestionId(Long workId, Subject subject, int test, Long questionId);
 
 
-    List<Paper> findByworkIdAndSubjectAndQuestionIdAndTest(Long workId, Subject subject, Long questionId, int test);
+    List<Paper> findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTest(Long workId, Subject subject, Long questionId, boolean missing, int test);
 
 
     List<Paper> findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(Long workId, Subject subject, Sort sort);
     List<Paper> findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(Long workId, Subject subject, Sort sort);
 
 
@@ -289,5 +306,10 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
 
     int countByWorkIdAndSubjectAndScoreBatchNoIsNotNullAndScoreIsNull(Long workId, Subject subject);
     int countByWorkIdAndSubjectAndScoreBatchNoIsNotNullAndScoreIsNull(Long workId, Subject subject);
 
 
+    List<Paper> findByWorkIdAndSubjectAndIsSampleTrue(Long workId, Subject subject);
+
+    @Query("select max(p.scoreBatchNo) from Paper p where p.questionId = ?1")
+    Long findScoreBatchNoByQuestionId(Long questionId);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }
 }

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

@@ -117,7 +117,7 @@ public class ChangeLevelApi {
                 predicates.add(builder.equal(root.get("workId"), workId));
                 predicates.add(builder.equal(root.get("workId"), workId));
             }
             }
             if (!StringUtils.isEmpty(questionId)) {
             if (!StringUtils.isEmpty(questionId)) {
-                List<Paper> papers = paperRepo.findByworkIdAndSubjectAndQuestionIdAndTest(workId, Subject.valueOf(subject), questionId, TrialEnum.DEFAULT.ordinal());
+                List<Paper> papers = paperRepo.findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTest(workId, Subject.valueOf(subject), questionId, false, TrialEnum.DEFAULT.ordinal());
 //                predicates.add(builder.equal(root.get("areaCode"), areaCode));
 //                predicates.add(builder.equal(root.get("areaCode"), areaCode));
                 CriteriaBuilder.In<Object> in = builder.in(root.get("paperId"));
                 CriteriaBuilder.In<Object> in = builder.in(root.get("paperId"));
                 for (Paper paper : papers) {
                 for (Paper paper : papers) {

+ 92 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java

@@ -217,6 +217,96 @@ public class MakrerApi {
         return levelStatDTOs;
         return levelStatDTOs;
     }
     }
 
 
+    /**
+     * 评卷员打分数量
+     *
+     * @param marker     评卷员用户id
+     * @param questionId 试题id
+     * @return
+     */
+    @RequestMapping(value = "{marker}/stat/scores", method = RequestMethod.GET)
+    public List<LevelStatDTO> scoreStats(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
+        List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
+        MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
+        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
+        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
+        Long batchNo = paperRepo.findScoreBatchNoByQuestionId(questionId);
+        Future future = myThreadPool.arbitratePoolTaskExecutor.submit(new Callable<Map<String, Long>>() {
+
+            @Override
+            public Map<String, Long> call() throws Exception {
+                Map<String, Long> map = new HashMap<>();
+                //当前老师当前试卷的评档次数(不分档位)
+                long kdtotal = markTaskRepo.countScoreByQuestionId(questionId, batchNo, marker.getId());
+                //当前老师所有的评档次数(不分档位)
+                long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
+                map.put("kdtotal", kdtotal);
+                map.put("total", total);
+                return map;
+            }
+        });
+        //统计workId下各考点的数量
+        paperRepo.countScoreGroupByLevel(questionId, batchNo)
+                .forEach(o -> {
+                    LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
+                    levelStatDTO.setGcount(levelStatDTO.getCount());
+                    if (Objects.isNull(levelStatDTO.getId())) {
+                        //求任务数为null的条数
+                        int count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.SCORE.ordinal(), false, batchNo);
+                        levelStatDTO.setCount(count);
+                    } else {
+                        int count = markTaskRepo.countScoreByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.SCORE.ordinal(), levelStatDTO.getId().toString(), false, batchNo, marker.getId());
+                        levelStatDTO.setCount(count);
+                    }
+                    levelStatDTOs.add(levelStatDTO);
+                });
+        for (Level level : levels) {
+            //所有档位依次比较
+            long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
+            if (count == 0) {
+                LevelStatDTO dto = new LevelStatDTO();
+                dto.setId(level.getCode());
+                dto.setCount(0);
+                dto.setPercent(0.0);
+
+                //当前老师当前档位评档次数(所有考试)
+                int countNew = markTaskRepo.countScoreByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.SCORE.ordinal(), level.getCode(), false, batchNo, marker.getId());
+//                dto.setPercent(countNew == 0 ? 0D : dto.getPercent());
+                dto.setCount(countNew);
+                levelStatDTOs.add(dto);
+            }
+        }
+        long kdtotal = 0L, total = 0L;
+        if (Objects.nonNull(future) && Objects.nonNull(future.get())) {
+            Map<String, Long> map = (Map<String, Long>) future.get();
+            kdtotal = map.get("kdtotal");
+            total = map.get("total");
+        }
+
+        long finalKdtotal = kdtotal;
+        long finalTotal = total;
+        levelStatDTOs.forEach(o -> {
+            if (o.getId() != null) {
+                o.setPt(levelMap.get(o.getId()).getPt());
+                o.setKdpt(levelMap.get(o.getId()).getKdpt());
+                o.setCount(Objects.isNull(o.getCount()) ? 0 : o.getCount());
+                double p = (double) o.getCount() / finalKdtotal;
+                BigDecimal bd = new BigDecimal(p).setScale(3, RoundingMode.HALF_EVEN);
+                o.setPercent(bd.doubleValue());
+
+                o.setGcount(Objects.isNull(o.getGcount()) ? 0 : o.getGcount());
+                double gp = (double) o.getGcount() / finalTotal;
+                BigDecimal gbd = new BigDecimal(gp).setScale(3, RoundingMode.HALF_EVEN);
+                o.setGpercent(gbd.doubleValue());
+
+                int count = markTaskRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResult(questionId, marker.getId(), MarkStage.SCORE.ordinal(), o.getId().toString(), batchNo);
+                o.setPercent(count == 0 ? 0 : o.getPercent());
+                o.setCount(count);
+            }
+        });
+        return levelStatDTOs;
+    }
+
     /**
     /**
      * 各试题统计数据
      * 各试题统计数据
      *
      *
@@ -298,9 +388,9 @@ public class MakrerApi {
         //考区进度
         //考区进度
         List<Object[]> areas;
         List<Object[]> areas;
         if (markSubject.getStage() == MarkStage.SCORE) {
         if (markSubject.getStage() == MarkStage.SCORE) {
-            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal());
+            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name());
         } else {
         } else {
-            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
+            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getTest());
         }
         }
         if (areas != null) {
         if (areas != null) {
             List<QuestionStatDTO> questionStatDTOs = new ArrayList<>();
             List<QuestionStatDTO> questionStatDTOs = new ArrayList<>();

+ 16 - 3
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java

@@ -12,6 +12,7 @@ import cn.com.qmth.stmms.ms.marking.dto.LevelStatDTO;
 import cn.com.qmth.stmms.ms.marking.dto.LevleProgressDTO;
 import cn.com.qmth.stmms.ms.marking.dto.LevleProgressDTO;
 import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
 import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
 import cn.com.qmth.stmms.ms.marking.service.StageControlService;
 import cn.com.qmth.stmms.ms.marking.service.StageControlService;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.ResponseEntity;
@@ -23,6 +24,7 @@ import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -253,11 +255,22 @@ public class MarkSubjectApi {
      * 该评卷科目进入下一阶段
      * 该评卷科目进入下一阶段
      *
      *
      * @param markSubject 评卷科目id
      * @param markSubject 评卷科目id
-     * @param taskCount   分配任务数量
      */
      */
     @RequestMapping(value = "{markSubject}", method = RequestMethod.PATCH)
     @RequestMapping(value = "{markSubject}", method = RequestMethod.PATCH)
-    public void goNext(@PathVariable MarkSubject markSubject, @RequestParam(value = "taskCount", defaultValue = "0") int taskCount, List<TaskPublishSetting> taskList) throws Exception {
-        stageControlService.goNext(markSubject, taskCount, taskList);
+    public void goNext(@PathVariable MarkSubject markSubject, @RequestBody Map map) throws Exception {
+        stageControlService.goNext(markSubject, map);
+    }
+
+
+    /**
+     * 打分任务发布
+     *
+     * @param markSubject 评卷科目id
+     */
+    @RequestMapping(value = "{markSubject}/publishScore", method = RequestMethod.POST)
+    public void publishScore(@PathVariable MarkSubject markSubject, @RequestBody Map map) throws Exception {
+        List<TaskPublishSetting> taskList = JSONObject.parseArray(JSONObject.toJSONString(map.get("taskList")), TaskPublishSetting.class);
+        stageControlService.enterScoreStage(markSubject, taskList);
     }
     }
 
 
     /**
     /**

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

@@ -26,6 +26,7 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.orm.jpa.vendor.OpenJpaDialect;
 import org.springframework.orm.jpa.vendor.OpenJpaDialect;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
+import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
@@ -91,7 +92,9 @@ public class MarkTaskApi {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         Specification<MarkTask> specification = (root, query, builder) -> {
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             List<Predicate> predicates = new ArrayList<>();
-            predicates.add(builder.equal(root.get("questionId"), questionId));
+            if (Objects.nonNull(questionId)) {
+                predicates.add(builder.equal(root.get("questionId"), questionId));
+            }
             predicates.add(builder.equal(root.get("markerId"), markerId));
             predicates.add(builder.equal(root.get("markerId"), markerId));
             predicates.add(builder.equal(root.get("stage"), stage));
             predicates.add(builder.equal(root.get("stage"), stage));
             if (level == null) {
             if (level == null) {
@@ -104,6 +107,8 @@ public class MarkTaskApi {
                     predicates.add(builder.equal(root.get("paper").get("batchNo"), batchNo));
                     predicates.add(builder.equal(root.get("paper").get("batchNo"), batchNo));
                 }
                 }
             } else if (stage == MarkStage.SCORE) {
             } else if (stage == MarkStage.SCORE) {
+//                predicates.add(builder.isNotNull(root.get("result")));
+                predicates.add(builder.equal(root.get("paper").get("level"), level));
                 predicates.add(builder.isNotNull(root.get("result")));
                 predicates.add(builder.isNotNull(root.get("result")));
             }
             }
             if (isSample != null) {
             if (isSample != null) {
@@ -153,6 +158,41 @@ public class MarkTaskApi {
         return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
         return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
     }
     }
 
 
+    /**
+     * 评卷员的评卷任务
+     *
+     * @param markerId   评卷员用户id
+     * @param questionId 试题id
+     * @return
+     */
+    @RequestMapping(value = "/shift", method = RequestMethod.GET)
+    public PageableDTO list(@RequestParam Long markerId,
+                            @RequestParam(required = false) Boolean isShift,
+                            @RequestParam(required = false) Boolean isShiftScore,
+                            @RequestParam Long questionId,
+                            Pageable pageable) {
+        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
+        Specification<MarkTask> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("questionId"), questionId));
+            predicates.add(builder.equal(root.get("markerId"), markerId));
+            if (isShift != null) {
+                //查询
+                predicates.add(builder.equal(root.get("paper").get("isShift"), isShift));
+            }
+            if (isShiftScore != null) {
+                predicates.add(builder.equal(root.get("paper").get("isShiftScore"), isShiftScore));
+            }
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+        Sort sort = new Sort("paper.level", "serialNumber", "randomSeq");
+        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)));
+        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+    }
+
     /**
     /**
      * randomSeqNew排序
      * randomSeqNew排序
      *
      *
@@ -225,15 +265,15 @@ public class MarkTaskApi {
      */
      */
     @RequestMapping(value = "/reviewPaper", method = RequestMethod.GET)
     @RequestMapping(value = "/reviewPaper", method = RequestMethod.GET)
     public List<MarkTaskDTO> reviewPaper(@RequestParam Long markerId,
     public List<MarkTaskDTO> reviewPaper(@RequestParam Long markerId,
-                                   @RequestParam MarkStage stage,
-                                   @RequestParam Long questionId,
-                                   @RequestParam(required = false) String areaCode) {
+                                         @RequestParam MarkStage stage,
+                                         @RequestParam Long questionId,
+                                         @RequestParam(required = false) String areaCode) {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         Sort sort = new Sort(Sort.Direction.DESC, "updatedOn");
         Sort sort = new Sort(Sort.Direction.DESC, "updatedOn");
         Pageable pageable = new PageRequest(0, 5, sort);
         Pageable pageable = new PageRequest(0, 5, sort);
         Specification<MarkTask> specification = (root, query, builder) -> {
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             List<Predicate> predicates = new ArrayList<>();
-            if(Objects.nonNull(questionId)) {
+            if (Objects.nonNull(questionId)) {
                 predicates.add(builder.equal(root.get("questionId"), questionId));
                 predicates.add(builder.equal(root.get("questionId"), questionId));
             }
             }
             predicates.add(builder.equal(root.get("markerId"), markerId));
             predicates.add(builder.equal(root.get("markerId"), markerId));
@@ -272,17 +312,17 @@ public class MarkTaskApi {
      */
      */
     @RequestMapping(value = "/levelStatDetail", method = RequestMethod.GET)
     @RequestMapping(value = "/levelStatDetail", method = RequestMethod.GET)
     public List<LevelDetailDTO> levelStatDetail(@RequestParam Long workId,
     public List<LevelDetailDTO> levelStatDetail(@RequestParam Long workId,
-                                            @RequestParam Subject subject,
-                                            @RequestParam(required = false) Long questionId) {
+                                                @RequestParam Subject subject,
+                                                @RequestParam(required = false) Long questionId) {
 
 
         List<Level> levels = levelRepo.findByWorkIdOrderByCode(workId);
         List<Level> levels = levelRepo.findByWorkIdOrderByCode(workId);
         List<Paper> papers;
         List<Paper> papers;
         if (questionId == null) {
         if (questionId == null) {
-            papers = paperRepo.findByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.DEFAULT.getId());
+            papers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false, TrialEnum.DEFAULT.getId());
         } else {
         } else {
-            papers = paperRepo.findByworkIdAndSubjectAndQuestionIdAndTest(workId, subject, questionId, TrialEnum.DEFAULT.getId());
+            papers = paperRepo.findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTest(workId, subject, questionId, false, TrialEnum.DEFAULT.getId());
         }
         }
-        MarkSubject markSubject = markSubjectRepo.findOne(workId+"-"+subject.name());
+        MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
 
 
         List<LevelDetailDTO> list = new ArrayList<>();
         List<LevelDetailDTO> list = new ArrayList<>();
         for (Level level : levels) {
         for (Level level : levels) {
@@ -294,9 +334,9 @@ public class MarkTaskApi {
             levelDetailDTO.setMinScore(level.getMinScore());
             levelDetailDTO.setMinScore(level.getMinScore());
             levelDetailDTO.setMaxScore(level.getMaxScore());
             levelDetailDTO.setMaxScore(level.getMaxScore());
             //数量
             //数量
-            long count = papers.stream().filter(m-> Objects.nonNull(m.getLevel()) && Objects.equals(level.getCode(), m.getLevel())).count();
+            long count = papers.stream().filter(m -> Objects.nonNull(m.getLevel()) && Objects.equals(level.getCode(), m.getLevel())).count();
             levelDetailDTO.setLevelCount((int) count);
             levelDetailDTO.setLevelCount((int) count);
-            BigDecimal prop = new BigDecimal(String.valueOf(count*100)).divide(new BigDecimal(String.valueOf(papers.size())),2, BigDecimal.ROUND_HALF_UP);
+            BigDecimal prop = new BigDecimal(String.valueOf(count * 100)).divide(new BigDecimal(String.valueOf(papers.size())), 2, BigDecimal.ROUND_HALF_UP);
             //占比
             //占比
             levelDetailDTO.setLevelProp(prop.doubleValue());
             levelDetailDTO.setLevelProp(prop.doubleValue());
             //预设占比
             //预设占比
@@ -305,14 +345,14 @@ public class MarkTaskApi {
             BigDecimal diff = prop.subtract(new BigDecimal(String.valueOf(level.getPt())));
             BigDecimal diff = prop.subtract(new BigDecimal(String.valueOf(level.getPt())));
             levelDetailDTO.setDiffProp(diff.doubleValue());
             levelDetailDTO.setDiffProp(diff.doubleValue());
             //累计数量
             //累计数量
-            int sumCount = list.stream().mapToInt(LevelDetailDTO::getLevelCount).sum();
+            int sumCount = (int) (list.stream().mapToInt(LevelDetailDTO::getLevelCount).sum() + count);
             levelDetailDTO.setCumulateCount(sumCount + (int) count);
             levelDetailDTO.setCumulateCount(sumCount + (int) count);
             //累计占比
             //累计占比
-            double sumProp = list.stream().mapToDouble(LevelDetailDTO::getLevelProp).sum();
-            levelDetailDTO.setCumulateProp(sumProp + prop.doubleValue());
+            BigDecimal cumulateProp = new BigDecimal(String.valueOf(sumCount * 100)).divide(new BigDecimal(String.valueOf(papers.size())), 2, BigDecimal.ROUND_HALF_UP);
+            levelDetailDTO.setCumulateProp(cumulateProp.doubleValue());
 
 
             //调整
             //调整
-            int adjustment = new BigDecimal(String.valueOf(papers.size())).multiply(diff).intValue();
+            int adjustment = new BigDecimal(String.valueOf(papers.size())).multiply(diff.divide(new BigDecimal("100"))).intValue();
             levelDetailDTO.setAdjustmentCount(adjustment);
             levelDetailDTO.setAdjustmentCount(adjustment);
 
 
             list.add(levelDetailDTO);
             list.add(levelDetailDTO);

+ 52 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java

@@ -69,7 +69,7 @@ public class MarkTaskAssembler {
             markTaskDTO.setRandomSeq(markTask.getRandomSeq());
             markTaskDTO.setRandomSeq(markTask.getRandomSeq());
             markTaskDTO.setPaperId(paper.getId());
             markTaskDTO.setPaperId(paper.getId());
             markTaskDTO.setSerialNumber(markTask.getSerialNumber());
             markTaskDTO.setSerialNumber(markTask.getSerialNumber());
-            markTaskDTO.setDisplayNumber(markTask.getDisplayNumber());
+            markTaskDTO.setDisplayNumber(markTask.getDisplayNumber()==1);
         }
         }
         return markTaskDTO;
         return markTaskDTO;
     }
     }
@@ -115,4 +115,55 @@ public class MarkTaskAssembler {
         }
         }
         return markTaskDTO;
         return markTaskDTO;
     }
     }
+
+    /**
+     * 改档,改档打分
+     * @param markTask
+     * @return
+     */
+    public MarkTaskDTO toShiftDTO(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();
+            if (paper.isShift()) {
+                markTaskDTO.setLevel(markTask.getResult());
+                markTaskDTO.setOriginLevel(markTask.getOriginLevel());
+            }
+            if(paper.isShiftScore()){
+                markTaskDTO.setLevel(paper.getLevel());
+            }
+            markTaskDTO.setSn(markTask.getSecretNumber());
+            markTaskDTO.setRedoLevel(paper.getRedoLevel());
+            String imgSrc = null;
+            String thumbSrc = null;
+            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+                Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+                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(), paper.getExamNumber());
+                thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
+            }
+//            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());
+            markTaskDTO.setDisplayNumber(markTask.getDisplayNumber()==1);
+        }
+        return markTaskDTO;
+    }
 }
 }

+ 4 - 4
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java

@@ -21,7 +21,7 @@ public class MarkTaskDTO implements Serializable{
     private Long markerId;
     private Long markerId;
     private String marker;
     private String marker;
     private Date updatedOn;
     private Date updatedOn;
-    private String imgSrc;;
+    private String imgSrc;
     private String thumbSrc;
     private String thumbSrc;
     private boolean isSample;
     private boolean isSample;
     private boolean markByLeader;
     private boolean markByLeader;
@@ -30,7 +30,7 @@ public class MarkTaskDTO implements Serializable{
     private Long randomSeqNew;
     private Long randomSeqNew;
     private Integer randomSeq;
     private Integer randomSeq;
     private String serialNumber;
     private String serialNumber;
-    private Integer displayNumber;
+    private boolean displayNumber;
 
 
     public Integer getRandomSeq() {
     public Integer getRandomSeq() {
         return randomSeq;
         return randomSeq;
@@ -196,11 +196,11 @@ public class MarkTaskDTO implements Serializable{
         this.serialNumber = serialNumber;
         this.serialNumber = serialNumber;
     }
     }
 
 
-    public Integer isDisplayNumber() {
+    public boolean isDisplayNumber() {
         return displayNumber;
         return displayNumber;
     }
     }
 
 
-    public void setDisplayNumber(Integer displayNumber) {
+    public void setDisplayNumber(boolean displayNumber) {
         this.displayNumber = displayNumber;
         this.displayNumber = displayNumber;
     }
     }
 }
 }

+ 30 - 4
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java

@@ -181,6 +181,32 @@ public class AssignTaskService {
             }
             }
             markerGroupRepo.delete(markerGroups);
             markerGroupRepo.delete(markerGroups);
         }
         }
+//        if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
+//            //初始化打分任务数据
+//            initTaskPublishData(markSubject);
+//
+//        }
+    }
+
+    @Transactional
+    public void assignForGroupingScore(List<MarkerGroup> markerGroups, MarkSubject markSubject) {
+        markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
+        int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
+        List<MarkTask> markTasks = markTaskRepo.findByWorkId(markSubject.getWorkId());
+        if (markSubject.getTest() != 1) {
+            //更新subject表formal为正试评卷
+            markSubject.setFormal(true);
+            markSubjectRepo.saveAndFlush(markSubject);
+        }
+        //只有全部任务投放完成,才能删除分组
+        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) {
         if (MarkStage.SCORE.equals(markSubject.getStage()) && count == 0) {
             //初始化打分任务数据
             //初始化打分任务数据
             initTaskPublishData(markSubject);
             initTaskPublishData(markSubject);
@@ -193,7 +219,7 @@ public class AssignTaskService {
         sql.append("  SELECT                                                                         ");
         sql.append("  SELECT                                                                         ");
         sql.append("      a.work_id workId,                                                          ");
         sql.append("      a.work_id workId,                                                          ");
         sql.append("      b.subject,                                                                 ");
         sql.append("      b.subject,                                                                 ");
-        sql.append("      a.code level,                                                              ");
+        sql.append("      a.code,                                                                    ");
         sql.append("      IFNULL(b.totalCount, 0) totalCount                                        ");
         sql.append("      IFNULL(b.totalCount, 0) totalCount                                        ");
 //        sql.append("      IFNULL(b.successCount, 0) successCount,                                    ");
 //        sql.append("      IFNULL(b.successCount, 0) successCount,                                    ");
 //        sql.append("      IFNULL(b.waitCount, 0) waitCount                                           ");
 //        sql.append("      IFNULL(b.waitCount, 0) waitCount                                           ");
@@ -225,12 +251,12 @@ public class AssignTaskService {
         for (Object o : list) {
         for (Object o : list) {
             Map map = (Map) o;
             Map map = (Map) o;
             TaskPublishSetting taskPublishSetting = new TaskPublishSetting();
             TaskPublishSetting taskPublishSetting = new TaskPublishSetting();
-            taskPublishSetting.setWorkId((Long) map.get("workId"));
+            taskPublishSetting.setWorkId(Long.valueOf(map.get("workId").toString()));
             taskPublishSetting.setSubject((String) map.get("subject"));
             taskPublishSetting.setSubject((String) map.get("subject"));
             taskPublishSetting.setCode((String) map.get("code"));
             taskPublishSetting.setCode((String) map.get("code"));
-            taskPublishSetting.setTotalCount((Integer) map.get("totalCount"));
+            taskPublishSetting.setTotalCount(Integer.valueOf(map.get("totalCount").toString()));
             taskPublishSetting.setSuccessCount(0);
             taskPublishSetting.setSuccessCount(0);
-            taskPublishSetting.setWaitCount((Integer) map.get("totalCount"));
+            taskPublishSetting.setWaitCount(Integer.valueOf(map.get("totalCount").toString()));
             taskPublishSetting.setSortRule(0);
             taskPublishSetting.setSortRule(0);
             taskPublishSetting.setPublishCount(0);
             taskPublishSetting.setPublishCount(0);
             taskPublishSettings.add(taskPublishSetting);
             taskPublishSettings.add(taskPublishSetting);

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

@@ -66,10 +66,9 @@ public class StageControlService {
      * 进入下一阶段
      * 进入下一阶段
      *
      *
      * @param markSubject
      * @param markSubject
-     * @param taskList
      */
      */
     @Transactional
     @Transactional
-    public void goNext(MarkSubject markSubject, int taskCount, List<TaskPublishSetting> taskList) throws Exception {
+    public void goNext(MarkSubject markSubject, Map map) throws Exception {
         if (statusMap.get(markSubject.getId()) != null && statusMap.get(markSubject.getId())) {
         if (statusMap.get(markSubject.getId()) != null && statusMap.get(markSubject.getId())) {
             return;
             return;
         }
         }
@@ -83,12 +82,13 @@ public class StageControlService {
         switch (markStage) {
         switch (markStage) {
             case INIT:
             case INIT:
                 markSubject.setStage(MarkStage.LEVEL);
                 markSubject.setStage(MarkStage.LEVEL);
+                int taskCount = (int) map.get("taskCount");
                 enterLevelStage(markSubject, taskCount);
                 enterLevelStage(markSubject, taskCount);
                 break;
                 break;
             case LEVEL:
             case LEVEL:
                 markSubject.setStage(MarkStage.SCORE);
                 markSubject.setStage(MarkStage.SCORE);
 //                enterScoreStage(markSubject);
 //                enterScoreStage(markSubject);
-                enterScoreStage(markSubject, taskList);
+                enterToScoreStage(markSubject);
                 break;
                 break;
             case SCORE:
             case SCORE:
                 //TODO 进入抽查阶段
                 //TODO 进入抽查阶段
@@ -294,7 +294,7 @@ public class StageControlService {
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, null);
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, null);
     }
     }
 
 
-    private void enterScoreStage(MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
+    private void enterToScoreStage(MarkSubject markSubject) {
         Long workId = markSubject.getWorkId();
         Long workId = markSubject.getWorkId();
         Subject subject = markSubject.getSubject();
         Subject subject = markSubject.getSubject();
         List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
         List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
@@ -308,7 +308,32 @@ public class StageControlService {
             statusMap.put(markSubject.getId(), false);
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("没有分档完成");
             throw new RuntimeException("没有分档完成");
         }
         }
-        this.isPtFull(workId, markSubject);
+        //todo 待修改
+//        this.isPtFull(workId, markSubject);
+        List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
+        if (markerGroups.size() == 0) {
+            statusMap.put(markSubject.getId(), false);
+            throw new RuntimeException("评卷员没有进行分组");
+        }
+        markSubject.setAllLevel(true);
+        assignTaskService.assignForGroupingScore(markerGroups, markSubject);
+    }
+
+    public void enterScoreStage(MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
+        Long workId = markSubject.getWorkId();
+        Subject subject = markSubject.getSubject();
+        List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
+        List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_SCORING).collect(Collectors.toList());
+        if (levelMarkers.size() == 0) {
+            statusMap.put(markSubject.getId(), false);
+            throw new RuntimeException("没有设定评卷员");
+        }
+        int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNullAndTest(workId, subject, 0);
+        if (count > 0) {
+            statusMap.put(markSubject.getId(), false);
+            throw new RuntimeException("没有分档完成");
+        }
+//        this.isPtFull(workId, markSubject);
         List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
         List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
         if (markerGroups.size() == 0) {
         if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             statusMap.put(markSubject.getId(), false);
@@ -322,12 +347,17 @@ public class StageControlService {
                 throw new RuntimeException(taskPublishSetting.getCode()+"档位本次任务数量必须小于等于未评数量");
                 throw new RuntimeException(taskPublishSetting.getCode()+"档位本次任务数量必须小于等于未评数量");
             }
             }
         }
         }
+        //已发布任务是否都已完成
+        int waitCount = paperRepo.countByWorkIdAndSubjectAndScoreBatchNoIsNotNullAndScoreIsNull(workId, subject);
+        if (waitCount > 0) {
+            statusMap.put(markSubject.getId(), false);
+            throw new RuntimeException("没有打分完成");
+        }
 
 
         //总的发布任务数
         //总的发布任务数
         int totalTaskCount = taskList.stream().mapToInt(TaskPublishSetting::getTaskCount).sum();
         int totalTaskCount = taskList.stream().mapToInt(TaskPublishSetting::getTaskCount).sum();
 
 
-        markSubject.setAllLevel(true);
-        Sort sort = new Sort("questionId");
+        Sort sort = new Sort("questionId","level");
         List<Paper> papers = null;
         List<Paper> papers = null;
         Map<String, TaskPublishSetting> map = new HashMap<>();
         Map<String, TaskPublishSetting> map = new HashMap<>();
         papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, subject, sort);
         papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, subject, sort);
@@ -336,9 +366,11 @@ public class StageControlService {
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, taskList);
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, taskList);
 
 
         //保存发布数据
         //保存发布数据
-        int max = taskList.get(0).getPublishCount() + 1;
+        int max = taskPublishSettingRepo.maxPublishCount(workId, subject.name()) + 1;
         long scoreBatchNo = papers.get(0).getScoreBatchNo();
         long scoreBatchNo = papers.get(0).getScoreBatchNo();
         taskList.stream().map(m->{
         taskList.stream().map(m->{
+            m.setWorkId(workId);
+            m.setSubject(subject.name());
             m.setSuccessCount(m.getSuccessCount() + m.getTaskCount());
             m.setSuccessCount(m.getSuccessCount() + m.getTaskCount());
             m.setWaitCount(m.getTotalCount() - m.getSuccessCount());
             m.setWaitCount(m.getTotalCount() - m.getSuccessCount());
             m.setTaskCount(0);
             m.setTaskCount(0);