Эх сурвалжийг харах

测试bug修复,新需求增加-0814

xiaof 4 жил өмнө
parent
commit
d3c775e838
15 өөрчлөгдсөн 350 нэмэгдсэн , 76 устгасан
  1. 124 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/ScoreExporter.java
  2. 2 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  3. 2 2
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java
  4. 1 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Level.java
  5. 1 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkSubjectRepo.java
  6. 5 5
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  7. 20 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  8. 46 38
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java
  9. 3 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  10. 59 11
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  11. 65 9
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  12. 8 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  13. 10 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  14. 2 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java
  15. 2 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 124 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/ScoreExporter.java

@@ -198,6 +198,129 @@ public class ScoreExporter {
         return sheet;
     }
 
+    /**
+     * 绘制固定表头
+     *
+     * @param type
+     * @param sheet
+     * @param style
+     * @param row
+     * @param workId
+     * @param subjectMap
+     */
+    public Sheet drawExcelFixedHeadLevel(int type, Sheet sheet, CellStyle style, Row row, Map<String, Map<String, ExportLevelResultDTO>> subjectMap, Long workId) {
+        //准考证号
+        Cell cell = row.createCell(0);
+        cell.setCellValue(EXAM_NUMBER);
+        cell.setCellStyle(style);
+        CellRangeAddress region1 = new CellRangeAddress(0, 1, (short) 0, (short) 0);
+        sheet.addMergedRegion(region1);
+        sheet.setColumnWidth(0, 15 * 256);
+        //姓名
+        Cell cell1 = row.createCell(1);
+        cell1.setCellValue(NAME);
+        cell1.setCellStyle(style);
+        CellRangeAddress region2 = new CellRangeAddress(0, 1, (short) 1, (short) 1);
+        sheet.addMergedRegion(region2);
+        //考区
+        Cell cell2 = row.createCell(2);
+        cell2.setCellValue(AREA_NAME);
+        cell2.setCellStyle(style);
+        CellRangeAddress region3 = new CellRangeAddress(0, 1, (short) 2, (short) 2);
+        sheet.addMergedRegion(region3);
+        sheet.setColumnWidth(2, 30 * 256);
+        //生源地
+        Cell cell5 = row.createCell(3);
+        cell5.setCellValue(SOURCE_NAME);
+        cell5.setCellStyle(style);
+        CellRangeAddress region6 = new CellRangeAddress(0, 1, (short) 3, (short) 3);
+        sheet.addMergedRegion(region6);
+        if (!imageConfig.isCustomSubject()) {
+            //色彩
+            int size = 0;
+            if (Objects.nonNull(subjectMap.get(Subject.SC.toString()))) {
+                size = subjectMap.get(Subject.SC.toString()).size();
+            }
+            int scSumCount = 0;
+            if (type == 2) {
+                scSumCount = score + size + 5;
+            } else {
+                scSumCount = score + size;
+            }
+            Cell cell6 = row.createCell(score);
+            cell6.setCellValue(SC_NAME);
+            cell6.setCellStyle(style);
+            if (score != scSumCount) {
+                CellRangeAddress region7 = new CellRangeAddress(0, 0, (short) score, scSumCount);
+                sheet.addMergedRegion(region7);
+            }
+            LOGGER.info("level:{},scSumCount:{}", score, scSumCount);
+
+            //素描
+            scSumCount = scSumCount + 1;//起始列+1
+            size = 0;
+            if (Objects.nonNull(subjectMap.get(Subject.SM.toString()))) {
+                size = subjectMap.get(Subject.SM.toString()).size();
+            }
+            int smSumCount = 0;
+            if (type == 2) {
+                smSumCount = scSumCount + size + 5;//最终列+1,因为从0开始
+            } else {
+                smSumCount = scSumCount + size;
+            }
+            Cell cell7 = row.createCell(scSumCount);
+            cell7.setCellValue(SM_NAME);
+            cell7.setCellStyle(style);
+            if (scSumCount != smSumCount) {
+                CellRangeAddress region8 = new CellRangeAddress(0, 0, (short) scSumCount, smSumCount);
+                sheet.addMergedRegion(region8);
+            }
+            LOGGER.info("scSumCount:{},smSumCount:{}", scSumCount, smSumCount);
+            //速写
+            smSumCount = smSumCount + 1;//起始列+1
+            size = 0;
+            if (Objects.nonNull(subjectMap.get(Subject.SX.toString()))) {
+                size = subjectMap.get(Subject.SX.toString()).size();
+            }
+            int sxSumCount = 0;
+            if (type == 2) {
+                sxSumCount = smSumCount + size + 5;//最终列+1,因为从0开始
+            } else {
+                sxSumCount = smSumCount + size;
+            }
+            Cell cell8 = row.createCell(smSumCount);
+            cell8.setCellValue(SX_NAME);
+            cell8.setCellStyle(style);
+            if (smSumCount != sxSumCount) {
+                CellRangeAddress region9 = new CellRangeAddress(0, 0, (short) smSumCount, sxSumCount);
+                sheet.addMergedRegion(region9);
+            }
+            LOGGER.info("smSumCount:{},sxSumCount:{}", smSumCount, sxSumCount);
+        } else {
+            //自定义
+            int size = 0;
+            if (Objects.nonNull(subjectMap.get(Subject.CUSTOM.toString()))) {
+                size = subjectMap.get(Subject.CUSTOM.toString()).size();
+            }
+            int customSumCount = 0;
+            if (type == 2) {
+                customSumCount = score + size + 1;
+            } else {
+                customSumCount = score + size;
+            }
+            MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + Subject.CUSTOM.name());
+            Cell cell6 = row.createCell(score);
+            cell6.setCellValue(markSubject.getName());
+            cell6.setCellStyle(style);
+            if (score != customSumCount) {
+                CellRangeAddress region7 = new CellRangeAddress(0, 0, (short) score, customSumCount);
+                sheet.addMergedRegion(region7);
+            }
+            LOGGER.info("level:{},customSumCount:{}", score, customSumCount);
+        }
+        return sheet;
+    }
+
     /**
      * 绘制固定表头
      *
@@ -380,7 +503,7 @@ public class ScoreExporter {
             Row row = sheet.createRow(0);
 
             //绘制固定表头
-            sheet = drawExcelFixedHead(levelInterval, sheet, style, row, subjectMap, workId);
+            sheet = drawExcelFixedHeadLevel(levelInterval, sheet, style, row, subjectMap, workId);
 
             //绘制动态表头
             Row dynamicHeadRow = sheet.createRow(1);

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

@@ -533,9 +533,9 @@ public class DataUploadService {
     @Transactional
     public List<ExcelError> uploadStudentRelate(Long workId, InputStream inputStream) throws Exception {
         //已进入分档,不能导入
-        List<MarkSubject> list = markSubjectRepo.findAllByWorkIdAndStageNot(workId, MarkStage.INIT.ordinal());
+        List<MarkSubject> list = markSubjectRepo.findAllByWorkIdAndStageNot(workId, MarkStage.INIT);
         if (list != null && list.size() > 0) {
-            throw new Exception("进入分档阶段,不能导入关联考生数据");
+            throw new Exception("进入分档或者打分阶段,不能导入关联考生数据");
         }
 
         ExcelReader excelReader = new ExcelReader(StudentRelateDTO.class);

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

@@ -168,8 +168,8 @@ public class TrialService {
             if (finalPaperList.size() > 0) {
                 finalPaperList.forEach(o -> {
                     markingService.levelMarkPaper(o, levelMap.get(o.getExamNumber()), true);
-                    o.setTest(TrialEnum.START_FORMAL.getId());
-                    o.setActive(true);
+                    o.setTest(TrialEnum.DEFAULT.getId());
+                    o.setActive(false);
                 });
                 paperRepo.save(finalPaperList);
             }

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

@@ -89,7 +89,7 @@ public class Level implements Serializable{
      */
     private int pt = 0;
     /**
-     * 考阀值
+     * 考阀值
      */
     private int kdpt = 0;
 

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

