Explorar o código

美术阅卷改版-参数、进度

xiaof %!s(int64=5) %!d(string=hai) anos
pai
achega
fe40eaa364
Modificáronse 26 ficheiros con 974 adicións e 23 borrados
  1. 1 1
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/AccessConfig.java
  2. 139 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java
  3. 36 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java
  4. 3 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/assembler/WorkOverviewAssembler.java
  5. 35 3
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/WorkService.java
  6. 40 6
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  7. 11 0
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/dto/LoginDTO.java
  8. 46 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/cache/ParamCache.java
  9. 124 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ChangeStage.java
  10. 10 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java
  11. 173 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java
  12. 113 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/TaskPublishSetting.java
  13. 3 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Work.java
  14. 20 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/MarkUser.java
  15. 9 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ChangeStageRepo.java
  16. 7 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkSubjectRepo.java
  17. 50 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  18. 10 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ParamSettingRepo.java
  19. 2 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/StudentRepo.java
  20. 9 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/TaskPublishSettingRepo.java
  21. 4 2
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java
  22. 5 5
      stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java
  23. 51 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  24. 49 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  25. 17 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  26. 7 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

+ 1 - 1
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/AccessConfig.java

@@ -30,7 +30,7 @@ public class AccessConfig extends WebMvcConfigurerAdapter {
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(loginInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/admin/users/login",
+        registry.addInterceptor(loginInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/admin/users/login","/api/login","/api/logout","/api/*/password",
                 "/api/user/login", "/api/user/getClientUser", "/api/exam/students", "/api/upload/student/*", "/api/file/image/**", "/api/marklog/saveCollectLog", "/api/file/ms-slice/**", "/api/subject/collect-config", "/api/file/ms-sheet/**", "/api/oss/**");
     }
 }

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

@@ -0,0 +1,139 @@
+package cn.com.qmth.stmms.ms.admin.api;
+
+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.repository.PaperRepo;
+import cn.com.qmth.stmms.ms.core.repository.ParamSettingRepo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+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 java.util.List;
+
+/**
+ * 全局参数
+ */
+@RestController
+@RequestMapping("/api/param")
+public class ParamApi {
+
+    @Autowired
+    private ParamSettingRepo paramSettingRepo;
+
+    @Autowired
+    private PaperRepo paperRepo;
+
+    /**
+     * 查询
+     *
+     * @param workId
+     * @return
+     */
+    @RequestMapping(value = "/getParam", method = RequestMethod.GET)
+    public ParamSetting getOne(@RequestParam Long workId) {
+        return paramSettingRepo.findByWorkId(workId);
+    }
+
+    /**
+     * 更新采集参数
+     *
+     * @param workId
+     * @param packageScan
+     * @param imageEncrypt
+     * @param nameRule
+     * @param paperStage
+     * @return
+     */
+    @RequestMapping(value = "/collect", method = RequestMethod.POST)
+    public ResponseEntity updateCollectParam(@RequestParam Long workId,
+                                             @RequestParam Integer packageScan,
+                                             @RequestParam Integer imageEncrypt,
+                                             @RequestParam Integer nameRule,
+                                             @RequestParam Integer paperStage) {
+
+        //有采集数据,不能修改采集参数
+        List<Paper> papers = paperRepo.findByWorkId(workId);
+        if (papers == null || papers.isEmpty()) {
+            throw new RuntimeException("该评卷工作已有采集数据,不能修改");
+        }
+
+        //保存采集参数
+        ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
+        if (paramSetting == null) {
+            paramSetting = ParamSetting.init();
+        }
+        paramSetting.setPackageScan(packageScan);
+        paramSetting.setImageEncrypt(imageEncrypt);
+        paramSetting.setNameRule(nameRule);
+        paramSetting.setPaperStage(paperStage);
+        paramSettingRepo.saveAndFlush(paramSetting);
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
+    /**
+     * 更新分档规则参数
+     *
+     * @param workId
+     * @param deviation
+     * @param autoCallback
+     * @param majority
+     * @param cumulativeError
+     * @param levelShowAllPaper
+     * @return
+     */
+    @RequestMapping(value = "/level", method = RequestMethod.POST)
+    public ResponseEntity updateLevelParam(@RequestParam Long workId,
+                                           @RequestParam Integer deviation,
+                                           @RequestParam Integer autoCallback,
+                                           @RequestParam Integer majority,
+                                           @RequestParam Integer cumulativeError,
+                                           @RequestParam Integer levelShowAllPaper) {
+
+        //保存分档参数
+        ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
+        if (paramSetting == null) {
+            paramSetting = ParamSetting.init();
+        }
+        paramSetting.setDeviation(deviation);
+        paramSetting.setAutoCallback(autoCallback);
+        paramSetting.setMajority(majority);
+        paramSetting.setCumulativeError(cumulativeError);
+        paramSetting.setLevelShowAllPaper(levelShowAllPaper);
+        paramSettingRepo.saveAndFlush(paramSetting);
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
+    /**
+     * 打分改档参数
+     *
+     * @param workId
+     * @param roundUp
+     * @param changeStage
+     * @param scoreShowAllPaper
+     * @return
+     */
+    @RequestMapping(value = "/score", method = RequestMethod.POST)
+    public ResponseEntity updateScoreParam(@RequestParam Long workId,
+                                           @RequestParam Integer roundUp,
+                                           @RequestParam Integer changeStage,
+                                           @RequestParam Integer scoreShowAllPaper) {
+        //保存打分参数
+        ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
+        if (paramSetting == null) {
+            paramSetting = ParamSetting.init();
+        }
+        paramSetting.setRoundUp(roundUp);
+        paramSetting.setChangeStage(changeStage);
+        paramSetting.setScoreShowAllPaper(scoreShowAllPaper);
+        paramSettingRepo.saveAndFlush(paramSetting);
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
+}

+ 36 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java

@@ -12,6 +12,8 @@ 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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -175,7 +177,41 @@ public class UserApi {
         if (list != null && list.size() > 0) {
             throw new RuntimeException("已有采集记录,不能删除");
         }
+        //默认采集账号,不能删除
+        MarkUser markUser = markUserRepo.findOne(userId);
+        if (Objects.equals(Role.COLLECTOR.name(), markUser.getRole().name()) && Objects.nonNull(markUser.getDefaultAccount()) && markUser.getDefaultAccount()) {
+            throw new RuntimeException("系统默认采集账号,不能删除");
+        }
         markUserRepo.delete(userId);
     }
 
+
+    /**
+     * 纪检员列表查询
+     *
+     * @param role
+     * @return
+     */
+    @RequestMapping(value = "inspection", method = RequestMethod.GET)
+    public List<MarkUser> listInspection(@RequestParam(required = false, defaultValue = "INSPECTION") Role role) {
+        return markUserRepo.findByRole(role);
+    }
+
+    /**
+     * 纪检员首次登录修改密码、纪检员重置密码
+     *
+     * @param userId
+     * @param password
+     * @return
+     */
+    @RequestMapping(value = "inspection/updatePwd", method = RequestMethod.POST)
+    public ResponseEntity updatePwd(@RequestParam Long userId, @RequestParam(defaultValue = "123456") String password) {
+        MarkUser markUser = markUserRepo.findOne(userId);
+        markUser.setPassword(password);
+        markUser.setPwChangedCount(markUser.getPwChangedCount() + 1);
+        markUserRepo.saveAndFlush(markUser);
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
 }

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

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

+ 35 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/WorkService.java

@@ -1,18 +1,21 @@
 package cn.com.qmth.stmms.ms.admin.service;
 
 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.domain.Level;
 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.Work;
 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.PaperRepo;
-import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
+import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 评卷工作服务
@@ -29,6 +32,12 @@ public class WorkService {
     @Autowired
     private MarkSubjectRepo markSubjectRepo;
 
+    @Autowired
+    private ParamSettingRepo paramSettingRepo;
+
+    @Autowired
+    private LevelRepo levelRepo;
+
     @Resource
     ImageConfig imageConfig;
 
@@ -60,13 +69,36 @@ public class WorkService {
             for (int i = 0; i < subjects.length - 1; i++) {
                 MarkSubject markSubject = new MarkSubject(subjects[i], work.getId());
                 markSubject.setWorkId(work.getId());
+                markSubject.setEnable(true);
                 markSubjectRepo.save(markSubject);
             }
         } else {
             MarkSubject markSubject = new MarkSubject(work.getName(), Subject.CUSTOM, work.getId());
             markSubject.setWorkId(work.getId());
+            markSubject.setEnable(true);
             markSubjectRepo.save(markSubject);
         }
+
+        //新增工作的同时,初始化该工作的全局参数
+        ParamSetting paramSetting = ParamSetting.init();
+        paramSetting.setWorkId(work.getId());
+        paramSettingRepo.save(paramSetting);
+        ParamCache.resetParam(paramSetting);
+
+        //默认增加档位
+        Level A = new Level(work.getId(), "A", 100, 90, Level.LevelType.ADMITED, 95);
+        Level B = new Level(work.getId(), "B", 89, 85, Level.LevelType.ADMITED, 87);
+        Level C = new Level(work.getId(), "C", 84, 80, Level.LevelType.ADMITED, 82);
+        Level D = new Level(work.getId(), "D", 79, 75, Level.LevelType.ADMITED, 77);
+        Level E = new Level(work.getId(), "E", 74, 70, Level.LevelType.ADMITED, 72);
+        Level F = new Level(work.getId(), "F", 69, 65, Level.LevelType.ADMITED, 67);
+        Level G = new Level(work.getId(), "G", 64, 60, Level.LevelType.ADMITED, 62);
+        Level H = new Level(work.getId(), "H", 59, 55, Level.LevelType.ADMITED, 57);
+        Level I = new Level(work.getId(), "I", 54, 50, Level.LevelType.ADMITED, 52);
+        Level J = new Level(work.getId(), "J", 49, 45, Level.LevelType.ADMITED, 47);
+        Level K = new Level(work.getId(), "K", 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);
     }
 
 }

+ 40 - 6
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -15,15 +15,13 @@ 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.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.repository.MarkSubjectRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
-import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
-import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
+import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import net.sf.json.JSONObject;
 import org.apache.commons.codec.binary.Hex;
@@ -69,6 +67,9 @@ public class CollectApi {
     @Autowired
     private MarkSubjectRepo markSubjectRepo;
 
+    @Autowired
+    private ParamSettingRepo paramSettingRepo;
+
     @Autowired
     private DataUploadService dataUploadService;
 
@@ -131,9 +132,40 @@ public class CollectApi {
             collectSubjectDTOs.add(collectSubjectDTO);
         });
         loginDTO.setSubjects(collectSubjectDTOs);
+
+        //采集参数
+        ParamSetting paramSetting = paramSettingRepo.findByWorkId(activeWork.getId());
+        loginDTO.setParamSetting(paramSetting);
         return loginDTO;
     }
 
+
+    @RequestMapping(value = "exam/listStudents/{examNumber}", method = RequestMethod.GET)
+    public List<CollectStuDTO> listStudents(@PathVariable String examNumber) {
+        List<CollectStuDTO> list = new ArrayList<>();
+        Work activeWork = workRepo.findByActiveTrue();
+        Consumer<Student> consumer = (s) -> {
+            CollectStuDTO collectStuDTO = new CollectStuDTO();
+            collectStuDTO.setExamId(activeWork.getId());
+            collectStuDTO.setExamNumber(s.getExamNumber());
+            collectStuDTO.setName(s.getName());
+            collectStuDTO.setSiteCode(s.getAreaName());
+            collectStuDTO.setRoomCode(s.getExamRoom());
+            list.add(collectStuDTO);
+        };
+        Student student = studentRepo.findByWorkIdAndExamNumber(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) {
+        Work activeWork = workRepo.findByActiveTrue();
+        Student student = studentRepo.findByWorkIdAndExamNumber(activeWork.getId(), examNumber);
+        return student;
+    }
+
+
 //    /**
 //     * 获取客户端账户名和密码
 //     *
@@ -198,13 +230,14 @@ public class CollectApi {
     @RequestMapping(value = "file/image/uploadsheet/{workId}/{subjectId}/{fileName}", method = {RequestMethod.POST})
     public void imageUploadSheet(@PathVariable Long workId, @PathVariable Integer subjectId,
                                  @PathVariable String fileName,
+                                 MultipartFile file,
                                  HttpServletRequest request, HttpServletResponse response) throws IOException {
         long start = System.currentTimeMillis();
         LOGGER.info("准备生成原图:{}", start);
         InputStream inputStream = null;
         OutputStream outputStream = null;
         try {
-            inputStream = request.getInputStream();
+            inputStream = file.getInputStream();
 //            inputStream = new FileInputStream(srcFile);
             Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, fileName, String.valueOf(TrialEnum.DEFAULT.getId()));
             Subject subject = Subject.values()[subjectId - 1];
@@ -270,12 +303,13 @@ public class CollectApi {
     @RequestMapping(value = "file/image/upload/{workId}/{subjectId}/{fileName}", method = {RequestMethod.POST})
     public void imageUpload(@PathVariable Long workId, @PathVariable Integer subjectId,
                             @PathVariable String fileName,
+                            MultipartFile file,
                             HttpServletRequest request, HttpServletResponse response) throws IOException {
         long start = System.currentTimeMillis();
         LOGGER.info("准备生成裁切原图和缩略图:{}", start);
         File imageFileTemp = null;
         try {
-            InputStream inputStream = request.getInputStream();
+            InputStream inputStream = file.getInputStream();
 //            inputStream = new FileInputStream(srcFile);
             Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, fileName, String.valueOf(TrialEnum.DEFAULT.getId()));
             Subject subject = Subject.values()[subjectId - 1];

+ 11 - 0
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/dto/LoginDTO.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.stmms.ms.collect.dto;
 
+import cn.com.qmth.stmms.ms.core.domain.ParamSetting;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -13,6 +15,7 @@ public class LoginDTO {
     private Long examId;
     private String examName;
     private boolean imageEnc;
+    private ParamSetting paramSetting;
     private List<CollectSubjectDTO> subjects = new ArrayList<>();
 
     public boolean isImageEnc() {
@@ -62,4 +65,12 @@ public class LoginDTO {
     public void setSubjects(List<CollectSubjectDTO> subjects) {
         this.subjects = subjects;
     }
+
+    public ParamSetting getParamSetting() {
+        return paramSetting;
+    }
+
+    public void setParamSetting(ParamSetting paramSetting) {
+        this.paramSetting = paramSetting;
+    }
 }

+ 46 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/cache/ParamCache.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.stmms.ms.core.cache;
+
+import cn.com.qmth.stmms.ms.core.domain.ParamSetting;
+import cn.com.qmth.stmms.ms.core.repository.ParamSettingRepo;
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class ParamCache {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParamCache.class);
+
+    public static Map<Long, ParamSetting> paramMap = new HashMap<>();
+
+    @Autowired
+    private ParamSettingRepo paramSettingRepo;
+
+    @PostConstruct
+    public void init() {
+        //系统启动中。。。加载codeMap
+        List<ParamSetting> paramSettings = paramSettingRepo.findAll();
+        for (ParamSetting param : paramSettings) {
+            paramMap.put(param.getWorkId(), param);
+        }
+        LOGGER.info("加载参数成功:{}", JSONObject.toJSONString(paramMap));
+    }
+
+    @PreDestroy
+    public void destroy() {
+        //系统运行结束
+        paramMap.clear();
+    }
+
+    public static void resetParam(ParamSetting paramSetting) {
+        paramMap.put(paramSetting.getWorkId(), paramSetting);
+        LOGGER.info("修改参数后重新加载成功:{}", JSONObject.toJSONString(paramMap));
+    }
+}

+ 124 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ChangeStage.java

@@ -0,0 +1,124 @@
+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 java.util.Date;
+
+@Entity
+@Table(name = "change_stage")
+public class ChangeStage {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    private Long workId;
+
+    private String subject;
+
+    private Long paperId;
+
+    private String originalStage;
+
+    private String suggestStage;
+
+    private Integer auditStatus;
+
+    private Long createId;
+
+    private Date createDate;
+
+    private Long auditId;
+
+    private Date auditDate;
+
+    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 String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public String getOriginalStage() {
+        return originalStage;
+    }
+
+    public void setOriginalStage(String originalStage) {
+        this.originalStage = originalStage;
+    }
+
+    public String getSuggestStage() {
+        return suggestStage;
+    }
+
+    public void setSuggestStage(String suggestStage) {
+        this.suggestStage = suggestStage;
+    }
+
+    public Integer getAuditStatus() {
+        return auditStatus;
+    }
+
+    public void setAuditStatus(Integer auditStatus) {
+        this.auditStatus = auditStatus;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    public Long getAuditId() {
+        return auditId;
+    }
+
+    public void setAuditId(Long auditId) {
+        this.auditId = auditId;
+    }
+
+    public Date getAuditDate() {
+        return auditDate;
+    }
+
+    public void setAuditDate(Date auditDate) {
+        this.auditDate = auditDate;
+    }
+}

+ 10 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java

@@ -49,6 +49,9 @@ public class MarkSubject implements Serializable {
     @Column(name = "all_level")
     private boolean allLevel;//是否全部根据档位分配完,0:不是,1:是
 
+    //是否禁用0:禁用 1:启用
+    private boolean enable;
+
     public boolean isAllLevel() {
         return allLevel;
     }
@@ -153,4 +156,11 @@ public class MarkSubject implements Serializable {
         this.sampleCount = sampleCount;
     }
 
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
 }

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

@@ -0,0 +1,173 @@
+package cn.com.qmth.stmms.ms.core.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 全局参数设置
+ */
+@Entity
+@Table(name = "param_setting")
+public class ParamSetting implements Serializable {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @NotNull
+    private Long workId;
+
+    private Integer packageScan;
+
+    private Integer imageEncrypt;
+
+    private Integer nameRule;
+
+    private Integer paperStage;
+
+    private Integer deviation;
+
+    private Integer autoCallback;
+
+    private Integer majority;
+
+    private Integer cumulativeError;
+
+    private Integer levelShowAllPaper;
+
+    private Integer roundUp;
+
+    private Integer changeStage;
+
+    private Integer scoreShowAllPaper;
+
+    public static ParamSetting init(){
+        ParamSetting paramSetting = new ParamSetting();
+        paramSetting.setPackageScan(0);
+        paramSetting.setImageEncrypt(0);
+        paramSetting.setNameRule(1);
+        paramSetting.setPaperStage(0);
+        //仲裁档位差,默认3
+        paramSetting.setDeviation(3);
+        paramSetting.setAutoCallback(0);
+        paramSetting.setMajority(1);
+        paramSetting.setLevelShowAllPaper(1);
+        paramSetting.setRoundUp(1);
+        paramSetting.setChangeStage(0);
+        paramSetting.setScoreShowAllPaper(1);
+        return paramSetting;
+    }
+
+    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 Integer getPackageScan() {
+        return packageScan;
+    }
+
+    public void setPackageScan(Integer packageScan) {
+        this.packageScan = packageScan;
+    }
+
+    public Integer getImageEncrypt() {
+        return imageEncrypt;
+    }
+
+    public void setImageEncrypt(Integer imageEncrypt) {
+        this.imageEncrypt = imageEncrypt;
+    }
+
+    public Integer getNameRule() {
+        return nameRule;
+    }
+
+    public void setNameRule(Integer nameRule) {
+        this.nameRule = nameRule;
+    }
+
+    public Integer getPaperStage() {
+        return paperStage;
+    }
+
+    public void setPaperStage(Integer paperStage) {
+        this.paperStage = paperStage;
+    }
+
+    public Integer getDeviation() {
+        return deviation;
+    }
+
+    public void setDeviation(Integer deviation) {
+        this.deviation = deviation;
+    }
+
+    public Integer getAutoCallback() {
+        return autoCallback;
+    }
+
+    public void setAutoCallback(Integer autoCallback) {
+        this.autoCallback = autoCallback;
+    }
+
+    public Integer getMajority() {
+        return majority;
+    }
+
+    public void setMajority(Integer majority) {
+        this.majority = majority;
+    }
+
+    public Integer getCumulativeError() {
+        return cumulativeError;
+    }
+
+    public void setCumulativeError(Integer cumulativeError) {
+        this.cumulativeError = cumulativeError;
+    }
+
+    public Integer getLevelShowAllPaper() {
+        return levelShowAllPaper;
+    }
+
+    public void setLevelShowAllPaper(Integer levelShowAllPaper) {
+        this.levelShowAllPaper = levelShowAllPaper;
+    }
+
+    public Integer getRoundUp() {
+        return roundUp;
+    }
+
+    public void setRoundUp(Integer roundUp) {
+        this.roundUp = roundUp;
+    }
+
+    public Integer getChangeStage() {
+        return changeStage;
+    }
+
+    public void setChangeStage(Integer changeStage) {
+        this.changeStage = changeStage;
+    }
+
+    public Integer getScoreShowAllPaper() {
+        return scoreShowAllPaper;
+    }
+
+    public void setScoreShowAllPaper(Integer scoreShowAllPaper) {
+        this.scoreShowAllPaper = scoreShowAllPaper;
+    }
+}

+ 113 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/TaskPublishSetting.java

@@ -0,0 +1,113 @@
+package cn.com.qmth.stmms.ms.core.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "task_publish_setting")
+public class TaskPublishSetting {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    private Long workId;
+
+    private String subject;
+
+    private String code;
+
+    private Integer totalCount;
+
+    private Integer successCount;
+
+    private Integer waitCount;
+
+    private Integer sortRule;
+
+    private Integer displayNumber;
+
+    private Integer taskCount;
+
+    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 String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Integer getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(Integer totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public Integer getSuccessCount() {
+        return successCount;
+    }
+
+    public void setSuccessCount(Integer successCount) {
+        this.successCount = successCount;
+    }
+
+    public Integer getWaitCount() {
+        return waitCount;
+    }
+
+    public void setWaitCount(Integer waitCount) {
+        this.waitCount = waitCount;
+    }
+
+    public Integer getSortRule() {
+        return sortRule;
+    }
+
+    public void setSortRule(Integer sortRule) {
+        this.sortRule = sortRule;
+    }
+
+    public Integer getDisplayNumber() {
+        return displayNumber;
+    }
+
+    public void setDisplayNumber(Integer displayNumber) {
+        this.displayNumber = displayNumber;
+    }
+
+    public Integer getTaskCount() {
+        return taskCount;
+    }
+
+    public void setTaskCount(Integer taskCount) {
+        this.taskCount = taskCount;
+    }
+}

+ 3 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Work.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.stmms.ms.core.domain;
 
+import org.hibernate.annotations.Where;
+
 import javax.persistence.*;
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -34,6 +36,7 @@ public class Work implements Serializable{
 
     @OneToMany(cascade = CascadeType.REMOVE)
     @JoinColumn(name = "workId")
+    @Where(clause = "enable = true")
     private List<MarkSubject> subjects = new ArrayList<>();
 
     @Temporal(value = TemporalType.DATE)

+ 20 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/user/MarkUser.java

@@ -47,6 +47,10 @@ public class MarkUser extends AbstractUser {
 
     private boolean levelCallback;
 
+    private Integer displayCount;
+
+    private Boolean defaultAccount;
+
     public boolean getLevelCallback() {
         return levelCallback;
     }
@@ -172,4 +176,20 @@ public class MarkUser extends AbstractUser {
     public void setStandardVolume(boolean standardVolume) {
         this.standardVolume = standardVolume;
     }
+
+    public Integer getDisplayCount() {
+        return displayCount;
+    }
+
+    public void setDisplayCount(Integer displayCount) {
+        this.displayCount = displayCount;
+    }
+
+    public Boolean getDefaultAccount() {
+        return defaultAccount;
+    }
+
+    public void setDefaultAccount(Boolean defaultAccount) {
+        this.defaultAccount = defaultAccount;
+    }
 }

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

@@ -0,0 +1,9 @@
+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> {
+}

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

@@ -16,4 +16,11 @@ public interface MarkSubjectRepo extends JpaRepository<MarkSubject,String> {
      * @return
      */
     public List<MarkSubject> findAllByWorkId(Long workId);
+
+    /**
+     * 查找启用的科目
+     * @param workId
+     * @return
+     */
+    List<MarkSubject> findAllByWorkIdAndEnableTrue(Long workId);
 }

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

@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by zhengmin on 2016/9/23.
@@ -82,6 +83,45 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
             "t.`marker_id` = ? and t.stage = ? and p.is_missing = false and p.is_test = ?  GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
     List<Object[]> countGroupByQuestion(Long markerId, Integer stageId, int test);
 
+    /**
+     * 统计各评卷员各试题已评数及总数(分档阶段)
+     *
+     *
+     * @param name
+     * @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" +
+            "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);
+
+    /**
+     * 考区已评数及总数(分档阶段)
+     *
+     *
+     * @param name
+     * @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" +
+            "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);
+
+    /**
+     * 考区已评数及总数(分档阶段)
+     *
+     *
+     * @param name
+     * @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" +
+            "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);
+
     /**
      * 统计评卷员各试题已评数及总数(分档阶段)
      *
@@ -93,6 +133,16 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
             "t.`marker_id` = ? and t.stage = ? and p.is_missing = false GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
     List<Object[]> countGroupByQuestion(Long markerId, Integer 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,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);
+
     /**
      * 统计指定试卷的所有任务数量
      *

+ 10 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ParamSettingRepo.java

@@ -0,0 +1,10 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.ParamSetting;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ParamSettingRepo extends JpaRepository<ParamSetting, Long> {
+    ParamSetting findByWorkId(Long id);
+}

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

@@ -25,4 +25,6 @@ public interface StudentRepo extends JpaRepository<Student, Long>, JpaSpecificat
     List<Object[]> listMissingBySubject(Long workId, String subject);
 
     void deleteByWorkIdAndTest(Long workId, String test);
+
+    List<Student> findByWorkIdAndTestAndExamRoom(Long workId, String test, String examRoom);
 }

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

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

+ 4 - 2
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java

@@ -4,6 +4,7 @@ import cn.com.qmth.stmms.ms.commons.config.LevelConfig;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateCallback;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateResult;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
+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.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
@@ -235,9 +236,10 @@ public class MarkLogAop {
                 JSONObject js = new JSONObject();
                 js.put("paperId", paper.getId());
                 js.put("type", "autoCallback");
-                js.put("deviation", markingConfig.getDeviation());
+                Integer deviation = Optional.ofNullable(ParamCache.paramMap.get(work.getId()).getDeviation()).orElse(3);
+                js.put("deviation", deviation.intValue());
                 MarkTaskJob markTaskJob = new MarkTaskJob(js.toJSONString(), false, paper.getWorkId());
-                autoCallback(markTasks, markingConfig.getDeviation(), paper, markTaskJob, work.getName());
+                autoCallback(markTasks, deviation.intValue(), paper, markTaskJob, work.getName());
                 markTaskJobRepo.save(markTaskJob);
             }
         }

+ 5 - 5
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java

@@ -2,10 +2,8 @@ package cn.com.qmth.stmms.ms.quartz;
 
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
-import cn.com.qmth.stmms.ms.core.domain.MarkTaskJob;
-import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.domain.Work;
+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.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskJobRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
@@ -126,7 +124,9 @@ public class ScheduledTask implements InitializingBean {
                             if (Objects.equals("levelsLog", type)) {
                                 markingService.levelsLog(markTaskList, paper, m);//档位差日志记录
                             } else if (Objects.equals("autoCallback", type)) {
-                                Integer deviation = jsonObject.get("deviation") == null ? markingConfig.getDeviation() : Integer.parseInt(String.valueOf(jsonObject.get("deviation")));
+                                ParamSetting paramSetting = ParamCache.paramMap.get(work.getId());
+                                Integer deviationParam = paramSetting == null ? 3 : paramSetting.getDeviation();
+                                Integer deviation = jsonObject.get("deviation") == null ? deviationParam.intValue() : Integer.parseInt(String.valueOf(jsonObject.get("deviation")));
                                 markLogAop.autoCallback(markTaskList, deviation, paper, m, work.getName());//自动打回记录
                             }
                         }

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

@@ -14,6 +14,7 @@ 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 org.slf4j.LoggerFactory;
@@ -223,4 +224,54 @@ public class MakrerApi {
         return questionStatDTOs;
     }
 
+    /**
+     * 各评卷员评卷进度、老区评卷进度
+     *
+     * @param marker 评卷员用户对象
+     * @return
+     */
+    @RequestMapping(value = "/stat/progress", method = RequestMethod.GET)
+    public Map markProgress(@PathVariable MarkUser marker) {
+        Map<String, Object> objectMap = new HashMap<>();
+        MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().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);
+
+        //考区进度
+        List<Map> areas = null;
+        if (markSubject.getStage() == MarkStage.SCORE) {
+            areas = markTaskRepo.countGroupByAreaName(markSubject.getSubject().name(), markSubject.getStage().ordinal());
+        } else {
+            areas = markTaskRepo.countGroupByAreaName(markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
+        }
+        objectMap.put("areaProgress", areas);
+
+        //各评卷员评卷进度
+        List<Map> qStats = null;
+        if (markSubject.getStage() == MarkStage.SCORE) {
+            qStats = markTaskRepo.countGroupByQuestionAndMarker(markSubject.getSubject().name(), markSubject.getStage().ordinal());
+        } else {
+            qStats = markTaskRepo.countGroupByQuestionAndMarker(markSubject.getSubject().name(), markSubject.getStage().ordinal(), markSubject.getTest());
+        }
+        objectMap.put("markerProgress", qStats);
+        return objectMap;
+    }
+
 }

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

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.ms.marking.api;
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
@@ -15,6 +16,8 @@ import cn.com.qmth.stmms.ms.marking.dto.LevleProgressDTO;
 import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
 import cn.com.qmth.stmms.ms.marking.service.StageControlService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -65,7 +68,7 @@ public class MarkSubjectApi {
      */
     @RequestMapping(value = "getAllSubjectStage/{workId}", method = RequestMethod.GET)
     public List<MarkSubject> getAllSubjectStage(@PathVariable Long workId) {
-        return markSubjectRepo.findAllByWorkId(workId);
+        return markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
     }
 
     /**
@@ -256,4 +259,49 @@ public class MarkSubjectApi {
     public LevleProgressDTO progress(@PathVariable MarkSubject markSubject) {
         return stageControlService.progress(markSubject);
     }
+
+    /**
+     * 查询所有科目
+     * @param workId
+     * @return
+     */
+    @RequestMapping(value = "{workId}/subjects", method = RequestMethod.GET)
+    public List<MarkSubject> subjects(@PathVariable Long workId) {
+        return markSubjectRepo.findAllByWorkId(workId);
+    }
+
+    /**
+     * 更新科目状态
+     *
+     * @param markSubject 评卷科目id
+     */
+    @RequestMapping(value = "{markSubject}/updateEnable", method = RequestMethod.POST)
+    public ResponseEntity updateEnable(@PathVariable MarkSubject markSubject) {
+        //有采集数据,不能禁用
+        List<Paper> papers = paperRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
+        if (papers == null || papers.isEmpty()) {
+            throw new RuntimeException("已有数据,不可"+ (markSubject.isEnable()? "禁用":"启用"));
+        }
+        markSubject.setEnable(!markSubject.isEnable());
+        markSubjectRepo.saveAndFlush(markSubject);
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
+    /**
+     * 更新科目名称
+     *
+     * @param markSubject 评卷科目id
+     */
+    @RequestMapping(value = "{markSubject}/updateName", method = RequestMethod.POST)
+    public ResponseEntity updateName(@PathVariable String subjectId, MarkSubject markSubject) {
+        MarkSubject markSubjectT = markSubjectRepo.findOne(subjectId);
+        //有采集数据,不能禁用
+        List<Paper> papers = paperRepo.findByWorkIdAndSubject(markSubjectT.getWorkId(), markSubjectT.getSubject());
+        if (papers == null || papers.isEmpty()) {
+            throw new RuntimeException("已有数据,不能修改科目名称");
+        }
+        markSubjectT.setName(markSubject.getName());
+        markSubjectRepo.saveAndFlush(markSubjectT);
+        return new ResponseEntity(HttpStatus.OK);
+    }
 }

+ 17 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -17,6 +17,7 @@ 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;
@@ -124,7 +125,17 @@ public class PaperApi {
                                      @RequestParam(required = false) Long endNumber,
                                      @RequestParam(required = false) Boolean isManual,
                                      @RequestParam(required = false) Boolean missing,
+                                     @RequestParam(required = false) String studentName,
+                                     @RequestParam(required = false) String sortBy,
                                      Pageable pageable) {
+        Sort sort = null;
+        if(Objects.equals("1", sortBy)){
+            sort = new Sort(Sort.Direction.DESC, "updatedOn");
+        }
+        if(Objects.equals("2", sortBy)){
+            sort = new Sort(Sort.Direction.ASC, "examNumber");
+        }
+        Pageable pageable1 = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), sort);
         Specification<Paper> specification = (root, query, builder) -> {
             List<Predicate> predicates = new ArrayList<>();
             predicates.add(builder.equal(root.get("workId"), workId));
@@ -141,15 +152,19 @@ public class PaperApi {
             if (Objects.nonNull(missing)) {
                 predicates.add(builder.equal(root.get("isMissing"), missing));
             }
+            //考生姓名
+            if(Objects.nonNull(studentName)){
+                predicates.add(builder.equal(root.get("studentName"), studentName));
+            }
             predicates.add(builder.equal(root.get("test"), 0));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
         List<PaperDTO> paperDTOs = new ArrayList<>();
-        Page<Paper> paperPage = paperRepo.findAll(specification, pageable);
+        Page<Paper> paperPage = paperRepo.findAll(specification, pageable1);
         paperPage.getContent().forEach(p -> {
             paperDTOs.add(paperAssembler.toDTO(p));
         });
-        return new PageableDTO(paperDTOs, paperPage.getTotalElements(), paperPage.getTotalPages(), pageable.getPageNumber());
+        return new PageableDTO(paperDTOs, paperPage.getTotalElements(), paperPage.getTotalPages(), pageable1.getPageNumber());
     }
 
     /**

+ 7 - 3
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.ms.marking.service;
 import cn.com.qmth.stmms.ms.commons.config.LevelConfig;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateCallback;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateResult;
+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.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
@@ -132,7 +133,8 @@ public class MarkingService {
         if (leftCount == 0) {
             MarkTask[] sources = new MarkTask[markTasks.size()];
             //定档
-            DeterResult determine = determineLevelService.determine(markingConfig.isMajority(), markTasks.toArray(sources));
+            Integer majority = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getMajority()).orElse(1);
+            DeterResult determine = determineLevelService.determine(majority.intValue() == 1 ? true : false, markTasks.toArray(sources));
             //1.过半定档
             if (Objects.nonNull(determine) && Objects.nonNull(determine.getResult()) && determine.getDeterType() == DetermineLevelService.DeterType.MAJORITY) {
                 paper.determineLevel(determine.getResult());
@@ -141,7 +143,8 @@ public class MarkingService {
                 levelsLog(markTasks, paper);
             } else {
                 int[] values = markTasks.stream().mapToInt(MarkTask::getLevelValue).toArray();
-                boolean result = ArbitrationService.arbitrate(markingConfig.getDeviation(), values);
+                Integer deviation = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getDeviation()).orElse(3);
+                boolean result = ArbitrationService.arbitrate(deviation.intValue(), values);
                 //2.最大落差超过仲裁档位,则仲裁打回
                 if (result) {
                     //仲裁
@@ -331,7 +334,8 @@ public class MarkingService {
             OptionalDouble finalScore = markTasks.stream().map(m -> m.getResult())
                     .mapToInt(Integer::valueOf).average();
             //湖北省,平均分非零进一
-            double fs = markingConfig.isRoundUp() ? Math.ceil(finalScore.orElse(0)) : Math.round(finalScore.orElse(0));
+            Integer roundUp = Optional.ofNullable(ParamCache.paramMap.get(markTask.getWorkId()).getRoundUp()).orElse(1);
+            double fs = roundUp.intValue() == 1 ? Math.ceil(finalScore.orElse(0)) : Math.round(finalScore.orElse(0));
             paper.setScore(fs);
             paperRepo.save(paper);
         }