Bläddra i källkod

新需求提交

xiaof 5 år sedan
förälder
incheckning
a5ad30754b
29 ändrade filer med 1244 tillägg och 101 borttagningar
  1. 1 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java
  2. 1 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java
  3. 108 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/StudentRelateDTO.java
  4. 15 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java
  5. 51 5
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  6. 35 14
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  7. 27 16
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ChangeLevel.java
  8. 14 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Student.java
  9. 17 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ChangeLevelRepo.java
  10. 0 9
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ChangeStageRepo.java
  11. 8 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkLogRepo.java
  12. 12 12
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  13. 6 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  14. 2 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/StudentRepo.java
  15. 36 0
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java
  16. 198 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ChangeLevelApi.java
  17. 88 33
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  18. 13 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  19. 56 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  20. 74 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  21. 70 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/ChangeLevelAssembler.java
  22. 6 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  23. 32 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/QuestionStatAssembler.java
  24. 188 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/ChangeLevelDTO.java
  25. 20 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/LevleProgressDTO.java
  26. 91 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkQuestionStatDTO.java
  27. 12 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  28. 9 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/QuestionStatDTO.java
  29. 54 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

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

@@ -57,7 +57,7 @@ public class ParamApi {
 
         //有采集数据,不能修改采集参数
         List<Paper> papers = paperRepo.findByWorkId(workId);
-        if (papers == null || papers.isEmpty()) {
+        if (papers != null && !papers.isEmpty()) {
             throw new RuntimeException("该评卷工作已有采集数据,不能修改");
         }
 

+ 1 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java

@@ -70,7 +70,7 @@ public class WorkOverviewAssembler {
                 String[] uploadStatus = student.getUploadStatus().split(",");
                 for (String s : uploadStatus) {
                     if ("1".equals(s.split(":")[1])) {
-                        if(!subjectMap.containsKey(s.split(":")[1])){
+                        if(!subjectMap.containsKey(s.split(":")[0])){
                             break;
                         }
                         long c = subjectMap.get(s.split(":")[0]);

+ 108 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/StudentRelateDTO.java

@@ -0,0 +1,108 @@
+package cn.com.qmth.stmms.ms.admin.dto;
+
+import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelProperty;
+
+import java.io.Serializable;
+
+public class StudentRelateDTO implements Serializable {
+
+    private static final long serialVersionUID = -4556126416794102992L;
+
+    private Long id;
+
+    @ExcelProperty(index = 1, name = "准考证号", type = 2)
+    private String examNumber;
+
+    @ExcelProperty(index = 2, name = "姓名", type = 2)
+    private String name;
+
+    @ExcelProperty(index = 3, name = "关联考号", type = 2)
+    private String relateExamNumber;
+
+    @ExcelProperty(index = 4, name = "考区名称", type = 2)
+    private String areaName;
+
+    @ExcelProperty(index = 5, name = "考区代码", type = 2)
+    private String areaCode;
+
+    @ExcelProperty(index = 6, name = "考场", type = 2)
+    private String examRoom;
+
+    @ExcelProperty(index = 7, name = "生源地", type = 2)
+    private String sourceName;
+
+
+    private Long workId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getSourceName() {
+        return sourceName;
+    }
+
+    public void setSourceName(String sourceName) {
+        this.sourceName = sourceName;
+    }
+
+    public String getRelateExamNumber() {
+        return relateExamNumber;
+    }
+
+    public void setRelateExamNumber(String relateExamNumber) {
+        this.relateExamNumber = relateExamNumber;
+    }
+}

+ 15 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java

@@ -19,7 +19,7 @@ import java.util.List;
 
 //@Api(tags = "学生导入接口controller")
 @RestController
-@RequestMapping("import/students")
+@RequestMapping("api/import/students")
 public class StudentImporter {
 
     @Autowired
@@ -69,4 +69,18 @@ public class StudentImporter {
         studentDTOs.add(dto);
         ExportUtils.exportEXCEL("考生导入模板", StudentDTO.class, studentDTOs, response);
     }
+
+    /**
+     * 导入考生关联信息
+     * @param workId
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping(value = "/relateStudent", method = RequestMethod.POST)
+    public List<ExcelError> batchAll(@RequestParam Long workId,
+                                     @RequestParam MultipartFile file)
+            throws IOException {
+        return dataUploadService.uploadStudentRelate(workId, file.getInputStream());
+    }
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.ms.admin.service;
 
 import cn.com.qmth.stmms.ms.admin.dto.StudentDTO;
+import cn.com.qmth.stmms.ms.admin.dto.StudentRelateDTO;
 import cn.com.qmth.stmms.ms.commons.config.ImageCompressionConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
@@ -11,6 +12,7 @@ import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelError;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelReader;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelReaderHandle;
 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.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.*;
@@ -28,10 +30,7 @@ import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.lang.reflect.Field;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Random;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -470,7 +469,9 @@ public class DataUploadService {
 
         String sheetPath = null;
         String slicePath = null;
-        if (imageConfig.isImageEnc()) {
+        //图片是否加密
+        Integer imageEnc = Optional.ofNullable(ParamCache.paramMap.get(student.getWorkId()).getImageEncrypt()).orElse(0);
+        if (imageEnc == 1) {
             String imageMd5 = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
             sheetPath = systemConfig.getSheetDir() + File.separator + student.getWorkId() + File.separator + subject
                     + File.separator + student.getAreaCode() + File.separator + imageMd5 + ".jpg";
@@ -502,6 +503,51 @@ public class DataUploadService {
         return paper;
     }
 
+    @Transactional
+    public List<ExcelError> uploadStudentRelate(Long workId, InputStream inputStream) {
+        ExcelReader excelReader = new ExcelReader(StudentRelateDTO.class);
+        List<ExcelError> excelErrors = excelReader.reader(inputStream, obj -> {
+            try {
+                StudentRelateDTO dto = (StudentRelateDTO) obj;
+                //校验excel文件中数据是否完整
+                if (!checkObjFieldIsNotNull(dto)) {
+                    throw new RuntimeException("考生信息缺失");
+                }
+
+                String examNumber = dto.getExamNumber();
+                //如果没有设置区域代码,用准考证前2位作为区域代码
+                String areaCode = null;
+                if (dto.getAreaCode() == null || dto.getAreaCode().isEmpty()) {
+                    areaCode = examNumber.substring(0, 2);
+                    dto.setAreaCode(areaCode);
+                }
+
+                Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+                if (student == null) {
+                    throw new RuntimeException("考生不存在");
+                }
+                //检验其它信息是否一致
+                if (!Objects.equals(student.getName(), dto.getName())
+                        || !Objects.equals(student.getAreaName(), dto.getAreaName())
+                        || !Objects.equals(student.getExamRoom(), dto.getExamRoom())
+                        || !Objects.equals(student.getSourceName(), dto.getSourceName())) {
+                    throw new RuntimeException("考生信息与系统数据不匹配");
+                }
+                //设置关联考号
+                student.setRelateExamNumber(dto.getRelateExamNumber());
+                studentRepo.save(student);
+                return null;
+            } catch (RuntimeException e) {
+                //手动回滚
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                ExcelError excelError = new ExcelError();
+                excelError.setExcelErrorType(e.getMessage());
+                return excelError;
+            }
+        });
+        return excelErrors;
+    }
+
     /**
      * 获取随机号
      *

+ 35 - 14
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -14,10 +14,7 @@ import cn.com.qmth.stmms.ms.commons.utils.CommandUtil;
 import cn.com.qmth.stmms.ms.commons.utils.FileUtil;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
-import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
-import cn.com.qmth.stmms.ms.core.domain.ParamSetting;
-import cn.com.qmth.stmms.ms.core.domain.Student;
-import cn.com.qmth.stmms.ms.core.domain.Work;
+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;
@@ -43,6 +40,7 @@ import java.security.MessageDigest;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
 /**
  * Created by dizhi on 2016/12/24.
@@ -73,6 +71,9 @@ public class CollectApi {
     @Autowired
     private DataUploadService dataUploadService;
 
+    @Autowired
+    private LevelRepo levelRepo;
+
     @Autowired
     private SystemConfig systemConfig;
 
@@ -147,22 +148,28 @@ public class CollectApi {
         Consumer<Student> consumer = (s) -> {
             CollectStuDTO collectStuDTO = new CollectStuDTO();
             collectStuDTO.setExamId(activeWork.getId());
-            collectStuDTO.setExamNumber(s.getExamNumber());
+            collectStuDTO.setExamNumber(s.getRelateExamNumber());
             collectStuDTO.setName(s.getName());
             collectStuDTO.setSiteCode(s.getAreaName());
             collectStuDTO.setRoomCode(s.getExamRoom());
             list.add(collectStuDTO);
         };
-        Student student = studentRepo.findByWorkIdAndExamNumber(activeWork.getId(), examNumber);
+        Student student = studentRepo.findByWorkIdAndRelateExamNumber(activeWork.getId(), examNumber);
         studentRepo.findByWorkIdAndTestAndExamRoom(activeWork.getId(), String.valueOf(TrialEnum.DEFAULT.getId()), student.getExamRoom()).forEach(consumer);
         return list;
     }
 
     @RequestMapping(value = "exam/getStudent/{examNumber}", method = RequestMethod.GET)
-    public Student getStudent(@PathVariable String examNumber) {
+    public CollectStuDTO getStudent(@PathVariable String examNumber) {
         Work activeWork = workRepo.findByActiveTrue();
-        Student student = studentRepo.findByWorkIdAndExamNumber(activeWork.getId(), examNumber);
-        return student;
+        Student student = studentRepo.findByWorkIdAndRelateExamNumber(activeWork.getId(), examNumber);
+        CollectStuDTO collectStuDTO = new CollectStuDTO();
+        collectStuDTO.setExamId(activeWork.getId());
+        collectStuDTO.setExamNumber(student.getRelateExamNumber());
+        collectStuDTO.setName(student.getName());
+        collectStuDTO.setSiteCode(student.getAreaName());
+        collectStuDTO.setRoomCode(student.getExamRoom());
+        return collectStuDTO;
     }
 
 
@@ -199,19 +206,19 @@ public class CollectApi {
     @CrossOrigin(maxAge = 3600) //支持跨域
     @RequestMapping(value = "upload/student/{subjectId}", method = RequestMethod.POST)
     public List<CollectStuDTO> saveStudent(HttpServletRequest request, @PathVariable Integer subjectId,
-                                           @RequestBody CollectStuDTO[] uploadStudentArray) throws Exception {
+                                           CollectStuDTO dto) throws Exception {
         Subject subject = Subject.values()[subjectId - 1];
         Work activeWork = workRepo.findByActiveTrue();
         List<CollectStuDTO> list = new ArrayList<>();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
-        for (CollectStuDTO dto : uploadStudentArray) {
+//        for (CollectStuDTO dto : uploadStudentArray) {
             Student student = studentRepo.findByWorkIdAndExamNumberAndTest(activeWork.getId(), dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
             if (!dto.isAbsent()) {
                 dataUploadService.savePaper(student, subject, dto.isManual());
             }
             dto.setUploadTime(sdf.format(new Date()));
             list.add(dto);
-        }
+//        }
         return list;
     }
 
@@ -473,15 +480,16 @@ public class CollectApi {
      * @throws Exception
      */
     @CrossOrigin(maxAge = 3600) //支持跨域
-    @RequestMapping(value = "file/ms-slice/{workId}/{subjectId}", method = {RequestMethod.PUT, RequestMethod.POST})
+    @RequestMapping(value = "file/ms-slice/{workId}/{subjectId}/{examNumber}", method = {RequestMethod.PUT, RequestMethod.POST})
     public void upload(@PathVariable Long workId, @PathVariable Integer subjectId,
+                       @PathVariable String examNumber,
                        @RequestParam MultipartFile file,
                        HttpServletRequest request, HttpServletResponse response) throws Exception {
         if (Objects.isNull(file)) {
             throw new Exception("file文件不能为空");
         }
         int temp = file.getOriginalFilename().indexOf(".");
-        String examNumber = file.getOriginalFilename().substring(0, temp);
+//        String examNumber = file.getOriginalFilename().substring(0, temp);
         String format = file.getOriginalFilename().substring(temp, file.getOriginalFilename().length());
         if (Objects.nonNull(format) && !(format.equalsIgnoreCase(".jpg") || format.equalsIgnoreCase(".jpeg") || format.equalsIgnoreCase(".png"))) {
             throw new Exception("file文件格式只能为jpg,jpeg,png");
@@ -662,4 +670,17 @@ public class CollectApi {
         }
         return true;
     }
+
+
+    /**
+     * 查询档位
+     * @param workId
+     * @return
+     */
+    @RequestMapping(value = "level/{workId}", method = RequestMethod.GET)
+    public List<String> updateConfig(@PathVariable Long workId) {
+         List<Level> levels = levelRepo.findByWorkId(workId);
+         List<String> codes = levels.stream().map(m-> m.getCode()).collect(Collectors.toList());
+        return codes;
+    }
 }

+ 27 - 16
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ChangeStage.java → stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ChangeLevel.java

@@ -1,14 +1,13 @@
 package cn.com.qmth.stmms.ms.core.domain;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
+import javax.persistence.*;
 import java.util.Date;
 
 @Entity
-@Table(name = "change_stage")
-public class ChangeStage {
+@Table(name = "change_level")
+public class ChangeLevel {
 
     @Id
     @GeneratedValue
@@ -20,9 +19,9 @@ public class ChangeStage {
 
     private Long paperId;
 
-    private String originalStage;
+    private String originalLevel;
 
-    private String suggestStage;
+    private String suggestLevel;
 
     private Integer auditStatus;
 
@@ -34,6 +33,10 @@ public class ChangeStage {
 
     private Date auditDate;
 
+//    @OneToOne
+//    @JoinColumn(name = "paperId")
+//    private Paper paper;
+
     public Long getId() {
         return id;
     }
@@ -66,20 +69,20 @@ public class ChangeStage {
         this.paperId = paperId;
     }
 
-    public String getOriginalStage() {
-        return originalStage;
+    public String getOriginalLevel() {
+        return originalLevel;
     }
 
-    public void setOriginalStage(String originalStage) {
-        this.originalStage = originalStage;
+    public void setOriginalLevel(String originalLevel) {
+        this.originalLevel = originalLevel;
     }
 
-    public String getSuggestStage() {
-        return suggestStage;
+    public String getSuggestLevel() {
+        return suggestLevel;
     }
 
-    public void setSuggestStage(String suggestStage) {
-        this.suggestStage = suggestStage;
+    public void setSuggestLevel(String suggestLevel) {
+        this.suggestLevel = suggestLevel;
     }
 
     public Integer getAuditStatus() {
@@ -121,4 +124,12 @@ public class ChangeStage {
     public void setAuditDate(Date auditDate) {
         this.auditDate = auditDate;
     }
+
+//    public Paper getPaper() {
+//        return paper;
+//    }
+//
+//    public void setPaper(Paper paper) {
+//        this.paper = paper;
+//    }
 }

+ 14 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Student.java

@@ -48,6 +48,11 @@ public class Student implements Serializable {
     @Column(name = "is_test")
     private String test; //是否试评,1:数据已导入,2:试评中
 
+    /**
+     * 关联考生账号
+     */
+    private String relateExamNumber;
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -69,6 +74,7 @@ public class Student implements Serializable {
         this.examRoom = examRoom;
         this.sourceName = sourceName;
         this.test = test;
+        this.relateExamNumber = examNumber;
     }
 
     public Student() {
@@ -153,4 +159,12 @@ public class Student implements Serializable {
     public void setSourceName(String sourceName) {
         this.sourceName = sourceName;
     }
+
+    public String getRelateExamNumber() {
+        return relateExamNumber;
+    }
+
+    public void setRelateExamNumber(String relateExamNumber) {
+        this.relateExamNumber = relateExamNumber;
+    }
 }

+ 17 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ChangeLevelRepo.java

@@ -0,0 +1,17 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.ChangeLevel;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ChangeLevelRepo extends JpaRepository<ChangeLevel, Long>, JpaSpecificationExecutor {
+    ChangeLevel findByWorkIdAndSubjectAndPaperId(Long workId, Subject subject, Long paperId);
+}

+ 0 - 9
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ChangeStageRepo.java

@@ -1,9 +0,0 @@
-package cn.com.qmth.stmms.ms.core.repository;
-
-import cn.com.qmth.stmms.ms.core.domain.ChangeStage;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface ChangeStageRepo extends JpaRepository<ChangeStage, Long> {
-}

+ 8 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkLogRepo.java

@@ -1,11 +1,16 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
 import cn.com.qmth.stmms.ms.core.domain.MarkLog;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author ting.yin
@@ -28,4 +33,7 @@ public interface MarkLogRepo extends JpaRepository<MarkLog, Long>, JpaSpecificat
     List<MarkLog> findByCreateUserId(Long userId);
 
     void deleteByPaperIdIn(List<Long> paperIds);
+
+    @Query("select distinct s.createUserName as createUserName, max(s.id) as id from MarkLog s where s.createRole = '采集员' and s.workId = ?1 group by s.createUserName")
+    Page<Map> findByWorkId(@Param("workId") Long workId, Pageable pageable);
 }

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

@@ -91,10 +91,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      * @param stageId
      * @return
      */
-    @Query(value = "SELECT q.`id`,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount, SUM(t.is_rejected) rejectedCount, q.area_code areaCode" +
+    @Query(value = "SELECT q.`id`,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount, SUM(t.is_rejected) rejectedCount,0 changeStage, 0 changeStageScore, q.area_code areaCode " +
             "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY t.`question_id`, t.`marker_name` ORDER BY q.`id`", nativeQuery = true)
-    List<Map> countGroupByQuestionAndMarker(String name, Integer stageId, int test);
+            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY t.`question_id`, t.`marker_name` ORDER BY q.`id`", nativeQuery = true)
+    List<Object[]> listGroupByQuestionAndMarker(Long workId, String name, Integer stageId, int test);
 
     /**
      * 考区已评数及总数(分档阶段)
@@ -104,10 +104,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      * @param stageId
      * @return
      */
-    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount" +
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount " +
             "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.subject = ? and t.stage = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
-    List<Map> countGroupByAreaName(String name, Integer stageId);
+            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name, Integer stageId);
 
     /**
      * 考区已评数及总数(分档阶段)
@@ -117,10 +117,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      * @param stageId
      * @return
      */
-    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount" +
+    @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount " +
             "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
-    List<Map> countGroupByAreaName(String name, Integer stageId, int test);
+            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+    List<Object[]> listGroupByAreaName(Long workId, String name, Integer stageId, int test);
 
     /**
      * 统计评卷员各试题已评数及总数(分档阶段)
@@ -138,10 +138,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      *
      * @return
      */
-    @Query(value = "SELECT q.`id`,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount,0 changeStage, 0, changeStageScore, q.area_code areaCode" +
+    @Query(value = "SELECT q.`id`,t.`marker_name` markerName,q.`name`,SUM(IF(t.`result` IS NULL,1,0)) leftCount,COUNT(t.question_id) totalCount,SUM(t.is_rejected) rejectedCount,0 changeStage, 0 changeStageScore, q.area_code areaCode " +
             "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.subject = ? and t.stage = ? and p.is_missing = false GROUP BY t.`question_id` ORDER BY q.`id`, t.`marker_name`", nativeQuery = true)
-    List<Map> countGroupByQuestionAndMarker(String name, Integer stageId);
+            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false GROUP BY t.`question_id` ORDER BY q.`id`, t.`marker_name`", nativeQuery = true)
+    List<Object[]> listGroupByQuestionAndMarker(Long workId, String name, Integer stageId);
 
     /**
      * 统计指定试卷的所有任务数量

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

@@ -272,5 +272,11 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     @Query("select max(p.batchNo) from Paper p where p.questionId = ?1")
     Long findByQuestionId(Long questionId);
 
+    List<Paper> findByworkIdAndSubjectAndAreaCode(Long workId, Subject subject, String areaCode);
+
+    int countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrueAndTestAndQuestionId(Long workId, Subject subject, int test, Long questionId);
+
+    int countByWorkIdAndSubjectAndIsMissingFalseAndTestAndQuestionId(Long workId, Subject subject, int test, Long questionId);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }

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

@@ -27,4 +27,6 @@ public interface StudentRepo extends JpaRepository<Student, Long>, JpaSpecificat
     void deleteByWorkIdAndTest(Long workId, String test);
 
     List<Student> findByWorkIdAndTestAndExamRoom(Long workId, String test, String examRoom);
+
+    Student findByWorkIdAndRelateExamNumber(Long workId, String examNumber);
 }

+ 36 - 0
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java

@@ -1,18 +1,24 @@
 package cn.com.qmth.stmms.ms.log.controller;
 
+import cn.com.qmth.stmms.ms.commons.utils.PageInfo;
+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.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.domain.*;
 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.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
+import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import javax.persistence.criteria.Predicate;
@@ -21,6 +27,7 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 //import io.swagger.annotations.Api;
@@ -41,6 +48,14 @@ public class MarkLogController {
     @Autowired
     WorkRepo workRepo;
 
+    @Autowired
+    SqlUtil sqlUtil;
+
+    @Autowired
+    private PaperAssembler paperAssembler;
+
+    JdbcTemplate jdbcTemplate;
+
     //    @ApiOperation(value = "纪检审计查询接口")
     @GetMapping("/selectMarkLog")
     public PagingAndSortingDTO selectMarkLog(
@@ -205,4 +220,25 @@ public class MarkLogController {
         //退出时间(没有退出时间)
         return markLogRepo.saveAndFlush(markLog);
     }
+
+    /**
+     * 设备监控
+     *
+     * @param workId
+     * @return
+     * @throws ParseException
+     */
+    @RequestMapping(value = "/equipmentMonitor", method = RequestMethod.GET)
+    public Object saveCollectLog(Long workId, Pageable pageable) {
+        Page<Map> mapPage = markLogRepo.findByWorkId(workId, pageable);
+        List<Map> list = mapPage.getContent();
+        for (Map map : list) {
+            MarkLog markLog = markLogRepo.findOne(Long.valueOf(map.get("id").toString()));
+            Paper paper = paperRepo.findOne(markLog.getPaperId());
+            PaperDTO paperDTO = paperAssembler.toDTO(paper);
+            map.put("imgSrc", paperDTO.getImgSrc());
+            map.put("thumbSrc", paperDTO.getThumbSrc());
+        }
+        return new PageableDTO(list, mapPage.getTotalElements(), mapPage.getTotalPages(), pageable.getPageNumber());
+    }
 }

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

@@ -0,0 +1,198 @@
+package cn.com.qmth.stmms.ms.marking.api;
+
+import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
+import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
+import cn.com.qmth.stmms.ms.core.domain.ChangeLevel;
+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.repository.ChangeLevelRepo;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import cn.com.qmth.stmms.ms.marking.assembler.ChangeLevelAssembler;
+import cn.com.qmth.stmms.ms.marking.dto.ChangeLevelDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.Predicate;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@RestController
+@RequestMapping("/api/changelevel")
+public class ChangeLevelApi {
+
+    @Autowired
+    private PaperRepo paperRepo;
+
+    @Autowired
+    private ChangeLevelRepo changeLevelRepo;
+
+    @Autowired
+    private ChangeLevelAssembler changeLevelAssembler;
+
+    @Autowired
+    private SqlUtil sqlUtil;
+
+    /**
+     * 查询改档列表
+     *
+     * @param workId
+     * @param areaCode
+     * @param subject
+     * @param status
+     * @return
+     */
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public PageableDTO changeLevel(@RequestParam(required = false) Long workId,
+                                   @RequestParam(required = false) String areaCode,
+                                   @RequestParam(required = false) String subject,
+                                   @RequestParam(required = false) String status,
+                                   Pageable pageable) {
+        List<ChangeLevelDTO> levelDTOs = new ArrayList<>();
+//        StringBuffer sql = new StringBuffer();
+//        sql.append("  SELECT                                         ");
+//        sql.append("      cl.id,                                     ");
+//        sql.append("      cl.work_id workId,                         ");
+//        sql.append("      cl.subject,                                ");
+//        sql.append("      p.exam_number examNumber,                  ");
+//        sql.append("      p.area_code areaCode,                      ");
+//        sql.append("      p.is_rejected isRejected,                  ");
+//        sql.append("      cl.create_date createDate,                 ");
+//        sql.append("      p.level,                                   ");
+//        sql.append("      p.secret_number secretNumber,              ");
+//        sql.append("      p.redo_level redoLevel,                    ");
+//        sql.append("      p.is_sample isSample,                      ");
+//        sql.append("      p.mark_by_leader markByLeader,             ");
+//        sql.append("      p.id paperId                               ");
+//        sql.append("  FROM                                           ");
+//        sql.append("      change_level cl                            ");
+//        sql.append("          LEFT JOIN                              ");
+//        sql.append("      paper p ON cl.work_id = p.work_id          ");
+//        sql.append("          AND cl.subject = p.subject             ");
+//        sql.append("          AND cl.paper_id = p.id                 ");
+//        sql.append("           where 1=1                             ");
+//        if (Objects.nonNull(workId)) {
+//            sql.append(" and cl.work_id = '" + workId + "'");
+//        }
+//        if (Objects.nonNull(areaCode)) {
+//            sql.append(" and p.area_code = '" + areaCode + "'");
+//        }
+//        if (Objects.nonNull(subject)) {
+//            sql.append(" and cl.subject = '" + subject + "'");
+//        }
+//        if (Objects.nonNull(status)) {
+//            if (status == 0) {
+//                sql.append(" and cl.audit_status = 0");
+//            } else {
+//                sql.append(" and cl.audit_status != 0");
+//            }
+//        }
+
+
+        Specification<Paper> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (!StringUtils.isEmpty(workId)) {
+                predicates.add(builder.equal(root.get("workId"), workId));
+            }
+            if (!StringUtils.isEmpty(areaCode)) {
+                List<Paper> papers = paperRepo.findByworkIdAndSubjectAndAreaCode(workId, Subject.valueOf(subject), areaCode);
+//                predicates.add(builder.equal(root.get("areaCode"), areaCode));
+                CriteriaBuilder.In<Object> in = builder.in(root.get("paperId"));
+                for (Paper paper : papers) {
+                    in.value(paper.getId());
+                }
+                predicates.add(builder.and(builder.and(in)));
+
+            }
+            if (!StringUtils.isEmpty(subject)) {
+                predicates.add(builder.equal(root.get("subject"), subject));
+            }
+            if (!StringUtils.isEmpty(status) && !StringUtils.isEmpty(status)) {
+                if (Objects.equals(status, "0")) {
+                    predicates.add(builder.equal(root.get("auditStatus"), status));
+                } else {
+                    predicates.add(builder.notEqual(root.get("auditStatus"), status));
+                }
+
+            }
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        Page<ChangeLevel> levels = changeLevelRepo.findAll(specification, pageable);
+
+//        PageInfo<Map> pageInfo = sqlUtil.execSqlForListPageInfo(sql.toString(), pageable.getPageNumber(), pageable.getPageSize(), null);
+        levels.getContent().forEach(m -> {
+            levelDTOs.add(changeLevelAssembler.toDTO(m));
+        });
+        return new PageableDTO(levelDTOs, levels.getTotalElements(), levels.getTotalPages(), pageable.getPageNumber());
+    }
+
+    /**
+     * 科组长改档申请
+     *
+     * @param markSubject
+     * @param paperId
+     * @param level
+     * @return
+     */
+    @RequestMapping(value = "{markSubject}/changeLevel", method = RequestMethod.POST)
+    public ResponseEntity changeLevel(@PathVariable MarkSubject markSubject,
+                                      @RequestParam Long paperId,
+                                      @RequestParam String level) {
+        //只有打分阶段才能改档
+        if (!Objects.equals(markSubject.getStage().name(), MarkStage.SCORE.name())) {
+            throw new RuntimeException("只有打分阶段才允许改档");
+        }
+        Paper paper = paperRepo.findOne(paperId);
+
+        //
+        ChangeLevel changeLevel = changeLevelRepo.findByWorkIdAndSubjectAndPaperId(markSubject.getWorkId(), markSubject.getSubject(), paperId);
+        if (changeLevel == null) {
+            changeLevel = new ChangeLevel();
+            changeLevel.setWorkId(markSubject.getWorkId());
+            changeLevel.setSubject(markSubject.getSubject().name());
+            changeLevel.setPaperId(paperId);
+            changeLevel.setOriginalLevel(paper.getLevel());
+            changeLevel.setSuggestLevel(level);
+            changeLevel.setAuditStatus(0);
+            //todo
+//            changeLevel.setCreateId();
+            changeLevel.setCreateDate(new Date());
+        } else {
+            changeLevel.setOriginalLevel(paper.getLevel());
+            changeLevel.setSuggestLevel(level);
+//            changeLevel.setCreateId();
+            changeLevel.setCreateDate(new Date());
+        }
+        changeLevelRepo.save(changeLevel);
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
+    /**
+     * 科组长改档审核
+     *
+     * @param id
+     * @param auditStatus
+     * @return
+     */
+    @RequestMapping(value = "/changeLevelAudit", method = RequestMethod.POST)
+    public ResponseEntity changeLevelAudit(@RequestParam Long id,
+                                           @RequestParam Integer auditStatus) {
+        ChangeLevel changeLevel = changeLevelRepo.findOne(id);
+        changeLevel.setAuditStatus(auditStatus);
+        changeLevelRepo.save(changeLevel);
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+}

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

@@ -5,6 +5,8 @@ import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
+import cn.com.qmth.stmms.ms.core.domain.Student;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 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.Role;
@@ -13,12 +15,11 @@ import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.LevelStatAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkerAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.QuestionStatAssembler;
-import cn.com.qmth.stmms.ms.marking.dto.LevelStatDTO;
-import cn.com.qmth.stmms.ms.marking.dto.LevleProgressDTO;
-import cn.com.qmth.stmms.ms.marking.dto.MarkerDTO;
-import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
+import cn.com.qmth.stmms.ms.marking.dto.*;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
@@ -67,6 +68,9 @@ public class MakrerApi {
     @Autowired
     PaperRepo paperRepo;
 
+    @Autowired
+    StudentRepo studentRepo;
+
     /**
      * 评卷员信息
      *
@@ -79,6 +83,20 @@ public class MakrerApi {
         return markerAssembler.toDTO(marker);
     }
 
+    /**
+     * 更新默认显示试卷数量
+     *
+     * @param markerId 评卷员用户id
+     * @return
+     */
+    @RequestMapping(value = "updateDisplayCount", method = RequestMethod.POST)
+    public ResponseEntity getMarker(Long markerId, Integer displayCount) {
+        MarkUser marker = markUserRepo.findOne(markerId);
+        marker.setDisplayCount(displayCount);
+        markUserRepo.saveAndFlush(marker);
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
     /**
      * 评卷员列表
      *
@@ -225,52 +243,89 @@ public class MakrerApi {
     }
 
     /**
-     * 各评卷员评卷进度、区评卷进度
+     * 各评卷员评卷进度、区评卷进度
      *
-     * @param marker 评卷员用户对象
      * @return
      */
     @RequestMapping(value = "/stat/progress", method = RequestMethod.GET)
-    public Map markProgress(@PathVariable MarkUser marker) {
+    public Map markProgress(@RequestParam Long workId, @RequestParam Subject subject) {
         Map<String, Object> objectMap = new HashMap<>();
-        MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
+        MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.toString());
 
         //总体进度
-        Long workId = markSubject.getWorkId();
-        Subject subject = markSubject.getSubject();
-        //已评任务数
-        int successCount = paperRepo.countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrueAndTest(workId, subject, 0);
-        //所有任务数(查询所有有效试卷)
-        int totalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTest(workId, subject, 0);
-
-        BigDecimal waitTotal = BigDecimal.valueOf(totalCount).subtract(BigDecimal.valueOf(successCount));
-        //进度
-        BigDecimal progress = BigDecimal.ZERO.compareTo(BigDecimal.valueOf(totalCount)) == 0 ? BigDecimal.ZERO : BigDecimal.valueOf(successCount).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(totalCount), 2, BigDecimal.ROUND_HALF_UP);
-
-        LevleProgressDTO progressDTO = new LevleProgressDTO();
-        progressDTO.setSuccessCount(successCount);
-        progressDTO.setTotalCount(totalCount);
-        progressDTO.setWaitCount(waitTotal.intValue());
-        progressDTO.setProgress(progress.doubleValue());
-        objectMap.put("totalProgress", progressDTO);
+        if(markSubject.getStage() == MarkStage.INIT){
+            List<Student> students = studentRepo.findByWorkIdAndTest(workId, String.valueOf(TrialEnum.DEFAULT.getId()));
+            long stuTotalCount = students.stream().count();
+            long stuAbsentCount = students.stream().filter(s -> s.isAbsent()).count();
+            long c = 0L;
+            for (Student student : students) {
+                String[] uploadStatus = student.getUploadStatus().split(",");
+                for (String s : uploadStatus) {
+                    if ("1".equals(s.split(":")[1])) {
+                        if(subject.name().equals(s.split(":")[0])){
+                           ++c;
+                        }
+                    }
+                }
+            }
+
+            LevleProgressDTO progressDTO = new LevleProgressDTO();
+            progressDTO.setSuccessCount((int) c);
+            progressDTO.setTotalCount((int) stuTotalCount);
+            progressDTO.setWaitCount((int) (stuTotalCount-c));
+            BigDecimal progress = new BigDecimal(c*100).divide(new BigDecimal(stuTotalCount), 2, BigDecimal.ROUND_HALF_UP);
+            progressDTO.setProgress(progress.doubleValue());
+            objectMap.put("totalProgress", progressDTO);
+        } else {
+            //已评任务数
+            int successCount = paperRepo.countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrueAndTest(workId, subject, 0);
+            //所有任务数(查询所有有效试卷)
+            int totalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTest(workId, subject, 0);
+
+            BigDecimal waitTotal = BigDecimal.valueOf(totalCount).subtract(BigDecimal.valueOf(successCount));
+            //进度
+            BigDecimal progress = BigDecimal.ZERO.compareTo(BigDecimal.valueOf(totalCount)) == 0 ? BigDecimal.ZERO : BigDecimal.valueOf(successCount).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(totalCount), 2, BigDecimal.ROUND_HALF_UP);
+
+            LevleProgressDTO progressDTO = new LevleProgressDTO();
+            progressDTO.setSuccessCount(successCount);
+            progressDTO.setTotalCount(totalCount);
+            progressDTO.setWaitCount(waitTotal.intValue());
+            progressDTO.setProgress(progress.doubleValue());
+            objectMap.put("totalProgress", progressDTO);
+        }
+
 
         //考区进度
-        List<Map> areas = null;
+        List<Object[]> areas = null;
         if (markSubject.getStage() == MarkStage.SCORE) {
-            areas = markTaskRepo.countGroupByAreaName(markSubject.getSubject().name(), markSubject.getStage().ordinal());
+            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal());
         } else {
-            areas = markTaskRepo.countGroupByAreaName(markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
+            areas = markTaskRepo.listGroupByAreaName(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
+        }
+        if (areas != null) {
+            List<QuestionStatDTO> questionStatDTOs = new ArrayList<>();
+            for (Object[] objects : areas) {
+                QuestionStatDTO dto = questionStatAssembler.toProgressDTO(objects);
+                questionStatDTOs.add(dto);
+            }
+            objectMap.put("areaProgress", questionStatDTOs);
         }
-        objectMap.put("areaProgress", areas);
 
         //各评卷员评卷进度
-        List<Map> qStats = null;
+        List<Object[]> qStats = null;
         if (markSubject.getStage() == MarkStage.SCORE) {
-            qStats = markTaskRepo.countGroupByQuestionAndMarker(markSubject.getSubject().name(), markSubject.getStage().ordinal());
+            qStats = markTaskRepo.listGroupByQuestionAndMarker(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal());
         } else {
-            qStats = markTaskRepo.countGroupByQuestionAndMarker(markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
+            qStats = markTaskRepo.listGroupByQuestionAndMarker(workId, markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
+        }
+        if (qStats != null) {
+            List<MarkQuestionStatDTO> questionStatDTOs = new ArrayList<>();
+            for (Object[] objects : qStats) {
+                MarkQuestionStatDTO dto = questionStatAssembler.toMarkProgressDTO(objects);
+                questionStatDTOs.add(dto);
+            }
+            objectMap.put("markerProgress", questionStatDTOs);
         }
-        objectMap.put("markerProgress", qStats);
         return objectMap;
     }
 

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

@@ -260,8 +260,19 @@ public class MarkSubjectApi {
         return stageControlService.progress(markSubject);
     }
 
+    /**
+     * 分考区查询分档进度
+     *
+     * @param markSubject 评卷科目id
+     */
+    @RequestMapping(value = "{markSubject}/areaProgress", method = RequestMethod.GET)
+    public List<LevleProgressDTO> areaProgress(@PathVariable MarkSubject markSubject) {
+        return stageControlService.areaProgress(markSubject);
+    }
+
     /**
      * 查询所有科目
+     *
      * @param workId
      * @return
      */
@@ -280,7 +291,7 @@ public class MarkSubjectApi {
         //有采集数据,不能禁用
         List<Paper> papers = paperRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
         if (papers == null || papers.isEmpty()) {
-            throw new RuntimeException("已有数据,不可"+ (markSubject.isEnable()? "禁用":"启用"));
+            throw new RuntimeException("已有数据,不可" + (markSubject.isEnable() ? "禁用" : "启用"));
         }
         markSubject.setEnable(!markSubject.isEnable());
         markSubjectRepo.saveAndFlush(markSubject);
@@ -304,4 +315,5 @@ public class MarkSubjectApi {
         markSubjectRepo.saveAndFlush(markSubjectT);
         return new ResponseEntity(HttpStatus.OK);
     }
+
 }

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

@@ -10,6 +10,7 @@ import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.repository.*;
+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.dto.MarkTaskDTO;
 import cn.com.qmth.stmms.ms.marking.service.MarkingService;
@@ -17,7 +18,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -79,6 +82,7 @@ public class MarkTaskApi {
                             @RequestParam(required = false) String level,
                             @RequestParam(required = false) String sn,
                             @RequestParam Long questionId,
+                            @RequestParam(required = false) String areaCode,
                             Pageable pageable) throws Exception {
         List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
         Specification<MarkTask> specification = (root, query, builder) -> {
@@ -103,11 +107,17 @@ public class MarkTaskApi {
             }
             predicates.add(builder.equal(root.get("paper").get("isMissing"), false));
             predicates.add(builder.equal(root.get("paper").get("active"), true));
+            //过滤考区
+            if(Objects.nonNull(areaCode)){
+                predicates.add(builder.equal(root.get("paper").get("areaCode"), areaCode));
+            }
 //            predicates.add(builder.equal(root.get("isActive"), false));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
 
         Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable);
+
+
         if (Objects.isNull(markTasks) || markTasks.getContent().size() == 0) {
             if (Objects.nonNull(isSample) && isSample) {
                 ExamQuestion examQuestion = examQuestionRepo.findOne(questionId);
@@ -199,4 +209,50 @@ public class MarkTaskApi {
         return new ResponseEntity(markTaskAssembler.toDTO(markTask), HttpStatus.OK);
     }
 
+    /**
+     * 已评试卷回显
+     * @param markerId
+     * @param stage
+     * @param questionId
+     * @param areaCode
+     * @param pageable
+     * @return
+     */
+    @RequestMapping(value = "/reviewPaper",method = RequestMethod.GET)
+    public PageableDTO reviewPaper(@RequestParam Long markerId,
+                            @RequestParam MarkStage stage,
+                            @RequestParam Long questionId,
+                            @RequestParam(required = false) String areaCode,
+                            Pageable pageable) {
+        List<MarkTaskDTO> markTaskDTOs = new ArrayList<>();
+        Sort sort = new Sort(Sort.Direction.DESC, "updatedOn");
+        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
+        Specification<MarkTask> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("questionId"), questionId));
+            predicates.add(builder.equal(root.get("markerId"), markerId));
+            predicates.add(builder.equal(root.get("stage"), stage));
+            if (stage == MarkStage.LEVEL) {
+                //查询
+                Long batchNo = paperRepo.findByQuestionId(questionId);
+                if (!Objects.isNull(batchNo)) {
+                    predicates.add(builder.equal(root.get("paper").get("batchNo"), batchNo));
+                }
+            } else if (stage == MarkStage.SCORE) {
+                predicates.add(builder.isNotNull(root.get("result")));
+            }
+            //过滤考区
+            if(Objects.nonNull(areaCode)){
+                predicates.add(builder.equal(root.get("paper").get("areaCode"), areaCode));
+            }
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        Page<MarkTask> markTasks = markTaskRepo.findAll(specification, pageable1);
+        markTasks.getContent().forEach(m -> {
+            markTaskDTOs.add(markTaskAssembler.toDTO(m));
+        });
+        return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
+    }
+
 }

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

@@ -22,10 +22,12 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.persistence.criteria.Predicate;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 试卷相关api
@@ -129,10 +131,10 @@ public class PaperApi {
                                      @RequestParam(required = false) String sortBy,
                                      Pageable pageable) {
         Sort sort = null;
-        if(Objects.equals("1", sortBy)){
+        if (Objects.equals("1", sortBy)) {
             sort = new Sort(Sort.Direction.DESC, "updatedOn");
         }
-        if(Objects.equals("2", sortBy)){
+        if (Objects.equals("2", sortBy)) {
             sort = new Sort(Sort.Direction.ASC, "examNumber");
         }
         Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
@@ -153,7 +155,7 @@ public class PaperApi {
                 predicates.add(builder.equal(root.get("isMissing"), missing));
             }
             //考生姓名
-            if(Objects.nonNull(studentName)){
+            if (Objects.nonNull(studentName)) {
                 predicates.add(builder.equal(root.get("studentName"), studentName));
             }
             predicates.add(builder.equal(root.get("test"), 0));
@@ -286,4 +288,73 @@ public class PaperApi {
         return markTaskDTOs;
     }
 
+    /**
+     * 考生成绩查询
+     *
+     * @param workId
+     * @param areaCode
+     * @param subject
+     * @param number
+     * @param studentName
+     * @return
+     */
+    @RequestMapping(value = "/studentScore", method = RequestMethod.GET)
+    public List<Map> markTasks(@RequestParam Long workId,
+                                 @RequestParam(required = false) String areaCode,
+                                 @RequestParam(required = false) Subject subject,
+                                 @RequestParam(required = false) String type,
+                                 @RequestParam(required = false) String number,
+                                 @RequestParam(required = false) String studentName) {
+        Specification<Paper> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (!StringUtils.isEmpty(workId)) {
+                predicates.add(builder.equal(root.get("workId"), workId));
+            }
+            if (!StringUtils.isEmpty(areaCode)) {
+                predicates.add(builder.equal(root.get("areaCode"), areaCode));
+            }
+            if (!StringUtils.isEmpty(subject)) {
+                predicates.add(builder.equal(root.get("subject"), subject));
+            }
+            if (!StringUtils.isEmpty(type) && !StringUtils.isEmpty(number)) {
+                if (Objects.equals(type, "examNumber")) {
+                    predicates.add(builder.equal(root.get("examNumber"), number));
+                } else if (Objects.equals(type, "paper")) {
+                    predicates.add(builder.equal(root.get("secretNumber"), number));
+                } else if (Objects.equals(type, "task")) {
+                    List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndSecretNumber(workId, number);
+                    if (markTasks == null || markTasks.size() == 0) {
+                        predicates.add(builder.equal(root.get("id"), null));
+                    } else {
+                        predicates.add(builder.equal(root.get("id"), markTasks.get(0).getPaper().getId()));
+                    }
+                }
+
+            }
+            if (!StringUtils.isEmpty(studentName)) {
+                predicates.add(builder.equal(root.get("studentName"), studentName));
+            }
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        List<Paper> papers = paperRepo.findAll(specification);
+        //根据考生分组
+        Map<String, List<Paper>> groupPaper = papers.stream().collect(Collectors.groupingBy(p -> p.getExamNumber() + ":" + p.getStudentName()));
+        List<Map> mapList = new ArrayList<>();
+        for (Map.Entry<String, List<Paper>> entry :groupPaper.entrySet()) {
+            Map map = new HashMap();
+            String key = entry.getKey();
+            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();
+            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);
+        }
+        return mapList;
+    }
+
 }

+ 70 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/ChangeLevelAssembler.java

@@ -0,0 +1,70 @@
+package cn.com.qmth.stmms.ms.marking.assembler;
+
+import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
+import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
+import cn.com.qmth.stmms.ms.core.domain.ChangeLevel;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.Student;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import cn.com.qmth.stmms.ms.marking.dto.ChangeLevelDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+@Component
+public class ChangeLevelAssembler {
+
+    @Autowired
+    private SystemConfig systemConfig;
+
+    @Autowired
+    ImageConfig imageConfig;
+
+    @Autowired
+    StudentRepo studentRepo;
+
+    @Autowired
+    private PaperRepo paperRepo;
+
+    public ChangeLevelDTO toDTO(ChangeLevel changeLevel) {
+
+        ChangeLevelDTO changeLevelDTO = null;
+        if (changeLevel != null) {
+            Paper paper = paperRepo.findOne(changeLevel.getPaperId());
+            changeLevelDTO = new ChangeLevelDTO();
+            changeLevelDTO.setId(changeLevel.getId());
+            changeLevelDTO.setRejected(paper.isRejected());
+            changeLevelDTO.setUpdatedOn(changeLevel.getCreateDate());
+            changeLevelDTO.setResult(paper.getLevel());
+            changeLevelDTO.setSn(paper.getSecretNumber());
+            changeLevelDTO.setRedoLevel(paper.getRedoLevel());
+            String imgSrc;
+            String thumbSrc;
+            Long workId = changeLevel.getWorkId();
+            String examNumber = paper.getExamNumber();
+            String areaCode = paper.getAreaCode();
+            Subject subject = paper.getSubject();
+            if (imageConfig.isImageEnc()) {
+                Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, examNumber, String.valueOf(TrialEnum.DEFAULT.getId()));
+                imgSrc = systemConfig.getImageUrl(workId, subject.ordinal(), student.getId(), SystemConstant.IMAGE);
+                thumbSrc = systemConfig.getThumbUrl(workId, subject.ordinal(), student.getId(), SystemConstant.THUMB);
+            } else {
+                imgSrc = systemConfig.getImageUrl(workId, subject.toString(), areaCode, examNumber);
+                thumbSrc = systemConfig.getThumbUrl(workId, subject.toString(), areaCode, examNumber);
+            }
+            changeLevelDTO.setThumbSrc(thumbSrc);
+            changeLevelDTO.setImgSrc(imgSrc);
+            changeLevelDTO.setSample(paper.isSample());
+            changeLevelDTO.setMarkByLeader(paper.isMarkByLeader());
+            changeLevelDTO.setPaperId(changeLevel.getPaperId());
+        }
+        return changeLevelDTO;
+    }
+
+}

+ 6 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -10,10 +10,13 @@ import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Objects;
+
 /**
  * Created by zhengmin on 2016/10/10.
  */
@@ -55,11 +58,12 @@ public class PaperAssembler {
         if (paper != null) {
             paperDTO = new PaperDTO();
             paperDTO.setId(paper.getId());
+            paperDTO.setSubjectName(paper.getSubject().getName());
             paperDTO.setExamNumber(paper.getExamNumber());
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(paper.getScore());
+            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());
@@ -111,7 +115,7 @@ public class PaperAssembler {
             paperDTO.setSn(paper.getSecretNumber());
             paperDTO.setLevel(paper.getLevel());
             paperDTO.setManual(paper.isManual());
-            paperDTO.setScore(paper.getScore());
+            paperDTO.setScore(Objects.isNull(paper.getScore())? null: paper.getScore().intValue());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
             paperDTO.setSample(paper.isSample());

+ 32 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/QuestionStatAssembler.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.marking.assembler;
 
+import cn.com.qmth.stmms.ms.marking.dto.MarkQuestionStatDTO;
 import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -43,4 +44,35 @@ public class QuestionStatAssembler {
         }
         return qpDTO;
     }
+
+    public QuestionStatDTO toProgressDTO(Object[] qStats){
+        QuestionStatDTO qpDTO = null;
+        if(qStats != null){
+            qpDTO = new QuestionStatDTO();
+            qpDTO.setAreaCode(qStats[0]);
+            qpDTO.setAreaName(qStats[1]);
+            qpDTO.setName(qStats[2]);
+            qpDTO.setLeftCount(qStats[3]);
+            qpDTO.setTotalCount(qStats[4]);
+        }
+        return qpDTO;
+    }
+
+
+    public MarkQuestionStatDTO toMarkProgressDTO(Object[] qStats){
+        MarkQuestionStatDTO qpDTO = null;
+        if(qStats != null){
+            qpDTO = new MarkQuestionStatDTO();
+            qpDTO.setId(qStats[0]);
+            qpDTO.setMarkerName(qStats[1]);
+            qpDTO.setName(qStats[2]);
+            qpDTO.setLeftCount(qStats[3]);
+            qpDTO.setTotalCount(qStats[4]);
+            qpDTO.setRejectedCount(qStats[5]);
+            qpDTO.setChangeStage(qStats[6]);
+            qpDTO.setChangeStageScore(qStats[7]);
+            qpDTO.setAreaCode(qStats[8]);
+        }
+        return qpDTO;
+    }
 }

+ 188 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/ChangeLevelDTO.java

@@ -0,0 +1,188 @@
+package cn.com.qmth.stmms.ms.marking.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Created by zhengmin on 2016/10/12.
+ */
+public class ChangeLevelDTO implements Serializable{
+
+    private static final long serialVersionUID = -7780260418569729090L;
+
+    private Long id;
+    private String sn;
+    private String redoLevel;
+    private String level;
+    private Double score;
+    private Object result;
+    private String originLevel;
+    private boolean isRejected;
+    private Long markerId;
+    private String marker;
+    private Date updatedOn;
+    private String imgSrc;
+    private String thumbSrc;
+    private boolean isSample;
+    private boolean markByLeader;
+    private boolean oldRejected;
+    private Long paperId;
+    private Long randomSeqNew;
+    private Integer randomSeq;
+
+    public Integer getRandomSeq() {
+        return randomSeq;
+    }
+
+    public void setRandomSeq(Integer randomSeq) {
+        this.randomSeq = randomSeq;
+    }
+
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public boolean isOldRejected() {
+        return oldRejected;
+    }
+
+    public void setOldRejected(boolean oldRejected) {
+        this.oldRejected = oldRejected;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSn() {
+        return sn;
+    }
+
+    public void setSn(String sn) {
+        this.sn = sn;
+    }
+
+    public Date getUpdatedOn() {
+        return updatedOn;
+    }
+
+    public void setUpdatedOn(Date updatedOn) {
+        this.updatedOn = updatedOn;
+    }
+
+    public String getImgSrc() {
+        return imgSrc;
+    }
+
+    public void setImgSrc(String imgSrc) {
+        this.imgSrc = imgSrc;
+    }
+
+    public boolean isRejected() {
+        return isRejected;
+    }
+
+    public void setRejected(boolean rejected) {
+        isRejected = rejected;
+    }
+
+    public String getMarker() {
+        return marker;
+    }
+
+    public void setMarker(String marker) {
+        this.marker = marker;
+    }
+
+    public String getRedoLevel() {
+        return redoLevel;
+    }
+
+    public void setRedoLevel(String redoLevel) {
+        this.redoLevel = redoLevel;
+    }
+
+    public Object getResult() {
+        return result;
+    }
+
+    public void setResult(Object result) {
+        this.result = result;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public String getThumbSrc() {
+        return thumbSrc;
+    }
+
+    public void setThumbSrc(String thumbSrc) {
+        this.thumbSrc = thumbSrc;
+    }
+
+    public boolean isSample() {
+        return isSample;
+    }
+
+    public void setSample(boolean sample) {
+        isSample = sample;
+    }
+
+    public String getOriginLevel() {
+        return originLevel;
+    }
+
+    public void setOriginLevel(String originLevel) {
+        this.originLevel = originLevel;
+    }
+
+	public boolean isMarkByLeader() {
+		return markByLeader;
+	}
+
+	public void setMarkByLeader(boolean markByLeader) {
+		this.markByLeader = markByLeader;
+	}
+
+    public Long getMarkerId() {
+        return markerId;
+    }
+
+    public void setMarkerId(Long markerId) {
+        this.markerId = markerId;
+    }
+
+    public Long getRandomSeqNew() {
+        return randomSeqNew;
+    }
+
+    public void setRandomSeqNew(Long randomSeqNew) {
+        this.randomSeqNew = randomSeqNew;
+    }
+}

+ 20 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/LevleProgressDTO.java

@@ -16,6 +16,10 @@ public class LevleProgressDTO implements Serializable {
 
     private double progress;
 
+    private String areaName;
+
+    private Long questionId;
+
     public int getTotalCount() {
         return totalCount;
     }
@@ -47,4 +51,20 @@ public class LevleProgressDTO implements Serializable {
     public void setProgress(double progress) {
         this.progress = progress;
     }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
 }

+ 91 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkQuestionStatDTO.java

@@ -0,0 +1,91 @@
+package cn.com.qmth.stmms.ms.marking.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class MarkQuestionStatDTO implements Serializable {
+
+    private static final long serialVersionUID = 1607982936551079429L;
+
+    private Object id;
+    private Object markerName;
+    private Object name;
+    private Object leftCount;
+    private Object totalCount;
+    private Object rejectedCount;
+    private Object changeStage;
+    private Object changeStageScore;
+    private Object areaCode;
+
+    public Object getId() {
+        return id;
+    }
+
+    public void setId(Object id) {
+        this.id = id;
+    }
+
+    public Object getMarkerName() {
+        return markerName;
+    }
+
+    public void setMarkerName(Object markerName) {
+        this.markerName = markerName;
+    }
+
+    public Object getName() {
+        return name;
+    }
+
+    public void setName(Object name) {
+        this.name = name;
+    }
+
+    public Object getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(Object leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    public Object getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(Object totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public Object getRejectedCount() {
+        return rejectedCount;
+    }
+
+    public void setRejectedCount(Object rejectedCount) {
+        this.rejectedCount = rejectedCount;
+    }
+
+    public Object getChangeStage() {
+        return changeStage;
+    }
+
+    public void setChangeStage(Object changeStage) {
+        this.changeStage = changeStage;
+    }
+
+    public Object getChangeStageScore() {
+        return changeStageScore;
+    }
+
+    public void setChangeStageScore(Object changeStageScore) {
+        this.changeStageScore = changeStageScore;
+    }
+
+    public Object getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(Object areaCode) {
+        this.areaCode = areaCode;
+    }
+}

+ 12 - 3
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java

@@ -18,7 +18,7 @@ public class PaperDTO implements Serializable{
     private String sn;
     private String examNumber;
     private String level;
-    private Double score;
+    private Integer score;
     private boolean isArbitrated;
     private boolean isRejected;
     private String redoLevel;
@@ -31,6 +31,7 @@ public class PaperDTO implements Serializable{
     private boolean markByLeader;
     private boolean markedLogic;
     private String areaCode;
+    private String subjectName;
     //抽查成绩
     private Integer inspectScore;
     private String inspectLevel;
@@ -86,11 +87,11 @@ public class PaperDTO implements Serializable{
         this.level = level;
     }
 
-    public Double getScore() {
+    public Integer getScore() {
         return score;
     }
 
-    public void setScore(Double score) {
+    public void setScore(Integer score) {
         this.score = score;
     }
 
@@ -253,4 +254,12 @@ public class PaperDTO implements Serializable{
     public void setTest(int test) {
         this.test = test;
     }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
 }

+ 9 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/QuestionStatDTO.java

@@ -16,6 +16,7 @@ public class QuestionStatDTO implements Serializable {
     private Object leftCount;
     private Object totalCount;
     private Object areaCode;
+    private Object areaName;
 
     private List<MarkerStatDTO> markers;
 
@@ -66,4 +67,12 @@ public class QuestionStatDTO implements Serializable {
     public void setAreaCode(Object areaCode) {
         this.areaCode = areaCode;
     }
+
+    public Object getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(Object areaName) {
+        this.areaName = areaName;
+    }
 }

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

@@ -378,4 +378,58 @@ public class StageControlService {
         return progressDTO;
     }
 
+
+    /**
+     * 分档进度查询
+     *
+     * @param markSubject
+     */
+    public List<LevleProgressDTO> areaProgress(MarkSubject markSubject) {
+        Long workId = markSubject.getWorkId();
+        Subject subject = markSubject.getSubject();
+
+        List<LevleProgressDTO> list = new ArrayList<>();
+        List<ExamQuestion> examQuestions = examQuestionRepo.findByWorkIdAndSubject(workId, markSubject.getSubject());
+        for (ExamQuestion examQuestion : examQuestions) {
+            //已评任务数
+            int areaSuccessCount = paperRepo.countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrueAndTestAndQuestionId(workId, subject, 0, examQuestion.getId());
+            //所有任务数(查询所有有效试卷)
+            int areaTotalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTestAndQuestionId(workId, subject, 0, examQuestion.getId());
+
+            BigDecimal areaWaitTotal = BigDecimal.valueOf(areaTotalCount).subtract(BigDecimal.valueOf(areaSuccessCount));
+            //进度
+            BigDecimal areaProgress = BigDecimal.ZERO.compareTo(BigDecimal.valueOf(areaTotalCount)) == 0 ? BigDecimal.ZERO : BigDecimal.valueOf(areaSuccessCount).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(areaTotalCount), 2, BigDecimal.ROUND_HALF_UP);
+
+            LevleProgressDTO areaProgressDTO = new LevleProgressDTO();
+            areaProgressDTO.setSuccessCount(areaSuccessCount);
+            areaProgressDTO.setTotalCount(areaTotalCount);
+            areaProgressDTO.setWaitCount(areaWaitTotal.intValue());
+            areaProgressDTO.setProgress(areaProgress.doubleValue());
+            areaProgressDTO.setAreaName(examQuestion.getAreaName());
+            areaProgressDTO.setQuestionId(examQuestion.getId());
+            list.add(areaProgressDTO);
+        }
+
+        if(examQuestions!= null && examQuestions.size() > 1) {
+            //已评任务数
+            int successCount = paperRepo.countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrueAndTest(workId, subject, 0);
+            //所有任务数(查询所有有效试卷)
+            int totalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndTest(workId, subject, 0);
+
+            BigDecimal waitTotal = BigDecimal.valueOf(totalCount).subtract(BigDecimal.valueOf(successCount));
+            //进度
+            BigDecimal progress = BigDecimal.ZERO.compareTo(BigDecimal.valueOf(totalCount)) == 0 ? BigDecimal.ZERO : BigDecimal.valueOf(successCount).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(totalCount), 2, BigDecimal.ROUND_HALF_UP);
+
+            LevleProgressDTO progressDTO = new LevleProgressDTO();
+            progressDTO.setSuccessCount(successCount);
+            progressDTO.setTotalCount(totalCount);
+            progressDTO.setWaitCount(waitTotal.intValue());
+            progressDTO.setProgress(progress.doubleValue());
+            progressDTO.setAreaName("所有考区");
+            progressDTO.setQuestionId(null);
+            list.add(progressDTO);
+        }
+        return list;
+    }
+
 }