@@ -27,7 +27,7 @@ public interface MarkSubjectRepo extends JpaRepository<MarkSubject,String> {
 
     List<MarkSubject> findByWorkIdAndTestNotIn(Long workId, List<Integer> ints);
 
-    List<MarkSubject> findAllByWorkIdAndStageNot(Long workId, int ordinal);
+    List<MarkSubject> findAllByWorkIdAndStageNot(Long workId, MarkStage stage);
 
     List<MarkSubject> findAllByWorkIdAndStage(Long workId, MarkStage stage);
 }

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

@@ -107,8 +107,8 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     @Query(value = "SELECT q.`id`,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount, SUM(t.is_rejected) rejectedCount, q.area_code areaCode " +
             "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 = ? or p.is_test = ?  GROUP BY t.marker_id, t.`marker_name` ORDER BY q.`id`,t.marker_id", nativeQuery = true)
-    List<Object[]> listGroupByQuestionAndMarker(Long workId, String name, Integer stageId, int test, int test1);
+            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY t.marker_id, t.`marker_name` ORDER BY q.`id`,t.marker_id", nativeQuery = true)
+    List<Object[]> listGroupByQuestionAndMarker(Long workId, String name, Integer stageId, int test);
 
     /**
      * 考区已评数及总数(分档阶段)
@@ -129,10 +129,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      * @param name
      * @return
      */
