Browse Source

机构版-3.0.0-增加锁定功能、任务叠加发布功能

xiaof 2 years ago
parent
commit
ae7aa1c59c

+ 21 - 19
sql/msyj-org-v3.0.0.sql

@@ -232,6 +232,7 @@ CREATE TABLE `mark_subject`  (
   `is_formal` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否正评,0:不是,1:是',
   `all_level` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否全部根据档位分配完,0:不是,1:是',
   `enable` tinyint(1) NULL DEFAULT 1 COMMENT '是否启用 0:禁用 1:启用',
+  `locking` tinyint(1) NULL DEFAULT 0 COMMENT '锁定(禁止评卷) 0:未锁定 1:锁定',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `FK1tvc2mil1ebqgt08912t4hxqw`(`work_id`) USING BTREE,
   CONSTRAINT `FK1tvc2mil1ebqgt08912t4hxqw` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
@@ -460,25 +461,26 @@ DROP TABLE IF EXISTS `param_setting`;
 CREATE TABLE `param_setting`  (
   `id` bigint(10) NOT NULL AUTO_INCREMENT,
   `work_id` bigint(10) NULL DEFAULT NULL COMMENT '工作id',
-  `package_scan` tinyint(1) NULL DEFAULT NULL COMMENT '是否整包扫描1:是 0:否',
-  `image_encrypt` tinyint(1) NULL DEFAULT NULL COMMENT '是否加密1:是 0:否',
-  `name_rule` tinyint(1) NULL DEFAULT NULL COMMENT '图片命名规则(1:考号命名、0:随机码命名)',
-  `paper_stage` tinyint(1) NULL DEFAULT NULL COMMENT '试卷档位状态(1:已知、0:未知)',
-  `deviation` int(2) NULL DEFAULT NULL COMMENT '仲裁档位差',
-  `auto_callback` tinyint(1) NULL DEFAULT NULL COMMENT '是否自动打回(1:是、0:否)',
-  `majority` tinyint(1) NULL DEFAULT NULL COMMENT '是否过半定档(1:是、0:否)',
-  `cumulative_error` int(3) NULL DEFAULT NULL COMMENT '打回累计误差',
-  `level_show_all_paper` tinyint(1) NULL DEFAULT NULL COMMENT '分档阶段阅卷员是否显示所有试卷(1:是、0:否)',
-  `show_paper_count` tinyint(1) NULL DEFAULT NULL COMMENT '打分界面评卷数量是否显示(1:是、0:否)',
-  `round_up` tinyint(1) NULL DEFAULT NULL COMMENT '分数处理方式(1:四舍五入、0:非零进一)',
-  `change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '改档及改档打分(1:显示、0:不显示)',
-  `score_show_all_paper` tinyint(1) NULL DEFAULT NULL COMMENT '打分阶段阅卷员是否显示所有试卷(1:是、0:否)',
-  `prop_denominator` int(2) NULL DEFAULT NULL COMMENT '档位百分比分母(1: \"全部考生数\", 2: \"去掉缺考考生数\")',
-  `auto_callback_show_deviation` tinyint(1) NULL DEFAULT NULL COMMENT '自动打回时显示偏差',
-  `show_sample` tinyint(1) NULL DEFAULT NULL COMMENT '是否显示标准卷',
-  `direct_score` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用直接输分功能',
-  `is_level_to_score` tinyint(1) NULL DEFAULT NULL COMMENT '是否谁分档谁打分',
-  `take_best` tinyint(1) NULL DEFAULT NULL COMMENT '取优原则(1:是、0:否)',
+  `package_scan` tinyint(1) NULL DEFAULT NULL COMMENT '[采集参数]是否整包扫描1:是 0:否',
+  `image_encrypt` tinyint(1) NULL DEFAULT NULL COMMENT '[采集参数]是否加密1:是 0:否',
+  `name_rule` tinyint(1) NULL DEFAULT NULL COMMENT '[采集参数]图片命名规则(1:考号命名、0:随机码命名)',
+  `paper_stage` tinyint(1) NULL DEFAULT NULL COMMENT '[采集参数]试卷档位状态(1:已知、0:未知)',
+  `deviation` int(2) NULL DEFAULT NULL COMMENT '[分档参数]仲裁档位差',
+  `auto_callback` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]是否自动打回(1:是、0:否)',
+  `cumulative_error` int(3) NULL DEFAULT NULL COMMENT '[分档参数]打回累计误差',
+  `auto_callback_show_deviation` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]自动打回时显示偏差',
+  `majority` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]是否过半定档(1:是、0:否)',
+  `take_best` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]取优原则(1:是、0:否)',
+  `level_show_all_paper` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]分档阶段阅卷员是否显示所有试卷(1:是、0:否)',
+  `show_paper_count` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]打分界面评卷数量是否显示(1:是、0:否)',
+  `prop_denominator` int(2) NULL DEFAULT NULL COMMENT '[分档参数]档位百分比分母(1: \"全部考生数\", 2: \"去掉缺考考生数\")',
+  `show_sample` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]是否显示标准卷',
+  `allow_task_overlay` tinyint(1) NULL DEFAULT NULL COMMENT '[分档参数]是否允许任务数累加 默认0',
+  `round_up` tinyint(1) NULL DEFAULT NULL COMMENT '[打分参数]分数处理方式(1:四舍五入、0:非零进一)',
+  `change_stage` tinyint(1) NULL DEFAULT NULL COMMENT '[打分参数]改档及改档打分(1:显示、0:不显示)',
+  `score_show_all_paper` tinyint(1) NULL DEFAULT NULL COMMENT '[打分参数]打分阶段阅卷员是否显示所有试卷(1:是、0:否)',
+  `is_level_to_score` tinyint(1) NULL DEFAULT NULL COMMENT '[打分参数]是否谁分档谁打分',
+  `direct_score` tinyint(1) NULL DEFAULT NULL COMMENT '[打分参数]是否启用直接输分功能',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数设置' ROW_FORMAT = Dynamic;
 

+ 12 - 3
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/api/AuthApi.java

@@ -70,9 +70,6 @@ public class AuthApi {
             if (!user.getPassword().equals(domain.getPassword())) {
                 throw new RuntimeException("用户或密码错误");
             }
-            if (!domain.isEnabled()) {
-                throw new RuntimeException("用户被禁用");
-            }
             domain.setSessionId(request.getSession().getId());
             markUserRepo.save(domain);
         }
@@ -85,6 +82,18 @@ public class AuthApi {
             }
         }
 
+        // 锁定提示
+        if (Objects.equals(Role.MARKER, domain.getRole()) || Objects.equals(Role.MARK_LEADER, domain.getRole())) {
+            if (!domain.isEnabled()) {
+                MarkSubject markSubject = markSubjectRepo.findOne(domain.getWorkId() + "-" + domain.getSubject().name());
+                if(markSubject.isLocking()){
+                    throw new RuntimeException("科目评卷任务被锁定,无法登录,请联系管理员解锁");
+                } else {
+                    throw new RuntimeException("用户被禁用");
+                }
+            }
+        }
+
         String token = System.currentTimeMillis() + "#" + domain.getLoginName() + "#" + domain.getId();
         String tokenAes = EncrypAES.encrypt(token);
         token = URLEncoder.encode(tokenAes, "UTF-8");

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

@@ -51,7 +51,7 @@ public class ParamApi {
     /**
      * 更新采集参数
      *
-     * @param workId 工作ID
+     * @param workId       工作ID
      * @param packageScan
      * @param imageEncrypt
      * @param nameRule
@@ -111,29 +111,47 @@ public class ParamApi {
     public ResponseEntity updateLevelParam(@RequestParam Long workId,
                                            @RequestParam Integer deviation,
                                            @RequestParam Integer autoCallback,
-                                           @RequestParam Integer majority,
                                            @RequestParam Integer cumulativeError,
+                                           @RequestParam Integer autoCallbackShowDeviation,
+                                           @RequestParam Integer majority,
+                                           @RequestParam Integer takeBest,
                                            @RequestParam Integer levelShowAllPaper,
                                            @RequestParam Integer showPaperCount,
                                            @RequestParam Integer propDenominator,
-                                           @RequestParam Integer autoCallbackShowDeviation,
                                            @RequestParam Integer showSample,
-                                           @RequestParam Integer takeBest) {
-        List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
+                                           @RequestParam Integer allowTaskOverlay) {
+        List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTest(workId, TrialEnum.DEFAULT.ordinal());
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
-        boolean flag = markSubjects.isEmpty() && countMarkTasks > 0;
 
         //保存分档参数
         ParamSetting paramSetting = paramSettingRepo.findByWorkId(workId);
-        if (flag && (!Objects.equals(deviation, paramSetting.getDeviation())
-                || !Objects.equals(autoCallback, paramSetting.getAutoCallback())
-                || !Objects.equals(majority, paramSetting.getMajority())
-                || !Objects.equals(cumulativeError, paramSetting.getCumulativeError()))) {
-            throw new RuntimeException("该评卷工作已有评卷数据,不能修改仲裁档位差、系统自动打回、是否过半定档参数");
-        }
         if (paramSetting == null) {
             paramSetting = ParamSetting.init();
         }
+
+        if (!markSubjects.isEmpty() && countMarkTasks > 0) {
+            if (!Objects.equals(deviation, paramSetting.getDeviation())) {
+                throw new RuntimeException("该评卷工作已有正评数据,不能修改【仲裁档位差】参数");
+            }
+            if (!Objects.equals(autoCallback, paramSetting.getAutoCallback())) {
+                throw new RuntimeException("该评卷工作已有正评数据,不能修改【系统自动打回】参数");
+            }
+            if (!Objects.equals(cumulativeError, paramSetting.getCumulativeError())){
+                throw new RuntimeException("评卷工作已有正评数据,不能修改【打回累计误差】参数");
+            }
+            if (!Objects.equals(majority, paramSetting.getMajority())) {
+                throw new RuntimeException("该评卷工作已有正评数据,不能修改【是否过半定档】参数");
+            }
+            if (!Objects.equals(takeBest, paramSetting.getTakeBest())) {
+                throw new RuntimeException("评卷工作已有正评数据,不能修改【是否开启取优原则】参数");
+            }
+        }
+
+        // 开启自动打回,打回累计误差必填
+        if (autoCallback == 1 && cumulativeError == null) {
+            throw new RuntimeException("系统自动打回已开启,【打回累计误差】必填");
+        }
+
         paramSetting.setDeviation(deviation);
         paramSetting.setAutoCallback(autoCallback);
         paramSetting.setMajority(majority);
@@ -144,6 +162,7 @@ public class ParamApi {
         paramSetting.setAutoCallbackShowDeviation(autoCallbackShowDeviation);
         paramSetting.setShowSample(showSample);
         paramSetting.setTakeBest(takeBest);
+        paramSetting.setAllowTaskOverlay(allowTaskOverlay);
         paramSettingRepo.saveAndFlush(paramSetting);
         ParamCache.resetParam(paramSetting);
 

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

@@ -85,12 +85,14 @@ public class WorkService {
                 MarkSubject markSubject = new MarkSubject(subjects[i], work.getId());
                 markSubject.setWorkId(work.getId());
                 markSubject.setEnable(true);
+                markSubject.setLocking(false);
                 markSubjectRepo.save(markSubject);
             }
         } else {
             MarkSubject markSubject = new MarkSubject(work.getName(), Subject.CUSTOM, work.getId());
             markSubject.setWorkId(work.getId());
             markSubject.setEnable(true);
+            markSubject.setLocking(false);
             markSubjectRepo.save(markSubject);
         }
 

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

@@ -52,6 +52,9 @@ public class MarkSubject implements Serializable {
     //是否禁用0:禁用 1:启用
     private boolean enable;
 
+    //锁定(禁止评卷) 0:未锁定 1:锁定
+    private boolean locking;
+
     public boolean isAllLevel() {
         return allLevel;
     }
@@ -163,4 +166,12 @@ public class MarkSubject implements Serializable {
     public void setEnable(boolean enable) {
         this.enable = enable;
     }
+
+    public boolean isLocking() {
+        return locking;
+    }
+
+    public void setLocking(boolean locking) {
+        this.locking = locking;
+    }
 }

+ 41 - 24
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java

@@ -1,6 +1,9 @@
 package cn.com.qmth.stmms.ms.core.domain;
 
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
@@ -56,30 +59,36 @@ public class ParamSetting implements Serializable {
 
     private Integer takeBest;
 
-    public static ParamSetting init(){
+    private Integer allowTaskOverlay;
+
+    public static ParamSetting init() {
         ParamSetting paramSetting = new ParamSetting();
-        paramSetting.setPackageScan(0);
-        paramSetting.setImageEncrypt(0);
-        paramSetting.setNameRule(0);
-        paramSetting.setPaperStage(0);
-        //仲裁档位差,默认4
-        paramSetting.setDeviation(4);
-        paramSetting.setAutoCallback(0);
-        paramSetting.setMajority(1);
-        paramSetting.setLevelShowAllPaper(0);
-        //是否显示试卷数量,默认显示1
-        paramSetting.setShowPaperCount(1);
-        paramSetting.setRoundUp(1);
-        paramSetting.setChangeStage(0);
-        paramSetting.setScoreShowAllPaper(0);
-        //是否谁分档谁打分,默认0(否)
-        paramSetting.setIsLevelToScore(0);
-        paramSetting.setPropDenominator(1);
-        paramSetting.setAutoCallbackShowDeviation(1);
-        paramSetting.setShowSample(1);
-        paramSetting.setDirectScore(0);
-        // 取优原则默认开启
-        paramSetting.setTakeBest(1);
+
+        // 采集参数
+        paramSetting.setPackageScan(0); // 是否整包扫描
+        paramSetting.setImageEncrypt(0); // 图片是否加密
+        paramSetting.setNameRule(0); // 图片命名规则
+        paramSetting.setPaperStage(0); // 试卷档位(已知,未知)
+
+        //分档参数
+        paramSetting.setDeviation(4); //仲裁档位差,默认4
+        paramSetting.setAutoCallback(0); // 系统自动打回
+        paramSetting.setCumulativeError(null); //打回累计误差
+        paramSetting.setAutoCallbackShowDeviation(1); // 打回是否显示偏差方向
+        paramSetting.setMajority(1); // 是否过半定档
+        paramSetting.setTakeBest(1); // 取优原则默认开启
+        paramSetting.setLevelShowAllPaper(0); //阅卷员是否显示所有试卷
+        paramSetting.setShowPaperCount(1);  //是否显示试卷数量,默认显示1
+        paramSetting.setPropDenominator(1); // 档位百分比分母
+        paramSetting.setShowSample(1); // 是否显示标准卷
+        paramSetting.setAllowTaskOverlay(0); // 是否允许任务数累加 默认0
+
+        // 打分参数
+        paramSetting.setRoundUp(1); // 分数处理方式
+        paramSetting.setChangeStage(0); // 阅卷员是否显示改档及改档打分
+        paramSetting.setScoreShowAllPaper(0); // 阅卷员是否显示所有试卷
+        paramSetting.setIsLevelToScore(0); //是否谁分档谁打分,默认0(否)
+        paramSetting.setDirectScore(0); // 是否启用直接输分功能
         return paramSetting;
     }
 
@@ -250,4 +259,12 @@ public class ParamSetting implements Serializable {
     public void setTakeBest(Integer takeBest) {
         this.takeBest = takeBest;
     }
+
+    public Integer getAllowTaskOverlay() {
+        return allowTaskOverlay;
+    }
+
+    public void setAllowTaskOverlay(Integer allowTaskOverlay) {
+        this.allowTaskOverlay = allowTaskOverlay;
+    }
 }

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

@@ -30,4 +30,6 @@ public interface MarkSubjectRepo extends JpaRepository<MarkSubject,String> {
     List<MarkSubject> findAllByWorkIdAndStageNot(Long workId, MarkStage stage);
 
     List<MarkSubject> findAllByWorkIdAndStage(Long workId, MarkStage stage);
+
+    List<MarkSubject> findByWorkIdAndTest(Long workId, int ordinal);
 }

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

@@ -18,13 +18,14 @@ import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -219,13 +220,13 @@ public class MarkSubjectApi {
         LevelStatDTO manualScoreDTO = new LevelStatDTO();
         manualScoreDTO.setId("manualScore");
         List<String> markTaskPaperIds = markTaskRepo.findByWorkIdAndSubjectAndStageAndManualScore(markSubject.getWorkId(), markSubject.getSubject().name(), MarkStage.SCORE.ordinal());
-        List<Long> paperIds = markTaskPaperIds.stream().map(m-> Long.parseLong(m)).collect(Collectors.toList());
+        List<Long> paperIds = markTaskPaperIds.stream().map(m -> Long.parseLong(m)).collect(Collectors.toList());
         List<MarkTask> markTaskList = markTaskRepo.findByPaperIdInAndStage(paperIds, MarkStage.SCORE);
-        Map<Long, List<MarkTask>> markTaskMap = markTaskList.stream().collect(Collectors.groupingBy(m->m.getPaper().getId()));
+        Map<Long, List<MarkTask>> markTaskMap = markTaskList.stream().collect(Collectors.groupingBy(m -> m.getPaper().getId()));
         Set<Long> paperIdSet = new HashSet();
         for (Map.Entry<Long, List<MarkTask>> entry : markTaskMap.entrySet()) {
-            long count = entry.getValue().stream().filter(m->Objects.isNull(m.getResult())).count();
-            if(count == 0){
+            long count = entry.getValue().stream().filter(m -> Objects.isNull(m.getResult())).count();
+            if (count == 0) {
                 paperIdSet.add(entry.getKey());
             }
 
@@ -261,7 +262,7 @@ public class MarkSubjectApi {
      */
     @RequestMapping(value = "{markSubject}/markergroups", method = RequestMethod.POST)
     public MarkerGroup createMarkerGroup(@PathVariable MarkSubject markSubject, @RequestBody MarkerGroup markerGroup) {
-        if(MarkStage.SCORE == markSubject.getStage() && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1){
+        if (MarkStage.SCORE == markSubject.getStage() && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1) {
             throw new RuntimeException("当前为谁分档谁打分,不能编辑分组");
         }
 
@@ -270,7 +271,7 @@ public class MarkSubjectApi {
         }
         if (MarkStage.LEVEL == markSubject.getStage() || MarkStage.SCORE == markSubject.getStage()) {
             int count = markTaskRepo.countByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage());
-            if(count > 0){
+            if (count > 0) {
                 throw new RuntimeException("当前阶段已发布任务,不能编辑分组");
             }
         }
@@ -302,13 +303,13 @@ public class MarkSubjectApi {
     @RequestMapping(value = "{markSubject}/markergroups/{domain}", method = RequestMethod.DELETE)
     public void removeMarkerGroup(@PathVariable MarkSubject markSubject, @PathVariable MarkerGroup domain) {
 
-        if(MarkStage.SCORE == markSubject.getStage() && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1){
+        if (MarkStage.SCORE == markSubject.getStage() && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1) {
             throw new RuntimeException("当前为谁分档谁打分,不能删除分组");
         }
 
         if (MarkStage.LEVEL == markSubject.getStage() || MarkStage.SCORE == markSubject.getStage()) {
             int count = markTaskRepo.countByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), markSubject.getStage());
-            if(count > 0){
+            if (count > 0) {
                 throw new RuntimeException("当前阶段已发布任务,不能删除分组");
             }
         }
@@ -389,8 +390,9 @@ public class MarkSubjectApi {
      */
     @RequestMapping(value = "{markSubject}/canLevel", method = RequestMethod.GET)
     public Boolean canLevel(@PathVariable MarkSubject markSubject) {
+        boolean allowTaskOverlay = ParamCache.paramMap.get(markSubject.getWorkId()).getAllowTaskOverlay() == 1;
         int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNullAndTest(markSubject.getWorkId(), markSubject.getSubject(), 0);
-        return count > 0 ? false : true;
+        return allowTaskOverlay || count <= 0;
     }
 
 
@@ -422,7 +424,7 @@ public class MarkSubjectApi {
      * @param markSubject 评卷科目id
      */
     @RequestMapping(value = "{markSubject}/scoreProgress", method = RequestMethod.GET)
-    public List scoreProgress(@PathVariable MarkSubject markSubject,@RequestParam(defaultValue = "") Long questionId) {
+    public List scoreProgress(@PathVariable MarkSubject markSubject, @RequestParam(defaultValue = "") Long questionId) {
         return stageControlService.scoreProgress(markSubject, questionId);
     }
 
@@ -464,6 +466,32 @@ public class MarkSubjectApi {
         return new ResponseEntity(HttpStatus.OK);
     }
 
+    /**
+     * 锁定科目评卷任务
+     *
+     * @param markSubject 评卷科目id
+     */
+    @RequestMapping(value = "{markSubject}/updateLocking", method = RequestMethod.POST)
+    @Transactional
+    public ResponseEntity updateLocking(@PathVariable MarkSubject markSubject) {
+        markSubject.setLocking(!markSubject.isLocking());
+        markSubjectRepo.saveAndFlush(markSubject);
+
+        // 禁用账号
+        List<MarkUser> markUsers = markUserRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
+        for (MarkUser markUser : markUsers) {
+            if (Role.MARKER.equals(markUser.getRole()) || Role.MARK_LEADER.equals(markUser.getRole())) {
+                markUser.setEnabled(!markSubject.isLocking());
+            }
+        }
+        markUserRepo.save(markUsers);
+
+        // 所有用户强制退出
+        stageControlService.logoutAndBackupDb(markSubject);
+
+        return new ResponseEntity(HttpStatus.OK);
+    }
+
     /**
      * 更新科目名称
      *

+ 13 - 27
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java

@@ -1,22 +1,19 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
-import cn.com.qmth.stmms.ms.commons.utils.DbBackupUtils;
-import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 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.cache.CacheService;
+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;
 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.repository.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
@@ -52,19 +49,16 @@ public class AssignTaskService {
 
     @Autowired
     RandomUtil randomUtil;
-    
-    @Autowired
-    SqlUtil sqlUtil;
-
-    @Autowired
-    DbBackupUtils dbBackupUtils;
 
     @Autowired
-    CacheService cacheService;
+    SqlUtil sqlUtil;
 
     @Autowired
     MarkUserRepo markUserRepo;
 
+    @Resource
+    StageControlService stageControlService;
+
     /**
      * 单评任务模式,每个科目评卷员都需要对该科目每份试卷进行评卷
      * 比如,色彩有1000份试卷,那么每个评卷员都需要评1000份
@@ -147,11 +141,11 @@ public class AssignTaskService {
         Map<Long, Object> randomMap = new HashMap<>();
         markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
         // 谁分档谁打分
-        if(Objects.equals(MarkStage.SCORE, markSubject.getStage()) && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1){
+        if (Objects.equals(MarkStage.SCORE, markSubject.getStage()) && ParamCache.paramMap.get(markSubject.getWorkId()).getIsLevelToScore() == 1) {
             // 查询所有分档
-            List<MarkTask> markTasksLevels = markTaskRepo.findByWorkIdAndSubjectAndStage(markSubject.getWorkId(),markSubject.getSubject(), MarkStage.LEVEL);
+            List<MarkTask> markTasksLevels = markTaskRepo.findByWorkIdAndSubjectAndStage(markSubject.getWorkId(), markSubject.getSubject(), MarkStage.LEVEL);
             markTaskList = new ArrayList<>(markTasksLevels.size());
-            Map<Long, List<MarkTask>> markerMap = markTasksLevels.stream().collect(Collectors.groupingBy(m->m.getPaper().getId()));
+            Map<Long, List<MarkTask>> markerMap = markTasksLevels.stream().collect(Collectors.groupingBy(m -> m.getPaper().getId()));
             Map<String, AtomicInteger> integerMap = new HashMap<>();
 
             while (iterator.hasNext()) {
@@ -163,7 +157,7 @@ public class AssignTaskService {
                 long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
                 if (sortRule != 0) {
                     AtomicInteger atomicInteger = integerMap.get(paper.getLevel());
-                    if(atomicInteger == null){
+                    if (atomicInteger == null) {
                         atomicInteger = new AtomicInteger(0);
                         integerMap.put(paper.getLevel(), atomicInteger);
                     }
@@ -372,15 +366,7 @@ public class AssignTaskService {
         }
 
         // 所有用户强制退出
-        List<MarkUser> userList = markUserRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
-        userList = userList.stream().filter(m-> Role.MARKER.equals(m.getRole()) || Role.MARK_LEADER.equals(m.getRole())).collect(Collectors.toList());
-        if(!CollectionUtils.isEmpty(userList)){
-            for (MarkUser user : userList) {
-                cacheService.deleteTokenCache(user.getId().toString());
-            }
-        }
-        // 备份数据库
-        dbBackupUtils.startBackup(markSubject.getWorkId(), "分档");
+        stageControlService.logoutAndBackupDb(markSubject);
     }
 
     public void initTaskPublishData(Long workId, String suject) {
@@ -396,14 +382,14 @@ public class AssignTaskService {
         sql.append("      FROM                                                                   ");
         sql.append("          paper p                                                            ");
         sql.append("      WHERE                                                                  ");
-        sql.append("          p.work_id = '"+workId+"' AND p.subject = '"+suject+"'                                    ");
+        sql.append("          p.work_id = '" + workId + "' AND p.subject = '" + suject + "'                                    ");
         sql.append("              AND p.is_test = 0                                              ");
         sql.append("              AND p.level IS NOT NULL                                        ");
         sql.append("              AND p.is_missing = FALSE                                       ");
         sql.append("              AND p.is_active = TRUE                                         ");
         sql.append("      GROUP BY p.work_id , p.question_id, p.subject , p.level                ");
         sql.append("  ORDER BY p.level                                                            ");
-        List list =  sqlUtil.execSqlForMap(sql.toString());
+        List list = sqlUtil.execSqlForMap(sql.toString());
         List<TaskPublishSetting> taskPublishSettings = new ArrayList<>(list.size());
         for (Object o : list) {
             Map map = (Map) o;

+ 33 - 5
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -1,7 +1,9 @@
 package cn.com.qmth.stmms.ms.marking.service;
 
 import cn.com.qmth.stmms.ms.commons.config.ScoreConfig;
+import cn.com.qmth.stmms.ms.commons.utils.DbBackupUtils;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
+import cn.com.qmth.stmms.ms.core.cache.CacheService;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
@@ -16,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.naming.event.ObjectChangeListener;
 import java.math.BigDecimal;
@@ -62,6 +65,12 @@ public class StageControlService {
     @Autowired
     SqlUtil sqlUtil;
 
+    @Autowired
+    DbBackupUtils dbBackupUtils;
+
+    @Autowired
+    CacheService cacheService;
+
     public static volatile Map<String, Boolean> statusMap = new Hashtable<>();
 
     /**
@@ -154,11 +163,13 @@ public class StageControlService {
         }
 
         if (markSubject.getTest() != 1) {
-            //是否有未结束的分档任务
-            int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNullAndTest(workId, subject, 0);
-            if (count > 0) {
-                statusMap.put(markSubject.getId(), false);
-                throw new RuntimeException("没有分档完成");
+            if(ParamCache.paramMap.get(workId).getAllowTaskOverlay() == 0) {
+                //是否有未结束的分档任务
+                int count = paperRepo.countByWorkIdAndSubjectAndLevelIsNullAndIsMissingFalseAndActiveTrueAndBatchNoNotNullAndTest(workId, subject, 0);
+                if (count > 0) {
+                    statusMap.put(markSubject.getId(), false);
+                    throw new RuntimeException("没有分档完成");
+                }
             }
 
             //任务数量大于0,小于等于待评数量
@@ -678,4 +689,21 @@ public class StageControlService {
         return list;
     }
 
+    /**
+     * 用户强制退出且做数据库备份
+     *
+     * @param markSubject 科目
+     */
+    public void logoutAndBackupDb(MarkSubject markSubject) {
+        // 所有用户强制退出
+        List<MarkUser> userList = markUserRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
+        userList = userList.stream().filter(m -> Role.MARKER.equals(m.getRole()) || Role.MARK_LEADER.equals(m.getRole())).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(userList)) {
+            for (MarkUser user : userList) {
+                cacheService.deleteTokenCache(user.getId().toString());
+            }
+        }
+        dbBackupUtils.startBackup(markSubject.getWorkId(), markSubject.getStage().name());
+    }
+
 }