Browse Source

新增小题仲裁统分

yin 1 year ago
parent
commit
bb972247e8

+ 12 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/ArbitrateHistory.java

@@ -5,14 +5,7 @@ import java.util.Date;
 import java.util.LinkedList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.List;
 
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.Transient;
+import javax.persistence.*;
 
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 
 
@@ -268,6 +261,17 @@ public class ArbitrateHistory implements Serializable {
         return questionIndex;
         return questionIndex;
     }
     }
 
 
+    public List<Integer> getQuestionIndexList() {
+        List<Integer> list = new LinkedList<Integer>();
+        if (StringUtils.isNotBlank(questionIndex)) {
+            String[] values = questionIndex.split(",");
+            for (String value : values) {
+                list.add(Integer.parseInt(value));
+            }
+        }
+        return list;
+    }
+
     public void setQuestionIndex(String questionIndex) {
     public void setQuestionIndex(String questionIndex) {
         this.questionIndex = questionIndex;
         this.questionIndex = questionIndex;
     }
     }

+ 5 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkResult.java

@@ -1,10 +1,6 @@
 package cn.com.qmth.stmms.biz.mark.model;
 package cn.com.qmth.stmms.biz.mark.model;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 
 
@@ -109,6 +105,10 @@ public class MarkResult {
         return StringUtils.join(list, SPLIT);
         return StringUtils.join(list, SPLIT);
     }
     }
 
 
+    public Double[] getMarkerScoreList() {
+        return scoreList;
+    }
+
     public void setScoreList(Double[] scoreList) {
     public void setScoreList(Double[] scoreList) {
         this.scoreList = scoreList;
         this.scoreList = scoreList;
     }
     }

+ 19 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/Task.java

@@ -119,8 +119,7 @@ public class Task implements Serializable {
      * 打回上次分数
      * 打回上次分数
      */
      */
     private String rejectScoreList;
     private String rejectScoreList;
-    
-    
+
     /**
     /**
      * 打回后的分数
      * 打回后的分数
      */
      */
@@ -141,6 +140,11 @@ public class Task implements Serializable {
      */
      */
     private String message;
     private String message;
 
 
+    /**
+     * 仲裁题目位置
+     */
+    private String arbitrateIndex;
+
     public Integer getLibraryId() {
     public Integer getLibraryId() {
         return libraryId;
         return libraryId;
     }
     }
@@ -341,12 +345,19 @@ public class Task implements Serializable {
         this.headerTagList = headerTagList;
         this.headerTagList = headerTagList;
     }
     }
 
 
-	public String getAfterRejectScoreList() {
-		return afterRejectScoreList;
-	}
+    public String getAfterRejectScoreList() {
+        return afterRejectScoreList;
+    }
 
 
-	public void setAfterRejectScoreList(String afterRejectScoreList) {
-		this.afterRejectScoreList = afterRejectScoreList;
-	}
+    public void setAfterRejectScoreList(String afterRejectScoreList) {
+        this.afterRejectScoreList = afterRejectScoreList;
+    }
+
+    public String getArbitrateIndex() {
+        return arbitrateIndex;
+    }
 
 
+    public void setArbitrateIndex(String arbitrateIndex) {
+        this.arbitrateIndex = arbitrateIndex;
+    }
 }
 }

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

@@ -5,6 +5,7 @@ import java.text.DecimalFormat;
 import java.util.*;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -698,7 +699,7 @@ public class MarkServiceImpl implements MarkService {
         }
         }
         // 判断多评模式下是否需要仲裁
         // 判断多评模式下是否需要仲裁
         ArbitrateHistory history = null;
         ArbitrateHistory history = null;
-        if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
+        if (group.getDoubleRate() != null && group.getDoubleRate() > 0) {
             // 多评模式
             // 多评模式
             List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
             List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
                     library.getGroupNumber(), LibraryStatus.MARKED, LibraryStatus.INSPECTED);
                     library.getGroupNumber(), LibraryStatus.MARKED, LibraryStatus.INSPECTED);
@@ -715,25 +716,27 @@ public class MarkServiceImpl implements MarkService {
                 if ((other.getMarkerScore() != UN_SELECTIVE_SCORE && result.getMarkerScore() == UN_SELECTIVE_SCORE)
                 if ((other.getMarkerScore() != UN_SELECTIVE_SCORE && result.getMarkerScore() == UN_SELECTIVE_SCORE)
                         || (other.getMarkerScore() == UN_SELECTIVE_SCORE
                         || (other.getMarkerScore() == UN_SELECTIVE_SCORE
                                 && result.getMarkerScore() != UN_SELECTIVE_SCORE)) {
                                 && result.getMarkerScore() != UN_SELECTIVE_SCORE)) {
-                    history = buildArbitrateHistory(library, now);
+                    history = buildArbitrateHistory(library, now, new ArrayList<>());
                     break;
                     break;
                 }
                 }
-                // 分差超过阀值
-                if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
+                List<Integer> arbitrateIndex = getArbitrateIndex(other, result, group);
+                if (arbitrateIndex != null) {
                     // 开启三评
                     // 开启三评
                     if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
                     if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
                         if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(),
                         if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(),
                                 library.getGroupNumber()) == 2) {
                                 library.getGroupNumber()) == 2) {
                             buildThirdLibrary(library, group);
                             buildThirdLibrary(library, group);
+                            break;
                         } else {
                         } else {
                             // 两两比较,触发仲裁
                             // 两两比较,触发仲裁
                             List<MarkLibrary> libraries = libraryDao
                             List<MarkLibrary> libraries = libraryDao
                                     .findByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
                                     .findByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
-                            history = buildArbitrateHistory(libraries, group.getArbitrateThreshold(), now);
+                            history = buildArbitrateHistory(libraries, group, now);
+                            break;
                         }
                         }
                     } else {
                     } else {
                         // 未开启三评,触发仲裁
                         // 未开启三评,触发仲裁
-                        history = buildArbitrateHistory(library, now);
+                        history = buildArbitrateHistory(library, now, arbitrateIndex);
                         break;
                         break;
                     }
                     }
                 }
                 }
@@ -755,30 +758,79 @@ public class MarkServiceImpl implements MarkService {
         return true;
         return true;
     }
     }
 
 
-    private ArbitrateHistory buildArbitrateHistory(List<MarkLibrary> list, Double arbitrateThreshold, Date now) {
+    private List<Integer> getArbitrateIndex(MarkLibrary other, MarkResult result, MarkGroup group) {
+        List<Integer> arbitrateIndex = null;
+        if (ArbitrateType.QUESTION.equals(group.getArbitrateType())) {
+            List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    other.getExamId(), other.getSubjectCode(), false, other.getGroupNumber());
+            List<ScoreItem> list1 = other.getMarkerScoreItem();
+            Double[] list2 = result.getMarkerScoreList();
+            if (questionList.size() == list1.size() && list1.size() == list2.length) {
+                for (int i = 0; i < questionList.size(); i++) {
+                    Double arbitrateThreshold = questionList.get(0).getArbitrateThreshold();
+                    if (Math.abs(list1.get(i).getScore() - list2[i]) > arbitrateThreshold) {
+                        if (arbitrateIndex == null) {
+                            arbitrateIndex = new ArrayList<>();
+                        }
+                        arbitrateIndex.add(i + 1);
+                    }
+                }
+            }
+        } else {
+            if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
+                return new ArrayList<>();
+            }
+        }
+        return arbitrateIndex;
+    }
+
+    private ArbitrateHistory buildArbitrateHistory(List<MarkLibrary> list, MarkGroup group, Date now) {
         for (MarkLibrary library : list) {
         for (MarkLibrary library : list) {
             if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED
             if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED
                     && library.getStatus() != LibraryStatus.INSPECTED) {
                     && library.getStatus() != LibraryStatus.INSPECTED) {
                 return null;
                 return null;
             }
             }
         }
         }
-        int count = 0;
-        for (int i = 0; i < list.size(); i++) {
-            int next = i + 1;
-            if (next == list.size()) {
-                next = 0;
+        List<Integer> arbitrateIndex = new ArrayList<>();
+        if (ArbitrateType.QUESTION.equals(group.getArbitrateType())) {
+            List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    group.getExamId(), group.getSubjectCode(), false, group.getNumber());
+            List<ScoreItem> scoreItemList = list.get(0).getMarkerScoreItem();
+            List<ScoreItem> scoreItemList1 = list.get(1).getMarkerScoreItem();
+            List<ScoreItem> scoreItemList2 = list.get(2).getMarkerScoreItem();
+            for (int j = 0; j < questionList.size(); j++) {
+                Double arbitrateThreshold = questionList.get(0).getArbitrateThreshold();
+                if (Math.abs(scoreItemList.get(j).getScore() - scoreItemList1.get(j).getScore()) > arbitrateThreshold
+                        && Math.abs(scoreItemList1.get(j).getScore()
+                                - scoreItemList2.get(j).getScore()) > arbitrateThreshold
+                        && Math.abs(scoreItemList2.get(j).getScore()
+                                - scoreItemList.get(j).getScore()) > arbitrateThreshold) {
+                    arbitrateIndex.add(j + 1);
+                }
             }
             }
-            if (Math.abs(list.get(i).getMarkerScore() - list.get(next).getMarkerScore()) > arbitrateThreshold) {
-                count++;
+            if (!arbitrateIndex.isEmpty()) {
+                return buildArbitrateHistory(list.get(0), now, arbitrateIndex);
+            }
+        } else {
+            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()) > group
+                        .getArbitrateThreshold()) {
+                    count++;
+                }
+            }
+            if (count == list.size()) {
+                return buildArbitrateHistory(list.get(0), now, arbitrateIndex);
             }
             }