-    @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 " +
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`level` IS NULL or (p.level is not null and p.is_active = 0),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 = ? or 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, int test1);
+            "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);
 
     /**
      * 统计评卷员各试题已评数及总数(分档阶段)

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

@@ -314,11 +314,31 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByWorkIdAndSubjectAndIsOneClickTrue(Long workId, Subject subject);
 
+    @Query("select count(p) from Paper p where p.workId = ?1 and p.subject = ?2 and p.isMissing = false and (p.test = ?3 or p.test = ?4) and p.questionId = ?5")
     int countByWorkIdAndSubjectAndIsMissingFalseAndTestOrTestAndQuestionId(Long workId, Subject subject, int i, int i1, Long id);
 
+    @Query("select count(p) from Paper p where p.workId = ?1 and p.subject = ?2 and p.isMissing = false and (p.test = ?3 or p.test = ?4)")
     int countByWorkIdAndSubjectAndIsMissingFalseAndTestOrTest(Long workId, Subject subject, int i, int i1);
 
+    @Query("select p from Paper p where p.workId = ?1 and p.subject = ?2 and p.isMissing = false and p.active = false and (p.test = ?3 or p.test = ?4) order by p.questionId")
     List<Paper> findByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndTestOrTestOrderByQuestionId(Long workId, Subject subject, int id, int id1);
 
+    @Query("select p from Paper p where p.workId = ?1 and p.subject = ?2 and p.questionId = ?3 and p.isMissing = ?4 and (p.test = ?5 or p.test = ?6)")
+    List<Paper> findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTestOrTest(Long workId, Subject subject, Long questionId, boolean b, int id, int id1);
+
+    @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.is_test = ? and p.score is null " +
+            "GROUP BY p.`score`", nativeQuery = true)
+    List<Object[]> countScoreGroupByLevelAll(Long questionId, int test);
+
+    int countByWorkIdAndSubjectAndLevelAndScoreNotNull(Long workId, Subject subject, Object id);
+
+    int countByWorkIdAndSubjectAndQuestionIdAndLevelAndScoreNotNull(Long workId, Subject subject, Long questionId, String valueOf);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }

+ 46 - 38
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java

@@ -124,46 +124,54 @@ public class MarkLogAop {
         Map<String, Object> map = getAspectCommon(joinPoint);
         JSONArray jsonArgsArray = (JSONArray) map.get(PARAM_ARGS);
         MarkUser markUser = (MarkUser) map.get(MARK_USER);
-        Paper paper = JSONObject.parseObject(((JSONObject) jsonArgsArray.get(0)).toJSONString(), Paper.class);
-        JSONObject jsonObjectResult = (JSONObject) jsonArgsArray.get(1);
-        String action = null;
-        Integer operType = null;
-        String originLevel = null;
-        if (Objects.nonNull(jsonObjectResult) && Objects.nonNull(jsonObjectResult.get(ACTION))) {
-            action = (String) jsonObjectResult.get(ACTION);
-            if (Objects.equals(SAMPLING, action)) {
-                //标准卷设置
-                operType = MarkLogOperType.CRITERION_PAPER_SET.getId();
-                paper.setOneClick(false);
-            } else if (Objects.equals(LEVELING, action)) {
-                //定档设置
-                operType = MarkLogOperType.ONE_CLICK_LEVEl.getId();
-                //原始档位
-                originLevel = Objects.nonNull(jsonObjectResult.get("originLevel")) ? (String) jsonObjectResult.get("originLevel") : null;
-                paper.setOneClick(true);
-            } else if (Objects.equals(REJECT, action)) {
-                //档位打回设置
-                operType = MarkLogOperType.CALLBACK_LEVEl.getId();
-                paper.setOneClick(false);
+//        Paper paper = JSONObject.parseObject(((JSONObject) jsonArgsArray.get(0)).toJSONString(), Paper.class);
+        JSONObject jsonObjectResult = (JSONObject) jsonArgsArray.get(0);
+        String paperIds = (String) jsonObjectResult.get("paperIds");
+        if (paperIds.length() > 0) {
+            String[] ids = paperIds.split(",");
+            for (String id : ids) {
+                Paper paper = paperRepo.findOne(Long.valueOf(id));
+
+                String action = null;
+                Integer operType = null;
+                String originLevel = null;
+                if (Objects.nonNull(jsonObjectResult) && Objects.nonNull(jsonObjectResult.get(ACTION))) {
+                    action = (String) jsonObjectResult.get(ACTION);
+                    if (Objects.equals(SAMPLING, action)) {
+                        //标准卷设置
+                        operType = MarkLogOperType.CRITERION_PAPER_SET.getId();
+                        paper.setOneClick(false);
+                    } else if (Objects.equals(LEVELING, action)) {
+                        //定档设置
+                        operType = MarkLogOperType.ONE_CLICK_LEVEl.getId();
+                        //原始档位
+                        originLevel = Objects.nonNull(jsonObjectResult.get("originLevel")) ? (String) jsonObjectResult.get("originLevel") : null;
+                        paper.setOneClick(true);
+                    } else if (Objects.equals(REJECT, action)) {
+                        //档位打回设置
+                        operType = MarkLogOperType.CALLBACK_LEVEl.getId();
+                        paper.setOneClick(false);
+                    }
+                }
+                //标准卷设置、定档设置、档位打回start
+                MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(markUser.getId(), operType, markUser.getSubject().toString(), paper.getExamNumber());
+                String operResult = DEFAULT_RESULT;
+                if (Objects.nonNull(markLogPrev)) {
+                    operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse(DEFAULT_RESULT);
+                }
+                if (Objects.equals(LEVELING, action)) {
+                    //定档设置
+                    operResult = originLevel;
+                }
+                Work work = workRepo.findOne(paper.getWorkId());
+                MarkLog markLog = new MarkLog(markUser.getId(), markUser.getName(), markUser.getRole(), markUser.getSubject(), paper.getExamNumber(), paper.getStudentName(), operType, paper.getWorkId(), paper.getId(), MarkStage.LEVEL, operResult, String.valueOf(jsonObjectResult.get(LEVEL)), null, work.getName());
+                LOGGER.info("markLog:{}", JSONObject.toJSONString(markLog));
+                //标准卷设置、定档设置、档位打回end
+                markLogRepo.save(markLog);
+                //更新
+                paperRepo.save(paper);
             }
         }
-        //标准卷设置、定档设置、档位打回start
-        MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(markUser.getId(), operType, markUser.getSubject().toString(), paper.getExamNumber());
-        String operResult = DEFAULT_RESULT;
-        if (Objects.nonNull(markLogPrev)) {
-            operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse(DEFAULT_RESULT);
-        }
-        if (Objects.equals(LEVELING, action)) {
-            //定档设置
-            operResult = originLevel;
-        }
-        Work work = workRepo.findOne(paper.getWorkId());
-        MarkLog markLog = new MarkLog(markUser.getId(), markUser.getName(), markUser.getRole(), markUser.getSubject(), paper.getExamNumber(), paper.getStudentName(), operType, paper.getWorkId(), paper.getId(), MarkStage.LEVEL, operResult, String.valueOf(jsonObjectResult.get(LEVEL)), null, work.getName());
-        LOGGER.info("markLog:{}", JSONObject.toJSONString(markLog));
-        //标准卷设置、定档设置、档位打回end
-        markLogRepo.save(markLog);
-        //更新
-        paperRepo.save(paper);
     }
 
     /**

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

@@ -415,7 +415,7 @@ public class MakrerApi {
                 successCount = paperRepo.countByWorkIdAndSubjectAndScoreNotNullAndIsMissingFalseAndActiveTrueAndTest(workId, subject, 0);
             }
             //所有任务数(查询所有有效试卷)
-            int totalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTestOrTest(workId, subject, 0, 3);
+            int totalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTest(workId, subject, 0);
 
             BigDecimal waitTotal = BigDecimal.valueOf(totalCount).subtract(BigDecimal.valueOf(successCount));
             //进度
@@ -435,7 +435,7 @@ public class MakrerApi {
         if (markSubject.getStage().name() == MarkStage.SCORE.name()) {
             areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name());
         } else {
-            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getTest(), 3);
+            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getTest());
         }
         if (areas != null) {
             List<QuestionStatDTO> questionStatDTOs = new ArrayList<>();
@@ -462,7 +462,7 @@ public class MakrerApi {
         if (markSubject.getStage().name() == MarkStage.SCORE.name()) {
             qStats = markTaskRepo.listGroupByQuestionAndMarker(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal());
         } else {
-            qStats = markTaskRepo.listGroupByQuestionAndMarker(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest(), 3);
+            qStats = markTaskRepo.listGroupByQuestionAndMarker(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
         }
         if (qStats != null) {
             List<MarkQuestionStatDTO> questionStatDTOs = new ArrayList<>();

+ 59 - 11
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java

@@ -129,17 +129,11 @@ public class MarkSubjectApi {
     public List<LevelStatDTO> levelStat(HttpServletRequest request, @PathVariable MarkSubject markSubject, @RequestParam Long questionId) {
         List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
         paperRepo.countGroupByLevelAll(questionId, markSubject.getTest())
-                .forEach(o -> {
-                    levelStatDTOs.add(levelStatAssembler.toDTO(o));
-                });
-        //2019-11-12备用
-        /*paperRepo.countGroupByLevelAllOther(questionId, questionId, questionId)
-                .forEach(o -> {
-                    levelStatDTOs.add(levelStatAssembler.toDTO(o));
-                });*/
+                .forEach(o -> levelStatDTOs.add(levelStatAssembler.toDTO(o)));
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         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());
@@ -148,12 +142,67 @@ public class MarkSubjectApi {
                 levelStatDTOs.add(dto);
             }
         }
