فهرست منبع

新增三评规则逻辑

ting.yin 5 سال پیش
والد
کامیت
9588b5a10b

+ 5 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java

@@ -13,6 +13,7 @@ import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 public interface MarkGroupDao
         extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>, JpaSpecificationExecutor<MarkGroup> {
@@ -131,5 +132,9 @@ public interface MarkGroupDao
             + "and g.status in (?5)")
     Integer updateStatus(Integer examId, String subjectCode, Integer number, MarkStatus newStatus,
             MarkStatus... currentStatus);
+    
+    @Modifying(clearAutomatically = true)
+    @Query("update MarkGroup g set g.thirdPolicy=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
+    void updateThirdPolicy(Integer examId, String subjectCode, Integer number, ThirdPolicy third);
 
 }

+ 23 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java

@@ -25,6 +25,7 @@ import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 @Entity
 @Table(name = "eb_mark_group")
@@ -65,6 +66,13 @@ public class MarkGroup implements Serializable {
     @Column(name = "score_policy", nullable = true)
     @Enumerated(EnumType.STRING)
     private ScorePolicy scorePolicy;
+    
+    /**
+     * 三评策略(1-关闭,2-低差值高均分)
+     */
+    @Column(name = "third_policy", nullable = true)
+    @Enumerated(EnumType.STRING)
+    private ThirdPolicy thirdPolicy;
 
     /**
      * 强制评卷模式
@@ -132,7 +140,7 @@ public class MarkGroup implements Serializable {
 
     public MarkGroup(Integer examId, String subjectCode, Integer number, List<PictureConfigItem> configList,
             Double totalScore, Double doubleRate, Double arbitrateThreshold, Integer scorePolicy, String markMode,
-            Integer trialCount, boolean sheetView) {
+            Integer trialCount, boolean sheetView,Integer thirdPolicy) {
         this.pk = new MarkGroupPK();
         this.pk.setExamId(examId);
         this.pk.setNumber(number);
@@ -166,6 +174,12 @@ public class MarkGroup implements Serializable {
             this.status = MarkStatus.FORMAL;
         }
         this.sheetView = sheetView;
+        
+        if (thirdPolicy != null) {
+            this.thirdPolicy = ThirdPolicy.findByValue(thirdPolicy);
+        } else {
+            this.thirdPolicy = ThirdPolicy.DISABLE;
+        }
     }
 
     public Integer getExamId() {
@@ -396,4 +410,12 @@ public class MarkGroup implements Serializable {
         this.mainNumber = mainNumber;
     }
 
+    public ThirdPolicy getThirdPolicy() {
+        return thirdPolicy;
+    }
+    
+    public void setThirdPolicy(ThirdPolicy thirdPolicy) {
+        this.thirdPolicy = thirdPolicy;
+    }
+
 }

+ 88 - 11
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -1,6 +1,8 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 
@@ -45,6 +47,7 @@ import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 /**
  * 与评卷相关的所有修改操作(非传播性的新增操作除外),全部汇总到这里进行集中控制
@@ -235,7 +238,7 @@ public class MarkServiceImpl implements MarkService {
      */
     @Override
     @Transactional
-    public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy) {
+    public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third) {
         questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                 false, group.getNumber());
         double totalScore = 0d;
@@ -246,6 +249,7 @@ public class MarkServiceImpl implements MarkService {
         }
         groupDao.updateTotalScore(group.getExamId(), group.getSubjectCode(), group.getNumber(), totalScore);
         groupDao.updateScorePolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), policy);
+        groupDao.updateThirdPolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), third);
         subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
                 sumTotalScore(group.getExamId(), group.getSubjectCode()));
         resetGroup(group);
@@ -507,17 +511,22 @@ public class MarkServiceImpl implements MarkService {
                     // 本评卷任务或组长已打分,则跳过该任务
                     continue;
                 }
+                //分差超过阀值,
                 if (Math.abs(other.getMarkerScore() - result.getTotalScore()) > group.getArbitrateThreshold()) {
-                    // 分差超过阀值,触发仲裁
-                    history = new ArbitrateHistory();
-                    history.setExamId(library.getExamId());
-                    history.setSubjectCode(library.getSubjectCode());
-                    history.setGroupNumber(library.getGroupNumber());
-                    history.setStudentId(library.getStudentId());
-                    history.setExamNumber(library.getExamNumber());
-                    history.setStatus(HistoryStatus.WAITING);
-                    history.setCreateTime(now);
-                    break;
+                    //开启三评
+                    if(group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)){
+                        if(libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(),
+                                library.getGroupNumber())==2){
+                            buildThirdLibrary(library,group);
+                        }else{
+                            //两两比较,触发仲裁
+                            history = getArbitrate(list,group.getArbitrateThreshold(), now);
+                        }
+                    }else{
+                        //未开启三评,触发仲裁
+                        history = getArbitrate(library, now);
+                        break;
+                    }
                 }
             }
         }
@@ -531,6 +540,50 @@ public class MarkServiceImpl implements MarkService {
         return true;
     }
 
