1
0
Prechádzať zdrojové kódy

修改统分线程逻辑

1.包含所有已上传的考生,不区分是否缺考
2.增加考生只根据examId和upload两个条件的查询接口
3.修改部分统分代码判断写法
luoshi 6 rokov pred
rodič
commit
f9e854d558

+ 24 - 23
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -19,6 +19,8 @@ public interface ExamStudentDao
     public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent,
             Pageable pageable);
 
+    public List<ExamStudent> findByExamIdAndUpload(int examId, boolean upload, Pageable pageable);
+
     public List<ExamStudent> findByExamIdAndCampusName(int examId, String campusName, Pageable pageable);
 
     public List<ExamStudent> findByExamIdAndExamNumber(int examId, String examNumber);
@@ -69,28 +71,26 @@ public interface ExamStudentDao
             String studentCode, String examSeqCode);
 
     @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end),"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end),"
             + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
             + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
-    		+ " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 ")
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
-			String code, Boolean upload, boolean absent);
+            + " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 ")
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String code, Boolean upload, boolean absent);
 
     @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end), "
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end), "
             + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
             + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
-    		+ " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 ")
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
-			String code);
+            + " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 ")
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String code);
 
     @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
             + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
@@ -101,15 +101,16 @@ public interface ExamStudentDao
             + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
             + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
             + " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 and s.breach = ?5")
-    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach);
+    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
+            boolean breach);
+
+    public ExamStudent findByExamIdAndSubjectCodeStartingWithAndStudentCode(Integer examId, String subjectCode,
+            String studentCode);
 
-	public ExamStudent findByExamIdAndSubjectCodeStartingWithAndStudentCode(Integer examId,
-			String subjectCode, String studentCode);
-	
-	@Query(value="select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.login_name = ?1 ))",nativeQuery=true)
+    @Query(value = "select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.login_name = ?1 ))", nativeQuery = true)
     public List<String[]> findIdsByMarkLogin(String markLogin);
-        
-    @Query(value="select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.name = ?1))",nativeQuery=true)
+
+    @Query(value = "select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.name = ?1))", nativeQuery = true)
     public List<String[]> findIdsByMarkName(String markName);
 
 }

+ 18 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -25,6 +25,8 @@ public interface ExamStudentService {
 
     List<ExamStudent> findByExamId(int examId);
 
+    List<ExamStudent> findByExamIdAndUpload(int examId, boolean upload, int pageNumber, int pageSize);
+
     List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent, int pageNumber,
             int pageSize);
 
@@ -50,7 +52,8 @@ public interface ExamStudentService {
 
     long countByExamIdAndSubjectCode(int examId, String subjectCode, 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);
 
@@ -71,23 +74,23 @@ public interface ExamStudentService {
     ExamStudent findByExamIdAndSchoolIdAndSubjectCodeAndStudentCode(Integer examId, Integer schoolId,
             String subjectCode, String studentCode);
 
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
-			String code, Boolean upload,boolean absent);
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String code, Boolean upload, boolean absent);
+
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String code);
+
+    public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String code, String campusName, boolean upload,
+            boolean absent);
+
+    public ExamStudent findBySchoolIdAndSubjectCodeStartingWithAndStudentCode(Integer schoolId, String subjectCode,
+            String studentCode);
 
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
-			String code);
+    public String findIdsByMarkLogin(String markLogin);
 
-	public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String code,
-			String campusName, boolean upload, boolean absent);
+    public String findIdsByMarkName(String markName);
 
-	public ExamStudent findBySchoolIdAndSubjectCodeStartingWithAndStudentCode(
-			Integer schoolId, String subjectCode, String studentCode);
-	
-	public String findIdsByMarkLogin(String markLogin);
-	
-	public String findIdsByMarkName(String markName);
+    List<ExamStudent> findByExamId(int examId, int pageNumber, int pageSize);
 
-    List<ExamStudent> findByExamId(int examId,int pageNumber,int pageSize);
+    List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
+            boolean breach);
 
-    List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach);
 }

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

@@ -11,16 +11,14 @@ import java.util.Set;
 
 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 javax.persistence.criteria.Expression;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -260,7 +258,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     }
 
     @Override
-    public List<ExamStudent> findByExamId(int examId,int pageNumber, int pageSize) {
+    public List<ExamStudent> findByExamId(int examId, int pageNumber, int pageSize) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setPageNumber(pageNumber);
         query.setPageSize(pageSize);
@@ -276,6 +274,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return studentDao.findByExamIdAndUploadAndAbsent(examId, upload, absent, query);
     }
 
