Explorar el Código

修改评卷任务构建模式,改为批量乱序保存;修改eb_exam_student表索引index3;修改按状态获取考试ID方法的SQL

luoshi hace 1 año
padre
commit
e55e118be7

+ 1 - 1
pom.xml

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

+ 14 - 18
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -2,7 +2,6 @@ package cn.com.qmth.stmms.biz.exam.dao;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
-
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
@@ -14,8 +13,8 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
-public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent, Integer>,
-        JpaSpecificationExecutor<ExamStudent> {
+public interface ExamStudentDao
+        extends PagingAndSortingRepository<ExamStudent, Integer>, JpaSpecificationExecutor<ExamStudent> {
 
     public List<ExamStudent> findByExamId(int examId, Pageable pageable);
 
@@ -73,8 +72,8 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
 
     @Modifying
     @Query("update ExamStudent s set s.subjectiveStatus=?3, s.subjectiveScore=?4, s.subjectiveScoreList=?5,s.inspectTime=?6,s.inspectorId=?7 where s.examId=?1 and s.subjectCode=?2")
-    public void updateSubjectiveStatusAndScore(Integer examId, String subjetCode, SubjectiveStatus status,
-            double score, String scoreList, Date inspectTime, Integer inspectorId);
+    public void updateSubjectiveStatusAndScore(Integer examId, String subjetCode, SubjectiveStatus status, double score,
+            String scoreList, Date inspectTime, Integer inspectorId);
 
     @Modifying
     @Query("update ExamStudent s set s.subjectiveStatus=?3, s.subjectiveScore=?4, s.subjectiveScoreList=?5, s.inspectTime=?6, s.inspectorId=?7 "
@@ -158,14 +157,10 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     public List<ExamStudent> findByExamIdAndSubjectCodeAndUploadTimeNotNullAndAbsent(int examId, String code,
             Boolean absent);
 
-    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null "
-            + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
-    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber, Pageable page);
-
-    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null and s.uploadTime>=?4 "
-            + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
+    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false "
+            + " and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
     public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber,
-            Date minUploadTime, Pageable page);
+            Pageable page);
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false "
             + "and s.subjectiveStatus=?4 and not exists (select l.id from TrialLibrary l where l.studentId=s.id and l.groupNumber=?3)")
@@ -211,7 +206,8 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     public void updateSubjectiveStatusAndTimeAndInspectorId(Integer studentId, SubjectiveStatus status,
             Date inspectTime, Integer inspectorId);
 
-    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode, String subjectCode);
+    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode,
+            String subjectCode);
 
     @Query("select sum(s.sheetCount) from ExamStudent s where s.examId=?1 ")
     public Long sumSheetCountByExamId(Integer examId);
@@ -239,21 +235,21 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     @Query("update ExamStudent s set s.college=?2 ,s.className=?3, s.teacher=?4,s.examRoom=?5, s.examSite=?6, s.remark=?7 where s.id=?1 ")
     public int updateInfo(Integer id, String college, String className, String teacher, String examRoom,
             String examSite, String remark);
-    
+
     @Modifying
     @Query("update ExamStudent s set s.scoreVerifyUser=?1,s.scoreVerifyTime=?2,s.scoreVerifyFlagged=?3 where s.id=?4 ")
-    public void scoreVerifyTag(Integer userId,Date time,Boolean tag,Integer studentId);
+    public void scoreVerifyTag(Integer userId, Date time, Boolean tag, Integer studentId);
 
     @Modifying
     @Query("update ExamStudent s set s.inspected=0,s.inspectTime=null ,s.inspectorId=null where s.examId=?1 and s.subjectCode=?2 and s.inspected=1")
-	public void cancelInspect(int examId, String subjectCode);
-    
+    public void cancelInspect(int examId, String subjectCode);
+
     @Modifying
     @Query("update ExamStudent s set s.inspected=1, s.inspectTime=?2 ,s.inspectorId=?3 where s.id=?1 ")
     public void inspect(Integer studentId, Date inspectTime, Integer inspectorId);
 
     @Modifying
     @Query("update ExamStudent s set s.inspected=0, s.inspectTime=null ,s.inspectorId=null where s.id=?1 ")
-	public void cancelInspect(Integer studentId);
+    public void cancelInspect(Integer studentId);
 
 }

+ 6 - 9
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java

@@ -2,11 +2,7 @@ package cn.com.qmth.stmms.biz.exam.dao;
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
-import cn.com.qmth.stmms.common.enums.MarkMode;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
-
+import cn.com.qmth.stmms.common.enums.*;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
@@ -15,8 +11,8 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 import java.util.Date;
 import java.util.List;
 
-public interface MarkGroupDao extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>,
-        JpaSpecificationExecutor<MarkGroup> {
+public interface MarkGroupDao
+        extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>, JpaSpecificationExecutor<MarkGroup> {
 
     @Query("select q from MarkGroup q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.number=?3")
     MarkGroup findOne(Integer examId, String subjectCode, Integer groupNumber);
@@ -52,8 +48,9 @@ public interface MarkGroupDao extends PagingAndSortingRepository<MarkGroup, Mark
     List<MarkGroup> findByExamIdAndSubjectCodeAndStatusWithDouble(Integer examId, String subjectCode,
             MarkStatus... status);
 
-    @Query("select q.pk.examId from MarkGroup q where q.status in (?1)")
-    List<Integer> findExamIdByStatus(MarkStatus... status);
+    @Query("select e.id from Exam e where e.status=?1 and exists "
+            + "(select g.pk.number from MarkGroup g where g.pk.examId=e.id and g.status in (?2))")
+    List<Integer> findExamIdByStatus(ExamStatus examStatus, MarkStatus... markStatus);
 
     @Query("select count(q) from MarkGroup q where q.pk.examId=?1")
     long countByExamId(Integer examId);

+ 9 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -100,14 +100,15 @@ public interface ExamStudentService {
 
     List<ExamStudent> findUploadedByExamIdAndSubjectCode(int examId, String code);
 
-    ExamStudent findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Date minUploadTime);
+    List<ExamStudent> findUnLibraryStudent(int examId, String subjectCode, int groupNumber, int count);
 
     List<ExamStudent> findAbsentOrBreachLibraryStudent(int examId, String subjectCode);
 
     public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String code, String campusName, boolean upload,
             boolean absent);
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach);
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
+            boolean breach);
 
     public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach);
 
@@ -149,10 +150,11 @@ public interface ExamStudentService {
 
     public void updateSubjectiveStatusAndTimeAndInspectorId(Integer studentId, SubjectiveStatus status,
             Date inspectTime, Integer inspectorId);
-    
-    public void inspect(Integer studentId,Date inspectTime, Integer inspectorId);
 
-    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode, String subjectCode);
+    public void inspect(Integer studentId, Date inspectTime, Integer inspectorId);
+
+    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode,
+            String subjectCode);
 
     long countByExamIdAndSubjectCodeAndStatus(int examId, String subjectCode, SubjectiveStatus... status);
 
@@ -182,8 +184,8 @@ public interface ExamStudentService {
 
     public int batchUpdate(List<ExamStudent> updateList);
 
-	void scoreVerifyTag(Integer userId, Integer studentId, Boolean tag);
+    void scoreVerifyTag(Integer userId, Integer studentId, Boolean tag);
 
-	void cancelInspect(Integer studentId);
+    void cancelInspect(Integer studentId);
 
 }