+        //当前考区总数
         long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
+        //所有考区总数
+        long gtotal = paperRepo.countByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
         levelStatDTOs.forEach(o -> {
             if (o.getId() != null) {
-                double p = total == 0 ? 0 : (double) o.getCount() / total;
+                //当前考区档位占比
+                double p = total == 0 ? 0 : (double) o.getCount() / total * 100;
                 BigDecimal bd = new BigDecimal(p).setScale(3, RoundingMode.HALF_EVEN);
                 o.setPercent(bd.doubleValue());
+                //考区阈值
+                Level level = levels.stream().filter(l -> l.getCode().equals(o.getId())).collect(Collectors.toList()).get(0);
+                o.setKdpt(level.getKdpt());
+                //所有考区档位数量
+                long gcount = paperRepo.countByWorkIdAndSubjectAndLevel(markSubject.getWorkId(), markSubject.getSubject(), String.valueOf(o.getId()));
+                o.setGcount((int) gcount);
+                //所有考区档位占比
+                double gp = gtotal == 0 ? 0 : (double) o.getGcount() / gtotal * 100;
+                BigDecimal gbd = new BigDecimal(gp).setScale(3, RoundingMode.HALF_EVEN);
+                o.setGpercent(gbd.doubleValue());
+                o.setPt(level.getPt());
+            }
+        });
+        Collections.sort(levelStatDTOs, (o1, o2) -> {
+            if (o1.getId() == null || o2.getId() == null) {
+                return 1;
+            }
+            return o1.getId().toString().compareTo(o2.getId().toString());
+        });
+        return levelStatDTOs;
+    }
+
+
+    /**
+     * 该评卷科目的分档统计信息
+     *
+     * @param markSubject 评卷科目id
+     * @param questionId  试题id
+     * @return
+     */
+    @RequestMapping(value = "{markSubject}/stat/scores", method = RequestMethod.GET)
+    public List<LevelStatDTO> scoreStat(HttpServletRequest request, @PathVariable MarkSubject markSubject, @RequestParam Long questionId) {
+        List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
+        paperRepo.countScoreGroupByLevelAll(questionId, markSubject.getTest())
+                .forEach(o -> levelStatDTOs.add(levelStatAssembler.toDTO(o)));
+        List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
+        for (Level level : levels) {
+            //没有该档位,新增
+            LevelStatDTO dto = new LevelStatDTO();
+            dto.setId(level.getCode());
+            dto.setCount(0);
+            dto.setPercent(0.0);
+            levelStatDTOs.add(dto);
+        }
+        levelStatDTOs.forEach(o -> {
+            if (o.getId() != null) {
+                int count = paperRepo.countByWorkIdAndSubjectAndQuestionIdAndLevelAndScoreNotNull(markSubject.getWorkId(), markSubject.getSubject(), questionId, String.valueOf(o.getId()));
+                o.setCount(count);
+                //所有考区已打分数量
+                int gcount = paperRepo.countByWorkIdAndSubjectAndLevelAndScoreNotNull(markSubject.getWorkId(), markSubject.getSubject(), o.getId());
+                o.setGcount(gcount);
             }
         });
         Collections.sort(levelStatDTOs, (o1, o2) -> {
@@ -184,7 +233,7 @@ public class MarkSubjectApi {
      */
     @RequestMapping(value = "{markSubject}/markergroups", method = RequestMethod.POST)
     public MarkerGroup createMarkerGroup(@PathVariable MarkSubject markSubject, @RequestBody MarkerGroup markerGroup) {
-        if(markerGroup.getMarkers().size() == 0){
+        if (markerGroup.getMarkers().size() == 0) {
             throw new RuntimeException("不可创建空分组");
         }
         markerGroup.setWorkId(markSubject.getWorkId());
@@ -269,7 +318,6 @@ public class MarkSubjectApi {
 
     /**
      * 检查是否已分档完成
-     *
      */
     @RequestMapping(value = "{markSubject}/canLevel", method = RequestMethod.GET)
     public Boolean canLevel(@PathVariable MarkSubject markSubject) {

+ 65 - 9
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -157,10 +157,10 @@ public class PaperApi {
         Specification<Paper> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.equal(root.get("workId"), workId));
-            if(areaCode != null && areaCode != "") {
+            if (areaCode != null && areaCode != "") {
                 predicates.add(builder.equal(root.get("areaCode"), areaCode));
             }
-            if(subject != null) {
+            if (subject != null) {
                 predicates.add(builder.equal(root.get("subject"), subject));
             }
             if (startNumber != null && endNumber != null) {
@@ -208,18 +208,31 @@ public class PaperApi {
                             @RequestParam(required = false) Boolean markedLogic,
                             @RequestParam(required = false) Boolean arbi,
                             @RequestParam(required = false) Boolean reject,
+                            @RequestParam(defaultValue = "false") Boolean isScore,//打分阶段该档位已打分数
                             Pageable pageable) {
         //查询最大批次号
 //        Long batchNo = paperRepo.findByQuestionId(questionId);
         Specification<Paper> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.equal(root.get("questionId"), questionId));
-            if (Objects.isNull(level)) {
-                predicates.add(builder.isNull(root.get("level")));
-                //查询当前批次号数据
-//                predicates.add(builder.equal(root.get("batchNo"), batchNo));
+            //isScore为true时,为科组长打分详情页面数据查询条件
+            if(isScore) {
+                //level为null时,查询待评数量
+                if (Objects.isNull(level)) {
+                    predicates.add(builder.isNotNull(root.get("level")));
+                    predicates.add(builder.isNull(root.get("score")));
+                } else {
+                    predicates.add(builder.equal(root.get("level"), level));
+                    predicates.add(builder.isNotNull(root.get("score")));
+                }
             } else {
-                predicates.add(builder.equal(root.get("level"), level));
+                if (Objects.isNull(level)) {
+                    predicates.add(builder.isNull(root.get("level")));
+                    //查询当前批次号数据
+//                predicates.add(builder.equal(root.get("batchNo"), batchNo));
+                } else {
+                    predicates.add(builder.equal(root.get("level"), level));
+                }
             }
             if (arbi != null) {
                 predicates.add(builder.equal(root.get("isArbitrated"), arbi));
@@ -243,6 +256,7 @@ public class PaperApi {
         papers.forEach(p -> {
             paperDTOs.add(paperAssembler.toDTO(p));
         });
+        paperDTOs.sort(Comparator.comparingInt(PaperDTO::getSortSum));
         return new PageableDTO(paperDTOs, papers.getTotalElements(), papers.getTotalPages(), pageable.getPageNumber());
     }
 
@@ -278,6 +292,48 @@ public class PaperApi {
         return new ResponseEntity(paperAssembler.toDTO(paper), HttpStatus.OK);
     }
 
+    /**
+     * 批量试卷处理。提交评卷
+     *
+     * @param body 试卷信息
+     * @return
+     */
+    @RequestMapping(value = "batch", method = RequestMethod.PATCH)
+    @Transactional
+    public ResponseEntity marking(@RequestBody HashMap<String, String> body) {
+        String action = body.get("action");
+        String level = body.get("level");
+        String tagged = body.get("tagged");
+        String paperIds = body.get("paperIds");
+        if (paperIds.length() > 0) {
+            List<PaperDTO> list = new ArrayList<>();
+            String[] ids = paperIds.split(",");
+            for (String id : ids) {
+                Paper paper = paperRepo.findOne(Long.valueOf(id));
+                //需要打回的评卷员
+                String ranges = body.get("range");
+                if (action != null && level != null) {
+                    if (action.equals("leveling")) {
+                        markingService.levelMarkPaper(paper, level, false);
+                    } else if (action.equals("sampling")) {
+                        markingService.levelMarkPaper(paper, level, true);
+                    } else if (action.equals("reject")) {
+                        markingService.reject(paper, level, ranges);
+                    }
+                }
+                if (tagged != null) {
+                    boolean isTagged = paper.isTagged();
+                    paper.setTagged(!isTagged);
+                    paperRepo.save(paper);
+                }
+                PaperDTO paperDTO = paperAssembler.toDTO(paper);
+                list.add(paperDTO);
+            }
+            return new ResponseEntity(list, HttpStatus.OK);
+        }
+        return null;
+    }
+
     /**
      * 标记试卷
      *
@@ -451,7 +507,7 @@ public class PaperApi {
         }
         InputStream inputStream = file.getInputStream();
         //保存
-        String savePath = systemConfig.getLocalhostPath() + File.separator + "files"+ File.separator + workId + File.separator + questionId + File.separator + subject.name();
+        String savePath = systemConfig.getLocalhostPath() + File.separator + "files" + File.separator + workId + File.separator + questionId + File.separator + subject.name();
         File fileSave = new File(savePath);
         if (!fileSave.exists()) {
             fileSave.mkdirs();
@@ -460,7 +516,7 @@ public class PaperApi {
         File[] oldFiles = fileSave.listFiles();
         if (oldFiles.length > 0) {
             for (File oldFile : oldFiles) {
-                if(oldFile.exists()) {
+                if (oldFile.exists()) {
                     oldFile.delete();
                 }
             }

+ 8 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -5,10 +5,12 @@ import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 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.Student;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
@@ -18,7 +20,9 @@ import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * Created by zhengmin on 2016/10/10.
@@ -98,6 +102,10 @@ public class PaperAssembler {
             paperDTO.setPaperTest(paper.getTest());
             paperDTO.setShift(paper.isShift());
             paperDTO.setShiftScore(paper.isShiftScore());
+            //计算levelValue和
+            List<MarkTask> markTaskList = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
+            int sum = markTaskList.stream().mapToInt(MarkTask::getLevelValue).sum();
+            paperDTO.setSortSum(sum);
         }
         return paperDTO;
     }

+ 10 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java

@@ -43,6 +43,8 @@ public class PaperDTO implements Serializable{
     private int paperTest;
     private boolean shift;
     private boolean shiftScore;
+    //排序用
+    private int sortSum;
     private List<MarkTaskDTO> markResults = new ArrayList<>();
 
     public int getPaperTest() {
@@ -280,4 +282,12 @@ public class PaperDTO implements Serializable{
     public void setShiftScore(boolean shiftScore) {
         this.shiftScore = shiftScore;
     }
+
+    public int getSortSum() {
+        return sortSum;
+    }
+
+    public void setSortSum(int sortSum) {
+        this.sortSum = sortSum;
+    }
 }

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

@@ -82,7 +82,7 @@ public class MarkingService {
 
         //如果已经由科组长定档,则不做处理
         Paper paper = markTask.getPaper();
-        if (paper.isMarkByLeader()) {
+        if (paper.isMarkByLeader() && Objects.nonNull(paper.getLevel())) {
             return markTask;
         }
         /**
@@ -271,6 +271,7 @@ public class MarkingService {
         List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
         for (MarkTask markTask : markTasks) {
 //            markTask.setOriginLevel(markTask.getResult());
+            markTask.setRejected(false);
             markTask.setResult(level);
         }
         markTaskRepo.save(markTasks);

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

@@ -174,7 +174,7 @@ public class StageControlService {
         if (markSubject.getTest() == 1) {
             papers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false, markSubject.getTest());
         } else {
-            List<Paper> papersList = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndTestOrTestOrderByQuestionId(workId, subject, TrialEnum.DEFAULT.getId(), TrialEnum.START_FORMAL.getId());
+            List<Paper> papersList = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndTestOrderByQuestionId(workId, subject, TrialEnum.DEFAULT.getId());
             papers = papersList.subList(0, taskCount);
         }
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, null);
@@ -506,7 +506,7 @@ public class StageControlService {
             //已评任务数
             int areaSuccessCount = paperRepo.countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrueAndTestAndQuestionId(workId, subject, 0, examQuestion.getId());
             //所有任务数(查询所有有效试卷)
-            int areaTotalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTestOrTestAndQuestionId(workId, subject, 0,3, examQuestion.getId());
+            int areaTotalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTestAndQuestionId(workId, subject, 0, examQuestion.getId());
 
             BigDecimal areaWaitTotal = BigDecimal.valueOf(areaTotalCount).subtract(BigDecimal.valueOf(areaSuccessCount));
             //进度