-        }
-        if (count == list.size()) {
-            return buildArbitrateHistory(list.get(0), now);
         }
         }
         return null;
         return null;
     }
     }
 
 
-    private ArbitrateHistory buildArbitrateHistory(MarkLibrary library, Date now) {
+    private ArbitrateHistory buildArbitrateHistory(MarkLibrary library, Date now, List<Integer> arbitrateIndex) {
         ArbitrateHistory history = new ArbitrateHistory();
         ArbitrateHistory history = new ArbitrateHistory();
         history.setExamId(library.getExamId());
         history.setExamId(library.getExamId());
         history.setSubjectCode(library.getSubjectCode());
         history.setSubjectCode(library.getSubjectCode());
@@ -788,6 +840,9 @@ public class MarkServiceImpl implements MarkService {
         history.setSecretNumber(library.getSecretNumber());
         history.setSecretNumber(library.getSecretNumber());
         history.setStatus(HistoryStatus.WAITING);
         history.setStatus(HistoryStatus.WAITING);
         history.setCreateTime(now);
         history.setCreateTime(now);
+        if (!arbitrateIndex.isEmpty()) {
+            history.setQuestionIndex(StringUtils.join(arbitrateIndex, ","));
+        }
         return history;
         return history;
     }
     }
 
 
@@ -877,13 +932,18 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 管理员/组长处理仲裁卷
      * 管理员/组长处理仲裁卷
      *
      *
-     * @param history
-     *            - 仲裁卷
+     * - 仲裁卷
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
     public void processArbitrate(MarkResult result, Integer userId) {
     public void processArbitrate(MarkResult result, Integer userId) {
         ArbitrateHistory history = arbitrateDao.findOne(result.getLibraryId());
         ArbitrateHistory history = arbitrateDao.findOne(result.getLibraryId());
+        MarkGroup group = groupDao.findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
+        Double[] markerScoreList = result.getMarkerScoreList();
+        List<Integer> questionIndexList = history.getQuestionIndexList();
+        if (!questionIndexList.isEmpty() && markerScoreList.length != questionIndexList.size()) {
+            return;
+        }
         history.setUserId(userId);
         history.setUserId(userId);
         history.setTotalScore(result.isUnselective() ? UN_SELECTIVE_SCORE : result.getMarkerScore());
         history.setTotalScore(result.isUnselective() ? UN_SELECTIVE_SCORE : result.getMarkerScore());
         history.setScoreList(result.isUnselective() ? null : result.getScoreList());
         history.setScoreList(result.isUnselective() ? null : result.getScoreList());
@@ -908,9 +968,20 @@ public class MarkServiceImpl implements MarkService {
                 headerTagDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
                 headerTagDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
                 headerTagDao.save(result.getHeaderTagList(history));
                 headerTagDao.save(result.getHeaderTagList(history));
             }
             }
+            List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    history.getExamId(), history.getSubjectCode(), false, history.getGroupNumber());
+            List<Object> scoreList = new ArrayList<>();
+            for (int i = 0; i < questionList.size(); i++) {
+                if (questionIndexList.contains(i + 1)) {
+                    scoreList.add(markerScoreList[i]);
+                } else {
+                    scoreList.add("#");
+                }
+            }
             arbitrateDao.saveAndFlush(history);
             arbitrateDao.saveAndFlush(history);
             libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(),
             libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(),
-                    history.getTotalScore(), history.getScoreList(), history.getUpdateTime(), LibraryStatus.ARBITRATED);
+                    history.getTotalScore(), StringUtils.join(scoreList, ","), history.getUpdateTime(),
+                    LibraryStatus.ARBITRATED);
             updateMarkedCount(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
             updateMarkedCount(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
             inspectedService.cancelByStudent(history.getStudentId());
             inspectedService.cancelByStudent(history.getStudentId());
             checkStudentGroup(history.getStudentId(),
             checkStudentGroup(history.getStudentId(),
@@ -1122,6 +1193,7 @@ public class MarkServiceImpl implements MarkService {
             return false;
             return false;
         }
         }
         boolean selectiveAll = false;
         boolean selectiveAll = false;
+        boolean arbitrate = false;
         for (MarkLibrary library : list) {
         for (MarkLibrary library : list) {
             if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED
             if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED
                     && library.getStatus() != LibraryStatus.INSPECTED) {
                     && library.getStatus() != LibraryStatus.INSPECTED) {
@@ -1133,82 +1205,133 @@ public class MarkServiceImpl implements MarkService {
             if (markerScore == UN_SELECTIVE_SCORE) {
             if (markerScore == UN_SELECTIVE_SCORE) {
                 selectiveAll = true;
                 selectiveAll = true;
             }
             }
+            if (!arbitrate) {
+                arbitrate = library.getStatus() == LibraryStatus.ARBITRATED;
+            }
         }
         }
         if (selectiveAll) {
         if (selectiveAll) {
             group.setMarkScore(UN_SELECTIVE_SCORE);
             group.setMarkScore(UN_SELECTIVE_SCORE);
             return true;
             return true;
         }
         }
-        // 开启三评
-        if (ThirdPolicy.LOW_DIFF_HIGH_AVG.equals(group.getThirdPolicy()) && list.size() == 3) {
-            // Collections.sort(list,
-            // Comparator.comparing(MarkLibrary::getMarkerScore));
-            // 从小到大排序
-            list.sort((o1, o2) -> {
-                if (o1.getMarkerScore() - o2.getMarkerScore() > 0) {
-                    return 1;
+        // 按小题仲裁取分
+        if (ArbitrateType.QUESTION.equals(group.getArbitrateType())) {
+            List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    group.getExamId(), group.getSubjectCode(), false, group.getNumber());
+            for (int i = 0; i < questionList.size(); i++) {
+                List<Double> doubleList = new ArrayList<>();
+                ScoreItem item = new ScoreItem(false);
+                if (arbitrate) {
+                    item.setScore((list.get(0).getScoreList().get(i).getScore()));
+                    score = BigDecimalUtils.add(score, item.getScore());
+                    continue;
                 }
                 }
-                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();
-            if (count == 1) {
-                // 首份评卷任务,直接取总分与明细
-                score = current;
-                detail = scores;
-            } else {
-                switch (policy) {
-                case AVG:
-                    // 直接累加
-                    score = BigDecimalUtils.add(score, current);
-                    for (int i = 0; i < detail.size(); i++) {
-                        try {
-                            ScoreItem item = detail.get(i);
-                            ScoreItem other = scores.get(i);
-                            item.setScore(BigDecimalUtils.add(item.getScore(), other.getScore()));
-                        } catch (Exception e) {
-                            continue;
+                for (int j = 0; j < list.size(); j++) {
+                    doubleList.add(list.get(j).getScoreList().get(i).getScore());
+                }
+                if (ThirdPolicy.LOW_DIFF_HIGH_AVG.equals(group.getThirdPolicy()) && list.size() == 3) {
+                    doubleList.sort((o1, o2) -> {
+                        if (o1 - o2 > 0) {
+                            return 1;
                         }
                         }
+                        return -1;
+                    });
+                    if ((doubleList.get(2) - doubleList.get(1)) <= (doubleList.get(1) - doubleList.get(0))) {
+                        doubleList.remove(0);
+                    } else {
+                        doubleList.remove(2);
                     }
                     }
-                    break;
-                case MAX:
-                    // 高分优先
-                    if (current > score) {
-                        score = current;
-                        detail = scores;
+                    double sum = doubleList.stream().collect(Collectors.summingDouble(x -> x));
+                    item.setScore(BigDecimalUtils.div(sum, list.size()));
+                    score = BigDecimalUtils.add(score, item.getScore());
+                } else if (ScorePolicy.AVG.equals(group.getScorePolicy())) {
+                    double sum = doubleList.stream().collect(Collectors.summingDouble(x -> x));
+                    item.setScore(BigDecimalUtils.div(sum, list.size()));
+                    score = BigDecimalUtils.add(score, item.getScore());
+                } else if (ScorePolicy.MAX.equals(group.getScorePolicy())) {
+                    double max = doubleList.stream().reduce(doubleList.get(0), Double::max);
+                    item.setScore(max);
+                    score = BigDecimalUtils.add(score, max);
+                } else if (ScorePolicy.MIN.equals(group.getScorePolicy())) {
+                    double min = doubleList.stream().reduce(doubleList.get(0), Double::min);
+                    item.setScore(min);
+                    score = BigDecimalUtils.add(score, min);
+                }
+                detail.add(item);
+            }
+        } else {
+            // 按分组仲裁
+            // 开启三评
+            if (ThirdPolicy.LOW_DIFF_HIGH_AVG.equals(group.getThirdPolicy()) && list.size() == 3) {
+                // Collections.sort(list,
+                // Comparator.comparing(MarkLibrary::getMarkerScore));
+                // 从小到大排序
+                list.sort((o1, o2) -> {
+                    if (o1.getMarkerScore() - o2.getMarkerScore() > 0) {
+                        return 1;
                     }
                     }
-                    break;
-                case MIN:
-                    // 低分优先
-                    if (current < score) {
-                        score = current;
-                        detail = scores;
+                    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();
+                if (count == 1) {
+                    // 首份评卷任务,直接取总分与明细
+                    score = current;
+                    detail = scores;
+                } else {
+                    switch (policy) {
+                    case AVG:
+                        // 直接累加
+                        score = BigDecimalUtils.add(score, current);
+                        for (int i = 0; i < detail.size(); i++) {
+                            try {
+                                ScoreItem item = detail.get(i);
+                                ScoreItem other = scores.get(i);
+                                item.setScore(BigDecimalUtils.add(item.getScore(), other.getScore()));
+                            } catch (Exception e) {
+                                continue;
+                            }
+                        }
+                        break;
+                    case MAX:
+                        // 高分优先
+                        if (current > score) {
+                            score = current;
+                            detail = scores;
+                        }
+                        break;
+                    case MIN:
+                        // 低分优先
+                        if (current < score) {
+                            score = current;
+                            detail = scores;
+                        }
+                        break;
+                    default:
+                        break;
                     }
                     }
-                    break;
-                default:
-                    break;
                 }
                 }
             }
             }
-        }
-        // 取平均分策略下,累计分数需要重新计算一次
-        if (policy == ScorePolicy.AVG && count > 1) {
-            score = BigDecimalUtils.div(score, count);
-            for (ScoreItem item : detail) {
-                item.setScore(BigDecimalUtils.div(item.getScore(), count));
+            // 取平均分策略下,累计分数需要重新计算一次
+            if (policy == ScorePolicy.AVG && count > 1) {
+                score = BigDecimalUtils.div(score, count);
+                for (ScoreItem item : detail) {
+                    item.setScore(BigDecimalUtils.div(item.getScore(), count));
+                }
             }
             }
         }
         }
         group.setMarkScore(score);
         group.setMarkScore(score);

+ 20 - 55
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java

@@ -1,56 +1,19 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
-import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
-import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.dao.HeaderTagDao;
 import cn.com.qmth.stmms.biz.mark.dao.HeaderTagDao;
 import cn.com.qmth.stmms.biz.mark.dao.HeaderTrackDao;
 import cn.com.qmth.stmms.biz.mark.dao.HeaderTrackDao;
-import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
-import cn.com.qmth.stmms.biz.mark.model.HeaderTag;
-import cn.com.qmth.stmms.biz.mark.model.HeaderTrack;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
-import cn.com.qmth.stmms.biz.mark.model.MarkStepDTO;
-import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
-import cn.com.qmth.stmms.biz.mark.model.MarkerSpecialTagDTO;
-import cn.com.qmth.stmms.biz.mark.model.MarkerTrackDTO;
-import cn.com.qmth.stmms.biz.mark.model.RejectHistory;
-import cn.com.qmth.stmms.biz.mark.model.SpecialTagDTO;
-import cn.com.qmth.stmms.biz.mark.model.Task;
-import cn.com.qmth.stmms.biz.mark.model.TrackDTO;
-import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
-import cn.com.qmth.stmms.biz.mark.model.TrialTag;
-import cn.com.qmth.stmms.biz.mark.model.TrialTrack;
+import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
-import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
-import cn.com.qmth.stmms.biz.mark.service.RejectHistoryService;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.biz.mark.service.TrialService;
+import cn.com.qmth.stmms.biz.mark.service.*;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
@@ -133,8 +96,8 @@ public class TaskServiceImpl implements TaskService {
         task.setSecretNumber(history.getSecretNumber());
         task.setSecretNumber(history.getSecretNumber());
         task.setQuestionList(buildArbitrateStep(group, history));
         task.setQuestionList(buildArbitrateStep(group, history));
         task.setSpecialTagList(getHeaderTagList(history.getStudentId(), group.getNumber()));
         task.setSpecialTagList(getHeaderTagList(history.getStudentId(), group.getNumber()));
-        task.setSliceUrls(fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
-                student.getSliceCount()));
+        task.setSliceUrls(
+                fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount()));
         task.setSliceConfig(group.getPictureConfigList());
         task.setSliceConfig(group.getPictureConfigList());
         task.setJsonUrl(fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
         task.setJsonUrl(fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
         if (StringUtils.isNotBlank(student.getObjectiveScoreList())) {
         if (StringUtils.isNotBlank(student.getObjectiveScoreList())) {
@@ -144,6 +107,7 @@ public class TaskServiceImpl implements TaskService {
         if (history.getTotalScore() != null) {
         if (history.getTotalScore() != null) {
             task.setMarkerScore(history.getTotalScore());
             task.setMarkerScore(history.getTotalScore());
         }
         }
+        task.setArbitrateIndex(history.getQuestionIndex());
         return task;
         return task;
     }
     }
 
 
@@ -203,8 +167,8 @@ public class TaskServiceImpl implements TaskService {
             task.setSliceUrls(fileService.getSliceUris(library.getExamId(), library.getSecretNumber(), 1,
             task.setSliceUrls(fileService.getSliceUris(library.getExamId(), library.getSecretNumber(), 1,
                     student.getSliceCount()));
                     student.getSliceCount()));
             task.setSliceConfig(group.getPictureConfigList());
             task.setSliceConfig(group.getPictureConfigList());
-            task.setSheetUrls(fileService.getSheetUris(library.getExamId(), library.getExamNumber(), 1,
-                    student.getSheetCount()));
+            task.setSheetUrls(
+                    fileService.getSheetUris(library.getExamId(), library.getExamNumber(), 1, student.getSheetCount()));
         }
         }
         RejectHistory rejectHistory = rejectHistoryService.findLastByLibraryId(library.getId());
         RejectHistory rejectHistory = rejectHistoryService.findLastByLibraryId(library.getId());
         task.setQuestionList(buildMarkStep(group, library, rejectHistory));
         task.setQuestionList(buildMarkStep(group, library, rejectHistory));
@@ -253,8 +217,8 @@ public class TaskServiceImpl implements TaskService {
             task.setSliceUrls(fileService.getSliceUris(library.getExamId(), library.getSecretNumber(), 1,
             task.setSliceUrls(fileService.getSliceUris(library.getExamId(), library.getSecretNumber(), 1,
                     student.getSliceCount()));
                     student.getSliceCount()));
             task.setSliceConfig(group.getPictureConfigList());
             task.setSliceConfig(group.getPictureConfigList());
-            task.setSheetUrls(fileService.getSheetUris(library.getExamId(), library.getExamNumber(), 1,
-                    student.getSheetCount()));
+            task.setSheetUrls(
+                    fileService.getSheetUris(library.getExamId(), library.getExamNumber(), 1, student.getSheetCount()));
         }
         }
         if (library.getMarkerId() != null) {
         if (library.getMarkerId() != null) {
             task.setSpecialTagList(getTrialTagList(library));
             task.setSpecialTagList(getTrialTagList(library));
@@ -420,8 +384,8 @@ public class TaskServiceImpl implements TaskService {
         } else {
         } else {
             task.setSliceUrls(fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
             task.setSliceUrls(fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
                     student.getSliceCount()));
                     student.getSliceCount()));
-            task.setSheetUrls(fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1,
-                    student.getSheetCount()));
+            task.setSheetUrls(
+                    fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
         }
         }
         if (!student.getSubjectiveStatus().equals(SubjectiveStatus.UNMARK)) {
         if (!student.getSubjectiveStatus().equals(SubjectiveStatus.UNMARK)) {
             long trialGroupCount = groupService.countByExamAndSubjectAndStatus(student.getExamId(),
             long trialGroupCount = groupService.countByExamAndSubjectAndStatus(student.getExamId(),
@@ -442,7 +406,8 @@ public class TaskServiceImpl implements TaskService {
         List<HeaderTag> list = headerTagDao.findByStudentId(student.getId());
         List<HeaderTag> list = headerTagDao.findByStudentId(student.getId());
         SpecialTagDTO[] specialTags = new SpecialTagDTO[list.size()];
         SpecialTagDTO[] specialTags = new SpecialTagDTO[list.size()];
         for (int i = 0; i < list.size(); i++) {
         for (int i = 0; i < list.size(); i++) {
-            specialTags[i] = new MarkerSpecialTagDTO(list.get(i).getUserId(), list.get(i).getGroupNumber(), list.get(i));
+            specialTags[i] = new MarkerSpecialTagDTO(list.get(i).getUserId(), list.get(i).getGroupNumber(),
+                    list.get(i));
         }
         }
         return specialTags;
         return specialTags;
     }
     }
@@ -457,8 +422,8 @@ public class TaskServiceImpl implements TaskService {
         } else {
         } else {
             List<MarkGroup> groups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
             List<MarkGroup> groups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
             for (MarkGroup group : groups) {
             for (MarkGroup group : groups) {
-                List<MarkLibrary> libraryList = libraryService
-                        .findByStudentAndGroup(student.getId(), group.getNumber());
+                List<MarkLibrary> libraryList = libraryService.findByStudentAndGroup(student.getId(),
+                        group.getNumber());
                 // 不管单评还是多评显示所有评卷员特殊标记
                 // 不管单评还是多评显示所有评卷员特殊标记
                 for (MarkLibrary library : libraryList) {
                 for (MarkLibrary library : libraryList) {
                     List<MarkSpecialTag> tagList = markSpecialTagService.findByLibraryId(library.getId());
                     List<MarkSpecialTag> tagList = markSpecialTagService.findByLibraryId(library.getId());
@@ -529,8 +494,8 @@ public class TaskServiceImpl implements TaskService {
                     }
                     }
                 }
                 }
                 // 仲裁轨迹
                 // 仲裁轨迹
-                List<HeaderTrack> headerTracks = headerTrackDao.findByPkStudentIdAndPkQuestionNumberOrderByPkNumberAsc(
-                        student.getId(), questionNumber);
+                List<HeaderTrack> headerTracks = headerTrackDao
+                        .findByPkStudentIdAndPkQuestionNumberOrderByPkNumberAsc(student.getId(), questionNumber);
                 for (HeaderTrack headerTrack : headerTracks) {
                 for (HeaderTrack headerTrack : headerTracks) {
                     step.addHeaderTrack(new TrackDTO(headerTrack));
                     step.addHeaderTrack(new TrackDTO(headerTrack));
                 }
                 }

+ 10 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java

@@ -1,12 +1,12 @@
 package cn.com.qmth.stmms.admin.dto;
 package cn.com.qmth.stmms.admin.dto;
 
 
-import cn.com.qmth.stmms.common.enums.ArbitrateType;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 
 
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.common.annotation.ExcelField;
 import cn.com.qmth.stmms.common.annotation.ExcelField;
+import cn.com.qmth.stmms.common.enums.ArbitrateType;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 
 public class SubjectiveQuestionDTO implements QuestionDTO {
 public class SubjectiveQuestionDTO implements QuestionDTO {
@@ -80,8 +80,13 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         setIntervalScore(question.getIntervalScore());
         setIntervalScore(question.getIntervalScore());
         setPicList(group != null ? group.getPicList() : "");
         setPicList(group != null ? group.getPicList() : "");
         setDoubleRate(group != null && group.getDoubleRate() != null ? group.getDoubleRate() : 0d);
         setDoubleRate(group != null && group.getDoubleRate() != null ? group.getDoubleRate() : 0d);
-        setArbitrateThreshold(group != null && group.getArbitrateThreshold() != null ? group.getArbitrateThreshold()
-                : 0d);
+        if (group != null && ArbitrateType.GROUP.equals(group.getArbitrateType())) {
+            setArbitrateThreshold(
+                    group != null && group.getArbitrateThreshold() != null ? group.getArbitrateThreshold() : 0d);
+        }
+        if (group != null && ArbitrateType.QUESTION.equals(group.getArbitrateType())) {
+            setArbitrateThreshold(question.getArbitrateThreshold() != null ? question.getArbitrateThreshold() : 0d);
+        }
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
                 : ScorePolicy.AVG.getValue());
                 : ScorePolicy.AVG.getValue());
         setArbitrateType(group != null && group.getArbitrateType() != null ? group.getArbitrateType().getValue()
         setArbitrateType(group != null && group.getArbitrateType() != null ? group.getArbitrateType().getValue()
@@ -90,6 +95,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         setTrialCount(subject != null && subject.getTrialCount() != null ? subject.getTrialCount() : 0);
         setTrialCount(subject != null && subject.getTrialCount() != null ? subject.getTrialCount() : 0);
     }
     }
 
 
+    @Override
     public ExamQuestion transform() {
     public ExamQuestion transform() {
         ExamQuestion question = new ExamQuestion();
         ExamQuestion question = new ExamQuestion();
         question.setSubjectCode(StringUtils.trimToNull(subjectCode));
         question.setSubjectCode(StringUtils.trimToNull(subjectCode));
@@ -125,6 +131,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         }
         }
     }
     }
 
 
+    @Override
     public String getSubjectCode() {
     public String getSubjectCode() {
         return subjectCode;
         return subjectCode;
     }
     }

+ 21 - 31
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java

@@ -1,18 +1,10 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -23,14 +15,12 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 
+import com.google.common.collect.Lists;
+
 import cn.com.qmth.stmms.admin.thread.MarkerResetThread;
 import cn.com.qmth.stmms.admin.thread.MarkerResetThread;
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
@@ -38,13 +28,7 @@ import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
@@ -57,17 +41,13 @@ import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.MarkerExcelError;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.enums.UserSource;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-import com.google.common.collect.Lists;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
 
 
 @Controller("examMarkerController")
 @Controller("examMarkerController")
 @RequestMapping("/admin/exam/marker")
 @RequestMapping("/admin/exam/marker")
@@ -143,8 +123,9 @@ public class MarkerController extends BaseExamController {
         for (Marker marker : query.getResult()) {
         for (Marker marker : query.getResult()) {
             marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
             marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
-            int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
-                    .getLibraryCount()) : 0;
+            int percent = group.getLibraryCount() > 0
+                    ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount())
+                    : 0;
             if (group.getMarkedCount() > 0 && percent == 0) {
             if (group.getMarkedCount() > 0 && percent == 0) {
                 percent = 1;
                 percent = 1;
             } else if (group.getLeftCount() > 0 && percent == 100) {
             } else if (group.getLeftCount() > 0 && percent == 100) {
@@ -269,7 +250,8 @@ public class MarkerController extends BaseExamController {
             School school = schoolService.findById(exam.getSchoolId());
             School school = schoolService.findById(exam.getSchoolId());
             boolean warn = systemCache.isGroupDeleteWarn() ? true : school.isGroupDeleteCheck();
             boolean warn = systemCache.isGroupDeleteWarn() ? true : school.isGroupDeleteCheck();
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
-            if (warn && group.getLibraryCount() != 0 && group.getLeftCount() == 0 && !markDeleteCode.equals(deleteCode)) {
+            if (warn && group.getLibraryCount() != 0 && group.getLeftCount() == 0
+                    && !markDeleteCode.equals(deleteCode)) {
                 obj.accumulate("success", false);
                 obj.accumulate("success", false);
                 obj.accumulate("message", "授权码不正确");
                 obj.accumulate("message", "授权码不正确");
                 return obj;
                 return obj;
@@ -591,6 +573,14 @@ public class MarkerController extends BaseExamController {
         if (count > 0 || trialCount > 0) {
         if (count > 0 || trialCount > 0) {
             addMessage(redirectAttributes, "删除评卷员失败,该评卷员已开始评卷");
             addMessage(redirectAttributes, "删除评卷员失败,该评卷员已开始评卷");
         } else {
         } else {
+            try {
+                lockService.waitlock(LockType.MARKER, marker.getId());
+                markService.releaseByMarker(marker);
+            } catch (Exception e) {
+                log.error("release marker error", e);
+            } finally {
+                lockService.unlock(LockType.MARKER, marker.getId());
+            }
             markerService.deleteById(markerId);
             markerService.deleteById(markerId);
         }
         }
         return "redirect:/admin/exam/marker?subjectCode=" + subjectCode + "&groupNumber=" + groupNumber;
         return "redirect:/admin/exam/marker?subjectCode=" + subjectCode + "&groupNumber=" + groupNumber;

+ 294 - 259
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markerList.jsp

@@ -14,7 +14,7 @@
             color: #0663A2;
             color: #0663A2;
             cursor: pointer;
             cursor: pointer;
         }
         }
-        
+
         .taskWindow, .reSetPasswordWin {
         .taskWindow, .reSetPasswordWin {
             width: 400px;
             width: 400px;
             min-height: 150px;
             min-height: 150px;
@@ -28,14 +28,14 @@
             text-align: center;
             text-align: center;
             z-index: 99999;
             z-index: 99999;
         }
         }
-        
+
         .task-header, .password-header {
         .task-header, .password-header {
             width: 100%;
             width: 100%;
             height: 46px;
             height: 46px;
             background: #5d6d7d;
             background: #5d6d7d;
             color: #fff;
             color: #fff;
         }
         }
-        
+
         .task-content, .password-content {
         .task-content, .password-content {
             font-size: 18px;
             font-size: 18px;
             color: #005277;
             color: #005277;
@@ -44,14 +44,14 @@
             line-height: 30px;
             line-height: 30px;
             word-wrap: break-word;
             word-wrap: break-word;
         }
         }
-        
+
         .image-close {
         .image-close {
             margin-top: 15px;
             margin-top: 15px;
             margin-right: 15px;
             margin-right: 15px;
             cursor: pointer;
             cursor: pointer;
             float: right;
             float: right;
         }
         }
-        
+
         .title {
         .title {
             font-size: 22px;
             font-size: 22px;
             font-weight: bold;
             font-weight: bold;
@@ -70,14 +70,14 @@
             margin-left: 320px;
             margin-left: 320px;
             margin-bottom: 20px;
             margin-bottom: 20px;
         }
         }
-        
+
         .wrong, .passwordWrong {
         .wrong, .passwordWrong {
             font-size: 12px;
             font-size: 12px;
             color: #f00;
             color: #f00;
             line-height: 30px;
             line-height: 30px;
             padding-left: 20px;
             padding-left: 20px;
         }
         }
-        
+
         #cover {
         #cover {
             position: fixed;
             position: fixed;
             z-index: 9999;
             z-index: 9999;
@@ -90,24 +90,26 @@
             background: #000 none repeat scroll 0% 0%;
             background: #000 none repeat scroll 0% 0%;
         }
         }
     </style>
     </style>
-    <link rel="stylesheet" href="${ctxStatic}/common/animate.min.css" />
-	<style>
-		#delete-modal{
-            position:fixed;
-            left:0;
-            right:0;
-            top:0;
-            bottom:0;
-            z-index:500;
-            display:none;
-            background:rgba(0,0,0,.3);
+    <link rel="stylesheet" href="${ctxStatic}/common/animate.min.css"/>
+    <style>
+        #delete-modal {
+            position: fixed;
+            left: 0;
+            right: 0;
+            top: 0;
+            bottom: 0;
+            z-index: 500;
+            display: none;
+            background: rgba(0, 0, 0, .3);
         }
         }
+
         #deleteDiv {
         #deleteDiv {
-            position:absolute;
-            left:50%;
-            top:50%;
-            transform:translateX(-50%) translateY(-50%);
+            position: absolute;
+            left: 50%;
+            top: 50%;
+            transform: translateX(-50%) translateY(-50%);
         }
         }
+
         .my-form {
         .my-form {
             padding: 0 20px;
             padding: 0 20px;
             position: fixed;
             position: fixed;
@@ -120,10 +122,12 @@
             width: 384px;
             width: 384px;
             border: 1px solid #ddd;
             border: 1px solid #ddd;
         }
         }
+
         .my-form .my-form-head {
         .my-form .my-form-head {
             padding: 15px 0 10px;
             padding: 15px 0 10px;
             position: relative;
             position: relative;
         }
         }
+
         .my-form .my-form-head .close-icon {
         .my-form .my-form-head .close-icon {
             position: absolute;
             position: absolute;
             right: -10px;
             right: -10px;
@@ -131,56 +135,68 @@
             width: 24px;
             width: 24px;
             cursor: pointer;
             cursor: pointer;
         }
         }
+
         .my-form .my-form-head .title-box {
         .my-form .my-form-head .title-box {
             padding-right: 30px;
             padding-right: 30px;
             display: flex;
             display: flex;
             align-items: center;
             align-items: center;
         }
         }
+
         .my-form .my-form-head .title-box .title2 {
         .my-form .my-form-head .title-box .title2 {
             font-size: 16px;
             font-size: 16px;
             font-weight: bold;
             font-weight: bold;
             margin-left: 6px;
             margin-left: 6px;
-            color:#595959;
+            color: #595959;
         }
         }
+
         .my-form .my-form-head .title-box .warning-icon {
         .my-form .my-form-head .title-box .warning-icon {
             width: 24px;
             width: 24px;
         }
         }
+
         .my-form .sub-title {
         .my-form .sub-title {
             color: #595959;
             color: #595959;
             line-height: 22px;
             line-height: 22px;
             font-size: 14px;
             font-size: 14px;
             padding-left: 30px;
             padding-left: 30px;
         }
         }
+
         .my-form .sub-title span {
         .my-form .sub-title span {
             color: #F53F3F;
             color: #F53F3F;
         }
         }
+
         .my-form .my-form-body {
         .my-form .my-form-body {
             padding: 20px 0;
             padding: 20px 0;
         }
         }
+
         .my-form .my-form-body .gray-bg {
         .my-form .my-form-body .gray-bg {
             background: #F0F0F0;
             background: #F0F0F0;
             border-radius: 4px;
             border-radius: 4px;
             padding: 30px 20px 20px;
             padding: 30px 20px 20px;
         }
         }
+
         .my-form-item {
         .my-form-item {
             display: flex;
             display: flex;
             align-items: flex-start;
             align-items: flex-start;
         }
         }
+
         .my-form-item label {
         .my-form-item label {
             font-size: 14px;
             font-size: 14px;
             color: #595959;
             color: #595959;
             width: 120px;
             width: 120px;
             line-height: 30px;
             line-height: 30px;
         }
         }
+
         .my-form-item .control-box {
         .my-form-item .control-box {
             flex: 1;
             flex: 1;
         }
         }
+
         .my-form-item .control-box .error-tip {
         .my-form-item .control-box .error-tip {
             height: 24px;
             height: 24px;
             line-height: 20px;
             line-height: 20px;
             font-size: 12px;
             font-size: 12px;
             color: #F53F3F;
             color: #F53F3F;
         }
         }
+
         .my-form-foot {
         .my-form-foot {
             display: flex;
             display: flex;
             justify-content: space-between;
             justify-content: space-between;
@@ -191,29 +207,30 @@
 </head>
 </head>
 <body>
 <body>
 <ul class="nav nav-tabs">
 <ul class="nav nav-tabs">
-<c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-mark')}">
-    <li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+    <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-mark')}">
+        <li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
     </c:if>
     </c:if>
     <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-group')}">
     <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-group')}">
-    <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
+        <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
     </c:if>
     </c:if>
     <li class="active"><a href="##">评卷员管理</a></li>
     <li class="active"><a href="##">评卷员管理</a></li>
     <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-trial')}">
     <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-trial')}">
-    <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.subjectCode}">试评管理</a></li>
+        <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.subjectCode}">试评管理</a></li>
     </c:if>
     </c:if>
-        <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-library')}">
-    <li><a href="${ctx}/admin/exam/library?subjectCode=${query.subjectCode}">任务管理</a></li>
+    <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-library')}">
+        <li><a href="${ctx}/admin/exam/library?subjectCode=${query.subjectCode}">任务管理</a></li>
     </c:if>
     </c:if>
-        <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-arbitrate')}">
-    <li><a href="${ctx}/admin/exam/arbitrate?subjectCode=${query.subjectCode}">仲裁管理</a></li>
+    <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-arbitrate')}">
+        <li><a href="${ctx}/admin/exam/arbitrate?subjectCode=${query.subjectCode}">仲裁管理</a></li>
     </c:if>
     </c:if>
-        <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-quality')}">
-    <li><a href="${ctx}/admin/exam/quality?subjectCode=${query.subjectCode}">质量监控</a></li>
+    <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-quality')}">
+        <li><a href="${ctx}/admin/exam/quality?subjectCode=${query.subjectCode}">质量监控</a></li>
     </c:if>
     </c:if>
 </ul>
 </ul>
 <div id="importBox" class="hide">
 <div id="importBox" class="hide">
     <form id="importForm" action="${ctx}/admin/exam/marker/import" method="post" enctype="multipart/form-data"
     <form id="importForm" action="${ctx}/admin/exam/marker/import" method="post" enctype="multipart/form-data"
-          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');">
+        <br/>
         <input name="subjectCode" type="hidden" value="${query.subjectCode }"/>
         <input name="subjectCode" type="hidden" value="${query.subjectCode }"/>
         <input id="uploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
         <input id="uploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
         <input id="btnImportSubmit" class="btn btn-primary" type="submit" value="   导    入   "/>
         <input id="btnImportSubmit" class="btn btn-primary" type="submit" value="   导    入   "/>
@@ -236,7 +253,7 @@
     <div>
     <div>
         <label>科目</label>
         <label>科目</label>
         <select class="input-large" id="subject-select" name="subjectCode">
         <select class="input-large" id="subject-select" name="subjectCode">
-        	<option value="">请选择</option>
+            <option value="">请选择</option>
             <c:forEach items="${subjectList}" var="subject">
             <c:forEach items="${subjectList}" var="subject">
                 <option value="${subject.code}"
                 <option value="${subject.code}"
                         <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
                         <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
@@ -252,21 +269,21 @@
         <input type="text" name="name" value="${query.name}" maxlength="30" class="input-small"/>
         <input type="text" name="name" value="${query.name}" maxlength="30" class="input-small"/>
         &nbsp;
         &nbsp;
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-		&nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
-		&nbsp;<a href="###" class="btn hide" id="save-button"">绑定评卷员</a>
+        &nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
+        &nbsp;<a href="###" class="btn hide" id="save-button">绑定评卷员</a>
         <!--     <input id="btnExport" class="btn" type="button" value="导出"/> -->
         <!--     <input id="btnExport" class="btn" type="button" value="导出"/> -->
         &nbsp;
         &nbsp;
-		<input id="btnEnable" class="btn" type="button" value="启用" onclick="goEnable(true)"/>
-		&nbsp;
-		<input id="btnEnable" class="btn" type="button" value="禁用" onclick="goEnable(false)"/>
-		&nbsp;
-		<input id="btnRelease" class="btn" type="button" value="回收" onclick="goRelease()"/>
-		&nbsp;
-		<input id="btnTaskCount" class="btn" type="button" value="设置评卷数" onclick="goTaskCount()"/>
-		 <c:if test="${web_user.schoolAdmin==true }">
-		&nbsp;
-		<input id="btnResetPassword" class="btn" type="button" value="重置密码" onclick="goResetPassword()"/>
-		</c:if>
+        <input id="btnEnable" class="btn" type="button" value="启用" onclick="goEnable(true)"/>
+        &nbsp;
+        <input id="btnEnable" class="btn" type="button" value="禁用" onclick="goEnable(false)"/>
+        &nbsp;
+        <input id="btnRelease" class="btn" type="button" value="回收" onclick="goRelease()"/>
+        &nbsp;
+        <input id="btnTaskCount" class="btn" type="button" value="设置评卷数" onclick="goTaskCount()"/>
+        <c:if test="${web_user.schoolAdmin==true }">
+            &nbsp;
+            <input id="btnResetPassword" class="btn" type="button" value="重置密码" onclick="goResetPassword()"/>
+        </c:if>
     </div>
     </div>
 </form>
 </form>
 <tags:message content="${message}"/>
 <tags:message content="${message}"/>
@@ -302,29 +319,33 @@
             </td>
             </td>
             <td>${marker.enable eq true ? "启用" : "禁用"}</td>
             <td>${marker.enable eq true ? "启用" : "禁用"}</td>
             <td>${marker.markedCount}
             <td>${marker.markedCount}
-            	<c:if test="${marker.reseting==true}">
+                <c:if test="${marker.reseting==true}">
                     正在重置
                     正在重置
                 </c:if>
                 </c:if>
                 <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-marker-reset') && marker.reseting==false}">
                 <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-marker-reset') && marker.reseting==false}">
-                 &nbsp;<a href="javascript:void(0)" class="reset-button" data-code="${marker.subjectCode}" data-number="${marker.groupNumber}" data-progress="${marker.group.percent}" data-id="${marker.id}">重置</a>
+                    &nbsp;<a href="javascript:void(0)" class="reset-button" data-code="${marker.subjectCode}" data-number="${marker.groupNumber}" data-progress="${marker.group.percent}" data-id="${marker.id}">重置</a>
                 </c:if>
                 </c:if>
             </td>
             </td>
             <td>${marker.currentCount}</td>
             <td>${marker.currentCount}</td>
             <td>${marker.topCount}</td>
             <td>${marker.topCount}</td>
-            <td><c:if test="${marker.classCount != 0}"><a href="${ctx}/admin/exam/marker/class/${marker.id}">${marker.classCount}</a></c:if>
-            	<c:if test="${marker.classCount == 0}">0</c:if>
+            <td><c:if test="${marker.classCount != 0}"><a
+                    href="${ctx}/admin/exam/marker/class/${marker.id}">${marker.classCount}</a></c:if>
+                <c:if test="${marker.classCount == 0}">0</c:if>
             </td>
             </td>
             <td>
             <td>
                 <c:if test="${web_user.schoolAdmin==true && marker.reseting==false}">
                 <c:if test="${web_user.schoolAdmin==true && marker.reseting==false}">
                     <c:if test="${marker.enable==true}">
                     <c:if test="${marker.enable==true}">
-                        <a href="javascript:void(0)" class="toggle-button" data-id="${marker.id}" data-value="false">禁用</a>
+                        <a href="javascript:void(0)" class="toggle-button" data-id="${marker.id}"
+                           data-value="false">禁用</a>
                     </c:if>
                     </c:if>
                     <c:if test="${marker.enable==false}">
                     <c:if test="${marker.enable==false}">
-                        <a href="javascript:void(0)" class="toggle-button" data-id="${marker.id}" data-value="true">启用</a>
+                        <a href="javascript:void(0)" class="toggle-button" data-id="${marker.id}"
+                           data-value="true">启用</a>
                     </c:if>
                     </c:if>
                     <a href="${ctx}/admin/exam/marker/delete?markerId=${marker.id}">解绑</a>
                     <a href="${ctx}/admin/exam/marker/delete?markerId=${marker.id}">解绑</a>
                     <a href="javascript:void(0)" class="release-button" data-id="${marker.id}">回收</a>
                     <a href="javascript:void(0)" class="release-button" data-id="${marker.id}">回收</a>
-                    <a href="javascript:void(0)" class="task-button" data-id="${marker.id}" onclick="showTaskWin('${marker.id}');">设置评卷数</a>
+                    <a href="javascript:void(0)" class="task-button" data-id="${marker.id}"
+                       onclick="showTaskWin('${marker.id}');">设置评卷数</a>
                     <a href="javascript:void(0)" class="reSetPassword-button" data-id="${marker.id}"
                     <a href="javascript:void(0)" class="reSetPassword-button" data-id="${marker.id}"
                        onclick="reSetPassword('${marker.id}');">重置密码</a>
                        onclick="reSetPassword('${marker.id}');">重置密码</a>
                 </c:if>
                 </c:if>
@@ -337,7 +358,8 @@
     <div class="task-header">
     <div class="task-header">
         <p class="title">设置任务数</p>
         <p class="title">设置任务数</p>
         <p class="image-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
         <p class="image-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
-    <div class="task-content"><input type="text" class="task-count" placeholder="请输入任务数"/><i class="wrong"></i></div>
+    <div class="task-content"><input type="text" class="task-count" placeholder="请输入任务数"/><i class="wrong"></i>
+    </div>
     <a href="#" class="btn btn-small btn-info task-btn">确定</a>
     <a href="#" class="btn btn-small btn-info task-btn">确定</a>
 </div>
 </div>
 
 
@@ -345,15 +367,16 @@
     <div class="password-header">
     <div class="password-header">
         <p class="title">重置密码</p>
         <p class="title">重置密码</p>
         <p class="image-close password-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
         <p class="image-close password-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
-    <div class="password-content"><input type="text" class="password-value" placeholder="请输入新的密码"/><i class="passwordWrong"></i></div>
+    <div class="password-content"><input type="text" class="password-value" placeholder="请输入新的密码"/><i
+            class="passwordWrong"></i></div>
     <a href="#" class="btn btn-small btn-info password-btn">确定</a>
     <a href="#" class="btn btn-small btn-info password-btn">确定</a>
 </div>
 </div>
 
 
 <div id="delete-modal">
 <div id="delete-modal">
-	<div id="deleteDiv" class="my-form form-horizontal">
+    <div id="deleteDiv" class="my-form form-horizontal">
         <div class="my-form-head">
         <div class="my-form-head">
             <div class="title-box">
             <div class="title-box">
-                <img src="${ctxStatic}/images/dialog_warning_icon.png" class="warning-icon" />
+                <img src="${ctxStatic}/images/dialog_warning_icon.png" class="warning-icon"/>
                 <span class="title2"></span>
                 <span class="title2"></span>
             </div>
             </div>
             <img src="${ctxStatic}/images/dialog_close_icon.png" class="close-icon" onclick="deleteDivHide()"/>
             <img src="${ctxStatic}/images/dialog_close_icon.png" class="close-icon" onclick="deleteDivHide()"/>
@@ -427,90 +450,94 @@
         top.$('.jbox-body .jbox-icon').css('top', '55px');
         top.$('.jbox-body .jbox-icon').css('top', '55px');
     });
     });
     $('.reset-button').click(function () {
     $('.reset-button').click(function () {
-    	var deleteCheck = '${deleteCheck}';
-    	var id = $(this).attr('data-id');
-    	var subjectCode = $(this).attr('data-code');
-    	var groupNumber = $(this).attr('data-number');
-    	var progress = $(this).attr('data-progress');
-    	if(deleteCheck=='false'){
-    		deleteDivHide();
-	        if (!confirm("确定要重置改评卷员吗?")) {
-	            return;
-	        }
-	        $.post('${ctx}/admin/exam/marker/reset', {id: id}, function (result) {
-	            if (result.success == true) {
-	                alert('重置成功');
-	                $("#searchForm").submit();
-	            } else {
-	                alert(result.message);
-	            }
-	        });
-    		return;
-    	}
-    	dialogObj = createDialog();
-        dialogObj.initDialog({ progress: progress, subjectCode: subjectCode, groupNumber: groupNumber }, function (initParams,deleteCode) { 
-	        //这个回调方法里写进度小余10%的业务分支
-	        deleteDivHide();
-        	if(deleteCode!=null && deleteCode!=''){
-        		$.post('${ctx}/admin/exam/marker/reset', {id: id,deleteCode:deleteCode}, function (result) {
-    	            if (result.success == true) {
-    	                alert('重置成功');
-    	                $("#searchForm").submit();
-    	            } else {
-    	                alert(result.message);
-    	            }
-    	        });
-        		return;
-        	}else{
-        		$.post('${ctx}/admin/exam/marker/reset', {id: id}, function (result) {
-    	            if (result.success == true) {
-    	                alert('重置成功');
-    	                $("#searchForm").submit();
-    	            } else {
-    	                alert(result.message);
-    	            }
-    	        });
-        		return;
-        	}
-    	})
+        var deleteCheck = '${deleteCheck}';
+        var id = $(this).attr('data-id');
+        var subjectCode = $(this).attr('data-code');
+        var groupNumber = $(this).attr('data-number');
+        var progress = $(this).attr('data-progress');
+        if (deleteCheck == 'false') {
+            deleteDivHide();
+            if (!confirm("确定要重置改评卷员吗?")) {
+                return;
+            }
+            $.post('${ctx}/admin/exam/marker/reset', {id: id}, function (result) {
+                if (result.success == true) {
+                    alert('重置成功');
+                    $("#searchForm").submit();
+                } else {
+                    alert(result.message);
+                }
+            });
+            return;
+        }
+        dialogObj = createDialog();
+        dialogObj.initDialog({
+            progress: progress,
+            subjectCode: subjectCode,
+            groupNumber: groupNumber
+        }, function (initParams, deleteCode) {
+            //这个回调方法里写进度小余10%的业务分支
+            deleteDivHide();
+            if (deleteCode != null && deleteCode != '') {
+                $.post('${ctx}/admin/exam/marker/reset', {id: id, deleteCode: deleteCode}, function (result) {
+                    if (result.success == true) {
+                        alert('重置成功');
+                        $("#searchForm").submit();
+                    } else {
+                        alert(result.message);
+                    }
+                });
+                return;
+            } else {
+                $.post('${ctx}/admin/exam/marker/reset', {id: id}, function (result) {
+                    if (result.success == true) {
+                        alert('重置成功');
+                        $("#searchForm").submit();
+                    } else {
+                        alert(result.message);
+                    }
+                });
+                return;
+            }
+        })
     });
     });
     $('.toggle-button').click(function () {
     $('.toggle-button').click(function () {
         var id = $(this).attr('data-id');
         var id = $(this).attr('data-id');
         var enable = $(this).attr('data-value');
         var enable = $(this).attr('data-value');
-        var check_list =[];
+        var check_list = [];
         check_list.push(id);
         check_list.push(id);
         $.ajax({
         $.ajax({
-        	url:"${ctx}/admin/exam/marker/toggle",
-        	data:{ids: check_list, enable: enable},
-        	traditional:true,
-        	type:"post",
-        	success:function (result) {
+            url: "${ctx}/admin/exam/marker/toggle",
+            data: {ids: check_list, enable: enable},
+            traditional: true,
+            type: "post",
+            success: function (result) {
                 if (result.success == true) {
                 if (result.success == true) {
                     alert('修改成功');
                     alert('修改成功');
                     $("#searchForm").submit();
                     $("#searchForm").submit();
                 } else {
                 } else {
                     alert(result.message);
                     alert(result.message);
                 }
                 }
-        	}
+            }
         });
         });
     });
     });
     $('.release-button').click(function () {
     $('.release-button').click(function () {
         var id = $(this).attr('data-id');
         var id = $(this).attr('data-id');
-        var check_list =[];
+        var check_list = [];
         check_list.push(id);
         check_list.push(id);
         $.ajax({
         $.ajax({
-        	url:"${ctx}/admin/exam/marker/release",
-        	data:{ids: check_list},
-        	traditional:true,
-        	type:"post",
-        	success:function (result) {
+            url: "${ctx}/admin/exam/marker/release",
+            data: {ids: check_list},
+            traditional: true,
+            type: "post",
+            success: function (result) {
                 if (result.success == true) {
                 if (result.success == true) {
                     alert('回收成功');
                     alert('回收成功');
                     $("#searchForm").submit();
                     $("#searchForm").submit();
                 } else {
                 } else {
                     alert(result.message);
                     alert(result.message);
                 }
                 }
-        	}
+            }
         });
         });
     });
     });
     $('#subject-select').change(function () {
     $('#subject-select').change(function () {
@@ -556,7 +583,7 @@
         $('.task-count').val('');
         $('.task-count').val('');
         $('.taskWindow').show();
         $('.taskWindow').show();
         $('#cover').show();
         $('#cover').show();
-        check_list =[];
+        check_list = [];
         check_list.push(obj);
         check_list.push(obj);
     }
     }
 
 
@@ -565,7 +592,7 @@
         $('.password-value').val('');
         $('.password-value').val('');
         $('.reSetPasswordWin').show();
         $('.reSetPasswordWin').show();
         $('#cover').show();
         $('#cover').show();
-        check_list =[];
+        check_list = [];
         check_list.push(obj);
         check_list.push(obj);
     }
     }
 
 
@@ -577,12 +604,13 @@
         $('.reSetPasswordWin').hide();
         $('.reSetPasswordWin').hide();
         $('#cover').hide();
         $('#cover').hide();
     });
     });