+ 5 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java

@@ -1,13 +1,14 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
-import java.util.Date;
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 
+import java.util.Date;
+import java.util.List;
+
 public interface MarkGroupService {
 
     MarkGroup save(MarkGroup markGroup);
@@ -43,7 +44,7 @@ public interface MarkGroupService {
     boolean updateStatus(int examId, String subjectCode, Integer number, MarkStatus newStatus,
             MarkStatus... currentStatus);
 
-    List<Integer> findExamIdByStatus(MarkStatus... status);
+    List<Integer> findExamIdByStatus(ExamStatus examStatus, MarkStatus... markStatus);
 
     List<MarkGroup> findByExamAndSubjectAndStatus(Integer examId, String subjectCode, MarkStatus... status);
 

+ 66 - 95
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -1,58 +1,11 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Expression;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.RandomUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
-import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
-import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
-import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
@@ -61,6 +14,23 @@ import cn.com.qmth.stmms.biz.utils.PictureConfigTransform;
 import cn.com.qmth.stmms.biz.utils.PictureTag;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.RandomUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.*;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.Map.Entry;
 
 @Service
 public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
@@ -196,7 +166,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             if (student.getSecretNumber() == null) {
                 student.randomSecretNumber();
                 while (secretNumberSet.contains(student.getSecretNumber())
-                        || studentDao.countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber()) > 0) {
+                        || studentDao.countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber())
+                        > 0) {
                     student.randomSecretNumber();
                 }
             }
@@ -425,10 +396,10 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Transactional
     public boolean updateScanInfo(ExamStudent student) {
         student.setUploadTime(new Date());
-        return studentDao.updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(),
-                student.getAnswers(), student.getBatchCode(), student.getPaperType(), student.isAbsent(),
-                student.getUploadTime(), student.getObjectiveScore(), student.getObjectiveScoreList(),
-                student.getCardNumber()) > 0;
+        return studentDao
+                .updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(), student.getAnswers(),
+                        student.getBatchCode(), student.getPaperType(), student.isAbsent(), student.getUploadTime(),
+                        student.getObjectiveScore(), student.getObjectiveScoreList(), student.getCardNumber()) > 0;
     }
 
     @Override
@@ -516,14 +487,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             @Override
             public Predicate toPredicate(Root<ExamStudent> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
                 List<Predicate> predicates = new LinkedList<Predicate>();
-                Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),
-                        root.get("subjectiveScore").as(Double.class));
+                Expression<Double> evaluationItemSum = cb
+                        .sum(root.get("objectiveScore").as(Double.class), root.get("subjectiveScore").as(Double.class));
                 if (query.getStartScore() != null) {
                     Predicate predicate1 = cb.ge(evaluationItemSum, query.getStartScore());
                     Predicate predicate2 = cb.le(evaluationItemSum, query.getEndScore());
                     if (query.getStartScore() == 0) {
-                        Predicate predicate = cb.or(cb.equal(root.get("absent"), true),
-                                cb.equal(root.get("breach"), true));
+                        Predicate predicate = cb
+                                .or(cb.equal(root.get("absent"), true), cb.equal(root.get("breach"), true));
                         Predicate predicate3 = cb.and(predicate1, predicate2);
                         predicates.add(cb.or(predicate, predicate3));
                     } else {
@@ -734,8 +705,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (query.getSheetCount() != null) {
                     predicates.add(cb.equal(root.get("sheetCount"), query.getSheetCount()));
                 }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         };
     }
@@ -754,8 +726,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
             String studentCode, String examSeqCode) {
-        return studentDao.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode,
-                examSeqCode);
+        return studentDao
+                .findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode, examSeqCode);
     }
 
     @Override
@@ -789,15 +761,11 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     }
 
     @Override
-    public ExamStudent findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Date minUploadTime) {
+    public List<ExamStudent> findUnLibraryStudent(int examId, String subjectCode, int groupNumber, int count) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setPageNumber(1);
-        query.setPageSize(1);
-        query.setSort(new Sort(Direction.ASC, "uploadTime", "id"));
-        List<ExamStudent> list = minUploadTime != null ? studentDao.findUnLibraryStudent(examId, subjectCode,
-                groupNumber, minUploadTime, query) : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber,
-                query);
-        return list.isEmpty() ? null : list.get(0);
+        query.setPageSize(count);
+        return studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, query);
     }
 
     @Override
@@ -806,8 +774,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setPageNumber(1);
         query.setPageSize(1);
         query.setSort(new Sort(Direction.ASC, "uploadTime", "id"));
-        List<ExamStudent> list = studentDao.findUnTrialStudent(examId, subjectCode, groupNumber,
-                SubjectiveStatus.TRIAL, query);
+        List<ExamStudent> list = studentDao
+                .findUnTrialStudent(examId, subjectCode, groupNumber, SubjectiveStatus.TRIAL, query);
         return list.isEmpty() ? null : list.get(0);
     }
 
@@ -833,7 +801,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return countByQuery(query);
     }
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach) {
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
+            boolean breach) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
@@ -886,8 +855,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             sliceConfig = exam.getSliceConfigList();
         }
         if (!sliceConfig.isEmpty()) {
-            List<PictureTag> tags = PictureConfigTransform.process(sliceConfig,
-                    getSliceTags(student, withGroupScore, sliceConfig)).get(index);
+            List<PictureTag> tags = PictureConfigTransform
+                    .process(sliceConfig, getSliceTags(student, withGroupScore, sliceConfig)).get(index);
             if (tags != null) {
                 list.addAll(tags);
             }
@@ -937,8 +906,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student, boolean withGroupScore,
             List<PictureConfigItem> sliceConfig) {
         Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
-                student.getSubjectCode(), false);
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), false);
         List<ScoreItem> scoreList = student.getScoreList(false);
         List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
         for (MarkGroup group : markGroups) {
@@ -960,13 +929,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         List<String> lines = new LinkedList<>();
         lines.add("成绩明细");
         // 总分得分明细
-        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "="
-                + format.format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+"
-                + format.format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
+        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "=" + format
+                .format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+" + format
+                .format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
         // 客观题得分明细
         List<String> objectives = new LinkedList<>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(
-                student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
+                        student.getPaperType());
         List<ScoreItem> scoreList = student.getScoreList(true);
         List<String> details = new ArrayList<>();
         int i = 0;
@@ -1049,9 +1019,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (config.getX() <= 1 && config.getY() <= 1 && config.getI() <= sliceConfig.size()
                         && sliceConfig.get(config.getI() - 1).getW() > 0
                         && sliceConfig.get(config.getI() - 1).getH() > 0) {
-                    tag = new OriginTag(0, group.getNumber(), format.format(score), config.getI(), config.getX()
-                            * sliceConfig.get(config.getI() - 1).getW(), config.getY()
-                            * sliceConfig.get(config.getI() - 1).getH());
+                    tag = new OriginTag(0, group.getNumber(), format.format(score), config.getI(),
+                            config.getX() * sliceConfig.get(config.getI() - 1).getW(),
+                            config.getY() * sliceConfig.get(config.getI() - 1).getH());
                 }
                 originTags.add(tag);
             }
