Procházet zdrojové kódy

联考版-v3.0.0优化

xiaof před 3 roky
rodič
revize
b57c607924
41 změnil soubory, kde provedl 1747 přidání a 433 odebrání
  1. 15 16
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java
  2. 20 7
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java
  3. 6 12
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/WorkApi.java
  4. 50 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/MarkExpDTO.java
  5. 20 9
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/OneClickExpDTO.java
  6. 63 21
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java
  7. 38 10
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  8. 6 18
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/WorkService.java
  9. 119 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BuiltInParamUtils.java
  10. 0 81
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BultInAccountUtil.java
  11. 10 17
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  12. 9 0
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/dto/CollectStuDTO.java
  13. 19 0
      stmms-ms-commons/pom.xml
  14. 3 0
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/constant/SystemConstant.java
  15. 182 0
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/PdfUtils.java
  16. 140 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/CheckData.java
  17. 25 2
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  18. 12 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java
  19. 33 16
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/BuiltInAccountEnum.java
  20. 30 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/CheckDataStatusEnum.java
  21. 38 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/CheckItemEnum.java
  22. 34 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTask.java
  23. 11 2
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/Role.java
  24. 14 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/CheckDataRepo.java
  25. 15 10
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  26. 11 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  27. 46 20
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java
  28. 12 0
      stmms-ms-main/pom.xml
  29. 0 5
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/StartRunning.java
  30. 5 5
      stmms-ms-main/src/main/resources/application-dev.properties
  31. 4 4
      stmms-ms-main/src/test/java/BatchCreateDataTest.java
  32. 66 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/CheckDataApi.java
  33. 3 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  34. 42 10
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  35. 106 38
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  36. 75 70
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  37. 27 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  38. 311 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/CheckDataService.java
  39. 87 41
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java
  40. 11 8
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java
  41. 29 8
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 15 - 16
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java

@@ -5,7 +5,6 @@ import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.ParamSetting;
 import cn.com.qmth.stmms.ms.core.domain.ParamSetting;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 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.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
