Преглед на файлове

新增未作答、自动定位、是否裁切等功能

ting.yin преди 3 години
родител
ревизия
ee4200c540
променени са 23 файла, в които са добавени 413 реда и са изтрити 250 реда
  1. 1 1
      pom.xml
  2. 15 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java
  3. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveScore.java
  4. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkTrackDao.java
  5. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/TrialTrackDao.java
  6. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkLibrary.java
  7. 5 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkResult.java
  8. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkTrack.java
  9. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrackDTO.java
  10. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrialLibrary.java
  11. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrialTrack.java
  12. 205 169
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  13. 35 37
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java
  14. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java
  15. 27 28
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java
  16. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  17. 4 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java
  18. 2 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java
  19. 2 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java
  20. 3 2
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  21. 4 4
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examEdit.jsp
  22. 4 4
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examForm.jsp
  23. 12 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/subjectEdit.jsp

+ 1 - 1
pom.xml

@@ -29,7 +29,7 @@
         <poi.version>3.9</poi.version>
         <poi.version>3.9</poi.version>
         <guava.version>14.0.1</guava.version>
         <guava.version>14.0.1</guava.version>
         <commons-lang3.version>3.1</commons-lang3.version>
         <commons-lang3.version>3.1</commons-lang3.version>
-        <qmth-boot-version>1.0.2</qmth-boot-version>
+        <qmth-boot-version>1.0.3</qmth-boot-version>
     </properties>
     </properties>
 
 
     <dependencyManagement>
     <dependencyManagement>

+ 15 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java

@@ -100,6 +100,12 @@ public class ExamSubject implements Serializable {
     @Column(name = "trial_count", nullable = true)
     @Column(name = "trial_count", nullable = true)
     private Integer trialCount;
     private Integer trialCount;
 
 
+    /**
+     * 自动跳转
+     */
+    @Column(name = "auto_scroll", nullable = true)
+    private Boolean autoScroll;
+
     /**
     /**
      * 是否裁切
      * 是否裁切
      */
      */
@@ -372,7 +378,15 @@ public class ExamSubject implements Serializable {
         this.trialCount = trialCount;
         this.trialCount = trialCount;
     }
     }
 
 
-    public Boolean isEnableSplit() {
+    public Boolean getAutoScroll() {
+        return autoScroll;
+    }
+
+    public void setAutoScroll(Boolean autoScroll) {
+        this.autoScroll = autoScroll;
+    }
+
+    public Boolean getEnableSplit() {
         return enableSplit;
         return enableSplit;
     }
     }
 
 

+ 15 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveScore.java

@@ -4,6 +4,7 @@ import javax.persistence.Column;
 import javax.persistence.EmbeddedId;
 import javax.persistence.EmbeddedId;
 import javax.persistence.Entity;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 import javax.persistence.Table;
+
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
@@ -54,6 +55,12 @@ public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore
     @Column(name = "score", nullable = false)
     @Column(name = "score", nullable = false)
     private Double score;
     private Double score;
 
 
+    /**
+     * 未作答的步骤数量
+     */
+    @Column(name = "unanswered_count", nullable = false)
+    private Integer unansweredCount;
+
     public SubjectiveScore() {
     public SubjectiveScore() {
         this.pk = new SubjectiveScorePK();
         this.pk = new SubjectiveScorePK();
     }
     }
@@ -130,6 +137,14 @@ public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore
         this.mainScore = mainScore;
         this.mainScore = mainScore;
     }
     }
 
 
+    public Integer getUnansweredCount() {
+        return unansweredCount;
+    }
+
+    public void setUnansweredCount(Integer unansweredCount) {
+        this.unansweredCount = unansweredCount;
+    }
+
     @Override
     @Override
     public int compareTo(SubjectiveScore other) {
     public int compareTo(SubjectiveScore other) {
         int i = this.getMainNumber() - other.getMainNumber();
         int i = this.getMainNumber() - other.getMainNumber();

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkTrackDao.java

@@ -37,4 +37,7 @@ public interface MarkTrackDao extends JpaRepository<MarkTrack, MarkTrackPK>, Jpa
     @Query("delete from MarkTrack t where t.pk.libraryId=?1 and t.pk.questionNumber=?2")
     @Query("delete from MarkTrack t where t.pk.libraryId=?1 and t.pk.questionNumber=?2")
     void deleteByLibraryIdAndQuestionNumber(Integer id, String questionNumber);
     void deleteByLibraryIdAndQuestionNumber(Integer id, String questionNumber);
 
 
+    @Query("select count(t) from MarkTrack t where t.studentId=?1 and t.pk.questionNumber=?2 and t.unanswered =?3")
+    int countByStudentIdAndQuestionNumberAndUnanswered(Integer studentId, String questionNumber, boolean unanswered);
+
 }
 }

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/TrialTrackDao.java

@@ -36,4 +36,7 @@ public interface TrialTrackDao extends JpaRepository<TrialTrack, TrialTrackPK>,
     @Query("delete from TrialTrack t where t.examId=?1 and t.subjectCode=?2 and t.groupNumber=?3")
     @Query("delete from TrialTrack t where t.examId=?1 and t.subjectCode=?2 and t.groupNumber=?3")
     void deleteByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
     void deleteByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
 
 
+    @Query("select count(t) from TrialTrack t where t.studentId=?1 and t.pk.questionNumber=?2 and t.unanswered =?3")
+    Integer countByStudentIdAndQuestionNumberAndUnanswered(Integer studentId, String questionNumber, boolean unanswered);
+
 }
 }

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkLibrary.java

@@ -123,6 +123,12 @@ public class MarkLibrary implements Serializable {
     @Column(name = "header_score_list")
     @Column(name = "header_score_list")
     private String headerScoreList;
     private String headerScoreList;
 
 
+    /**
+     * 未作答的步骤数量
+     */
+    @Column(name = "unanswered_count", nullable = true)
+    private Integer unansweredCount;
+
     @Transient
     @Transient
     private String markerLoginName;
     private String markerLoginName;
 
 
@@ -308,4 +314,12 @@ public class MarkLibrary implements Serializable {
         this.markerLoginName = markerLoginName;
         this.markerLoginName = markerLoginName;
     }
     }
 
 
+    public Integer getUnansweredCount() {
+        return unansweredCount;
+    }
+
+    public void setUnansweredCount(Integer unansweredCount) {
+        this.unansweredCount = unansweredCount;
+    }
+
 }
 }

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

@@ -188,12 +188,17 @@ public class MarkResult {
     }
     }
 
 
     public List<TrialTrack> getTrackList(TrialLibrary library) {
     public List<TrialTrack> getTrackList(TrialLibrary library) {
+        int unansweredCount = 0;
         List<TrialTrack> list = new LinkedList<>();
         List<TrialTrack> list = new LinkedList<>();
         if (trackList != null) {
         if (trackList != null) {
             for (TrackDTO dto : trackList) {
             for (TrackDTO dto : trackList) {
                 list.add(dto.transform(library));
                 list.add(dto.transform(library));
+                if (dto.isUnanswered()) {
+                    unansweredCount++;
+                }
             }
             }
         }
         }
+        library.setUnansweredCount(unansweredCount);
         return list;
         return list;
     }
     }
 
 

+ 15 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkTrack.java

@@ -68,6 +68,12 @@ public class MarkTrack {
     @Column(name = "offset_y", nullable = false)
     @Column(name = "offset_y", nullable = false)
     private Integer offsetY;
     private Integer offsetY;
 
 
+    /**
+     * 是否未作答
+     */
+    @Column(name = "unanswered", nullable = false)
+    private boolean unanswered;
+
     public MarkTrack() {
     public MarkTrack() {
         this.pk = new MarkTrackPK();
         this.pk = new MarkTrackPK();
     }
     }
@@ -183,4 +189,13 @@ public class MarkTrack {
     public void setOffsetY(Integer offsetY) {
     public void setOffsetY(Integer offsetY) {
         this.offsetY = offsetY;
         this.offsetY = offsetY;
     }
     }
+
+    public boolean isUnanswered() {
+        return unanswered;
+    }
+
+    public void setUnanswered(boolean unanswered) {
+        this.unanswered = unanswered;
+    }
+
 }
 }

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrackDTO.java

