فهرست منبع

任务投放、重评

xiaof 5 سال پیش
والد
کامیت
ee17ee9726
24فایلهای تغییر یافته به همراه549 افزوده شده و 30 حذف شده
  1. 17 0
      sql/更新脚本.sql
  2. 8 0
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/api/AuthApi.java
  3. 2 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java
  4. 1 1
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java
  5. 20 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLog.java
  6. 6 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLogOperType.java
  7. 10 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  8. 7 2
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  9. 18 2
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  10. 11 6
      stmms-ms-log/pom.xml
  11. 72 4
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java
  12. 55 0
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java
  13. 5 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  14. 15 3
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  15. 4 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  16. 118 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/TaskApi.java
  17. 2 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java
  18. 9 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  19. 50 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/LevleProgressDTO.java
  20. 10 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java
  21. 20 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  22. 20 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java
  23. 2 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java
  24. 67 6
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 17 - 0
sql/更新脚本.sql

@@ -4,3 +4,20 @@ ADD COLUMN `standard_volume` BIT(1) NOT NULL default false COMMENT '设置标准
 
 
 ALTER TABLE `paper`
 ALTER TABLE `paper`
 ADD COLUMN `exam_room` VARCHAR(255) NULL COMMENT '考点' AFTER `random_seq`;
 ADD COLUMN `exam_room` VARCHAR(255) NULL COMMENT '考点' AFTER `random_seq`;
+
+
+-- 2019.11.04 by xf
+ALTER TABLE `mark_log`
+ADD COLUMN `login_time` DATETIME NULL COMMENT '登录时间(采集专用)' AFTER `student_name`,
+ADD COLUMN `logout_time` DATETIME NULL COMMENT '登出时间(采集专用)' AFTER `login_time`;
+
+
+ALTER TABLE `paper`
+ADD COLUMN `is_test` BIT(1) NOT NULL DEFAULT false COMMENT '是否试评' AFTER `exam_room`,
+ADD COLUMN `is_active` BIT(1) NOT NULL DEFAULT false COMMENT '是否激活' AFTER `is_test`,
+ADD COLUMN `batch_no` bigint(45) COMMENT '批次号' AFTER `is_active`;
+
+-- 2019.11.05 by xf
+ALTER TABLE `mark_task`
+ADD COLUMN `is_active` BIT(1) NULL DEFAULT false COMMENT '是否激活' AFTER `random_seq_new`;
+

+ 8 - 0
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/api/AuthApi.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.ms.accesscontrol.api;
 package cn.com.qmth.stmms.ms.accesscontrol.api;
 
 
 import cn.com.qmth.stmms.ms.accesscontrol.config.LoginConfig;
 import cn.com.qmth.stmms.ms.accesscontrol.config.LoginConfig;
+import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
@@ -66,6 +67,13 @@ public class AuthApi {
             if (!domain.isEnabled()) {
             if (!domain.isEnabled()) {
                 throw new RuntimeException("用户被禁用");
                 throw new RuntimeException("用户被禁用");
             }
             }
+
+            //科组长生成随机数
+            if(Objects.equals(Role.MARK_LEADER, domain.getRole())){
+                if(RandomUtil.randomMap.size() == 0){
+                    RandomUtil.getRandom(domain.getWorkId(), true);
+                }
+            }
             domain.setSessionId(request.getSession().getId());
             domain.setSessionId(request.getSession().getId());
             markUserRepo.save(domain);
             markUserRepo.save(domain);
         }
         }