+    private ArbitrateHistory getArbitrate(List<MarkLibrary> list,Double arbitrateThreshold, Date now) {
+        int count = 0;
+        for (int i = 0; i < list.size(); i++) {
+            int next = i +1;
+            if(next == list.size()){
+                next = 0;
+            }
+            if (Math.abs(list.get(i).getMarkerScore() - list.get(next).getMarkerScore()) > arbitrateThreshold) {
+                count ++;
+            }
+        }
+        if(count == list.size()){
+            return getArbitrate(list.get(0),now);
+        }
+        return null;
+    }
+
+    private ArbitrateHistory getArbitrate(MarkLibrary library, Date now) {
+        ArbitrateHistory history;
+        history = new ArbitrateHistory();
+        history.setExamId(library.getExamId());
+        history.setSubjectCode(library.getSubjectCode());
+        history.setGroupNumber(library.getGroupNumber());
+        history.setStudentId(library.getStudentId());
+        history.setExamNumber(library.getExamNumber());
+        history.setStatus(HistoryStatus.WAITING);
+        history.setCreateTime(now);
+        return history;
+    }
+
+    private void buildThirdLibrary(MarkLibrary markLibrary, MarkGroup group) {
+        MarkLibrary library = new MarkLibrary();
+        library.setExamId(markLibrary.getExamId());
+        library.setSubjectCode(markLibrary.getSubjectCode());
+        library.setGroupNumber(group.getNumber());
+        library.setCampusId(markLibrary.getCampusId());
+        library.setStudentId(markLibrary.getStudentId());
+        library.setExamNumber(markLibrary.getExamNumber());
+        library.setTaskNumber(3);
+        library.setStatus(LibraryStatus.WAITING);
+        libraryDao.save(library);
+        updateLibraryCount(group);
+    }
+
     /**
      * 管理员/组长打回某个评卷任务<br>
      * 暂时不用到BACKED状态,直接等同于重置该评卷任务
@@ -636,6 +689,30 @@ public class MarkServiceImpl implements MarkService {
                 // 有非完成状态的评卷任务,直接返回
                 return false;
             }
+        }
+        // 开启三评
+        if(ThirdPolicy.LOW_DIFF_HIGH_AVG.equals(group.getThirdPolicy()) && list.size()==3){
+//          Collections.sort(list, Comparator.comparing(MarkLibrary::getMarkerScore));
+            Collections.sort(list, new Comparator<MarkLibrary>() {
+                @Override
+                public int compare(MarkLibrary o1, MarkLibrary o2) {
+                    if (o1.getMarkerScore()-o2.getMarkerScore() > 0) {
+                        return -1;
+                    }
+                    return 1;
+                }
+            });
+            Double score1 = list.get(0).getHeaderScore() != null ? list.get(0).getHeaderScore() : list.get(0).getMarkerScore();
+            Double score2 = list.get(1).getHeaderScore() != null ? list.get(1).getHeaderScore() : list.get(1).getMarkerScore();
+            Double score3 = list.get(2).getHeaderScore() != null ? list.get(2).getHeaderScore() : list.get(2).getMarkerScore();
+            if((score3-score2)>=(score2-score1)){
+                list.remove(0);
+            }else{
+                list.remove(2);
+            }
+            policy = ScorePolicy.AVG;
+        }
+        for (MarkLibrary library : list) {
             count++;
             Double current = (library.getHeaderScore() != null ? library.getHeaderScore() : library.getMarkerScore());
             List<ScoreItem> scores = library.getScoreList();

+ 3 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -13,6 +13,7 @@ import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkResult;
 import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 public interface MarkService {
 
@@ -57,8 +58,9 @@ public interface MarkService {
      * 修改并重置某个大题
      * 
      * @param group
+     * @param third 
      */