@@ -31,6 +31,8 @@ public class TrackDTO implements Serializable {
 
 
     private int offsetY;
     private int offsetY;
 
 
+    private boolean unanswered;
+
     public TrackDTO() {
     public TrackDTO() {
 
 
     }
     }
@@ -47,6 +49,7 @@ public class TrackDTO implements Serializable {
         setOffsetIndex(track.getOffsetIndex());
         setOffsetIndex(track.getOffsetIndex());
         setOffsetX(track.getOffsetX());
         setOffsetX(track.getOffsetX());
         setOffsetY(track.getOffsetY());
         setOffsetY(track.getOffsetY());
+        setUnanswered(track.isUnanswered());
     }
     }
 
 
     public TrackDTO(TrialTrack track) {
     public TrackDTO(TrialTrack track) {
@@ -60,6 +63,7 @@ public class TrackDTO implements Serializable {
         setOffsetIndex(track.getOffsetIndex());
         setOffsetIndex(track.getOffsetIndex());
         setOffsetX(track.getOffsetX());
         setOffsetX(track.getOffsetX());
         setOffsetY(track.getOffsetY());
         setOffsetY(track.getOffsetY());
+        setUnanswered(track.isUnanswered());
     }
     }
 
 
     public MarkTrack transform(MarkLibrary library, Marker marker) {
     public MarkTrack transform(MarkLibrary library, Marker marker) {
@@ -78,6 +82,7 @@ public class TrackDTO implements Serializable {
         track.setOffsetIndex(getOffsetIndex());
         track.setOffsetIndex(getOffsetIndex());
         track.setOffsetX(getOffsetX());
         track.setOffsetX(getOffsetX());
         track.setOffsetY(getOffsetY());
         track.setOffsetY(getOffsetY());
+        track.setUnanswered(isUnanswered());
         return track;
         return track;
     }
     }
 
 
@@ -98,6 +103,7 @@ public class TrackDTO implements Serializable {
         track.setOffsetIndex(getOffsetIndex());
         track.setOffsetIndex(getOffsetIndex());
         track.setOffsetX(getOffsetX());
         track.setOffsetX(getOffsetX());
         track.setOffsetY(getOffsetY());
         track.setOffsetY(getOffsetY());
+        track.setUnanswered(isUnanswered());
         return track;
         return track;
     }
     }
 
 
@@ -173,4 +179,12 @@ public class TrackDTO implements Serializable {
         this.offsetY = offsetY;
         this.offsetY = offsetY;
     }
     }
 
 
+    public boolean isUnanswered() {
+        return unanswered;
+    }
+
+    public void setUnanswered(boolean unanswered) {
+        this.unanswered = unanswered;
+    }
+
 }
 }

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrialLibrary.java

@@ -88,6 +88,12 @@ public class TrialLibrary implements Serializable {
     @Column(name = "marker_score_list")
     @Column(name = "marker_score_list")
     private String markerScoreList;
     private String markerScoreList;
 
 
+    /**
+     * 未作答的步骤数量
+     */
+    @Column(name = "unanswered_count", nullable = true)
+    private Integer unansweredCount;
+
     @Transient
     @Transient
     private String markerLoginName;
     private String markerLoginName;
 
 
@@ -204,4 +210,12 @@ public class TrialLibrary implements Serializable {
         this.markerLoginName = markerLoginName;
         this.markerLoginName = markerLoginName;
     }
     }
 
 
+    public Integer getUnansweredCount() {
+        return unansweredCount;
+    }
+
+    public void setUnansweredCount(Integer unansweredCount) {
+        this.unansweredCount = unansweredCount;
+    }
+
 }
 }

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrialTrack.java

@@ -65,6 +65,12 @@ public class TrialTrack {
     @Column(name = "offset_y", nullable = false)
     @Column(name = "offset_y", nullable = false)
     private Integer offsetY;
     private Integer offsetY;
 
 
+    /**
+     * 是否未作答
+     */
+    @Column(name = "unanswered", nullable = false)
+    private boolean unanswered;
+
     public TrialTrack() {
     public TrialTrack() {
         this.pk = new TrialTrackPK();
         this.pk = new TrialTrackPK();
     }
     }
@@ -180,4 +186,12 @@ public class TrialTrack {
     public void setOffsetY(Integer offsetY) {
     public void setOffsetY(Integer offsetY) {
         this.offsetY = offsetY;
         this.offsetY = offsetY;
     }
     }
+
+    public boolean isUnanswered() {
+        return unanswered;
+    }
+
+    public void setUnanswered(boolean unanswered) {
+        this.unanswered = unanswered;
+    }
 }
 }

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

@@ -15,6 +15,7 @@ import cn.com.qmth.stmms.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
+
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -94,7 +95,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 某个评卷分组已申请的评卷任务数量
      * 某个评卷分组已申请的评卷任务数量
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      * @return int
      * @return int
      */
      */
     @Override
     @Override
@@ -110,7 +112,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 某个评卷员已申请的评卷任务数量
      * 某个评卷员已申请的评卷任务数量
      *
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      * @return int
      * @return int
      */
      */
     @Override
     @Override
@@ -140,7 +143,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 某个评卷员已完成的评卷任务数量
      * 某个评卷员已完成的评卷任务数量
      *
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      * @return long
      * @return long
      */
      */
     @Override
     @Override
@@ -153,8 +157,8 @@ public class MarkServiceImpl implements MarkService {
             if (group.getStatus() == MarkStatus.TRIAL) {
             if (group.getStatus() == MarkStatus.TRIAL) {
                 return trialLibraryDao.countByMarkerId(marker.getId());
                 return trialLibraryDao.countByMarkerId(marker.getId());
             } else {
             } else {
-                return libraryDao.countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED,
-                        LibraryStatus.INSPECTED);
+                return libraryDao.countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED,
+                        LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED);
             }
             }
         }
         }
         return 0;
         return 0;
@@ -163,7 +167,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 释放某个评卷分组的锁定任务
      * 释放某个评卷分组的锁定任务
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
      */
     @Override
     @Override
     public void releaseByGroup(MarkGroup group) {
     public void releaseByGroup(MarkGroup group) {
@@ -174,7 +179,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 重置某个评卷分组的所有评卷任务
      * 重置某个评卷分组的所有评卷任务
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -185,7 +191,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 删除某个评卷分组
      * 删除某个评卷分组
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -210,9 +217,8 @@ public class MarkServiceImpl implements MarkService {
         markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
         markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                 group.getNumber());
                 group.getNumber());
         // 小题数据
         // 小题数据
-        questionService
-                .resetByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
-                        group.getNumber());
+        questionService.resetByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(),
+                group.getSubjectCode(), false, group.getNumber());
         // 考生分组状态与得分明细
         // 考生分组状态与得分明细
         groupStudentDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
         groupStudentDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                 group.getNumber());
                 group.getNumber());