@@ -1093,16 +1063,16 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 List<MarkTrack> tracks = trackService.findByLibraryId(library.getId());
                 for (MarkTrack markTrack : tracks) {
                     // 未作答时只显示汉字"空"
-                    originTags.add(new OriginTag(library.getMarkerId(), library.getGroupNumber(), markTrack
-                            .isUnanswered() ? "空" : format.format(markTrack.getScore()), markTrack.getOffsetIndex(),
-                            markTrack.getOffsetX(), markTrack.getOffsetY()));
+                    originTags.add(new OriginTag(library.getMarkerId(), library.getGroupNumber(),
+                            markTrack.isUnanswered() ? "空" : format.format(markTrack.getScore()),
+                            markTrack.getOffsetIndex(), markTrack.getOffsetX(), markTrack.getOffsetY()));
                 }
                 // 添加特殊标记
                 List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(library.getId());
                 for (MarkSpecialTag markSpecialTag : specialTags) {
-                    originTags.add(new OriginTag(library.getMarkerId(), library.getGroupNumber(), markSpecialTag
-                            .getTagName(), markSpecialTag.getOffsetIndex(), markSpecialTag.getOffsetX(), markSpecialTag
-                            .getOffsetY()));
+                    originTags.add(new OriginTag(library.getMarkerId(), library.getGroupNumber(),
+                            markSpecialTag.getTagName(), markSpecialTag.getOffsetIndex(), markSpecialTag.getOffsetX(),
+                            markSpecialTag.getOffsetY()));
                 }
             }
 
@@ -1151,7 +1121,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     }
 
     @Override
-    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode, String subjectCode) {
+    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode,
+            String subjectCode) {
         return studentDao.findByExamIdAndStudentCodeAndSubjectCode(examId, studentCode, subjectCode);
     }
 
@@ -1303,9 +1274,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public int batchUpdate(List<ExamStudent> updateList) {
         int i = 0;
         for (ExamStudent student : updateList) {
-            i = i
-                    + this.studentDao.updateInfo(student.getId(), student.getCollege(), student.getClassName(),
-                            student.getTeacher(), student.getExamRoom(), student.getExamSite(), student.getRemark());
+            i = i + this.studentDao
+                    .updateInfo(student.getId(), student.getCollege(), student.getClassName(), student.getTeacher(),
+                            student.getExamRoom(), student.getExamSite(), student.getRemark());
         }
         return i;
     }

+ 13 - 16
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java

@@ -1,21 +1,21 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
 
 @Service("markGroupService")
 public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements MarkGroupService {
@@ -38,12 +38,9 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
     @Transactional
     @Override
     public void updatePicList(int examId, String subjectCode, int number, List<MarkConfigItem> configList) {
-        groupDao.updatePicList(
-                examId,
-                subjectCode,
-                number,
-                configList != null && configList.size() > 0 ? StringUtils.join(configList,
-                        MarkConfigItem.DB_ITEM_JOINER) : "");
+        groupDao.updatePicList(examId, subjectCode, number, configList != null && configList.size() > 0 ?
+                StringUtils.join(configList, MarkConfigItem.DB_ITEM_JOINER) :
+                "");
     }
 
     @Transactional
@@ -129,8 +126,8 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
     }
 
     @Override