+    @Override
+    public List<ExamStudent> findByExamIdAndUpload(int examId, boolean upload, int pageNumber, int pageSize) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setPageNumber(pageNumber);
+        query.setPageSize(pageSize);
+        return studentDao.findByExamIdAndUpload(examId, upload, query);
+    }
+
     @Override
     public List<ExamStudent> findByExamIdAndCampusName(int examId, String campusName, int pageNumber, int pageSize) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
@@ -327,7 +333,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setAbsent(absent);
         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);
@@ -336,14 +344,15 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setBreach(breach);
         return countByQuery(query);
     }
+
     public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
-        if(breach != null){
+        if (breach != null) {
             query.setBreach(breach);
         }
-        if(absent != null){
+        if (absent != null) {
             query.setAbsent(absent);
         }
         return countByQuery(query);
@@ -407,30 +416,34 @@ 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));
-                if (query.getStartScroe()!=null ) {
-                    Predicate predicate1 = cb.ge(evaluationItemSum,query.getStartScroe());
-                    Predicate predicate2  = cb.le(evaluationItemSum,query.getEndScroe());
-                    if(query.getStartScroe() == 0){
-                        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 {
-                        predicates.add(cb.equal(root.get("absent"),  false));
-                        predicates.add(cb.equal(root.get("breach"),  false));
-                        predicates.add(cb.and(predicate1,predicate2));
+                Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),
+                        root.get("subjectiveScore").as(Double.class));
+                if (query.getStartScroe() != null) {
+                    Predicate predicate1 = cb.ge(evaluationItemSum, query.getStartScroe());
+                    Predicate predicate2 = cb.le(evaluationItemSum, query.getEndScroe());
+                    if (query.getStartScroe() == 0) {
+                        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 {
+                        predicates.add(cb.equal(root.get("absent"), false));
+                        predicates.add(cb.equal(root.get("breach"), false));
+                        predicates.add(cb.and(predicate1, predicate2));
                     }
                 }
-//                if (query.getStartScroe()!=null && query.getEndScroe()!=null ) {
-//                    predicates.add(cb.between(evaluationItemSum, query.getStartScroe(), query.getEndScroe()));
-//                }
+                // if (query.getStartScroe()!=null && query.getEndScroe()!=null
+                // ) {
+                // predicates.add(cb.between(evaluationItemSum,
+                // query.getStartScroe(), query.getEndScroe()));
+                // }
                 if (query.getExamId() > 0) {
                     predicates.add(cb.equal(root.get("examId"), query.getExamId()));
                 }
                 if (StringUtils.isNotBlank(query.getIds())) {
                     String[] ids = query.getIds().split(",");
                     List<String> list = new ArrayList<String>();
-                    for(String str : ids){
+                    for (String str : ids) {
                         list.add(str);
                     }
                     predicates.add(root.get("id").in(list));
@@ -493,9 +506,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                     predicates.add(cb.equal(root.get("upload"), query.getUpload()));
                 }
                 if (query.getAbsent() != null) {
-                    if(query.getAbsent()){//缺考=缺考+ 未上传
-                        predicates.add(cb.or(cb.equal(root.get("absent"),true),cb.equal(root.get("upload"),false)));
-                    }else {
+                    if (query.getAbsent()) {// 缺考=缺考+ 未上传
+                        predicates.add(cb.or(cb.equal(root.get("absent"), true), cb.equal(root.get("upload"), false)));
+                    } else {
                         predicates.add(cb.equal(root.get("absent"), query.getAbsent()));
                         predicates.add(cb.equal(root.get("upload"), true));
                     }
@@ -601,31 +614,36 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return countByQuery(query);
     }
 
-	@Override
-	public ExamStudent findBySchoolIdAndSubjectCodeStartingWithAndStudentCode(
-			Integer schoolId, String subjectCode, String studentCode) {
+    @Override
+    public ExamStudent findBySchoolIdAndSubjectCodeStartingWithAndStudentCode(Integer schoolId, String subjectCode,
+            String studentCode) {
         List<Exam> exams = examService.findBySchoolId(schoolId);
         if (exams != null && exams.size() > 0) {
-            return studentDao.findByExamIdAndSubjectCodeStartingWithAndStudentCode(exams.get(0).getId(), subjectCode, studentCode);
+            return studentDao.findByExamIdAndSubjectCodeStartingWithAndStudentCode(exams.get(0).getId(), subjectCode,
+                    studentCode);
         } else {
             return null;
         }
-	}
-	@Override
-	public String findIdsByMarkLogin(String markLogin) {
-	    List<String[]> o = studentDao.findIdsByMarkLogin(markLogin);
-	    return StringUtils.join(o, ",");
-	}
-	@Override
+    }
+
+    @Override
+    public String findIdsByMarkLogin(String markLogin) {
+        List<String[]> o = studentDao.findIdsByMarkLogin(markLogin);
+        return StringUtils.join(o, ",");
+    }
+
+    @Override
     public String findIdsByMarkName(String MarkName) {
         List<String[]> o = studentDao.findIdsByMarkName(MarkName);
         return StringUtils.join(o, ",");
     }
+
     @Override
     /**
      * 根据缺考和违纪字段联合查询
      */
-    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach){
-        return  studentDao.statisticsByAbsentAndBreach(examId,code,upload,absent,breach);
+    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
+            boolean breach) {
+        return studentDao.statisticsByAbsentAndBreach(examId, code, upload, absent, breach);
     }
 }

+ 97 - 92
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java

@@ -39,25 +39,26 @@ public class ScoreCalculateThread implements Runnable {
     private ExamService examService;
 
     private ExamQuestionService questionService;
-    
+
     private ExamSubjectService subjectService;
-    
+
     private ScoreRateService scoreRateService;
-    
+
     private MarkLibraryService libraryService;
-    
+
     private Exam exam;
 
     private Map<String, List<ExamQuestion>> objectiveMap;
-    
+
     private Map<String, List<ExamQuestion>> subjectiveMap;
-    
-    private Map<String,Set<String>> campusNameMap;
-    
-    private Map<String,Double> scoreRateMap;
+
+    private Map<String, Set<String>> campusNameMap;
+
+    private Map<String, Double> scoreRateMap;
 
     public ScoreCalculateThread(Exam exam, ExamService examService, ExamStudentService studentService,
-            ExamQuestionService questionService,ExamSubjectService subjectService,ScoreRateService scoreRateService,MarkLibraryService libraryService) {
+            ExamQuestionService questionService, ExamSubjectService subjectService, ScoreRateService scoreRateService,
+            MarkLibraryService libraryService) {
         this.exam = exam;
         this.examService = examService;
         this.studentService = studentService;
@@ -77,24 +78,22 @@ public class ScoreCalculateThread implements Runnable {
         try {
             int pageNumber = 1;
             int pageSize = 1000;
-            List<ExamStudent> list = studentService.findByExamIdAndUploadAndAbsent(exam.getId(), true, false,
-                    pageNumber, pageSize);
+            List<ExamStudent> list = studentService.findByExamIdAndUpload(exam.getId(), true, pageNumber, pageSize);
             while (list != null && list.size() > 0) {
                 for (ExamStudent student : list) {
                     calculate(student);
                 }
-
                 pageNumber++;
-                list = studentService.findByExamIdAndUploadAndAbsent(exam.getId(), true, false, pageNumber, pageSize);
+                list = studentService.findByExamIdAndUpload(exam.getId(), true, pageNumber, pageSize);
             }
-            //统计各科目下每题得分率,主观题评卷完成才统计
+            // 统计各科目下每题得分率,主观题评卷完成才统计
             long total = subjectService.sumLibraryCount(exam.getId(), 0, 0);
             long finish = libraryService.countByExamAndStatus(exam.getId(), LibraryStatus.MARKED);
-            int percent = total > 0 ? (int) (finish * 100.00 / total) : 0;
-            if(percent>=100){
-            	statistics();
+            // int percent = total > 0 ? (int) (finish * 100.00 / total) : 0;
+            if (finish >= total) {
+                statistics();
             }
-            
+
         } catch (Exception e) {
             log.error("calculate exception for examId=" + exam.getId(), e);
         } finally {
@@ -105,16 +104,18 @@ public class ScoreCalculateThread implements Runnable {
         }
     }
 
-	private void statistics() {
-		List<ExamSubject> examSubjects = subjectService.list(exam.getId());
-		for (ExamSubject examSubject : examSubjects) {
-			Set<String> campusNameList = campusNameMap.get(examSubject.getCode());
-			if(campusNameList != null){
+    private void statistics() {
+        List<ExamSubject> examSubjects = subjectService.list(exam.getId());
+        for (ExamSubject examSubject : examSubjects) {
+            Set<String> campusNameList = campusNameMap.get(examSubject.getCode());
+            if (campusNameList != null) {
                 for (String campusName : campusNameList) {
                     List<ExamQuestion> questions = this.findQuestionList(examSubject.getCode(), false);
-                    Long count = studentService.countByExamIdAndSubjectCodeAndCampus(exam.getId(),examSubject.getCode(), campusName, true,false);
+                    Long count = studentService.countByExamIdAndSubjectCodeAndCampus(exam.getId(),
+                            examSubject.getCode(), campusName, true, false);
                     for (ExamQuestion examQuestion : questions) {
-                        ScoreRate scoreRate = scoreRateService.findOne(exam.getId(), examSubject.getCode(), campusName,false, examQuestion.getMainNumber(),examQuestion.getSubNumber());
+                        ScoreRate scoreRate = scoreRateService.findOne(exam.getId(), examSubject.getCode(), campusName,
+                                false, examQuestion.getMainNumber(), examQuestion.getSubNumber());
                         if (scoreRate == null) {
                             scoreRate = new ScoreRate();
                             scoreRate.setExamId(exam.getId());
@@ -126,92 +127,96 @@ public class ScoreCalculateThread implements Runnable {
                             scoreRate.setMainTitle(examQuestion.getMainTitle());
                             scoreRate.setTotalScore(examQuestion.getTotalScore());
                         }
-                        String key = getKey(examSubject.getCode(), campusName,examQuestion.getQuestionNumber());
+                        String key = getKey(examSubject.getCode(), campusName, examQuestion.getQuestionNumber());
                         BigDecimal bg = new BigDecimal(scoreRateMap.get(key) * 1.00 / count);
                         double avgScore = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                        if(scoreRate.getAvgScore()==null || scoreRate.getAvgScore()!=avgScore){
+                        if (scoreRate.getAvgScore() == null || scoreRate.getAvgScore() != avgScore) {
                             scoreRate.setAvgScore(avgScore);
                         }
-                        if(scoreRate.getTotalScore()!=examQuestion.getTotalScore()){
+                        if (scoreRate.getTotalScore() != examQuestion.getTotalScore()) {
                             scoreRate.setTotalScore(examQuestion.getTotalScore());
                         }
                         scoreRateService.save(scoreRate);
                     }
                 }
             }
-		}
-	}
+        }
+    }
 
     private void calculate(ExamStudent student) {
         ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
-        ScoreInfo info = util.calculate(findQuestionList(student.getSubjectCode(),true), null);
+        ScoreInfo info = util.calculate(findQuestionList(student.getSubjectCode(), true), null);
 
         student.setObjectiveScore(info.getObjectiveScore());
         student.setScoreList(info.getScoreList(), true);
-        if(("".equals(student.getSubjectiveScoreString()) || "0".equals(student.getSubjectiveScoreString()))){//当考生的主观分等于0时,同时该考生的试卷已经评卷的情况,再获取一次评卷分数
-        	MarkLibrary markLibrary = libraryService.findByStudentId(student.getId());
-        	if(markLibrary != null){//并且存在评卷记录的
-        		student.setSubjectiveScore(markLibrary.getMarkerScore());
-        		student.setScoreList(markLibrary.getScoreList(), false);
-        	}
+        if (student.getSubjectiveScore() == null || StringUtils.isBlank(student.getSubjectiveScoreList())) {
+            // 当考生的主观分或得分明细为空时,再尝试同步一次评卷任务的分数
+            MarkLibrary markLibrary = libraryService.findByStudentId(student.getId());
+            if (markLibrary != null && markLibrary.getStatus() == LibraryStatus.MARKED) {
+                // 存在评卷记录且已完成评卷时,同步评卷分数与明细
+                student.setSubjectiveScore(markLibrary.getMarkerScore());
+                student.setScoreList(markLibrary.getScoreList(), false);
+            }
         }
         studentService.save(student);
-        
-        if(!student.getScoreList(false).isEmpty()){//主观题有分数明细才统分
-        	statistics(student);
+
+        // 主观题有分数明细才统计
+        if (StringUtils.isNotBlank(student.getSubjectiveScoreList())) {
+            statistics(student);
         }
     }
+
     private void statistics(ExamStudent student) {
-    	Set<String> campusNames = campusNameMap.get(student.getSubjectCode());
-    	if(campusNames == null || campusNames.isEmpty()){
-    		campusNames = new HashSet<>();
-    		campusNames.add(student.getCampusName());
-    	}else{
-    		campusNames.add(student.getCampusName());
-    	}
-    	this.campusNameMap.put(student.getSubjectCode(), campusNames);
-    	List<ScoreItem> items = student.getScoreList(false);
-    	List<ExamQuestion> list = this.findQuestionList(student.getSubjectCode(),false);
-    	if(!items.isEmpty() && list != null){
-        	if(items.size()!=list.size()){
-        		return ;
-        	}
-    	    for (int i = 0; i < list.size(); i++) {
-    	        ScoreItem scoreItem = items.get(i);
-    	        String key = getKey(student.getSubjectCode(),student.getCampusName(),list.get(i).getQuestionNumber());
-    	        Double totalScore = scoreRateMap.get(key);
-    	        if(totalScore==null){
-    	            scoreRateMap.put(key,scoreItem.getScore());
-    	        }else{
-    	            scoreRateMap.put(key,totalScore+scoreItem.getScore());
-    	        }
-    	    }
-    	}
-	}
-
-	private String getKey(String subjectCode,String campusName,String questionNumber) {
-		List<String> list = new ArrayList<String>();
-		list.add(subjectCode);
-		list.add(campusName);
-		list.add(questionNumber);
-		return StringUtils.join(list, "-");
-	}
-
-	private List<ExamQuestion> findQuestionList(String subjectCode, boolean objective) {
-    	if(objective){
-    		List<ExamQuestion> list = objectiveMap.get(subjectCode);
-    		if (list == null) {
-    			list = questionService.findByExamAndSubjectAndObjective(exam.getId(), subjectCode, true);
-    			objectiveMap.put(subjectCode, list);
-    		}
-    		return list;
-    	}else{
-    		List<ExamQuestion> list = subjectiveMap.get(subjectCode);
-    		if (list == null) {
-    			list = questionService.findByExamAndSubjectAndObjective(exam.getId(), subjectCode, false);
-    			subjectiveMap.put(subjectCode, list);
-    		}
-    		return list;
-    	}
+        List<ScoreItem> items = student.getScoreList(false);
+        List<ExamQuestion> list = findQuestionList(student.getSubjectCode(), false);
+        if (!items.isEmpty() && list != null) {
+            int count = list.size();
+            if (items.size() != count) {
+                return;
+            }
+            for (int i = 0; i < count; i++) {
+                ScoreItem scoreItem = items.get(i);
+                String key = getKey(student.getSubjectCode(), student.getCampusName(), list.get(i).getQuestionNumber());
+                Double totalScore = scoreRateMap.get(key);
+                if (totalScore == null) {
+                    scoreRateMap.put(key, scoreItem.getScore());
+                } else {
+                    scoreRateMap.put(key, totalScore + scoreItem.getScore());
+                }
+            }
+
+            Set<String> campusNames = campusNameMap.get(student.getSubjectCode());
+            if (campusNames == null) {
+                campusNames = new HashSet<>();
+                campusNameMap.put(student.getSubjectCode(), campusNames);
+            }
+            campusNames.add(student.getCampusName());
+        }
+    }
+
+    private String getKey(String subjectCode, String campusName, String questionNumber) {
+        List<String> list = new ArrayList<String>();
+        list.add(subjectCode);
+        list.add(campusName);
+        list.add(questionNumber);
+        return StringUtils.join(list, "-");
+    }
+
+    private List<ExamQuestion> findQuestionList(String subjectCode, boolean objective) {
+        if (objective) {
+            List<ExamQuestion> list = objectiveMap.get(subjectCode);
+            if (list == null) {
+                list = questionService.findByExamAndSubjectAndObjective(exam.getId(), subjectCode, true);
+                objectiveMap.put(subjectCode, list);
+            }
+            return list;
+        } else {
+            List<ExamQuestion> list = subjectiveMap.get(subjectCode);
+            if (list == null) {
+                list = questionService.findByExamAndSubjectAndObjective(exam.getId(), subjectCode, false);
+                subjectiveMap.put(subjectCode, list);
+            }
+            return list;
+        }
     }
 }