@@ -222,9 +228,8 @@ public class MarkServiceImpl implements MarkService {
         releaseByGroup(group);
         releaseByGroup(group);
         groupDao.delete(group);
         groupDao.delete(group);
         // 未分组的题目
         // 未分组的题目
-        long unGroupQuestionCount = questionService
-                .countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(group.getExamId(), group.getSubjectCode(),
-                        false);
+        long unGroupQuestionCount = questionService.countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(
+                group.getExamId(), group.getSubjectCode(), false);
         // 考生整体状态与总分更新
         // 考生整体状态与总分更新
         long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
         long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
         if (groupCount == 0 || unGroupQuestionCount > 0) {
         if (groupCount == 0 || unGroupQuestionCount > 0) {
@@ -232,9 +237,9 @@ public class MarkServiceImpl implements MarkService {
                     SubjectiveStatus.UNMARK, 0, null, null, null);
                     SubjectiveStatus.UNMARK, 0, null, null, null);
             subjectService.updateTrialCount(group.getExamId(), group.getSubjectCode(), 0);
             subjectService.updateTrialCount(group.getExamId(), group.getSubjectCode(), 0);
         } else {
         } else {
-            List<Integer> studentList = studentService
-                    .findIdByExamIdAndSubjectCodeAndSubjectiveStatus(group.getExamId(), group.getSubjectCode(),
-                            SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
+            List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(
+                    group.getExamId(), group.getSubjectCode(), SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED,
+                    SubjectiveStatus.INSPECTED);
             for (Integer studentId : studentList) {
             for (Integer studentId : studentList) {
                 checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
                 checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
             }
             }
@@ -244,15 +249,15 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 修改某个评卷分组给分步骤,并重置评卷任务
      * 修改某个评卷分组给分步骤,并重置评卷任务
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
     public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third,
     public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third,
             boolean selective) {
             boolean selective) {
-        List<ExamQuestion> old = questionService
-                .findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
-                        group.getNumber());
+        List<ExamQuestion> old = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
+                group.getSubjectCode(), false, group.getNumber());
         for (ExamQuestion question : old) {
         for (ExamQuestion question : old) {
             question.setGroupNumber(null);
             question.setGroupNumber(null);
             questionService.saveAndFlush(question);
             questionService.saveAndFlush(question);
@@ -285,8 +290,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 评卷员申请领取某个正式评卷任务
      * 评卷员申请领取某个正式评卷任务
      *
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      */
      */
     @Override
     @Override
     public boolean applyLibrary(MarkLibrary library, Marker marker) {
     public boolean applyLibrary(MarkLibrary library, Marker marker) {
@@ -309,8 +316,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 评卷员申请领取某个试评评卷任务
      * 评卷员申请领取某个试评评卷任务
      *
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      * @return boolean
      */
      */
     @Override
     @Override
@@ -322,8 +331,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 评卷员是否已领取了某个正式评卷任务
      * 评卷员是否已领取了某个正式评卷任务
      *
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      * @return boolean
      */
      */
     @Override
     @Override
@@ -335,8 +346,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 评卷员是否已领取了某个试评评卷任务
      * 评卷员是否已领取了某个试评评卷任务
      *
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      * @return boolean
      */
      */
     @Override
     @Override
@@ -348,8 +361,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 释放某个评卷员已完成的评卷任务
      * 释放某个评卷员已完成的评卷任务
      *
      *
-     * @param result - 评卷结果
-     * @param marker - 评卷员
+     * @param result
+     *            - 评卷结果
+     * @param marker
+     *            - 评卷员
      */
      */
     @Override
     @Override
     public void releaseTask(SubmitResult result, Marker marker) {
     public void releaseTask(SubmitResult result, Marker marker) {
@@ -367,7 +382,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 释放某个评卷员的所有锁定任务
      * 释放某个评卷员的所有锁定任务
      *
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
      */
     @Override
     @Override
     public void releaseByMarker(Marker marker) {
     public void releaseByMarker(Marker marker) {
@@ -380,7 +396,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 重置某个评卷员
      * 重置某个评卷员
      *
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -442,7 +459,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 根据考生删除评卷任务
      * 根据考生删除评卷任务
      *
      *
-     * @param student - 考生
+     * @param student
+     *            - 考生
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -466,8 +484,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 评卷员提交评卷任务
      * 评卷员提交评卷任务
      *
      *
-     * @param result - 评卷结果
-     * @param marker - 评卷员
+     * @param result
+     *            - 评卷结果
+     * @param marker
+     *            - 评卷员
      * @return boolean
      * @return boolean
      */
      */
     @Override
     @Override
@@ -475,8 +495,8 @@ public class MarkServiceImpl implements MarkService {
     public SubmitResult submitTask(MarkResult result, Marker marker) {
     public SubmitResult submitTask(MarkResult result, Marker marker) {
         // 判断评卷分组是否存在/评卷是否结束
         // 判断评卷分组是否存在/评卷是否结束
         MarkGroup group = groupDao.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
         MarkGroup group = groupDao.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-        if (group == null || group.getStatus() == MarkStatus.FINISH || !group.getStatus().toString()
-                .equals(result.getStatusValue())) {
+        if (group == null || group.getStatus() == MarkStatus.FINISH
+                || !group.getStatus().toString().equals(result.getStatusValue())) {
             return SubmitResult.faile();
             return SubmitResult.faile();
         }
         }
 
 
@@ -484,8 +504,9 @@ public class MarkServiceImpl implements MarkService {
         // 根据评卷状态选择读取不同的评卷任务
         // 根据评卷状态选择读取不同的评卷任务
         if (group.getStatus() == MarkStatus.FORMAL) {
         if (group.getStatus() == MarkStatus.FORMAL) {
             MarkLibrary library = libraryDao.findOne(result.getLibraryId());
             MarkLibrary library = libraryDao.findOne(result.getLibraryId());
-            if (library != null && library.getExamId().equals(group.getExamId()) && library.getSubjectCode()
-                    .equals(group.getSubjectCode()) && library.getGroupNumber().equals(group.getNumber())) {
+            if (library != null && library.getExamId().equals(group.getExamId())
+                    && library.getSubjectCode().equals(group.getSubjectCode())
+                    && library.getGroupNumber().equals(group.getNumber())) {
                 // 问题卷
                 // 问题卷
                 if (result.isProblem()) {
                 if (result.isProblem()) {
                     // 状态更新
                     // 状态更新
@@ -511,11 +532,12 @@ public class MarkServiceImpl implements MarkService {
             }
             }
         } else if (group.getStatus() == MarkStatus.TRIAL) {
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             TrialLibrary library = trialLibraryDao.findOne(result.getLibraryId());
             TrialLibrary library = trialLibraryDao.findOne(result.getLibraryId());
-            if (library != null && library.getExamId().equals(group.getExamId()) && library.getSubjectCode()
-                    .equals(group.getSubjectCode()) && library.getGroupNumber().equals(group.getNumber())
+            if (library != null && library.getExamId().equals(group.getExamId())
+                    && library.getSubjectCode().equals(group.getSubjectCode())
+                    && library.getGroupNumber().equals(group.getNumber())
                     && result.getMarkerScore() <= group.getTotalScore()) {
                     && result.getMarkerScore() <= group.getTotalScore()) {
-                if ((library.getMarkerId() == null && !hasApplied(library, marker)) || (library.getMarkerId() != null
-                        && !library.getMarkerId().equals(marker.getId()))) {
+                if ((library.getMarkerId() == null && !hasApplied(library, marker))
+                        || (library.getMarkerId() != null && !library.getMarkerId().equals(marker.getId()))) {
                     return SubmitResult.faile();
                     return SubmitResult.faile();
                 }
                 }
                 library.setMarkerId(marker.getId());
                 library.setMarkerId(marker.getId());
@@ -529,11 +551,11 @@ public class MarkServiceImpl implements MarkService {
                 }
                 }
                 library.setMarkerScore(result.getMarkerScore());
                 library.setMarkerScore(result.getMarkerScore());
                 library.setMarkerScoreList(result.getScoreList());
                 library.setMarkerScoreList(result.getScoreList());
-                library = trialLibraryDao.save(library);
                 if (result.getTrackList() != null && !result.isUnselective()) {
                 if (result.getTrackList() != null && !result.isUnselective()) {
                     trialTrackDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
                     trialTrackDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
                     trialTrackDao.save(result.getTrackList(library));
                     trialTrackDao.save(result.getTrackList(library));
                 }
                 }
+                library = trialLibraryDao.save(library);
                 if (result.getSpecialTagList() != null && !result.isUnselective()) {
                 if (result.getSpecialTagList() != null && !result.isUnselective()) {
                     trialTagDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
                     trialTagDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
                     trialTagDao.save(result.getTagList(library));
                     trialTagDao.save(result.getTagList(library));
@@ -568,10 +590,14 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 评卷员提交某个正评任务
      * 评卷员提交某个正评任务
      *
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
-     * @param group   - 评卷分组
-     * @param result  - 评卷结果
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
+     * @param group
+     *            - 评卷分组
+     * @param result
+     *            - 评卷结果
      */
      */
     private boolean submitLibrary(MarkLibrary library, Marker marker, MarkGroup group, MarkResult result) {
     private boolean submitLibrary(MarkLibrary library, Marker marker, MarkGroup group, MarkResult result) {
         // 非本人领取的待评任务
         // 非本人领取的待评任务
@@ -580,13 +606,13 @@ public class MarkServiceImpl implements MarkService {
             return false;
             return false;
         }
         }
         // 非本人的回评任务
         // 非本人的回评任务
-        if ((library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED) && !library
-                .getMarkerId().equals(marker.getId())) {
+        if ((library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED)
+                && !library.getMarkerId().equals(marker.getId())) {
             return false;
             return false;
         }
         }
         // 是否多评情况下已处理过该考生评卷任务
         // 是否多评情况下已处理过该考生评卷任务
-        if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), marker.getId(), library.getId())
-                > 0) {
+        if (libraryDao
+                .countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), marker.getId(), library.getId()) > 0) {
             return false;
             return false;
         }
         }
         // 未选做
         // 未选做
@@ -598,20 +624,25 @@ public class MarkServiceImpl implements MarkService {
         }
         }
         // 尝试提交评卷结果
         // 尝试提交评卷结果
         Date now = new Date();
         Date now = new Date();
-        if (libraryDao
-                .updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(), result.getMarkerScore(),
-                        result.getScoreList(), now, result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED,
-                        LibraryStatus.INSPECTED, LibraryStatus.REJECTED) == 0) {
+        if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(),
+                result.getMarkerScore(), result.getScoreList(), now, result.getSpent(), LibraryStatus.WAITING,
+                LibraryStatus.MARKED, LibraryStatus.INSPECTED, LibraryStatus.REJECTED) == 0) {
             // 条件不符更新失败,直接返回
             // 条件不符更新失败,直接返回
             return false;
             return false;
         }
         }
         // 保存阅卷轨迹
         // 保存阅卷轨迹
+        int unansweredCount = 0;
         if (result.getTrackList() != null && !result.isUnselective()) {
         if (result.getTrackList() != null && !result.isUnselective()) {
             trackDao.deleteByLibraryId(library.getId());
             trackDao.deleteByLibraryId(library.getId());
             List<MarkTrack> tracks = result.getTrackList(library, marker);
             List<MarkTrack> tracks = result.getTrackList(library, marker);
             for (MarkTrack markTrack : tracks) {
             for (MarkTrack markTrack : tracks) {
                 trackDao.saveAndFlush(markTrack);
                 trackDao.saveAndFlush(markTrack);
+                if (markTrack.isUnanswered()) {
+                    unansweredCount++;
+                }
             }
             }
+            library.setUnansweredCount(unansweredCount);
+            libraryDao.saveAndFlush(library);
         }
         }
         // 保存特殊标记
         // 保存特殊标记
         if (result.getSpecialTagList() != null && !result.isUnselective()) {
         if (result.getSpecialTagList() != null && !result.isUnselective()) {
@@ -622,9 +653,8 @@ public class MarkServiceImpl implements MarkService {
         ArbitrateHistory history = null;
         ArbitrateHistory history = null;
         if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
         if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
             // 多评模式
             // 多评模式
-            List<MarkLibrary> list = libraryDao
-                    .findByStudentIdAndGroupNumberAndStatus(library.getStudentId(), library.getGroupNumber(),
-                            LibraryStatus.MARKED, LibraryStatus.INSPECTED);
+            List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
+                    library.getGroupNumber(), LibraryStatus.MARKED, LibraryStatus.INSPECTED);
             for (MarkLibrary other : list) {
             for (MarkLibrary other : list) {
                 // 本评卷任务或组长已打分,则跳过该任务
                 // 本评卷任务或组长已打分,则跳过该任务
                 if (other.getId().equals(library.getId()) || other.getHeaderScore() != null) {
                 if (other.getId().equals(library.getId()) || other.getHeaderScore() != null) {
@@ -635,9 +665,8 @@ public class MarkServiceImpl implements MarkService {
                     continue;
                     continue;
                 }
                 }
                 // 其中一个有分另一个未选做 直接进入仲裁
                 // 其中一个有分另一个未选做 直接进入仲裁
-                if ((other.getMarkerScore() != UN_SELECTIVE_SCORE && result.getMarkerScore() == UN_SELECTIVE_SCORE) || (
-                        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 && result.getMarkerScore() != UN_SELECTIVE_SCORE)) {
                     history = buildArbitrateHistory(library, now);
                     history = buildArbitrateHistory(library, now);
                     break;
                     break;
                 }
                 }
@@ -645,13 +674,12 @@ public class MarkServiceImpl implements MarkService {
                 if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
                 if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
                     // 开启三评
                     // 开启三评
                     if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
                     if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
-                        if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber())
-                                == 2) {
+                        if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber()) == 2) {
                             buildThirdLibrary(library, group);
                             buildThirdLibrary(library, group);
                         } else {
                         } else {
                             // 两两比较,触发仲裁
                             // 两两比较,触发仲裁
-                            List<MarkLibrary> libraries = libraryDao
-                                    .findByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
+                            List<MarkLibrary> libraries = libraryDao.findByStudentIdAndGroupNumber(
+                                    library.getStudentId(), library.getGroupNumber());
                             history = buildArbitrateHistory(libraries, group.getArbitrateThreshold(), now);
                             history = buildArbitrateHistory(libraries, group.getArbitrateThreshold(), now);
                         }
                         }
                     } else {
                     } else {
@@ -732,7 +760,8 @@ public class MarkServiceImpl implements MarkService {
      * 管理员/组长打回某个评卷任务<br>
      * 管理员/组长打回某个评卷任务<br>
      * isRest为true时重置该评卷任务
      * isRest为true时重置该评卷任务
      *
      *
-     * @param library - 正评任务
+     * @param library
+     *            - 正评任务
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -747,14 +776,13 @@ public class MarkServiceImpl implements MarkService {
             specialTagDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
                     library.getGroupNumber());
                     library.getGroupNumber());
-            problemHistoryDao
-                    .resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK, new Date());
+            problemHistoryDao.resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK,
+                    new Date());
             // 开启三评时,打回1,2任务则删除第3条任务
             // 开启三评时,打回1,2任务则删除第3条任务
             long count = libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
             long count = libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
             if (library.getTaskNumber() != 3 && count == 3) {
             if (library.getTaskNumber() != 3 && count == 3) {
-                MarkLibrary third = libraryDao
-                        .findByStudentIdAndGroupNumberAndTaskNumber(library.getStudentId(), library.getGroupNumber(),
-                                3);
+                MarkLibrary third = libraryDao.findByStudentIdAndGroupNumberAndTaskNumber(library.getStudentId(),
+                        library.getGroupNumber(), 3);
                 trackDao.deleteByLibraryId(third.getId());
                 trackDao.deleteByLibraryId(third.getId());
                 specialTagDao.deleteByLibraryId(third.getId());
                 specialTagDao.deleteByLibraryId(third.getId());
                 problemHistoryDao.deleteByLibraryId(third.getId());
                 problemHistoryDao.deleteByLibraryId(third.getId());
@@ -771,7 +799,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 管理员/组长重置某个试评任务
      * 管理员/组长重置某个试评任务
      *
      *
-     * @param library - 试评任务
+     * @param library
+     *            - 试评任务
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -789,7 +818,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 管理员/组长处理仲裁卷
      * 管理员/组长处理仲裁卷
      *
      *
-     * @param history - 仲裁卷
+     * @param history
+     *            - 仲裁卷
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -873,8 +903,8 @@ public class MarkServiceImpl implements MarkService {
         }
         }
         // 计算选做题分数
         // 计算选做题分数
         ExamStudent student = studentService.findById(studentId);
         ExamStudent student = studentService.findById(studentId);
-        List<SelectiveGroup> selectiveGroups = selectiveGroupService
-                .findByExamIdAndSubjectCode(student.getExamId(), student.getSubjectCode());
+        List<SelectiveGroup> selectiveGroups = selectiveGroupService.findByExamIdAndSubjectCode(student.getExamId(),
+                student.getSubjectCode());
 
 
         List<Double> selectiveList = new ArrayList<Double>();
         List<Double> selectiveList = new ArrayList<Double>();
         Integer selectiveCount = 0;
         Integer selectiveCount = 0;
@@ -920,9 +950,8 @@ public class MarkServiceImpl implements MarkService {
                 // 有非完成状态的评卷任务,直接返回
                 // 有非完成状态的评卷任务,直接返回
                 return false;
                 return false;
             }
             }
-            double markerScore = library.getStatus() == LibraryStatus.ARBITRATED ?
-                    library.getHeaderScore() :
-                    library.getMarkerScore();
+            double markerScore = library.getStatus() == LibraryStatus.ARBITRATED ? library.getHeaderScore() : library
+                    .getMarkerScore();
             if (markerScore == UN_SELECTIVE_SCORE) {
             if (markerScore == UN_SELECTIVE_SCORE) {
                 selectiveAll = true;
                 selectiveAll = true;
             }
             }
@@ -942,12 +971,12 @@ public class MarkServiceImpl implements MarkService {
                 }
                 }
                 return -1;
                 return -1;
             });
             });
-            Double score1 =
-                    list.get(0).getHeaderScore() != null ? list.get(0).getHeaderScore() : list.get(0).getMarkerScore();
-            Double score2 =
-                    list.get(1).getHeaderScore() != null ? list.get(1).getHeaderScore() : list.get(1).getMarkerScore();
-            Double score3 =
-                    list.get(2).getHeaderScore() != null ? list.get(2).getHeaderScore() : list.get(2).getMarkerScore();
+            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)) {
             if ((score3 - score2) <= (score2 - score1)) {
                 list.remove(0);
                 list.remove(0);
             } else {
             } else {
@@ -1019,7 +1048,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 更新某个评卷分组已评任务数量
      * 更新某个评卷分组已评任务数量
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -1027,8 +1057,7 @@ public class MarkServiceImpl implements MarkService {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), (int) libraryDao
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), (int) libraryDao
                     .countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(), group.getSubjectCode(),
                     .countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED,
-                            LibraryStatus.INSPECTED));
+                            group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED));
         } else if (group.getStatus() == MarkStatus.TRIAL) {
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
                     (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
@@ -1038,21 +1067,20 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 更新某个评卷分组评卷任务总量
      * 更新某个评卷分组评卷任务总量
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
     public void updateLibraryCount(MarkGroup group) {
     public void updateLibraryCount(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
-            group.setLibraryCount((int) libraryDao
-                    .countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber()));
+            group.setLibraryCount((int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     group.getLibraryCount());
                     group.getLibraryCount());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
         } else if (group.getStatus() == MarkStatus.TRIAL) {
-            group.setLibraryCount((int) trialLibraryDao
-                    .countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber()));
+            group.setLibraryCount((int) trialLibraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     group.getLibraryCount());
                     group.getLibraryCount());
         }
         }
