Browse Source

3.0.1 更新

xiaofei 8 months ago
parent
commit
a44a4200f7

+ 1 - 1
pom.xml

@@ -29,7 +29,7 @@
     <properties>
         <!-- non-dependencies -->
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.version>3.0.0</project.version>
+        <project.version>3.0.1</project.version>
         <java.version>1.8</java.version>
         <thymeleaf.version>3.0.0.RELEASE</thymeleaf.version>
         <thymeleaf-layout-dialect.version>2.0.0</thymeleaf-layout-dialect.version>

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

@@ -182,6 +182,7 @@ public class ParamApi {
         Integer scoreShowAllPaper = (Integer) map.get("scoreShowAllPaper");
         Integer isLevelToScore = (Integer) map.get("isLevelToScore");
         Integer directScore = (Integer) map.get("directScore");
+        Integer leaderDirectScore = (Integer) map.get("leaderDirectScore");
         List<MarkSubject> markSubjects = markSubjectRepo.findByWorkIdAndTestNotIn(workId, Arrays.asList(TrialEnum.DEFAULT.ordinal(), TrialEnum.START_FORMAL.ordinal()));
         int countMarkTasks = markTaskRepo.countByWorkId(workId);
         boolean flag = markSubjects.isEmpty() && countMarkTasks > 0;
@@ -199,6 +200,7 @@ public class ParamApi {
         paramSetting.setScoreShowAllPaper(scoreShowAllPaper);
         paramSetting.setIsLevelToScore(isLevelToScore);
         paramSetting.setDirectScore(directScore);
+        paramSetting.setLeaderDirectScore(leaderDirectScore);
         paramSettingRepo.saveAndFlush(paramSetting);
         ParamCache.resetParam(paramSetting);
 

+ 1 - 1
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/lock/LockType.java

@@ -1,7 +1,7 @@
 package cn.com.qmth.stmms.ms.commons.lock;
 
 public enum LockType {
-    LEVEL("level"), SCORE("score");
+    LEVEL("level"), SCORE("score"), PAPER("paper");
 
     private String name;
 

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

@@ -104,7 +104,15 @@ public enum MarkLogOperType {
     /**
      * 改档打档
      */
-    SYSTEM_ADJUST_LEVEL(19, "系统调档");
+    SYSTEM_ADJUST_LEVEL(19, "系统调档"),
+    /**
+     * 评卷员直接输分
+     */
+    MARKER_DIRECT_SCORE(20, "评卷员直接输分"),
+    /**
+     * 科组长直接输分
+     */
+    LEADER_DIRECT_SCORE(20, "科组长直接输分");
 
     private int id;
 

+ 13 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java

@@ -55,7 +55,10 @@ public class ParamSetting implements Serializable {
 
     private Integer showSample;
 
+    // 评卷员是否开启直接输分功能
     private Integer directScore;
+    // 科组长是否开启直接输分功能
+    private Integer leaderDirectScore;
 
     private Integer takeBest;
 
@@ -88,7 +91,8 @@ public class ParamSetting implements Serializable {
         paramSetting.setChangeStage(0); // 阅卷员是否显示改档及改档打分
         paramSetting.setScoreShowAllPaper(0); // 阅卷员是否显示所有试卷
         paramSetting.setIsLevelToScore(0); //是否谁分档谁打分,默认0(否)
-        paramSetting.setDirectScore(0); // 是否启用直接输分功能
+        paramSetting.setDirectScore(0); // 评卷员是否启用直接输分功能
+        paramSetting.setLeaderDirectScore(0); // 科组长是否启用直接输分功能
         return paramSetting;
     }
 
@@ -252,6 +256,14 @@ public class ParamSetting implements Serializable {
         this.directScore = directScore;
     }
 
+    public Integer getLeaderDirectScore() {
+        return leaderDirectScore;
+    }
+
+    public void setLeaderDirectScore(Integer leaderDirectScore) {
+        this.leaderDirectScore = leaderDirectScore;
+    }
+
     public Integer getTakeBest() {
         return takeBest;
     }

+ 3 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/LevelRepo.java

@@ -28,4 +28,7 @@ public interface LevelRepo extends JpaRepository<Level, Long> {
     @Modifying
     @Query("delete from Level l where l.workId = ?1")
     void deleteByWorkId(Long id);
+
+    @Query("select l from Level l where l.workId = ?1 and ?2 between l.minScore and l.maxScore")
+    Level findByWorkIdAndScore(Long workId, Integer score);
 }

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

@@ -111,7 +111,7 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     @Query(value = "SELECT q.`id`,t.`marker_id` markerId,mu.login_name loginName, 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 JOIN mark_user mu on t.marker_id = mu.id LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ? and p.batch_no = ? GROUP BY t.marker_id,mu.login_name, t.`marker_name` ORDER BY q.`id`,t.marker_id", nativeQuery = true)
+            "t.work_id = ? and t.subject = ? and t.stage = ? and p.is_missing = false and p.is_test = ? and p.batch_no = ? GROUP BY q.`id`,t.marker_id,mu.login_name, t.`marker_name`,q.`name` ORDER BY q.`id`,t.marker_id", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndMarkerAndBatchNo(Long workId, String name, Integer stageId, int test, Long batchNo);
 
     /**
@@ -122,7 +122,7 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`score` IS NULL,1,0)) leftCount,COUNT(p.question_id) totalCount " +
             "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
-            "p.work_id = ? and p.subject = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+            "p.work_id = ? and p.subject = ? and p.is_missing = false  GROUP BY q.area_code, q.area_name, q.`name` ORDER BY q.area_code", nativeQuery = true)
     List<Object[]> listGroupByAreaName(Long workId, String name);
 
     /**
@@ -133,7 +133,7 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     @Query(value = "SELECT q.area_code areaCode, q.area_name areaName, q.`name`,SUM(IF(p.`level` IS NULL or (p.level is not null and p.is_active = 0),1,0)) leftCount,COUNT(p.question_id) totalCount " +
             "FROM exam_question q LEFT  JOIN paper p ON q.id = p.question_id AND q.subject = p.subject WHERE " +
-            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name ORDER BY q.area_code", nativeQuery = true)
+            "p.work_id = ? and p.subject = ? and p.is_missing = false and p.is_test = ?  GROUP BY q.area_code, q.area_name, q.`name` ORDER BY q.area_code", nativeQuery = true)
     List<Object[]> listGroupByAreaName(Long workId, String name, int test);
 
     /**
@@ -154,7 +154,7 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     @Query(value = "SELECT q.`id`,t.`marker_id` markerId,mu.login_name loginName,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 JOIN mark_user mu on t.marker_id = mu.id LEFT OUTER JOIN exam_question q ON t.`question_id` = q.`id` LEFT  JOIN paper p ON t.paper_id = p.id WHERE " +
-            "t.work_id = ? and t.subject = ? and t.stage = ? and p.score_batch_no = ? and p.is_missing = false GROUP BY t.marker_id,mu.login_name, t.`marker_name` ORDER BY q.`id`, t.`marker_id`", nativeQuery = true)
+            "t.work_id = ? and t.subject = ? and t.stage = ? and p.score_batch_no = ? and p.is_missing = false GROUP BY q.`id`,t.marker_id,mu.login_name, t.`marker_name`,q.`name` ORDER BY q.`id`, t.`marker_id`", nativeQuery = true)
     List<Object[]> listGroupByQuestionAndMarkerAndScoreBatchNo(Long workId, String name, Integer stageId, Long batchNo);
 
     /**

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

@@ -1,6 +1,8 @@
 package cn.com.qmth.stmms.ms.marking.api;
 
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.commons.lock.LockService;
+import cn.com.qmth.stmms.ms.commons.lock.LockType;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
@@ -34,6 +36,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.Predicate;
 import javax.servlet.http.HttpServletRequest;
@@ -67,10 +70,10 @@ public class PaperApi {
 
     @Autowired
     private MarkingService markingService;
-
+    @Resource
+    private LockService lockService;
     @Autowired
     ExamQuestionRepo examQuestionRepo;
-
     @Autowired
     SystemConfig systemConfig;
 
@@ -774,4 +777,29 @@ public class PaperApi {
         Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumber(workId, subject, examNumber);
         return paperAssembler.toDTO(paper);
     }
+
+    /**
+     * 科组长-直接给分
+     *
+     * @param workId  工作ID
+     * @param paperId 试卷ID
+     * @param stage   阶段
+     * @param score   分数
+     */
+    @RequestMapping(value = "/leader/manualScore", method = RequestMethod.POST)
+    public Object updateScoreByLeader(@RequestParam Long workId,
+                                      @RequestParam Long paperId,
+                                      @RequestParam MarkStage stage,
+                                      @RequestParam Integer score) {
+        try {
+            lockService.waitlock(LockType.PAPER, paperId);
+            markingService.updateScoreByLeader(workId, paperId, stage, score);
+        } catch (Exception e) {
+            throw new RuntimeException("打分异常");
+        } finally {
+            lockService.unlock(LockType.PAPER, paperId);
+        }
+
+        return true;
+    }
 }

+ 0 - 58
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/AssignTaskService.java

@@ -44,9 +44,6 @@ public class AssignTaskService {
     @Autowired
     private TaskPublishSettingRepo taskPublishSettingRepo;
 
-    @Value("${sys.config.random-bundle-size}")
-    private int randomBundleSize;
-
     @Autowired
     RandomUtil randomUtil;
 
@@ -59,61 +56,6 @@ public class AssignTaskService {
     @Resource
     StageControlService stageControlService;
 
-    /**
-     * 单评任务模式,每个科目评卷员都需要对该科目每份试卷进行评卷
-     * 比如,色彩有1000份试卷,那么每个评卷员都需要评1000份
-     *
-     * @param papers
-     * @param markers
-     */
-    @Transactional
-    public void assignForAll(List<Paper> papers, Iterable<MarkUser> markers, MarkSubject markSubject) throws Exception {
-        List<MarkTask> markTasks = new ArrayList<>();
-        int paperCount = papers.size();
-        int randomBundleCount = paperCount / randomBundleSize;
-        if (paperCount % randomBundleSize != 0) {
-            randomBundleCount += 1;
-        }
-        List<MarkTask> markTaskList = markTaskRepo.findByWorkId(markSubject.getWorkId());
-        Map<Long, Object> randomMap = markTaskList.stream().collect(Collectors.toMap(MarkTask::getRandomSeqNew, Function.identity(), (dto1, dto2) -> dto1));
-        for (int i = 0; i < randomBundleCount; i++) {
-            int fromIndex = i * randomBundleSize;
-            int endIndex = i * randomBundleSize + randomBundleSize;
-            if (endIndex > paperCount) {
-                endIndex = paperCount;
-            }
-            List<Paper> bundleList = papers.subList(fromIndex, endIndex);
-
-            for (MarkUser marker : markers) {
-                List<Paper> markerPaperList = Arrays.asList(new Paper[bundleList.size()]);
-
-                Collections.copy(markerPaperList, bundleList);
-                Collections.shuffle(markerPaperList);//乱序
-
-                for (int j = 0; j < markerPaperList.size(); j++) {
-                    Paper paper = markerPaperList.get(j);
-                    Long random = getRandom(marker.getId(), paper.getId(), marker.getWorkId(), paper.getExamNumber(), randomMap);
-                    MarkTask markTask = new MarkTask(marker, paper, markSubject.getStage(), random, markSubject.getTest());
-                    markTask.setRandomSeq(i * randomBundleSize + j + 1);
-                    markTasks.add(markTask);
-                }
-            }
-
-        }
-
-        markTaskRepo.save(markTasks);
-
-//        Iterator<Paper> iterator = papers.iterator();
-//        while (iterator.hasNext()) {
-//            Paper paper = iterator.next();
-//            for (MarkUser marker : markers) {
-//                MarkTask markTask = new MarkTask(marker, paper, markSubject.getStage());
-//                markTaskRepo.save(markTask);
-//                //taskExecutor.execute(papers,marker,stage);
-//            }
-//        }
-    }
-
     /**
      * 分组任务模式,将该科目的评卷员分成N组,将该科目试卷平均分给这些组,每组内的评卷员每人将这些试卷打分
      * 比如:6个评卷员分2组,有1000份试卷,每组评500份,每个评卷员评500份

+ 79 - 1
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.commons.utils.ServletUtil;
 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.*;
@@ -12,7 +13,6 @@ 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.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.config.MarkingConfig;
-import cn.com.qmth.stmms.ms.marking.service.arbitration.ArbitrationService;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -397,6 +397,32 @@ public class MarkingService {
             paper.setScore(fs);
             //改档打分完成,更新状态为false
             paper.setShiftScore(false);
+
+            // 最终分数和档位不匹配,需要更新档位
+            Level level = levelRepo.findByWorkIdAndScore(markTask.getWorkId(), (int) fs);
+            if (level != null && !level.getCode().equals(paper.getLevel())) {
+                paper.setLevel(level.getCode());
+
+                List<MarkLog> markLogList = new ArrayList<>();
+                Work work = workRepo.findOne(markTask.getWorkId());
+                // 打分任务
+                markTasks.forEach(m -> {
+                    MarkLog markLog = new MarkLog(m.getMarkerId(), m.getMarkerName(), Role.MARKER, markTask.getSubject(), paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.MARKER_DIRECT_SCORE.getId(), paper.getWorkId(), paper.getId(), MarkStage.SCORE, m.getResult() + "[" + m.getLevel() + "]", m.getResult() + "[" + level.getCode() + "]", null, work.getName(), new Date());
+                    markLogList.add(markLog);
+                    m.setLevel(level.getCode());
+                });
+                markTaskRepo.save(markTasks);
+                // 分档任务
+                List<MarkTask> scoreMarkTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
+                scoreMarkTasks.forEach(m -> {
+                    m.setLevel(level.getCode());
+                    m.setResult(level.getCode());
+                    m.setLevelValue(level.getLevelValue());
+                });
+                markTaskRepo.save(scoreMarkTasks);
+                markLogRepo.save(markLogList);
+            }
+
             paperRepo.save(paper);
         }
         return markTask;
@@ -499,4 +525,56 @@ public class MarkingService {
         }
         return 0;
     }
+
+    @Transactional
+    public void updateScoreByLeader(Long workId, Long paperId, MarkStage stage, Integer score) {
+        if (!MarkStage.SCORE.equals(stage)) {
+            throw new RuntimeException("打分阶段才可执行此操作");
+        }
+        if (score == null) {
+            throw new RuntimeException("请输入分数");
+        }
+        Level level = levelRepo.findByWorkIdAndScore(workId, score);
+        if (level == null) {
+            throw new RuntimeException("分数[" + score + "]不在任何档位区间内,请重新输入");
+        }
+        Paper paper = paperRepo.findOne(paperId);
+        if (paper == null) {
+            throw new RuntimeException("试卷不存在");
+        }
+        //原始分数和档位
+        String operDataBefore = paper.getScore() == null ? "未打分[" + paper.getLevel() + "]" : paper.getScore() + "[" + paper.getLevel() + "]";
+
+        // 打分任务
+        List<MarkTask> scoreMarkTasks = markTaskRepo.findByPaperIdAndStage(paperId, MarkStage.SCORE);
+        scoreMarkTasks.forEach(m -> {
+            m.setResult(String.valueOf(score));
+            m.setLevel(level.getCode());
+            m.setManualScore(1);
+            m.setUpdatedOn(new Date());
+        });
+        markTaskRepo.save(scoreMarkTasks);
+
+        // 分档任务
+        List<MarkTask> levelMarkTasks = markTaskRepo.findByPaperIdAndStage(paperId, MarkStage.SCORE);
+        levelMarkTasks.forEach(m -> {
+            m.setResult(level.getCode());
+            m.setLevel(level.getCode());
+            m.setLevelValue(level.getLevelValue());
+            m.setUpdatedOn(new Date());
+        });
+        markTaskRepo.save(levelMarkTasks);
+
+        // 试卷最终档位和分数
+        paper.setLevel(level.getCode());
+        paper.setScore(Double.valueOf(score));
+        paper.setSortNum(level.getWeight() * levelMarkTasks.size());
+        paperRepo.save(paper);
+
+        // 操作日志
+        MarkUser markUser = markUserRepo.findOne(ServletUtil.getUserId());
+        Work work = workRepo.findOne(workId);
+        MarkLog markLog = new MarkLog(markUser.getId(), markUser.getName(), markUser.getRole(), markUser.getSubject(), paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.LEADER_DIRECT_SCORE.getId(), paper.getWorkId(), paper.getId(), MarkStage.SCORE, operDataBefore, paper.getScore() + "[" + paper.getLevel() + "]", null, work.getName(), new Date());
+        markLogRepo.save(markLog);
+    }
 }