+
     function goTaskCount() {
     function goTaskCount() {
-    	check_list = [];
-    	$("input[name='ids']:checked").each(function(){
-    		check_list.push($(this).val())
-    	})
-        if(check_list.length==0) {
+        check_list = [];
+        $("input[name='ids']:checked").each(function () {
+            check_list.push($(this).val())
+        })
+        if (check_list.length == 0) {
             alert('请选择');
             alert('请选择');
             return false;
             return false;
         }
         }
@@ -592,6 +620,7 @@
         $('#cover').show();
         $('#cover').show();
         return false;
         return false;
     }
     }
+
     $('.task-btn').click(function () {
     $('.task-btn').click(function () {
         var taskCount = $('.task-count').val();
         var taskCount = $('.task-count').val();
         var wrongMessage = $('.wrong');
         var wrongMessage = $('.wrong');
@@ -610,36 +639,38 @@
             }
             }
         }
         }
         $.ajax({
         $.ajax({
-        	url:"${ctx}/admin/exam/marker/setTaskCount",
-        	data:{ids: check_list, taskCount: taskCount},
-        	traditional:true,
-        	type:"post",
-        	success:function (result) {
+            url: "${ctx}/admin/exam/marker/setTaskCount",
+            data: {ids: check_list, taskCount: taskCount},
+            traditional: true,
+            type: "post",
+            success: function (result) {
                 if (result.success == true) {
                 if (result.success == true) {
                     alert('设置成功');
                     alert('设置成功');
                     $("#searchForm").submit();
                     $("#searchForm").submit();
                 } else {
                 } else {
                     alert(result.message);
                     alert(result.message);
                 }
                 }
-	            $('.taskWindow').hide();
-        	}
+                $('.taskWindow').hide();
+            }
         });
         });
     });
     });