-    void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy);
+    void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third);
 
     /**
      * 评卷员申请领取某个正式评卷任务

+ 36 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/ThirdPolicy.java

@@ -0,0 +1,36 @@
+package cn.com.qmth.stmms.common.enums;
+
+/**
+ * 三评情况下的合分策略
+ * 
+ */
+public enum ThirdPolicy {
+    DISABLE("关闭", 1), 
+    LOW_DIFF_HIGH_AVG("低差值高均分", 2);
+
+    private String name;
+
+    private int value;
+
+    private ThirdPolicy(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static ThirdPolicy findByValue(int value) {
+        for (ThirdPolicy c : ThirdPolicy.values()) {
+            if (c.getValue() == value) {
+                return c;
+            }
+        }
+        return null;
+    }
+}

+ 2 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java

@@ -14,6 +14,7 @@ import org.apache.commons.lang.StringUtils;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 public class SubjectQuestionDTO {
 
@@ -65,7 +66,7 @@ public class SubjectQuestionDTO {
                     group = new MarkGroup(examId, subjectCode, question.getGroupNumber(),
                             PictureConfigItem.parse(question.getPicList()), 0d, question.getDoubleRate(),
                             question.getArbitrateThreshold(), question.getScorePolicy(), question.getMarkMode(),
-                            question.getTrialCount(), false);
+                            question.getTrialCount(), false,1);
                     group.setQuestionMap(new HashMap<Integer, List<ExamQuestion>>());
                     groups.put(question.getGroupNumber(), group);
                 }

+ 9 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -50,6 +50,7 @@ import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -246,6 +247,7 @@ public class MarkGroupController extends BaseExamController {
         model.addAttribute("group", group);
         model.addAttribute("markModeList", MarkMode.values());
         model.addAttribute("scorePolicyList", ScorePolicy.values());
+        model.addAttribute("thirdPolicyList", ThirdPolicy.values());
         return "modules/exam/groupAdd";
     }
 
@@ -312,6 +314,7 @@ public class MarkGroupController extends BaseExamController {
             model.addAttribute("pictureConfig", pictureConfig);
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
+            model.addAttribute("thirdPolicyList", ThirdPolicy.values());
             return "modules/exam/groupEditFull";
         } else {
             redirectAttributes.addAttribute("subjectCode", subjectCode);
@@ -351,7 +354,7 @@ public class MarkGroupController extends BaseExamController {
     public String save(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode, @RequestParam Integer number, @RequestParam Boolean reset,
             @RequestParam(required = false) String picList, @RequestParam(required = false) Double doubleRate,
-            @RequestParam(required = false) Double arbitrateThreshold,
+            @RequestParam(required = false) Double arbitrateThreshold,@RequestParam(required = false) Integer thirdPolicy,
             @RequestParam(required = false) Integer scorePolicy, @RequestParam(required = false) MarkMode markMode,
             @RequestParam(required = false) Integer trialCount, @RequestParam(required = false) boolean sheetView,
             @RequestParam(required = false) String questionDetail,
@@ -392,10 +395,11 @@ public class MarkGroupController extends BaseExamController {
                     }
                     if (detailList != null && detailList.size() > 0) {
                         ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
+                        ThirdPolicy third = thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy) : ThirdPolicy.DISABLE;
                         try {
                             lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
                                     group.getNumber());
-                            markService.updateGroup(group, buildQuestionList(group, detailList), policy);
+                            markService.updateGroup(group, buildQuestionList(group, detailList), policy,third);
                         } catch (Exception e) {
                             log.error("update group error", e);
                             throw new RuntimeException("重置更新大题失败", e);
@@ -461,7 +465,7 @@ public class MarkGroupController extends BaseExamController {
     public String insert(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode, @RequestParam Integer number, @RequestParam String questionDetail,
             @RequestParam String picList, @RequestParam(required = false) Double doubleRate,
-            @RequestParam(required = false) Double arbitrateThreshold,
+            @RequestParam(required = false) Double arbitrateThreshold,@RequestParam(required = false) Integer thirdPolicy,
             @RequestParam(required = false) Integer scorePolicy, @RequestParam(required = false) String markMode,
             @RequestParam(required = false) Integer trialCount, @RequestParam(required = false) boolean sheetView) {
         int examId = getSessionExamId(request);
@@ -508,7 +512,7 @@ public class MarkGroupController extends BaseExamController {
                         }
                     }
                     group = new MarkGroup(examId, subjectCode, number, picConfigList, 0d, doubleRate, arbitrateThreshold,
-                            scorePolicy, markMode, trialCount, sheetView);
+                            scorePolicy, markMode, trialCount, sheetView,thirdPolicy);
                     // clear and replace exam_question
                     questionService.deleteByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     List<ExamQuestion> list = buildQuestionList(group, detailList);
@@ -553,7 +557,7 @@ public class MarkGroupController extends BaseExamController {
         } else {
             addMessage(redirectAttributes, "参数有误");
             redirectAttributes.addAttribute("subjectCode", subjectCode);
-            return "redirect:/admin/exam/group";
+            return "redirect:/admin/exam/group/add";
         }
     }
 

+ 10 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupAdd.jsp

@@ -119,6 +119,16 @@
 	                </c:forEach>
 	            </select>
             </div>
+        </div>
+		<div class="control-group">
+            <label class="control-label">三评规则</label>
+            <div class="controls">
+				<select name="thirdPolicy">
+	                <c:forEach items="${thirdPolicyList}" var="item">
+	                	 <option value="${item.value}" >${item.name}</option>
+	                </c:forEach>
+	            </select>
+            </div>
         </div>
         </div>
 		<div class="control-group">

+ 10 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditFull.jsp

@@ -141,6 +141,16 @@
 	                </c:forEach>
 	            </select>
             </div>
+        </div>
+		<div class="control-group">
+            <label class="control-label">三评规则</label>
+            <div class="controls">
+				<select name="thirdPolicy">
+	                <c:forEach items="${thirdPolicyList}" var="item">
+	                	 <option value="${item.value}"<c:if test="${item.value==group.thirdPolicy.value}">selected</c:if> >${item.name}</option>
+	                </c:forEach>
+	            </select>
+            </div>
         </div>
         </div>
  		<div class="control-group">