@@ -42,8 +41,7 @@ public class ParamApi {
     /**
     /**
      * 查询
      * 查询
      *
      *
-     * @param workId
-     * @return
+     * @param workId 工作Id
      */
      */
     @RequestMapping(value = "/getParam", method = RequestMethod.GET)
     @RequestMapping(value = "/getParam", method = RequestMethod.GET)
     public ParamSetting getOne(@RequestParam Long workId) {
     public ParamSetting getOne(@RequestParam Long workId) {
@@ -66,20 +64,16 @@ public class ParamApi {
                                              @RequestParam Integer imageEncrypt,
                                              @RequestParam Integer imageEncrypt,
                                              @RequestParam Integer nameRule,
                                              @RequestParam Integer nameRule,
                                              @RequestParam Integer paperStage) {
                                              @RequestParam Integer paperStage) {
-
-
         //保存采集参数
         //保存采集参数
         ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
         ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
         if (paramSetting == null) {
         if (paramSetting == null) {
             paramSetting = ParamSetting.init();
             paramSetting = ParamSetting.init();
         }
         }
-
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         if (countMarkTasks > 0
         if (countMarkTasks > 0
                 && !Objects.equals(packageScan, paramSetting.getPackageScan())) {
                 && !Objects.equals(packageScan, paramSetting.getPackageScan())) {
             throw new RuntimeException("该评卷工作当前不是采集阶段,不能修改是否整包扫描参数");
             throw new RuntimeException("该评卷工作当前不是采集阶段,不能修改是否整包扫描参数");
         }
         }
-
         //有采集数据,不能修改采集参数
         //有采集数据,不能修改采集参数
         List<Paper> papers = paperRepo.findByWorkId(workId);
         List<Paper> papers = paperRepo.findByWorkId(workId);
         if (papers != null && papers.size() > 0) {
         if (papers != null && papers.size() > 0) {
@@ -89,7 +83,6 @@ public class ParamApi {
                 throw new RuntimeException("该评卷工作已有采集数据,不能修改图片是否加密、图片命名规则、试卷档位参数");
                 throw new RuntimeException("该评卷工作已有采集数据,不能修改图片是否加密、图片命名规则、试卷档位参数");
             }
             }
         }
         }
-
 //        if(paramSetting.getPaperStage() == 1 && !Objects.equals(paperStage, paramSetting.getPaperStage())){
 //        if(paramSetting.getPaperStage() == 1 && !Objects.equals(paperStage, paramSetting.getPaperStage())){
 //            throw new RuntimeException("试卷档位已经设置,不能修改");
 //            throw new RuntimeException("试卷档位已经设置,不能修改");
 //        }
 //        }
@@ -107,13 +100,17 @@ public class ParamApi {
     /**
     /**
      * 更新分档规则参数
      * 更新分档规则参数
      *
      *
-     * @param workId
-     * @param deviation
-     * @param autoCallback
-     * @param majority
-     * @param cumulativeError
-     * @param levelShowAllPaper
-     * @return
+     * @param workId                    工作ID
+     * @param deviation                 仲裁档位差
+     * @param autoCallback              是否自动打回
+     * @param majority                  是否过半定档
+     * @param clearData
+     * @param cumulativeError           打回累计误差
+     * @param levelShowAllPaper         分档阶段阅卷员是否显示所有试卷
+     * @param propDenominator           档位百分比分母(1: "全部考生数", 2: "去掉缺考考生数")
+     * @param autoCallbackShowDeviation 自动打回时显示偏差
+     * @param showStandardPaperManage
+     * @param takeBest                  取优原则
      */
      */
     @RequestMapping(value = "/level", method = RequestMethod.POST)
     @RequestMapping(value = "/level", method = RequestMethod.POST)
     public ResponseEntity updateLevelParam(@RequestParam Long workId,
     public ResponseEntity updateLevelParam(@RequestParam Long workId,
@@ -125,7 +122,8 @@ public class ParamApi {
                                            @RequestParam Integer levelShowAllPaper,
                                            @RequestParam Integer levelShowAllPaper,
                                            @RequestParam Integer propDenominator,
                                            @RequestParam Integer propDenominator,
                                            @RequestParam Integer autoCallbackShowDeviation,
                                            @RequestParam Integer autoCallbackShowDeviation,
-                                           @RequestParam Integer showStandardPaperManage) {
+                                           @RequestParam Integer showStandardPaperManage,
+                                           @RequestParam Integer takeBest) {
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         boolean flag = false;
         boolean flag = false;
@@ -153,6 +151,7 @@ public class ParamApi {
         paramSetting.setClearData(clearData);
         paramSetting.setClearData(clearData);
         paramSetting.setAutoCallbackShowDeviation(autoCallbackShowDeviation);
         paramSetting.setAutoCallbackShowDeviation(autoCallbackShowDeviation);
         paramSetting.setShowStandardPaperManage(showStandardPaperManage);
         paramSetting.setShowStandardPaperManage(showStandardPaperManage);
+        paramSetting.setTakeBest(takeBest);
         paramSettingRepo.saveAndFlush(paramSetting);
         paramSettingRepo.saveAndFlush(paramSetting);
         ParamCache.resetParam(paramSetting);
         ParamCache.resetParam(paramSetting);
 
 

+ 20 - 7
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java

@@ -6,9 +6,11 @@ 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.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
-import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 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.MarkLogRepo;
+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.vo.Subject;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkerAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkerAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.MarkerDTO;
 import cn.com.qmth.stmms.ms.marking.dto.MarkerDTO;
@@ -120,17 +122,18 @@ public class UserApi {
     }
     }
 
 
     /**
     /**
-     * 采集员列表查询
+     * 采集员列表查询(分页)
      *
      *
      * @param role
      * @param role
      * @return
      * @return
      */
      */
     @RequestMapping(value = "collect", method = RequestMethod.GET)
     @RequestMapping(value = "collect", method = RequestMethod.GET)
-    public PageableDTO listCollect(@RequestParam(required = false, defaultValue = "COLLECTOR") Role role, Pageable pageable) {
-//        return markUserRepo.findByRole(role);
-
+    public PageableDTO listCollect(@RequestParam() Long workId,
+                                   @RequestParam(required = false, defaultValue = "COLLECTOR") Role role,
+                                   Pageable pageable) {
         Specification<MarkUser> specification = (root, query, builder) -> {
         Specification<MarkUser> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("workId"), workId));
             predicates.add(builder.equal(root.get("role"), role));
             predicates.add(builder.equal(root.get("role"), role));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
         };
@@ -142,6 +145,15 @@ public class UserApi {
         return new PageableDTO(userDTOList, markUsers.getTotalElements(), markUsers.getTotalPages(), pageable.getPageNumber());
         return new PageableDTO(userDTOList, markUsers.getTotalElements(), markUsers.getTotalPages(), pageable.getPageNumber());
     }
     }
 
 
+    /**
+     * 采集员列表查询(不分页)
+     */
+    @RequestMapping(value = "/collect/all", method = RequestMethod.GET)
+    public Object listCollectAll(@RequestParam() Long workId,
+                                 @RequestParam(required = false, defaultValue = "COLLECTOR") Role role) {
+        return markUserRepo.findByWorkIdAndRole(workId, role);
+    }
+
     /**
     /**
      * 采集员新增
      * 采集员新增
      *
      *
@@ -185,7 +197,7 @@ public class UserApi {
             throw new RuntimeException("该账号已经存在");
             throw new RuntimeException("该账号已经存在");
         }
         }
         //启用禁用
         //启用禁用
-        if(domain.isEnabled() != user.isEnabled()){
+        if (domain.isEnabled() != user.isEnabled()) {
             domain.setEnabled(user.isEnabled());
             domain.setEnabled(user.isEnabled());
         } else {
         } else {
             //修改用户名、密码
             //修改用户名、密码
@@ -248,6 +260,7 @@ public class UserApi {
 
 
     /**
     /**
      * 查询用户分组
      * 查询用户分组
+     *
      * @param workId
      * @param workId
      * @param subject
      * @param subject
      * @param stage
      * @param stage

+ 6 - 12
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/WorkApi.java

@@ -8,7 +8,10 @@ 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.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.domain.Work;
-import cn.com.qmth.stmms.ms.core.repository.*;
+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.WorkRepo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -36,18 +39,9 @@ public class WorkApi {
     @Autowired
     @Autowired
     private LevelRepo levelRepo;
     private LevelRepo levelRepo;
 
 
-    @Autowired
-    private MarkUserRepo markUserRepo;
-
-    @Autowired
-    private ExamQuestionRepo questionRepo;
-
     @Autowired
     @Autowired
     private WorkService workService;
     private WorkService workService;
 
 
-    @Autowired
-    private StudentRepo studentRepo;
-
     @Autowired
     @Autowired
     private WorkOverviewAssembler workOverviewAssembler;
     private WorkOverviewAssembler workOverviewAssembler;
 
 
@@ -88,9 +82,9 @@ public class WorkApi {
     }
     }
 
 
     /**
     /**
-     * 新增
+     * 新增工作
      *
      *
-     * @param work
+     * @param work work对象
      */
      */
     @RequestMapping(method = RequestMethod.POST)
     @RequestMapping(method = RequestMethod.POST)
     public void create(@RequestBody Work work) {
     public void create(@RequestBody Work work) {

+ 50 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/MarkExpDTO.java

@@ -0,0 +1,50 @@
+package cn.com.qmth.stmms.ms.admin.dto;
+
+import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelProperty;
+
+public class MarkExpDTO {
+
+    @ExcelProperty(name = "科目", index = 0, type = 1)
+    private String subject;
+
+    @ExcelProperty(name = "科目名称", index = 1, type = 1)
+    private String subjectName;
+
+    @ExcelProperty(name = "考号", index = 2, type = 1)
+    private String examNumber;
+
+    @ExcelProperty(name = "姓名", index = 3, type = 1)
+    private String studentName;
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+}

+ 20 - 9
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/OneClickExpDTO.java

@@ -7,16 +7,19 @@ public class OneClickExpDTO {
     @ExcelProperty(name = "科目", index = 0, type = 1)
     @ExcelProperty(name = "科目", index = 0, type = 1)
     private String subject;
     private String subject;
 
 
-    @ExcelProperty(name = "序号", index = 1, type = 1)
+    @ExcelProperty(name = "操作账号", index = 1, type = 1)
+    private String createUserName;
+
+    @ExcelProperty(name = "序号", index = 2, type = 1)
     private Integer seqNo;
     private Integer seqNo;
 
 
-    @ExcelProperty(name = "考号", index = 2, type = 1)
-    private String examNumber;
+    @ExcelProperty(name = "试卷密号", index = 3, type = 1)
+    private String secretNumber;
 
 
-    @ExcelProperty(name = "原档位", index = 3, type = 1)
+    @ExcelProperty(name = "原档位", index = 4, type = 1)
     private String originLevel;
     private String originLevel;
 
 
-    @ExcelProperty(name = "复审后档位", index = 4, type = 1)
+    @ExcelProperty(name = "复审后档位", index = 5, type = 1)
     private String level;
     private String level;
 
 
     public String getSubject() {
     public String getSubject() {
@@ -27,6 +30,14 @@ public class OneClickExpDTO {
         this.subject = subject;
         this.subject = subject;
     }
     }
 
 
+    public String getCreateUserName() {
+        return createUserName;
+    }
+
+    public void setCreateUserName(String createUserName) {
+        this.createUserName = createUserName;
+    }
+
     public Integer getSeqNo() {
     public Integer getSeqNo() {
         return seqNo;
         return seqNo;
     }
     }
@@ -35,12 +46,12 @@ public class OneClickExpDTO {
         this.seqNo = seqNo;
         this.seqNo = seqNo;
     }
     }
 
 
-    public String getExamNumber() {
-        return examNumber;
+    public String getSecretNumber() {
+        return secretNumber;
     }
     }
 
 
-    public void setExamNumber(String examNumber) {
-        this.examNumber = examNumber;
+    public void setSecretNumber(String secretNumber) {
+        this.secretNumber = secretNumber;
     }
     }
 
 
     public String getOriginLevel() {
     public String getOriginLevel() {

+ 63 - 21
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/PaperExporter.java

@@ -1,6 +1,10 @@
 package cn.com.qmth.stmms.ms.admin.exporter;
 package cn.com.qmth.stmms.ms.admin.exporter;
 
 
-import cn.com.qmth.stmms.ms.admin.dto.*;
+import cn.com.qmth.stmms.ms.admin.dto.MarkExpDTO;
+import cn.com.qmth.stmms.ms.admin.dto.OneClickExpDTO;
+import cn.com.qmth.stmms.ms.admin.dto.PaperExpDTO;
+import cn.com.qmth.stmms.ms.admin.dto.SampleExpDTO;
+import cn.com.qmth.stmms.ms.commons.utils.PdfUtils;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.repository.ChangeLevelRepo;
 import cn.com.qmth.stmms.ms.core.repository.ChangeLevelRepo;
@@ -8,6 +12,7 @@ import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
@@ -62,13 +67,14 @@ public class PaperExporter {
 
 
     /**
     /**
      * 导出标准卷信息
      * 导出标准卷信息
+     *
      * @param workId
      * @param workId
      * @param subject
      * @param subject
      * @param response
      * @param response
      */
      */
     @GetMapping("{workId}/{subject}/sample")
     @GetMapping("{workId}/{subject}/sample")
-    public void exportSample(@PathVariable Long workId, @PathVariable Subject subject, HttpServletResponse response){
-        MarkSubject markSubject = markSubjectRepo.findOne(workId+"-"+subject.name());
+    public void exportSample(@PathVariable Long workId, @PathVariable Subject subject, HttpServletResponse response) {
+        MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
         //科目名称
         //科目名称
         String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
         String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
         List<SampleExpDTO> sampleExpDTOS = new ArrayList<>();
         List<SampleExpDTO> sampleExpDTOS = new ArrayList<>();
@@ -85,27 +91,29 @@ public class PaperExporter {
 
 
     /**
     /**
      * 一键定档导出
      * 一键定档导出
-     * @param workId
-     * @param subject
-     * @param response
+     *
+     * @param workId  工作ID
+     * @param subject 科目
      */
      */
     @GetMapping("{workId}/{subject}/oneClick")
     @GetMapping("{workId}/{subject}/oneClick")
-    public void exportOneClick(@PathVariable Long workId, @PathVariable Subject subject, HttpServletResponse response){
-        MarkSubject markSubject = markSubjectRepo.findOne(workId+"-"+subject.name());
+    public void exportOneClick(@PathVariable Long workId, @PathVariable Subject subject, HttpServletResponse response) {
+        MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
         //科目名称
         //科目名称
         String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
         String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
         List<OneClickExpDTO> oneClickExpDTOS = new ArrayList<>();
         List<OneClickExpDTO> oneClickExpDTOS = new ArrayList<>();
         List<Paper> papers = paperRepo.findByWorkIdAndSubjectAndIsOneClickTrue(workId, subject);
         List<Paper> papers = paperRepo.findByWorkIdAndSubjectAndIsOneClickTrue(workId, subject);
-        if(papers != null && papers.size() >0) {
+        if (papers != null && papers.size() > 0) {
             List<Long> paperIds = papers.stream().map(Paper::getId).collect(Collectors.toList());
             List<Long> paperIds = papers.stream().map(Paper::getId).collect(Collectors.toList());
-            List<MarkLog> marklogs = markLogRepo.findByWorkIdAndSubjectAndOperTypeAndPaperIdIn(workId, subject.name(), MarkLogOperType.ONE_CLICK_LEVEl.getId(), paperIds);
-            for (int i = 0; i < marklogs.size(); i++) {
-                MarkLog markLog = marklogs.get(i);
+            List<MarkLog> markLogs = markLogRepo.findByWorkIdAndSubjectAndOperTypeAndPaperIdIn(workId, subject.name(), MarkLogOperType.ONE_CLICK_LEVEl.getId(), paperIds);
+            for (int i = 0; i < markLogs.size(); i++) {
+                MarkLog markLog = markLogs.get(i);
                 OneClickExpDTO oneClickExpDTO = new OneClickExpDTO();
                 OneClickExpDTO oneClickExpDTO = new OneClickExpDTO();
                 oneClickExpDTO.setSubject(subjectName);
                 oneClickExpDTO.setSubject(subjectName);
-                oneClickExpDTO.setSeqNo(i+1);
-                oneClickExpDTO.setExamNumber(markLog.getExamNumber());
-                oneClickExpDTO.setOriginLevel(markLog.getOperDataBefore() == null ? "":markLog.getOperDataBefore());
+                oneClickExpDTO.setCreateUserName(markLog.getCreateUserName());
+                oneClickExpDTO.setSeqNo(i + 1);
+                Paper paper = paperRepo.findOne(markLog.getPaperId());
+                oneClickExpDTO.setSecretNumber(paper == null ? "" : paper.getSecretNumber());
+                oneClickExpDTO.setOriginLevel(markLog.getOperDataBefore() == null ? "" : markLog.getOperDataBefore());
                 oneClickExpDTO.setLevel(markLog.getOperDataAfter());
                 oneClickExpDTO.setLevel(markLog.getOperDataAfter());
                 oneClickExpDTOS.add(oneClickExpDTO);
                 oneClickExpDTOS.add(oneClickExpDTO);
             }
             }
@@ -116,17 +124,17 @@ public class PaperExporter {
     /**
     /**
      * 改档信息导出
      * 改档信息导出
      *
      *
-     * @param workId
-     * @param subject
-     * @param response
+     * @param workId   工作ID
+     * @param subject  科目
+     * @param response response对象
      */
      */
     @GetMapping("{workId}/{subject}/changeLevel")
     @GetMapping("{workId}/{subject}/changeLevel")
-    public void exportChangeLevel(@PathVariable Long workId, @PathVariable Subject subject, HttpServletResponse response) {
+    public void exportChangeLevel(@PathVariable Long workId, @PathVariable Subject subject, HttpServletResponse response) throws Exception {
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
         MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.name());
         //科目名称
         //科目名称
         String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
         String subjectName = Objects.isNull(markSubject) ? subject.name() : markSubject.getName();
-        List<ChangeLevelExpDTO> changeLevelExpDTOS = new ArrayList<>();
         List<ChangeLevel> changeLevels = changeLevelRepo.findByWorkIdAndSubjectAndAuditStatus(workId, subject.name());
         List<ChangeLevel> changeLevels = changeLevelRepo.findByWorkIdAndSubjectAndAuditStatus(workId, subject.name());
+        /*List<ChangeLevelExpDTO> changeLevelExpDTOS = new ArrayList<>();
         for (int i = 0; i < changeLevels.size(); i++) {
         for (int i = 0; i < changeLevels.size(); i++) {
             ChangeLevel changeLevel = changeLevels.get(i);
             ChangeLevel changeLevel = changeLevels.get(i);
             ChangeLevelExpDTO changeLevelExpDTO = new ChangeLevelExpDTO();
             ChangeLevelExpDTO changeLevelExpDTO = new ChangeLevelExpDTO();
@@ -138,6 +146,40 @@ public class PaperExporter {
             changeLevelExpDTO.setLevel(changeLevel.getSuggestLevel());
             changeLevelExpDTO.setLevel(changeLevel.getSuggestLevel());
             changeLevelExpDTOS.add(changeLevelExpDTO);
             changeLevelExpDTOS.add(changeLevelExpDTO);
         }
         }
-        ExportUtils.exportEXCEL("改档信息导出", ChangeLevelExpDTO.class, changeLevelExpDTOS, response);
+        ExportUtils.exportEXCEL("改档信息导出", ChangeLevelExpDTO.class, changeLevelExpDTOS, response);*/
+
+        List<JSONObject> datas = new ArrayList<>();
+        for (ChangeLevel changeLevel : changeLevels) {
+            JSONObject object = new JSONObject();
+            Paper paper = paperRepo.findOne(changeLevel.getPaperId());
+            object.put("secretNumber", paper.getSecretNumber());
+            object.put("oldLevel", changeLevel.getOriginalLevel());
+            object.put("newLevel", changeLevel.getSuggestLevel());
+            datas.add(object);
+        }
+        PdfUtils.exportPdf(subjectName + "科目改档签字表", datas, response);
+    }
+
+    /**
+     * 导出标记试卷信息
+     *
+     * @param workId 工作ID
+     * @param response response对象
+     */
+    @GetMapping("{workId}/mark")
+    public void exportMark(@PathVariable Long workId, HttpServletResponse response) {
+        List<MarkExpDTO> markExpDTOS = new ArrayList<>();
+        List<Paper> papers = paperRepo.findByWorkIdAndIsMarkTure(workId);
+        for (Paper paper : papers) {
+            MarkExpDTO markExpDTO = new MarkExpDTO();
+            Subject subject = paper.getSubject();
+            markExpDTO.setSubject(subject.name());
+            String subjectName = subject.getName();
+            markExpDTO.setSubjectName(subjectName);
+            markExpDTO.setExamNumber(paper.getExamNumber());
+            markExpDTO.setStudentName(paper.getStudentName());
+            markExpDTOS.add(markExpDTO);
+        }
+        ExportUtils.exportEXCEL("标记试卷信息", MarkExpDTO.class, markExpDTOS, response);
     }
     }
 }
 }

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

@@ -16,11 +16,11 @@ import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 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.*;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 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.*;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.codec.digest.DigestUtils;
-import org.mockito.internal.exceptions.ExceptionIncludingMockitoWarnings;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -366,11 +366,10 @@ public class DataUploadService {
             throw new Exception("没有此工作区,请检查workId是否正确");
             throw new Exception("没有此工作区,请检查workId是否正确");
         }
         }
         List<Paper> papers = paperRepo.findByWorkIdAndSubject(workId, subject);
         List<Paper> papers = paperRepo.findByWorkIdAndSubject(workId, subject);
-        if (papers.isEmpty() || papers.size() == 0) {
+        if (papers.isEmpty()) {
             throw new Exception("没有采集数据,不能导入试评数据");
             throw new Exception("没有采集数据,不能导入试评数据");
         }
         }
-        List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase()))
-                .collect(Collectors.toList());
+        List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase())).collect(Collectors.toList());
         MarkSubject markSubject = markSubjectList.get(0);
         MarkSubject markSubject = markSubjectList.get(0);
         if (markSubject.getTest() == TrialEnum.START_TRIAL.getId()) {
         if (markSubject.getTest() == TrialEnum.START_TRIAL.getId()) {
             throw new Exception("已经开始试评,请先停止试评再重新导入数据");
             throw new Exception("已经开始试评,请先停止试评再重新导入数据");
@@ -484,10 +483,36 @@ public class DataUploadService {
             }
             }
         });
         });
         if (!CollectionUtils.isEmpty(studentList)) {
         if (!CollectionUtils.isEmpty(studentList)) {
-            studentRepo.save(studentList);
+//            studentRepo.save(studentList);
+            List<Student> data = new ArrayList<>();
+            //500条提交一次
+            for (Student student : studentList) {
+                if (data.size() == 500) {
+                    studentRepo.save(data);
+                    data.clear();
+                }
+                data.add(student);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                studentRepo.save(data);
+            }
         }
         }
         if (!CollectionUtils.isEmpty(paperList)) {
         if (!CollectionUtils.isEmpty(paperList)) {
-            paperRepo.save(paperList);
+//            paperRepo.save(paperList);
+            List<Paper> data = new ArrayList<>();
+            //500条提交一次
+            for (Paper paper : paperList) {
+                if (data.size() == 500) {
+                    paperRepo.save(data);
+                    data.clear();
+                }
+                data.add(paper);
+            }
+            //将剩下的数据也导入
+            if (!data.isEmpty()) {
+                paperRepo.save(data);
+            }
         }
         }
         if (Objects.nonNull(excelErrors) && excelErrors.size() > 0) {
         if (Objects.nonNull(excelErrors) && excelErrors.size() > 0) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -515,7 +540,7 @@ public class DataUploadService {
     }
     }
 
 
     @Transactional
     @Transactional
-    public Paper savePaper(Student student, Subject subject, boolean isManual, String level) throws Exception {
+    public Paper savePaper(Student student, Subject subject, boolean isManual, String level, Long scanUserId) throws Exception {
         ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(student.getWorkId(), subject, student.getAreaCode(), TrialEnum.DEFAULT.getId());
         ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCodeAndTest(student.getWorkId(), subject, student.getAreaCode(), TrialEnum.DEFAULT.getId());
         Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject, student.getExamNumber(), TrialEnum.DEFAULT.getId());
         Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject, student.getExamNumber(), TrialEnum.DEFAULT.getId());
         if (paper == null) {
         if (paper == null) {
@@ -525,12 +550,15 @@ public class DataUploadService {
         paper.setUploadedOn(new Date());
         paper.setUploadedOn(new Date());
         paper.setManual(isManual);
         paper.setManual(isManual);
 
 
-        if (Objects.nonNull(level) && level != "") {
+        // 采集员ID
+        paper.setScanUserId(scanUserId);
+
+        if (Objects.nonNull(level) && !"".equals(level)) {
             paper.setLevel(level);
             paper.setLevel(level);
             //设置为已发布任务的状态
             //设置为已发布任务的状态
             paper.setActive(true);
             paper.setActive(true);
             //默认给1,与实际分档批次区分
             //默认给1,与实际分档批次区分
-            paper.setBatchNo(1l);
+            paper.setBatchNo(1L);
         }
         }
 
 
         if (!imageServerConfig.isAliyunOss()) {
         if (!imageServerConfig.isAliyunOss()) {
@@ -647,7 +675,7 @@ public class DataUploadService {
             random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
             random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
             result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
             result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
             String examNumberSub;
             String examNumberSub;
-            if(examNumber.length() > 3){
+            if (examNumber.length() > 3) {
                 examNumberSub = examNumber.substring(3);
                 examNumberSub = examNumber.substring(3);
             } else {
             } else {
                 examNumberSub = examNumber;
                 examNumberSub = examNumber;

+ 6 - 18
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/WorkService.java

@@ -1,6 +1,6 @@
 package cn.com.qmth.stmms.ms.admin.service;
 package cn.com.qmth.stmms.ms.admin.service;
 
 
-import cn.com.qmth.stmms.ms.admin.utils.BultInAccountUtil;
+import cn.com.qmth.stmms.ms.admin.utils.BuiltInParamUtils;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.Level;
@@ -43,7 +43,7 @@ public class WorkService {
     ImageConfig imageConfig;
     ImageConfig imageConfig;
 
 
     @Autowired
     @Autowired
-    BultInAccountUtil bultInAccountUtil;
+    BuiltInParamUtils bultInAccountUtil;
 
 
     /**
     /**
      * 删除评卷工作
      * 删除评卷工作
@@ -69,7 +69,7 @@ public class WorkService {
     public void save(Work work) {
     public void save(Work work) {
         Work workTemp = workRepo.findByName(work.getName());
         Work workTemp = workRepo.findByName(work.getName());
         if(workTemp != null){
         if(workTemp != null){
-            throw new RuntimeException("工作任务名称不能重复");
+            throw new RuntimeException("工作名称不能重复");
         }
         }
         workRepo.save(work);
         workRepo.save(work);
         Subject[] subjects = Subject.values();
         Subject[] subjects = Subject.values();
@@ -93,23 +93,11 @@ public class WorkService {
         paramSettingRepo.save(paramSetting);
         paramSettingRepo.save(paramSetting);
         ParamCache.resetParam(paramSetting);
         ParamCache.resetParam(paramSetting);
 
 
-        //默认增加档位
-        Level A = new Level(work.getId(), "A",0, 100, 90, Level.LevelType.ADMITED, 95);
-        Level B = new Level(work.getId(), "B",1, 89, 85, Level.LevelType.ADMITED, 87);
-        Level C = new Level(work.getId(), "C",2, 84, 80, Level.LevelType.ADMITED, 82);
-        Level D = new Level(work.getId(), "D",3, 79, 75, Level.LevelType.ADMITED, 77);
-        Level E = new Level(work.getId(), "E",4, 74, 70, Level.LevelType.ADMITED, 72);
-        Level F = new Level(work.getId(), "F",5, 69, 65, Level.LevelType.ADMITED, 67);
-        Level G = new Level(work.getId(), "G",6, 64, 60, Level.LevelType.ADMITED, 62);
-        Level H = new Level(work.getId(), "H",7, 59, 55, Level.LevelType.ADMITED, 57);
-        Level I = new Level(work.getId(), "I",8, 54, 50, Level.LevelType.ADMITED, 52);
-        Level J = new Level(work.getId(), "J",9, 49, 45, Level.LevelType.ADMITED, 47);
-        Level K = new Level(work.getId(), "K",10, 44, 0, Level.LevelType.ADMITED, 40);
-        List<Level> levels = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K);
-        levelRepo.save(levels);
+        // 设置默认档位
+        bultInAccountUtil.createLevels(work.getId());
 
 
         //生成内置账号
         //生成内置账号
-        bultInAccountUtil.createAccout();
+        bultInAccountUtil.createAccount(work.getId());
     }
     }
 
 
 }
 }

+ 119 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BuiltInParamUtils.java

@@ -0,0 +1,119 @@
+package cn.com.qmth.stmms.ms.admin.utils;
+
+import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
+import cn.com.qmth.stmms.ms.core.domain.Level;
+import cn.com.qmth.stmms.ms.core.domain.enums.BuiltInAccountEnum;
+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.LevelRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+@Component
+public class BuiltInParamUtils {
+
+    @Resource
+    MarkUserRepo markUserRepo;
+
+    @Resource
+    LevelRepo levelRepo;
+
+    /**
+     * 添加工作下的默认档位
+     *
+     * @param workId 工作ID
+     */
+    public void createLevels(Long workId) {
+        //默认增加档位
+        Level A = new Level(workId, "A", 0, 100, 90, Level.LevelType.ADMITED, 95);
+        Level B = new Level(workId, "B", 1, 89, 85, Level.LevelType.ADMITED, 87);
+        Level C = new Level(workId, "C", 2, 84, 80, Level.LevelType.ADMITED, 82);
+        Level D = new Level(workId, "D", 3, 79, 75, Level.LevelType.ADMITED, 77);
+        Level E = new Level(workId, "E", 4, 74, 70, Level.LevelType.ADMITED, 72);
+        Level F = new Level(workId, "F", 5, 69, 65, Level.LevelType.ADMITED, 67);
+        Level G = new Level(workId, "G", 6, 64, 60, Level.LevelType.ADMITED, 62);
+        Level H = new Level(workId, "H", 7, 59, 55, Level.LevelType.ADMITED, 57);
+        Level I = new Level(workId, "I", 8, 54, 50, Level.LevelType.ADMITED, 52);
+        Level J = new Level(workId, "J", 9, 49, 45, Level.LevelType.ADMITED, 47);
+        Level K = new Level(workId, "K", 10, 44, 0, Level.LevelType.ADMITED, 40);
+        List<Level> levels = Arrays.asList(A, B, C, D, E, F, G, H, I, J, K);
+        levelRepo.save(levels);
+    }
+
+    /**
+     * 添加工作下的默认用户
+     *
+     * @param workId 工作ID
+     */
+    public void createAccount(Long workId) {
+        List<MarkUser> userList = new ArrayList<>();
+        List<JSONObject> mapList = BuiltInAccountEnum.listAccounts();
+        if (mapList.size() > 0) {
+            for (JSONObject map : mapList) {
+                int count = map.getIntValue("count");
+                if (count == 0) {
+                    continue;
+                }
+                String loginName = map.getString("code").toLowerCase();
+                if (count == 1) {
+                    MarkUser markUser = markUserRepo.findByLoginName(loginName);
+                    if (markUser != null) {
+                        continue;
+                    }
+                    markUser = new MarkUser(loginName, SystemConstant.INIT_PASSWORD, 0L, Subject.SC, loginName, Role.findByName((String) map.get("name")), null);
+                    userList.add(markUser);
+                } else {
+                    for (int i = 1; i <= count; i++) {
+                        String loginNameTemp = workId + "-" + loginName + lpad(2, i);
+                        MarkUser markUser = markUserRepo.findByLoginName(loginNameTemp);
+                        if (markUser != null) {
+                            continue;
+                        }
+                        //默认密码123456
+                        //随机密码randomPassword()
+                        markUser = new MarkUser(loginNameTemp, SystemConstant.INIT_PASSWORD, workId, Subject.SC, loginName, Role.findByName((String) map.get("name")), null);
+                        //默认为禁用
+                        markUser.setEnabled(false);
+                        userList.add(markUser);
+                    }
+                }
+            }
+            markUserRepo.save(userList);
+        }
+    }
+
+    private String randomPassword() {
+        String sources = "0123456789";
+        String password = "123456";
+        for (int i = 0; i <= 100; i++) {
+            Random rand = new Random();
+            StringBuffer flag = new StringBuffer();
+            for (int j = 0; j < 6; j++) {
+                flag.append(sources.charAt(rand.nextInt(10)) + "");
+            }
+            password = flag.toString();
+        }
+        return password;
+    }
+
+    /**
+     * 补齐不足长度
+     *
+     * @param length 长度
+     * @param number 数字
+     * @return String
+     */
+    private static String lpad(int length, int number) {
+        String f = "%0" + length + "d";
+        return String.format(f, number);
+    }
+
+}

+ 0 - 81
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/BultInAccountUtil.java

@@ -1,81 +0,0 @@
-package cn.com.qmth.stmms.ms.admin.utils;
-
-import cn.com.qmth.stmms.ms.core.domain.enums.BuiltInAccountEnum;
-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.MarkUserRepo;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-
-@Component
-public class BultInAccountUtil {
-
-    @Autowired
-    MarkUserRepo markUserRepo;
-
-    public void createAccout() {
-        List<MarkUser> userList = new ArrayList<>();
-        List<Map> mapList = BuiltInAccountEnum.listAccounts();
-        if (mapList.size() > 0) {
-            for (Map map : mapList) {
-                //采集账号
-                if (Objects.equals(BuiltInAccountEnum.SCAN.name(), map.get("type").toString())) {
-                    for (int i = 1; i <= 10; i++) {
-                        String loginName = map.get("code").toString().toLowerCase() + lpad(2, i);
-                        MarkUser markUser = markUserRepo.findByLoginName(loginName);
-                        if (markUser != null) {
-                            continue;
-                        }
-                        //默认密码123456
-                        //随机密码randomPassword()
-                        String password = "123456";
-                        markUser = new MarkUser(loginName, password, 0L, Subject.SC, loginName, Role.findByName((String) map.get("name")), null);
-                        //默认为禁用
-                        markUser.setEnabled(false);
-                        userList.add(markUser);
-                    }
-                } else {
-                    String loginName = map.get("code").toString().toLowerCase();
-                    MarkUser markUser = markUserRepo.findByLoginName(loginName.toLowerCase());
-                    if (markUser != null) {
-                        continue;
-                    }
-                    markUser = new MarkUser(loginName, "123456", 0L, Subject.SC, loginName, Role.findByName((String) map.get("name")), null);
-                    userList.add(markUser);
-                }
-            }
-            markUserRepo.save(userList);
-        }
-    }
-
-    private String randomPassword(){
-        String sources = "0123456789";
-        String password = "123456";
-        for (int i = 0; i <= 100; i++)
-        {
-            Random rand = new Random();
-            StringBuffer flag = new StringBuffer();
-            for (int j = 0; j < 6; j++)
-            {
-                flag.append(sources.charAt(rand.nextInt(10)) + "");
-            }
-            password = flag.toString();
-        }
-        return password;
-    }
-
-    /**
-     * 补齐不足长度
-     *
-     * @param length 长度
-     * @param number 数字
-     * @return
-     */
-    private static String lpad(int length, int number) {
-        String f = "%0" + length + "d";
-        return String.format(f, number);
-    }
-}

+ 10 - 17
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -17,13 +17,14 @@ 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.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 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 net.coobird.thumbnailator.Thumbnails;
 import net.coobird.thumbnailator.Thumbnails;
 import net.coobird.thumbnailator.geometry.Positions;
 import net.coobird.thumbnailator.geometry.Positions;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
-import org.assertj.core.util.Compatibility;
 import org.assertj.core.util.Strings;
 import org.assertj.core.util.Strings;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,7 +40,6 @@ import javax.servlet.http.HttpServletResponse;
 import java.awt.*;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.io.*;
-import java.net.URLEncoder;
 import java.security.MessageDigest;
 import java.security.MessageDigest;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.List;
@@ -84,9 +84,6 @@ public class CollectApi {
     @Autowired
     @Autowired
     private LevelRepo levelRepo;
     private LevelRepo levelRepo;
 
 
-    @Autowired
-    private PaperRepo paperRepo;
-
     @Autowired
     @Autowired
     private SystemConfig systemConfig;
     private SystemConfig systemConfig;
 
 
@@ -250,20 +247,18 @@ public class CollectApi {
 
 
     @CrossOrigin(maxAge = 3600) //支持跨域
     @CrossOrigin(maxAge = 3600) //支持跨域
     @RequestMapping(value = "upload/student/{subjectId}", method = RequestMethod.POST)
     @RequestMapping(value = "upload/student/{subjectId}", method = RequestMethod.POST)
-    public CollectStuDTO saveStudent(HttpServletRequest request, @PathVariable Integer subjectId,
+    public CollectStuDTO saveStudent(@PathVariable Integer subjectId,
                                      CollectStuDTO dto) throws Exception {
                                      CollectStuDTO dto) throws Exception {
         Subject subject = Subject.values()[subjectId - 1];
         Subject subject = Subject.values()[subjectId - 1];
         Work activeWork = workRepo.findByActiveTrue();
         Work activeWork = workRepo.findByActiveTrue();
-        List<CollectStuDTO> list = new ArrayList<>();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
-//        for (CollectStuDTO dto : uploadStudentArray) {
         Student student = studentRepo.findByWorkIdAndRelateExamNumberAndTest(activeWork.getId(), dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
         Student student = studentRepo.findByWorkIdAndRelateExamNumberAndTest(activeWork.getId(), dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
         Paper paper = null;
         Paper paper = null;
         if (!dto.isAbsent()) {
         if (!dto.isAbsent()) {
-            paper = dataUploadService.savePaper(student, subject, dto.isManual(), dto.getLevel());
+            paper = dataUploadService.savePaper(student, subject, dto.isManual(), dto.getLevel(), dto.getScanUserId());
         }
         }
         //已知档位,更新阶段
         //已知档位,更新阶段
-        if (Objects.nonNull(dto.getLevel()) && dto.getLevel() != "") {
+        if (Objects.nonNull(dto.getLevel()) && !"".equals(dto.getLevel())) {
             MarkSubject markSubject = markSubjectRepo.findOne(activeWork.getId() + "-" + subject.name());
             MarkSubject markSubject = markSubjectRepo.findOne(activeWork.getId() + "-" + subject.name());
             if (markSubject.getStage().name().equals(MarkStage.INIT.name())) {
             if (markSubject.getStage().name().equals(MarkStage.INIT.name())) {
                 markSubject.setStage(MarkStage.LEVEL);
                 markSubject.setStage(MarkStage.LEVEL);
@@ -271,15 +266,13 @@ public class CollectApi {
             }
             }
         }
         }
         dto.setUploadTime(sdf.format(new Date()));
         dto.setUploadTime(sdf.format(new Date()));
-        paper.setRelate(!StringUtils.equals(student.getExamNumber(), student.getRelateExamNumber()));
         if (paper != null) {
         if (paper != null) {
+            paper.setRelate(!StringUtils.equals(student.getExamNumber(), student.getRelateExamNumber()));
             dto.setPaperId(paper.getId());
             dto.setPaperId(paper.getId());
         }
         }
         return dto;
         return dto;
     }
     }
 
 
-//    File srcFile = new File("/Users/king/stmms-ms/static/images/2/SM/1/1901040150.jpg"); //初始文件
-
     /**
     /**
      * 上传原图(图片加密)
      * 上传原图(图片加密)
      *
      *
@@ -1200,7 +1193,7 @@ public class CollectApi {
         List<Map<String, Object>> paperList = jdbcTemplate.queryForList(sql.toString());
         List<Map<String, Object>> paperList = jdbcTemplate.queryForList(sql.toString());
         //图片后缀
         //图片后缀
         String suffix = ".jpg";
         String suffix = ".jpg";
-        String dir,localUrl;
+        String dir, localUrl;
         if (Objects.equals("1", imageType)) {
         if (Objects.equals("1", imageType)) {
             dir = systemConfig.getSheetDir();
             dir = systemConfig.getSheetDir();
             localUrl = imageServerConfig.getImageServer() + "/sheet";
             localUrl = imageServerConfig.getImageServer() + "/sheet";
@@ -1210,8 +1203,8 @@ public class CollectApi {
         } else {
         } else {
             throw new RuntimeException("图片类型有误");
             throw new RuntimeException("图片类型有误");
         }
         }
-        if(paperList != null && paperList.size() >0){
-            paperList.stream().map(m->{
+        if (paperList != null && paperList.size() > 0) {
+            paperList.stream().map(m -> {
                 Long studentId = Long.valueOf(m.get("studentId").toString());
                 Long studentId = Long.valueOf(m.get("studentId").toString());
                 String subject = m.get("subject").toString();
                 String subject = m.get("subject").toString();
                 Subject subject1 = Subject.valueOf(subject);
                 Subject subject1 = Subject.valueOf(subject);
@@ -1422,7 +1415,7 @@ public class CollectApi {
             } catch (Exception e) {
             } catch (Exception e) {
                 e.printStackTrace();
                 e.printStackTrace();
             } finally {
             } finally {
-                if(isDeleteLocal){
+                if (isDeleteLocal) {
                     file.delete();
                     file.delete();
                 }
                 }
             }
             }

+ 9 - 0
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/dto/CollectStuDTO.java

@@ -17,6 +17,7 @@ public class CollectStuDTO {
 
 
     private String level;
     private String level;
     private Long paperId;
     private Long paperId;
+    private Long scanUserId;
 
 
     public Long getExamId() {
     public Long getExamId() {
         return examId;
         return examId;
@@ -97,4 +98,12 @@ public class CollectStuDTO {
     public void setPaperId(Long paperId) {
     public void setPaperId(Long paperId) {
         this.paperId = paperId;
         this.paperId = paperId;
     }
     }
+
+    public Long getScanUserId() {
+        return scanUserId;
+    }
+
+    public void setScanUserId(Long scanUserId) {
+        this.scanUserId = scanUserId;
+    }
 }
 }

+ 19 - 0
stmms-ms-commons/pom.xml

@@ -77,5 +77,24 @@
             <version>2.6</version>
             <version>2.6</version>
             <scope>compile</scope>
             <scope>compile</scope>
         </dependency>
         </dependency>
+
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-core</artifactId>
+            <version>5.7.22</version>
+        </dependency>
+
     </dependencies>
     </dependencies>
 </project>
 </project>

+ 3 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/constant/SystemConstant.java

@@ -12,6 +12,9 @@ import java.io.OutputStream;
  * @Date: 2019/10/11
  * @Date: 2019/10/11
  */
  */
 public class SystemConstant {
 public class SystemConstant {
+
+    public static final String INIT_PASSWORD = "123456";
+
     public static final String ENCODING = "UTF-8",
     public static final String ENCODING = "UTF-8",
             AES = "AES",
             AES = "AES",
             AES_MODE = "AES/CBC/PKCS5Padding";//用这个模式,规则必须为16位
             AES_MODE = "AES/CBC/PKCS5Padding";//用这个模式,规则必须为16位

+ 182 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/PdfUtils.java

@@ -0,0 +1,182 @@
+package cn.com.qmth.stmms.ms.commons.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.itextpdf.awt.AsianFontMapper;
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.List;
+
+public class PdfUtils {
+
+    // 每页20条
+    private static final int PAGE_SIZE = 20;
+
+    public static void exportPdf(String title, List<JSONObject> datas, HttpServletResponse response) throws Exception {
+
+        // 1:建立Document对象实例
+        Document document = new Document();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            // 2:建立一个PDF 写入器与document对象关联通过书写器(Writer)可以将文档写入到磁盘中
+            PdfWriter.getInstance(document, baos);
+//            PdfWriter.getInstance(document, new FileOutputStream("D:\\" + System.currentTimeMillis() + ".pdf"));
+            // 3:打开文档
+            document.open();
+
+            //解决中文不显示问题
+            BaseFont bfChinese = BaseFont.createFont(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H, BaseFont.NOT_EMBEDDED);
+            Font fontChina18 = new Font(bfChinese, 18);
+            Font fontChina12 = new Font(bfChinese, 12);
+
+            // 4:向文档添加内容
+            // 计算页数
+            int divide = datas.size() / PAGE_SIZE;
+            // 总页数
+            int totalPage = datas.size() % PAGE_SIZE == 0 ? divide : divide + 1;
+
+            for (int i = 0; i < totalPage; i++) {
+                // 若大于2页,需要增加页面
+                if (i > 0) {
+                    document.newPage();
+                }
+                // 标题
+                Paragraph titleParagraph = new Paragraph(title, fontChina18);
+                titleParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
+                document.add(titleParagraph);
+
+                // 空格
+                Paragraph blank1 = new Paragraph(" ");
+                document.add(blank1);
+
+                // 编号
+                Chunk c1 = new Chunk("共" + totalPage + "页  ", fontChina12);
+                Chunk c2 = new Chunk("第" + (i + 1) + "页", fontChina12);
+                Paragraph snoParagraph = new Paragraph();
+                snoParagraph.add(c1);
+                snoParagraph.add(c2);
+                snoParagraph.setAlignment(Element.ALIGN_RIGHT);
+                document.add(snoParagraph);
+
+                // 空格
+                document.add(blank1);
+
+                // 表格处理
+                PdfPTable table = new PdfPTable(4);// 四列
+                table.setWidthPercentage(100);// 表格宽度为100%
+
+                // 表头
+                // 序号
+                fillCell(table, "序号", fontChina12, BaseColor.GRAY);
+                // 试卷密号
+                fillCell(table, "试卷密号", fontChina12, BaseColor.GRAY);
+                // 原档位
+                fillCell(table, "原档位", fontChina12, BaseColor.GRAY);
+                // 改后档位
+                fillCell(table, "改后档位", fontChina12, BaseColor.GRAY);
+
+                List<JSONObject> subList = CollUtil.sub(datas, i * 20, (i + 1) * 20);
+                for (int j = 0; j < subList.size(); j++) {
+                    JSONObject object = subList.get(j);
+                    // 序号填充
+                    fillCell(table, i * 20 + j + 1, fontChina12, null);
+                    // 试卷密号
+                    fillCell(table, object.getString("secretNumber"), fontChina12, null);
+                    // 原档位
+                    fillCell(table, object.getString("oldLevel"), fontChina12, null);
+                    // 改后档位
+                    fillCell(table, object.getString("newLevel"), fontChina12, null);
+                }
+
+                // 不足20个,自动补齐
+                for (int k = 0; k < PAGE_SIZE - subList.size(); k++) {
+                    // 序号填充
+                    fillCell(table, i * 20 + subList.size() + k + 1, fontChina12, null);
+                    // 试卷密号
+                    fillCell(table, null, fontChina12, null);
+                    // 原档位
+                    fillCell(table, null, fontChina12, null);
+                    // 改后档位
+                    fillCell(table, null, fontChina12, null);
+                }
+
+                Paragraph pDate = new Paragraph(" 年        月        日", fontChina12);
+                pDate.setAlignment(Element.ALIGN_RIGHT);
+                pDate.setIndentationRight(20);
+
+                // 备注
+                PdfPCell cell34 = new PdfPCell();
+                cell34.setBorderWidth(0.5F);
+                cell34.setMinimumHeight(40);
+                cell34.setPhrase(new Paragraph("签字栏", fontChina12));
+                cell34.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
+                cell34.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
+                table.addCell(cell34);
+                PdfPCell cell35 = new PdfPCell();
+                cell35.setBorderWidth(0.5F);
+                cell35.setColspan(3);
+                cell35.addElement(blank1);
+                cell35.addElement(blank1);
+                cell35.addElement(blank1);
+                cell35.addElement(pDate);
+                cell35.addElement(blank1);
+                table.addCell(cell35);
+
+                document.add(table);
+            }
+            // 5:关闭文档
+            document.close();
+        } catch (DocumentException | IOException e) {
+            e.printStackTrace();
+        }
+
+        String fileName = title + ".pdf";
+        outputFile(response, baos, fileName);
+    }
+
+    /**
+     * 填充table
+     *
+     * @param table       表格对象
+     * @param content     填充值
+     * @param fontChina12 字体
+     * @param baseColor   背景色
+     */
+    private static void fillCell(PdfPTable table, Object content, Font fontChina12, BaseColor baseColor) {
+        PdfPCell cell = new PdfPCell();
+        cell.setBorderWidth(0.5F);
+        cell.setPhrase(new Paragraph(content == null ? "  " : String.valueOf(content), fontChina12));
+        cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
+        cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
+        cell.setExtraParagraphSpace(10);
+        if (baseColor != null) {
+            cell.setBackgroundColor(baseColor);
+        }
+        table.addCell(cell);
+    }
+
+    public static void outputFile(HttpServletResponse response, ByteArrayOutputStream baos, String fileName) throws Exception {
+        try {
+            String fName = URLEncoder.encode(fileName, "UTF-8");
+
+            response.reset();
+            response.setContentType("application/x-msdownload");
+            response.setHeader("Content-Disposition", "attachment; filename=" + fName);
+
+            OutputStream outStream = response.getOutputStream();
+            baos.writeTo(outStream);
+            outStream.close();
+        } catch (IOException e) {
+            throw new Exception("下载失败");
+        }
+    }
+}

+ 140 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/CheckData.java

@@ -0,0 +1,140 @@
+package cn.com.qmth.stmms.ms.core.domain;
+
+import cn.com.qmth.stmms.ms.core.domain.enums.CheckDataStatusEnum;
+import cn.com.qmth.stmms.ms.core.domain.enums.CheckItemEnum;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Entity
+@Table(name = "check_data")
+public class CheckData {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    private Long workId;
+
+    @Enumerated(value = EnumType.STRING)
+    private CheckItemEnum checkItem;
+
+    private Integer paramValue;
+
+    @Enumerated(value = EnumType.STRING)
+    private CheckDataStatusEnum status;
+
+    private Boolean result;
+
+    private int errorCount;
+
+    private String content;
+
+    private Date startTime;
+
+    private Date endTime;
+
+    public CheckData() {
+    }
+
+    public CheckData(Long workId, CheckItemEnum checkItem, Integer paramValue) {
+        this.workId = workId;
+        this.checkItem = checkItem;
+        this.paramValue = paramValue;
+        this.status = CheckDataStatusEnum.INIT;
+        this.startTime = new Date();
+    }
+
+    /**
+     * 重置参数
+     */
+    public void resetData(Integer paramValue) {
+        this.setParamValue(paramValue);
+        this.setStatus(CheckDataStatusEnum.INIT);
+        this.setResult(null);
+        this.setErrorCount(0);
+        this.setContent(null);
+        this.setStartTime(new Date());
+        this.setEndTime(null);
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public CheckItemEnum getCheckItem() {
+        return checkItem;
+    }
+
+    public void setCheckItem(CheckItemEnum checkItem) {
+        this.checkItem = checkItem;
+    }
+
+    public Integer getParamValue() {
+        return paramValue;
+    }
+
+    public void setParamValue(Integer paramValue) {
+        this.paramValue = paramValue;
+    }
+
+    public CheckDataStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(CheckDataStatusEnum status) {
+        this.status = status;
+    }
+
+    public Boolean getResult() {
+        return result;
+    }
+
+    public void setResult(Boolean result) {
+        this.result = result;
+    }
+
+    public int getErrorCount() {
+        return errorCount;
+    }
+
+    public void setErrorCount(int errorCount) {
+        this.errorCount = errorCount;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}

+ 25 - 2
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java

@@ -146,6 +146,13 @@ public class Paper implements Serializable {
 
 
     private Integer sortNum;
     private Integer sortNum;
 
 
+    private Long scanUserId;
+
+    /**
+     * 是否标记
+     */
+    private boolean isMark;
+
     public int getTest() {
     public int getTest() {
         return test;
         return test;
     }
     }
@@ -186,8 +193,7 @@ public class Paper implements Serializable {
         this.workId = workId;
         this.workId = workId;
         this.idx = idx;
         this.idx = idx;
         this.studentName = student.getName();
         this.studentName = student.getName();
-        String examNumber = student.getExamNumber();
-        this.examNumber = examNumber;
+        this.examNumber = student.getExamNumber();
         this.sourceName = student.getSourceName();
         this.sourceName = student.getSourceName();
         this.subject = subject;
         this.subject = subject;
         this.questionId = examQuestion.getId();
         this.questionId = examQuestion.getId();
@@ -199,6 +205,7 @@ public class Paper implements Serializable {
         this.randomSeq = randomSeq;
         this.randomSeq = randomSeq;
         this.isManual = isManual;
         this.isManual = isManual;
         this.uploadedOn = new Date();
         this.uploadedOn = new Date();
+        this.isMark = false;
     }
     }
 
 
 
 
@@ -558,4 +565,20 @@ public class Paper implements Serializable {
     public void setSortNum(Integer sortNum) {
     public void setSortNum(Integer sortNum) {
         this.sortNum = sortNum;
         this.sortNum = sortNum;
     }
     }
+
+    public Long getScanUserId() {
+        return scanUserId;
+    }
+
+    public void setScanUserId(Long scanUserId) {
+        this.scanUserId = scanUserId;
+    }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
 }
 }

+ 12 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java

@@ -50,6 +50,8 @@ public class ParamSetting implements Serializable {
 
 
     private Integer showStandardPaperManage;
     private Integer showStandardPaperManage;
 
 
+    private Integer takeBest;
+
 
 
     public static ParamSetting init(){
     public static ParamSetting init(){
         ParamSetting paramSetting = new ParamSetting();
         ParamSetting paramSetting = new ParamSetting();
@@ -69,6 +71,8 @@ public class ParamSetting implements Serializable {
         paramSetting.setPropDenominator(1);
         paramSetting.setPropDenominator(1);
         paramSetting.setAutoCallbackShowDeviation(1);
         paramSetting.setAutoCallbackShowDeviation(1);
         paramSetting.setShowStandardPaperManage(1);
         paramSetting.setShowStandardPaperManage(1);
+        // 取优原则默认开启
+        paramSetting.setTakeBest(1);
         return paramSetting;
         return paramSetting;
     }
     }
 
 
@@ -215,4 +219,12 @@ public class ParamSetting implements Serializable {
     public void setShowStandardPaperManage(Integer showStandardPaperManage) {
     public void setShowStandardPaperManage(Integer showStandardPaperManage) {
         this.showStandardPaperManage = showStandardPaperManage;
         this.showStandardPaperManage = showStandardPaperManage;
     }
     }
+
+    public Integer getTakeBest() {
+        return takeBest;
+    }
+
+    public void setTakeBest(Integer takeBest) {
+        this.takeBest = takeBest;
+    }
 }
 }

+ 33 - 16
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/BuiltInAccountEnum.java

@@ -1,9 +1,9 @@
 package cn.com.qmth.stmms.ms.core.domain.enums;
 package cn.com.qmth.stmms.ms.core.domain.enums;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
+
+import java.util.*;
 
 
 /**
 /**
  * 内置账号
  * 内置账号
@@ -13,42 +13,59 @@ public enum BuiltInAccountEnum {
     /**
     /**
      * 纪检员
      * 纪检员
      */
      */
-    INSPECTION("INSPECTION", "纪检员"),
+    INSPECTION("INSPECTION", "纪检员", 1),
     /**
     /**
      * 质检员
      * 质检员
      */
      */
-    QC("QC", "质检员"),
+    QC("QC", "质检员", 1),
     /**
     /**
      * 采集账号
      * 采集账号
      */
      */
-    SCAN("SCAN", "采集员");
+    SCAN("SCAN", "采集员", 10);
 
 
     private String code;
     private String code;
 
 
     private String name;
     private String name;
 
 
-    BuiltInAccountEnum(String code, String name) {
+    // 生成账号个数
+    private int count;
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    BuiltInAccountEnum(String code, String name, int count) {
         this.code = code;
         this.code = code;
         this.name = name;
         this.name = name;
+        this.count = count;
     }
     }
 
 
     public static BuiltInAccountEnum findById(String code) {
     public static BuiltInAccountEnum findById(String code) {
         for (BuiltInAccountEnum account : BuiltInAccountEnum.values()) {
         for (BuiltInAccountEnum account : BuiltInAccountEnum.values()) {
-            if (account.code == code) {
+            if (Objects.equals(account.code, code)) {
                 return account;
                 return account;
             }
             }
         }
         }
         return null;
         return null;
     }
     }
 
 
-    public static List<Map> listAccounts() {
-        List<Map> list = new ArrayList<>();
+    public static List<JSONObject> listAccounts() {
+        List<JSONObject> list = new ArrayList<>();
         for (BuiltInAccountEnum account : BuiltInAccountEnum.values()) {
         for (BuiltInAccountEnum account : BuiltInAccountEnum.values()) {
-            Map map = new HashMap();
-            map.put("code", account.code);
-            map.put("name", account.name);
-            map.put("type", findById(account.code).toString());
-            list.add(map);
+            JSONObject object = new JSONObject();
+            object.put("code", account.code);
+            object.put("name", account.name);
+            object.put("count", account.count);
+            object.put("type", account.name());
+            list.add(object);
         }
         }
         return list;
         return list;
     }
     }

+ 30 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/CheckDataStatusEnum.java

@@ -0,0 +1,30 @@
+package cn.com.qmth.stmms.ms.core.domain.enums;
+
+/**
+ * 数据检查状态
+ */
+public enum CheckDataStatusEnum {
+
+    /**
+     * 初始化
+     */
+    INIT("初始化"),
+    /**
+     * 执行中
+     */
+    RUNNING("执行中"),
+    /**
+     * 已完成
+     */
+    FINISH("已完成");
+
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    CheckDataStatusEnum(String name) {
+        this.name = name;
+    }
+}

+ 38 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/CheckItemEnum.java

@@ -0,0 +1,38 @@
+package cn.com.qmth.stmms.ms.core.domain.enums;
+
+/**
+ * 检查项
+ */
+public enum CheckItemEnum {
+
+    /**
+     * 所有试卷图片大小均不为0
+     */
+    PAPER_SIZE("所有试卷图片大小均不为0"),
+    /**
+     * 校验每张试卷都有分数
+     */
+    ALL_SCORE("校验每张试卷都有分数"),
+    /**
+     * 每张试卷分数都在其所属档位分数区间内
+     */
+    LEVEL_SCORE_MATCH("每张试卷分数都在其所属档位分数区间内"),
+    /**
+     * 同一考生各科目档位差超过{变量值}
+     */
+    LEVEL_DIFF("同一考生各科目档位差超过__"),
+    /**
+     * 同一考生各科目成绩差超过{变量值}
+     */
+    SCORE_DIFF("同一考生各科目成绩差超过__");
+
+    private String title;
+
+    public String getTitle() {
+        return title;
+    }
+
+    CheckItemEnum(String title) {
+        this.title = title;
+    }
+}

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

@@ -106,6 +106,11 @@ public class MarkTask implements Serializable {
 
 
     private String deviationDirection;
     private String deviationDirection;
 
 
+    /**
+     * 是否标记
+     */
+    private boolean isMark;
+
     public Long getBatchNo() {
     public Long getBatchNo() {
         return batchNo;
         return batchNo;
     }
     }
@@ -155,6 +160,7 @@ public class MarkTask implements Serializable {
 //        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
 //        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
         this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
         this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + randomSeqNew;
         this.randomSeqNew = randomSeqNew;
         this.randomSeqNew = randomSeqNew;
+        this.isMark = false;
     }
     }
 
 
     public MarkTask(MarkUser marker, Paper paper, MarkStage stage, Long randomSeqNew, int test) {
     public MarkTask(MarkUser marker, Paper paper, MarkStage stage, Long randomSeqNew, int test) {
@@ -172,6 +178,7 @@ public class MarkTask implements Serializable {
         this.randomSeqNew = randomSeqNew;
         this.randomSeqNew = randomSeqNew;
         this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
         this.test = test != TrialEnum.DEFAULT.getId() ? TrialEnum.START_TRIAL.getId() : test;
         this.isSample = paper.isSample();
         this.isSample = paper.isSample();
+        this.isMark = false;
     }
     }
 
 
     public MarkTask(MarkUser marker, Paper paper, Level level, MarkStage stage, Long randomSeqNew, int test) {
     public MarkTask(MarkUser marker, Paper paper, Level level, MarkStage stage, Long randomSeqNew, int test) {
@@ -194,6 +201,25 @@ public class MarkTask implements Serializable {
         this.isSample = paper.isSample();
         this.isSample = paper.isSample();
         this.levelValue = level.getLevelValue();
         this.levelValue = level.getLevelValue();
         this.updatedOn = new Date();
         this.updatedOn = new Date();
+        this.isMark = false;
+    }
+
+    /**
+     * 成绩查询使用
+     *
+     * @param id           任务ID
+     * @param markerId     评卷员Id
+     * @param markerName   评卷员名称
+     * @param result       结果
+     * @param secretNumber 任务密号
+     */
+    public MarkTask(Long id, Long markerId, String markerName, String result, String secretNumber, MarkStage stage) {
+        this.id = id;
+        this.markerId = markerId;
+        this.markerName = markerName;
+        this.result = result;
+        this.secretNumber = secretNumber;
+        this.stage = stage;
     }
     }
 
 
     public MarkTask() {
     public MarkTask() {
@@ -374,4 +400,12 @@ public class MarkTask implements Serializable {
     public void setDeviationDirection(String deviationDirection) {
     public void setDeviationDirection(String deviationDirection) {
         this.deviationDirection = deviationDirection;
         this.deviationDirection = deviationDirection;
     }
     }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
 }
 }

+ 11 - 2
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/Role.java

@@ -1,10 +1,19 @@
 package cn.com.qmth.stmms.ms.core.domain.user;
 package cn.com.qmth.stmms.ms.core.domain.user;
 
 
+import java.util.Objects;
+
 /**
 /**
  * Created by zhengmin on 2016/10/9.
  * Created by zhengmin on 2016/10/9.
  */
  */
 public enum Role {
 public enum Role {
-    MARKER("评卷员"), MARK_LEADER("科组长"), ADMIN("管理员"), INSPECTOR("复评专家"), INSPECTION("纪检员"), COLLECTOR("采集员"), UPLOAD("图片客户端"), QC("质检员");
+    MARKER("评卷员"),
+    MARK_LEADER("科组长"),
+    ADMIN("管理员"),
+    INSPECTOR("复评专家"),
+    INSPECTION("纪检员"),
+    COLLECTOR("采集员"),
+    UPLOAD("图片客户端"),
+    QC("质检员");
 
 
     private String name;
     private String name;
 
 
@@ -18,7 +27,7 @@ public enum Role {
 
 
     public static Role findByName(String name) {
     public static Role findByName(String name) {
         for (Role role : Role.values()) {
         for (Role role : Role.values()) {
-            if (role.name == name) {
+            if (Objects.equals(role.name, name)) {
                 return role;
                 return role;
             }
             }
         }
         }

+ 14 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/CheckDataRepo.java

@@ -0,0 +1,14 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.CheckData;
+import cn.com.qmth.stmms.ms.core.domain.enums.CheckItemEnum;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface CheckDataRepo extends JpaRepository<CheckData, Long> {
+
+    List<CheckData> findByWorkId(Long workId);
+
+    CheckData findByWorkIdAndCheckItem(Long workId, CheckItemEnum checkItem);
+}

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

@@ -3,7 +3,6 @@ package cn.com.qmth.stmms.ms.core.repository;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
-import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -33,6 +32,9 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
      */
     List<MarkTask> findByPaperIdAndStage(Long paperId, MarkStage stage);
     List<MarkTask> findByPaperIdAndStage(Long paperId, MarkStage stage);
 
 
+    @Query(value = "select new MarkTask(m.id, m.markerId , m.markerName, m.result, m.secretNumber, m.stage) from MarkTask m where m.paper.id = ?1 and m.stage = ?2")
+    List<MarkTask> findByPaperIdAndStageNative(Long id, MarkStage level);
+
     /**
     /**
      * 评卷员任务数量
      * 评卷员任务数量
      *
      *
@@ -64,6 +66,7 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
 
 
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.level = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
     @Query(value = "select count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.level = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is not null", nativeQuery = true)
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultAll(Long questionId, Long markerId, int stage, String result);
+
     /**
     /**
      * 查询评卷员的评卷任务
      * 查询评卷员的评卷任务
      *
      *
@@ -106,7 +109,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
     /**
      * 统计各评卷员各试题已评数及总数(分档阶段)
      * 统计各评卷员各试题已评数及总数(分档阶段)
      *
      *
-     *
      * @param name
      * @param name
      * @param stageId
      * @param stageId
      * @param batchNo
      * @param batchNo
@@ -120,7 +122,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
     /**
      * 统计各评卷员各试题已评数及总数(分档阶段)
      * 统计各评卷员各试题已评数及总数(分档阶段)
      *
      *
-     *
      * @param subject
      * @param subject
      * @param stageId
      * @param stageId
      * @param batchNo
      * @param batchNo
@@ -135,7 +136,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
     /**
      * 考区已评数及总数(分档阶段)
      * 考区已评数及总数(分档阶段)
      *
      *
-     *
      * @param name
      * @param name
      * @return
      * @return
      */
      */
@@ -147,7 +147,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
     /**
      * 考区已评数及总数(分档阶段)
      * 考区已评数及总数(分档阶段)
      *
      *
-     *
      * @param name
      * @param name
      * @return
      * @return
      */
      */
@@ -217,13 +216,13 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissingAll(Long questionId, Long markerId, int stage, boolean isMissing);
     int countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissingAll(Long questionId, Long markerId, int stage, boolean isMissing);
 
 
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and m.result =?3 and p.is_rejected = false", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and m.result =?3 and p.is_rejected = false", nativeQuery = true)
-    int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing,Long batchNo,Long markerId);
+    int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing, Long batchNo, Long markerId);
 
 
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and p.level =?3 and m.result is not null", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no = ?5 where m.question_id = ?1 and m.marker_id = ?6 and m.stage = ?2 and p.level =?3 and m.result is not null", nativeQuery = true)
-    int countScoreByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing,Long batchNo,Long markerId);
+    int countScoreByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing, Long batchNo, Long markerId);
 
 
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?5 and m.stage = ?2 and p.level =?3 and m.result is not null", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.score_batch_no is not null where m.question_id = ?1 and m.marker_id = ?5 and m.stage = ?2 and p.level =?3 and m.result is not null", nativeQuery = true)
-    int countScoreByQuestionIdAndStageAndResultAndIsMissingAll(Long questionId, int stage, String result, boolean isMissing,Long markerId);
+    int countScoreByQuestionIdAndStageAndResultAndIsMissingAll(Long questionId, int stage, String result, boolean isMissing, Long markerId);
 
 
     MarkTask findByPaperIdAndMarkerId(Long paperId, Long markId);
     MarkTask findByPaperIdAndMarkerId(Long paperId, Long markId);
 
 
@@ -248,10 +247,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(Long questionId, Long markerId, int stage);
     int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAll(Long questionId, Long markerId, int stage);
 
 
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?5 and m.stage = ?2 and m.result =?3 and p.is_rejected = false", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?5 and m.stage = ?2 and m.result =?3 and p.is_rejected = false", nativeQuery = true)
-    int countByQuestionIdAndStageAndResultAndIsMissingAll(Long questionId, int stage, String result, boolean isMissing,Long markerId);
+    int countByQuestionIdAndStageAndResultAndIsMissingAll(Long questionId, int stage, String result, boolean isMissing, Long markerId);
 
 
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and p.is_rejected = true", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m inner join paper p on m.paper_id = p.id and p.is_missing = ?4 and p.batch_no is not null where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and p.is_rejected = true", nativeQuery = true)
-    int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(Long questionId, Long markerId, int ordinal,boolean isMissing);
+    int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrueAndIsMissing(Long questionId, Long markerId, int ordinal, boolean isMissing);
 
 
     @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and  m.batch_no is not null and m.is_rejected = true", nativeQuery = true)
     @Query(value = "SELECT count(1) from mark_task m where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and  m.batch_no is not null and m.is_rejected = true", nativeQuery = true)
     int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(Long questionId, Long markerId, int ordinal);
     int countByQuestionIdAndMarkerIdAndStageAndIsRejectedTrue(Long questionId, Long markerId, int ordinal);
@@ -289,4 +288,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     List<Object[]> findByWorkIdAndSubjectAndStage(@Param("workId") Long workId, @Param("subject") String subject, @Param("stage") int stage);
     List<Object[]> findByWorkIdAndSubjectAndStage(@Param("workId") Long workId, @Param("subject") String subject, @Param("stage") int stage);
 
 
     List<MarkTask> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
     List<MarkTask> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
+
+    @Modifying
+    @Query("update MarkTask m set m.isMark = ?2 where m.id = ?1")
+    void updateMarkTaskMarkById(Long markTaskId, Boolean isMark);
+
+    List<MarkTask> findByWorkIdAndSubjectAndMarkerIdAndIsMarkTrue(Long workId, Subject subject, Long markerId);
 }
 }

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

@@ -458,5 +458,16 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
 
     List<Paper> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
     List<Paper> findByWorkIdAndSubjectAndSecretNumberAndTest(Long workId, Subject subject, String secretNumber, int id);
 
 
+    @Modifying
+    @Query("update Paper s set s.isMark = ?2 where s.id = ?1")
+    void updatePaperMarkById(Long paperId, boolean isMark);
+
+    @Query(value = "select * from paper p where p.scan_user_id = ?1 order by p.updated_on desc limit 1", nativeQuery = true)
+    Paper findByScanUserIdOrderByUpdatedOnDescLimit(Long id);
+
+    List<Paper> findByWorkIdAndIsMissing(Long workId, boolean missing);
+
+    List<Paper> findByWorkIdAndIsMarkTure(Long workId);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }
 }

+ 46 - 20
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java

@@ -4,14 +4,16 @@ import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.commons.utils.specification.PagingAndSortingDTO;
 import cn.com.qmth.stmms.ms.commons.utils.specification.PagingAndSortingDTO;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.*;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
+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.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 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.assembler.PaperAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.PageRequest;
@@ -19,16 +21,18 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
+import javax.annotation.Resource;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 
 //import io.swagger.annotations.Api;
 //import io.swagger.annotations.Api;
 //import io.swagger.annotations.ApiOperation;
 //import io.swagger.annotations.ApiOperation;
@@ -48,6 +52,9 @@ public class MarkLogController {
     @Autowired
     @Autowired
     WorkRepo workRepo;
     WorkRepo workRepo;
 
 
+    @Resource
+    MarkUserRepo markUserRepo;
+
     @Autowired
     @Autowired
     SqlUtil sqlUtil;
     SqlUtil sqlUtil;
 
 
@@ -83,7 +90,7 @@ public class MarkLogController {
             if (Objects.nonNull(examNumber)) {
             if (Objects.nonNull(examNumber)) {
                 predicates.add(cb.equal(root.get("examNumber").as(String.class), examNumber));
                 predicates.add(cb.equal(root.get("examNumber").as(String.class), examNumber));
             }
             }
-            if (Objects.nonNull(studentName) && studentName != "" ) {
+            if (Objects.nonNull(studentName) && studentName != "") {
                 predicates.add(cb.like(root.get("studentName").as(String.class), "%" + studentName + "%"));
                 predicates.add(cb.like(root.get("studentName").as(String.class), "%" + studentName + "%"));
             }
             }
             if (Objects.nonNull(operType)) {
             if (Objects.nonNull(operType)) {
@@ -102,11 +109,11 @@ public class MarkLogController {
             }
             }
             List<Map> mapList = MarkLogOperType.listTypes();
             List<Map> mapList = MarkLogOperType.listTypes();
             if (mapList != null && mapList.size() > 0) {
             if (mapList != null && mapList.size() > 0) {
-                    CriteriaBuilder.In<Object> in = cb.in(root.get("operType"));
-                    for (Map map : mapList) {
-                        in.value(map.get("id"));
-                    }
-                    predicates.add(cb.and(cb.and(in)));
+                CriteriaBuilder.In<Object> in = cb.in(root.get("operType"));
+                for (Map map : mapList) {
+                    in.value(map.get("id"));
+                }
+                predicates.add(cb.and(cb.and(in)));
             }
             }
             return cb.and(predicates.toArray(new Predicate[predicates.size()]));
             return cb.and(predicates.toArray(new Predicate[predicates.size()]));
         };
         };
@@ -232,21 +239,19 @@ public class MarkLogController {
     }
     }
 
 
     /**
     /**
-     * 设备监控
+     * 设备监控(列表)
      *
      *
-     * @param workId
-     * @return
-     * @throws ParseException
+     * @param workId   工作ID
+     * @param pageable 分页参数
      */
      */
     @RequestMapping(value = "/equipmentMonitor", method = RequestMethod.GET)
     @RequestMapping(value = "/equipmentMonitor", method = RequestMethod.GET)
     public Object saveCollectLog(Long workId, Pageable pageable) {
     public Object saveCollectLog(Long workId, Pageable pageable) {
-        List<Map> mapList = markLogRepo.findByWorkId(workId);
-        if (!mapList.isEmpty() && mapList.size() > 0) {
+        /*List<Map> mapList = markLogRepo.findByWorkId(workId);
+        if (!mapList.isEmpty()) {
             List<Long> longs = mapList.stream().map(m -> Long.valueOf(m.get("id").toString())).collect(Collectors.toList());
             List<Long> longs = mapList.stream().map(m -> Long.valueOf(m.get("id").toString())).collect(Collectors.toList());
-
             Specification<MarkLog> specification = (root, query, builder) -> {
             Specification<MarkLog> specification = (root, query, builder) -> {
                 List<Predicate> predicates = new ArrayList<>();
                 List<Predicate> predicates = new ArrayList<>();
-                if (longs != null && longs.size() > 0) {
+                if (longs.size() > 0) {
                     CriteriaBuilder.In<Object> in = builder.in(root.get("id"));
                     CriteriaBuilder.In<Object> in = builder.in(root.get("id"));
                     for (Long id : longs) {
                     for (Long id : longs) {
                         in.value(id);
                         in.value(id);
@@ -262,16 +267,37 @@ public class MarkLogController {
                 Map map = new HashMap();
                 Map map = new HashMap();
                 map.put("createUserName", markLog.getCreateUserName());
                 map.put("createUserName", markLog.getCreateUserName());
                 Paper paper = paperRepo.findOne(markLog.getPaperId());
                 Paper paper = paperRepo.findOne(markLog.getPaperId());
-//                PaperDTO paperDTO = paperAssembler.toDTO(paper);
                 PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
                 PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
                 map.put("imgSrc", paperDTO.getImgSrc());
                 map.put("imgSrc", paperDTO.getImgSrc());
                 map.put("thumbSrc", paperDTO.getThumbSrc());
                 map.put("thumbSrc", paperDTO.getThumbSrc());
+                map.put("sheetSrc", paperDTO.getSheetSrc());
                 arrayList.add(map);
                 arrayList.add(map);
             }
             }
 
 
             return new PageableDTO(arrayList, markLogs.getTotalElements(), markLogs.getTotalPages(), pageable.getPageNumber());
             return new PageableDTO(arrayList, markLogs.getTotalElements(), markLogs.getTotalPages(), pageable.getPageNumber());
+        }*/
+        Specification<MarkUser> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+//            predicates.add(builder.equal(root.get("workId"), workId));
+            predicates.add(builder.equal(root.get("role"), Role.COLLECTOR));
+            return builder.and(predicates.toArray(new Predicate[0]));
+        };
+        Sort sort = new Sort(Sort.Direction.ASC, "loginName");
+        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+        Page<MarkUser> markUserPage = markUserRepo.findAll(specification, pageable1);
+        List<MarkUser> markUserList = markUserPage.getContent();
+        List<JSONObject> arrayList = new ArrayList<>();
+        for (MarkUser markUser : markUserList) {
+            JSONObject object = new JSONObject();
+            object.put("createUserName", markUser.getName());
+            Paper paper = paperRepo.findByScanUserIdOrderByUpdatedOnDescLimit(markUser.getId());
+            PaperDTO paperDTO = paperAssembler.toDTOForEquipmentMonitor(paper, true);
+            object.put("imgSrc", paper == null ? null : paperDTO.getImgSrc());
+            object.put("thumbSrc", paper == null ? null : paperDTO.getThumbSrc());
+            object.put("sheetSrc", paper == null ? null : paperDTO.getSheetSrc());
+            arrayList.add(object);
         }
         }
-        return null;
+        return new PageableDTO(arrayList, markUserPage.getTotalElements(), markUserPage.getTotalPages(), pageable.getPageNumber());
     }
     }
 
 
     /**
     /**

+ 12 - 0
stmms-ms-main/pom.xml

@@ -42,6 +42,18 @@
             <artifactId>stmms-ms-collect</artifactId>
             <artifactId>stmms-ms-collect</artifactId>
             <version>${project.version}</version>
             <version>${project.version}</version>
         </dependency>
         </dependency>
+
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
     <build>
     <build>

+ 0 - 5
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/StartRunning.java

@@ -1,20 +1,15 @@
 package cn.com.qmth.stmms.ms;
 package cn.com.qmth.stmms.ms;
 
 
-import cn.com.qmth.stmms.ms.admin.utils.BultInAccountUtil;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.domain.Work;
-import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
-import cn.com.qmth.stmms.ms.quartz.ScheduledTask;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
-import javax.annotation.Resource;
 import java.util.List;
 import java.util.List;
-import java.util.Objects;
 
 
 /**
 /**
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用

+ 5 - 5
stmms-ms-main/src/main/resources/application-dev.properties

@@ -1,6 +1,6 @@
 db.host=localhost
 db.host=localhost
 db.port=3306
 db.port=3306
-db.dbName=msyj-2.0.0
+db.dbName=msyj-local-v3.0.0
 db.userName=root
 db.userName=root
 db.password=root
 db.password=root
 
 
@@ -21,7 +21,7 @@ server.compression.mime-types: application/json,application/xml,text/html,text/x
 
 
 
 
 logging.file=./logs/sys.log
 logging.file=./logs/sys.log
-#logging.level.root\u4E0A\u7EBF\u6539\u4E3Aerror
+#logging.level.root\u4E0A\u7EBF\u6539\u4E3A error
 logging.level.root=info
 logging.level.root=info
 logging.level.org.springframework=info
 logging.level.org.springframework=info
 logging.level.org.hibernate=info
 logging.level.org.hibernate=info
@@ -56,9 +56,9 @@ app.admin.password=123456
 #app.inspection.password=123456
 #app.inspection.password=123456
 
 
 #\u4E34\u65F6\u76EE\u5F55
 #\u4E34\u65F6\u76EE\u5F55
-sys.config.locationTempDir=data\\msyj\\temp
+#sys.config.locationTempDir=data\\msyj\\temp
 
 
-server.tomcat.basedir=\\data\\msyj\\temp
+#server.tomcat.basedir=\\data\\msyj\\temp
 
 
 #\u56FE\u7247\u4FDD\u5B58\u76EE\u5F55
 #\u56FE\u7247\u4FDD\u5B58\u76EE\u5F55
 sys.config.localhostPath=upload
 sys.config.localhostPath=upload
@@ -96,7 +96,7 @@ score.level.taskSort=paper
 #score.level.taskSort=paper
 #score.level.taskSort=paper
 
 
 #\u524D\u7AEF\u9759\u6001\u8D44\u6E90\u76EE\u5F55
 #\u524D\u7AEF\u9759\u6001\u8D44\u6E90\u76EE\u5F55
-web.upload-path=D:\\company\\qmth\\bat-pro\\msyj-2021-local-v2.0.0-nginx\\dist\\
+web.upload-path=D:\\company\\qmth\\bat-pro\\msyj\\local\\msyj-2021-local-v2.1.0-nginx\\dist\\
 spring.mvc.static-path-pattern=/**
 spring.mvc.static-path-pattern=/**
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${sys.config.localhostPath},file:${web.upload-path}
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${sys.config.localhostPath},file:${web.upload-path}
 
 

+ 4 - 4
stmms-ms-main/src/test/java/BatchCreateDataTest.java

@@ -65,7 +65,7 @@ public class BatchCreateDataTest {
     // 科组长数量
     // 科组长数量
     private static int MARKER_LEADER_COUNT = 4;
     private static int MARKER_LEADER_COUNT = 4;
     // 工作id
     // 工作id
-    private static Long WORK_ID = 1L;
+    private static Long WORK_ID = 13L;
     // 生成科目
     // 生成科目
     private List<Subject> subjects = Arrays.asList(Subject.SX, Subject.SC, Subject.SM);
     private List<Subject> subjects = Arrays.asList(Subject.SX, Subject.SC, Subject.SM);
     // 是否复制图片
     // 是否复制图片
@@ -84,11 +84,11 @@ public class BatchCreateDataTest {
 
 
     private void createData() throws Exception {
     private void createData() throws Exception {
         //默认用id为10的工作
         //默认用id为10的工作
-        Work work = workRepo.findOne(WORK_ID);
-        createWork(work);
+//        Work work = workRepo.findOne(WORK_ID);
+//        createWork(work);
 
 
         // 生成用户
         // 生成用户
-        createUser();
+//        createUser();
 
 
         randomUtil.getRandom(WORK_ID, false);
         randomUtil.getRandom(WORK_ID, false);
 
 

+ 66 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/CheckDataApi.java

@@ -0,0 +1,66 @@
+package cn.com.qmth.stmms.ms.marking.api;
+
+import cn.com.qmth.stmms.ms.core.domain.CheckData;
+import cn.com.qmth.stmms.ms.core.domain.enums.CheckDataStatusEnum;
+import cn.com.qmth.stmms.ms.core.domain.enums.CheckItemEnum;
+import cn.com.qmth.stmms.ms.core.repository.CheckDataRepo;
+import cn.com.qmth.stmms.ms.marking.service.CheckDataService;
+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 javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 数据校验
+ */
+@RestController
+@RequestMapping("/api/check_data")
+public class CheckDataApi {
+
+    @Resource
+    CheckDataService checkDataService;
+
+    @Resource
+    CheckDataRepo checkDataRepo;
+
+    /**
+     * 获取同步结果
+     *
+     * @param workId 工作ID
+     */
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public List<CheckData> list(@RequestParam Long workId) {
+        return checkDataRepo.findByWorkId(workId);
+    }
+
+    /**
+     * 检查
+     *
+     * @param workId     工作ID
+     * @param checkItem  数据类型
+     * @param paramValue 变量参数
+     */
+    @RequestMapping(value = "/check", method = RequestMethod.POST)
+    public Object check(@RequestParam Long workId,
+                        @RequestParam CheckItemEnum checkItem,
+                        @RequestParam(required = false) Integer paramValue) throws Exception {
+        CheckData checkData = checkDataRepo.findByWorkIdAndCheckItem(workId, checkItem);
+        if (checkData == null) {
+            checkData = new CheckData(workId, checkItem, paramValue);
+        } else {
+            if (!CheckDataStatusEnum.FINISH.equals(checkData.getStatus())) {
+                throw new Exception("有任务正在执行");
+            }
+            checkData.resetData(paramValue);
+        }
+        checkDataRepo.save(checkData);
+
+        // 异步任务开始
+        checkDataService.syncCheckData(checkData);
+
+        return true;
+    }
+}

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

@@ -481,7 +481,7 @@ public class MarkSubjectApi {
     @RequestMapping(value = "{markSubject}/canScore", method = RequestMethod.GET)
     @RequestMapping(value = "{markSubject}/canScore", method = RequestMethod.GET)
     public Boolean canScore(@PathVariable MarkSubject markSubject) {
     public Boolean canScore(@PathVariable MarkSubject markSubject) {
         int count = paperRepo.countByWorkIdAndSubjectAndScoreBatchNoIsNotNullAndScoreIsNull(markSubject.getWorkId(), markSubject.getSubject());
         int count = paperRepo.countByWorkIdAndSubjectAndScoreBatchNoIsNotNullAndScoreIsNull(markSubject.getWorkId(), markSubject.getSubject());
-        return count > 0 ? false : true;
+        return count <= 0;
     }
     }
 
 
     /**
     /**
@@ -498,7 +498,7 @@ public class MarkSubjectApi {
         int totalTaskCount = taskPublishSettings.stream().mapToInt(TaskPublishSetting::getTotalCount).sum();
         int totalTaskCount = taskPublishSettings.stream().mapToInt(TaskPublishSetting::getTotalCount).sum();
         int successTaskCount = taskPublishSettings.stream().mapToInt(TaskPublishSetting::getSuccessCount).sum();
         int successTaskCount = taskPublishSettings.stream().mapToInt(TaskPublishSetting::getSuccessCount).sum();
 
 
-        return totalTaskCount - successTaskCount > 0 ? false : true;
+        return totalTaskCount - successTaskCount <= 0;
     }
     }
 
 
     /**
     /**
@@ -517,7 +517,7 @@ public class MarkSubjectApi {
     @RequestMapping(value = "{markSubject}/canLevel", method = RequestMethod.GET)
     @RequestMapping(value = "{markSubject}/canLevel", method = RequestMethod.GET)
     public Boolean canLevel(@PathVariable MarkSubject markSubject) {
     public Boolean canLevel(@PathVariable MarkSubject markSubject) {
         int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
         int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
-        return count > 0 ? false : true;
+        return count <= 0;
     }
     }
 
 
 
 

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

@@ -15,7 +15,6 @@ import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 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.MarkTaskAssembler;
-import cn.com.qmth.stmms.ms.marking.assembler.MarkerAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.LevelDetailDTO;
 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.MarkTaskDTO;
@@ -32,12 +31,13 @@ import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.ResponseEntity;
-import org.springframework.orm.jpa.vendor.OpenJpaDialect;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
-import javax.persistence.criteria.*;
+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.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.*;
@@ -298,7 +298,7 @@ public class MarkTaskApi {
         boolean oldRejected = markTask.isRejected();
         boolean oldRejected = markTask.isRejected();
         boolean oldShift = markTask.getPaper().isShift();
         boolean oldShift = markTask.getPaper().isShift();
         boolean oldShiftScore = markTask.getPaper().isShiftScore();
         boolean oldShiftScore = markTask.getPaper().isShiftScore();
-        if (stage == null || result == null) {
+        if (result == null) {
             return new ResponseEntity(HttpStatus.BAD_REQUEST);
             return new ResponseEntity(HttpStatus.BAD_REQUEST);
         }
         }
         switch (stage) {
         switch (stage) {
@@ -313,7 +313,7 @@ public class MarkTaskApi {
                 }
                 }
                 break;
                 break;
             case SCORE:
             case SCORE:
-                Integer score = Integer.parseInt(result);
+                int score = Integer.parseInt(result);
                 try {
                 try {
                     lockService.waitlock(LockType.SCORE, markTask.getPaper().getId());
                     lockService.waitlock(LockType.SCORE, markTask.getPaper().getId());
                     markingService.scoring(markTask, score);
                     markingService.scoring(markTask, score);
@@ -331,9 +331,8 @@ public class MarkTaskApi {
      * 批量提交评卷任务
      * 批量提交评卷任务
      *
      *
      * @param body 评卷内容
      * @param body 评卷内容
-     * @return
      */
      */
-    @RequestMapping(value = "batch", method = RequestMethod.PATCH)
+    @RequestMapping(value = "/batch", method = RequestMethod.PATCH)
     public ResponseEntity batch(@RequestBody HashMap<String, String> body) {
     public ResponseEntity batch(@RequestBody HashMap<String, String> body) {
         MarkStage stage = MarkStage.valueOf(body.get("stage"));
         MarkStage stage = MarkStage.valueOf(body.get("stage"));
         String markIds = body.get("taskIds");
         String markIds = body.get("taskIds");
@@ -348,7 +347,7 @@ public class MarkTaskApi {
             boolean oldRejected = markTask.isRejected();
             boolean oldRejected = markTask.isRejected();
             boolean oldShift = markTask.getPaper().isShift();
             boolean oldShift = markTask.getPaper().isShift();
             boolean oldShiftScore = markTask.getPaper().isShiftScore();
             boolean oldShiftScore = markTask.getPaper().isShiftScore();
-            if (stage == null || result == null) {
+            if (result == null) {
                 return new ResponseEntity(HttpStatus.BAD_REQUEST);
                 return new ResponseEntity(HttpStatus.BAD_REQUEST);
             }
             }
             switch (stage) {
             switch (stage) {
@@ -363,7 +362,7 @@ public class MarkTaskApi {
                     }
                     }
                     break;
                     break;
                 case SCORE:
                 case SCORE:
-                    Integer score = Integer.parseInt(result);
+                    int score = Integer.parseInt(result);
                     synchronized (this) {
                     synchronized (this) {
                         markingService.scoring(markTask, score);
                         markingService.scoring(markTask, score);
                     }
                     }
@@ -388,6 +387,19 @@ public class MarkTaskApi {
         return new ResponseEntity(markTaskAssembler.toDTO(markTask), HttpStatus.OK);
         return new ResponseEntity(markTaskAssembler.toDTO(markTask), HttpStatus.OK);
     }
     }
 
 
+    /**
+     * 跳过评卷任务
+     *
+     * @param markTaskId 评卷你任务id
+     * @return
+     */
+    @RequestMapping(value = "/mark_task", method = RequestMethod.POST)
+    public Object markTask(@RequestParam Long markTaskId,
+                           @RequestParam Boolean isMark) {
+        markTaskRepo.updateMarkTaskMarkById(markTaskId, isMark);
+        return true;
+    }
+
     /**
     /**
      * 已评试卷回显
      * 已评试卷回显
      *
      *
@@ -582,6 +594,7 @@ public class MarkTaskApi {
 
 
     /**
     /**
      * 根据任务密号查询试卷
      * 根据任务密号查询试卷
+     *
      * @param workId
      * @param workId
      * @param subject
      * @param subject
      * @param secretNumber
      * @param secretNumber
@@ -593,4 +606,23 @@ public class MarkTaskApi {
                                             @RequestParam String secretNumber) {
                                             @RequestParam String secretNumber) {
         return markTaskRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber, TrialEnum.DEFAULT.getId());
         return markTaskRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber, TrialEnum.DEFAULT.getId());
     }
     }
+
+    /**
+     * 查询标记任务(科组长)
+     *
+     * @param workId   工作ID
+     * @param subject  科目
+     * @param markerId 评卷员ID
+     */
+    @RequestMapping(value = "/list_mark_task", method = RequestMethod.GET)
+    public List<MarkTaskDTO> listMarkTask(@RequestParam Long workId,
+                                          @RequestParam Subject subject,
+                                          @RequestParam Long markerId) {
+        List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndSubjectAndMarkerIdAndIsMarkTrue(workId, subject, markerId);
+        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
+        markTasks.forEach(m -> {
+            markTaskDTOs.add(markTaskAssembler.toDTO(m));
+        });
+        return markTaskDTOs;
+    }
 }
 }

+ 106 - 38
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -3,7 +3,10 @@ package cn.com.qmth.stmms.ms.marking.api;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
-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.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.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroupLeader;
@@ -18,7 +21,7 @@ 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.dto.PaperDTO;
 import cn.com.qmth.stmms.ms.marking.service.MarkerGroupLeaderService;
 import cn.com.qmth.stmms.ms.marking.service.MarkerGroupLeaderService;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
-import javafx.beans.binding.ObjectExpression;
+import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
@@ -81,7 +84,6 @@ public class PaperApi {
      * 单个试卷信息
      * 单个试卷信息
      *
      *
      * @param paperId 试卷id
      * @param paperId 试卷id
-     * @return
      */
      */
     @RequestMapping(value = "{paperId}", method = RequestMethod.GET)
     @RequestMapping(value = "{paperId}", method = RequestMethod.GET)
     public PaperDTO get(@PathVariable Long paperId) {
     public PaperDTO get(@PathVariable Long paperId) {
@@ -94,7 +96,6 @@ public class PaperApi {
      * @param questionId 试题id
      * @param questionId 试题id
      * @param sn         密号
      * @param sn         密号
      * @param examNumber 准考证号
      * @param examNumber 准考证号
-     * @return
      */
      */
     @RequestMapping(value = "/one", method = RequestMethod.GET)
     @RequestMapping(value = "/one", method = RequestMethod.GET)
     public PaperDTO getOne(@RequestParam Long questionId,
     public PaperDTO getOne(@RequestParam Long questionId,
@@ -141,18 +142,36 @@ public class PaperApi {
         return paperDTO;
         return paperDTO;
     }
     }
 
 
+    /**
+     * 试卷管理-查询
+     *
+     * @param workId      工作ID
+     * @param areaCode    考区
+     * @param subject     科目
+     * @param startNumber 准考证号(开始)
+     * @param endNumber   准考证号(结束)
+     * @param isManual    是否手工绑定
+     * @param missing     是否缺考
+     * @param isRelate
+     * @param studentName 考生姓名
+     * @param scanUserId  采集员ID
+     * @param sortBy      排序字段
+     * @param pageable    分页参数
+     */
     @RequestMapping(value = "listByQuestion", method = RequestMethod.GET)
     @RequestMapping(value = "listByQuestion", method = RequestMethod.GET)
-    public PageableDTO listByQuerion(@RequestParam Long workId,
-                                     @RequestParam(required = false) String areaCode,
-                                     @RequestParam Subject subject,
-                                     @RequestParam(required = false) String startNumber,
-                                     @RequestParam(required = false) String endNumber,
-                                     @RequestParam(required = false) Boolean isManual,
-                                     @RequestParam(required = false) Boolean missing,
-                                     @RequestParam(required = false) Boolean isRelate,
-                                     @RequestParam(required = false) String studentName,
-                                     @RequestParam(required = false) String sortBy,
-                                     Pageable pageable) {
+    public PageableDTO listByQuestion(@RequestParam Long workId,
+                                      @RequestParam(required = false) String areaCode,
+                                      @RequestParam Subject subject,
+                                      @RequestParam(required = false) String startNumber,
+                                      @RequestParam(required = false) String endNumber,
+                                      @RequestParam(required = false) Boolean isManual,
+                                      @RequestParam(required = false) Boolean missing,
+                                      @RequestParam(required = false) Boolean isRelate,
+                                      @RequestParam(required = false) String studentName,
+                                      @RequestParam(required = false) Long scanUserId,
+                                      @RequestParam(required = false) Boolean isMark,
+                                      @RequestParam(required = false) String sortBy,
+                                      Pageable pageable) {
         Sort sort = null;
         Sort sort = null;
         if (Objects.equals("1", sortBy)) {
         if (Objects.equals("1", sortBy)) {
             sort = new Sort(Sort.Direction.DESC, "uploadedOn");
             sort = new Sort(Sort.Direction.DESC, "uploadedOn");
@@ -164,7 +183,10 @@ public class PaperApi {
         Specification<Paper> specification = (root, query, builder) -> {
         Specification<Paper> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.equal(root.get("workId"), workId));
             predicates.add(builder.equal(root.get("workId"), workId));
-            if (areaCode != null && areaCode != "") {
+            if (scanUserId != null) {
+                predicates.add(builder.equal(root.get("scanUserId"), scanUserId));
+            }
+            if (areaCode != null && !"".equals(areaCode)) {
                 predicates.add(builder.equal(root.get("areaCode"), areaCode));
                 predicates.add(builder.equal(root.get("areaCode"), areaCode));
             }
             }
             if (subject != null) {
             if (subject != null) {
@@ -186,8 +208,11 @@ public class PaperApi {
             if (isRelate != null) {
             if (isRelate != null) {
                 predicates.add(builder.equal(root.get("isRelate"), isRelate));
                 predicates.add(builder.equal(root.get("isRelate"), isRelate));
             }
             }
+            if (isMark != null) {
+                predicates.add(builder.equal(root.get("isMark"), isMark));
+            }
             //考生姓名
             //考生姓名
-            if (studentName != null && studentName != "") {
+            if (studentName != null && !"".equals(studentName)) {
                 predicates.add(builder.equal(root.get("studentName"), studentName));
                 predicates.add(builder.equal(root.get("studentName"), studentName));
             }
             }
             predicates.add(builder.equal(root.get("test"), 0));
             predicates.add(builder.equal(root.get("test"), 0));
@@ -226,7 +251,7 @@ public class PaperApi {
         List<MarkerGroupLeader> markerGroupLeaders = markerGroupLeaderService.listByWorkIdAndSubjectAndStageAndMarkLeaderId(markSubject.getWorkId(), markSubject, markerId);
         List<MarkerGroupLeader> markerGroupLeaders = markerGroupLeaderService.listByWorkIdAndSubjectAndStageAndMarkLeaderId(markSubject.getWorkId(), markSubject, markerId);
         List<Long> paperIds = null;
         List<Long> paperIds = null;
         if (!CollectionUtils.isEmpty(markerGroupLeaders)) {
         if (!CollectionUtils.isEmpty(markerGroupLeaders)) {
-            List<Long> markers = markerGroupLeaders.stream().map(m -> m.getMarkerId()).distinct().collect(Collectors.toList());
+            List<Long> markers = markerGroupLeaders.stream().map(MarkerGroupLeader::getMarkerId).distinct().collect(Collectors.toList());
             paperIds = markerGroupLeaderService.listPaperIdsByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage(), markers);
             paperIds = markerGroupLeaderService.listPaperIdsByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage(), markers);
         }
         }
 
 
@@ -457,19 +482,19 @@ public class PaperApi {
         markTaskRepo.findByPaperIdAndStage(paperId, stage).forEach(o -> {
         markTaskRepo.findByPaperIdAndStage(paperId, stage).forEach(o -> {
             markTaskDTOs.add(markTaskAssembler.toDTO(o));
             markTaskDTOs.add(markTaskAssembler.toDTO(o));
         });
         });
-        Collections.sort(markTaskDTOs, Comparator.comparing(MarkTaskDTO::getMarker));
+        markTaskDTOs.sort(Comparator.comparing(MarkTaskDTO::getMarker));
         return markTaskDTOs;
         return markTaskDTOs;
     }
     }
 
 
     /**
     /**
      * 考生成绩查询
      * 考生成绩查询
      *
      *
-     * @param workId
-     * @param questionId
-     * @param subject
-     * @param number
-     * @param studentName
-     * @return
+     * @param workId      工作ID
+     * @param questionId  考区ID
+     * @param subject     科目
+     * @param type        类型
+     * @param number      号码
+     * @param studentName 学生姓名
      */
      */
     @RequestMapping(value = "/studentScore", method = RequestMethod.GET)
     @RequestMapping(value = "/studentScore", method = RequestMethod.GET)
     public List<Map> markTasks(@RequestParam Long workId,
     public List<Map> markTasks(@RequestParam Long workId,
@@ -507,7 +532,7 @@ public class PaperApi {
             if (!StringUtils.isEmpty(studentName)) {
             if (!StringUtils.isEmpty(studentName)) {
                 predicates.add(builder.equal(root.get("studentName"), studentName));
                 predicates.add(builder.equal(root.get("studentName"), studentName));
             }
             }
-            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            return builder.and(predicates.toArray(new Predicate[0]));
         };
         };
 
 
         List<Paper> papers = paperRepo.findAll(specification);
         List<Paper> papers = paperRepo.findAll(specification);
@@ -515,17 +540,35 @@ public class PaperApi {
         Map<String, List<Paper>> groupPaper = papers.stream().collect(Collectors.groupingBy(p -> p.getExamNumber() + ":" + p.getStudentName()));
         Map<String, List<Paper>> groupPaper = papers.stream().collect(Collectors.groupingBy(p -> p.getExamNumber() + ":" + p.getStudentName()));
         List<Map> mapList = new ArrayList<>();
         List<Map> mapList = new ArrayList<>();
         for (Map.Entry<String, List<Paper>> entry : groupPaper.entrySet()) {
         for (Map.Entry<String, List<Paper>> entry : groupPaper.entrySet()) {
-            Map map = new HashMap();
+            JSONObject object = new JSONObject();
             String key = entry.getKey();
             String key = entry.getKey();
+            object.put("examNumber", key.split(":")[0]);
+            object.put("name", key.split(":")[1]);
+
             List<Paper> paperList = entry.getValue();
             List<Paper> paperList = entry.getValue();
-            map.put("examNumber", key.split(":")[0]);
-            map.put("name", key.split(":")[1]);
             double sumScore = paperList.stream().filter(m -> Objects.nonNull(m.getScore())).mapToDouble(Paper::getScore).sum();
             double sumScore = paperList.stream().filter(m -> Objects.nonNull(m.getScore())).mapToDouble(Paper::getScore).sum();
-            map.put("sumScore", Optional.ofNullable(sumScore).orElse(0D).intValue());
-            List<PaperDTO> paperDTOs = new ArrayList<>();
-            paperList.forEach(p -> paperDTOs.add(paperAssembler.toDTO(p)));
-            map.put("scores", paperDTOs);
-            mapList.add(map);
+            object.put("sumScore", Optional.of(sumScore).orElse(0D).intValue());
+            List<JSONObject> paperDTOs = new ArrayList<>();
+            for (Paper paper : paperList) {
+                PaperDTO paperDTO = paperAssembler.toDTO(paper);
+                JSONObject subObject = new JSONObject();
+                subObject.put("secretNumber", paperDTO.getSecretNumber());
+                subObject.put("level", paperDTO.getLevel());
+                subObject.put("score", paperDTO.getScore());
+                subObject.put("imgSrc", paperDTO.getImgSrc());
+                subObject.put("thumbSrc", paperDTO.getImgSrc());
+                subObject.put("sheetSrc", paperDTO.getSheetSrc());
+                // 分档明细
+                List<MarkTask> taskLevels = markTaskRepo.findByPaperIdAndStageNative(paper.getId(), MarkStage.LEVEL);
+                subObject.put("taskLevels", taskLevels.isEmpty() ? null : taskLevels);
+                // 打分明细
+                List<MarkTask> taskScores = markTaskRepo.findByPaperIdAndStageNative(paper.getId(), MarkStage.SCORE);
+                subObject.put("taskScores", taskScores.isEmpty() ? null : taskScores);
+                paperDTOs.add(subObject);
+            }
+            object.put("papers", paperDTOs);
+            mapList.add(object);
+
         }
         }
         return mapList;
         return mapList;
     }
     }
@@ -675,10 +718,10 @@ public class PaperApi {
 
 
     /**
     /**
      * 根据试卷密号查询试卷
      * 根据试卷密号查询试卷
-     * @param workId
-     * @param subject
-     * @param secretNumber
-     * @return
+     *
+     * @param workId       工作ID
+     * @param subject      科目
+     * @param secretNumber 试卷密号
      */
      */
     @RequestMapping(value = "/get_by_secret_number", method = RequestMethod.GET)
     @RequestMapping(value = "/get_by_secret_number", method = RequestMethod.GET)
     public List<Paper> getBySecretNumber(@RequestParam Long workId,
     public List<Paper> getBySecretNumber(@RequestParam Long workId,
@@ -686,4 +729,29 @@ public class PaperApi {
                                          @RequestParam String secretNumber) {
                                          @RequestParam String secretNumber) {
         return paperRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber, TrialEnum.DEFAULT.getId());
         return paperRepo.findByWorkIdAndSubjectAndSecretNumberAndTest(workId, subject, secretNumber, TrialEnum.DEFAULT.getId());
     }
     }
+
+    /**
+     * 试卷管理-标记试卷
+     *
+     * @param paperId 试卷ID
+     * @param isMark  标记状态
+     */
+    @RequestMapping(value = "/mark_paper", method = RequestMethod.POST)
+    public Object markPaper(@RequestParam Long paperId, @RequestParam boolean isMark) {
+        paperRepo.updatePaperMarkById(paperId, isMark);
+        return true;
+    }
+
+    /**
+     * 根据工作、科目、考号查询原卷
+     *
+     * @param workId     工作id
+     * @param subject    科目
+     * @param examNumber 考号
+     */
+    @RequestMapping(value = "{workId}/{subject}/{examNumber}", method = RequestMethod.GET)
+    public PaperDTO get(@PathVariable Long workId, @PathVariable Subject subject, @PathVariable String examNumber) {
+        Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumber(workId, subject, examNumber);
+        return paperAssembler.toDTO(paper);
+    }
 }
 }

+ 75 - 70
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -9,11 +9,7 @@ import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 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.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.repository.*;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
-import cn.com.qmth.stmms.ms.marking.api.MakrerApi;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
-import com.sun.glass.ui.Window;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
@@ -53,33 +49,29 @@ public class PaperAssembler {
     private MarkLogRepo markLogRepo;
     private MarkLogRepo markLogRepo;
 
 
     public PaperDTO toDTO(Paper paper) {
     public PaperDTO toDTO(Paper paper) {
-        String imgSrc = null;
-        String thumbSrc = null;
-        String fileName = paper.getExamNumber();
-        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
-        //0:随机码 1:考号
-        if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
-//            fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
-            fileName = MD5Util.getImageRuleMd5(paper.getWorkId(),paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
-        }
-        if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
-            imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
-            thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
-            /*if(paper.isManual()) {
-                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
-            }*/
-        } else {
-            imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            /*if(paper.isManual()) {
-                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-                thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            }*/
-        }
-        //查询阶段
-        MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
-        PaperDTO paperDTO = null;
         if (paper != null) {
         if (paper != null) {
+            String imgSrc = null;
+            String thumbSrc = null;
+            String sheetSrc = null;
+            String fileName = paper.getExamNumber();
+            Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+            //0:随机码 1:考号
+            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+                fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+            }
+            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+                imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
+                thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
+                sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+            } else {
+                imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            }
+            //查询阶段
+            MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
+            PaperDTO paperDTO = null;
+
             paperDTO = new PaperDTO();
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setId(paper.getId());
             paperDTO.setPaperId(paper.getId());
             paperDTO.setPaperId(paper.getId());
@@ -88,7 +80,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
             paperDTO.setSample(paper.isSample());
@@ -97,10 +89,12 @@ public class PaperAssembler {
             paperDTO.setMarkedLogic(paper.isMarkedLogic());
             paperDTO.setMarkedLogic(paper.isMarkedLogic());
             paperDTO.setRedoLevel(paper.getRedoLevel());
             paperDTO.setRedoLevel(paper.getRedoLevel());
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
+            paperDTO.setSecretNumber(paper.getSecretNumber());
 //            String imgSrc = systemConfig.getImageUrl(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());
 //            String thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setThumbSrc(thumbSrc);
             paperDTO.setThumbSrc(thumbSrc);
+            paperDTO.setSheetSrc(sheetSrc);
             paperDTO.setAreaCode(paper.getAreaCode());
             paperDTO.setAreaCode(paper.getAreaCode());
             paperDTO.setMissing(paper.getIsMissing());
             paperDTO.setMissing(paper.getIsMissing());
             if (paper.getInspectScore() != null) {
             if (paper.getInspectScore() != null) {
@@ -115,17 +109,18 @@ public class PaperAssembler {
             paperDTO.setShift(paper.isShift());
             paperDTO.setShift(paper.isShift());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setOneClick(paper.isOneClick());
             paperDTO.setOneClick(paper.isOneClick());
-            paperDTO.setIsRejectedByLeader(paper.isRejectedByLeader() == null ? false : paper.isRejectedByLeader());
+            paperDTO.setIsRejectedByLeader(paper.isRejectedByLeader() != null && paper.isRejectedByLeader());
+            paperDTO.setScanUserId(paper.getScanUserId());
             //打回总次数
             //打回总次数
             int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), MarkLogOperType.CALLBACK_LEVEl.getId());
             int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), MarkLogOperType.CALLBACK_LEVEl.getId());
             paperDTO.setRejectedCount(rejectedCount);
             paperDTO.setRejectedCount(rejectedCount);
             //计算levelValue和(试评阶段不用)
             //计算levelValue和(试评阶段不用)
-            if(markSubject.getTest() == 0 && Objects.nonNull(paper.getLevel())) {
-                if(paper.isSample()){
+            if (markSubject.getTest() == 0 && Objects.nonNull(paper.getLevel())) {
+                if (paper.isSample()) {
                     paperDTO.setSortSum(0);
                     paperDTO.setSortSum(0);
                 } else {
                 } else {
                     List<Level> levels = levelRepo.findByWorkId(paper.getWorkId());
                     List<Level> levels = levelRepo.findByWorkId(paper.getWorkId());
-                    if (!levels.isEmpty() && levels.size() > 0) {
+                    if (!levels.isEmpty()) {
                         Map<String, Integer> map = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getWeight));
                         Map<String, Integer> map = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getWeight));
                         List<MarkTask> markTaskList = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
                         List<MarkTask> markTaskList = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
                         int sum = markTaskList.stream().mapToInt(m -> map.get(m.getResult()) == null ? 0 : map.get(m.getResult())).sum();
                         int sum = markTaskList.stream().mapToInt(m -> map.get(m.getResult()) == null ? 0 : map.get(m.getResult())).sum();
@@ -133,8 +128,9 @@ public class PaperAssembler {
                     }
                     }
                 }
                 }
             }
             }
+            return paperDTO;
         }
         }
-        return paperDTO;
+        return null;
     }
     }
 
 
     public PaperDTO toDTOForPaperManager(Paper paper, Boolean isManual) {
     public PaperDTO toDTOForPaperManager(Paper paper, Boolean isManual) {
@@ -143,20 +139,20 @@ public class PaperAssembler {
         String fileName = paper.getExamNumber();
         String fileName = paper.getExamNumber();
         Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
         Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
         //0:随机码 1:考号
         //0:随机码 1:考号
-        if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
-            fileName = MD5Util.getImageRuleMd5(paper.getWorkId(),paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+        if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+            fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
         }
         }
         if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
         if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
             thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
             thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
-            if(paper.isManual() && Objects.nonNull(isManual) && isManual) {
+            if (paper.isManual() && Objects.nonNull(isManual) && isManual) {
                 imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
                 imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
                 thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
                 thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
             }
             }
         } else {
         } else {
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
             thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
             thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            if(paper.isManual() && Objects.nonNull(isManual) && isManual) {
+            if (paper.isManual() && Objects.nonNull(isManual) && isManual) {
                 imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
                 imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
                 thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
                 thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
             }
             }
@@ -172,7 +168,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
             paperDTO.setSample(paper.isSample());
@@ -197,38 +193,45 @@ public class PaperAssembler {
             paperDTO.setShift(paper.isShift());
             paperDTO.setShift(paper.isShift());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setStudentName(student.getName());
             paperDTO.setStudentName(student.getName());
+            paperDTO.setMark(paper.isMark());
         }
         }
         return paperDTO;
         return paperDTO;
     }
     }
 
 
     public PaperDTO toDTOForEquipmentMonitor(Paper paper, Boolean isManual) {
     public PaperDTO toDTOForEquipmentMonitor(Paper paper, Boolean isManual) {
-        String imgSrc = null;
-        String thumbSrc = null;
-        String fileName = paper.getExamNumber();
-        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
-        //0:随机码 1:考号
-        if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
-            fileName = MD5Util.getImageRuleMd5(paper.getWorkId(),paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
-        }
-        if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
-            imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
-            thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
-            if(Objects.nonNull(isManual) && isManual) {
-                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
-                thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+        if (paper != null) {
+            String imgSrc = null;
+            String thumbSrc = null;
+            String sheetSrc = null;
+            String fileName = paper.getExamNumber();
+            Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+            //0:随机码 1:考号
+            if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+                fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             }
             }
-        } else {
-            imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-            if(Objects.nonNull(isManual) && isManual) {
-                imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
-                thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+            if (ParamCache.paramMap.get(paper.getWorkId()).getImageEncrypt() == 1) {
+                imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.IMAGE);
+                thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.THUMB);
+                sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+                if (Objects.nonNull(isManual) && isManual) {
+                    imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+                    thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+                    sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().ordinal(), student.getId(), SystemConstant.SHEET);
+                }
+            } else {
+                imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                if (Objects.nonNull(isManual) && isManual) {
+                    imgSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                    thumbSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                    sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), fileName);
+                }
             }
             }
-        }
-        //查询阶段
-        MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
-        PaperDTO paperDTO = null;
-        if (paper != null) {
+            //查询阶段
+            MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject());
+            PaperDTO paperDTO = null;
+
             paperDTO = new PaperDTO();
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
             paperDTO.setId(paper.getId());
             paperDTO.setSubjectName(paper.getSubject().getName());
             paperDTO.setSubjectName(paper.getSubject().getName());
@@ -236,7 +239,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
             paperDTO.setSample(paper.isSample());
@@ -247,6 +250,7 @@ public class PaperAssembler {
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
             paperDTO.setUpdatedOn(paper.getUpdatedOn());
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setImgSrc(imgSrc);
             paperDTO.setThumbSrc(thumbSrc);
             paperDTO.setThumbSrc(thumbSrc);
+            paperDTO.setSheetSrc(sheetSrc);
             paperDTO.setAreaCode(paper.getAreaCode());
             paperDTO.setAreaCode(paper.getAreaCode());
             paperDTO.setMissing(paper.getIsMissing());
             paperDTO.setMissing(paper.getIsMissing());
             if (paper.getInspectScore() != null) {
             if (paper.getInspectScore() != null) {
@@ -261,8 +265,9 @@ public class PaperAssembler {
             paperDTO.setShift(paper.isShift());
             paperDTO.setShift(paper.isShift());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setShiftScore(paper.isShiftScore());
             paperDTO.setStudentName(student.getName());
             paperDTO.setStudentName(student.getName());
+            return paperDTO;
         }
         }
-        return paperDTO;
+        return null;
     }
     }
 
 
     public PaperDTO toDTOForSheet(Paper paper) {
     public PaperDTO toDTOForSheet(Paper paper) {
@@ -272,7 +277,7 @@ public class PaperAssembler {
         String fileName = paper.getExamNumber();
         String fileName = paper.getExamNumber();
         Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
         Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
         //0:随机码 1:考号
         //0:随机码 1:考号
-        if(ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1){
+        if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
 //            fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
 //            fileName = DigestUtils.md5Hex(paper.getSubject().name() + fileName);
             fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
         }
         }
@@ -295,7 +300,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
+            paperDTO.setScore(Objects.isNull(paper.getScore()) ? null : paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
             paperDTO.setSample(paper.isSample());

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

@@ -54,6 +54,9 @@ public class PaperDTO implements Serializable{
     //考生姓名
     //考生姓名
     private String studentName;
     private String studentName;
     private boolean isOneClick;
     private boolean isOneClick;
+    private boolean isMark;
+    private String secretNumber;
+    private Long scanUserId;
     private List<MarkTaskDTO> markResults = new ArrayList<>();
     private List<MarkTaskDTO> markResults = new ArrayList<>();
 
 
     public int getPaperTest() {
     public int getPaperTest() {
@@ -339,4 +342,28 @@ public class PaperDTO implements Serializable{
     public void setOneClick(boolean oneClick) {
     public void setOneClick(boolean oneClick) {
         isOneClick = oneClick;
         isOneClick = oneClick;
     }
     }
+
+    public boolean isMark() {
+        return isMark;
+    }
+
+    public void setMark(boolean mark) {
+        isMark = mark;
+    }
+
+    public String getSecretNumber() {
+        return secretNumber;
+    }
+
+    public void setSecretNumber(String secretNumber) {
+        this.secretNumber = secretNumber;
+    }
+
+    public Long getScanUserId() {
+        return scanUserId;
+    }
+
+    public void setScanUserId(Long scanUserId) {
+        this.scanUserId = scanUserId;
+    }
 }
 }

+ 311 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/CheckDataService.java

@@ -0,0 +1,311 @@
+package cn.com.qmth.stmms.ms.marking.service;
+
+import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.core.domain.CheckData;
+import cn.com.qmth.stmms.ms.core.domain.Level;
+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.CheckDataStatusEnum;
+import cn.com.qmth.stmms.ms.core.domain.enums.CheckItemEnum;
+import cn.com.qmth.stmms.ms.core.repository.CheckDataRepo;
+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.PaperRepo;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Service
+public class CheckDataService {
+
+    private static final String SEPARATE = "#";
+
+    @Resource
+    SystemConfig systemConfig;
+
+    @Resource
+    CheckDataRepo checkDataRepo;
+
+    @Resource
+    MarkSubjectRepo markSubjectRepo;
+
+    @Resource
+    PaperRepo paperRepo;
+
+    @Resource
+    LevelRepo levelRepo;
+
+    /**
+     * 异步任务做检查
+     *
+     * @param checkData 任务对象
+     */
+    @Async
+    public void syncCheckData(CheckData checkData) {
+        // 执行中
+        checkData.setStatus(CheckDataStatusEnum.RUNNING);
+        checkDataRepo.saveAndFlush(checkData);
+
+        int errorCount = 0;
+        List<JSONObject> list = null;
+        try {
+            Long workId = checkData.getWorkId();
+            if (CheckItemEnum.PAPER_SIZE.equals(checkData.getCheckItem())) {
+                errorCount = checkPaperSize(workId);
+            } else if (CheckItemEnum.ALL_SCORE.equals(checkData.getCheckItem())) {
+                errorCount = checkAllScore(workId);
+            } else if (CheckItemEnum.LEVEL_SCORE_MATCH.equals(checkData.getCheckItem())) {
+                list = checkLevelScoreMatch(workId);
+            } else if (CheckItemEnum.LEVEL_DIFF.equals(checkData.getCheckItem())) {
+                list = checkLevelDiff(workId, checkData.getParamValue());
+            } else if (CheckItemEnum.SCORE_DIFF.equals(checkData.getCheckItem())) {
+                list = checkScoreDiff(workId, checkData.getParamValue());
+            } else {
+                throw new Exception("没有此类型任务");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            checkData.setStatus(CheckDataStatusEnum.FINISH);
+            checkData.setResult(errorCount == 0);
+            checkData.setErrorCount(errorCount);
+            if (list != null && list.size() > 0) {
+                checkData.setContent(JSONObject.toJSONString(list));
+            }
+            checkData.setEndTime(new Date());
+            checkDataRepo.saveAndFlush(checkData);
+        }
+    }
+
+    /**
+     * 检查图片大小0KB
+     *
+     * @param workId 工作ID
+     */
+    private int checkPaperSize(Long workId) {
+        int count = 0;
+        // image
+        File imageDir = new File(systemConfig.getImageDir() + File.separator + workId);
+        count = getZeroCount(count, imageDir);
+
+        // thumb
+        File thumbDir = new File(systemConfig.getThumbDir() + File.separator + workId);
+        count = getZeroCount(count, thumbDir);
+
+        // sheet
+        File sheetDir = new File(systemConfig.getSheetDir() + File.separator + workId);
+        count = getZeroCount(count, sheetDir);
+        return count;
+    }
+
+    private int getZeroCount(int count, File fileDir) {
+        List<File> files = getAllFile(fileDir);
+        if (files != null && files.size() > 0) {
+            int zeroCount = Math.toIntExact(files.stream().filter(m -> m.length() == 0).count());
+            count = count + zeroCount;
+        }
+        return count;
+    }
+
+    /**
+     * 校验每张试卷都有分数
+     *
+     * @param workId 工作ID
+     */
+    private int checkAllScore(Long workId) {
+        List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
+        if (paperList != null && paperList.size() > 0) {
+            return Math.toIntExact(paperList.stream().filter(m -> m.getScore() == null).count());
+        }
+        return 0;
+    }
+
+    /**
+     * 每张试卷分数都在其所属档位分数区间内
+     *
+     * @param workId 工作ID
+     */
+    private List<JSONObject> checkLevelScoreMatch(Long workId) {
+        List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
+        List<JSONObject> list = new ArrayList<>();
+        if (paperList != null && paperList.size() > 0) {
+            // 有未打分的,算未匹配
+            List<Paper> papers = paperList.stream().filter(m -> m.getScore() == null).collect(Collectors.toList());
+            if (papers.size() > 0) {
+                list = papers.stream().map(p -> {
+                    JSONObject object = new JSONObject();
+                    object.put("examNumber", p.getExamNumber());
+                    object.put("studentName", p.getStudentName());
+                    return object;
+                }).collect(Collectors.toList());
+            } else {
+                //分档、打分完成后,做匹配校验
+                List<Level> levels = levelRepo.findByWorkId(workId);
+                Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
+
+                list = paperList.stream().filter(p -> {
+                    // 未分档的,不参与统计
+                    if (p.getLevel() == null) {
+                        return false;
+                    }
+                    Level level = levelMap.get(p.getLevel());
+                    // 正常范围,是左开右闭
+                    return p.getScore().intValue() <= level.getMinScore() || p.getScore().intValue() >= level.getMaxScore();
+                }).map(p -> {
+                    JSONObject object = new JSONObject();
+                    object.put("examNumber", p.getExamNumber());
+                    object.put("studentName", p.getStudentName());
+                    return object;
+                }).collect(Collectors.toList());
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 同一考生各科目档位差
+     *
+     * @param workId     工作ID
+     * @param paramValue 变量参数值
+     */
+    private List<JSONObject> checkLevelDiff(Long workId, int paramValue) {
+        List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
+
+        List<Level> levels = levelRepo.findByWorkId(workId);
+        Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
+
+        List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
+        Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
+        List<JSONObject> list = new ArrayList<>();
+        for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
+            String key = entry.getKey();
+            List<Paper> papers = entry.getValue();
+            // 只考部分科目,校验不通过
+            if (papers.size() != markSubjects.size()) {
+                list.add(assembleErrorData(key, "只考" + papers.size() + "科"));
+            } else {
+                long noLevel = papers.stream().filter(m -> m.getLevel() == null).count();
+                if (noLevel > 0) {
+                    list.add(assembleErrorData(key, "有" + noLevel + "科未分档"));
+                } else {
+                    List<Integer> integers = papers.stream().map(m -> levelMap.get(m.getLevel()).getLevelValue()).collect(Collectors.toList());
+                    // true为校验通过,false为不通过
+                    boolean checkFlag = calcDiff(integers, paramValue);
+                    if (!checkFlag) {
+                        list.add(assembleErrorData(key, "最大差值大于" + paramValue));
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 同一考生各科目成绩差
+     *
+     * @param workId     工作ID
+     * @param paramValue 变量参数值
+     */
+    private List<JSONObject> checkScoreDiff(Long workId, int paramValue) {
+        List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
+        List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
+        Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
+        List<JSONObject> list = new ArrayList<>();
+        for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
+            String key = entry.getKey();
+            List<Paper> papers = entry.getValue();
+            // 只考部分科目,校验不通过
+            if (papers.size() != markSubjects.size()) {
+                list.add(assembleErrorData(key, "只考" + papers.size() + "科"));
+            } else {
+                long noScore = papers.stream().filter(m -> m.getLevel() != null && m.getScore() == null).count();
+                if (noScore > 0) {
+                    list.add(assembleErrorData(key, "有" + noScore + "科已分档未打分"));
+                } else {
+                    List<Integer> integers = papers.stream().map(m -> m.getScore().intValue()).collect(Collectors.toList());
+                    // true为校验通过,false为不通过
+                    boolean checkFlag = calcDiff(integers, paramValue);
+                    if (!checkFlag) {
+                        list.add(assembleErrorData(key, "最大差值大于" + paramValue));
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 计算差值
+     *
+     * @param integers   值集合
+     * @param paramValue 变量
+     * @return true为通过,false为不通过
+     */
+    private boolean calcDiff(List<Integer> integers, int paramValue) {
+        List<Integer> diffList = new ArrayList<>();
+        for (int i = 0; i < integers.size(); i++) {
+            for (int j = i; j < integers.size(); j++) {
+                if (i != j) {
+                    int diffValue = Math.abs(integers.get(i) - integers.get(j));
+                    diffList.add(diffValue);
+                }
+            }
+        }
+        // A和C,差值为2,若paramValue=2,不通过,返回false,paramValue = 1,通过,返回true
+        int maxDiff = diffList.stream().max(Comparator.comparing(i -> i)).get();
+        return maxDiff < paramValue;
+    }
+
+    /**
+     * 组装错误信息
+     *
+     * @param key          分组key(准考证号#考生姓名)
+     * @param errorMessage 错误信息
+     */
+    private JSONObject assembleErrorData(String key, String errorMessage) {
+        JSONObject object = new JSONObject();
+        String[] strings = key.split(SEPARATE);
+        object.put("examNumber", strings[0]);
+        object.put("studentName", strings[1]);
+        object.put("errorMessage", errorMessage);
+        return object;
+    }
+
+    /**
+     * 获取指定文件夹下所有文件,不含文件夹
+     *
+     * @param dirFile 文件夹
+     */
+    public static List<File> getAllFile(File dirFile) {
+        // 如果文件夹不存在或着不是文件夹,则返回 null
+        if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile())
+            return null;
+
+        File[] childrenFiles = dirFile.listFiles();
+        if (Objects.isNull(childrenFiles) || childrenFiles.length == 0)
+            return null;
+
+        List<File> files = new ArrayList<>();
+        for (File childFile : childrenFiles) {
+
+            // 如果时文件,直接添加到结果集合
+            if (childFile.isFile()) {
+                files.add(childFile);
+            } else {
+                // 如果是文件夹,则将其内部文件添加进结果集合
+                List<File> cFiles = getAllFile(childFile);
+                if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
+                    continue;
+                }
+                files.addAll(cFiles);
+            }
+        }
+        return files;
+    }
+}

+ 87 - 41
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java

@@ -1,5 +1,13 @@
 package cn.com.qmth.stmms.ms.marking.service;
 package cn.com.qmth.stmms.ms.marking.service;
 
 
+import cn.com.qmth.stmms.ms.core.domain.Level;
+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.repository.LevelRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
 import java.util.Comparator;
 import java.util.Comparator;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -8,15 +16,6 @@ import java.util.stream.Collectors;
 import java.util.stream.DoubleStream;
 import java.util.stream.DoubleStream;
 import java.util.stream.Stream;
 import java.util.stream.Stream;
 
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.stmms.ms.core.domain.Level;
-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.repository.LevelRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
-
 /**
 /**
  * 定档
  * 定档
  * Created by zhengmin on 2016/9/22.
  * Created by zhengmin on 2016/9/22.
@@ -24,7 +23,7 @@ import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 @Service
 @Service
 public class DetermineLevelService {
 public class DetermineLevelService {
 
 
-    public enum DeterType{
+    public enum DeterType {
         /**
         /**
          * 多数
          * 多数
          */
          */
@@ -40,56 +39,103 @@ public class DetermineLevelService {
     @Autowired
     @Autowired
     private MarkUserRepo markUserRepo;
     private MarkUserRepo markUserRepo;
 
 
-    public DeterResult determine(boolean majority,MarkTask...tasks){
-    	if(majority){
-    		//如果相同的数量大于半数,直接定档
-    		Stream<MarkTask> taskStream = Stream.of(tasks);
-    		Optional<Map.Entry<String,Long>> optional = taskStream
-    				.collect(Collectors.groupingBy(i -> i.getResult().toString(), Collectors.counting()))
-    				.entrySet()
-    				.stream()
-    				.max(Comparator.comparing(Map.Entry::getValue));
-    		if(optional.isPresent()){
-    			Map.Entry<String,Long> entry = optional.get();
-    			if(entry.getValue() > tasks.length/2){
-    				return new DeterResult(entry.getKey(),DeterType.MAJORITY);
-    			}
-    		}
-    	}
+    /**
+     * 计算定档值(规则:1.不是过半定档,取权重,2.是过半定档,没有取优,取过半定档,3.是过半定档,是取优,取过半定档和权重最优值)
+     *
+     * @param majority 是否过半定档
+     * @param taskBest 是否取优
+     * @param tasks    任务集合
+     */
+    public DeterResult determine(boolean majority, boolean taskBest, List<Level> levels, MarkTask... tasks) {
+        DeterResult majorityResult = null;
+        DeterResult weightResult = null;
+        if (majority) {
+            majorityResult = calcMajority(tasks);
+        }
+        weightResult = calcWeight(tasks);
+
+        if (majorityResult != null) {
+            if (taskBest) {
+                Map<String, Integer> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getLevelValue));
+                // 取优
+                int majorityLevelValue = levelMap.get(majorityResult.getResult());
+                int weightLevelValue = levelMap.get(weightResult.getResult());
+                // 值越小,档位越大
+                if (majorityLevelValue > weightLevelValue) {
+                    return weightResult;
+                } else {
+                    return majorityResult;
+                }
+            } else {
+                return majorityResult;
+            }
+        } else {
+            return weightResult;
+        }
+    }
+
+    /**
+     * 计算权重值
+     *
+     * @param tasks 任务集合
+     */
+    private DeterResult calcWeight(MarkTask[] tasks) {
         //通过权重计算,平均值四舍五入
         //通过权重计算,平均值四舍五入
         double[] values = new double[tasks.length];
         double[] values = new double[tasks.length];
         double[] weights = new double[tasks.length];
         double[] weights = new double[tasks.length];
         Long workId = null;
         Long workId = null;
         for (int i = 0; i < tasks.length; i++) {
         for (int i = 0; i < tasks.length; i++) {
             workId = tasks[i].getWorkId();
             workId = tasks[i].getWorkId();
-            Level level = levelRepo.findByWorkIdAndCode(workId,String.valueOf(tasks[i].getResult()));
-            if(level == null){
+            Level level = levelRepo.findByWorkIdAndCode(workId, String.valueOf(tasks[i].getResult()));
+            if (level == null) {
                 throw new RuntimeException("无此档位");
                 throw new RuntimeException("无此档位");
             }
             }
             MarkUser marker = markUserRepo.findOne(tasks[i].getMarkerId());
             MarkUser marker = markUserRepo.findOne(tasks[i].getMarkerId());
             double markerWeight = marker.getWeight();
             double markerWeight = marker.getWeight();
-            values[i] = level.getWeight()*markerWeight;
+            values[i] = level.getWeight() * markerWeight;
             weights[i] = markerWeight;
             weights[i] = markerWeight;
         }
         }
-        int avg = (int)Math.round(DoubleStream.of(values).sum()/DoubleStream.of(weights).sum());
+        int avg = (int) Math.round(DoubleStream.of(values).sum() / DoubleStream.of(weights).sum());
         List<Level> levels = levelRepo.findByWorkId(workId);
         List<Level> levels = levelRepo.findByWorkId(workId);
         Optional<Level> levelOptional = levels.stream().filter(o -> o.getMaxScore() >= avg && o.getMinScore() <= avg).findFirst();
         Optional<Level> levelOptional = levels.stream().filter(o -> o.getMaxScore() >= avg && o.getMinScore() <= avg).findFirst();
         Level level = levelOptional.orElse(null);
         Level level = levelOptional.orElse(null);
-        if(level == null){
-        	levels = levels.stream().sorted(Comparator.comparing(Level::getMaxScore).reversed()).collect(Collectors.toList());
-        	if(avg>levels.get(0).getMaxScore()){
-        		level = levels.get(0);
-        	}
-        	levels = levels.stream().sorted(Comparator.comparing(Level::getMinScore)).collect(Collectors.toList());
-        	if(avg<levels.get(0).getMinScore()){
-        		level = levels.get(0);
-        	}
+        if (level == null) {
+            levels = levels.stream().sorted(Comparator.comparing(Level::getMaxScore).reversed()).collect(Collectors.toList());
+            if (avg > levels.get(0).getMaxScore()) {
+                level = levels.get(0);
+            }
+            levels = levels.stream().sorted(Comparator.comparing(Level::getMinScore)).collect(Collectors.toList());
+            if (avg < levels.get(0).getMinScore()) {
+                level = levels.get(0);
+            }
+        }
+        return new DeterResult(level.getCode(), DeterType.WEIGHT);
+    }
+
+    /**
+     * 计算过半定档值
+     *
+     * @param tasks 任务集合
+     */
+    private DeterResult calcMajority(MarkTask[] tasks) {
+        //如果相同的数量大于半数,直接定档
+        Stream<MarkTask> taskStream = Stream.of(tasks);
+        Optional<Map.Entry<String, Long>> optional = taskStream
+                .collect(Collectors.groupingBy(MarkTask::getResult, Collectors.counting()))
+                .entrySet()
+                .stream()
+                .max(Comparator.comparing(Map.Entry::getValue));
+        if (optional.isPresent()) {
+            Map.Entry<String, Long> entry = optional.get();
+            if (entry.getValue() > tasks.length / 2) {
+                return new DeterResult(entry.getKey(), DeterType.MAJORITY);
+            }
         }
         }
-        return new DeterResult(level.getCode(),DeterType.WEIGHT);
+        return null;
     }
     }
 }
 }
 
 
-class DeterResult{
+class DeterResult {
     private String result;
     private String result;
     private DetermineLevelService.DeterType deterType;
     private DetermineLevelService.DeterType deterType;
 
 

+ 11 - 8
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -122,14 +122,16 @@ public class MarkingService {
         markTaskRepo.save(markTask);
         markTaskRepo.save(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();
         long leftCount = markTasks.stream().filter(i -> i.getResult() == null).count();
         if (leftCount == 0) {
         if (leftCount == 0) {
             MarkTask[] sources = new MarkTask[markTasks.size()];
             MarkTask[] sources = new MarkTask[markTasks.size()];
             //定档
             //定档
+            // 是否过半定档(1:是)
             Integer majority = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getMajority()).orElse(1);
             Integer majority = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getMajority()).orElse(1);
-            DeterResult determine = determineLevelService.determine(majority.intValue() == 1 ? true : false, markTasks.toArray(sources));
+            // 是否取优(过半定档和权重,取最优值)
+            Integer takeBest = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getTakeBest()).orElse(1);
+            DeterResult determine = determineLevelService.determine(majority == 1, takeBest == 1, levels, markTasks.toArray(sources));
             if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult())) {
             if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult())) {
                 markTask.setDateMineResult(determine.getResult());
                 markTask.setDateMineResult(determine.getResult());
             }
             }
@@ -142,7 +144,7 @@ public class MarkingService {
             } else {
             } else {
                 int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
                 int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
                 Integer deviation = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getDeviation()).orElse(3);
                 Integer deviation = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getDeviation()).orElse(3);
-                boolean result = ArbitrationService.arbitrate(deviation.intValue(), values);
+                boolean result = ArbitrationService.arbitrate(deviation, values);
                 //2.最大落差超过仲裁档位,则仲裁打回
                 //2.最大落差超过仲裁档位,则仲裁打回
                 if (result) {
                 if (result) {
                     //仲裁
                     //仲裁
@@ -322,7 +324,8 @@ public class MarkingService {
                 //加入手动打回日志
                 //加入手动打回日志
                 String operResult = "-";
                 String operResult = "-";
                 for (String r : range) {
                 for (String r : range) {
-                    if (Objects.equals(String.valueOf(markTask.getMarkerId()), r)) {
+                    // 建议的档位与其中评委所评档位相同时就不打回给此评委
+                    if (Objects.equals(String.valueOf(markTask.getMarkerId()), r) && !redoLevel.equals(markTask.getResult())) {
                         markTask.setRejected(true);
                         markTask.setRejected(true);
                         markTask.setOriginLevel(markTask.getResult());
                         markTask.setOriginLevel(markTask.getResult());
                         markTask.setResult(null);
                         markTask.setResult(null);
@@ -458,7 +461,7 @@ public class MarkingService {
             Integer resultInt = levelMap.get(result);
             Integer resultInt = levelMap.get(result);
             Integer levelInt = levelMap.get(level);
             Integer levelInt = levelMap.get(level);
             if (resultInt != null && levelInt != null) {
             if (resultInt != null && levelInt != null) {
-                return String.valueOf(levelInt.intValue() - resultInt.intValue());
+                return String.valueOf(levelInt - resultInt);
             }
             }
         }
         }
         return null;
         return null;
@@ -467,12 +470,12 @@ public class MarkingService {
     public static Integer calcSortNum(Paper paper, List<MarkTask> markTaskList, List<Level> levels) {
     public static Integer calcSortNum(Paper paper, List<MarkTask> markTaskList, List<Level> levels) {
         //计算levelValue和(试评阶段不用)
         //计算levelValue和(试评阶段不用)
         if (paper.getTest() == 0 && Objects.nonNull(paper.getLevel())) {
         if (paper.getTest() == 0 && Objects.nonNull(paper.getLevel())) {
-            if (!levels.isEmpty() && levels.size() > 0) {
+            if (!levels.isEmpty()) {
                 Map<String, Integer> map = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getWeight));
                 Map<String, Integer> map = levels.stream().collect(Collectors.toMap(Level::getCode, Level::getWeight));
-                int sum = markTaskList.stream().mapToInt(m -> map.get(m.getResult()) == null ? 0 : map.get(m.getResult())).sum();
-                return sum;
+                return markTaskList.stream().mapToInt(m -> map.get(m.getResult()) == null ? 0 : map.get(m.getResult())).sum();
             }
             }
         }
         }
         return 0;
         return 0;
     }
     }
+
 }
 }

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

@@ -16,7 +16,6 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
-import javax.naming.event.ObjectChangeListener;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -195,11 +194,33 @@ public class StageControlService {
                 Long questionId1 = Long.valueOf(questionId.toString());
                 Long questionId1 = Long.valueOf(questionId.toString());
                 papersList = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndIsMissingFalseAndActiveFalseAndTestOrderByQuestionId(workId, questionId1, subject, 0);
                 papersList = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndIsMissingFalseAndActiveFalseAndTestOrderByQuestionId(workId, questionId1, subject, 0);
             }
             }
-            papers = papersList.subList(0, taskCount);
+//            papers = papersList.subList(0, taskCount);
+            papers = randomList(papersList, taskCount);
         }
         }
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, null);
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject, null);
     }
     }
 
 
+    /**
+     * 随机发任务
+     *
+     * @param papers    试卷集合
+     * @param taskCount 任务数量
+     */
+    private List<Paper> randomList(List<Paper> papers, int taskCount) {
+        if (papers.size() <= taskCount) {
+            return papers;
+        } else {
+            List<Paper> list = new ArrayList<>();
+            Random random = new Random();
+            for (int i = 0; i < taskCount; i++) {
+                int intRandom = random.nextInt(papers.size() - 1);
+                list.add(papers.get(intRandom));
+                papers.remove(intRandom);
+            }
+            return list;
+        }
+    }
+
     /**
     /**
      * 进入打分阶段
      * 进入打分阶段
      * 1.检查是否有能够打分的评卷员
      * 1.检查是否有能够打分的评卷员
@@ -368,7 +389,7 @@ public class StageControlService {
         }
         }
 
 
         for (MarkerGroup markerGroup : markerGroups) {
         for (MarkerGroup markerGroup : markerGroups) {
-            if(markerGroup.getMarkers().size() == 0){
+            if (markerGroup.getMarkers().size() == 0) {
                 statusMap.put(markSubject.getId(), false);
                 statusMap.put(markSubject.getId(), false);
                 throw new RuntimeException("分组里没有评卷员");
                 throw new RuntimeException("分组里没有评卷员");
             }
             }
@@ -389,8 +410,8 @@ public class StageControlService {
         }
         }
 
 
         //总的发布任务数
         //总的发布任务数
-        int totalTaskCount = taskList.stream().map(m->{
-            if(Objects.isNull(m.getTaskCount())){
+        int totalTaskCount = taskList.stream().map(m -> {
+            if (Objects.isNull(m.getTaskCount())) {
                 m.setTaskCount(0);
                 m.setTaskCount(0);
             }
             }
             return m;
             return m;
@@ -415,10 +436,10 @@ public class StageControlService {
 //            papers = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, questionId0, subject, sort);
 //            papers = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, questionId0, subject, sort);
             papers = new ArrayList<>();
             papers = new ArrayList<>();
             for (TaskPublishSetting taskPublishSetting : taskList) {
             for (TaskPublishSetting taskPublishSetting : taskList) {
-                if(taskPublishSetting.getTaskCount() == 0){
+                if (taskPublishSetting.getTaskCount() == 0) {
                     continue;
                     continue;
                 }
                 }
-                List<Paper> paperList = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndLevelAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, questionId0, subject, taskPublishSetting.getCode(),  sort);
+                List<Paper> paperList = paperRepo.findByWorkIdAndQuestionIdAndSubjectAndLevelAndIsMissingFalseAndActiveTrueAndScoreBatchNoIsNull(workId, questionId0, subject, taskPublishSetting.getCode(), sort);
                 List<Paper> subPaperList = paperList.subList(0, taskPublishSetting.getTaskCount());
                 List<Paper> subPaperList = paperList.subList(0, taskPublishSetting.getTaskCount());
                 papers.addAll(subPaperList);
                 papers.addAll(subPaperList);
             }
             }
@@ -595,7 +616,7 @@ public class StageControlService {
             else {
             else {
                 List<Object[]> settingList1 = taskPublishSettingRepo.findAllByWorkIdAndSubjectAndPublishCount(markSubject.getWorkId(), markSubject.getSubject().name(), maxCount);
                 List<Object[]> settingList1 = taskPublishSettingRepo.findAllByWorkIdAndSubjectAndPublishCount(markSubject.getWorkId(), markSubject.getSubject().name(), maxCount);
                 List<TaskPublishSetting> taskPublishSettings = new ArrayList<>();
                 List<TaskPublishSetting> taskPublishSettings = new ArrayList<>();
-                settingList1.forEach(m->{
+                settingList1.forEach(m -> {
                     TaskPublishSetting taskPublishSetting = new TaskPublishSetting();
                     TaskPublishSetting taskPublishSetting = new TaskPublishSetting();
                     taskPublishSetting.setWorkId(Long.valueOf(m[0].toString()));
                     taskPublishSetting.setWorkId(Long.valueOf(m[0].toString()));
                     taskPublishSetting.setSubject(String.valueOf(m[1]));
                     taskPublishSetting.setSubject(String.valueOf(m[1]));