+
     function goResetPassword() {
     function goResetPassword() {
-    	check_list = [];
-    	$("input[name='ids']:checked").each(function(){
-    		check_list.push($(this).val())
-    	})
-        if(check_list.length==0) {
+        check_list = [];
+        $("input[name='ids']:checked").each(function () {
+            check_list.push($(this).val())
+        })
+        if (check_list.length == 0) {
             alert('请选择');
             alert('请选择');
             return false;
             return false;
         }
         }
-    	$('.passwordWrong').html('');
+        $('.passwordWrong').html('');
         $('.password-value').val('');
         $('.password-value').val('');
         $('.reSetPasswordWin').show();
         $('.reSetPasswordWin').show();
         $('#cover').show();
         $('#cover').show();
         return false;
         return false;
     }
     }
+
     $('.password-btn').click(function () {
     $('.password-btn').click(function () {
         var password = $('.password-value').val();
         var password = $('.password-value').val();
         var wrongMessage = $('.passwordWrong');
         var wrongMessage = $('.passwordWrong');
@@ -652,11 +683,11 @@
             return false;
             return false;
         }
         }
         $.ajax({
         $.ajax({
-        	url:"${ctx}/admin/exam/marker/reSetPassword",
-        	data:{ids: check_list, password: password},
-        	traditional:true,
-        	type:"post",
-        	success:function (result) {
+            url: "${ctx}/admin/exam/marker/reSetPassword",
+            data: {ids: check_list, password: password},
+            traditional: true,
+            type: "post",
+            success: function (result) {
                 if (result.success == true) {
                 if (result.success == true) {
                     alert('修改成功');
                     alert('修改成功');
                     $("#searchForm").submit();
                     $("#searchForm").submit();
@@ -664,7 +695,7 @@
                     alert(result.message);
                     alert(result.message);
                 }
                 }
                 $('.reSetPasswordWin').hide();
                 $('.reSetPasswordWin').hide();
-        	}
+            }
         });
         });
     });
     });
     $('#save-button').click(function () {
     $('#save-button').click(function () {
@@ -678,167 +709,171 @@
         return true;
         return true;
     });
     });
     $('#group-select').change(function () {
     $('#group-select').change(function () {
-    	 var groupNumber = $('#group-select').val();
-    	 if(groupNumber==''){
-    		 $('#save-button').hide();
-    	 }else{
-    		 $('#save-button').show();
-    	 }
+        var groupNumber = $('#group-select').val();
+        if (groupNumber == '') {
+            $('#save-button').hide();
+        } else {
+            $('#save-button').show();
+        }
     });
     });
     $("#ids").change(function () {
     $("#ids").change(function () {
         if ($("#ids").is(':checked')) {
         if ($("#ids").is(':checked')) {
             $(".ids").attr("checked", true);
             $(".ids").attr("checked", true);
         } else {
         } else {
-        	$(".ids").attr("checked", false);
+            $(".ids").attr("checked", false);
         }
         }
     });
     });
