Jelajahi Sumber

是否需要统分由exam迁移到examSubject;统分任务需要传递subjectCode集合;能否导出成绩需要根据subjectCode来判断;报表服务增减按照examId和subjectCode清除数据方法

luoshi 4 tahun lalu
induk
melakukan
ea1c8e0651
46 mengubah file dengan 960 tambahan dan 905 penghapusan
  1. 0 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  2. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  3. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectDao.java
  4. 0 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  5. 21 13
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java
  6. 0 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java
  7. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  8. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamSubjectService.java
  9. 34 29
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java
  10. 0 8
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  11. 10 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  12. 9 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamSubjectServiceImpl.java
  13. 112 180
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  14. 6 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassDao.java
  15. 5 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassGroupDao.java
  16. 4 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectCollegeDao.java
  17. 7 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectDao.java
  18. 7 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java
  19. 5 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectQuestionDao.java
  20. 6 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectRangeDao.java
  21. 4 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectTeacherClassDao.java
  22. 4 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectTeacherDao.java
  23. 1 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportService.java
  24. 5 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassGroupService.java
  25. 3 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassService.java
  26. 3 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectCollegeService.java
  27. 3 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectGroupService.java
  28. 3 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectQuestionService.java
  29. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectRangeService.java
  30. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectService.java
  31. 4 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectTeacherClassService.java
  32. 3 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectTeacherService.java
  33. 32 13
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java
  34. 27 21
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassGroupServiceImpl.java
  35. 23 18
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassServiceImpl.java
  36. 20 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectCollegeServiceImpl.java
  37. 24 19
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java
  38. 28 23
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectQuestionServiceImpl.java
  39. 22 17
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectRangeServiceImpl.java
  40. 20 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectServiceImpl.java
  41. 20 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherClassServiceImpl.java
  42. 20 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherServiceImpl.java
  43. 2 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  44. 103 124
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  45. 53 55
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java
  46. 293 255
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp

+ 0 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java

@@ -30,10 +30,6 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
     @Query("update Exam e set e.sliceConfig=?2 where e.id=?1")
     public void updateSliceConfig(Integer examId, String configString);
 
-    @Modifying
-    @Query("update Exam e set e.needCalculate=?2 where e.id=?1")
-    public void updateNeedCalculate(Integer examId, boolean needCalculate);
-
     List<Exam> findBySchoolIdAndTypeAndStatusOrderByIdDesc(Integer schoolId, ExamType type, ExamStatus status);
 
     List<Exam> findBySchoolIdAndStatusOrderByIdDesc(Integer schoolId, ExamStatus status);

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -15,6 +15,8 @@ public interface ExamStudentDao
 
     public List<ExamStudent> findByExamId(int examId, Pageable pageable);
 
+    public List<ExamStudent> findByExamIdAndSubjectCode(int examId, String subjectCode, Pageable pageable);
+
     public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent,
             Pageable pageable);
 

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectDao.java

@@ -34,6 +34,10 @@ public interface ExamSubjectDao
     @Query("select s from ExamSubject s where s.pk.examId=?1 and s.uploadCount>?2")
     public List<ExamSubject> findByExamIdAndUploadCountGt(int examId, int uploadCount);
 
+    @Modifying
+    @Query("update ExamSubject s set s.needCalculate=?3 where s.pk.examId=?1 and s.pk.code=?2")
+    public int updateNeedCalculate(int examId, String code, boolean needCalculate);
+
     @Modifying
     @Query("update ExamSubject s set s.totalScore=s.objectiveScore+s.subjectiveScore where s.pk.examId=?1")
     public void updateTotalScoreByExamId(int examId);

+ 0 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -62,12 +62,6 @@ public class Exam implements Serializable {
     @Column(name = "creator_id", nullable = true)
     private Integer creatorId;
 
-    /**
-     * 是否需要统分
-     */
-    @Column(name = "need_calculate", nullable = false)
-    private boolean needCalculate;
-
     /**
      * 及格分数
      */
@@ -197,14 +191,6 @@ public class Exam implements Serializable {
         return PictureConfigItem.parse(sliceConfig);
     }
 
-    public boolean isNeedCalculate() {
-        return needCalculate;
-    }
-
-    public void setNeedCalculate(boolean needCalculate) {
-        this.needCalculate = needCalculate;
-    }
-
     public Double getPassScore() {
         return passScore;
     }

+ 21 - 13
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java

@@ -1,18 +1,12 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
-import java.io.Serializable;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-import org.apache.commons.lang.StringUtils;
-
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import org.apache.commons.lang.StringUtils;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.List;
 
 @Entity
 @Table(name = "eb_exam_subject")
@@ -56,12 +50,18 @@ public class ExamSubject implements Serializable {
     @Column(name = "remark")
     private String remark;
 
+    /**
+     * 是否需要统分
+     */
+    @Column(name = "need_calculate", nullable = false)
+    private boolean needCalculate;
+
     /**
      * 裁切图配置
      */
     @Column(name = "slice_config", nullable = true)
     private String sliceConfig;
-    
+
     /**
      * 原图遮盖配置
      */
@@ -207,6 +207,14 @@ public class ExamSubject implements Serializable {
         this.hasAnswer = hasAnswer;
     }
 
+    public boolean isNeedCalculate() {
+        return needCalculate;
+    }
+
+    public void setNeedCalculate(boolean needCalculate) {
+        this.needCalculate = needCalculate;
+    }
+
     public String getSliceConfig() {
         return sliceConfig;
     }
@@ -226,7 +234,7 @@ public class ExamSubject implements Serializable {
     public void setSheetConfig(String sheetConfig) {
         this.sheetConfig = sheetConfig;
     }
-    
+
     public List<PictureConfigItem> getSheetConfigList() {
         return PictureConfigItem.parse(sheetConfig);
     }

+ 0 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java

@@ -16,8 +16,6 @@ public interface ExamService {
 
     void updateSliceConfig(Integer id, List<PictureConfigItem> configList);
 
-    void updateNeedCalculate(Integer id, boolean needCalculate);
-
     ExamSearchQuery findByQuery(ExamSearchQuery query);
 
     List<Exam> findBySchoolIdAndTypeAndStatus(Integer schoolId, ExamType type);

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -106,6 +106,8 @@ public interface ExamStudentService {
 
     List<ExamStudent> findByExamId(int examId, int pageNumber, int pageSize);
 
+    List<ExamStudent> findByExamIdAndSubjectCode(int examId, String subjectCode, int pageNumber, int pageSize);
+
     List<PictureTag> buildSheetTags(ExamStudent student, int index);
 
     Map<Integer, List<PictureTag>> buildSheetTags(ExamStudent student);

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamSubjectService.java

@@ -35,6 +35,8 @@ public interface ExamSubjectService {
 
     List<String> listCategory(int examId);
 
+    boolean updateNeedCalculate(int examId, String code, boolean needCalculate);
+
     void updateUploadCount(Integer examId, String subjectCode, int count);
 
     void updateTotalScore(int examId);

+ 34 - 29
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java

@@ -1,13 +1,13 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+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.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
+import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
@@ -16,22 +16,25 @@ 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.ExamQuestionDao;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-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.query.ExamQuestionSearchQuery;
-import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
+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;
 
 @Service
 public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> implements ExamQuestionService {
 
     @Autowired
     private ExamQuestionDao questionDao;
+
     @Autowired
     private ExamService examService;
 
+    @Autowired
+    private ExamSubjectService subjectService;
+
     @Transactional
     @Override
     public ExamQuestion save(ExamQuestion question) {
@@ -72,22 +75,22 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndPaperType(Integer examId, String subjectCode,
             boolean objective, String paperType) {
-        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective,
-                paperType, new Sort(Direction.ASC, "mainNumber", "subNumber"));
+        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective, paperType,
+                new Sort(Direction.ASC, "mainNumber", "subNumber"));
     }
 
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumber(Integer examId, String subjectCode,
             boolean objective, Integer groupNumber) {
-        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode, objective,
-                groupNumber);
+        return questionDao
+                .findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode, objective, groupNumber);
     }
 
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber) {
-        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective,
-                mainNumber);
+        return questionDao
+                .findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective, mainNumber);
     }
 
     @Override
@@ -106,8 +109,8 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public long countByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode, boolean objective,
             Integer mainNumber) {
-        return questionDao.countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective,
-                mainNumber);
+        return questionDao
+                .countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective, mainNumber);
     }
 
     private Specification<ExamQuestion> buildSpecification(final ExamQuestionSearchQuery query) {
@@ -144,8 +147,9 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
                 if (query.getMainNumber() != null) {
                     predicates.add(cb.equal(root.get("mainNumber"), query.getMainNumber()));
                 }
-                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()]));
             }
         };
     }
@@ -164,8 +168,9 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public long countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber, String paperType) {
-        return questionDao.countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective,
-                mainNumber, paperType);
+        return questionDao
+                .countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective, mainNumber,
+                        paperType);
     }
 
     @Override
@@ -179,8 +184,8 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
         ExamQuestion question = questionDao.findOne(questionId);
         question.setObjectivePolicy(objectivePolicy);
         questionDao.save(question);
-     // 修改后需要重新统分
-        examService.updateNeedCalculate(question.getExamId(), true);
+        // 修改后需要重新统分
+        subjectService.updateNeedCalculate(question.getExamId(), question.getSubjectCode(), true);
         return question;
     }
 

+ 0 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java

@@ -65,14 +65,6 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
         examDao.updateStatus(id, status);
     }
 
-    @Override
-    @Transactional
-    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
-    // true)
-    public void updateNeedCalculate(Integer id, boolean needCalculate) {
-        examDao.updateNeedCalculate(id, needCalculate);
-    }
-
     @Transactional
     // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
     // true)

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

@@ -265,6 +265,15 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return studentDao.findByExamId(examId, query);
     }
 