-    public List<Integer> findExamIdByStatus(MarkStatus... status) {
-        return groupDao.findExamIdByStatus(status);
+    public List<Integer> findExamIdByStatus(ExamStatus examStatus, MarkStatus... markStatus) {
+        return groupDao.findExamIdByStatus(examStatus, markStatus);
     }
 
     @Override

+ 155 - 116
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java

@@ -1,40 +1,27 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
 import cn.com.qmth.stmms.biz.config.service.SystemConfigService;
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
-import cn.com.qmth.stmms.common.enums.ConfigType;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import cn.com.qmth.stmms.common.enums.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
 
 /**
  * 与评卷相关的所有定时任务
@@ -55,6 +42,9 @@ public class MarkCronService {
     @Autowired
     private MarkGroupService groupService;
 
+    @Autowired
+    private MarkLibraryService libraryService;
+
     @Autowired
     private MarkService markService;
 
@@ -111,12 +101,9 @@ public class MarkCronService {
     public void buildLibrary() {
         log.info("start auto-create library");
         try {
-            List<Integer> examIds = groupService.findExamIdByStatus(MarkStatus.TRIAL, MarkStatus.FORMAL);
+            List<Integer> examIds = groupService
+                    .findExamIdByStatus(ExamStatus.START, MarkStatus.TRIAL, MarkStatus.FORMAL);
             for (Integer examId : examIds) {
-                Exam exam = examService.findById(examId);
-                if (ExamStatus.FINISH.equals(exam.getStatus())) {
-                    continue;
-                }
                 buildLibraryByExam(examId);
             }
         } catch (Exception e) {
@@ -133,7 +120,7 @@ public class MarkCronService {
     public void updateMarkerQuality() {
         log.info("start auto-update marker");
         try {
-            List<Integer> examIds = groupService.findExamIdByStatus(MarkStatus.FORMAL);
+            List<Integer> examIds = groupService.findExamIdByStatus(ExamStatus.START, MarkStatus.FORMAL);
             for (Integer examId : examIds) {
                 updateMarkerQualityByExam(examId);
             }
@@ -148,11 +135,11 @@ public class MarkCronService {
         // 获取主观题总分大于0的科目
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         for (ExamSubject subject : subjects) {
-            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subject.getCode(),
-                    MarkStatus.FORMAL);
+            List<MarkGroup> groups = groupService
+                    .findByExamAndSubjectAndStatus(examId, subject.getCode(), MarkStatus.FORMAL);
             for (MarkGroup markGroup : groups) {
-                List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(),
-                        markGroup.getNumber());
+                List<Marker> markers = markerService
+                        .findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber());
                 for (Marker marker : markers) {
                     try {
                         if (markService.needUpdateQuality(marker, markerActiveExpireMinute)) {
@@ -171,100 +158,153 @@ public class MarkCronService {
         // 获取主观题总分大于0的科目
         List<ExamSubject> subjects = subjectService.listSubjectiveScore(examId, 0d);
         for (ExamSubject subject : subjects) {
-            // 清除缺考考生和违纪考生
-            List<ExamStudent> list = studentService.findAbsentOrBreachLibraryStudent(subject.getExamId(),
-                    subject.getCode());
-            if (list != null) {
-                for (ExamStudent student : list) {
-                    try {
-                        lockService.waitlock(LockType.STUDENT, student.getId());
-                        markService.deleteByStudent(student);
-                    } catch (Exception e) {
-                        log.error("delete student library error", e);
-                    } finally {
-                        lockService.unlock(LockType.STUDENT, student.getId());
+            try {
+                lockService.watch(LockType.EXAM_SUBJECT, subject.getExamId(), subject.getCode());
+                log.info("start create library for examId=" + subject.getExamId() + ", subjectCode=" + subject
+                        .getCode());
+                // 清除缺考考生和违纪考生
+                List<ExamStudent> list = studentService
+                        .findAbsentOrBreachLibraryStudent(subject.getExamId(), subject.getCode());
+                if (list != null) {
+                    for (ExamStudent student : list) {
+                        try {
+                            lockService.waitlock(LockType.STUDENT, student.getId());
+                            log.info("delete library for studentId=" + student.getId());
+                            markService.deleteByStudent(student);
+                        } catch (Exception e) {
+                            log.error("delete student library error", e);
+                        } finally {
+                            lockService.unlock(LockType.STUDENT, student.getId());
+                        }
                     }
                 }
-            }
-            // 处理正常考生
-            // 生成试评任务
-            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
-                    MarkStatus.TRIAL);
-            long trialCount = studentService.countByExamIdAndSubjectCodeAndStatus(examId, subject.getCode(),
-                    SubjectiveStatus.TRIAL, SubjectiveStatus.MARKED);
-            if (!groups.isEmpty() && trialCount < subject.getTrialCount()) {
-                while (trialCount < subject.getTrialCount()) {
-                    // 取一个的考生
-                    ExamStudent student = studentService.randomStudent(examId, subject.getCode());
-                    if (student == null) {
-                        break;
+                // 处理正常考生
+                // 生成试评任务
+                List<MarkGroup> groups = groupService
+                        .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.TRIAL);
+                long trialCount = studentService
+                        .countByExamIdAndSubjectCodeAndStatus(examId, subject.getCode(), SubjectiveStatus.TRIAL,
+                                SubjectiveStatus.MARKED);
+                if (!groups.isEmpty() && trialCount < subject.getTrialCount()) {
+                    while (trialCount < subject.getTrialCount()) {
+                        // 取一个的考生
+                        ExamStudent student = studentService.randomStudent(examId, subject.getCode());
+                        if (student == null) {
+                            break;
+                        }
+                        studentService
+                                .updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.TRIAL,
+                                        null, null);
+                        trialCount++;
                     }
-                    studentService.updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.TRIAL,
-                            null, null);
-                    trialCount++;
                 }
-            }
-            for (MarkGroup group : groups) {
-                buildTrialLibrary(trialCount, group);
-            }
-            // 生成正评任务
-            // 试评状态的分组也提前生成
-            groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
-                    MarkStatus.FORMAL, MarkStatus.TRIAL);
-            for (MarkGroup group : groups) {
-                buildFormalLibrary(subject, group);
+                for (MarkGroup group : groups) {
+                    buildTrialLibrary(trialCount, group);
+                }
+                // 生成正评任务
+                // 试评状态的分组也提前生成
+                groups = groupService
+                        .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.FORMAL,
+                                MarkStatus.TRIAL);
+                for (MarkGroup group : groups) {
+                    buildFormalLibrary(group);
+                }
+            } finally {
+                lockService.unwatch(LockType.EXAM_SUBJECT, subject.getExamId(), subject.getCode());
             }
         }
     }
 
-    private void buildFormalLibrary(ExamSubject subject, MarkGroup group) {
-        Date lastBuildTime = group.getBuildTime();
-        int count = 0;
-        ExamStudent student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(),
-                group.getNumber(), lastBuildTime);
-        while (student != null) {
-            // 尝试构造评卷任务
-            try {
-                lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
-                lockService.watch(LockType.STUDENT, student.getId());
-                // 上锁后重复验证分组状态
-                if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                        MarkStatus.FORMAL, MarkStatus.TRIAL)) {
-                    break;
+    private void buildFormalLibrary(MarkGroup group) {
+        int pageSize = 100;
+        try {
+            log.info("start create library for examId=" + group.getExamId() + ", subjectCode=" + group.getSubjectCode()
+                    + ", groupNumber=" + group.getNumber());
+            lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
+            // 上锁后重复验证分组状态
+            if (!groupService
+                    .validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), MarkStatus.FORMAL,
+                            MarkStatus.TRIAL)) {
+                return;
+            }
+            int count = 0;
+            List<ExamStudent> studentList = studentService
+                    .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), pageSize);
+            while (!studentList.isEmpty()) {
+                List<MarkLibrary> libraryList = new ArrayList<>();
+                int doubleCount = 0;
+                int studentCount = studentList.size();
+                for (ExamStudent student : studentList) {
+                    MarkLibrary library = new MarkLibrary();
+                    library.setExamId(student.getExamId());
+                    library.setSubjectCode(student.getSubjectCode());
+                    library.setGroupNumber(group.getNumber());
+                    library.setStudentId(student.getId());
+                    library.setExamNumber(student.getExamNumber());
+                    library.setSecretNumber(student.getSecretNumber());
+                    library.setTaskNumber(1);
+                    library.setStatus(LibraryStatus.WAITING);
+                    libraryList.add(library);
+                    // 开启双评时需要判断是否生成第二份评卷任务
+                    if (group.getDoubleRate() != null && group.getDoubleRate() > 0) {
+                        boolean needDouble = false;
+                        if (group.getDoubleRate() == 1) {
+                            needDouble = true;
+                        } else {
+                            double libraryCount = libraryList.size();
+                            int expectCount = (int) (studentCount * group.getDoubleRate());
+                            // 随机数判断加入当前已经生成双评任务的比例加权
+                            // 实际双评任务数小于理论生成数 &&(剩余未生成双评的考生数量小于剩余应生成的数量||随机比例)
+                            needDouble = doubleCount < expectCount && (
+                                    (studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount)
+                                            || Math.random() < group.getDoubleRate() + 0.1);
+                        }
+                        if (needDouble) {
+                            library = new MarkLibrary();
+                            library.setExamId(student.getExamId());
+                            library.setSubjectCode(student.getSubjectCode());
+                            library.setGroupNumber(group.getNumber());
+                            library.setStudentId(student.getId());
+                            library.setExamNumber(student.getExamNumber());
+                            library.setSecretNumber(student.getSecretNumber());
+                            library.setTaskNumber(2);
+                            library.setStatus(LibraryStatus.WAITING);
+                            libraryList.add(library);
+                            doubleCount++;
+                        }
+                    }
                 }
-                // 上锁后重复验证考生状态
-                if (studentService.validateStatus(student.getId())) {
-                    markService.buildFormalLibrary(student, group, subject);
-                    lastBuildTime = student.getUploadTime();
-                    count++;
+                // 有新任务创建
+                if (!libraryList.isEmpty()) {
+                    count += libraryList.size();
+                    //任务乱序
+                    Collections.shuffle(libraryList);
+                    //批量保存
+                    libraryService.save(libraryList);
+                    //正评状态才需要更新任务数量
+                    if (group.getStatus() == MarkStatus.FORMAL) {
+                        markService.updateLibraryCount(group);
+                        markService.updateMarkedCount(group);
+                    }
                 }
-            } catch (Exception e) {
-                log.error(
-                        "build formal library error for studentId=" + student.getId() + ", groupNumber="
-                                + group.getNumber(), e);
-            } finally {
-                lockService.unwatch(LockType.STUDENT, student.getId());
-                lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
-            }
-            // 取下一个考生
-            student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    lastBuildTime);
-        }
-        // 有新任务创建,同时正评状态,此时才需要更新任务数量
-        if (count > 0) {
-            group = groupService.findOne(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            if (group.getStatus() == MarkStatus.FORMAL) {
-                markService.updateLibraryCount(group);
-                markService.updateMarkedCount(group);
+                studentList = studentService
+                        .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), pageSize);
             }
+            log.info("finish create " + count + " library for examId=" + group.getExamId() + ", subjectCode=" + group
+                    .getSubjectCode() + ", groupNumber=" + group.getNumber());
+        } catch (Exception e) {
+            log.error("build formal library error for examId=" + group.getExamId() + ", subjectCode=" + group
+                    .getSubjectCode() + ", groupNumber=" + group.getNumber(), e);
+        } finally {
+            lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
         }
     }
 
     private void buildTrialLibrary(long trialCount, MarkGroup group) {
         while (trialCount > group.getLibraryCount()) {
             // 取一个未生成试评任务的考生
-            ExamStudent student = studentService.randomUnTrialStudent(group.getExamId(), group.getSubjectCode(),
-                    group.getNumber());
+            ExamStudent student = studentService
+                    .randomUnTrialStudent(group.getExamId(), group.getSubjectCode(), group.getNumber());
             if (student == null) {
                 return;
             }
@@ -284,9 +324,8 @@ public class MarkCronService {
                     markService.updateMarkedCount(group);
                 }
             } catch (Exception e) {
-                log.error(
-                        "build trial library error for studentId=" + student.getId() + ", groupNumber="
-                                + group.getNumber(), e);
+                log.error("build trial library error for studentId=" + student.getId() + ", groupNumber=" + group
+                        .getNumber(), e);
             } finally {
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -303,7 +342,7 @@ public class MarkCronService {
         log.info("start auto-update report");
         try {
             Map<Integer, Set<String>> map = new HashMap<Integer, Set<String>>();
-            List<Integer> examIds = groupService.findExamIdByStatus(MarkStatus.FORMAL);
+            List<Integer> examIds = groupService.findExamIdByStatus(ExamStatus.START, MarkStatus.FORMAL);
             for (Integer examId : examIds) {
                 List<ExamSubject> list = subjectService.list(examId);
                 Set<String> set = new HashSet<>();

+ 24 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java

@@ -8,18 +8,17 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
-
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
-
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
@@ -54,9 +53,10 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         query.setPageNumber(pageNumber);
         query.setPageSize(pageSize);
 
-        return filterClass ? libraryDao.findUnMarkedFilterClass(examId, subjectCode, groupNumber, markerId, userId,
-                statusSet, query) : libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet,
-                query);
+        return filterClass ?
+                libraryDao
+                        .findUnMarkedFilterClass(examId, subjectCode, groupNumber, markerId, userId, statusSet, query) :
+                libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet, query);
     }
 
     @Override
@@ -152,12 +152,12 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                     predicates.add(cb.or(predicate1, predicate2));
                 }
                 if (StringUtils.isNotBlank(query.getQuestionScore())) {
-                    Predicate predicate1 = cb.like(root.get("markerScoreList").as(String.class),
-                            query.getQuestionScore() + ",%");
-                    Predicate predicate2 = cb.like(root.get("markerScoreList").as(String.class),
-                            "%," + query.getQuestionScore());
-                    Predicate predicate3 = cb.like(root.get("markerScoreList").as(String.class),
-                            "%," + query.getQuestionScore() + ",%");
+                    Predicate predicate1 = cb
+                            .like(root.get("markerScoreList").as(String.class), query.getQuestionScore() + ",%");
+                    Predicate predicate2 = cb
+                            .like(root.get("markerScoreList").as(String.class), "%," + query.getQuestionScore());
+                    Predicate predicate3 = cb
+                            .like(root.get("markerScoreList").as(String.class), "%," + query.getQuestionScore() + ",%");
                     Predicate predicate4 = cb.equal(root.get("markerScoreList"), query.getQuestionScore());
                     predicates.add(cb.or(predicate1, predicate2, predicate3, predicate4));
                 }
@@ -177,8 +177,9 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                         predicates.add(cb.or(sub));
                     }
                 }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         };
     }
@@ -200,10 +201,17 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
     }
 
     @Override
+    @Transactional
     public MarkLibrary save(MarkLibrary library) {
         return libraryDao.save(library);
     }
 
+    @Override
+    @Transactional
+    public void save(List<MarkLibrary> libraryList) {
+        libraryDao.save(libraryList);
+    }
+
     @Override
     public void releaseByLibrary(MarkLibrary library) {
         TaskLock taskLock = TaskLockUtil.getInspectedLibraryTask(getGroupKey(library));
@@ -314,8 +322,9 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                     Predicate predicate2 = cb.le(root.get("markerScore"), query.getEndScore());
                     predicates.add(predicate2);
                 }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         };
     }

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

@@ -1,17 +1,18 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-
+import cn.com.qmth.stmms.biz.exam.dao.*;
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.dao.*;
+import cn.com.qmth.stmms.biz.mark.model.*;
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.biz.utils.TaskLock;
+import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
+import cn.com.qmth.stmms.common.enums.*;
+import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,61 +21,11 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
-import cn.com.qmth.stmms.biz.exam.dao.MarkGroupStudentDao;
-import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
-import cn.com.qmth.stmms.biz.exam.dao.SelectiveStudentDao;
-import cn.com.qmth.stmms.biz.exam.dao.SubjectiveScoreDao;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroupStudent;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
-import cn.com.qmth.stmms.biz.exam.model.SelectiveStudent;
-import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
-import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.dao.ArbitrateHistoryDao;
-import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
-import cn.com.qmth.stmms.biz.mark.dao.MarkSpecialTagDao;
-import cn.com.qmth.stmms.biz.mark.dao.MarkTrackDao;
-import cn.com.qmth.stmms.biz.mark.dao.ProblemHistoryDao;
-import cn.com.qmth.stmms.biz.mark.dao.RejectHistoryDao;
-import cn.com.qmth.stmms.biz.mark.dao.TrialLibraryDao;
-import cn.com.qmth.stmms.biz.mark.dao.TrialTagDao;
-import cn.com.qmth.stmms.biz.mark.dao.TrialTrackDao;
-import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.model.MarkResult;
-import cn.com.qmth.stmms.biz.mark.model.MarkStepDTO;
-import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
-import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
-import cn.com.qmth.stmms.biz.mark.model.RejectHistory;
-import cn.com.qmth.stmms.biz.mark.model.SubmitResult;
-import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
-import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.utils.ScoreItem;
-import cn.com.qmth.stmms.biz.utils.TaskLock;
-import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
-import cn.com.qmth.stmms.common.enums.HistoryStatus;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
-import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * 与评卷相关的所有修改操作(非传播性的新增操作除外),全部汇总到这里进行集中控制
@@ -162,8 +113,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷分组已申请的评卷任务数量
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      * @return int
      */
     @Override
@@ -179,8 +129,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已申请的评卷任务数量
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      * @return int
      */
     @Override
@@ -210,8 +159,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已完成的评卷任务数量
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      * @return long
      */
     @Override
@@ -224,8 +172,8 @@ public class MarkServiceImpl implements MarkService {
             if (group.getStatus() == MarkStatus.TRIAL) {
                 return trialLibraryDao.countByMarkerId(marker.getId());
             } 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;
@@ -234,8 +182,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷分组的锁定任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     public void releaseByGroup(MarkGroup group) {
@@ -246,8 +193,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷分组的所有评卷任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -258,8 +204,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 删除某个评卷分组
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -286,8 +231,9 @@ public class MarkServiceImpl implements MarkService {
         markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                 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(),
                 group.getNumber());
@@ -298,8 +244,9 @@ public class MarkServiceImpl implements MarkService {
         releaseByGroup(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());
         if (groupCount == 0 || unGroupQuestionCount > 0) {
@@ -309,8 +256,9 @@ public class MarkServiceImpl implements MarkService {
             // group.getSubjectCode());
             inspectHistoryService.deleteByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
         } else {
-            List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(
-                    group.getExamId(), group.getSubjectCode(), SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED);
+            List<Integer> studentList = studentService
+                    .findIdByExamIdAndSubjectCodeAndSubjectiveStatus(group.getExamId(), group.getSubjectCode(),
+                            SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED);
             for (Integer studentId : studentList) {
                 checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
             }
@@ -320,15 +268,15 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 修改某个评卷分组给分步骤,并重置评卷任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
     public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third,
             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) {
             question.setGroupNumber(null);
             questionService.saveAndFlush(question);
@@ -361,10 +309,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个正式评卷任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      */
     @Override
     public boolean applyLibrary(MarkLibrary library, Marker marker) {
@@ -387,10 +333,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个试评评卷任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -402,10 +346,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个正式评卷任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -417,10 +359,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个试评评卷任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -432,10 +372,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已完成的评卷任务
      *
-     * @param result
-     *            - 评卷结果
-     * @param marker
-     *            - 评卷员
+     * @param result - 评卷结果
+     * @param marker - 评卷员
      */
     @Override
     public void releaseTask(SubmitResult result, Marker marker) {
@@ -453,8 +391,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员的所有锁定任务
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     public void releaseByMarker(Marker marker) {
@@ -467,8 +404,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷员
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     @Transactional
@@ -512,8 +448,8 @@ public class MarkServiceImpl implements MarkService {
             for (MarkLibrary library : list) {
                 trackDao.deleteByLibraryId(library.getId());
                 specialTagDao.deleteByLibraryId(library.getId());
-                libraryDao.resetById(library.getId(), null, null, null, null, LibraryStatus.WAITING,
-                        library.getStatus());
+                libraryDao
+                        .resetById(library.getId(), null, null, null, null, LibraryStatus.WAITING, library.getStatus());
                 lockService.waitlock(LockType.STUDENT, library.getStudentId());
                 updateStudentGroupStatus(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
                         library.getGroupNumber(), SubjectiveStatus.UNMARK);
@@ -533,8 +469,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生删除评卷任务
      *
-     * @param student
-     *            - 考生
+     * @param student - 考生
      */
     @Override
     @Transactional
@@ -563,10 +498,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员提交评卷任务
      *
-     * @param result
-     *            - 评卷结果
-     * @param marker
-     *            - 评卷员
+     * @param result - 评卷结果
+     * @param marker - 评卷员
      * @return boolean
      */
     @Override
@@ -574,8 +507,8 @@ public class MarkServiceImpl implements MarkService {
     public SubmitResult submitTask(MarkResult result, Marker marker) {
         // 判断评卷分组是否存在/评卷是否结束
         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();
         }
 
@@ -583,9 +516,8 @@ public class MarkServiceImpl implements MarkService {
         // 根据评卷状态选择读取不同的评卷任务
         if (group.getStatus() == MarkStatus.FORMAL) {
             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()) {
                     // 状态更新
@@ -611,12 +543,11 @@ public class MarkServiceImpl implements MarkService {
             }
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             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()) {
-                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();
                 }
                 library.setMarkerId(marker.getId());
@@ -669,14 +600,10 @@ 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) {
         // 非本人领取的待评任务
@@ -685,13 +612,13 @@ public class MarkServiceImpl implements MarkService {
             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;
         }
         // 是否多评情况下已处理过该考生评卷任务
-        if (libraryDao
-                .countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), marker.getId(), library.getId()) > 0) {
+        if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), marker.getId(), library.getId())
+                > 0) {
             return false;
         }
         // 未选做
@@ -703,9 +630,10 @@ public class MarkServiceImpl implements MarkService {
         }
         // 尝试提交评卷结果
         Date now = new Date();
-        if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(),
-                result.getMarkerScore(), result.getScoreList(), now, result.getSpent(), null, null, null,
-                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(), null, null, null, LibraryStatus.WAITING,
+                        LibraryStatus.MARKED, LibraryStatus.INSPECTED, LibraryStatus.REJECTED) == 0) {
             // 条件不符更新失败,直接返回
             return false;
         }
@@ -731,8 +659,9 @@ public class MarkServiceImpl implements MarkService {
         ArbitrateHistory history = null;
         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) {
                 // 本评卷任务或组长已打分,则跳过该任务
                 if (other.getId().equals(library.getId()) || other.getHeaderScore() != null) {
@@ -743,8 +672,9 @@ public class MarkServiceImpl implements MarkService {
                     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);
                     break;
                 }
@@ -752,12 +682,13 @@ public class MarkServiceImpl implements MarkService {
                 if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
                     // 开启三评
                     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);
                         } 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);
                         }
                     } else {
@@ -838,8 +769,7 @@ public class MarkServiceImpl implements MarkService {
      * 管理员/组长打回某个评卷任务<br>
      * isRest为true时重置该评卷任务
      *
-     * @param library
-     *            - 正评任务
+     * @param library - 正评任务
      */
     @Override
     @Transactional
@@ -852,8 +782,9 @@ public class MarkServiceImpl implements MarkService {
         history.setUserId(userId);
         history.setReason(reason);
         Date now = new Date();
-        if (libraryDao.resetById(library.getId(), null, reason, userId, now, isRest ? LibraryStatus.WAITING
-                : LibraryStatus.REJECTED, LibraryStatus.MARKED, LibraryStatus.PROBLEM, LibraryStatus.INSPECTED) > 0) {
+        if (libraryDao.resetById(library.getId(), null, reason, userId, now,
+                isRest ? LibraryStatus.WAITING : LibraryStatus.REJECTED, LibraryStatus.MARKED, LibraryStatus.PROBLEM,
+                LibraryStatus.INSPECTED) > 0) {
             if (!isRest) {
                 markerService.updateRejectCountById(library.getMarkerId());
                 rejectHistoryDao.save(history);
@@ -867,8 +798,9 @@ public class MarkServiceImpl implements MarkService {
             // 开启三评时,打回1,2任务则删除第3条任务
             long count = libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
             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());
                 specialTagDao.deleteByLibraryId(third.getId());
                 problemHistoryDao.deleteByLibraryId(third.getId());
@@ -885,8 +817,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长重置某个试评任务
      *
-     * @param library
-     *            - 试评任务
+     * @param library - 试评任务
      */
     @Override
     @Transactional
@@ -904,8 +835,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长处理仲裁卷
      *
-     * @param history
-     *            - 仲裁卷
+     * @param history - 仲裁卷
      */
     @Override
     @Transactional
@@ -997,8 +927,8 @@ public class MarkServiceImpl implements MarkService {
         boolean lessSelective = false;
         boolean mutiSelective = false;
         ExamStudent student = studentService.findById(studentId);
-        Map<Integer, List<SelectiveGroup>> indexMap = selectiveGroupService.findGroupByExamIdAndSubjectCode(
-                student.getExamId(), student.getSubjectCode());
+        Map<Integer, List<SelectiveGroup>> indexMap = selectiveGroupService
+                .findGroupByExamIdAndSubjectCode(student.getExamId(), student.getSubjectCode());
         for (Integer index : indexMap.keySet()) {
             // 循环选做题组
             List<SelectiveGroup> indexGroup = indexMap.get(index);
@@ -1126,8 +1056,9 @@ public class MarkServiceImpl implements MarkService {
                 // 有非完成状态的评卷任务,直接返回
                 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) {
                 selectiveAll = true;
             }
@@ -1147,12 +1078,12 @@ public class MarkServiceImpl implements MarkService {
                 }
                 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)) {
                 list.remove(0);
             } else {
@@ -1224,8 +1155,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个评卷分组已评任务数量
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -1233,7 +1163,8 @@ public class MarkServiceImpl implements MarkService {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), (int) libraryDao
                     .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) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
@@ -1243,20 +1174,21 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个评卷分组评卷任务总量
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
     public void updateLibraryCount(MarkGroup group) {
         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(),
                     group.getLibraryCount());
         } 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(),
                     group.getLibraryCount());
         }
@@ -1265,10 +1197,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个科目所有评卷分组评卷任务数量
      *
-     * @param examId
-     *            - 考试ID
-     * @param subjectCode
-     *            - 科目代码
+     * @param examId      - 考试ID
+     * @param subjectCode - 科目代码
      */
     @Transactional
     @Override
@@ -1280,76 +1210,11 @@ public class MarkServiceImpl implements MarkService {
         }
     }
 
-    /**
-     * 根据考生、学习中心、评卷分组构造正式评卷任务
-     *
-     * @param student
-     *            - 考生
-     * @param group
-     *            - 评卷分组
-     * @param subject
-     *            - 科目
-     */
-    @Override
-    @Transactional
-    public void buildFormalLibrary(ExamStudent student, MarkGroup group, ExamSubject subject) {
-        // 查询是否已创建评卷任务
-        if (libraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
-            MarkLibrary library = new MarkLibrary();
-            library.setExamId(student.getExamId());
-            library.setSubjectCode(student.getSubjectCode());
-            library.setGroupNumber(group.getNumber());
-            library.setStudentId(student.getId());
-            library.setExamNumber(student.getExamNumber());
-            library.setSecretNumber(student.getSecretNumber());
-            library.setTaskNumber(1);
-            library.setStatus(LibraryStatus.WAITING);
-            libraryDao.save(library);
-            group.setLibraryCount(group.getLibraryCount() + 1);
-            // 开启双评时需要判断是否生成第二份评卷任务
-            if (group.getDoubleRate() != null && group.getDoubleRate() > 0) {
-                boolean needDouble = false;
-                if (group.getDoubleRate() == 1) {
-                    needDouble = true;
-                } else {
-                    double studentCount = subject.getUploadCount();
-                    double libraryCount = group.getLibraryCount();
-                    double doubleCount = libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(
-                            group.getExamId(), group.getSubjectCode(), group.getNumber(), 2);
-                    int expectCount = (int) (studentCount * group.getDoubleRate());
-                    // 随机数判断加入当前已经生成双评任务的比例加权
-                    // 实际双评任务数小于理论生成数 &&(剩余未生成双评的考生数量小于剩余应生成的数量||随机比例)
-                    needDouble = doubleCount < expectCount
-                            && ((studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount) || Math
-                                    .random() < group.getDoubleRate() + 0.1);
-                }
-                if (needDouble) {
-                    library = new MarkLibrary();
-                    library.setExamId(student.getExamId());
-                    library.setSubjectCode(student.getSubjectCode());
-                    library.setGroupNumber(group.getNumber());
-                    library.setStudentId(student.getId());
-                    library.setExamNumber(student.getExamNumber());
-                    library.setSecretNumber(student.getSecretNumber());
-                    library.setTaskNumber(2);
-                    library.setStatus(LibraryStatus.WAITING);
-                    libraryDao.save(library);
-                    group.setLibraryCount(group.getLibraryCount() + 1);
-
-                }
-            }
-        }
-        group.setBuildTime(student.getUploadTime());
-        groupDao.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(), student.getUploadTime());
-    }
-
     /**
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      *
-     * @param student
-     *            - 考生
-     * @param group
-     *            - 评卷分组
+     * @param student - 考生
+     * @param group   - 评卷分组
      */
     @Override
     @Transactional
@@ -1378,8 +1243,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置评卷分组的连带操作
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     private void resetGroup(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
@@ -1392,8 +1256,9 @@ public class MarkServiceImpl implements MarkService {
                     group.getNumber());
             libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                     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(),
                     group.getNumber());
             resetStudentGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -1410,8 +1275,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 计算并更新指定评卷员的评卷质量指标
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     @Transactional
@@ -1430,8 +1294,9 @@ public class MarkServiceImpl implements MarkService {
             if (library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED) {
                 validCount++;
             }
-            double score = library.getMarkerScore() != null && library.getMarkerScore() != UN_SELECTIVE_SCORE ? library
-                    .getMarkerScore() : 0;
+            double score = library.getMarkerScore() != null && library.getMarkerScore() != UN_SELECTIVE_SCORE ?
+                    library.getMarkerScore() :
+                    0;
             int spent = library.getMarkerSpent() != null ? library.getMarkerSpent() : 0;
 
             sumScore += score;
@@ -1498,8 +1363,9 @@ public class MarkServiceImpl implements MarkService {
         updateStudentGroupScore(library.getStudentId(), group.getExamId(), group.getSubjectCode(), group,
                 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());
         checkStudentSubjective(library.getStudentId(), groupCount, unGroupQuestionCount);
     }
@@ -1517,8 +1383,9 @@ public class MarkServiceImpl implements MarkService {
             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());
             checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
         } else {
@@ -1555,8 +1422,9 @@ public class MarkServiceImpl implements MarkService {
         scoreDao.deleteByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber);
         rejectHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber);
         selectiveStudentDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
-        studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode, SubjectiveStatus.UNMARK, 0,
-                null, null, null);
+        studentService
+                .updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode, SubjectiveStatus.UNMARK, 0, null,
+                        null, null);
         inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
 
@@ -1574,10 +1442,10 @@ public class MarkServiceImpl implements MarkService {
     private void updateStudentGroupScore(Integer studentId, Integer examId, String subjectCode, MarkGroup group,
             double score, List<ScoreItem> scoreList) {
         // scoreDao.deleteByStudentIdAndGroupNumber(studentId, groupNumber);
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                subjectCode, false, group.getNumber());
-        List<SubjectiveScore> subjectiveScores = scoreService.findByStudentIdAndGroupNumber(studentId,
-                group.getNumber());
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber());
+        List<SubjectiveScore> subjectiveScores = scoreService
+                .findByStudentIdAndGroupNumber(studentId, group.getNumber());
         for (int i = 0; i < questions.size(); i++) {
             ExamQuestion question = questions.get(i);
             SubjectiveScore ss;
@@ -1608,8 +1476,9 @@ public class MarkServiceImpl implements MarkService {
                 ss.setUnansweredCount(0);
             } else {
                 if (MarkStatus.TRIAL.equals(group.getStatus())) {
-                    ss.setUnansweredCount(trialTrackDao.countByStudentIdAndQuestionNumberAndUnanswered(studentId,
-                            question.getQuestionNumber(), true));
+                    ss.setUnansweredCount(trialTrackDao
+                            .countByStudentIdAndQuestionNumberAndUnanswered(studentId, question.getQuestionNumber(),
+                                    true));
                 } else {
                     ss.setUnansweredCount(trackDao.countByStudentIdAndQuestionNumberAndUnanswered(studentId,
                             question.getQuestionNumber(), true));
@@ -1683,8 +1552,9 @@ public class MarkServiceImpl implements MarkService {
         Date now = new Date();
         for (Integer groupNumber : map.keySet()) {
             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);
             MarkGroup group = groupDao.findOne(student.getExamId(), student.getSubjectCode(), groupNumber);
             int count = 0;
@@ -1714,18 +1584,18 @@ public class MarkServiceImpl implements MarkService {
                     count++;
                     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();
                     for (MarkStepDTO markStepDTO : qList) {
-                        trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
-                                + markStepDTO.getSubNumber());
+                        trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
+                                markStepDTO.getMainNumber() + "." + markStepDTO.getSubNumber());
                         scoreDao.updateRejected(library.getStudentId(), markStepDTO.getMainNumber(),
                                 markStepDTO.getSubNumber(), true);
                         for (int i = 0; i < questions.size(); 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.add(i, new ScoreItem(false));
                             }
@@ -1743,9 +1613,10 @@ public class MarkServiceImpl implements MarkService {
                         // markerScoreList.append(",");
                         // }
                     }
-                    if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(),
-                            null, StringUtils.join(markerScoreList, ","), null, null, reason, userId, now,
-                            LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 1) {
+                    if (libraryDao
+                            .updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(), null,
+                                    StringUtils.join(markerScoreList, ","), null, null, reason, userId, now,
+                                    LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 1) {
                         markerService.updateRejectCountById(library.getMarkerId());
                         history.setRejectScoreList(StringUtils.join(markerScoreList, ","));
                         rejectHistoryDao.save(history);
@@ -1756,8 +1627,9 @@ public class MarkServiceImpl implements MarkService {
             if (count > 0) {
                 updateMarkedCount(group);
                 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;
@@ -1770,8 +1642,8 @@ public class MarkServiceImpl implements MarkService {
             return false;
         }
         for (ExamQuestion question : list) {
-            SelectiveGroup selectiveGroup = selectiveGroupService.findOne(question.getExamId(),
-                    question.getSubjectCode(), question.getMainNumber());
+            SelectiveGroup selectiveGroup = selectiveGroupService
+                    .findOne(question.getExamId(), question.getSubjectCode(), question.getMainNumber());
             if (selectiveGroup != null) {
                 continue;
             }
@@ -1782,9 +1654,9 @@ public class MarkServiceImpl implements MarkService {
                 String subjectCode = question.getSubjectCode();
                 boolean objective = question.isObjective();
                 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());
                 if (objective) {
                     examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
@@ -1801,8 +1673,9 @@ public class MarkServiceImpl implements MarkService {
                         // subjectCode);
                         inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
                     } else {
-                        List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(
-                                examId, subjectCode, SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED);
+                        List<Integer> studentList = studentService
+                                .findIdByExamIdAndSubjectCodeAndSubjectiveStatus(examId, subjectCode,
+                                        SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED);
                         for (Integer studentId : studentList) {
                             checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
                         }
@@ -1817,8 +1690,9 @@ public class MarkServiceImpl implements MarkService {
     @Override
     @Transactional
     public boolean rejectLibrary(MarkLibrary library, MarkStepDTO[] questionList, Integer userId, String reason) {
-        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()) {
             return rejectLibrary(library, userId, reason, false);
         }
@@ -1833,14 +1707,14 @@ public class MarkServiceImpl implements MarkService {
         Date now = new Date();
         List<ScoreItem> sList = library.getScoreList();
         for (MarkStepDTO markStepDTO : questionList) {
-            trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
-                    + markStepDTO.getSubNumber());
+            trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
+                    markStepDTO.getMainNumber() + "." + markStepDTO.getSubNumber());
             scoreDao.updateRejected(library.getStudentId(), markStepDTO.getMainNumber(), markStepDTO.getSubNumber(),
                     true);
             for (int i = 0; i < questions.size(); 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.add(i, new ScoreItem(false));
                 }
@@ -1870,8 +1744,9 @@ public class MarkServiceImpl implements MarkService {
             // 开启三评时,打回1,2任务则删除第3条任务
             long count = libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
             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());
                 specialTagDao.deleteByLibraryId(third.getId());
                 problemHistoryDao.deleteByLibraryId(third.getId());

+ 5 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java

@@ -1,12 +1,12 @@
 package cn.com.qmth.stmms.biz.mark.service;
 
-import java.util.List;
-import java.util.Set;
-
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 
+import java.util.List;
+import java.util.Set;
+
 public interface MarkLibraryService {
 
     MarkLibrary findById(int id);
@@ -34,6 +34,8 @@ public interface MarkLibraryService {
 
     List<Double> findScore(int examId, String subjectCode, Integer groupNumber, LibraryStatus... status);
 
+    void save(List<MarkLibrary> libraryList);
+
     MarkLibrary save(MarkLibrary library);
 
     void releaseByLibrary(MarkLibrary library);

+ 7 - 22
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -1,21 +1,15 @@
 package cn.com.qmth.stmms.biz.mark.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.model.MarkResult;
-import cn.com.qmth.stmms.biz.mark.model.MarkStepDTO;
-import cn.com.qmth.stmms.biz.mark.model.SubmitResult;
-import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
+import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
+import java.util.List;
+
 public interface MarkService {
 
     /**
@@ -173,15 +167,6 @@ public interface MarkService {
      */
     int applyCount(Marker marker);
 
-    /**
-     * 根据考生、大题构造正式评卷任务
-     *
-     * @param student
-     * @param group
-     * @param subject
-     */
-    void buildFormalLibrary(ExamStudent student, MarkGroup group, ExamSubject subject);
-
     /**
      * 根据考生、大题构造试评评卷任务
      *
@@ -242,7 +227,7 @@ public interface MarkService {
 
     /**
      * 管理员/组长打回某个学生的指定题目
-     * 
+     *
      * @param student
      * @param questionList
      * @param userId
@@ -253,14 +238,14 @@ public interface MarkService {
 
     /**
      * 删除某个小题
-     * 
+     *
      * @param question
      */
     boolean deleteByQuestion(List<ExamQuestion> question);
 
     /**
      * 管理员/组长打回某个任务的指定题目
-     * 
+     *
      * @param library
      * @param questionList
      * @param userId
@@ -270,7 +255,7 @@ public interface MarkService {
 
     /**
      * 考生判断是否主观题全部评卷完成
-     * 
+     *
      * @param studentId
      * @param groupCount
      * @param unGroupQuestionCount

+ 1 - 1
stmms-web/src/main/webapp/sql/stmms_ft.sql

@@ -336,7 +336,7 @@ CREATE TABLE `eb_exam_student`
     PRIMARY KEY (`id`),
     UNIQUE KEY `index1` (`exam_id`, `exam_number`),
     UNIQUE KEY `index2` (`exam_id`, `secret_number`),
-    KEY `index3` (`exam_id`, `subject_code`, `upload_time`)
+    KEY `index3` (`exam_id`, `subject_code`, `is_upload`, `is_absent`, `is_breach`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='考试考生库';