-    
+
     $(".ids").change(function () {
     $(".ids").change(function () {
-    	var all = true;
-    	$("input[name='ids']").each(function(){
-    		if(!$(this).is(':checked')){
-    			all = false;
-    		}
-    	})
-		 $("#ids").attr("checked", all);
+        var all = true;
+        $("input[name='ids']").each(function () {
+            if (!$(this).is(':checked')) {
+                all = false;
+            }
+        })
+        $("#ids").attr("checked", all);
     });
     });
+
     function goEnable(enable) {
     function goEnable(enable) {
-    	var check_list = []
-    	$("input[name='ids']:checked").each(function(){
-    		check_list.push($(this).val())
-    	})
-        if(check_list.length==0) {
+        var check_list = []
+        $("input[name='ids']:checked").each(function () {
+            check_list.push($(this).val())
+        })
+        if (check_list.length == 0) {
             alert('请选择');
             alert('请选择');
             return false;
             return false;
         }
         }
         $.ajax({
         $.ajax({
-        	url:"${ctx}/admin/exam/marker/toggle",
-        	data:{ids: check_list, enable: enable},
-        	traditional:true,
-        	type:"post",
-        	success:function (result) {
+            url: "${ctx}/admin/exam/marker/toggle",
+            data: {ids: check_list, enable: enable},
+            traditional: true,
+            type: "post",
+            success: function (result) {
                 if (result.success == true) {
                 if (result.success == true) {
                     alert('修改成功');
                     alert('修改成功');
                     $("#searchForm").submit();
                     $("#searchForm").submit();
                 } else {
                 } else {
                     alert(result.message);
                     alert(result.message);
                 }
                 }
-        	}
+            }
         });
         });
     }
     }