@@ -1061,8 +1089,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 更新某个科目所有评卷分组评卷任务数量
      * 更新某个科目所有评卷分组评卷任务数量
      *
      *
-     * @param examId      - 考试ID
-     * @param subjectCode - 科目代码
+     * @param examId
+     *            - 考试ID
+     * @param subjectCode
+     *            - 科目代码
      */
      */
     @Transactional
     @Transactional
     @Override
     @Override
@@ -1077,9 +1107,12 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      *
      *
-     * @param student - 考生
-     * @param group   - 评卷分组
-     * @param subject - 科目
+     * @param student
+     *            - 考生
+     * @param group
+     *            - 评卷分组
+     * @param subject
+     *            - 科目
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -1105,15 +1138,14 @@ public class MarkServiceImpl implements MarkService {
                 } else {
                 } else {
                     double studentCount = subject.getUploadCount();
                     double studentCount = subject.getUploadCount();
                     double libraryCount = group.getLibraryCount();
                     double libraryCount = group.getLibraryCount();
-                    double doubleCount = libraryDao
-                            .countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(),
-                                    group.getSubjectCode(), group.getNumber(), 2);
+                    double doubleCount = libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(
+                            group.getExamId(), group.getSubjectCode(), group.getNumber(), 2);
                     int expectCount = (int) (studentCount * group.getDoubleRate());
                     int expectCount = (int) (studentCount * group.getDoubleRate());
                     // 随机数判断加入当前已经生成双评任务的比例加权
                     // 随机数判断加入当前已经生成双评任务的比例加权
                     // 实际双评任务数小于理论生成数 &&(剩余未生成双评的考生数量小于剩余应生成的数量||随机比例)
                     // 实际双评任务数小于理论生成数 &&(剩余未生成双评的考生数量小于剩余应生成的数量||随机比例)