+ 2 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -287,6 +287,8 @@ public class DataUploadService {
                     }
                     }
                     return null;
                     return null;
                 } catch (RuntimeException e) {
                 } catch (RuntimeException e) {
+                    //手动回滚
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                     ExcelError excelError = new ExcelError();
                     ExcelError excelError = new ExcelError();
                     excelError.setExcelErrorType(e.getMessage());
                     excelError.setExcelErrorType(e.getMessage());
                     return excelError;
                     return excelError;

+ 1 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java

@@ -88,7 +88,7 @@ public class TrialService {
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
         MarkSubject markSubject = markSubjectList.get(0);
         MarkSubject markSubject = markSubjectList.get(0);
         //分配任务
         //分配任务
-        stageControlService.goNext(markSubject);
+        stageControlService.goNext(markSubject, 0);
         //修改科目test
         //修改科目test
         markSubject.setTest(TrialEnum.START_TRIAL.getId());
         markSubject.setTest(TrialEnum.START_TRIAL.getId());
         markSubjectRepo.save(markSubject);
         markSubjectRepo.save(markSubject);

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

@@ -66,6 +66,10 @@ public class MarkLog implements Serializable {
 //    @ApiModelProperty(value = "阶段", example = "3")
 //    @ApiModelProperty(value = "阶段", example = "3")
     private MarkStage stage;
     private MarkStage stage;
 
 
+    private Date loginTime;
+
+    private Date logoutTime;
+
     public MarkLog() {
     public MarkLog() {
 
 
     }
     }
@@ -241,4 +245,20 @@ public class MarkLog implements Serializable {
     public void setRemark(String remark) {
     public void setRemark(String remark) {
         this.remark = remark;
         this.remark = remark;
     }
     }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public Date getLogoutTime() {
+        return logoutTime;
+    }
+
+    public void setLogoutTime(Date logoutTime) {
+        this.logoutTime = logoutTime;
+    }
 }
 }

+ 6 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLogOperType.java

@@ -47,7 +47,12 @@ public enum MarkLogOperType {
     /**
     /**
      * 标准卷设置
      * 标准卷设置
      */
      */
-    CRITERION_PAPER_SET(8, "标准卷设置");
+    CRITERION_PAPER_SET(8, "标准卷设置"),
+
+    /**
+     * 采集
+     */
+    COLLECT(9, "采集");
 
 
     private int id;
     private int id;
 
 

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

@@ -130,6 +130,8 @@ public class Paper implements Serializable {
     @Column(name = "is_active")
     @Column(name = "is_active")
     private boolean active; //是否激活(false:不是,true:是)
     private boolean active; //是否激活(false:不是,true:是)
 
 
+    private Long batchNo;
+
     public int getTest() {
     public int getTest() {
         return test;
         return test;
     }
     }
@@ -476,4 +478,12 @@ public class Paper implements Serializable {
     public void setExamRoom(String examRoom) {
     public void setExamRoom(String examRoom) {
         this.examRoom = examRoom;
         this.examRoom = examRoom;
     }
     }
+
+    public Long getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(Long batchNo) {
+        this.batchNo = batchNo;
+    }
 }
 }

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

@@ -101,8 +101,8 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      * @return
      * @return
      */
      */
     @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
     @Query(value = "SELECT q.`id`,q.`name`,SUM(IF(t.`result` IS NULL,1,0)),COUNT(t.question_id), q.area_code \n" +
-            "FROM mark_task t LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` WHERE " +
-            "t.`marker_id` = ? and t.stage = ? GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
+            "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.`marker_id` = ? and t.stage = ? and p.is_missing = false and t.is_active=false GROUP BY t.`question_id` ORDER BY q.`id`", nativeQuery = true)
     List<Object[]> countGroupByQuestion(Long markerId, Integer stageId);
     List<Object[]> countGroupByQuestion(Long markerId, Integer stageId);
 
 
     /**
     /**
@@ -172,4 +172,9 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
             "WHERE t.workId = ?1 and t.subject = ?2 and t.markerId = ?3 and t.stage = ?4 and t.questionId = ?5 ")
             "WHERE t.workId = ?1 and t.subject = ?2 and t.markerId = ?3 and t.stage = ?4 and t.questionId = ?5 ")
     Integer findRandomSeqByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId);
     Integer findRandomSeqByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId);
 
 
+    @Query(value = "SELECT count(1) from mark_task m left join paper p on m.paper_id = p.id where m.question_id = ?1 and m.marker_id = ?2 and m.stage = ?3 and m.result is null and p.is_missing = ?4", nativeQuery = true)
+    int countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(Long questionId, Long markerId, int stage, boolean isMissing);
+
+    @Query(value = "SELECT count(1) from mark_task m left join paper p on m.paper_id = p.id where m.question_id = ?1 and m.stage = ?2 and m.result =?3 and p.is_missing = ?4", nativeQuery = true)
+    int countByQuestionIdAndStageAndResultAndIsMissing(Long questionId, int stage, String result, boolean isMissing);
 }
 }

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

@@ -26,6 +26,13 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
 
     List<Paper> findByWorkIdAndSubjectAndIsMissingAndTest(Long workId, Subject subject, boolean isMissing, int test);
     List<Paper> findByWorkIdAndSubjectAndIsMissingAndTest(Long workId, Subject subject, boolean isMissing, int test);
 
 
+    @Query(value = "select * from paper p where p.work_id = ?1 and p.subject = ?2 and p.is_missing = false and p.is_active = false limit ?3", nativeQuery = true)
+    List<Paper> findByWorkIdAndSubjectAndIsMissingAndIsActive(Long workId, Subject subject, int taskCount);
+
+    List<Paper> findByWorkIdAndSubjectAndIsMissingFalseAndActiveFalse(Long workId, Subject subject);
+
+    List<Paper> findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndBatchNoNotNull(Long workId, Subject subject, Sort sort);
+
     List<Paper> findByWorkIdAndSubject(Long workId, Subject subject, Sort sort);
     List<Paper> findByWorkIdAndSubject(Long workId, Subject subject, Sort sort);
 
 
     List<Paper> findByQuestionId(Long questionId, Sort sort);
     List<Paper> findByQuestionId(Long questionId, Sort sort);
@@ -66,8 +73,9 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
             "SUM(IF(p.`is_arbitrated` = 1, 1, 0))" +
             "SUM(IF(p.`is_arbitrated` = 1, 1, 0))" +
             "FROM paper p " +
             "FROM paper p " +
             "WHERE p.`question_id` = ? and p.is_missing = false " +
             "WHERE p.`question_id` = ? and p.is_missing = false " +
+            "AND p.batch_no = (select max(batch_no) from paper where question_id = ?)"+
             "GROUP BY p.`level` ORDER BY p.`level`", nativeQuery = true)
             "GROUP BY p.`level` ORDER BY p.`level`", nativeQuery = true)
-    List<Object[]> countGroupByLevel(Long questionId);
+    List<Object[]> countGroupByLevel(Long questionId, Long questionId1);
 
 
     /**
     /**
      * 统计workId各档位数量
      * 统计workId各档位数量
@@ -90,7 +98,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
      * @return
      * @return
      */
      */
     @Query(value = "SELECT p.`question_id`,p.question_name,SUM(IF(p.score IS NULL,1,0)),COUNT(p.`question_id`) ,MAX(p.area_code) \n" +
     @Query(value = "SELECT p.`question_id`,p.question_name,SUM(IF(p.score IS NULL,1,0)),COUNT(p.`question_id`) ,MAX(p.area_code) \n" +
-            "FROM paper p WHERE p.`work_id` = ? AND p.`subject` = ? AND p.`is_test` = ? " +
+            "FROM paper p WHERE p.`work_id` = ? AND p.`subject` = ? AND p.`is_test` = ? AND p.is_missing = false " +
             "GROUP BY p.`question_id` ,p.question_name ORDER BY p.`question_id`", nativeQuery = true)
             "GROUP BY p.`question_id` ,p.question_name ORDER BY p.`question_id`", nativeQuery = true)
     List<Object[]> countGroupByQuestionForScore(Long workId, String string, int test);
     List<Object[]> countGroupByQuestionForScore(Long workId, String string, int test);
 
 
@@ -208,5 +216,13 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
 
     void deleteByWorkIdAndSubjectAndTest(Long workId, Subject subject, int test);
     void deleteByWorkIdAndSubjectAndTest(Long workId, Subject subject, int test);
 
 
+    int countByWorkIdAndSubjectAndIsMissingFalse(Long workId, Subject subject);
+
+    int countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNull(Long workId, Subject subject);
+
+    int countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNull(Long workId, Subject subject);
+
+    int countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrue(Long workId, Subject subject);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 }
 }

+ 11 - 6
stmms-ms-log/pom.xml

@@ -16,7 +16,7 @@
             <groupId>cn.com.qmth</groupId>
             <groupId>cn.com.qmth</groupId>
             <artifactId>stmms-ms-commons</artifactId>
             <artifactId>stmms-ms-commons</artifactId>
         </dependency>
         </dependency>
-		<dependency>
+        <dependency>
             <groupId>cn.com.qmth</groupId>
             <groupId>cn.com.qmth</groupId>
             <artifactId>stmms-ms-core</artifactId>
             <artifactId>stmms-ms-core</artifactId>
         </dependency>
         </dependency>
@@ -24,13 +24,18 @@
             <groupId>cn.com.qmth</groupId>
             <groupId>cn.com.qmth</groupId>
             <artifactId>stmms-ms-marking</artifactId>
             <artifactId>stmms-ms-marking</artifactId>
         </dependency>
         </dependency>
-                <dependency>
+        <dependency>
+            <groupId>cn.com.qmth</groupId>
+            <artifactId>stmms-ms-collect</artifactId>
+            <version>2.4.0</version>
+        </dependency>
+        <dependency>
             <groupId>cn.com.qmth</groupId>
             <groupId>cn.com.qmth</groupId>
             <artifactId>stmms-ms-accesscontrol</artifactId>
             <artifactId>stmms-ms-accesscontrol</artifactId>
         </dependency>
         </dependency>
-        <dependency>  
-    		<groupId>org.springframework.boot</groupId>
-    		<artifactId>spring-boot-starter-aop</artifactId>
-		</dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
 </project>
 </project>

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

@@ -1,12 +1,12 @@
 package cn.com.qmth.stmms.ms.log.aop;
 package cn.com.qmth.stmms.ms.log.aop;
 
 
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
-import cn.com.qmth.stmms.ms.core.domain.MarkLog;
-import cn.com.qmth.stmms.ms.core.domain.MarkLogOperType;
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
-import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
 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.StudentRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
 import cn.com.qmth.stmms.ms.marking.dto.MarkTaskDTO;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
@@ -56,6 +56,12 @@ public class MarkLogAop {
     @Autowired
     @Autowired
     private MarkLogRepo markLogRepo;
     private MarkLogRepo markLogRepo;
 
 
+    @Autowired
+    private StudentRepo studentRepo;
+
+    @Autowired
+    private PaperRepo paperRepo;
+
     @Autowired
     @Autowired
     SqlUtil sqlUtil;
     SqlUtil sqlUtil;
 
 
@@ -73,6 +79,13 @@ public class MarkLogAop {
     public void markAspect() {
     public void markAspect() {
     }
     }
 
 
+    /**
+     * 采集端采集试卷切入点
+     */
+    @Pointcut("execution(* cn.com.qmth.stmms.ms.collect.api.CollectApi.imageUploadSheet(..))")
+    public void collectAspect() {
+    }
+
     /**
     /**
      * 标准卷设置、定档设置、档位打回切入
      * 标准卷设置、定档设置、档位打回切入
      *
      *
@@ -189,6 +202,61 @@ public class MarkLogAop {
         markLogRepo.save(markLog);
         markLogRepo.save(markLog);
     }
     }
 
 
+    /**
+     * 采集切入
+     *
+     * @param joinPoint
+     * @param result
+     * @throws Exception
+     */
+    @AfterReturning(value = "collectAspect()", returning = RESULT)
+    public void afterReturnCollectPoint(JoinPoint joinPoint, Object result) throws Exception {
+        Map<String, Object> map = getAspectCommon(joinPoint);
+        JSONArray jsonArgsArray = (JSONArray) map.get(PARAM_ARGS);
+        MarkUser markUser = (MarkUser) map.get(MARK_USER);
+//        JSONObject aopResult = JSONObject.parseObject(JSONObject.toJSONString(result));
+
+        // 参数 workdId, subjectId, examNumber
+        JSONObject arg0 = (JSONObject) jsonArgsArray.get(0);
+        Long workId = JSONObject.parseObject(arg0.toJSONString(), Long.class);
+        JSONObject arg1 = (JSONObject) jsonArgsArray.get(1);
+        int subjectId = JSONObject.parseObject(arg1.toJSONString(), int.class);
+        Subject subject = Subject.values()[subjectId - 1];
+        JSONObject arg3 = (JSONObject) jsonArgsArray.get(2);
+        String examNumber = JSONObject.parseObject(arg3.toJSONString(), String.class);
+
+        //学生信息
+        Student student = studentRepo.findByWorkIdAndExamNumber(workId, examNumber);
+
+        //试卷信息
+        List<Paper> paperList = paperRepo.findByWorkIdAndExamNumber(workId, examNumber);
+        Paper paper = paperList.get(0);
+
+        Integer operType = MarkLogOperType.COLLECT.getId();
+
+        MarkLog markLog = new MarkLog();
+        markLog.setCreateUserId(markUser.getId());
+        markLog.setCreateUserName(markUser.getName());
+        markLog.setCreateRole(markUser.getRole().getName());
+        markLog.setSubject(subject.toString());
+        markLog.setExamNumber(examNumber);
+        markLog.setStudentName(student.getName());
+        markLog.setOperType(operType);
+        markLog.setWorkId(workId);
+        markLog.setPaperId(paper.getId());
+        markLog.setStage(MarkStage.INIT);
+        //识别方式
+        markLog.setRemark("");
+        //操作时间
+        markLog.setCreateTime(new Date());
+        //todo
+        //登录时间
+        //退出时间
+        LOGGER.info("markLog:{}", JSONObject.toJSONString(markLog));
+        //分档、打分、回评档位、回评分数、档位打回、档位打回回评end
+        markLogRepo.save(markLog);
+    }
+
     /**
     /**
      * 查询处于哪个档位公用
      * 查询处于哪个档位公用
      *
      *

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

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.log.controller;
 
 
 import cn.com.qmth.stmms.ms.commons.utils.specification.PagingAndSortingDTO;
 import cn.com.qmth.stmms.ms.commons.utils.specification.PagingAndSortingDTO;
 import cn.com.qmth.stmms.ms.core.domain.MarkLog;
 import cn.com.qmth.stmms.ms.core.domain.MarkLog;
+import cn.com.qmth.stmms.ms.core.domain.MarkLogOperType;
 import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkLogRepo;
 //import io.swagger.annotations.Api;
 //import io.swagger.annotations.Api;
 //import io.swagger.annotations.ApiOperation;
 //import io.swagger.annotations.ApiOperation;
@@ -76,4 +77,58 @@ public class MarkLogController {
         return new PagingAndSortingDTO(result.getNumber(), result.getSize(), result.getTotalPages(),
         return new PagingAndSortingDTO(result.getNumber(), result.getSize(), result.getTotalPages(),
                 result.getTotalElements(), result.getContent());
                 result.getTotalElements(), result.getContent());
     }
     }
+
+    /**
+     * 采集日志
+     * @param subject
+     * @param examNumber
+     * @param studentName
+     * @param createUserId
+     * @param startTime
+     * @param endTime
+     * @param curPage
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/selectCollectMarkLog")
+    public PagingAndSortingDTO selectCollectMarkLog(
+            @RequestParam(required = false) String subject,
+            @RequestParam(required = false) Long examNumber,
+            @RequestParam(required = false) String studentName,
+            @RequestParam(required = false) String createUserId,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
+            @RequestParam Integer curPage,
+            @RequestParam Integer pageSize) {
+        Pageable pageable = new PageRequest(curPage, pageSize, Sort.Direction.DESC, "createTime");
+        Specification<MarkLog> specification = (root, query, cb) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (Objects.nonNull(subject)) {
+                predicates.add(cb.equal(root.get("subject").as(String.class), subject));
+            }
+            if (Objects.nonNull(examNumber)) {
+                predicates.add(cb.equal(root.get("examNumber").as(String.class), examNumber));
+            }
+            if (Objects.nonNull(studentName)) {
+                predicates.add(cb.like(root.get("studentName").as(String.class), "%" + studentName + "%"));
+            }
+            if (Objects.nonNull(createUserId)) {
+                predicates.add(cb.equal(root.get("createUserId").as(String.class), createUserId));
+            }
+            if (Objects.nonNull(startTime)) {
+                //大于或等于传入时间
+                predicates.add(cb.greaterThanOrEqualTo(root.get("createTime").as(String.class), startTime));
+            }
+            if (Objects.nonNull(endTime)) {
+                //小于或等于传入时间
+                predicates.add(cb.lessThanOrEqualTo(root.get("createTime").as(String.class), endTime));
+            }
+            //采集端
+            predicates.add(cb.equal(root.get("operType").as(Integer.class), MarkLogOperType.COLLECT.getId()));
+            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+        Page<MarkLog> result = markLogRepo.findAll(specification, pageable);
+        return new PagingAndSortingDTO(result.getNumber(), result.getSize(), result.getTotalPages(),
+                result.getTotalElements(), result.getContent());
+    }
 }
 }

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

@@ -113,16 +113,18 @@ public class MakrerApi {
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
         Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
         //统计workId下各考点的数量
         //统计workId下各考点的数量
-        paperRepo.countGroupByLevel(questionId)
+        paperRepo.countGroupByLevel(questionId, questionId)
                 .forEach(o -> {
                 .forEach(o -> {
                     LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
                     LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
                     levelStatDTO.setGcount(levelStatDTO.getCount());
                     levelStatDTO.setGcount(levelStatDTO.getCount());
                     if (Objects.isNull(levelStatDTO.getId())) {
                     if (Objects.isNull(levelStatDTO.getId())) {
                         //求任务数为null的条数
                         //求任务数为null的条数
-                        int count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.LEVEL);
+//                        int count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.LEVEL);
+                        int count = markTaskRepo.countByQuestionIdAndMarkerIdAndStageAndResultIsNullAndIsMissing(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), false);
                         levelStatDTO.setCount(count);
                         levelStatDTO.setCount(count);
                     } else {
                     } else {
-                        int count = markTaskRepo.countByQuestionIdAndStageAndResult(questionId, MarkStage.LEVEL, levelStatDTO.getId().toString());
+//                        int count = markTaskRepo.countByQuestionIdAndStageAndResult(questionId, MarkStage.LEVEL, levelStatDTO.getId().toString());
+                        int count = markTaskRepo.countByQuestionIdAndStageAndResultAndIsMissing(questionId, MarkStage.LEVEL.ordinal(), levelStatDTO.getId().toString(), false);
                         levelStatDTO.setCount(count);
                         levelStatDTO.setCount(count);
                     }
                     }
                     levelStatDTOs.add(levelStatDTO);
                     levelStatDTOs.add(levelStatDTO);

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

@@ -11,6 +11,7 @@ import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.marking.assembler.LevelStatAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.LevelStatAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.QuestionStatAssembler;
 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.LevelStatDTO;
+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.dto.QuestionStatDTO;
 import cn.com.qmth.stmms.ms.marking.service.StageControlService;
 import cn.com.qmth.stmms.ms.marking.service.StageControlService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -127,7 +128,7 @@ public class MarkSubjectApi {
     @RequestMapping(value = "{markSubject}/stat/levels", method = RequestMethod.GET)
     @RequestMapping(value = "{markSubject}/stat/levels", method = RequestMethod.GET)
     public List<LevelStatDTO> levelStat(HttpServletRequest request, @PathVariable MarkSubject markSubject, @RequestParam Long questionId) {
     public List<LevelStatDTO> levelStat(HttpServletRequest request, @PathVariable MarkSubject markSubject, @RequestParam Long questionId) {
         List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
         List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
-        paperRepo.countGroupByLevel(questionId)
+        paperRepo.countGroupByLevel(questionId, questionId)
                 .forEach(o -> {
                 .forEach(o -> {
                     levelStatDTOs.add(levelStatAssembler.toDTO(o));
                     levelStatDTOs.add(levelStatAssembler.toDTO(o));
                 });
                 });
@@ -233,9 +234,20 @@ public class MarkSubjectApi {
      * 该评卷科目进入下一阶段
      * 该评卷科目进入下一阶段
      *
      *
      * @param markSubject 评卷科目id
      * @param markSubject 评卷科目id
+     * @param taskCount 分配任务数量
      */
      */
     @RequestMapping(value = "{markSubject}", method = RequestMethod.PATCH)
     @RequestMapping(value = "{markSubject}", method = RequestMethod.PATCH)
-    public void goNext(@PathVariable MarkSubject markSubject) throws Exception {
-        stageControlService.goNext(markSubject);
+    public void goNext(@PathVariable MarkSubject markSubject, @RequestParam(value = "taskCount", defaultValue = "0") int taskCount) throws Exception {
+        stageControlService.goNext(markSubject, taskCount);
+    }
+
+    /**
+     * 查询分档进度
+     *
+     * @param markSubject 评卷科目id
+     */
+    @RequestMapping(value = "{markSubject}/progress", method = RequestMethod.GET)
+    public LevleProgressDTO progress(@PathVariable MarkSubject markSubject) {
+        return stageControlService.progress(markSubject);
     }
     }
 }
 }

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

@@ -90,6 +90,9 @@ public class MarkTaskApi {
             if (isSample != null) {
             if (isSample != null) {
                 predicates.add(builder.equal(root.get("paper").get("isSample"), isSample));
                 predicates.add(builder.equal(root.get("paper").get("isSample"), isSample));
             }
             }
+            predicates.add(builder.equal(root.get("paper").get("isMissing"), false));
+            predicates.add(builder.equal(root.get("paper").get("active"), true));
+            predicates.add(builder.equal(root.get("isActive"), false));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
         };
 
 
@@ -116,6 +119,7 @@ public class MarkTaskApi {
         if (stage == MarkStage.SCORE && level == null) {
         if (stage == MarkStage.SCORE && level == null) {
             Collections.sort(markTaskDTOs, (MarkTaskDTO a, MarkTaskDTO b) -> a.getLevel().compareTo(b.getLevel()));
             Collections.sort(markTaskDTOs, (MarkTaskDTO a, MarkTaskDTO b) -> a.getLevel().compareTo(b.getLevel()));
         }
         }
+        Collections.sort(markTaskDTOs, Comparator.comparing(MarkTaskDTO::getRandomSeqNew));
         return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
         return new PageableDTO(markTaskDTOs, markTasks.getTotalElements(), markTasks.getTotalPages(), pageable.getPageNumber());
     }
     }
 
 

