YuanPan 7 жил өмнө
parent
commit
2a95fa4bd6

+ 4 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java

@@ -39,9 +39,10 @@ public class StudentImporter {
 
         dto.setExamNumber("5360001");
         dto.setName("张三");
-        dto.setAreaName("云南艺术学院");
-        dto.setAreaCode("16");
-        dto.setExamRoom("第5考场");
+        dto.setAreaName("四川音乐学院");
+        dto.setAreaCode("1");
+        dto.setExamRoom("第1考场");
+        dto.setSourceName("四川");
 
     	studentDTOs.add(dto);
     	ExportUtils.exportEXCEL("考生导入模板",StudentDTO.class,studentDTOs,response);

+ 19 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java

@@ -62,6 +62,9 @@ public class Paper implements Serializable {
     //抽查成绩
     private Double inspectScore;
 
+    private String inspectLevel;
+    private Long inspector;
+
     /**
      * 是否仲裁状态
      */
@@ -359,4 +362,20 @@ public class Paper implements Serializable {
     public void setSourceName(String sourceName) {
         this.sourceName = sourceName;
     }
+
+    public String getInspectLevel() {
+        return inspectLevel;
+    }
+
+    public void setInspectLevel(String inspectLevel) {
+        this.inspectLevel = inspectLevel;
+    }
+
+    public Long getInspector() {
+        return inspector;
+    }
+
+    public void setInspector(Long inspector) {
+        this.inspector = inspector;
+    }
 }

+ 1 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTask.java

@@ -28,6 +28,7 @@ public class MarkTask implements Serializable {
     @NotNull
     private Long markerId;
 
+
     @NotNull
     private String markerName;
 

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

@@ -13,78 +13,90 @@ import java.util.List;
 /**
  * Created by zhengmin on 2016/9/23.
  */
-public interface MarkTaskRepo extends JpaRepository<MarkTask,Long>,JpaSpecificationExecutor{
+public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecificationExecutor {
 
     /**
      * 查询指定阶段试卷的评卷任务
+     *
      * @param paperId 试卷id
-     * @param stage 评卷阶段
+     * @param stage   评卷阶段
      * @return
      */
     List<MarkTask> findByPaperIdAndStage(Long paperId, MarkStage stage);
 
     /**
      * 评卷员任务数量
+     *
      * @param markerId
      * @return
      */
     long countByMarkerId(Long markerId);
 
-    long countByMarkerIdAndQuestionId(Long markerId,Long questionId);
+    long countByMarkerIdAndQuestionId(Long markerId, Long questionId);
+
+    int countByWorkIdAndSubjectAndMarkerIdAndStageAndResult(Long workId, Subject subject, Long markerId, MarkStage stage, String result);
+
+    int countByWorkIdAndSubjectAndMarkerIdAndStage(Long workId, Subject subject, Long markerId, MarkStage stage);
 
     /**
      * 查询评卷员的评卷任务
+     *
      * @param markerId
      * @param stage
      * @return
      */
     @Query(value = "select mt from MarkTask mt left outer join fetch mt.paper where mt.markerId = ? and mt.stage = ?")
-    List<MarkTask> findByMarkerIdAndStage(Long markerId,MarkStage stage);
+    List<MarkTask> findByMarkerIdAndStage(Long markerId, MarkStage stage);
 
     /**
      * 查询评卷员的评卷任务
+     *
      * @param markerId
      * @param stage
      * @param questionId
      * @return
      */
     @Query(value = "select mt from MarkTask mt left outer join fetch mt.paper where mt.markerId = ? and mt.stage = ? and mt.questionId = ? order by mt.updatedOn desc")
-    List<MarkTask> findByMarkerIdAndStageAndQuestionId(Long markerId,MarkStage stage,Long questionId);
+    List<MarkTask> findByMarkerIdAndStageAndQuestionId(Long markerId, MarkStage stage, Long questionId);
 
     /**
      * 删除评卷员所有任务
+     *
      * @param subject
      * @param stage
      * @return
      */
-    Long deleteByWorkIdAndSubjectAndStage(Long workId,Subject subject,MarkStage stage);
+    Long deleteByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
 
     /**
      * 统计评卷员各试题已评数及总数(分档阶段)
+     *
      * @param markerId
      * @return
      */
     @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id) " +
             "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` WHERE " +
-            "t.`marker_id` = ? and t.stage = ? GROUP BY t.`question_id` ORDER BY q.`id`",nativeQuery = true)
-    List<Object[]> countGroupByQuestion(Long markerId,Integer stageId);
+            "t.`marker_id` = ? and t.stage = ? GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+    List<Object[]> countGroupByQuestion(Long markerId, Integer stageId);
 
     /**
      * 统计评卷员指定试题的各档位数量
+     *
      * @param questionId
      * @param markerId
      * @return
      */
     @Query(value = "SELECT t.result,COUNT(*) FROM mark_task t " +
             "WHERE t.`question_id` = ? AND t.`marker_id` = ? and t.stage = 1 " +
-            "GROUP BY t.`result` ORDER BY t.result",nativeQuery = true)
-    List<Object[]> countGroupByLevel(Long questionId,Long markerId);
+            "GROUP BY t.`result` ORDER BY t.result", nativeQuery = true)
+    List<Object[]> countGroupByLevel(Long questionId, Long markerId);
 
     /**
      * 统计指定试卷的所有任务数量
+     *
      * @param id
      * @return
      */
-	Long countByPaperId(Long id);
+    Long countByPaperId(Long id);
 
 }

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

@@ -135,4 +135,6 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     @Modifying
     @Query(value = "update Paper p set p.inspectRange = ?1 where p.examNumber in ?2")
     void markInspectRange(Long inspectRange, List<String> examNumbers);
+
+    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }

+ 1 - 1
stmms-ms-main/src/main/resources/application.properties

@@ -25,7 +25,7 @@ logging.file=./logs/sys.log
 logging.level.org.springframework=ERROR
 logging.level.org.hibernate=ERROR
 
-spring.jpa.show-sql=true
+spring.jpa.show-sql=false
 spring.jpa.hibernate.ddl-auto=update
 
 

+ 113 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/InspectApi.java

@@ -0,0 +1,113 @@
+package cn.com.qmth.stmms.ms.marking.api;
+
+import cn.com.qmth.stmms.ms.core.domain.InspectRange;
+import cn.com.qmth.stmms.ms.core.domain.Level;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.repository.InspectRangeRepo;
+import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
+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.PaperAssembler;
+import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Created by yuanpan on 2017/11/6.
+ */
+@RestController
+@RequestMapping("api/inspect")
+public class InspectApi {
+
+    @Autowired
+    private LevelRepo levelRepo;
+
+    @Autowired
+    private PaperRepo paperRepo;
+
+    @Autowired
+    private PaperAssembler paperAssembler;
+
+    @Autowired
+    private InspectRangeRepo inspectRangeRepo;
+
+    @Autowired
+    private MarkUserRepo markUserRepo;
+
+
+    @GetMapping(value = "{workId}/{markerId}")
+    public List<Map<String, Object>> list(@PathVariable(value = "workId") Long workId, @PathVariable(value = "markerId") Long markerId) {
+
+        List<InspectRange> inspectRanges = inspectRangeRepo.findByWorkId(workId);
+        if (inspectRanges == null || inspectRanges.size() < 1) {
+            return null;
+        }
+
+        InspectRange inspectRange = inspectRanges.get(0);
+
+
+        MarkUser inspector = markUserRepo.findOne(markerId);
+
+        Subject subject = inspector.getSubject();
+
+
+        List<PaperDTO> inspectPages = paperRepo.findByWorkIdAndSubjectAndInspectRange(workId, subject, inspectRange.getId()).stream().map(paper -> paperAssembler.toDTO(paper)).collect(Collectors.toList());
+        Map<String, List<PaperDTO>> group = inspectPages.stream().collect(Collectors.groupingBy(PaperDTO::getAreaCode));
+
+        List<Map<String, Object>> resultList = new LinkedList<>();
+        group.forEach((k, v) -> {
+            Map<String, Object> map = new HashMap<>();
+            //将试卷按照分数大小从高到低排序
+            v.sort((o1, o2) -> o2.getScore().intValue() - o1.getScore().intValue());
+            map.put("area", k);
+            map.put("papers", v);
+            resultList.add(map);
+        });
+
+        //按数量倒序排序
+        resultList.sort(new Comparator<Map<String, Object>>() {
+            @Override
+            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
+                List l1 = (List) o1.get("papers");
+                List l2 = (List) o2.get("papers");
+
+                return l2.size() - l1.size();
+            }
+        });
+        return resultList;
+    }
+
+
+    @PostMapping(value = "{workId}/{markerId}/{paperId}")
+    public void marking(@PathVariable(value = "workId") Long workId, @PathVariable(value = "markerId") Long markerId, @PathVariable(value = "paperId") Long paperId, @RequestBody HashMap<String, String> body) {
+
+        Paper paper = paperRepo.findOne(paperId);
+        if (Objects.equals(workId, paper.getWorkId())) {
+
+            Double inspectScore = Double.parseDouble(body.get("score"));
+
+            List<Level> levels = levelRepo.findByWorkId(workId);
+            Level inspectLevel = null;
+
+            for (Level l : levels) {
+                if (l.getMaxScore() >= inspectScore && inspectScore >= l.getMinScore()) {
+                    inspectLevel = l;
+                    break;
+                }
+            }
+
+            paper.setInspector(markerId);
+            paper.setInspectScore(inspectScore);
+            paper.setInspectLevel(inspectLevel.getCode());
+
+            paperRepo.save(paper);
+
+        }
+    }
+
+}