-                    needDouble = doubleCount < expectCount && (
-                            (studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount)
-                                    || Math.random() < group.getDoubleRate() + 0.1);
+                    needDouble = doubleCount < expectCount
+                            && ((studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount) || Math
+                                    .random() < group.getDoubleRate() + 0.1);
                 }
                 }
                 if (needDouble) {
                 if (needDouble) {
                     library = new MarkLibrary();
                     library = new MarkLibrary();
@@ -1138,8 +1170,10 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      *
      *
-     * @param student - 考生
-     * @param group   - 评卷分组
+     * @param student
+     *            - 考生
+     * @param group
+     *            - 评卷分组
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -1168,7 +1202,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 重置评卷分组的连带操作
      * 重置评卷分组的连带操作
      *
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
      */
     private void resetGroup(MarkGroup group) {
     private void resetGroup(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
         if (group.getStatus() == MarkStatus.FORMAL) {
@@ -1181,9 +1216,8 @@ public class MarkServiceImpl implements MarkService {
                     group.getNumber());
                     group.getNumber());
             libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
             libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                     group.getNumber(), LibraryStatus.WAITING);
                     group.getNumber(), LibraryStatus.WAITING);
-            libraryDao
-                    .deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber(), 3);
+            libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber(), 3);
             markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
             markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                     group.getNumber());
                     group.getNumber());
             resetStudentGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
             resetStudentGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -1200,7 +1234,8 @@ public class MarkServiceImpl implements MarkService {
     /**
     /**
      * 计算并更新指定评卷员的评卷质量指标
      * 计算并更新指定评卷员的评卷质量指标
      *
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -1282,12 +1317,11 @@ public class MarkServiceImpl implements MarkService {
     private void checkStudentTrial(TrialLibrary library, MarkGroup group) {
     private void checkStudentTrial(TrialLibrary library, MarkGroup group) {
         updateStudentGroupStatus(library.getStudentId(), group.getExamId(), group.getSubjectCode(), group.getNumber(),
         updateStudentGroupStatus(library.getStudentId(), group.getExamId(), group.getSubjectCode(), group.getNumber(),
                 SubjectiveStatus.MARKED);
                 SubjectiveStatus.MARKED);
-        updateStudentGroupScore(library.getStudentId(), group.getExamId(), group.getSubjectCode(), group.getNumber(),
+        updateStudentGroupScore(library.getStudentId(), group.getExamId(), group.getSubjectCode(), group,
                 library.getMarkerScore(), library.getScoreList());
                 library.getMarkerScore(), library.getScoreList());
         // 未分组的题目
         // 未分组的题目
-        long unGroupQuestionCount = questionService
-                .countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(group.getExamId(), group.getSubjectCode(),
-                        false);
+        long unGroupQuestionCount = questionService.countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(
+                group.getExamId(), group.getSubjectCode(), false);
         long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
         long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
         checkStudentSubjective(library.getStudentId(), groupCount, unGroupQuestionCount);
         checkStudentSubjective(library.getStudentId(), groupCount, unGroupQuestionCount);
     }
     }
@@ -1302,12 +1336,11 @@ public class MarkServiceImpl implements MarkService {
         if (calculateGroup(group, studentId)) {
         if (calculateGroup(group, studentId)) {
             updateStudentGroupStatus(studentId, group.getExamId(), group.getSubjectCode(), group.getNumber(),
             updateStudentGroupStatus(studentId, group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     SubjectiveStatus.MARKED);
                     SubjectiveStatus.MARKED);
-            updateStudentGroupScore(studentId, group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    group.getMarkScore(), group.getMarkScoreDetail());
+            updateStudentGroupScore(studentId, group.getExamId(), group.getSubjectCode(), group, group.getMarkScore(),
+                    group.getMarkScoreDetail());
             // 未分组的题目
             // 未分组的题目
-            long unGroupQuestionCount = questionService
-                    .countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(group.getExamId(), group.getSubjectCode(),
-                            false);
+            long unGroupQuestionCount = questionService.countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(
+                    group.getExamId(), group.getSubjectCode(), false);
             long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
             long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
             checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
             checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
         } else {
         } else {
@@ -1342,9 +1375,8 @@ public class MarkServiceImpl implements MarkService {
         groupStudentDao.updateStatusByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber,
         groupStudentDao.updateStatusByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber,
                 SubjectiveStatus.UNMARK);
                 SubjectiveStatus.UNMARK);
         scoreDao.deleteByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber);
         scoreDao.deleteByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber);
-        studentService
-                .updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode, SubjectiveStatus.UNMARK, 0, null,
-                        null, null);
+        studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode, SubjectiveStatus.UNMARK, 0,
+                null, null, null);
     }
     }
 
 
     private void updateStudentGroupStatus(Integer studentId, Integer examId, String subjectCode, Integer groupNumber,
     private void updateStudentGroupStatus(Integer studentId, Integer examId, String subjectCode, Integer groupNumber,
@@ -1358,18 +1390,18 @@ public class MarkServiceImpl implements MarkService {
         groupStudentDao.saveAndFlush(gs);
         groupStudentDao.saveAndFlush(gs);
     }
     }
 
 
-    private void updateStudentGroupScore(Integer studentId, Integer examId, String subjectCode, Integer groupNumber,
+    private void updateStudentGroupScore(Integer studentId, Integer examId, String subjectCode, MarkGroup group,
             double score, List<ScoreItem> scoreList) {
             double score, List<ScoreItem> scoreList) {
         // scoreDao.deleteByStudentIdAndGroupNumber(studentId, groupNumber);
         // scoreDao.deleteByStudentIdAndGroupNumber(studentId, groupNumber);
-        List<ExamQuestion> questions = questionService
-                .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, groupNumber);
+        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                subjectCode, false, group.getNumber());
         for (int i = 0; i < questions.size(); i++) {
         for (int i = 0; i < questions.size(); i++) {
             ExamQuestion question = questions.get(i);
             ExamQuestion question = questions.get(i);
             SubjectiveScore ss = new SubjectiveScore();
             SubjectiveScore ss = new SubjectiveScore();
             ss.setStudentId(studentId);
             ss.setStudentId(studentId);
             ss.setExamId(examId);
             ss.setExamId(examId);
             ss.setSubjectCode(subjectCode);
             ss.setSubjectCode(subjectCode);
-            ss.setGroupNumber(groupNumber);
+            ss.setGroupNumber(group.getNumber());
             ss.setGroupScore(score);
             ss.setGroupScore(score);
             ss.setMainNumber(question.getMainNumber());
             ss.setMainNumber(question.getMainNumber());
             ss.setSubNumber(question.getSubNumber());
             ss.setSubNumber(question.getSubNumber());
@@ -1381,6 +1413,17 @@ public class MarkServiceImpl implements MarkService {
                 ss.setScore(score);
                 ss.setScore(score);
                 ss.setMainScore(score);
                 ss.setMainScore(score);
             }
             }
+            if (group.getArbitrateThreshold() > 0) {
+                ss.setUnansweredCount(0);
+            } else {
+                if (MarkStatus.TRIAL.equals(group.getStatus())) {
+                    ss.setUnansweredCount(trialTrackDao.countByStudentIdAndQuestionNumberAndUnanswered(studentId,
+                            question.getQuestionNumber(), true));
+                } else {
+                    ss.setUnansweredCount(trackDao.countByStudentIdAndQuestionNumberAndUnanswered(studentId,
+                            question.getQuestionNumber(), true));
+                }
+            }
             scoreDao.saveAndFlush(ss);
             scoreDao.saveAndFlush(ss);
         }
         }
     }
     }
@@ -1413,8 +1456,8 @@ public class MarkServiceImpl implements MarkService {
         if (count > 0) {
         if (count > 0) {
             updateMarkedCount(group);
             updateMarkedCount(group);
             resetStudentGroup(student.getId(), group.getExamId(), group.getSubjectCode(), group.getNumber());
             resetStudentGroup(student.getId(), group.getExamId(), group.getSubjectCode(), group.getNumber());
-            studentService
-                    .updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.UNMARK, null, null);
+            studentService.updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.UNMARK, null,
+                    null);
             return true;
             return true;
         }
         }
         return false;
         return false;
@@ -1441,9 +1484,8 @@ public class MarkServiceImpl implements MarkService {
         }
         }
         for (Integer groupNumber : map.keySet()) {
         for (Integer groupNumber : map.keySet()) {
             List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(student.getId(), groupNumber);
             List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(student.getId(), groupNumber);
-            List<ExamQuestion> questions = questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(student.getExamId(), student.getSubjectCode(),
-                            false, groupNumber);
+            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    student.getExamId(), student.getSubjectCode(), false, groupNumber);
             List<MarkStepDTO> qList = map.get(groupNumber);
             List<MarkStepDTO> qList = map.get(groupNumber);
             MarkGroup group = groupDao.findOne(student.getExamId(), student.getSubjectCode(), groupNumber);
             MarkGroup group = groupDao.findOne(student.getExamId(), student.getSubjectCode(), groupNumber);
             int count = 0;
             int count = 0;
@@ -1466,16 +1508,16 @@ public class MarkServiceImpl implements MarkService {
                     count++;
                     count++;
                     continue;
                     continue;
                 }
                 }
-                if (library.getStatus().equals(LibraryStatus.MARKED) || library.getStatus()
-                        .equals(LibraryStatus.INSPECTED)) {
+                if (library.getStatus().equals(LibraryStatus.MARKED)
+                        || library.getStatus().equals(LibraryStatus.INSPECTED)) {
                     List<ScoreItem> sList = library.getScoreList();
                     List<ScoreItem> sList = library.getScoreList();
                     for (MarkStepDTO markStepDTO : qList) {
                     for (MarkStepDTO markStepDTO : qList) {
-                        trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
-                                markStepDTO.getMainNumber() + "." + markStepDTO.getSubNumber());
+                        trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
+                                + markStepDTO.getSubNumber());
                         for (int i = 0; i < questions.size(); i++) {
                         for (int i = 0; i < questions.size(); i++) {
                             ExamQuestion question = questions.get(i);
                             ExamQuestion question = questions.get(i);
-                            if (markStepDTO.getMainNumber() == question.getMainNumber() && markStepDTO.getSubNumber()
-                                    .equals(question.getSubNumber())) {
+                            if (markStepDTO.getMainNumber() == question.getMainNumber()
+                                    && markStepDTO.getSubNumber().equals(question.getSubNumber())) {
                                 sList.remove(i);
                                 sList.remove(i);
                                 sList.add(i, new ScoreItem(false));
                                 sList.add(i, new ScoreItem(false));
                             }
                             }
@@ -1504,9 +1546,8 @@ public class MarkServiceImpl implements MarkService {
             if (count > 0) {
             if (count > 0) {
                 updateMarkedCount(group);
                 updateMarkedCount(group);
                 resetStudentGroup(student.getId(), student.getExamId(), student.getSubjectCode(), groupNumber);
                 resetStudentGroup(student.getId(), student.getExamId(), student.getSubjectCode(), groupNumber);
-                studentService
-                        .updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.UNMARK, null,
-                                null);
+                studentService.updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.UNMARK,
+                        null, null);
             }
             }
         }
         }
         return true;
         return true;
@@ -1515,8 +1556,8 @@ public class MarkServiceImpl implements MarkService {
     @Transactional
     @Transactional
     @Override
     @Override
     public boolean deleteByQuestion(ExamQuestion question) {
     public boolean deleteByQuestion(ExamQuestion question) {
-        SelectiveGroup selectiveGroup = selectiveGroupService
-                .findOne(question.getExamId(), question.getSubjectCode(), question.getMainNumber());
+        SelectiveGroup selectiveGroup = selectiveGroupService.findOne(question.getExamId(), question.getSubjectCode(),
+                question.getMainNumber());
         if (selectiveGroup != null) {
         if (selectiveGroup != null) {
             return false;
             return false;
         }
         }
@@ -1527,26 +1568,23 @@ public class MarkServiceImpl implements MarkService {
             String subjectCode = question.getSubjectCode();
             String subjectCode = question.getSubjectCode();
             boolean objective = question.isObjective();
             boolean objective = question.isObjective();
             ExamSubject subject = subjectService.find(examId, subjectCode);
             ExamSubject subject = subjectService.find(examId, subjectCode);
-            double totalScore = objective ?
-                    BigDecimalUtils.sub(subject.getObjectiveScore(), question.getTotalScore()) :
-                    BigDecimalUtils.sub(subject.getSubjectiveScore(), question.getTotalScore());
+            double totalScore = objective ? BigDecimalUtils.sub(subject.getObjectiveScore(), question.getTotalScore())
+                    : BigDecimalUtils.sub(subject.getSubjectiveScore(), question.getTotalScore());
             questionService.deleteById(question.getId());
             questionService.deleteById(question.getId());
             if (objective) {
             if (objective) {
                 examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
                 examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
             } else {
             } else {
                 // 未分组的题目
                 // 未分组的题目
-                long unGroupQuestionCount = questionService
-                        .countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(examId, subjectCode, false);
+                long unGroupQuestionCount = questionService.countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(
+                        examId, subjectCode, false);
                 // 考生整体状态与总分更新
                 // 考生整体状态与总分更新
                 long groupCount = groupDao.countByExamIdAndSubjectCode(examId, subjectCode);
                 long groupCount = groupDao.countByExamIdAndSubjectCode(examId, subjectCode);
                 if (groupCount == 0 || unGroupQuestionCount > 0) {
                 if (groupCount == 0 || unGroupQuestionCount > 0) {
-                    studentService
-                            .updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode, SubjectiveStatus.UNMARK,
-                                    0, null, null, null);
+                    studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode,
+                            SubjectiveStatus.UNMARK, 0, null, null, null);
                 } else {
                 } else {
-                    List<Integer> studentList = studentService
-                            .findIdByExamIdAndSubjectCodeAndSubjectiveStatus(examId, subjectCode,
-                                    SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
+                    List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(examId,
+                            subjectCode, SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
                     for (Integer studentId : studentList) {
                     for (Integer studentId : studentList) {
                         checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
                         checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
                     }
                     }
@@ -1560,9 +1598,8 @@ public class MarkServiceImpl implements MarkService {
     @Override
     @Override
     @Transactional
     @Transactional
     public boolean rejectLibrary(MarkLibrary library, MarkStepDTO[] questionList, Integer userId) {
     public boolean rejectLibrary(MarkLibrary library, MarkStepDTO[] questionList, Integer userId) {
-        List<ExamQuestion> questions = questionService
-                .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(), library.getSubjectCode(), false,
-                        library.getGroupNumber());
+        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
         if (questionList.length == questions.size()) {
         if (questionList.length == questions.size()) {
             return rejectLibrary(library, userId, false);
             return rejectLibrary(library, userId, false);
         }
         }
@@ -1572,12 +1609,12 @@ public class MarkServiceImpl implements MarkService {
         }
         }
         List<ScoreItem> sList = library.getScoreList();
         List<ScoreItem> sList = library.getScoreList();
         for (MarkStepDTO markStepDTO : questionList) {
         for (MarkStepDTO markStepDTO : questionList) {
-            trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
-                    markStepDTO.getMainNumber() + "." + markStepDTO.getSubNumber());
+            trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
+                    + markStepDTO.getSubNumber());
             for (int i = 0; i < questions.size(); i++) {
             for (int i = 0; i < questions.size(); i++) {
                 ExamQuestion question = questions.get(i);
                 ExamQuestion question = questions.get(i);
-                if (markStepDTO.getMainNumber() == question.getMainNumber() && markStepDTO.getSubNumber()
-                        .equals(question.getSubNumber())) {
+                if (markStepDTO.getMainNumber() == question.getMainNumber()
+                        && markStepDTO.getSubNumber().equals(question.getSubNumber())) {
                     sList.remove(i);
                     sList.remove(i);
                     sList.add(i, new ScoreItem(false));
                     sList.add(i, new ScoreItem(false));
                 }
                 }
@@ -1599,14 +1636,13 @@ public class MarkServiceImpl implements MarkService {
                 markerScoreList.toString(), null, null, LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 1) {
                 markerScoreList.toString(), null, null, LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 1) {
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
                     library.getGroupNumber());
                     library.getGroupNumber());
-            problemHistoryDao
-                    .resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK, new Date());
+            problemHistoryDao.resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK,
+                    new Date());
             // 开启三评时,打回1,2任务则删除第3条任务
             // 开启三评时,打回1,2任务则删除第3条任务
             long count = libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
             long count = libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
             if (library.getTaskNumber() != 3 && count == 3) {
             if (library.getTaskNumber() != 3 && count == 3) {
-                MarkLibrary third = libraryDao
-                        .findByStudentIdAndGroupNumberAndTaskNumber(library.getStudentId(), library.getGroupNumber(),
-                                3);
+                MarkLibrary third = libraryDao.findByStudentIdAndGroupNumberAndTaskNumber(library.getStudentId(),
+                        library.getGroupNumber(), 3);
                 trackDao.deleteByLibraryId(third.getId());
                 trackDao.deleteByLibraryId(third.getId());
                 specialTagDao.deleteByLibraryId(third.getId());
                 specialTagDao.deleteByLibraryId(third.getId());
                 problemHistoryDao.deleteByLibraryId(third.getId());
                 problemHistoryDao.deleteByLibraryId(third.getId());

+ 35 - 37
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java

@@ -1,16 +1,12 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-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.query.ExamStudentSearchQuery;
-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.file.service.FileService;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.LogType;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
 import net.sf.json.JSONArray;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
 
 
@@ -23,12 +19,17 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.ModelAndView;
 
 
-import javax.servlet.http.HttpServletRequest;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+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.query.ExamStudentSearchQuery;
+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.file.service.FileService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.LogType;
 
 
 @Controller
 @Controller
 @RequestMapping("/admin/exam/check/answer")
 @RequestMapping("/admin/exam/check/answer")
@@ -76,29 +77,26 @@ public class AnswerCheckController extends BaseExamController {
 
 
     @RequestMapping("/start")
     @RequestMapping("/start")
     @ResponseBody
     @ResponseBody
-    public ModelAndView start(HttpServletRequest request, ExamStudentSearchQuery query) {
+    public JSONObject start(HttpServletRequest request, ExamStudentSearchQuery query) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            ModelAndView view = new ModelAndView("modules/exam/checkAnswerEdit");
-            List<Integer> ids = new ArrayList<Integer>();
-            query.setExamId(examId);
-            query.setUpload(true);
-            query.setPageNumber(1);
-            query.setPageSize(1000);
-            query = studentService.findByQuery(query);
-            while (query.getCurrentCount() > 0) {
-                for (ExamStudent student : query.getResult()) {
-                    ids.add(student.getId());
-                }
-                query.setPageNumber(query.getPageNumber() + 1);
-                query = studentService.findByQuery(query);
+        JSONObject setting = new JSONObject();
+        setting.accumulate("fileServer", fileService.getFileServer());
+        List<Integer> ids = new ArrayList<Integer>();
+        query.setExamId(examId);
+        query.setUpload(true);
+        query.setPageNumber(1);
+        query.setPageSize(1000);
+        query = studentService.findByQuery(query);
+        while (query.getCurrentCount() > 0) {
+            for (ExamStudent student : query.getResult()) {
+                ids.add(student.getId());
             }
             }
-            view.addObject("fileServer", fileService.getFileServer());
-            view.addObject("ids", StringUtils.join(ids, ","));
-            return view;
-        } else {
-            return new ModelAndView("redirect:/admin/exam/list");
+            query.setPageNumber(query.getPageNumber() + 1);
+            query = studentService.findByQuery(query);
         }
         }
+        setting.accumulate("ids", StringUtils.join(ids, ","));
+        setting.accumulate("count", ids.size());
+        return setting;
     }
     }
 
 
     @Logging(menu = "识别结果修改", type = LogType.UPDATE)
     @Logging(menu = "识别结果修改", type = LogType.UPDATE)

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java

@@ -182,7 +182,7 @@ public class ArbitrateController extends BaseExamController {
         setting.accumulate("subject", subject);
         setting.accumulate("subject", subject);
         setting.accumulate("splitConfig", getSplitConfig());
         setting.accumulate("splitConfig", getSplitConfig());
         setting.accumulate("enableSplit",
         setting.accumulate("enableSplit",
-                examSubject.isEnableSplit() == null ? exam.isEnableSplit() : examSubject.isEnableSplit());
+                examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
         return setting;
         return setting;
     }
     }
 
 

+ 27 - 28
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -1,14 +1,12 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.file.service.FileService;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.enums.CheckType;
-import cn.com.qmth.stmms.common.enums.LogType;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+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;
@@ -18,12 +16,16 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
 
 
-import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.enums.CheckType;
+import cn.com.qmth.stmms.common.enums.LogType;
 
 
 @Controller
 @Controller
 @RequestMapping("/admin/exam/check/student")
 @RequestMapping("/admin/exam/check/student")
@@ -58,23 +60,20 @@ public class CheckStudentController extends BaseExamController {
         return "modules/exam/checkStudent";
         return "modules/exam/checkStudent";
     }
     }
 
 
-    @RequestMapping("/start")
+    @RequestMapping("/getSetting")
     @ResponseBody
     @ResponseBody
-    public ModelAndView start(HttpServletRequest request, @RequestParam CheckType type) {
+    public JSONObject start(HttpServletRequest request, @RequestParam CheckType type) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            ModelAndView view = new ModelAndView("modules/exam/checkStudentEdit");
-            List<Integer> ids = new ArrayList<Integer>();
-            List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, type);
-            for (CheckStudent student : list) {
-                ids.add(student.getStudentId());
-            }
-            view.addObject("fileServer", fileService.getFileServer());
-            view.addObject("ids", StringUtils.join(ids, ","));
-            return view;
-        } else {
-            return new ModelAndView("redirect:/admin/exam/list");
+        JSONObject setting = new JSONObject();
+        setting.accumulate("fileServer", fileService.getFileServer());
+        List<Integer> ids = new ArrayList<Integer>();
+        List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, type);
+        for (CheckStudent student : list) {
+            ids.add(student.getStudentId());
         }
         }
+        setting.accumulate("ids", StringUtils.join(ids, ","));
+        setting.accumulate("count", ids.size());
+        return setting;
     }
     }
 
 
     @Logging(menu = "人工确认考生", type = LogType.UPDATE)
     @Logging(menu = "人工确认考生", type = LogType.UPDATE)

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -376,7 +376,7 @@ public class InspectedController extends BaseExamController {
         subject.accumulate("answerUrl", examSubject.getAnswerUrl() == null ? "" : examSubject.getAnswerUrl());
         subject.accumulate("answerUrl", examSubject.getAnswerUrl() == null ? "" : examSubject.getAnswerUrl());
         setting.accumulate("subject", subject);
         setting.accumulate("subject", subject);
         setting.accumulate("enableSplit",
         setting.accumulate("enableSplit",
-                examSubject.isEnableSplit() == null ? exam.isEnableSplit() : examSubject.isEnableSplit());
+                examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
         return setting;
         return setting;
     }
     }
 
 

+ 4 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java

@@ -144,7 +144,8 @@ public class MarkTrackController extends BaseExamController {
         map.put("splitConfig", getSplitConfig());
         map.put("splitConfig", getSplitConfig());
         Exam exam = examService.findById(library.getExamId());
         Exam exam = examService.findById(library.getExamId());
         ExamSubject examSubject = subjectService.find(library.getExamId(), library.getSubjectCode());
         ExamSubject examSubject = subjectService.find(library.getExamId(), library.getSubjectCode());
-        map.put("enableSplit", examSubject.isEnableSplit() == null ? exam.isEnableSplit() : examSubject.isEnableSplit());
+        map.put("enableSplit",
+                examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
         return map;
         return map;
     }
     }
 
 
@@ -187,7 +188,8 @@ public class MarkTrackController extends BaseExamController {
         map.put("splitConfig", getSplitConfig());
         map.put("splitConfig", getSplitConfig());
         Exam exam = examService.findById(library.getExamId());
         Exam exam = examService.findById(library.getExamId());
         ExamSubject examSubject = subjectService.find(library.getExamId(), library.getSubjectCode());
         ExamSubject examSubject = subjectService.find(library.getExamId(), library.getSubjectCode());
-        map.put("enableSplit", examSubject.isEnableSplit() == null ? exam.isEnableSplit() : examSubject.isEnableSplit());
+        map.put("enableSplit",
+                examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
         return map;
         return map;
     }
     }
 }
 }

+ 2 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java

@@ -90,6 +90,8 @@ public class SubjectController extends BaseExamController {
         sasConfig.accumulate("passScore", passScore);
         sasConfig.accumulate("passScore", passScore);
         sasConfig.accumulate("excellentScore", excellentScore);
         sasConfig.accumulate("excellentScore", excellentScore);
         previous.setSasConfig(sasConfig.toString());
         previous.setSasConfig(sasConfig.toString());
+        previous.setEnableSplit(subject.getEnableSplit());
+        previous.setAutoScroll(subject.getAutoScroll());
         subjectService.save(previous);
         subjectService.save(previous);
 
 
         model.addAttribute("message", "修改成功");
         model.addAttribute("message", "修改成功");

+ 2 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java

@@ -501,6 +501,8 @@ public class CoreController extends BaseApiController {
             subject.setSubjectiveScore(0d);
             subject.setSubjectiveScore(0d);
             subject.setTotalScore(0d);
             subject.setTotalScore(0d);
             subject.setUploadCount(0);
             subject.setUploadCount(0);
+            subject.setAutoScroll(exam.isAutoScroll());
+            subject.setEnableSplit(exam.isEnableSplit());
         }
         }
         subject.setName(name);
         subject.setName(name);
         subject.setRemark(remark);
         subject.setRemark(remark);

+ 3 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -303,7 +303,6 @@ public class MarkController extends BaseController {
         setting.accumulate("userName", RequestUtils.getWebUser(request).getName());
         setting.accumulate("userName", RequestUtils.getWebUser(request).getName());
         setProblemType(setting, marker);
         setProblemType(setting, marker);
         setting.accumulate("selective", group.isSelective());
         setting.accumulate("selective", group.isSelective());
-        setting.accumulate("autoScroll", exam.isAutoScroll());
         return setting;
         return setting;
     }
     }
 
 
@@ -708,7 +707,9 @@ public class MarkController extends BaseController {
         }
         }
         setting.accumulate("sheetConfig", sheetConfig);
         setting.accumulate("sheetConfig", sheetConfig);
         setting.accumulate("enableSplit",
         setting.accumulate("enableSplit",
-                examSubject.isEnableSplit() == null ? exam.isEnableSplit() : examSubject.isEnableSplit());
+                examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
+        setting.accumulate("autoScroll",
+                examSubject.getAutoScroll() == null ? exam.isAutoScroll() : examSubject.getAutoScroll());
         JSONObject subject = new JSONObject();
         JSONObject subject = new JSONObject();
         subject.accumulate("name", examSubject.getName());
         subject.accumulate("name", examSubject.getName());
         subject.accumulate("code", examSubject.getCode());
         subject.accumulate("code", examSubject.getCode());

+ 4 - 4
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examEdit.jsp

@@ -174,15 +174,15 @@
 		        </div>
 		        </div>
 			</div>
 			</div>
 			<div class="control-group">
 			<div class="control-group">
-		        <label class="control-label">自动跳转</label>
+		        <label class="control-label">评卷提交自动定位</label>
 		        <div class="controls">
 		        <div class="controls">
-		        <input name="autoScroll" type="checkbox" <c:if test="${exam.autoScroll}">checked</c:if>/>
+		        <input name="autoScroll" type="checkbox" <c:if test="${exam.autoScroll}">checked</c:if>/>*开启后,当前试卷评完后,下份试卷自动定位到上份试卷的第一个轨迹点
 		        </div>
 		        </div>
 			</div>
 			</div>
 			<div class="control-group">
 			<div class="control-group">
-			        <label class="control-label">评卷裁切</label>
+			        <label class="control-label">自动对切题卡</label>
 			        <div class="controls">
 			        <div class="controls">
-			        <input name="enableSplit" type="checkbox" <c:if test="${exam.enableSplit}">checked</c:if>/>
+			        <input name="enableSplit" type="checkbox" <c:if test="${exam.enableSplit}">checked</c:if>/>*选持自动对切题卡后,在阅卷端自动按照题卡的55%的比例进行对切,纸张大小A4时不生效
 			        </div>
 			        </div>
 			</div>
 			</div>
         </c:if>
         </c:if>

+ 4 - 4
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examForm.jsp

@@ -163,15 +163,15 @@
 	        </div>
 	        </div>
 	</div>
 	</div>
 	<div class="control-group">
 	<div class="control-group">
-	        <label class="control-label">自动跳转</label>
+	        <label class="control-label">评卷提交自动定位</label>
 	        <div class="controls">
 	        <div class="controls">
-	        <input name="autoScroll" type="checkbox" <c:if test="${exam.autoScroll}">checked</c:if>/>
+	        <input name="autoScroll" type="checkbox" <c:if test="${exam.autoScroll}">checked</c:if>/>*开启后,当前试卷评完后,下份试卷自动定位到上份试卷的第一个轨迹点
 	        </div>
 	        </div>
 	</div>
 	</div>
 	<div class="control-group">
 	<div class="control-group">
-	        <label class="control-label">评卷裁切</label>
+	        <label class="control-label">自动对切题卡</label>
 	        <div class="controls">
 	        <div class="controls">
-	        <input name="enableSplit" type="checkbox" <c:if test="${exam.enableSplit}">checked</c:if>/>
+	        <input name="enableSplit" type="checkbox" <c:if test="${exam.enableSplit}">checked</c:if>/>*选持自动对切题卡后,在阅卷端自动按照题卡的55%的比例进行对切,纸张大小A4时不生效
 	        </div>
 	        </div>
 	</div>
 	</div>
     <div class="control-group">
     <div class="control-group">

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

@@ -46,6 +46,18 @@
                 <a href="${ctx}/admin/exam/getSheetConfig?examId=${subject.examId}&subjectCode=${subject.code}" target="_blank" class="required" id= "configuration" rel="opener">设置</a>
                 <a href="${ctx}/admin/exam/getSheetConfig?examId=${subject.examId}&subjectCode=${subject.code}" target="_blank" class="required" id= "configuration" rel="opener">设置</a>
             </div>
             </div>
         </div>
         </div>
+        <div class="control-group">
+	        <label class="control-label">评卷提交自动定位</label>
+	        <div class="controls">
+	        <input name="autoScroll" type="checkbox" <c:if test="${subject.autoScroll}">checked</c:if>/>*开启后,当前试卷评完后,下份试卷自动定位到上份试卷的第一个轨迹点
+	        </div>
+		</div>
+		<div class="control-group">
+		        <label class="control-label">自动对切题卡</label>
+		        <div class="controls">
+		        <input name="enableSplit" type="checkbox" <c:if test="${subject.enableSplit}">checked</c:if>/>*选持自动对切题卡后,在阅卷端自动按照题卡的55%的比例进行对切,纸张大小A4时不生效
+		        </div>
+		</div>
 		<div class="form-actions">
 		<div class="form-actions">
 			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
 			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
 			<a href="javascript:" onclick="history.go(-1);" class="btn"/>返回</a>
 			<a href="javascript:" onclick="history.go(-1);" class="btn"/>返回</a>