+ 118 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/TaskApi.java

@@ -0,0 +1,118 @@
+package cn.com.qmth.stmms.ms.marking.api;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+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.PageRequest;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.persistence.criteria.Predicate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * @author by xf
+ * @date 2019/11/5.
+ */
+@RestController
+@RequestMapping("/api/task")
+public class TaskApi {
+
+    @Autowired
+    private PaperAssembler paperAssembler;
+
+    @Autowired
+    private PaperRepo paperRepo;
+
+    @Autowired
+    private MarkTaskRepo markTaskRepo;
+
+    /**
+     * 任务管理查询
+     * @param workId
+     * @param secretNumber
+     * @param type
+     * @return
+     */
+    @RequestMapping("/search")
+    public PaperDTO searchBySecretNumber(@RequestParam("workId") Long workId,
+                                         @RequestParam("secretNumber") String secretNumber,
+                                         @RequestParam("type") String type){
+        PaperDTO paperDTO = null;
+        if("paper".equals(type)){
+            Specification<Paper> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"),workId));
+                if(secretNumber != null){
+                    predicates.add(builder.equal(root.get("secretNumber"), secretNumber));
+                }
+
+                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            };
+            Optional<Paper> paperOptional = paperRepo.findAll(specification,new PageRequest(0,1))
+                    .getContent().stream().findFirst();
+            if(paperOptional.isPresent()){
+                paperDTO = paperAssembler.toDTO(paperOptional.get());
+            }
+        } else if ("task".equals(type)){
+            Specification<MarkTask> specification = (root,query,builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                predicates.add(builder.equal(root.get("workId"), workId));
+                if(secretNumber != null){
+                    predicates.add(builder.equal(root.get("secretNumber"),secretNumber));
+                }
+                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            };
+            Optional<MarkTask> taskOptional = markTaskRepo.findAll(specification,new PageRequest(0,1))
+                    .getContent().stream().findFirst();
+            if(taskOptional.isPresent()){
+                paperDTO = paperAssembler.toDTO(taskOptional.get().getPaper());
+            }
+        }
+        return paperDTO;
+
+    }
+
+    /**
+     * 重评
+     * @param paperId
+     * @param ranges
+     * @return
+     */
+    @RequestMapping("/reevaluation")
+    public boolean reevaluation(@RequestParam("paperId") Long paperId,
+                                @RequestParam("rangs") String ranges){
+        Paper paper = paperRepo.findOne(paperId);
+//        paper.reject(null);
+        //重评后撤销标准卷
+//        paper.setSample(false);
+        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
+        for (MarkTask markTask : markTasks) {
+            String[] range = ranges.split(",");
+            if(range.length > 0){
+                for (String r : range) {
+                    if(Objects.equals(String.valueOf(markTask.getMarkerId()), r)){
+//                        markTask.setRejected(true);
+//                        markTask.setOriginLevel(markTask.getResult());
+                        markTask.setResult(null);
+                        markTask.setActive(false);
+                    }
+                }
+            }
+        }
+        markTaskRepo.save(markTasks);
+//        paperRepo.save(paper);
+        return true;
+    }
+
+}