+
     function goRelease() {
     function goRelease() {
-    	var check_list = []
-    	$("input[name='ids']:checked").each(function(){
-    		check_list.push($(this).val())
-    	})
-        if(check_list.length==0) {
+        var check_list = []
+        $("input[name='ids']:checked").each(function () {
+            check_list.push($(this).val())
+        })
+        if (check_list.length == 0) {
             alert('请选择');
             alert('请选择');
             return false;
             return false;
         }
         }
         $.ajax({
         $.ajax({
-        	url:"${ctx}/admin/exam/marker/release",
-        	data:{ids: check_list},
-        	traditional:true,
-        	type:"post",
-        	success:function (result) {
+            url: "${ctx}/admin/exam/marker/release",
+            data: {ids: check_list},
+            traditional: true,
+            type: "post",
+            success: function (result) {
                 if (result.success == true) {
                 if (result.success == true) {
                     alert('回收成功');
                     alert('回收成功');
                     $("#searchForm").submit();
                     $("#searchForm").submit();
                 } else {
                 } else {
                     alert(result.message);
                     alert(result.message);
                 }
                 }
-        	}
+            }
         });
         });
     }
     }
 </script>
 </script>
 <script>
 <script>
-function deleteDivHide(){
-	 $('#delete-modal').hide();
-}
-var dialogObj=null;
-function createDialog() {
-	return {
-        initParams: {},
-        setDialogTitle: function (index) {
-            if (index < 4) {
-                $('#deleteDiv .title2').html('第' + index + '次警告');
-                $('.sub-title1,.subjectCode,.groupNumber').show();
-                $('.sub-title2,.authCode').hide();
+    function deleteDivHide() {
+        $('#delete-modal').hide();
+    }
+
+    var dialogObj = null;
+
+    function createDialog() {
+        return {
+            initParams: {},
+            setDialogTitle: function (index) {
+                if (index < 4) {
+                    $('#deleteDiv .title2').html('第' + index + '次警告');
+                    $('.sub-title1,.subjectCode,.groupNumber').show();
+                    $('.sub-title2,.authCode').hide();
 
 
-            } else {
-                $('#deleteDiv .title').html('分组授权码');
-                $('.sub-title1,.subjectCode,.groupNumber').hide();
-                $('.sub-title2,.authCode').show();
-            }
-        },
-        validate: function () {
-            if (this.warningIndex <= 3) {
-                var subjectCodeVal = $('.subjectCode input').val();
-                var groupNumberVal = $('.groupNumber input').val();
-                $('.subjectCode input+.error-tip').html(!subjectCodeVal?'请输入科目代码':subjectCodeVal != this.initParams.subjectCode?'输入的科目代码不正确':'')
-                $('.groupNumber input+.error-tip').html(!groupNumberVal?'请输入分组序号':groupNumberVal != this.initParams.groupNumber?'输入的分组序号不正确':'')
-
-                if (!subjectCodeVal || !groupNumberVal || subjectCodeVal != this.initParams.subjectCode || groupNumberVal != this.initParams.groupNumber) {
-                    return;
                 } else {
                 } else {
-                    this.next();
+                    $('#deleteDiv .title').html('分组授权码');
+                    $('.sub-title1,.subjectCode,.groupNumber').hide();
+                    $('.sub-title2,.authCode').show();
                 }
                 }
-            } else if (this.warningIndex == 4) {
-                var authCodeVal = $('.authCode input').val();
-                if(!authCodeVal){
-                    $('.authCode input+.error-tip').html('请输入授权码');
-                    return;
-                }else{
-                    $('.authCode input+.error-tip').html('');
-                    this.next();
+            },
+            validate: function () {
+                if (this.warningIndex <= 3) {
+                    var subjectCodeVal = $('.subjectCode input').val();
+                    var groupNumberVal = $('.groupNumber input').val();
+                    $('.subjectCode input+.error-tip').html(!subjectCodeVal ? '请输入科目代码' : subjectCodeVal != this.initParams.subjectCode ? '输入的科目代码不正确' : '')
+                    $('.groupNumber input+.error-tip').html(!groupNumberVal ? '请输入分组序号' : groupNumberVal != this.initParams.groupNumber ? '输入的分组序号不正确' : '')
+
+                    if (!subjectCodeVal || !groupNumberVal || subjectCodeVal != this.initParams.subjectCode || groupNumberVal != this.initParams.groupNumber) {
+                        return;
+                    } else {
+                        this.next();
+                    }
+                } else if (this.warningIndex == 4) {
+                    var authCodeVal = $('.authCode input').val();
+                    if (!authCodeVal) {
+                        $('.authCode input+.error-tip').html('请输入授权码');
+                        return;
+                    } else {
+                        $('.authCode input+.error-tip').html('');
+                        this.next();
+                    }
                 }
                 }
-            }
 
 
-        },
-        next() {
-            if (this.warningIndex == 4) {
-                this.callback(this.initParams,$('.authCode input').val());
-            } else if (this.times <= 3 && this.times == this.warningIndex) {
-                this.callback(this.initParams);
-            } else {
-                $('.subjectCode input+.error-tip').html('');
-                $('.subjectCode input,.groupNumber input').val('')
-                $('.groupNumber input+.error-tip').html('');
-                this.warningIndex++;
-                $('#deleteDiv').removeClass('animate__animated animate__fadeIn')
-                setTimeout(function(){
-                    $('#deleteDiv').addClass('animate__animated animate__fadeIn')
-                },0)
+            },
+            next() {
+                if (this.warningIndex == 4) {
+                    this.callback(this.initParams, $('.authCode input').val());
+                } else if (this.times <= 3 && this.times == this.warningIndex) {
+                    this.callback(this.initParams);
+                } else {
+                    $('.subjectCode input+.error-tip').html('');
+                    $('.subjectCode input,.groupNumber input').val('')
+                    $('.groupNumber input+.error-tip').html('');
+                    this.warningIndex++;
+                    $('#deleteDiv').removeClass('animate__animated animate__fadeIn')
+                    setTimeout(function () {
+                        $('#deleteDiv').addClass('animate__animated animate__fadeIn')
+                    }, 0)
+                    this.setDialogTitle(this.warningIndex);
+                }
+            },
+            warningIndex: 1,//当前正在进行的第几次输入
+            times: 0,//需要重复输入的次数
+            callback: null,
+            initDialog: function (initParams, callBack) {
+                this.initParams = initParams;
+                var progress = initParams.progress;
+                if (callBack) {
+                    this.callback = callBack;
+                    if (progress <= 10) {
+                        callBack(initParams);
+                        return;
+                    }
+                }
+                this.times = progress <= 80 ? 2 : progress >= 80 && progress < 100 ? 3 : 4;
+                this.warningIndex = 1;
+                $('#delete-modal').show();
                 this.setDialogTitle(this.warningIndex);
                 this.setDialogTitle(this.warningIndex);
-            }
-        },
-        warningIndex: 1,//当前正在进行的第几次输入
-        times: 0,//需要重复输入的次数
-        callback:null,
-        initDialog: function (initParams, callBack) {
-            this.initParams = initParams;
-            var progress = initParams.progress;
-            if(callBack){
-                this.callback = callBack;
-                if (progress <= 10) {
-                    callBack(initParams);
-                    return;
+            },
+            submit: function (index) {
+                console.log('你最开始传入的基础参数initParams为:', this.initParams);
+                if (this.warningIndex == 4) {
+                    console.log('你输入的授权码为:' + $('.authCode input').val())
                 }
                 }
             }
             }
-            this.times = progress <= 80 ? 2 : progress >= 80 && progress < 100 ? 3 : 4;
-            this.warningIndex = 1;
-            $('#delete-modal').show();
-            this.setDialogTitle(this.warningIndex);
-        },
-        submit: function (index) {
-            console.log('你最开始传入的基础参数initParams为:',this.initParams);
-            if(this.warningIndex==4){
-                console.log('你输入的授权码为:'+$('.authCode input').val())
-            }
         }
         }
+
     }
     }
-   
-}
 </script>
 </script>
 </body>
 </body>
 </html>
 </html>