+    @Override
+    public List<ExamStudent> findByExamIdAndSubjectCode(int examId, String subjectCode, int pageNumber, int pageSize) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setPageNumber(pageNumber);
+        query.setPageSize(pageSize);
+        query.setSort(new Sort(Direction.ASC, "id"));
+        return studentDao.findByExamIdAndSubjectCode(examId, subjectCode, query);
+    }
+
     @Override
     public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent, int pageNumber,
             int pageSize) {
@@ -397,7 +406,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     @Transactional
     public boolean updateBreach(int id, boolean breach) {
-        return studentDao.updateBreach(id, breach) > 1;
+        return studentDao.updateBreach(id, breach) > 0;
     }
 
     @Override

+ 9 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamSubjectServiceImpl.java

@@ -103,6 +103,15 @@ public class ExamSubjectServiceImpl extends BaseQueryService<ExamSubject> implem
         subjectDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    // @CacheEvict(value = "exam_subject_cache", key =
+    // "T(String).valueOf(#subject.examId)+'-'+#subject.code", condition =
+    // "#subject!=null && #subject.examId!=null && #subject.code!=null")
+    public boolean updateNeedCalculate(int examId, String code, boolean needCalculate) {
+        return subjectDao.updateNeedCalculate(examId, code, needCalculate) > 0;
+    }
+
     @Transactional
     @Override
     // @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,

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

@@ -1,59 +1,32 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
-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.exam.model.*;
 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.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.TrialHistoryDao;
-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.MarkTrack;
-import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
-import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
-import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
+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.mark.service.ProblemHistoryService;
 import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
-import cn.com.qmth.stmms.common.enums.HistoryStatus;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
+import cn.com.qmth.stmms.common.enums.*;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * 与评卷相关的所有修改操作(非传播性的新增操作除外),全部汇总到这里进行集中控制
@@ -118,8 +91,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷分组已申请的评卷任务数量
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      * @return int
      */
     @Override
@@ -136,8 +108,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已申请的评卷任务数量
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      * @return int
      */
     @Override
@@ -159,8 +130,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已完成的评卷任务数量
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      * @return long
      */
     @Override
@@ -173,8 +143,8 @@ public class MarkServiceImpl implements MarkService {
             if (group.getStatus() == MarkStatus.TRIAL) {
                 return trialHistoryDao.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;
@@ -183,8 +153,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷分组的锁定任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     public void releaseByGroup(MarkGroup group) {
@@ -198,8 +167,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷分组的所有评卷任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -210,8 +178,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 删除某个评卷分组
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -247,14 +214,13 @@ public class MarkServiceImpl implements MarkService {
         subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
                 sumTotalScore(group.getExamId(), group.getSubjectCode()));
         // 需要重新统分
-        examService.updateNeedCalculate(group.getExamId(), true);
+        subjectService.updateNeedCalculate(group.getExamId(), group.getSubjectCode(), true);
     }
 
     /**
      * 修改某个评卷分组给分步骤,并重置评卷任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -278,10 +244,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个正式评卷任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      */
     @Override
     public boolean applyLibrary(MarkLibrary library, Marker marker) {
@@ -297,10 +261,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个试评评卷任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -311,10 +273,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个正式评卷任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -325,10 +285,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个试评评卷任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -339,10 +297,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的正评任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      */
     @Override
     public void releaseLibrary(MarkLibrary library, Marker marker) {
@@ -352,10 +308,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的试评任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      */
     @Override
     public void releaseLibrary(TrialLibrary library, Marker marker) {
@@ -365,8 +319,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员的所有锁定任务
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     public void releaseByMarker(Marker marker) {
@@ -377,8 +330,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷员
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     @Transactional
@@ -408,8 +360,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生删除评卷任务
      *
-     * @param student
-     *            - 考生
+     * @param student - 考生
      */
     @Override
     @Transactional
@@ -432,10 +383,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员提交评卷任务
      *
-     * @param result
-     *            - 评卷结果
-     * @param marker
-     *            - 评卷员
+     * @param result - 评卷结果
+     * @param marker - 评卷员
      * @return boolean
      */
     @Override
@@ -443,8 +392,8 @@ public class MarkServiceImpl implements MarkService {
     public boolean submitTask(MarkResult result, Marker marker) {
         // 判断评卷分组是否存在/评卷是否结束
         MarkGroup group = groupDao.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-        if (group == null || group.getStatus() == MarkStatus.FINISH
-                || group.getStatus().getValue() != result.getStatusValue()) {
+        if (group == null || group.getStatus() == MarkStatus.FINISH || group.getStatus().getValue() != result
+                .getStatusValue()) {
             return false;
         }
 
@@ -462,10 +411,10 @@ public class MarkServiceImpl implements MarkService {
                     return true;
                 }
             }
-            if (library != null && library.getExamId().equals(group.getExamId())
-                    && library.getSubjectCode().equals(group.getSubjectCode())
-                    && library.getGroupNumber().equals(group.getNumber())
-                    && result.getTotalScore() <= group.getTotalScore() && StringUtils.isNotBlank(result.getScoreList())) {
+            if (library != null && library.getExamId().equals(group.getExamId()) && library.getSubjectCode()
+                    .equals(group.getSubjectCode()) && library.getGroupNumber().equals(group.getNumber())
+                    && result.getTotalScore() <= group.getTotalScore() && StringUtils
+                    .isNotBlank(result.getScoreList())) {
                 if (submitLibrary(library, marker, group, result)) {
                     updateMarkedCount(group);
                     releaseLibrary(library, marker);
@@ -474,10 +423,10 @@ 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())
-                    && result.getTotalScore() <= group.getTotalScore() && StringUtils.isNotBlank(result.getScoreList())) {
+            if (library != null && library.getExamId().equals(group.getExamId()) && library.getSubjectCode()
+                    .equals(group.getSubjectCode()) && library.getGroupNumber().equals(group.getNumber())
+                    && result.getTotalScore() <= group.getTotalScore() && StringUtils
+                    .isNotBlank(result.getScoreList())) {
                 TrialHistory history = new TrialHistory();
                 history.setExamId(library.getExamId());
                 history.setSubjectCode(library.getSubjectCode());
@@ -527,14 +476,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) {
         // 非本人领取的待评任务
@@ -542,8 +487,8 @@ 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;
         }
         // 是否多评情况下已处理过该考生评卷任务
@@ -553,9 +498,9 @@ public class MarkServiceImpl implements MarkService {
         }
         // 尝试提交评卷结果
         Date now = new Date();
-        if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(),
-                result.getTotalScore(), result.getScoreList(), now, result.getSpent(), LibraryStatus.WAITING,
-                LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 0) {
+        if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(), result.getTotalScore(),
+                result.getScoreList(), now, result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED,
+                LibraryStatus.INSPECTED) == 0) {
             // 条件不符更新失败,直接返回
             return false;
         }
@@ -575,8 +520,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) {
                     // 本评卷任务或组长已打分,则跳过该任务
@@ -586,12 +532,13 @@ public class MarkServiceImpl implements MarkService {
                 if (Math.abs(other.getMarkerScore() - result.getTotalScore()) > 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 = getArbitrate(libraries, group.getArbitrateThreshold(), now);
                         }
                     } else {
@@ -665,8 +612,7 @@ public class MarkServiceImpl implements MarkService {
      * 管理员/组长打回某个评卷任务<br>
      * 暂时不用到BACKED状态,直接等同于重置该评卷任务
      *
-     * @param library
-     *            - 正评任务
+     * @param library - 正评任务
      */
     @Override
     @Transactional
@@ -690,8 +636,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长重置某个试评任务
      *
-     * @param library
-     *            - 试评任务
+     * @param library - 试评任务
      */
     @Override
     @Transactional
@@ -709,8 +654,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长处理仲裁卷
      *
-     * @param history
-     *            - 仲裁卷
+     * @param history - 仲裁卷
      */
     @Override
     @Transactional
@@ -728,10 +672,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 对某个考生某个科目进行主观题统分
      *
-     * @param student
-     *            - 考生
-     * @param groups
-     *            - 所有评卷分组
+     * @param student - 考生
+     * @param groups  - 所有评卷分组
      */
     @Override
     @Transactional
@@ -757,8 +699,8 @@ public class MarkServiceImpl implements MarkService {
         // 全部评完,更新考生主观题得分
         student.setSubjectiveScore(totalScore);
         student.setScoreList(scoreList, false);
-        studentService.updateSubjectiveScore(student.getId(), student.getSubjectiveScore(),
-                student.getSubjectiveScoreList());
+        studentService
+                .updateSubjectiveScore(student.getId(), student.getSubjectiveScore(), student.getSubjectiveScoreList());
     }
 
     private boolean calculateGroup(MarkGroup group, Integer studentId) {
@@ -793,12 +735,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 {
@@ -870,8 +812,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个评卷分组已评任务数量
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -879,7 +820,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()));
@@ -889,20 +831,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());
         }
@@ -911,10 +854,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个科目所有评卷分组评卷任务数量
      *
-     * @param examId
-     *            - 考试ID
-     * @param subjectCode
-     *            - 科目代码
+     * @param examId      - 考试ID
+     * @param subjectCode - 科目代码
      */
     @Transactional
     @Override
@@ -929,14 +870,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      *
-     * @param student
-     *            - 考生
-     * @param campus
-     *            - 学习中心
-     * @param group
-     *            - 评卷分组
-     * @param subject
-     *            - 科目
+     * @param student - 考生
+     * @param campus  - 学习中心
+     * @param group   - 评卷分组
+     * @param subject - 科目
      */
     @Override
     @Transactional
@@ -962,14 +899,15 @@ public class MarkServiceImpl implements MarkService {
                 } else {
                     double studentCount = subject.getUploadCount();
                     double libraryCount = group.getLibraryCount();
-                    double doubleCount = libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(
-                            group.getExamId(), group.getSubjectCode(), group.getNumber(), 2);
+                    double doubleCount = libraryDao
+                            .countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(),
+                                    group.getSubjectCode(), group.getNumber(), 2);
                     int expectCount = (int) (studentCount * group.getDoubleRate());
                     // 随机数判断加入当前已经生成双评任务的比例加权
                     // 实际双评任务数小于理论生成数 &&(剩余未生成双评的考生数量小于剩余应生成的数量||随机比例)
-                    needDouble = doubleCount < expectCount
-                            && ((studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount) || Math
-                                    .random() < group.getDoubleRate() + 0.1);
+                    needDouble = doubleCount < expectCount && (
+                            (studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount)
+                                    || Math.random() < group.getDoubleRate() + 0.1);
                 }
                 if (needDouble) {
                     library = new MarkLibrary();
@@ -994,12 +932,9 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      *
-     * @param student
-     *            - 考生
-     * @param campus
-     *            - 学习中心
-     * @param group
-     *            - 评卷分组
+     * @param student - 考生
+     * @param campus  - 学习中心
+     * @param group   - 评卷分组
      */
     @Override
     @Transactional
@@ -1021,8 +956,7 @@ public class MarkServiceImpl implements MarkService {
      * 领取正式评卷任务时,用来区分的唯一标识<br/>
      * 多评时同一个考生的多份任务不能被同一位评卷员领取
      *
-     * @param library
-     *            - 正评任务
+     * @param library - 正评任务
      */
     private String getApplyTaskId(MarkLibrary library) {
         return library.getStudentId() + "_" + library.getGroupNumber();
@@ -1031,8 +965,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 领取试评评卷任务时,用来区分的唯一标识
      *
-     * @param library
-     *            - 试评任务
+     * @param library - 试评任务
      */
     private String getApplyTaskId(TrialLibrary library, Marker marker) {
         return library.getId() + "_" + marker.getId();
@@ -1041,8 +974,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置评卷分组的连带操作
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     private void resetGroup(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
@@ -1055,8 +987,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());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
@@ -1074,8 +1007,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 计算并更新指定评卷员的评卷质量指标
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     @Transactional

+ 6 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassDao.java

@@ -1,23 +1,25 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
-
 /**
  * 课程班级成绩分析 Dao
  *
  * @author xuwenjin
  * @date 2019-04-16
  */
-public interface ReportSubjectClassDao extends PagingAndSortingRepository<ReportSubjectClass, Integer>,
-        JpaSpecificationExecutor<ReportSubjectClass> {
+public interface ReportSubjectClassDao
+        extends PagingAndSortingRepository<ReportSubjectClass, Integer>, JpaSpecificationExecutor<ReportSubjectClass> {
 
     @Modifying
     @Query("delete from ReportSubjectClass r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    @Modifying
+    @Query("delete from ReportSubjectClass r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 5 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassGroupDao.java

@@ -1,14 +1,13 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
+import java.util.List;
 
 public interface ReportSubjectClassGroupDao extends PagingAndSortingRepository<ReportSubjectClassGroup, Integer>,
         JpaSpecificationExecutor<ReportSubjectClassGroup> {
@@ -20,4 +19,7 @@ public interface ReportSubjectClassGroupDao extends PagingAndSortingRepository<R
     List<ReportSubjectClassGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperTypeAndClassName(Integer examId,
             String subjectCode, boolean objective, String paperType, String className, Sort sort);
 
+    @Modifying
+    @Query("delete from ReportSubjectClassGroup r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectCollegeDao.java

@@ -1,12 +1,11 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
-
 /**
  * 课程学院分析 Dao
  *
@@ -20,4 +19,7 @@ public interface ReportSubjectCollegeDao extends PagingAndSortingRepository<Repo
     @Query("delete from ReportSubjectCollege r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    @Modifying
+    @Query("delete from ReportSubjectCollege r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 7 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectDao.java

@@ -1,23 +1,26 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import cn.com.qmth.stmms.biz.report.model.ReportSubject;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubject;
-
 /**
  * 课程总量分析 Dao
  *
  * @author xuwenjin
  * @date 2019-04-12
  */
-public interface ReportSubjectDao extends PagingAndSortingRepository<ReportSubject, Integer>,
-        JpaSpecificationExecutor<ReportSubject> {
+public interface ReportSubjectDao
+        extends PagingAndSortingRepository<ReportSubject, Integer>, JpaSpecificationExecutor<ReportSubject> {
 
     @Modifying
     @Query("delete from ReportSubject r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    @Modifying
+    @Query("delete from ReportSubject r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer exmaId, String subjectCode);
+
 }

+ 7 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java

@@ -1,14 +1,13 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
+import java.util.List;
 
 /**
  * 大题成绩分析 Dao
@@ -16,8 +15,8 @@ import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
  * @author xuwenjin
  * @date 2019-04-18
  */
-public interface ReportSubjectGroupDao extends PagingAndSortingRepository<ReportSubjectGroup, Integer>,
-        JpaSpecificationExecutor<ReportSubjectGroup> {
+public interface ReportSubjectGroupDao
+        extends PagingAndSortingRepository<ReportSubjectGroup, Integer>, JpaSpecificationExecutor<ReportSubjectGroup> {
 
     @Modifying
     @Query("delete from ReportSubjectGroup r where r.examId=?1 ")
@@ -26,4 +25,7 @@ public interface ReportSubjectGroupDao extends PagingAndSortingRepository<Report
     List<ReportSubjectGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
             boolean objective, String paperType, Sort sort);
 
+    @Modifying
+    @Query("delete from ReportSubjectGroup r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 5 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectQuestionDao.java

@@ -1,14 +1,13 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
+import java.util.List;
 
 /**
  * 客、主观题分析 Dao
@@ -26,4 +25,7 @@ public interface ReportSubjectQuestionDao extends PagingAndSortingRepository<Rep
     List<ReportSubjectQuestion> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
             boolean objective, String paperType, Sort sort);
 
+    @Modifying
+    @Query("delete from ReportSubjectQuestion r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 6 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectRangeDao.java

@@ -1,23 +1,25 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
-
 /**
  * 课程分段统计 Dao
  *
  * @author xuwenjin
  * @date 2019-04-19
  */
-public interface ReportSubjectRangeDao extends PagingAndSortingRepository<ReportSubjectRange, Integer>,
-        JpaSpecificationExecutor<ReportSubjectRange> {
+public interface ReportSubjectRangeDao
+        extends PagingAndSortingRepository<ReportSubjectRange, Integer>, JpaSpecificationExecutor<ReportSubjectRange> {
 
     @Modifying
     @Query("delete from ReportSubjectRange r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    @Modifying
+    @Query("delete from ReportSubjectRange r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectTeacherClassDao.java

@@ -1,12 +1,11 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacherClass;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacherClass;
-
 /**
  * 课程老师班级成绩分析 Dao
  *
@@ -24,4 +23,7 @@ public interface ReportSubjectTeacherClassDao extends PagingAndSortingRepository
     @Query("update ReportSubjectTeacherClass r set r.relativeAvgScore = (r.avgScore - (select s.avgScore from ReportSubject s where s.subjectCode = r.subjectCode and s.examId = r.examId )) where r.examId=?1  ")
     void updateRelativeAvgScore(Integer examId);
 
+    @Modifying
+    @Query("delete from ReportSubjectTeacherClass r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectTeacherDao.java

@@ -1,12 +1,11 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
-
 /**
  * 课程老师成绩分析 Dao
  *
@@ -24,4 +23,7 @@ public interface ReportSubjectTeacherDao extends PagingAndSortingRepository<Repo
     @Query("update ReportSubjectTeacher r set r.relativeAvgScore = (r.avgScore - (select s.avgScore from ReportSubject s where s.subjectCode = r.subjectCode and s.examId = r.examId )) where r.examId=?1  ")
     void updateRelativeAvgScore(Integer examId);
 
+    @Modifying
+    @Query("delete from ReportSubjectTeacher r where r.examId=?1 and r.subjectCode=?2")
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 1 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportService.java

@@ -10,4 +10,5 @@ public interface ReportService {
 
     void deleteData(Integer examId);
 
+    void deleteData(Integer examId, String subjectCode);
 }

+ 5 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassGroupService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
+import java.util.List;
+
 public interface ReportSubjectClassGroupService {
 
     void deleteByExamId(Integer examId);
@@ -16,7 +16,8 @@ public interface ReportSubjectClassGroupService {
 
     List<ReportSubjectClassGroup> findByQuery(ReportSubjectQuery query);
 
-    List<ReportSubjectClassGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
-            String subjectCode, boolean objective, String paperType, String className);
+    List<ReportSubjectClassGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
+            boolean objective, String paperType, String className);
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
+import java.util.List;
+
 /**
  * 课程班级成绩分析
  *
@@ -21,4 +21,5 @@ public interface ReportSubjectClassService {
 
     ReportSubjectClass findOne(Integer examId, String subjectCode, String className);
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectCollegeService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
+import java.util.List;
+
 /**
  * 课程学院分析 service 接口
  *
@@ -19,4 +19,5 @@ public interface ReportSubjectCollegeService {
 
     ReportSubjectCollege save(ReportSubjectCollege r);
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectGroupService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
+import java.util.List;
+
 /**
  * 大题统计分析 service 接口
  *
@@ -25,4 +25,5 @@ public interface ReportSubjectGroupService {
     List<ReportSubjectGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
             boolean objective, String paperType);
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectQuestionService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
+import java.util.List;
+
 /**
  * 客、主观题分析 service 接口
  *
@@ -25,4 +25,5 @@ public interface ReportSubjectQuestionService {
     List<ReportSubjectQuestion> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
             boolean isObjective, String paperType);
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectRangeService.java

@@ -16,4 +16,6 @@ public interface ReportSubjectRangeService {
     ReportSubjectRangeQuery findByQuery(ReportSubjectRangeQuery query);
 
     ReportSubjectRange save(ReportSubjectRange r);
+
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectService.java

@@ -15,6 +15,8 @@ public interface ReportSubjectService {
 
     void deleteByExamId(Integer examId);
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
+
     ReportSubjectQuery findByQuery(ReportSubjectQuery query);
 
     ReportSubject findOne(Integer examId, String subjectCode);

+ 4 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectTeacherClassService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacherClass;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
+import java.util.List;
+
 /**
  * 课程教师班级 成绩分析
  *
@@ -18,8 +18,8 @@ public interface ReportSubjectTeacherClassService {
     List<ReportSubjectTeacherClass> findByQuery(ReportSubjectQuery query);
 
     ReportSubjectTeacherClass save(ReportSubjectTeacherClass r);
-    
+
     void updateRelativeAvgScore(Integer examId);
-    
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectTeacherService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
+import java.util.List;
+
 /**
  * 课程教师成绩分析
  *
@@ -21,4 +21,5 @@ public interface ReportSubjectTeacherService {
 
     void updateRelativeAvgScore(Integer examId);
 
+    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
 }

+ 32 - 13
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java

@@ -1,19 +1,9 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
+import cn.com.qmth.stmms.biz.report.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import cn.com.qmth.stmms.biz.report.service.ReportService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
-
 @Component
 public class ReportServiceImpl implements ReportService {
 
@@ -40,7 +30,7 @@ public class ReportServiceImpl implements ReportService {
 
     @Autowired
     private ReportSubjectGroupService reportSubjectGroupService;
-    
+
     @Autowired
     private ReportSubjectClassGroupService reportSubjectClassGroupService;
 
@@ -67,9 +57,38 @@ public class ReportServiceImpl implements ReportService {
         reportSubjectQuestionService.deleteByExamId(examId);
 
         reportSubjectGroupService.deleteByExamId(examId);
-        
+
         reportSubjectClassGroupService.deleteByExamId(examId);
 
     }
 
+    /**
+     * 删除数据
+     *
+     * @param examId
+     * @param subjectCode
+     */
+    @Override
+    public void deleteData(Integer examId, String subjectCode) {
+
+        reportSubjectService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectRangeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectCollegeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectTeacherService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectTeacherClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectQuestionService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+        reportSubjectClassGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+
+    }
+
 }

+ 27 - 21
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassGroupServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectClassGroupDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -17,15 +14,16 @@ 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.report.dao.ReportSubjectClassGroupDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
+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;
 
 @Service
-public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportSubjectClassGroup> implements
-        ReportSubjectClassGroupService {
+public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportSubjectClassGroup>
+        implements ReportSubjectClassGroupService {
 
     @Autowired
     private ReportSubjectClassGroupDao reportSubjectClassGroupDao;
@@ -36,6 +34,12 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
         reportSubjectClassGroupDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectClassGroupDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public ReportSubjectClassGroup save(ReportSubjectClassGroup r) {
         return reportSubjectClassGroupDao.save(r);
@@ -63,8 +67,8 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
     @Override
     public List<ReportSubjectClassGroup> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "groupNumber"));
-        Page<ReportSubjectClassGroup> result = reportSubjectClassGroupDao.findAll(
-                new Specification<ReportSubjectClassGroup>() {
+        Page<ReportSubjectClassGroup> result = reportSubjectClassGroupDao
+                .findAll(new Specification<ReportSubjectClassGroup>() {
 
                     @Override
                     public Predicate toPredicate(Root<ReportSubjectClassGroup> root, CriteriaQuery<?> cQuery,
@@ -90,8 +94,9 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
                         } else if (query.getNullPaperType() != null && query.getNullPaperType().booleanValue()) {
                             predicates.add(cb.isNull(root.get("paperType")));
                         }
-                        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()]));
                     }
                 }, query);
         return result.getContent();
@@ -100,7 +105,8 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
     @Override
     public List<ReportSubjectClassGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
             String subjectCode, boolean objective, String paperType, String className) {
-        return reportSubjectClassGroupDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperTypeAndClassName(examId,
-                subjectCode, objective, paperType, className, new Sort(Direction.ASC, "groupNumber"));
+        return reportSubjectClassGroupDao
+                .findByExamIdAndSubjectCodeAndObjectiveAndPaperTypeAndClassName(examId, subjectCode, objective,
+                        paperType, className, new Sort(Direction.ASC, "groupNumber"));
     }
 }

+ 23 - 18
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectClassDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -17,11 +14,12 @@ 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.report.dao.ReportSubjectClassDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
+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;
 
 /**
  * 课程班级分析 service实现
@@ -30,8 +28,8 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
  * @date 2019-04-16
  */
 @Service
-public class ReportSubjectClassServiceImpl extends BaseQueryService<ReportSubjectClass> implements
-        ReportSubjectClassService {
+public class ReportSubjectClassServiceImpl extends BaseQueryService<ReportSubjectClass>
+        implements ReportSubjectClassService {
 
     @Autowired
     private ReportSubjectClassDao reportSubjectClassDao;
@@ -42,6 +40,12 @@ public class ReportSubjectClassServiceImpl extends BaseQueryService<ReportSubjec
         reportSubjectClassDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectClassDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public List<ReportSubjectClass> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "className"));
@@ -60,8 +64,9 @@ public class ReportSubjectClassServiceImpl extends BaseQueryService<ReportSubjec
                 if (StringUtils.isNotBlank(query.getClassName())) {
                     predicates.add(cb.equal(root.get("className"), query.getClassName()));
                 }
-                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()]));
             }
         }, query);
         return result.getContent();
@@ -74,7 +79,7 @@ public class ReportSubjectClassServiceImpl extends BaseQueryService<ReportSubjec
 
     @Override
     public ReportSubjectClass findOne(Integer examId, String subjectCode, String className) {
-        if(StringUtils.isBlank(className)){   
+        if (StringUtils.isBlank(className)) {
             return null;
         }
         ReportSubjectQuery query = new ReportSubjectQuery();

+ 20 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectCollegeServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectCollegeDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
@@ -16,11 +13,12 @@ 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.report.dao.ReportSubjectCollegeDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
+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;
 
 /**
  * 课程学院分析 service实现
@@ -41,6 +39,12 @@ public class ReportSubjectCollegeServiceImpl extends BaseQueryService<ReportSubj
         reportSubjectCollegeDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectCollegeDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public List<ReportSubjectCollege> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "collegeName"));
@@ -58,8 +62,9 @@ public class ReportSubjectCollegeServiceImpl extends BaseQueryService<ReportSubj
                 if (StringUtils.isNotBlank(query.getCollegeName())) {
                     predicates.add(cb.equal(root.get("collegeName"), query.getCollegeName()));
                 }
-                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()]));
             }
         });
         return result;

+ 24 - 19
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectGroupDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -17,11 +14,12 @@ 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.report.dao.ReportSubjectGroupDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
+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;
 
 /**
  * 大题型统计分析 service 实现
@@ -30,8 +28,8 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
  * @Date 2019-04-18
  */
 @Service
-public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjectGroup> implements
-        ReportSubjectGroupService {
+public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjectGroup>
+        implements ReportSubjectGroupService {
 
     @Autowired
     private ReportSubjectGroupDao reportSubjectGroupDao;
@@ -40,7 +38,12 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectGroupDao.deleteByExamId(examId);
+    }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectGroupDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
 
     @Override
@@ -68,8 +71,9 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
                 } else if (query.getNullPaperType() != null && query.getNullPaperType().booleanValue()) {
                     predicates.add(cb.isNull(root.get("paperType")));
                 }
-                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()]));
             }
         }, query);
         return result.getContent();
@@ -101,7 +105,8 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
     @Override
     public List<ReportSubjectGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
             String subjectCode, boolean objective, String paperType) {
-        return reportSubjectGroupDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective,
-                paperType, new Sort(Direction.ASC, "groupNumber"));
+        return reportSubjectGroupDao
+                .findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective, paperType,
+                        new Sort(Direction.ASC, "groupNumber"));
     }
 }

+ 28 - 23
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectQuestionServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectQuestionDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -17,11 +14,12 @@ 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.report.dao.ReportSubjectQuestionDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
+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;
 
 /**
  * 客、主观题分析 service 实现
@@ -30,8 +28,8 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
  * @Date 2019-04-17
  */
 @Service
-public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSubjectQuestion> implements
-        ReportSubjectQuestionService {
+public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSubjectQuestion>
+        implements ReportSubjectQuestionService {
 
     @Autowired
     private ReportSubjectQuestionDao reportSubjectQuestionDao;
@@ -45,14 +43,19 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectQuestionDao.deleteByExamId(examId);
+    }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectQuestionDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
 
     @Override
     public List<ReportSubjectQuestion> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "paperType", "mainNumber", "subNumber"));
-        Page<ReportSubjectQuestion> result = reportSubjectQuestionDao.findAll(
-                new Specification<ReportSubjectQuestion>() {
+        Page<ReportSubjectQuestion> result = reportSubjectQuestionDao
+                .findAll(new Specification<ReportSubjectQuestion>() {
 
                     @Override
                     public Predicate toPredicate(Root<ReportSubjectQuestion> root, CriteriaQuery<?> cQuery,
@@ -73,15 +76,16 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                         if (query.getObjective() != null) {
                             predicates.add(cb.equal(root.get("objective"), query.getObjective()));
                         }
-                        if (query.getObjective() != null && query.getObjective()
-                                && StringUtils.isNotBlank(query.getPaperType())) {
+                        if (query.getObjective() != null && query.getObjective() && StringUtils
+                                .isNotBlank(query.getPaperType())) {
                             predicates.add(cb.equal(root.get("paperType"), query.getPaperType()));
                         }
                         if (query.getNullPaperType() != null && query.getNullPaperType().booleanValue()) {
                             predicates.add(cb.isNull(root.get("paperType")));
                         }
-                        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()]));
                     }
                 }, query);
         return result.getContent();
@@ -104,8 +108,9 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
     @Override
     public List<ReportSubjectQuestion> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
             String subjectCode, boolean objective, String paperType) {
-        return reportSubjectQuestionDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode,
-                objective, paperType, new Sort(Direction.ASC, "mainNumber", "subNumber"));
+        return reportSubjectQuestionDao
+                .findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective, paperType,
+                        new Sort(Direction.ASC, "mainNumber", "subNumber"));
     }
 
 }

+ 22 - 17
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectRangeServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectRangeDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectRangeQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -15,11 +12,12 @@ 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.report.dao.ReportSubjectRangeDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectRangeQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
+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;
 
 /**
  * 课程分段统计 service 实现
@@ -28,8 +26,8 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
  * @Date 2019-04-19
  */
 @Service
-public class ReportSubjectRangeServiceImpl extends BaseQueryService<ReportSubjectRange> implements
-        ReportSubjectRangeService {
+public class ReportSubjectRangeServiceImpl extends BaseQueryService<ReportSubjectRange>
+        implements ReportSubjectRangeService {
 
     @Autowired
     private ReportSubjectRangeDao reportSubjectRangetDao;
@@ -40,6 +38,12 @@ public class ReportSubjectRangeServiceImpl extends BaseQueryService<ReportSubjec
         reportSubjectRangetDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectRangetDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public ReportSubjectRangeQuery findByQuery(final ReportSubjectRangeQuery query) {
         checkQuery(query);
@@ -55,8 +59,9 @@ public class ReportSubjectRangeServiceImpl extends BaseQueryService<ReportSubjec
                 if (StringUtils.isNotBlank(query.getSubjectCode())) {
                     predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
                 }
-                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()]));
             }
         }, query);
         fillResult(result, query);

+ 20 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubject;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -15,11 +12,12 @@ 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.report.dao.ReportSubjectDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubject;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
+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;
 
 /**
  * 课程总量统计service
@@ -44,6 +42,12 @@ public class ReportSubjectServiceImpl extends BaseQueryService<ReportSubject> im
         reportSubjectDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public ReportSubjectQuery findByQuery(final ReportSubjectQuery query) {
         checkQuery(query);
@@ -59,8 +63,9 @@ public class ReportSubjectServiceImpl extends BaseQueryService<ReportSubject> im
                 if (StringUtils.isNotBlank(query.getSubjectCode())) {
                     predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
                 }
-                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()]));
             }
         }, query);
         fillResult(result, query);

+ 20 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherClassServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectTeacherClassDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacherClass;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
@@ -16,11 +13,12 @@ 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.report.dao.ReportSubjectTeacherClassDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacherClass;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
+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;
 
 /**
  * 课程老师班级成绩 分析service实现
@@ -41,6 +39,12 @@ public class ReportSubjectTeacherClassServiceImpl extends BaseQueryService<Repor
         reportSubjectTeacherClassDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectTeacherClassDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public List<ReportSubjectTeacherClass> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "teacherName", "className"));
@@ -61,8 +65,9 @@ public class ReportSubjectTeacherClassServiceImpl extends BaseQueryService<Repor
                         if (StringUtils.isNotBlank(query.getTeacherName())) {
                             predicates.add(cb.equal(root.get("teacherName"), query.getTeacherName()));
                         }
-                        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()]));
                     }
                 });
 

+ 20 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherServiceImpl.java

@@ -1,13 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectTeacherDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
@@ -16,11 +13,12 @@ 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.report.dao.ReportSubjectTeacherDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
+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;
 
 /**
  * 课程学院分析 service实现
@@ -41,6 +39,12 @@ public class ReportSubjectTeacherServiceImpl extends BaseQueryService<ReportSubj
         reportSubjectTeacherDao.deleteByExamId(examId);
     }
 
+    @Transactional
+    @Override
+    public void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        reportSubjectTeacherDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public List<ReportSubjectTeacher> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "teacherName"));
@@ -59,8 +63,9 @@ public class ReportSubjectTeacherServiceImpl extends BaseQueryService<ReportSubj
                 if (StringUtils.isNotBlank(query.getTeacherName())) {
                     predicates.add(cb.equal(root.get("teacherName"), query.getTeacherName()));
                 }
-                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()]));
             }
         });
         return result;

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

@@ -186,8 +186,6 @@ public class PaperController extends BaseExamController {
     public String importFile(HttpServletRequest request, MultipartFile file, @RequestParam Boolean objective,
             RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
-        // 每次导入都需要重新统分
-        examService.updateNeedCalculate(examId, true);
 
         List<String> error = new LinkedList<String>();
         Map<String, SubjectQuestionDTO> map = parseQuestion(file, examId, objective, error);
@@ -196,6 +194,8 @@ public class PaperController extends BaseExamController {
             for (SubjectQuestionDTO dto : map.values()) {
                 ExamSubject subject = subjectService.find(examId, dto.getSubjectCode());
                 if (subject != null) {
+                    // 每次导入都需要重新统分
+                    subjectService.updateNeedCalculate(examId, subject.getCode(), true);
                     if (dto.validate(error)) {
                         if (objective) {
                             questionService.deleteByExamAndSubjectAndObjective(examId, dto.getSubjectCode(), objective);

+ 103 - 124
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -37,9 +37,7 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 
 @Controller
 @RequestMapping("/admin/exam/score")
@@ -57,9 +55,6 @@ public class ScoreController extends BaseExamController {
     @Autowired
     private ExamPackageService packageService;
 
-    @Autowired
-    private MarkService markService;
-
     @Autowired
     private MarkGroupService groupService;
 
@@ -73,6 +68,9 @@ public class ScoreController extends BaseExamController {
     @Autowired
     private ExamService examService;
 
+    @Autowired
+    private MarkService markService;
+
     @Autowired
     private ReportService reportService;
 
@@ -96,49 +94,48 @@ public class ScoreController extends BaseExamController {
     public ModelAndView list(HttpServletRequest request, ExamStudentSearchQuery query,
             @RequestParam(defaultValue = "0") Integer filter) {
         WebUser wu = RequestUtils.getWebUser(request);
-        int examId = getSessionExamId(request);
-        String subjectCode = RequestUtils.getSession(request).getParameter("subjectCode");
-        ModelAndView view = new ModelAndView("modules/exam/scoreList");
-        if (subjectCode != null) {
-            query.setSubjectCode(subjectCode);
+        List<Exam> examList = getExamList(wu);
+        if (query.getExamId() != null) {
+            query.setExamId(getSessionExamId(request));
         }
-        query.setExamId(examId);
-        query.orderByExamNumber();
-        if (filter == 1) {
-            query.setObjectiveScore(0d);
-            query.setSubjectiveScoreGt(0d);
-        } else if (filter == 2) {
-            query.setObjectiveScoreGt(0d);
-            query.setSubjectiveScore(0d);
-        }
-        query = studentService.findByQuery(query);
-        for (ExamStudent student : query.getResult()) {
-            buildSheetUrl(student);
-            buildPackageUrl(student);
-            buildAnswerUrl(student);
-            student.setAnswerUrl(PictureUrlBuilder
-                    .getAnswerJson(student.getExamId(), student.getSubjectCode(), student.getPaperType(),
-                            student.getExamNumber()));
-        }
-        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ?
-                enableExport(examId, query.getSubjectCode()) :
-                enableExport(examId);
-        if (exportMessage != null) {
-            view.addObject("exportMessage", exportMessage);
-            view.addObject("enableExport", false);
-        } else {
-            view.addObject("enableExport", true);
+        ModelAndView view = new ModelAndView("modules/exam/scoreList");
+        if (query.getExamId() != null) {
+            query.orderByExamNumber();
+            if (filter == 1) {
+                query.setObjectiveScore(0d);
+                query.setSubjectiveScoreGt(0d);
+            } else if (filter == 2) {
+                query.setObjectiveScoreGt(0d);
+                query.setSubjectiveScore(0d);
+            }
+            query = studentService.findByQuery(query);
+            for (ExamStudent student : query.getResult()) {
+                buildSheetUrl(student);
+                buildPackageUrl(student);
+                buildAnswerUrl(student);
+                student.setAnswerUrl(PictureUrlBuilder
+                        .getAnswerJson(student.getExamId(), student.getSubjectCode(), student.getPaperType(),
+                                student.getExamNumber()));
+            }
+            String exportMessage =
+                    query.getSubjectCode() != null ? enableExport(query.getExamId(), query.getSubjectCode()) : null;
+            if (exportMessage != null) {
+                view.addObject("exportMessage", exportMessage);
+                view.addObject("enableExport", false);
+            } else {
+                view.addObject("enableExport", true);
+            }
+            view.addObject("subjectList", getExamSubject(query.getExamId(), wu));
+            view.addObject("running", lockService.isLocked(LockType.SCORE_CALCULATE, query.getExamId()));
+            Exam exam = examService.findById(query.getExamId());
+            view.addObject("examType", exam.getType());
         }
         view.addObject("query", query);
         view.addObject("filter", filter);
-        view.addObject("subjectList", getExamSubject(examId, wu));
-        view.addObject("running", lockService.isLocked(LockType.SCORE_CALCULATE, examId));
         view.addObject("imageServer", imageServer);
         view.addObject("packageServer", packageServer);
         view.addObject("cardServer", cardServer);
         view.addObject("jsonServer", jsonServer);
-        Exam exam = examService.findById(examId);
-        view.addObject("examType", exam.getType());
         return view;
     }
 
@@ -202,11 +199,11 @@ public class ScoreController extends BaseExamController {
     @Logging(menu = "重新统分", type = LogType.UPDATE)
     @RequestMapping("/calculate")
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public ModelAndView calculate(HttpServletRequest request) {
-        int examId = getSessionExamId(request);
+    public ModelAndView calculate(HttpServletRequest request, @RequestParam Integer examId) {
         if (lockService.trylock(LockType.SCORE_CALCULATE, examId)) {
-            ScoreCalculateThread thread = new ScoreCalculateThread(examId, lockService, studentService, questionService,
-                    markService, reportService, examService, subjectService, groupService);
+            ScoreCalculateThread thread = new ScoreCalculateThread(examId, getSubjectCodeSet(examId), lockService,
+                    studentService, questionService, markService, reportService, examService, subjectService,
+                    groupService);
             taskExecutor.submit(thread);
         }
         return new ModelAndView("redirect:/admin/exam/score");
@@ -214,39 +211,57 @@ public class ScoreController extends BaseExamController {
 
     @Logging(menu = "导出成绩", type = LogType.EXPORT)
     @RequestMapping("/export")
+    @RoleRequire(Role.SCHOOL_ADMIN)
     public String export(ExamStudentSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser wu = RequestUtils.getWebUser(request);
-        int examId = getSessionExamId(request);
-        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ?
-                enableExport(examId, query.getSubjectCode()) :
-                enableExport(examId);
-        if (exportMessage == null && StringUtils.isNotBlank(query.getSubjectCode())) {
-            exportMessage = enableExport(examId, query.getSubjectCode());
-        }
-        if (exportMessage != null) {
-            addMessage(redirectAttributes, "评卷未结束不能导出成绩 " + exportMessage);
+        Exam exam = examService.findById(query.getExamId());
+        if (exam == null || !exam.getSchoolId().equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "请选择正确的考试");
             return "redirect:/admin/exam/score";
         }
-        query.setExamId(examId);
-        query.setPageNumber(1);
-        query.setPageSize(Integer.MAX_VALUE);
-        query = studentService.findByQuery(query);
+        Set<String> subjectSet = new HashSet<>();
+        //单科目导出
+        if (query.getSubjectCode() != null) {
+            String exportMessage = enableExport(query.getExamId(), query.getSubjectCode());
+            //判断不允许导出则直接返回
+            if (exportMessage != null) {
+                addMessage(redirectAttributes, "该科目不能导出成绩 " + exportMessage);
+                return "redirect:/admin/exam/score";
+            }
+            subjectSet.add(query.getSubjectCode());
+        }
+        //全体科目导出
+        else {
+            List<ExamSubject> list = subjectService.list(query.getExamId());
+            for (ExamSubject subject : list) {
+                //遍历所有科目,判断是否允许导出
+                if (enableExport(subject.getExamId(), subject.getCode()) == null) {
+                    subjectSet.add(subject.getCode());
+                }
+            }
+        }
         String fileName = "成绩单.xlsx";
         String paperType = null;
         try {
-            List<ExamStudentDTO> list = new LinkedList<ExamStudentDTO>();
-            for (ExamStudent student : query.getResult()) {
-                if (student.isBreach() || student.isAbsent()) {
-                    student.setObjectiveScore(0d);
-                    student.setSubjectiveScore(0d);
-                } else if (paperType == null) {
-                    paperType = student.getPaperType();
+            List<ExamStudentDTO> list = new LinkedList<>();
+            for (String subjectCode : subjectSet) {
+                query.setSubjectCode(subjectCode);
+                query.setPageNumber(1);
+                query.setPageSize(Integer.MAX_VALUE);
+                query = studentService.findByQuery(query);
+                for (ExamStudent student : query.getResult()) {
+                    if (student.isBreach() || student.isAbsent()) {
+                        student.setObjectiveScore(0d);
+                        student.setSubjectiveScore(0d);
+                    } else if (paperType == null) {
+                        paperType = student.getPaperType();
+                    }
+                    list.add(new ExamStudentDTO(student));
                 }
-                list.add(new ExamStudentDTO(student));
             }
-            if (StringUtils.isNotBlank(query.getSubjectCode()) && !query.getResult().isEmpty()) {
-                List<String> headerList = getOptionHeader(examId, query.getSubjectCode(), paperType);
+            if (query.getSubjectCode() != null && !list.isEmpty()) {
+                List<String> headerList = getOptionHeader(query.getExamId(), query.getSubjectCode(), paperType);
                 ExportStudentExcel excel = new ExportStudentExcel("成绩单", headerList, ExamStudentDTO.class);
                 excel.setDataList(list, true);
                 excel.write(response, fileName).dispose();
@@ -260,10 +275,10 @@ public class ScoreController extends BaseExamController {
         }
     }
 
-    private List<String> getOptionHeader(int examId, String subjectCode, String paerType) {
+    private List<String> getOptionHeader(int examId, String subjectCode, String paperType) {
         List<String> headerList = new ArrayList<String>();
         List<ExamQuestion> oQuestions = questionService
-                .findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true, paerType);
+                .findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true, paperType);
         List<ExamQuestion> sQestions = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
         for (ExamQuestion examQuestion : oQuestions) {
             headerList.add(getTitle(examQuestion) + "选项");
@@ -281,15 +296,10 @@ public class ScoreController extends BaseExamController {
 
     @RequestMapping("/enableExport")
     @ResponseBody
-    public JSONObject query(HttpServletRequest request, @RequestParam(required = false) String subjectCode) {
-        int examId = getSessionExamId(request);
+    public JSONObject query(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String subjectCode) {
         JSONObject obj = new JSONObject();
-        String exportMessage = null;
-        if (StringUtils.isNotBlank(subjectCode)) {
-            exportMessage = enableExport(examId, subjectCode);
-        } else {
-            exportMessage = enableExport(examId);
-        }
+        String exportMessage = enableExport(examId, subjectCode);
         if (exportMessage != null) {
             obj.accumulate("enableExport", false);
             obj.accumulate("exportMessage", exportMessage);
@@ -381,58 +391,20 @@ public class ScoreController extends BaseExamController {
         }
     }
 
-    private String enableExport(int examId) {
-        Exam exam = examService.findById(examId);
-        if (exam.isNeedCalculate()) {
-            String message = "该考试需要统分";
-            return message;
-        }
-
-        if (checkStudentService.countByExamIdAndChecked(examId, false) != 0) {
-            String message = "人工确认未完成";
-            return message;
-        }
-
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setUpload(false);
-        query.setManualAbsent(false);
-        long unUploadManualAbsentCount = studentService.countByQuery(query);
-        if (unUploadManualAbsentCount > 0) {
-            String message = "未上传考生必须人工指定缺考";
-            return message;
-        }
-
-        List<ExamSubject> subjects = subjectService.list(examId);
-        for (ExamSubject examSubject : subjects) {
-            List<MarkGroup> groups = groupService
-                    .findByExamAndSubjectAndStatus(examId, examSubject.getCode(), MarkStatus.FORMAL, MarkStatus.TRIAL);
-            if (groups != null && !groups.isEmpty()) {
-                String message = examSubject.getCode() + " 科目未评卷完成";
-                return message;
-            }
-
-        }
-        return null;
-    }
-
     private String enableExport(int examId, String subjectCode) {
-        Exam exam = examService.findById(examId);
-        if (exam.isNeedCalculate()) {
-            String message = "该考试需要统分";
-            return message;
+        ExamSubject subject = subjectService.find(examId, subjectCode);
+        if (subject == null || subject.isNeedCalculate()) {
+            return "该科目需要统分";
         }
 
         List<MarkGroup> groups = groupService
                 .findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL, MarkStatus.TRIAL);
         if (groups != null && !groups.isEmpty()) {
-            String message = subjectCode + " 科目未评卷完成";
-            return message;
+            return subjectCode + "评卷未完成";
         }
 
         if (checkStudentService.countByExamIdAndSubjectCodeAndChecked(examId, subjectCode, false) != 0) {
-            String message = "人工确认未完成";
-            return message;
+            return subjectCode + "人工确认未完成";
         }
 
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
@@ -442,11 +414,18 @@ public class ScoreController extends BaseExamController {
         query.setSubjectCode(subjectCode);
         long unUploadManualAbsentCount = studentService.countByQuery(query);
         if (unUploadManualAbsentCount > 0) {
-            String message = "未上传考生必须人工指定缺考";
-            return message;
+            return "未上传考生必须人工指定缺考";
         }
-
         return null;
     }
 
+    private Set<String> getSubjectCodeSet(Integer examId) {
+        List<ExamSubject> list = subjectService.list(examId);
+        Set<String> set = new HashSet<>();
+        for (ExamSubject subject : list) {
+            set.add(subject.getCode());
+        }
+        return set;
+    }
+
 }

+ 53 - 55
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java

@@ -1,23 +1,7 @@
 package cn.com.qmth.stmms.admin.thread;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
@@ -25,6 +9,11 @@ import cn.com.qmth.stmms.biz.report.utils.ReportContext;
 import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
 import cn.com.qmth.stmms.biz.utils.ScoreInfo;
 import cn.com.qmth.stmms.common.enums.LockType;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
 
 public class ScoreCalculateThread implements Runnable {
 
@@ -38,6 +27,8 @@ public class ScoreCalculateThread implements Runnable {
 
     private int examId;
 
+    private Set<String> subjectCodeSet;
+
     private LockService lockService;
 
     private ReportService reportService;
@@ -58,10 +49,12 @@ public class ScoreCalculateThread implements Runnable {
 
     private ReportContext context;
 
-    public ScoreCalculateThread(int examId, LockService lockService, ExamStudentService studentService,
-            ExamQuestionService questionService, MarkService markService, ReportService reportService,
-            ExamService examService, ExamSubjectService subjectService, MarkGroupService groupService) {
+    public ScoreCalculateThread(int examId, Set<String> subjectCodeSet, LockService lockService,
+            ExamStudentService studentService, ExamQuestionService questionService, MarkService markService,
+            ReportService reportService, ExamService examService, ExamSubjectService subjectService,
+            MarkGroupService groupService) {
         this.examId = examId;
+        this.subjectCodeSet = subjectCodeSet != null ? subjectCodeSet : new HashSet<>();
         this.lockService = lockService;
         this.studentService = studentService;
         this.questionService = questionService;
@@ -70,45 +63,50 @@ public class ScoreCalculateThread implements Runnable {
         this.examService = examService;
         this.subjectService = subjectService;
         this.groupService = groupService;
-        this.objectiveMap = new HashMap<String, List<ExamQuestion>>();
-        this.subjectiveMap = new HashMap<String, List<ExamQuestion>>();
-        this.subjectMap = new HashMap<String, ExamSubject>();
-        this.groupMap = new HashMap<String, List<MarkGroup>>();
+        this.objectiveMap = new HashMap<>();
+        this.subjectiveMap = new HashMap<>();
+        this.subjectMap = new HashMap<>();
+        this.groupMap = new HashMap<>();
     }
 
     @Override
     public void run() {
-        log.info("start calculate for examId=" + examId);
+        log.info("start calculate for examId=" + examId + ", subjectCode count=" + subjectCodeSet.size());
         try {
             // 获取考试信息
             Exam exam = examService.findById(examId);
-            // 删除原有统计数据
-            reportService.deleteData(examId);
-            context = new ReportContext(exam);
-            long totalCount = studentService.countByExamId(examId);
-
-            int pageNumber = 1;
-            int pageSize = 1000;
-            List<ExamStudent> list = studentService.findByExamId(examId, pageNumber, pageSize);
-            while (list != null && list.size() > 0) {
-                for (ExamStudent student : list) {
-                    // 先统分
-                    calculate(student);
-                    // 后统计
-                    statistic(student);
-                }
-                double process = pageSize * pageNumber * 100.0 / totalCount;
-                if (process >= 100) {
-                    process = 99;
+            for (String subjectCode : subjectCodeSet) {
+                log.info("start calculate for examId=" + examId + ", subjectCode=" + subjectCode);
+                // 删除原有统计数据
+                reportService.deleteData(examId, subjectCode);
+                context = new ReportContext(exam);
+                long totalCount = studentService.countByExamIdAndSubjectCode(examId, subjectCode);
+
+                int pageNumber = 1;
+                int pageSize = 1000;
+                List<ExamStudent> list = studentService
+                        .findByExamIdAndSubjectCode(examId, subjectCode, pageNumber, pageSize);
+                while (list != null && list.size() > 0) {
+                    for (ExamStudent student : list) {
+                        // 先统分
+                        calculate(student);
+                        // 后统计
+                        statistic(student);
+                    }
+                    double process = pageSize * pageNumber * 100.0 / totalCount;
+                    if (process >= 100) {
+                        process = 99;
+                    }
+                    examService.updateProcess(examId, process);
+                    pageNumber++;
+                    list = studentService.findByExamId(examId, pageNumber, pageSize);
                 }
-                examService.updateProcess(examId, process);
-                pageNumber++;
-                list = studentService.findByExamId(examId, pageNumber, pageSize);
+                context.save();
+                // 统分结束修改标记
+                subjectService.updateNeedCalculate(examId, subjectCode, false);
+                examService.updateProcess(examId, null);
+                log.info("finish calculate for examId=" + examId + ", subjectCode=" + subjectCode);
             }
-            context.save();
-            // 统分结束修改标记
-            examService.updateNeedCalculate(examId, false);
-            examService.updateProcess(examId, null);
         } catch (Exception e) {
             log.error("calculate exception for examId=" + examId, e);
         } finally {
@@ -124,8 +122,8 @@ public class ScoreCalculateThread implements Runnable {
         }
         try {
             ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
-            ScoreInfo info = util.calculate(findQuestionList(student.getSubjectCode(), student.getPaperType(), true),
-                    null);
+            ScoreInfo info = util
+                    .calculate(findQuestionList(student.getSubjectCode(), student.getPaperType(), true), null);
 
             student.setObjectiveScore(info.getObjectiveScore());
             student.setScoreList(info.getScoreList(), true);
@@ -152,8 +150,8 @@ public class ScoreCalculateThread implements Runnable {
             String key = subjectCode + "_" + StringUtils.trimToEmpty(paperType);
             List<ExamQuestion> list = objectiveMap.get(key);
             if (list == null) {
-                list = questionService.findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true,
-                        paperType);
+                list = questionService
+                        .findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true, paperType);
                 objectiveMap.put(key, list);
             }
             return list;

+ 293 - 255
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp

@@ -1,131 +1,143 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>成绩查询</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+    <title>成绩查询</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
 </head>
 <body>
-	<form id="searchForm" action="${ctx}/admin/exam/score" method="post" class="breadcrumb form-search">
-		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
-		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
-		<div>
-			<label>姓名</label>
-			<input type="text" name="name" value="${query.name}"  maxlength="10" class="input-mini"/>
-			<label>准考证号</label>
-			<input type="text" name="examNumber" value="${query.examNumber}" maxlength="50" class="input-small"/>
-			<label>学号</label>
-			<input type="text" name="studentCode" value="${query.studentCode}" maxlength="30" class="input-small"/>
-			<label>科目</label>
-			<select class="input-large" name="subjectCode" id="subject-select">
-				<option value="">请选择</option>
-				<c:forEach items="${subjectList}" var="subject">
-				<option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
-				</c:forEach>
-			</select>
-			<label>筛选</label>
-			<select class="input-medium" name="filter">
-				<option value="0">无</option>
-				<option value="1" <c:if test="${filter==1}">selected</c:if>>客观0分,主观有分</option>
-				<option value="2" <c:if test="${filter==2}">selected</c:if>>客观有分,主观0分</option>
-			</select>
-			<label>是否缺考</label>
-			<select id="absent" name="absent" class="input-small">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${query.absent!=null && query.absent==true}">selected</c:if>>缺考</option>
-				<option value="0" <c:if test="${query.absent!=null && query.absent==false}">selected</c:if>>正常</option>
-			</select>
-            <label>是否上传</label>
-            <select id="upload" name="upload" class="input-small">
-                <option value="">不限</option>
-                <option value="1" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
-                <option value="0" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
-            </select>
-            <label>是否违纪</label>
-            <select id="breach" name="breach" class="input-small">
-                <option value="">不限</option>
-                <option value="1" <c:if test="${query.breach!=null && query.breach==true}">selected</c:if>>违纪</option>
-                <option value="0" <c:if test="${query.breach!=null && query.breach==false}">selected</c:if>>正常</option>
-            </select>
-            <br/><br/>
-            <!--     总分 > startScore and 总分 <=endScore             -->
-			<label>总分:从</label>
-			<input  type="text" number="true" id="startScroe"  name="startScroe"value="${query.startScroe}" class="input-mini"/>
-			<label> 到&nbsp;&nbsp;&nbsp;</label>
-			<input type="text"  number="true" id="endScroe" name="endScroe"  value="${query.endScroe}"  class="input-mini"/>
-			
-			<label>学院</label>
-			<input type="text" name="college" value="${query.college}"  maxlength="10" class="input-mini"/>
-			<label>班级</label>
-			<input type="text" name="className" value="${query.className}"  maxlength="10" class="input-mini"/>
-			<label>任课老师</label>
-			<input type="text" name="teacher" value="${query.teacher}"  maxlength="10" class="input-mini"/>
-			
-			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-			&nbsp;
-			<c:if test="${!web_user.schoolViewer }">
-			<input id="export-button" class="btn" type="button" value="导出" onclick="goExport()"<c:if test="${!enableExport}">disabled="ture"</c:if> title="${exportMessage}"/>
-			</c:if>
-			<c:if test="${web_user.schoolAdmin}">
-			&nbsp;
-			<c:if test="${running==false}">
-			<a href="${ctx}/admin/exam/score/calculate" class="btn">重新统分</a>
-			</c:if>
-			<c:if test="${running==true}">
-			<a href="javascript:void(0)" class="btn" id="exam-process" disabled >正在统分</a>
-			</c:if>
-			</c:if>
-		</div>
-	</form>
-	<tags:message content="${message}"/>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed"> 
-		<thead>
-			<tr>
-				<th>准考证号</th>
-				<th>姓名</th>
-				<th>学号</th>
-				<th>科目</th>
-				<th>层次</th>
-				<th>专业类型</th>
-				<th>客观总分</th>
-				<th>主观总分</th>
-				<th>全卷总分</th>
-				<th>是否缺考</th>
-				<th>是否上传</th>
-				<th>是否违纪</th>
-				<th>查看图片</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${query.result}" var="student">
-			<tr>
-				<td>
-				<c:if test="${examType=='MULTI_MEDIA'}">${student.examNumber}</c:if>
-				<c:if test="${examType!='MULTI_MEDIA'}">
-				<a href="##" class="detail-link" data-exam-number="${student.examNumber}">${student.examNumber}</a>
-				</c:if>
-				</td>
-				<td>${student.name}</td>
-				<td>${student.studentCode}</td>
-				<td>${student.subjectCode}-${student.subjectName}&nbsp;${student.subjectRemark}</td>
-				<td>${student.subjectLevel}</td>
-				<td>${student.subjectCategory}</td>
-				<td style="text-align: center;">
-                    <c:choose>
-                        <c:when test="${student.absent == true || student.upload == false }">
-                            -
-                        </c:when>
-                        <c:when test="${student.breach == true}">
-                            0
-                        </c:when>
-                        <c:otherwise>
-                            ${student.objectiveScoreString}
-                        </c:otherwise>
-                    </c:choose>
-                </td>
-				<td style="text-align: center;">
+<form id="searchForm" action="${ctx}/admin/exam/score" method="post" class="breadcrumb form-search">
+    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
+    <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+    <div>
+        <label>考试</label>
+        <select class="input-large" name="examId" id="exam-select">
+            <c:forEach items="${examList}" var="exam">
+                <option value="${exam.id}" <c:if test="${exam.id==query.examId}">selected</c:if>>${exam.id}-${exam.name}</option>
+            </c:forEach>
+        </select>
+        <label>科目</label>
+        <select class="input-large" name="subjectCode" id="subject-select">
+            <c:if test="${subjectList}">
+                <option value="">请选择</option>
+                <c:forEach items="${subjectList}" var="subject">
+                    <option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
+                </c:forEach>
+            </c:if>
+        </select>
+        <label>姓名</label>
+        <input type="text" name="name" value="${query.name}" maxlength="10" class="input-mini"/>
+        <label>准考证号</label>
+        <input type="text" name="examNumber" value="${query.examNumber}" maxlength="50" class="input-small"/>
+        <label>学号</label>
+        <input type="text" name="studentCode" value="${query.studentCode}" maxlength="30" class="input-small"/>
+        <label>筛选</label>
+        <select class="input-medium" name="filter">
+            <option value="0">无</option>
+            <option value="1" <c:if test="${filter==1}">selected</c:if>>客观0分,主观有分</option>
+            <option value="2" <c:if test="${filter==2}">selected</c:if>>客观有分,主观0分</option>
+        </select>
+        <label>是否缺考</label>
+        <select id="absent" name="absent" class="input-small">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${query.absent!=null && query.absent==true}">selected</c:if>>缺考</option>
+            <option value="0" <c:if test="${query.absent!=null && query.absent==false}">selected</c:if>>正常</option>
+        </select>
+        <label>是否上传</label>
+        <select id="upload" name="upload" class="input-small">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
+            <option value="0" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
+        </select>
+        <label>是否违纪</label>
+        <select id="breach" name="breach" class="input-small">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${query.breach!=null && query.breach==true}">selected</c:if>>违纪</option>
+            <option value="0" <c:if test="${query.breach!=null && query.breach==false}">selected</c:if>>正常</option>
+        </select>
+        <br/><br/>
+        <!--     总分 > startScore and 总分 <=endScore             -->
+        <label>总分:从</label>
+        <input type="text" number="true" id="startScroe" name="startScroe" value="${query.startScroe}" class="input-mini"/>
+        <label> 到&nbsp;&nbsp;&nbsp;</label>
+        <input type="text" number="true" id="endScroe" name="endScroe" value="${query.endScroe}" class="input-mini"/>
+        
+        <label>学院</label>
+        <input type="text" name="college" value="${query.college}" maxlength="10" class="input-mini"/>
+        <label>班级</label>
+        <input type="text" name="className" value="${query.className}" maxlength="10" class="input-mini"/>
+        <label>任课老师</label>
+        <input type="text" name="teacher" value="${query.teacher}" maxlength="10" class="input-mini"/>
+        
+        <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+        &nbsp;
+        <c:if test="${!web_user.schoolViewer }">
+            <input id="export-button" class="btn" type="button" value="导出" onclick="goExport()"
+                   <c:if test="${!enableExport}">disabled="ture"</c:if> title="${exportMessage}"/>
+        </c:if>
+        <c:if test="${web_user.schoolAdmin}">
+            &nbsp;
+            <c:if test="${running==false}">
+                <a href="${ctx}/admin/exam/score/calculate?examId=${query.examId}" class="btn">重新统分</a>
+            </c:if>
+            <c:if test="${running==true}">
+                <a href="javascript:void(0)" class="btn" id="exam-process" disabled>正在统分</a>
+            </c:if>
+        </c:if>
+    </div>
+</form>
+<tags:message content="${message}"/>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>准考证号</th>
+        <th>姓名</th>
+        <th>学号</th>
+        <th>科目</th>
+        <th>层次</th>
+        <th>专业类型</th>
+        <th>客观总分</th>
+        <th>主观总分</th>
+        <th>全卷总分</th>
+        <th>是否缺考</th>
+        <th>是否上传</th>
+        <th>是否违纪</th>
+        <th>查看图片</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${query.result}" var="student">
+        <tr>
+            <td>
+                <c:if test="${examType=='MULTI_MEDIA'}">${student.examNumber}</c:if>
+                <c:if test="${examType!='MULTI_MEDIA'}">
+                    <a href="##" class="detail-link" data-exam-number="${student.examNumber}">${student.examNumber}</a>
+                </c:if>
+            </td>
+            <td>${student.name}</td>
+            <td>${student.studentCode}</td>
+            <td>${student.subjectCode}-${student.subjectName}&nbsp;${student.subjectRemark}</td>
+            <td>${student.subjectLevel}</td>
+            <td>${student.subjectCategory}</td>
+            <td style="text-align: center;">
+                <c:choose>
+                    <c:when test="${student.absent == true || student.upload == false }">
+                        -
+                    </c:when>
+                    <c:when test="${student.breach == true}">
+                        0
+                    </c:when>
+                    <c:otherwise>
+                        ${student.objectiveScoreString}
+                    </c:otherwise>
+                </c:choose>
+            </td>
+            <td style="text-align: center;">
                 <c:choose>
                     <c:when test="${student.absent == true || student.upload == false }">
                         -
@@ -137,147 +149,173 @@
                         ${student.subjectiveScoreString}
                     </c:otherwise>
                 </c:choose>
-                </td>
-				<td style="text-align: center;">
-                    <c:choose>
-                        <c:when test="${student.absent == true || student.upload == false }">
-                           -
-                        </c:when>
-                        <c:when test="${student.breach == true}">
-                           0
-                        </c:when>
-                        <c:otherwise>
-                            ${student.totalScoreString}
-                        </c:otherwise>
-                    </c:choose>
-				</td>
-				<td>
-					<!--在成绩查询页面 未上传或者缺考的情况都判断为缺考情况 -->
-					<c:if test="${student.absent == true || student.upload == false }">
-						缺考
-					</c:if>
-				</td>
-                <td>
-                    <c:choose>
-                        <c:when test="${student.upload == false }">
-                            未上传
-                        </c:when>
-                        <c:otherwise>
-                            已上传
-                        </c:otherwise>
-                    </c:choose>
-                </td>
-                <td>
-                    <c:if test="${student.breach == true}">
-                        违纪
+            </td>
+            <td style="text-align: center;">
+                <c:choose>
+                    <c:when test="${student.absent == true || student.upload == false }">
+                        -
+                    </c:when>
+                    <c:when test="${student.breach == true}">
+                        0
+                    </c:when>
+                    <c:otherwise>
+                        ${student.totalScoreString}
+                    </c:otherwise>
+                </c:choose>
+            </td>
+            <td>
+                <!--在成绩查询页面 未上传或者缺考的情况都判断为缺考情况 -->
+                <c:if test="${student.absent == true || student.upload == false }">
+                    缺考
+                </c:if>
+            </td>
+            <td>
+                <c:choose>
+                    <c:when test="${student.upload == false }">
+                        未上传
+                    </c:when>
+                    <c:otherwise>
+                        已上传
+                    </c:otherwise>
+                </c:choose>
+            </td>
+            <td>
+                <c:if test="${student.breach == true}">
+                    违纪
+                </c:if>
+            </td>
+            <td>
+                <c:if test="${student.upload==true}">
+                    <c:if test="${examType!='MULTI_MEDIA'}">
+                        <a class="sheet-link" href="##" data-id="${student.id}" data-sheet-url="${student.sheetUrlString}"
+                           data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>"
+                           data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
+                        <a href="${ctx}/admin/exam/track/student/${student.id}" target="_blank">轨迹图</a>
                     </c:if>
-                </td>
-				<td>
-				    <c:if test="${student.upload==true}">
-				    	<c:if test="${examType!='MULTI_MEDIA'}">
-	 					<a class="sheet-link" href="##" data-id="${student.id}" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>" data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
- 						<a href="${ctx}/admin/exam/track/student/${student.id}" target="_blank">轨迹图</a>
-						</c:if>
-						<c:if test="${examType=='MULTI_MEDIA'}">
-						<a class="json-link" href="${ctx}/admin/exam/library/getJson?studentId=${student.id}" target="_blank">原图</a> 
-						</c:if>
-					</c:if>
-					<c:if test="${student.packageUrlString!=null && student.packageUrlString!=''}">
-					<a class="package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">签到表</a>
-					</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-	<%@include file="/WEB-INF/views/include/sheetTagView.jsp" %>
-	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
+                    <c:if test="${examType=='MULTI_MEDIA'}">
+                        <a class="json-link" href="${ctx}/admin/exam/library/getJson?studentId=${student.id}" target="_blank">原图</a>
+                    </c:if>
+                </c:if>
+                <c:if test="${student.packageUrlString!=null && student.packageUrlString!=''}">
+                    <a class="package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">签到表</a>
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${query}</div>
+<%@include file="/WEB-INF/views/include/sheetTagView.jsp" %>
+<%@include file="/WEB-INF/views/include/imageView.jsp" %>
 <script type="text/javascript">
-$(document).ready(function() {
-	$("#searchForm").validate();
-    
-    $('.detail-link').click(function(){
-    	var url = '${ctx}/admin/exam/score/detail?examNumber=' + $(this).attr('data-exam-number') + '&queryString=' + encodeURIComponent($('#searchForm').serialize());
-    	window.location.href = url;
+    $(document).ready(function () {
+        $("#searchForm").validate();
+
+        $('.detail-link').click(function () {
+            var url = '${ctx}/admin/exam/score/detail?examNumber=' + $(this).attr('data-exam-number') + '&queryString=' + encodeURIComponent($('#searchForm').serialize());
+            window.location.href = url;
+        });
+        $('.sheet-link').click(function () {
+            initSheetTagPopover($(this).attr('data-id'), $(this).attr('data-title'), '', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+            //initSheetPopover($(this).attr('data-title'), '', $(this).attr('data-sheet-url'));
+            return false;
+        });
+        $('.package-link').click(function () {
+            initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
+            return false;
+        });
+        $('#exam-select').change(function () {
+            let examId = $('#exam-select').val();
+            $('#subject-select').empty();
+            $('#subject-select').append('<option value="">请选择</option>');
+            $.post('${ctx}/admin/exam/subject/list', {examId: examId}, function (list) {
+                for (let i = 0; i < list.length; i++) {
+                    let item = list.get(i);
+                    $('#subject-select').append('<option value="' + item.code + '">' + item.code + '-' + item.name + '</option>');
+                }
+                $('#subject-select').trigger('change');
+            });
+        })
+        $('#subject-select').change(function () {
+            let examId = $('#exam-select').val();
+            let subjectCode = $('#subject-select').val();
+            $.post('${ctx}/admin/exam/score/enableExport', {examId: examId, subjectCode: subjectCode}, function (result) {
+                if (result.enableExport) {
+                    $("#export-button").removeAttr("disabled");
+                    $("#export-button").removeAttr("title");
+                } else {
+                    $("#export-button").attr("disabled", "disabled");
+                    $("#export-button").attr("title", result.exportMessage);
+                }
+            });
+        });
+        var running = "${running}";
+        if (running == 'true') {
+            var timer = setInterval(function () {
+                getExamProcess(timer)
+            }, 5000);
+        }
     });
-    $('.sheet-link').click(function(){
-    	initSheetTagPopover($(this).attr('data-id'), $(this).attr('data-title'), '', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
-    	//initSheetPopover($(this).attr('data-title'), '', $(this).attr('data-sheet-url'));
+
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").attr('action', '${ctx}/admin/exam/score');
+        $("#searchForm").submit();
         return false;
-    });
-    $('.package-link').click(function(){
-    	initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
-    	return false;
-    });
-	var running = "${running}";
-	if(running=='true'){
-	    var timer = setInterval(function(){getExamProcess(timer)},5000);
-	}
-	
-});
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#pageSize").val(s);
-	$("#searchForm").attr('action','${ctx}/admin/exam/score');
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-    var startScroe = $("#startScroe").val();var endScore = $("#endScroe").val();
-    if(startScroe.length>0){
-        if(endScore.length == 0){
-            alert("请输入结束分数值!");return false;
+    }
+
+    function goSearch() {
+        var startScroe = $("#startScroe").val();
+        var endScore = $("#endScroe").val();
+        if (startScroe.length > 0) {
+            if (endScore.length == 0) {
+                alert("请输入结束分数值!");
+                return false;
+            }
         }
-    }if(endScore.length>0){
-        if(startScroe.length == 0){
-            alert("请输入开始分数值!");return false;
+        if (endScore.length > 0) {
+            if (startScroe.length == 0) {
+                alert("请输入开始分数值!");
+                return false;
+            }
         }
-    }if(endScore.length>0 && startScroe.length > 0){
-        if(parseInt(startScroe) > parseInt(endScore)){
-            alert("开始分值必须小于结束分值");return false;
+        if (endScore.length > 0 && startScroe.length > 0) {
+            if (parseInt(startScroe) > parseInt(endScore)) {
+                alert("开始分值必须小于结束分值");
+                return false;
+            }
         }
+        $("#pageNumber").val(1);
+        $("#pageSize").val('${query.pageSize}');
+        $("#searchForm").attr('action', '${ctx}/admin/exam/score');
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function goExport() {
+        $("#searchForm").attr('action', '${ctx}/admin/exam/score/export');
+        $("#searchForm").submit();
     }
-	$("#pageNumber").val(1);
-	$("#pageSize").val('${query.pageSize}');
-	$("#searchForm").attr('action','${ctx}/admin/exam/score');
-	$("#searchForm").submit();
-	return false;
-}
-function goExport(){
-	$("#searchForm").attr('action','${ctx}/admin/exam/score/export');
-	$("#searchForm").submit();
-}
-$('#subject-select').change(function(){
-    var code = $(this).val();
-    $.post('${ctx}/admin/exam/score/enableExport', {subjectCode: code}, function(result){
-        if(result.enableExport){
-        	$("#export-button").removeAttr("disabled");
-        	$("#export-button").removeAttr("title");
-        }else{
-	        $("#export-button").attr("disabled","disabled");
-        	$("#export-button").attr("title",result.exportMessage);
+
+    function getExamProcess(timer) {
+        var running = "${running}";
+        if (running == 'true') {
+            $.post('${ctx}/admin/exam/score/getProcess', function (result) {
+                if (result.running) {
+                    $("#exam-process").html("正在统分: " + result.process + "%");
+                } else {
+                    window.clearInterval(timer);
+                    window.location.reload();
+                }
+            });
+        } else {
+            window.clearInterval(timer);
+            window.location.reload();
         }
-    });
-});
-function getExamProcess(timer){
-	var running = "${running}";
-	if(running=='true'){
-		$.post('${ctx}/admin/exam/score/getProcess', function(result){
-			if(result.running){
-				$("#exam-process").html("正在统分: "+result.process+"%");
-			}else{
-				window.clearInterval(timer);
-				window.location.reload();
-			}
-	    });
-	}else{
-		window.clearInterval(timer);
-		window.location.reload();
-	}
-	
-}
 
-</script>	
+    }
+
+</script>
 </body>
 </html>