+ 2 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java

@@ -64,6 +64,7 @@ public class MarkTaskAssembler {
             markTaskDTO.setImgSrc(imgSrc);
             markTaskDTO.setImgSrc(imgSrc);
             markTaskDTO.setSample(paper.isSample());
             markTaskDTO.setSample(paper.isSample());
             markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
             markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
+            markTaskDTO.setRandomSeqNew(markTask.getRandomSeqNew());
         }
         }
         return markTaskDTO;
         return markTaskDTO;
     }
     }
@@ -103,6 +104,7 @@ public class MarkTaskAssembler {
             markTaskDTO.setImgSrc(imgSrc);
             markTaskDTO.setImgSrc(imgSrc);
             markTaskDTO.setSample(paper.isSample());
             markTaskDTO.setSample(paper.isSample());
             markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
             markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
+            markTaskDTO.setRandomSeqNew(markTask.getRandomSeqNew());
         }
         }
         return markTaskDTO;
         return markTaskDTO;
     }
     }

+ 9 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -3,9 +3,11 @@ 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.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
+import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Student;
 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.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.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
@@ -33,6 +35,9 @@ public class PaperAssembler {
     @Autowired
     @Autowired
     StudentRepo studentRepo;
     StudentRepo studentRepo;
 
 
+    @Autowired
+    private MarkSubjectRepo markSubjectRepo;
+
     public PaperDTO toDTO(Paper paper) {
     public PaperDTO toDTO(Paper paper) {
         String imgSrc = null;
         String imgSrc = null;
         String thumbSrc = null;
         String thumbSrc = null;
@@ -44,6 +49,8 @@ public class PaperAssembler {
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
             thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
         }
         }
+        //查询阶段
+        MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId()+"-"+paper.getSubject());
         PaperDTO paperDTO = null;
         PaperDTO paperDTO = null;
         if (paper != null) {
         if (paper != null) {
             paperDTO = new PaperDTO();
             paperDTO = new PaperDTO();
@@ -73,6 +80,8 @@ public class PaperAssembler {
             if (paper.getInspectLevel() != null) {
             if (paper.getInspectLevel() != null) {
                 paperDTO.setInspectLevel(paper.getInspectLevel());
                 paperDTO.setInspectLevel(paper.getInspectLevel());
             }
             }
+            paperDTO.setStage(markSubject.getStage());
+            paperDTO.setTest(markSubject.getTest());
 
 
         }
         }
         return paperDTO;
         return paperDTO;

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

@@ -0,0 +1,50 @@
+package cn.com.qmth.stmms.ms.marking.dto;
+
+import java.io.Serializable;
+
+/**
+ * @author by xf
+ * @date 2019/11/5.
+ */
+public class LevleProgressDTO implements Serializable {
+
+    private int totalCount;
+
+    private int successCount;
+
+    private int waitCount;
+
+    private double progress;
+
+    public int getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(int totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public int getSuccessCount() {
+        return successCount;
+    }
+
+    public void setSuccessCount(int successCount) {
+        this.successCount = successCount;
+    }
+
+    public int getWaitCount() {
+        return waitCount;
+    }
+
+    public void setWaitCount(int waitCount) {
+        this.waitCount = waitCount;
+    }
+
+    public double getProgress() {
+        return progress;
+    }
+
+    public void setProgress(double progress) {
+        this.progress = progress;
+    }
+}

+ 10 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java

@@ -27,6 +27,8 @@ public class MarkTaskDTO implements Serializable{
     private boolean markByLeader;
     private boolean markByLeader;
     private boolean oldRejected;
     private boolean oldRejected;
 
 
+    private Long randomSeqNew;
+
     public static long getSerialVersionUID() {
     public static long getSerialVersionUID() {
         return serialVersionUID;
         return serialVersionUID;
     }
     }
@@ -158,4 +160,12 @@ public class MarkTaskDTO implements Serializable{
     public void setMarkerId(Long markerId) {
     public void setMarkerId(Long markerId) {
         this.markerId = 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/PaperDTO.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.stmms.ms.marking.dto;
 package cn.com.qmth.stmms.ms.marking.dto;
 
 
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
@@ -35,6 +37,8 @@ public class PaperDTO implements Serializable{
     private Long inspector;
     private Long inspector;
     private String sheetSrc;
     private String sheetSrc;
     private boolean isMissing;
     private boolean isMissing;
+    private MarkStage stage;
+    private int test;
 
 
     private List<MarkTaskDTO> markResults = new ArrayList<>();
     private List<MarkTaskDTO> markResults = new ArrayList<>();
 
 
@@ -225,4 +229,20 @@ public class PaperDTO implements Serializable{
     public void setMissing(boolean missing) {
     public void setMissing(boolean missing) {
         isMissing = missing;
         isMissing = missing;
     }
     }
+
+    public MarkStage getStage() {
+        return stage;
+    }
+
+    public void setStage(MarkStage stage) {
+        this.stage = stage;
+    }
+
+    public int getTest() {
+        return test;
+    }
+
+    public void setTest(int test) {
+        this.test = test;
+    }
 }
 }

+ 20 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java

@@ -9,6 +9,7 @@ import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkerGroupRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkerGroupRepo;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -26,6 +27,10 @@ public class AssignTaskService {
 
 
     @Autowired
     @Autowired
     private MarkTaskRepo markTaskRepo;
     private MarkTaskRepo markTaskRepo;
+
+    @Autowired
+    private PaperRepo paperRepo;
+
     @Autowired
     @Autowired
     private MarkerGroupRepo markerGroupRepo;
     private MarkerGroupRepo markerGroupRepo;
 
 
@@ -99,6 +104,7 @@ public class AssignTaskService {
         markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
         markerGroups = markerGroups.stream().filter(m -> m.getMarkers().size() > 0).collect(Collectors.toList());
         int groupSize = markerGroups.size();
         int groupSize = markerGroups.size();
         int idx = 0;
         int idx = 0;
+        long currentTime = System.currentTimeMillis();
         Iterator<Paper> iterator = papers.iterator();
         Iterator<Paper> iterator = papers.iterator();
         while (iterator.hasNext()) {
         while (iterator.hasNext()) {
             if (idx >= groupSize) {
             if (idx >= groupSize) {
@@ -108,13 +114,25 @@ public class AssignTaskService {
             for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
             for (MarkUser marker : markerGroups.get(idx).getMarkers()) {
                 Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber());
                 Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber());
                 MarkTask markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
                 MarkTask markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
-                markTask.setActive(true);
+                if(markSubject.getTest() == 1) {
+                    markTask.setActive(true);
+                }
                 markTaskRepo.save(markTask);
                 markTaskRepo.save(markTask);
             }
             }
+            if(markSubject.getTest() != 1) {
+                if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+                    //将paper置为激活
+                    paper.setActive(true);
+                    paper.setBatchNo(currentTime);
+                    paperRepo.save(paper);
+                }
+            }
             idx++;
             idx++;
         }
         }
+        //只有全部任务投放完成,才能删除分组
+        int count = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNull(markSubject.getWorkId(), markSubject.getSubject());
         //进入分档阶段后,清空当前分组,以便打分阶段前重新分组
         //进入分档阶段后,清空当前分组,以便打分阶段前重新分组
-        if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+        if (MarkStage.LEVEL.equals(markSubject.getStage()) && count == 0) {
             for (MarkerGroup markerGroup : markerGroups) {
             for (MarkerGroup markerGroup : markerGroups) {
                 markerGroup.setMarkers(null);
                 markerGroup.setMarkers(null);
             }
             }

+ 2 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -108,6 +108,8 @@ public class MarkingService {
         markTask.setRejected(false);
         markTask.setRejected(false);
         markTask.setUpdatedOn(new Date());
         markTask.setUpdatedOn(new Date());
         markTask.setMarkerName(maker.getName());
         markTask.setMarkerName(maker.getName());
+        //激活试卷
+        markTask.setActive(true);
 
 
         markTaskRepo.save(markTask);
         markTaskRepo.save(markTask);
 
 

+ 67 - 6
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -7,11 +7,13 @@ import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import cn.com.qmth.stmms.ms.marking.dto.LevleProgressDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import java.math.BigDecimal;
 import java.util.Hashtable;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -56,16 +58,21 @@ public class StageControlService {
      * @param markSubject
      * @param markSubject
      */
      */
     @Transactional
     @Transactional
-    public void goNext(MarkSubject markSubject) throws Exception {
+    public void goNext(MarkSubject markSubject, int taskCount) throws Exception {
         if (statusMap.get(markSubject.getId()) != null && statusMap.get(markSubject.getId())) {
         if (statusMap.get(markSubject.getId()) != null && statusMap.get(markSubject.getId())) {
             return;
             return;
         }
         }
         statusMap.put(markSubject.getId(), true);
         statusMap.put(markSubject.getId(), true);
         MarkStage markStage = markSubject.getStage();
         MarkStage markStage = markSubject.getStage();
+        //是否还有未投放的试卷
+        int waitCount =paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNull(markSubject.getWorkId(), markSubject.getSubject());
+        if(waitCount > 0 && markStage.equals(MarkStage.LEVEL)){
+            markStage = MarkStage.INIT;
+        }
         switch (markStage) {
         switch (markStage) {
             case INIT:
             case INIT:
                 markSubject.setStage(MarkStage.LEVEL);
                 markSubject.setStage(MarkStage.LEVEL);
-                enterLevelStage(markSubject);
+                enterLevelStage(markSubject, taskCount);
                 break;
                 break;
             case LEVEL:
             case LEVEL:
                 markSubject.setStage(MarkStage.SCORE);
                 markSubject.setStage(MarkStage.SCORE);
@@ -93,7 +100,7 @@ public class StageControlService {
      *
      *
      * @param markSubject
      * @param markSubject
      */
      */
-    private void enterLevelStage(MarkSubject markSubject) throws Exception {
+    private void enterLevelStage(MarkSubject markSubject, int taskCount) throws Exception {
         Long workId = markSubject.getWorkId();
         Long workId = markSubject.getWorkId();
         Subject subject = markSubject.getSubject();
         Subject subject = markSubject.getSubject();
         List<Level> levels = levelRepo.findByWorkId(workId);
         List<Level> levels = levelRepo.findByWorkId(workId);
@@ -101,7 +108,7 @@ public class StageControlService {
             statusMap.put(markSubject.getId(), false);
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("没有设定档位");
             throw new RuntimeException("没有设定档位");
         }
         }
-        List<Paper> papers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false, markSubject.getTest());
+
         List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
         List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
         List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_LEVELING).collect(Collectors.toList());
         List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_LEVELING).collect(Collectors.toList());
         if (levelMarkers.size() == 0) {
         if (levelMarkers.size() == 0) {
@@ -118,6 +125,34 @@ public class StageControlService {
             statusMap.put(markSubject.getId(), false);
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("评卷员没有进行分组");
             throw new RuntimeException("评卷员没有进行分组");
         }
         }
+
+        if(markSubject.getTest() != 1) {
+            //是否有未结束的分档任务
+            int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNull(workId, subject);
+            if (count > 0) {
+                statusMap.put(markSubject.getId(), false);
+                throw new RuntimeException("没有分档完成");
+            }
+
+            //任务数量大于0,小于等于待评数量
+            if (taskCount == 0) {
+                statusMap.put(markSubject.getId(), false);
+                throw new RuntimeException("请输入正确的分配任务数量");
+            }
+            int waitCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalseAndActiveFalseAndBatchNoIsNull(workId, subject);
+            if (taskCount - waitCount > 0) {
+                statusMap.put(markSubject.getId(), false);
+                throw new RuntimeException("分配任务数量不能大于待评数量");
+            }
+        }
+
+        List<Paper> papers = null;
+        if(markSubject.getTest() == 1) {
+            papers = paperRepo.findByWorkIdAndSubjectAndIsMissingAndTest(workId, subject, false, markSubject.getTest());
+        } else {
+            List<Paper> papersList = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveFalse(workId, subject);
+            papers = papersList.subList(0, taskCount);
+        }
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject);
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject);
     }
     }
 
 
@@ -137,14 +172,14 @@ public class StageControlService {
             statusMap.put(markSubject.getId(), false);
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("没有设定评卷员");
             throw new RuntimeException("没有设定评卷员");
         }
         }
-        Long count = paperRepo.countByWorkIdAndSubjectAndTestAndLevelIsNull(workId, subject, markSubject.getTest());
+        int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNull(workId, subject);
         if (count > 0) {
         if (count > 0) {
             statusMap.put(markSubject.getId(), false);
             statusMap.put(markSubject.getId(), false);
             throw new RuntimeException("没有分档完成");
             throw new RuntimeException("没有分档完成");
         }
         }
         this.isPtFull(workId, markSubject);
         this.isPtFull(workId, markSubject);
         Sort sort = new Sort("questionId");
         Sort sort = new Sort("questionId");
-        List<Paper> papers = paperRepo.findByWorkIdAndSubject(workId, subject, sort);
+        List<Paper> papers = paperRepo.findByWorkIdAndSubjectAndIsMissingFalseAndActiveTrueAndBatchNoNotNull(workId, subject, sort);
         List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
         List<MarkerGroup> markerGroups = markerGroupRepo.findByWorkIdAndSubject(workId, subject);
         if (markerGroups.size() == 0) {
         if (markerGroups.size() == 0) {
             statusMap.put(markSubject.getId(), false);
             statusMap.put(markSubject.getId(), false);
@@ -216,4 +251,30 @@ public class StageControlService {
         markSubjectRepo.save(markSubject);
         markSubjectRepo.save(markSubject);
     }
     }
 
 
+    /**
+     * 分档进度查询
+     *
+     * @param markSubject
+     */
+    public LevleProgressDTO progress(MarkSubject markSubject) {
+        Long workId = markSubject.getWorkId();
+        Subject subject = markSubject.getSubject();
+        //已评任务数
+        int successCount = paperRepo.countByWorkIdAndSubjectAndLevelNotNullAndIsMissingFalseAndActiveTrue(workId, subject);
+        //所有任务数(查询所有有效试卷)
+        int totalCount = paperRepo.countByWorkIdAndSubjectAndIsMissingFalse(workId, subject);
+
+        BigDecimal waitTotal = BigDecimal.valueOf(totalCount).subtract(BigDecimal.valueOf(successCount));
+        //进度
+        BigDecimal progress = BigDecimal.ZERO.compareTo(BigDecimal.valueOf(totalCount)) == 0 ? BigDecimal.ZERO :BigDecimal.valueOf(successCount).divide(BigDecimal.valueOf(totalCount), 4, BigDecimal.ROUND_HALF_UP);
+
+        LevleProgressDTO progressDTO = new LevleProgressDTO();
+        progressDTO.setSuccessCount(successCount);
+        progressDTO.setTotalCount(totalCount);
+        progressDTO.setWaitCount(waitTotal.intValue());
+        progressDTO.setProgress(progress.doubleValue() * 100);
+
+        return progressDTO;
+    }
+
 }
 }