+ 12 - 4
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -27,9 +27,9 @@ public class PaperAssembler {
     @Autowired
     private SystemConfig systemConfig;
 
-    public PaperDTO toDTO(Paper paper){
+    public PaperDTO toDTO(Paper paper) {
         PaperDTO paperDTO = null;
-        if(paper != null){
+        if (paper != null) {
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setExamNumber(paper.getExamNumber());
@@ -44,10 +44,18 @@ public class PaperAssembler {
             paperDTO.setMarkedLogic(paper.isMarkedLogic());
             paperDTO.setRedoLevel(paper.getRedoLevel());
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
-            String imgSrc = systemConfig.getImageUrl(paper.getWorkId(),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber());
-            String thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber());
+            String imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
+            String thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setThumbSrc(thumbSrc);
+            paperDTO.setAreaCode(paper.getAreaCode());
+            if (paper.getInspectScore() != null) {
+                paperDTO.setInspectScore(paper.getInspectScore().intValue());
+            }
+            if (paper.getInspectLevel() != null) {
+                paperDTO.setInspectLevel(paper.getInspectLevel());
+            }
+
         }
         return paperDTO;
     }

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

@@ -27,6 +27,11 @@ public class PaperDTO implements Serializable{
     private String thumbSrc;
     private boolean isSample;
     private boolean markedLogic;
+    private String areaCode;
+    //抽查成绩
+    private Integer inspectScore;
+    private String inspectLevel;
+    private Long inspector;
 
     private List<MarkTaskDTO> markResults = new ArrayList<>();
 
@@ -157,4 +162,36 @@ public class PaperDTO implements Serializable{
     public void setMarkedLogic(boolean markedLogic) {
         this.markedLogic = markedLogic;
     }
+
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+
+    public Integer getInspectScore() {
+        return inspectScore;
+    }
+
+    public void setInspectScore(Integer inspectScore) {
+        this.inspectScore = inspectScore;
+    }
+
+    public String getInspectLevel() {
+        return inspectLevel;
+    }
+
+    public void setInspectLevel(String inspectLevel) {
+        this.inspectLevel = inspectLevel;
+    }
+
+    public Long getInspector() {
+        return inspector;
+    }
+
+    public void setInspector(Long inspector) {
+        this.inspector = inspector;
+    }
 }

+ 62 - 26
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -4,8 +4,12 @@ import java.util.Date;
 import java.util.List;
 import java.util.OptionalDouble;
 
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.marking.config.MarkingConfig;
 import cn.com.qmth.stmms.ms.marking.service.arbitration.ArbitrationService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +29,7 @@ import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 @Service
 public class MarkingService {
 
+    private static final Logger LOG = LoggerFactory.getLogger(MarkingService.class);
     @Autowired
     private MarkingConfig markingConfig;
 
@@ -34,6 +39,9 @@ public class MarkingService {
     @Autowired
     private MarkTaskRepo markTaskRepo;
 
+    @Autowired
+    private MarkUserRepo markUserRepo;
+
     @Autowired
     private PaperRepo paperRepo;
 
@@ -42,47 +50,70 @@ public class MarkingService {
 
     /**
      * 提交分档。如果每个评卷都提交了,则进行仲裁判定,如果没有触发仲裁就定档
+     *
      * @param markTask
      * @param levelCode
      * @return
      */
     @Transactional
-    public synchronized MarkTask levelMark(MarkTask markTask, String levelCode){
-    	//TODO 回评
+    public synchronized MarkTask levelMark(MarkTask markTask, String levelCode) {
+        //TODO 回评
         //boolean isMarked = markTask.getLevel() == null;
-    	
+
         //如果已经由科组长定档,则不做处理
         Paper paper = markTask.getPaper();
-        Level level = levelRepo.findByWorkIdAndCode(markTask.getWorkId(),levelCode);
+        if (paper.isMarkByLeader()) {
+            return markTask;
+        }
+
+        //控制分档比例
+        List<Level> levels = levelRepo.findByWorkId(markTask.getWorkId());
+        Level targetLevel = null;
+        for (Level l : levels) {
+            if (l.getCode().equals(levelCode)) {
+                targetLevel = l;
+                break;
+            }
+        }
+        int pt = targetLevel.getPt();
+        int count = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndResult(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage(), levelCode);
+        int total = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStage(markTask.getWorkId(), markTask.getSubject(), markTask.getMarkerId(), markTask.getStage());
+
+        LOG.info("pt = {}, count = {}, total = {}", pt, count, total);
+        if ((count + 1.0D) / total * 1.0D > pt / 100.D) {
+
+            throw new RuntimeException(levelCode + "档已满");
+        }
+
+
+        MarkUser maker = markUserRepo.findOne(markTask.getMarkerId());
+        Level level = levelRepo.findByWorkIdAndCode(markTask.getWorkId(), levelCode);
 
         markTask.setResult(levelCode);
         markTask.setLevelValue(level.getLevelValue());
         markTask.setRejected(false);
         markTask.setUpdatedOn(new Date());
+        markTask.setMarkerName(maker.getName());
+
         markTaskRepo.save(markTask);
 
         //判断该任务的试卷是否所有评卷员都评完,要进行仲裁判定或定档
-        if(paper.isMarkByLeader()){
-            return markTask;
-        }
-        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(),markTask.getStage());
+        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markTask.getStage());
         long leftCount = markTasks.stream().filter(i -> i.getResult() == null).count();
-        if(leftCount == 0){
+        if (leftCount == 0) {
             MarkTask[] sources = new MarkTask[markTasks.size()];
             int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
-            boolean result = ArbitrationService.arbitrate(markingConfig.getDeviation(),values);
-            if(result){
+            boolean result = ArbitrationService.arbitrate(markingConfig.getDeviation(), values);
+            if (result) {
                 //仲裁
                 paper.arbitrate();
-            }
-            else{
+            } else {
                 //定档
                 DeterResult determine = determineLevelService.determine(markTasks.toArray(sources));
                 paper.determineLevel(determine.getResult());
-                if(determine.getDeterType() == DetermineLevelService.DeterType.WEIGHT){
+                if (determine.getDeterType() == DetermineLevelService.DeterType.WEIGHT) {
                     paper.setMarkedLogic(true);
-                }
-                else{
+                } else {
                     paper.setMarkedLogic(false);
                 }
             }
@@ -93,16 +124,17 @@ public class MarkingService {
 
     /**
      * 直接给试卷分档
+     *
      * @param paper
      * @param level
      */
     @Transactional
-    public Paper levelMarkPaper(Paper paper,String level){
+    public Paper levelMarkPaper(Paper paper, String level) {
         paper.determineLevel(level);
         paper.setMarkByLeader(true);
         paperRepo.save(paper);
-        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(),MarkStage.LEVEL);
-        for(MarkTask markTask : markTasks){
+        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
+        for (MarkTask markTask : markTasks) {
             markTask.setResult(level);
         }
         markTaskRepo.save(markTasks);
@@ -114,15 +146,16 @@ public class MarkingService {
      * 更新试卷状态
      * 更新评卷任务状态为打回
      * 如果评卷任务的档位和建议档位一致,不打回该任务
+     *
      * @param paper
      * @param redoLevel 建议重评档位
      */
     @Transactional
-    public Paper reject(Paper paper,String redoLevel){
+    public Paper reject(Paper paper, String redoLevel) {
         paper.reject(redoLevel);
         List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
-        for(MarkTask markTask : markTasks){
-            if(markTask.getResult() != null && !markTask.getResult().toString().equals(redoLevel)) {
+        for (MarkTask markTask : markTasks) {
+            if (markTask.getResult() != null && !markTask.getResult().toString().equals(redoLevel)) {
                 markTask.setRejected(true);
                 markTask.setOriginLevel(markTask.getResult());
                 markTask.setResult(null);
@@ -135,21 +168,24 @@ public class MarkingService {
 
     /**
      * 打分。取出组内所有评分,如果都给了分,取平均分更新试卷成绩
+     *
      * @param markTask
      * @param score
      */
     @Transactional
-    public MarkTask scoring(MarkTask markTask,int score){
-        if(markTask.getStage() != MarkStage.SCORE){
+    public MarkTask scoring(MarkTask markTask, int score) {
+        if (markTask.getStage() != MarkStage.SCORE) {
             throw new RuntimeException("该任务不是打分任务");
         }
         markTask.setResult(String.valueOf(score));
         markTask.setUpdatedOn(new Date());
+        MarkUser maker = markUserRepo.findOne(markTask.getMarkerId());
+        markTask.setMarkerName(maker.getName());
         markTaskRepo.save(markTask);
         Paper paper = markTask.getPaper();
-        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(),markTask.getStage());
+        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markTask.getStage());
         long leftCount = markTasks.stream().filter(i -> i.getResult() == null).count();
-        if(leftCount == 0){
+        if (leftCount == 0) {
             OptionalDouble finalScore = markTasks.stream().map(m -> m.getResult())
                     .mapToInt(Integer::valueOf).average();
             double fs = Math.round(finalScore.orElse(0));