xiatian 1 mese fa
parent
commit
f74bbbcb45

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

@@ -1,54 +1,79 @@
 package cn.com.qmth.stmms.ms.marking.api;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
+import javax.persistence.criteria.Predicate;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
 import cn.com.qmth.stmms.ms.commons.config.ScoreConfig;
 import cn.com.qmth.stmms.ms.commons.lock.LockService;
 import cn.com.qmth.stmms.ms.commons.lock.LockType;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
-import cn.com.qmth.stmms.ms.core.domain.*;
+import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
+import cn.com.qmth.stmms.ms.core.domain.Level;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
 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.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
-import cn.com.qmth.stmms.ms.core.repository.*;
+import cn.com.qmth.stmms.ms.core.repository.ExamQuestionRepo;
+import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
+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.MarkUserRepo;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkTaskAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
+import cn.com.qmth.stmms.ms.marking.dto.LevelCountDTO;
 import cn.com.qmth.stmms.ms.marking.dto.LevelDetailDTO;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.Predicate;
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
 
 /**
- * 评卷任务数据api
- * Created by zhengmin on 2016/10/12.
+ * 评卷任务数据api Created by zhengmin on 2016/10/12.
  */
 @RestController
 @RequestMapping("api/marktasks")
 public class MarkTaskApi {
-    private static Logger LOGGER = LoggerFactory.getLogger(MarkTaskApi.class);
 
     @Autowired
     private MarkTaskRepo markTaskRepo;
@@ -86,27 +111,44 @@ public class MarkTaskApi {
     @Autowired
     LockService lockService;
 
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @RequestMapping(value = "count/level", method = RequestMethod.GET)
+    public List<LevelCountDTO> totalScores(@RequestParam Long markerId, @RequestParam Long questionId) {
+        MarkUser marker = markUserRepo.findOne(markerId);
+        Long batchNo = paperRepo.findMaxScoreBatchNoByWorkIdAndSubject(marker.getWorkId(), marker.getSubject());
+
+        RowMapper<LevelCountDTO> rowMapper = new BeanPropertyRowMapper<LevelCountDTO>(LevelCountDTO.class);
+        String sql = "SELECT m.level levelCode,count(1) taskCount from mark_task m inner join paper p on m.paper_id = p.id "
+                + "and p.is_shift = 0 and p.is_shift_score = 0 " + "and p.score_batch_no = " + batchNo
+                + " where m.question_id = " + questionId + " and m.marker_id = " + markerId + " and m.stage = "
+                + MarkStage.SCORE.ordinal() + " and m.result is null";
+        List<LevelCountDTO> ret = jdbcTemplate.query(sql, rowMapper);
+        return ret;
+    }
+
     /**
      * 评卷员的评卷任务
      *
-     * @param markerId   评卷员用户id
-     * @param stage      评卷阶段
-     * @param level      档位
-     * @param sn         密号
-     * @param questionId 试题id
+     * @param markerId
+     *            评卷员用户id
+     * @param stage
+     *            评卷阶段
+     * @param level
+     *            档位
+     * @param sn
+     *            密号
+     * @param questionId
+     *            试题id
      * @return
      */
     @RequestMapping(method = RequestMethod.GET)
-    public PageableDTO list(@RequestParam Long markerId,
-                            @RequestParam Long workId,
-                            @RequestParam MarkStage stage,
-                            @RequestParam(required = false) Boolean isSample,
-                            @RequestParam(defaultValue = "false") Boolean reject,
-                            @RequestParam(required = false) String level,
-                            @RequestParam(required = false) String sn,
-                            @RequestParam Long questionId,
-                            @RequestParam(required = false) String areaCode,
-                            Pageable pageable) throws Exception {
+    public PageableDTO list(@RequestParam Long markerId, @RequestParam Long workId, @RequestParam MarkStage stage,
+            @RequestParam(required = false) Boolean isSample, @RequestParam(defaultValue = "false") Boolean reject,
+            @RequestParam(required = false) String level, @RequestParam(required = false) String sn,
+            @RequestParam Long questionId, @RequestParam(required = false) String areaCode, Pageable pageable)
+            throws Exception {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         MarkUser markUser = markUserRepo.findOne(markerId);
         Long batchNo = null;
@@ -146,7 +188,7 @@ public class MarkTaskApi {
                     onPredicates.add(builder.equal(join.get("isShiftScore"), false));
                 }
             } else if (stage == MarkStage.LEVEL) {
-                //查询
+                // 查询
                 predicates.add(builder.equal(root.get("result"), level));
                 if (levelShowAllPaper == 0) {
                     if (!Objects.isNull(finalBatchNo)) {
@@ -172,7 +214,7 @@ public class MarkTaskApi {
                 predicates.add(builder.equal(root.get("isRejected"), reject));
             }
             onPredicates.add(builder.equal(join.get("active"), true));
-            //过滤考区
+            // 过滤考区
             if (Objects.nonNull(areaCode)) {
                 onPredicates.add(builder.equal(join.get("areaCode"), areaCode));
             }
@@ -183,14 +225,15 @@ public class MarkTaskApi {
         Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
 
-
         if (Objects.isNull(markTasks) || markTasks.getContent().size() == 0) {
             if (Objects.nonNull(isSample) && isSample) {
                 ExamQuestion examQuestion = examQuestionRepo.findOne(questionId);
                 if (examQuestion.getTest() == TrialEnum.DEFAULT.getId()) {
-                    List<Paper> paperList = paperRepo.findSample(level, isSample, false, examQuestion.getSubject().name(), TrialEnum.DEFAULT.getId(), TrialEnum.START_FORMAL.getId(), examQuestion.getAreaCode(), examQuestion.getWorkId());
+                    List<Paper> paperList = paperRepo.findSample(level, isSample, false,
+                            examQuestion.getSubject().name(), TrialEnum.DEFAULT.getId(), TrialEnum.START_FORMAL.getId(),
+                            examQuestion.getAreaCode(), examQuestion.getWorkId());
                     if (Objects.nonNull(paperList) && paperList.size() > 0) {
-//                        MarkUser markUser = markUserRepo.findOne(markerId);
+                        // MarkUser markUser = markUserRepo.findOne(markerId);
                         for (Paper p : paperList) {
                             MarkTask markTask = new MarkTask(markUser, p, stage, 1L);
                             markTaskDTOs.add(markTaskAssembler.toDTO(markTask));
@@ -203,38 +246,41 @@ public class MarkTaskApi {
             markTaskDTOs.add(markTaskAssembler.toDTO(m));
         });
         if (stage == MarkStage.SCORE && Objects.isNull(level)) {
-//            if (Objects.nonNull(scoreConfig) && Objects.nonNull(scoreConfig.getTaskSort()) && Objects.equals("paper", scoreConfig.getTaskSort())) {
-//                Collections.sort(markTaskDTOs, Comparator.comparing(MarkTaskDTO::getPaperId));
-//            } else {
-//                randomSeqNewSort(markTaskDTOs);
-//            }
+            // if (Objects.nonNull(scoreConfig) &&
+            // Objects.nonNull(scoreConfig.getTaskSort()) &&
+            // Objects.equals("paper", scoreConfig.getTaskSort())) {
+            // Collections.sort(markTaskDTOs,
+            // Comparator.comparing(MarkTaskDTO::getPaperId));
+            // } else {
+            // randomSeqNewSort(markTaskDTOs);
+            // }
         } else if (stage == MarkStage.LEVEL && Objects.isNull(level)) {
             randomSeqNewSort(markTaskDTOs);
         }
-        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
+     * @param markerId
+     *            评卷员用户id
+     * @param questionId
+     *            试题id
      * @return
      */
     @RequestMapping(value = "/shift", method = RequestMethod.GET)
-    public PageableDTO list(@RequestParam Long markerId,
-                            @RequestParam(required = false) Long workId,
-                            @RequestParam(required = false) Boolean isShift,
-                            @RequestParam(required = false) Boolean isShiftScore,
-                            @RequestParam Long questionId,
-                            Pageable pageable) {
+    public PageableDTO list(@RequestParam Long markerId, @RequestParam(required = false) Long workId,
+            @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 (isShift) {
                     predicates.add(builder.equal(root.get("stage"), MarkStage.LEVEL));
@@ -255,22 +301,22 @@ public class MarkTaskApi {
         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());
+        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(),
+                pageable.getPageNumber());
     }
 
     /**
      * 评卷员的输分试卷
      *
-     * @param markerId   评卷员用户id
-     * @param questionId 试题id
+     * @param markerId
+     *            评卷员用户id
+     * @param questionId
+     *            试题id
      * @return
      */
     @RequestMapping(value = "/manualScore", method = RequestMethod.GET)
-    public PageableDTO listManualScore(@RequestParam Long markerId,
-                                       @RequestParam(required = false) Long workId,
-                                       @RequestParam Subject subject,
-                                       @RequestParam Long questionId,
-                                       Pageable pageable) {
+    public PageableDTO listManualScore(@RequestParam Long markerId, @RequestParam(required = false) Long workId,
+            @RequestParam Subject subject, @RequestParam Long questionId, Pageable pageable) {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
@@ -291,25 +337,28 @@ public class MarkTaskApi {
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
 
         markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskAssembler.toManualDTO(m)));
-        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(),
+                pageable.getPageNumber());
     }
 
     /**
      * 评卷员的标记试卷查询
      *
-     * @param markerId   评卷员ID
-     * @param workId     工作ID
-     * @param subject    科目
-     * @param questionId 考区ID
-     * @param pageable   分页
+     * @param markerId
+     *            评卷员ID
+     * @param workId
+     *            工作ID
+     * @param subject
+     *            科目
+     * @param questionId
+     *            考区ID
+     * @param pageable
+     *            分页
      */
     @GetMapping("/markedPapers")
-    public PageableDTO listMarkedPapers(@RequestParam(required = false) Long workId,
-                                        @RequestParam Long markerId,
-                                        @RequestParam Subject subject,
-                                        @RequestParam MarkStage stage,
-                                        @RequestParam Long questionId,
-                                        Pageable pageable) {
+    public PageableDTO listMarkedPapers(@RequestParam(required = false) Long workId, @RequestParam Long markerId,
+            @RequestParam Subject subject, @RequestParam MarkStage stage, @RequestParam Long questionId,
+            Pageable pageable) {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         Specification<MarkTask> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
@@ -335,7 +384,8 @@ public class MarkTaskApi {
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
 
         markTasks.getContent().forEach(m -> markTaskDTOs.add(markTaskAssembler.toManualDTO(m)));
-        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(),
+                pageable.getPageNumber());
     }
 
     /**
@@ -359,8 +409,10 @@ public class MarkTaskApi {
     /**
      * 提交评卷任务
      *
-     * @param markTask 评卷你任务id
-     * @param body     评卷内容
+     * @param markTask
+     *            评卷你任务id
+     * @param body
+     *            评卷内容
      * @return
      */
     @RequestMapping(value = "{markTask}", method = RequestMethod.PATCH)
@@ -374,38 +426,40 @@ public class MarkTaskApi {
             return new ResponseEntity(HttpStatus.BAD_REQUEST);
         }
         switch (stage) {
-            case LEVEL:
-                try {
-                    lockService.waitlock(LockType.LEVEL, markTask.getPaper().getId());
-                    markingService.levelMark(markTask, result);
-                } catch (Exception e) {
-                    throw new RuntimeException("分档异常");
-                } finally {
-                    lockService.unlock(LockType.LEVEL, markTask.getPaper().getId());
-                }
-                break;
-            case SCORE:
-                Integer score = Integer.parseInt(result);
-                //是否手工输入分数
-                String manualScore = body.get("manualScore");
-                markTask.setManualScore(StringUtils.isEmpty(manualScore) ? 0 : Integer.parseInt(manualScore));
-                try {
-                    lockService.waitlock(LockType.SCORE, markTask.getPaper().getId());
-                    markingService.scoring(markTask, score);
-                } catch (Exception e) {
-                    throw new RuntimeException("打分异常");
-                } finally {
-                    lockService.unlock(LockType.SCORE, markTask.getPaper().getId());
-                }
-                break;
+        case LEVEL:
+            try {
+                lockService.waitlock(LockType.LEVEL, markTask.getPaper().getId());
+                markingService.levelMark(markTask, result);
+            } catch (Exception e) {
+                throw new RuntimeException("分档异常");
+            } finally {
+                lockService.unlock(LockType.LEVEL, markTask.getPaper().getId());
+            }
+            break;
+        case SCORE:
+            Integer score = Integer.parseInt(result);
+            // 是否手工输入分数
+            String manualScore = body.get("manualScore");
+            markTask.setManualScore(StringUtils.isEmpty(manualScore) ? 0 : Integer.parseInt(manualScore));
+            try {
+                lockService.waitlock(LockType.SCORE, markTask.getPaper().getId());
+                markingService.scoring(markTask, score);
+            } catch (Exception e) {
+                throw new RuntimeException("打分异常");
+            } finally {
+                lockService.unlock(LockType.SCORE, markTask.getPaper().getId());
+            }
+            break;
         }
-        return new ResponseEntity(markTaskAssembler.toDTO(markTask, oldRejected, oldShift, oldShiftScore), HttpStatus.OK);
+        return new ResponseEntity(markTaskAssembler.toDTO(markTask, oldRejected, oldShift, oldShiftScore),
+                HttpStatus.OK);
     }
 
     /**
      * 批量提交评卷任务
      *
-     * @param body 评卷内容
+     * @param body
+     *            评卷内容
      * @return
      */
     @RequestMapping(value = "batch", method = RequestMethod.PATCH)
@@ -427,22 +481,30 @@ public class MarkTaskApi {
                 return new ResponseEntity(HttpStatus.BAD_REQUEST);
             }
             switch (stage) {
-                case LEVEL:
-                    try {
-                        lockService.waitlock(LockType.LEVEL, markTask.getPaper().getId());
-                        markingService.levelMark(markTask, result);
-                    } catch (Exception e) {
-                        throw new RuntimeException("分档异常");
-                    } finally {
-                        lockService.unlock(LockType.LEVEL, markTask.getPaper().getId());
-                    }
-                    break;
-                case SCORE:
-                    Integer score = Integer.parseInt(result);
-                    synchronized (this) {
-                        markingService.scoring(markTask, score);
-                    }
-                    break;
+            case LEVEL:
+                try {
+                    lockService.waitlock(LockType.LEVEL, markTask.getPaper().getId());
+                    markingService.levelMark(markTask, result);
+                } catch (Exception e) {
+                    throw new RuntimeException("分档异常");
+                } finally {
+                    lockService.unlock(LockType.LEVEL, markTask.getPaper().getId());
+                }
+                break;
+            case SCORE:
+                Integer score = Integer.parseInt(result);
+                // 是否手工输入分数
+                String manualScore = body.get("manualScore");
+                markTask.setManualScore(StringUtils.isEmpty(manualScore) ? 0 : Integer.parseInt(manualScore));
+                try {
+                    lockService.waitlock(LockType.SCORE, markTask.getPaper().getId());
+                    markingService.scoring(markTask, score);
+                } catch (Exception e) {
+                    throw new RuntimeException("打分异常");
+                } finally {
+                    lockService.unlock(LockType.SCORE, markTask.getPaper().getId());
+                }
+                break;
             }
             MarkTaskDTO markTaskDTO = markTaskAssembler.toDTO(markTask, oldRejected, oldShift, oldShiftScore);
             list.add(markTaskDTO);
@@ -454,7 +516,8 @@ public class MarkTaskApi {
     /**
      * 跳过评卷任务
      *
-     * @param markTaskId 评卷你任务id
+     * @param markTaskId
+     *            评卷你任务id
      * @return
      */
     @RequestMapping(value = "{markTaskId}/skip", method = RequestMethod.POST)
@@ -466,12 +529,12 @@ public class MarkTaskApi {
     /**
      * 标记任务
      *
-     * @param markTaskId 评卷你任务id
+     * @param markTaskId
+     *            评卷你任务id
      */
     @RequestMapping(value = "/mark_task", method = RequestMethod.POST)
     @Transactional
-    public Object markTask(@RequestParam Long markTaskId,
-                           @RequestParam Boolean isMark) {
+    public Object markTask(@RequestParam Long markTaskId, @RequestParam Boolean isMark) {
         markTaskRepo.updateMarkTaskMarkById(markTaskId, isMark);
         return true;
     }
@@ -486,10 +549,8 @@ public class MarkTaskApi {
      * @return
      */
     @RequestMapping(value = "/reviewPaper", method = RequestMethod.GET)
-    public List<MarkTaskDTO> reviewPaper(@RequestParam Long markerId,
-                                         @RequestParam MarkStage stage,
-                                         @RequestParam Long questionId,
-                                         @RequestParam(required = false) String areaCode) {
+    public List<MarkTaskDTO> reviewPaper(@RequestParam Long markerId, @RequestParam MarkStage stage,
+            @RequestParam Long questionId, @RequestParam(required = false) String areaCode) {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         Sort sort = new Sort(Sort.Direction.DESC, "updatedOn");
         Pageable pageable = new PageRequest(0, 5, sort);
@@ -511,12 +572,12 @@ public class MarkTaskApi {
             predicates.add(builder.equal(root.get("markerId"), markerId));
             predicates.add(builder.equal(root.get("stage"), stage));
             if (stage == MarkStage.LEVEL) {
-                //查询
+                // 查询
                 if (!Objects.isNull(finalBatchNo)) {
                     predicates.add(builder.equal(root.get("paper").get("batchNo"), finalBatchNo));
                 }
                 predicates.add(builder.isNotNull(root.get("result")));
-                //分档需要过滤标准卷
+                // 分档需要过滤标准卷
                 predicates.add(builder.equal(root.get("paper").get("isSample"), false));
             } else if (stage == MarkStage.SCORE) {
 
@@ -525,7 +586,7 @@ public class MarkTaskApi {
                 }
                 predicates.add(builder.isNotNull(root.get("result")));
             }
-            //过滤考区
+            // 过滤考区
             if (Objects.nonNull(areaCode)) {
                 predicates.add(builder.equal(root.get("paper").get("areaCode"), areaCode));
             }
@@ -539,9 +600,8 @@ public class MarkTaskApi {
     }
 
     @RequestMapping(value = "/kzzReviewPaper", method = RequestMethod.GET)
-    public List<PaperDTO> reviewPaper(@RequestParam Long workId,
-                                      @RequestParam Subject subject,
-                                      @RequestParam Long questionId) {
+    public List<PaperDTO> reviewPaper(@RequestParam Long workId, @RequestParam Subject subject,
+            @RequestParam Long questionId) {
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject);
         Specification<Paper> specification;
         if (MarkStage.LEVEL.equals(markSubject.getStage())) {
@@ -562,10 +622,13 @@ public class MarkTaskApi {
                 return query.where(Pre_And, Pre_Or).getRestriction();
             };
         } else {
-            List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndQuestionIdAndStageAndManualScore(workId, questionId, MarkStage.SCORE, 1);
-            List<Long> paperIds = markTasks.stream().map(m -> m.getPaper().getId()).distinct().collect(Collectors.toList());
+            List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndQuestionIdAndStageAndManualScore(workId, questionId,
+                    MarkStage.SCORE, 1);
+            List<Long> paperIds = markTasks.stream().map(m -> m.getPaper().getId()).distinct()
+                    .collect(Collectors.toList());
             List<MarkTask> markTaskList = markTaskRepo.findByPaperIdInAndStage(paperIds, MarkStage.SCORE);
-            Map<Long, List<MarkTask>> markTaskMap = markTaskList.stream().collect(Collectors.groupingBy(m -> m.getPaper().getId()));
+            Map<Long, List<MarkTask>> markTaskMap = markTaskList.stream()
+                    .collect(Collectors.groupingBy(m -> m.getPaper().getId()));
             Set<Long> paperIdSet = new HashSet();
             for (Map.Entry<Long, List<MarkTask>> entry : markTaskMap.entrySet()) {
                 long count = entry.getValue().stream().filter(m -> Objects.isNull(m.getResult())).count();
@@ -602,7 +665,6 @@ public class MarkTaskApi {
         return paperList;
     }
 
-
     /**
      * 分档详情
      *
@@ -612,16 +674,17 @@ public class MarkTaskApi {
      * @return
      */
     @RequestMapping(value = "/levelStatDetail", method = RequestMethod.GET)
-    public List<LevelDetailDTO> levelStatDetail(@RequestParam Long workId,
-                                                @RequestParam Subject subject,
-                                                @RequestParam(required = false) Long questionId) {
+    public List<LevelDetailDTO> levelStatDetail(@RequestParam Long workId, @RequestParam Subject subject,
+            @RequestParam(required = false) Long questionId) {
 
         List<Level> levels = levelRepo.findByWorkIdOrderByCode(workId);
         List<Paper> papers;
         if (questionId == null) {
-            papers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false, TrialEnum.DEFAULT.getId());
+            papers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false,
+                    TrialEnum.DEFAULT.getId());
         } else {
-            papers = paperRepo.findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTest(workId, subject, questionId, false, TrialEnum.DEFAULT.getId());
+            papers = paperRepo.findByworkIdAndSubjectAndQuestionIdAndIsMissingAndTest(workId, subject, questionId,
+                    false, TrialEnum.DEFAULT.getId());
         }
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
 
@@ -630,30 +693,37 @@ public class MarkTaskApi {
             LevelDetailDTO levelDetailDTO = new LevelDetailDTO();
             levelDetailDTO.setWorkId(workId);
             levelDetailDTO.setSubjectName(markSubject.getName());
-            //档位
+            // 档位
             levelDetailDTO.setCode(level.getCode());
             levelDetailDTO.setMinScore(level.getMinScore());
             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);
-            BigDecimal prop = papers.isEmpty() ? new BigDecimal("0") : new BigDecimal(String.valueOf(count * 100)).divide(new BigDecimal(String.valueOf(papers.size())), 2, BigDecimal.ROUND_HALF_UP);
-            //占比
+            BigDecimal prop = papers.isEmpty() ? new BigDecimal("0")
+                    : new BigDecimal(String.valueOf(count * 100)).divide(new BigDecimal(String.valueOf(papers.size())),
+                            2, BigDecimal.ROUND_HALF_UP);
+            // 占比
             levelDetailDTO.setLevelProp(prop.doubleValue());
-            //预设占比
+            // 预设占比
             levelDetailDTO.setExamLevelProp(level.getPt());
-            //差值
+            // 差值
             BigDecimal diff = prop.subtract(new BigDecimal(String.valueOf(level.getPt())));
             levelDetailDTO.setDiffProp(diff.doubleValue());
-            //累计数量
+            // 累计数量
             int sumCount = (int) (list.stream().mapToInt(LevelDetailDTO::getLevelCount).sum() + count);
             levelDetailDTO.setCumulateCount(sumCount);
-            //累计占比
-            BigDecimal cumulateProp = papers.isEmpty() ? new BigDecimal("0") : new BigDecimal(String.valueOf(sumCount * 100)).divide(new BigDecimal(String.valueOf(papers.size())), 2, BigDecimal.ROUND_HALF_UP);
+            // 累计占比
+            BigDecimal cumulateProp = papers.isEmpty() ? new BigDecimal("0")
+                    : 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.divide(new BigDecimal("100"))).setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
+            // 调整
+            int adjustment = new BigDecimal(String.valueOf(papers.size())).multiply(diff.divide(new BigDecimal("100")))
+                    .setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
             levelDetailDTO.setAdjustmentCount(adjustment);
 
             list.add(levelDetailDTO);
@@ -670,26 +740,27 @@ public class MarkTaskApi {
      * @return
      */
     @RequestMapping(value = "/get_by_secret_number", method = RequestMethod.GET)
-    public List<MarkTask> getBySecretNumber(@RequestParam Long workId,
-                                            @RequestParam Subject subject,
-                                            @RequestParam String secretNumber) {
-        return markTaskRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber, TrialEnum.DEFAULT.getId());
+    public List<MarkTask> getBySecretNumber(@RequestParam Long workId, @RequestParam Subject subject,
+            @RequestParam String secretNumber) {
+        return markTaskRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber,
+                TrialEnum.DEFAULT.getId());
     }
 
     /**
      * 查询标记任务(科组长)
      *
-     * @param workId   工作ID
-     * @param subject  科目
-     * @param stage    阶段
-     * @param markerId 评卷员ID
+     * @param workId
+     *            工作ID
+     * @param subject
+     *            科目
+     * @param stage
+     *            阶段
+     * @param markerId
+     *            评卷员ID
      */
     @GetMapping("/list_mark_task")
-    public PageableDTO listMarkTask(@RequestParam Long workId,
-                                    @RequestParam Subject subject,
-                                    @RequestParam MarkStage stage,
-                                    @RequestParam Long markerId,
-                                    Pageable pageable) {
+    public PageableDTO listMarkTask(@RequestParam Long workId, @RequestParam Subject subject,
+            @RequestParam MarkStage stage, @RequestParam Long markerId, Pageable pageable) {
         MarkUser markUser = markUserRepo.findOne(markerId);
         if (Role.MARKER.equals(markUser.getRole())) {
             List<PaperDTO> paperDTOS = new ArrayList<>();
@@ -705,7 +776,8 @@ public class MarkTaskApi {
             Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable);
 
             markTasks.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m.getPaper())));
-            return new PageableDTO(paperDTOS, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+            return new PageableDTO(paperDTOS, markTasks.getTotalElements(), markTasks.getTotalPages(),
+                    pageable.getPageNumber());
         } else if (Role.MARK_LEADER.equals(markUser.getRole())) {
             List<PaperDTO> paperDTOS = new ArrayList<>();
             Specification<Paper> specification = (root, query, builder) -> {
@@ -718,7 +790,8 @@ public class MarkTaskApi {
             Page<Paper> papers = paperRepo.findAll(specification, pageable);
 
             papers.getContent().forEach(m -> paperDTOS.add(paperAssembler.toDTO(m)));
-            return new PageableDTO(paperDTOS, papers.getTotalElements(), papers.getTotalPages(), pageable.getPageNumber());
+            return new PageableDTO(paperDTOS, papers.getTotalElements(), papers.getTotalPages(),
+                    pageable.getPageNumber());
         } else {
             throw new RuntimeException("当前角色无法查询标记试卷");
         }

+ 25 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/LevelCountDTO.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.stmms.ms.marking.dto;
+
+public class LevelCountDTO {
+
+    private String levelCode;// level code
+
+    private Integer taskCount;// paper总数
+
+    public String getLevelCode() {
+        return levelCode;
+    }
+
+    public void setLevelCode(String levelCode) {
+        this.levelCode = levelCode;
+    }
+
+    public Integer getTaskCount() {
+        return taskCount;
+    }
+
+    public void setTaskCount(Integer taskCount) {
+        this.taskCount = taskCount;
+    }
+
+}