Forráskód Böngészése

评卷管理代码重构

luoshi 6 éve
szülő
commit
625d21273d
38 módosított fájl, 3646 hozzáadás és 3409 törlés
  1. 34 29
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  2. 153 154
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  3. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java
  4. 140 128
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  5. 93 82
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamSearchQuery.java
  6. 30 28
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java
  7. 111 108
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  8. 0 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java
  9. 39 50
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerService.java
  10. 149 139
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  11. 684 672
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  12. 0 87
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java
  13. 238 270
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java
  14. 37 28
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java
  15. 10 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkSpecialTagDao.java
  16. 43 39
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkTrackDao.java
  17. 10 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkSpecialTag.java
  18. 26 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/Task.java
  19. 0 143
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java
  20. 611 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  21. 0 151
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  22. 0 27
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java
  23. 140 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java
  24. 0 19
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/TaskService.java
  25. 19 13
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/CurrentTaskUtil.java
  26. 6 10
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java
  27. 108 106
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java
  28. 0 133
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  29. 11 32
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  30. 6 18
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java
  31. 342 345
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java
  32. 131 137
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TagController.java
  33. 0 23
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/quartz/ScheduleRunner.java
  34. 163 158
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java
  35. 19 46
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  36. 163 176
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkLeaderController.java
  37. 40 37
      stmms-web/src/main/webapp/WEB-INF/application.properties
  38. 87 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateProcess.jsp

+ 34 - 29
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java

@@ -1,29 +1,34 @@
-package cn.com.qmth.stmms.biz.exam.dao;
-
-import java.util.List;
-
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-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.exam.model.Exam;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-
-public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaSpecificationExecutor<Exam> {
-
-    public Page<Exam> findAll(Pageable pageable);
-
-    List<Exam> findByStatus(ExamStatus status);
-
-    @Query("select e from Exam e where e.creatorId=?1 and e.status=?2 order by e.examTime desc")
-    public List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status);
-
-    @Modifying
-    @Query("update Exam e set e.status=?2 where e.id=?1")
-    public void updateStatus(int examId, ExamStatus status);
-
-    public List<Exam> findBySchoolIdOrderByIdDesc(Integer schoolId);
-}
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+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.exam.model.Exam;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaSpecificationExecutor<Exam> {
+
+    public Page<Exam> findAll(Pageable pageable);
+
+    List<Exam> findByStatus(ExamStatus status);
+
+    @Query("select e from Exam e where e.creatorId=?1 and e.status=?2 order by e.examTime desc")
+    public List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status);
+
+    @Modifying
+    @Query("update Exam e set e.status=?2 where e.id=?1")
+    public void updateStatus(Integer examId, ExamStatus status);
+
+    @Modifying
+    @Query("update Exam e set e.uploadTime=?2 where e.id=?1")
+    public void updateUploadTime(Integer examId, Date uploadTime);
+
+    public List<Exam> findBySchoolIdOrderByIdDesc(Integer schoolId);
+}

+ 153 - 154
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -1,154 +1,153 @@
-package cn.com.qmth.stmms.biz.exam.dao;
-
-import java.util.Date;
-import java.util.List;
-
-import org.springframework.data.domain.Pageable;
-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.exam.model.ExamStudent;
-
-public interface ExamStudentDao
-        extends PagingAndSortingRepository<ExamStudent, Integer>, JpaSpecificationExecutor<ExamStudent> {
-
-    public List<ExamStudent> findByExamId(int examId, Pageable pageable);
-
-    public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent,
-            Pageable pageable);
-
-    public List<ExamStudent> findByExamIdAndCampusName(int examId, String campusName, Pageable pageable);
-
-    public List<ExamStudent> findByExamIdAndExamNumber(int examId, String examNumber);
-
-    @Query("select count(s) from ExamStudent s where s.examId=?1 and s.campusName=?2")
-    public long countByExamIdAndCampusName(int examId, String campusName);
-
-    @Query("select count(distinct s.campusName) from ExamStudent s where s.examId=?1")
-    public long countCampusNameByExamId(int examId);
-
-    @Query("select s from ExamStudent s where s.examId=?1 group by s.subjectCode")
-    public List<ExamStudent> findDistinctSubjectByExamId(int examId, Pageable pageable);
-
-    @Query("select s from ExamStudent s where s.examId=?1 and s.campusName=?2 group by s.subjectCode")
-    public List<ExamStudent> findDistinctSubjectByExamIdAndCampusName(int examId, String campusName);
-
-    @Query("select s.campusName from ExamStudent s where s.examId=?1 group by s.campusName")
-    public List<String> findDistinctCampusName(int examId);
-
-    @Query("select s from ExamStudent s where s.examId=?1 group by s.campusName")
-    public List<ExamStudent> findDistinctCampusName(int examId, Pageable pageable);
-
-    @Query("select count(c) from Campus c where exists (select s.id from ExamStudent s where "
-            + "c.schoolId=s.schoolId and c.name=s.campusName and s.examId=?1)")
-    public long countDistinctCampusName(int examId);
-
-    @Query("select s.packageCode from ExamStudent s where s.examId=?1 group by s.packageCode")
-    public List<String> findDistinctPackageCode(int examId);
-
-    @Modifying
-    @Query("update ExamStudent s set s.subjectiveScore=?2, s.subjectiveScoreList=?3 where s.id=?1")
-    public void updateSubjectiveScore(int id, double score, String scoreList);
-
-    @Modifying
-    @Query("update ExamStudent s set s.subjectName=?3, s.subjectLevel=?4, s.subjectCategory=?5 where s.examId=?1 and s.subjectCode=?2")
-    public void updateSubjectInfo(int examId, String subjectCode, String subjectName, String subjectLevel,
-            String subjectCategory);
-
-    @Modifying
-    @Query("update ExamStudent s set s.exception=?2 where s.id=?1")
-    public void updateException(int id, boolean exception);
-    
-    @Modifying
-    @Query("update ExamStudent s set s.manualAbsent=?2 where s.id=?1")
-    public void updateManualAbsent(int id, boolean manualAbsent);
-
-    @Modifying
-    @Query("update ExamStudent s set s.manualAbsent=?3 where s.examId=?1 and s.examNumber=?2")
-    public void updateManualAbsent(int examId, String examNumber, boolean manualAbsent);
-
-    @Modifying
-    @Query("update ExamStudent s set s.manualAbsent=0 where s.examId=?1")
-    public void clearManualAbsent(int examId);
-
-    @Modifying
-    @Query("delete from ExamStudent s where s.examId=?1")
-    public void deleteByExamId(int examId);
-
-    @Modifying
-    @Query("delete from ExamStudent s where s.examId=?1 and s.campusName=?2")
-    public void deleteByExamIdAndCampusName(int examId, String campusName);
-
-    public ExamStudent findByExamIdAndSubjectCodeAndStudentCode(Integer id, String subjectCode, String studentCode);
-
-    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
-            String studentCode, String examSeqCode);
-
-    public List<ExamStudent> findByExamIdAndUploadTimeAfter(int examId, Date date);
-
-    public List<ExamStudent> findByExamIdAndSubjectCodeAndUploadTimeAfter(int examId, String code, Date date,
-            Pageable page);
-
-    @Query("select count(s) from ExamStudent s where s.examId=?1 and s.subjectiveScoreList != null ")
-    public long countByExamIdAndSubjectiveScoreListNotNull(Integer examId);
-
-    public List<ExamStudent> findByExamIdAndSubjectCodeAndUploadTimeNotNull(int examId, String code);
-
-    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.absent=false and s.uploadTime!=null "
-            + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
-    public List<ExamStudent> findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Pageable page);
-
-    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.absent=false and s.uploadTime!=null and s.uploadTime>=?4 "
-            + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
-    public List<ExamStudent> findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Date minUploadTime,
-            Pageable page);
-
-    @Query("select s.id from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.absent=true and s.breach=true and "
-            + "exists (select l.id from MarkLibrary l where l.studentId=s.id)")
-    public List<Integer> findAbsentOrBreachLibraryStudent(int examId, String subjectCode);
-    
-    @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end),"
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
-    		+ " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 ")
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
-			String code, Boolean upload, boolean absent);
-
-    @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
-    		+ "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end), "
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
-    		+ " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 ")
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
-			String code);
-	
-    @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end),"
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
-            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
-            + " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 and s.breach = ?5")
-    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach);
-	
-	@Query(value="select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.login_name = ?1 ))",nativeQuery=true)
-    public List<String[]> findIdsByMarkLogin(String markLogin);
-        
-    @Query(value="select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.name = ?1))",nativeQuery=true)
-    public List<String[]> findIdsByMarkName(String markName);
-
-
-}
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.data.domain.Pageable;
+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.exam.model.ExamStudent;
+
+public interface ExamStudentDao
+        extends PagingAndSortingRepository<ExamStudent, Integer>, JpaSpecificationExecutor<ExamStudent> {
+
+    public List<ExamStudent> findByExamId(int examId, Pageable pageable);
+
+    public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent,
+            Pageable pageable);
+
+    public List<ExamStudent> findByExamIdAndCampusName(int examId, String campusName, Pageable pageable);
+
+    public List<ExamStudent> findByExamIdAndExamNumber(int examId, String examNumber);
+
+    @Query("select count(s) from ExamStudent s where s.examId=?1 and s.campusName=?2")
+    public long countByExamIdAndCampusName(int examId, String campusName);
+
+    @Query("select count(distinct s.campusName) from ExamStudent s where s.examId=?1")
+    public long countCampusNameByExamId(int examId);
+
+    @Query("select s from ExamStudent s where s.examId=?1 group by s.subjectCode")
+    public List<ExamStudent> findDistinctSubjectByExamId(int examId, Pageable pageable);
+
+    @Query("select s from ExamStudent s where s.examId=?1 and s.campusName=?2 group by s.subjectCode")
+    public List<ExamStudent> findDistinctSubjectByExamIdAndCampusName(int examId, String campusName);
+
+    @Query("select s.campusName from ExamStudent s where s.examId=?1 group by s.campusName")
+    public List<String> findDistinctCampusName(int examId);
+
+    @Query("select s from ExamStudent s where s.examId=?1 group by s.campusName")
+    public List<ExamStudent> findDistinctCampusName(int examId, Pageable pageable);
+
+    @Query("select count(c) from Campus c where exists (select s.id from ExamStudent s where "
+            + "c.schoolId=s.schoolId and c.name=s.campusName and s.examId=?1)")
+    public long countDistinctCampusName(int examId);
+
+    @Query("select s.packageCode from ExamStudent s where s.examId=?1 group by s.packageCode")
+    public List<String> findDistinctPackageCode(int examId);
+
+    @Modifying
+    @Query("update ExamStudent s set s.subjectiveScore=?2, s.subjectiveScoreList=?3 where s.id=?1")
+    public void updateSubjectiveScore(int id, double score, String scoreList);
+
+    @Modifying
+    @Query("update ExamStudent s set s.subjectName=?3, s.subjectLevel=?4, s.subjectCategory=?5 where s.examId=?1 and s.subjectCode=?2")
+    public void updateSubjectInfo(int examId, String subjectCode, String subjectName, String subjectLevel,
+            String subjectCategory);
+
+    @Modifying
+    @Query("update ExamStudent s set s.exception=?2 where s.id=?1")
+    public void updateException(int id, boolean exception);
+
+    @Modifying
+    @Query("update ExamStudent s set s.manualAbsent=?2 where s.id=?1")
+    public void updateManualAbsent(int id, boolean manualAbsent);
+
+    @Modifying
+    @Query("update ExamStudent s set s.manualAbsent=?3 where s.examId=?1 and s.examNumber=?2")
+    public void updateManualAbsent(int examId, String examNumber, boolean manualAbsent);
+
+    @Modifying
+    @Query("update ExamStudent s set s.manualAbsent=0 where s.examId=?1")
+    public void clearManualAbsent(int examId);
+
+    @Modifying
+    @Query("delete from ExamStudent s where s.examId=?1")
+    public void deleteByExamId(int examId);
+
+    @Modifying
+    @Query("delete from ExamStudent s where s.examId=?1 and s.campusName=?2")
+    public void deleteByExamIdAndCampusName(int examId, String campusName);
+
+    public ExamStudent findByExamIdAndSubjectCodeAndStudentCode(Integer id, String subjectCode, String studentCode);
+
+    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
+            String studentCode, String examSeqCode);
+
+    public List<ExamStudent> findByExamIdAndUploadTimeAfter(int examId, Date date);
+
+    public List<ExamStudent> findByExamIdAndSubjectCodeAndUploadTimeAfter(int examId, String code, Date date,
+            Pageable page);
+
+    @Query("select count(s) from ExamStudent s where s.examId=?1 and s.subjectiveScoreList != null ")
+    public long countByExamIdAndSubjectiveScoreListNotNull(Integer examId);
+
+    public List<ExamStudent> findByExamIdAndSubjectCodeAndUploadTimeNotNull(int examId, String code);
+
+    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.absent=false and s.uploadTime!=null "
+            + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
+    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber,
+            Pageable page);
+
+    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.absent=false and s.uploadTime!=null and s.uploadTime>=?4 "
+            + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
+    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber,
+            Date minUploadTime, Pageable page);
+
+    @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.absent=true and s.breach=true and "
+            + "exists (select l.id from MarkLibrary l where l.studentId=s.id)")
+    public List<ExamStudent> findAbsentOrBreachLibraryStudent(Integer examId, String subjectCode);
+
+    @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end),"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
+            + " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 ")
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String code, Boolean upload, boolean absent);
+
+    @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end), "
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
+            + " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 ")
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String code);
+
+    @Query("select sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 49.9 then 1 else 0 end),"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 50 and 59.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 69.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 70 and 79.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 80 and 89.9 then 1 else 0 end) ,"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 90 and 100 then 1 else 0 end),"
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 0 and 59.9 then 1 else 0 end), "
+            + "sum(case when ((case when s.objectiveScore is null then 0 else s.objectiveScore end) + (case when s.subjectiveScore is null then 0 else s.subjectiveScore end)) between 60 and 100 then 1 else 0 end) "
+            + " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 and s.breach = ?5")
+    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
+            boolean breach);
+
+    @Query(value = "select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.login_name = ?1 ))", nativeQuery = true)
+    public List<String[]> findIdsByMarkLogin(String markLogin);
+
+    @Query(value = "select s.id from eb_exam_student s where 1=1 and s.id in (select m.student_id from m_library m where 1=1 and m.marker_id in (select m.id from eb_marker m where 1=1 and m.name = ?1))", nativeQuery = true)
+    public List<String[]> findIdsByMarkName(String markName);
+
+}

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java

@@ -15,6 +15,9 @@ import cn.com.qmth.stmms.common.enums.LibraryStatus;
 public interface MarkGroupDao
 public interface MarkGroupDao
         extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>, JpaSpecificationExecutor<MarkGroup> {
         extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>, JpaSpecificationExecutor<MarkGroup> {
 
 
+    @Query("select q from MarkGroup q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.number=?3")
+    MarkGroup findOne(Integer examId, String subjectCode, Integer groupNumber);
+
     @Modifying
     @Modifying
     @Query("delete from MarkGroup q where q.pk.examId=?1")
     @Query("delete from MarkGroup q where q.pk.examId=?1")
     void deleteByExamId(int examId);
     void deleteByExamId(int examId);

+ 140 - 128
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -1,128 +1,140 @@
-package cn.com.qmth.stmms.biz.exam.model;
-
-import java.io.Serializable;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-
-@Entity
-@Table(name = "eb_exam")
-public class Exam implements Serializable {
-
-    private static final long serialVersionUID = 5179623303410999209L;
-
-    public static final String SUBJECT_ID_SPLIT = ",";
-
-    @Id
-    @GeneratedValue
-    private Integer id;
-
-    private String name;
-
-    @Column(name = "school_id")
-    private Integer schoolId;
-
-    @Temporal(TemporalType.DATE)
-    @Column(name = "exam_time")
-    private Date examTime;
-
-    @Enumerated(EnumType.STRING)
-    @Column(name = "status", length = 16, nullable = false)
-    private ExamStatus status;
-
-    private String description;
-
-    @Temporal(TemporalType.TIMESTAMP)
-    @Column(name = "create_time")
-    private Date createTime;
-
-    @Temporal(TemporalType.TIMESTAMP)
-    @Column(name = "update_time")
-    private Date updateTime;
-
-    @Column(name = "creator_id")
-    private Integer creatorId;
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public Date getExamTime() {
-        return examTime;
-    }
-
-    public void setExamTime(Date examTime) {
-        this.examTime = examTime;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Integer getCreatorId() {
-        return creatorId;
-    }
-
-    public void setCreatorId(Integer creatorId) {
-        this.creatorId = creatorId;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    public ExamStatus getStatus() {
-        return status;
-    }
-
-    public void setStatus(ExamStatus status) {
-        this.status = status;
-    }
-
-    public Integer getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
-    }
-
-}
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+@Entity
+@Table(name = "eb_exam")
+public class Exam implements Serializable {
+
+    private static final long serialVersionUID = 5179623303410999209L;
+
+    public static final String SUBJECT_ID_SPLIT = ",";
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    private String name;
+
+    @Column(name = "school_id")
+    private Integer schoolId;
+
+    @Temporal(TemporalType.DATE)
+    @Column(name = "exam_time")
+    private Date examTime;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "status", length = 16, nullable = false)
+    private ExamStatus status;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "upload_time", nullable = true)
+    private Date uploadTime;
+
+    private String description;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "create_time")
+    private Date createTime;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    @Column(name = "creator_id")
+    private Integer creatorId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(Date examTime) {
+        this.examTime = examTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getCreatorId() {
+        return creatorId;
+    }
+
+    public void setCreatorId(Integer creatorId) {
+        this.creatorId = creatorId;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public ExamStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ExamStatus status) {
+        this.status = status;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Date getUploadTime() {
+        return uploadTime;
+    }
+
+    public void setUploadTime(Date uploadTime) {
+        this.uploadTime = uploadTime;
+    }
+
+}

+ 93 - 82
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamSearchQuery.java

@@ -1,82 +1,93 @@
-package cn.com.qmth.stmms.biz.exam.query;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import cn.com.qmth.stmms.biz.common.BaseQuery;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-
-public class ExamSearchQuery extends BaseQuery<Exam> {
-
-    private String name;
-
-    private Integer creatorId;
-
-    private Integer schoolId;
-
-    private Set<ExamStatus> statusSet;
-
-    private Set<Integer> ids;
-
-    private Boolean orderByCreateTimeDesc;
-
-    public Integer getCreatorId() {
-        return creatorId;
-    }
-
-    public void setCreatorId(Integer creatorId) {
-        this.creatorId = creatorId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Set<ExamStatus> getStatusSet() {
-        return statusSet;
-    }
-
-    public void addStatus(ExamStatus status) {
-        if (statusSet == null) {
-            statusSet = new HashSet<ExamStatus>();
-        }
-        if (status != null) {
-            statusSet.add(status);
-        }
-    }
-
-    public Set<Integer> getIds() {
-        return ids;
-    }
-
-    public void addId(Integer id) {
-        if (ids == null) {
-            ids = new HashSet<Integer>();
-        }
-        if (id != null) {
-            ids.add(id);
-        }
-    }
-
-    public Boolean getOrderByCreateTimeDesc() {
-        return orderByCreateTimeDesc;
-    }
-
-    public void setOrderByCreateTimeDesc(Boolean orderByCreateTimeDesc) {
-        this.orderByCreateTimeDesc = orderByCreateTimeDesc;
-    }
-
-    public Integer getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
-    }
-
-}
+package cn.com.qmth.stmms.biz.exam.query;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+public class ExamSearchQuery extends BaseQuery<Exam> {
+
+    private String name;
+
+    private Integer creatorId;
+
+    private Integer schoolId;
+
+    private Set<ExamStatus> statusSet;
+
+    private Set<Integer> ids;
+
+    private Boolean orderByCreateTimeDesc;
+
+    private Date uploadTimeGt;
+
+    public Integer getCreatorId() {
+        return creatorId;
+    }
+
+    public void setCreatorId(Integer creatorId) {
+        this.creatorId = creatorId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Set<ExamStatus> getStatusSet() {
+        return statusSet;
+    }
+
+    public void addStatus(ExamStatus status) {
+        if (statusSet == null) {
+            statusSet = new HashSet<ExamStatus>();
+        }
+        if (status != null) {
+            statusSet.add(status);
+        }
+    }
+
+    public Set<Integer> getIds() {
+        return ids;
+    }
+
+    public void addId(Integer id) {
+        if (ids == null) {
+            ids = new HashSet<Integer>();
+        }
+        if (id != null) {
+            ids.add(id);
+        }
+    }
+
+    public Boolean getOrderByCreateTimeDesc() {
+        return orderByCreateTimeDesc;
+    }
+
+    public void setOrderByCreateTimeDesc(Boolean orderByCreateTimeDesc) {
+        this.orderByCreateTimeDesc = orderByCreateTimeDesc;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Date getUploadTimeGt() {
+        return uploadTimeGt;
+    }
+
+    public void setUploadTimeGt(Date uploadTimeGt) {
+        this.uploadTimeGt = uploadTimeGt;
+    }
+
+}

+ 30 - 28
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java

@@ -1,28 +1,30 @@
-package cn.com.qmth.stmms.biz.exam.service;
-
-import java.util.List;
-
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-
-public interface ExamService {
-
-    Exam save(Exam exam);
-
-    Exam findById(Integer id);
-
-    void updateStatus(int id, ExamStatus status);
-
-    void deleteById(Integer id);
-
-    void delete(Exam exam);
-
-    ExamSearchQuery findByQuery(ExamSearchQuery query);
-
-    List<Exam> findByStatus(ExamStatus status);
-
-    List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status);
-
-	List<Exam> findBySchoolId(Integer schoolId);
-}
+package cn.com.qmth.stmms.biz.exam.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+public interface ExamService {
+
+    Exam save(Exam exam);
+
+    Exam findById(Integer id);
+
+    void updateStatus(int id, ExamStatus status);
+
+    void deleteById(Integer id);
+
+    void delete(Exam exam);
+
+    ExamSearchQuery findByQuery(ExamSearchQuery query);
+
+    List<Exam> findByStatus(ExamStatus status);
+
+    List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status);
+
+    List<Exam> findBySchoolId(Integer schoolId);
+
+    void updateUploadTime(Integer id);
+}

+ 111 - 108
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -1,108 +1,111 @@
-package cn.com.qmth.stmms.biz.exam.service;
-
-import java.util.Date;
-import java.util.List;
-
-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.query.ExamStudentSearchQuery;
-
-public interface ExamStudentService {
-
-    public ExamStudent findById(int id);
-
-    public int batchSave(List<ExamStudent> list);
-
-    public ExamStudent save(ExamStudent student);
-
-    public void deleteById(int id);
-
-    public void delete(ExamStudent student);
-
-    public void deleteByExamId(int examId);
-
-    public ExamStudentSearchQuery findByQuery(ExamStudentSearchQuery query);
-
-    public long countByQuery(final ExamStudentSearchQuery query);
-
-    List<ExamStudent> findByExamId(int examId);
-
-    List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent, int pageNumber,
-            int pageSize);
-
-    ExamStudent findByExamIdAndExamNumber(int examId, String examNumber);
-
-    public long countByExamId(int examId);
-
-    public long countByExamIdAndSubjectCode(int examId, String subjectCode);
-
-    public long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload);
-
-    List<String> findDistinctCampusName(int examId);
-
-    ExamStudentSearchQuery findDistinctCampusName(ExamStudentSearchQuery query);
-
-    List<ExamStudent> findByExamIdAndCampusName(int examId, String campusCode, int pageNumber, int pageSize);
-
-    List<String> findDistinctPackageCode(int examId);
-
-    long countByExamIdAndCampusName(int examId, String campusName);
-
-    long countByExamIdAndCampusName(int examId, String campusName, boolean upload);
-
-    long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload, boolean absent);
-
-    long countCampusByExam(int examId);
-
-    long countByExamIdAndUpload(int examId, boolean upload);
-
-    void updateSubjectInfo(ExamSubject subject);
-
-    void updateSubjectiveScore(int id, double score, String scoreList);
-    
-    void updateManualAbsent(int id, boolean manualAbsent);
-
-    void updateManualAbsent(int examId, String examNumber, boolean manualAbsent);
-    
-    void clearManualAbsent(int examId);
-
-    void updateException(int id, boolean exception);
-
-    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCode(Integer schoolId, String subjectCode,
-            String studentCode);
-
-    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
-            String studentCode, String examSeqCode);
-
-    public ExamStudent findByExamIdAndSubjectCodeAndUploadTimeAfter(int examId, String code, Date date);
-
-    public List<ExamStudent> findByExamIdAndUploadTimeAfter(int examId, Date date);
-
-    public long countByExamIdAndSubjectiveScoreListIsNotNull(Integer examId);
-
-    List<ExamStudent> findUploadedByExamIdAndSubjectCode(int examId, String code);
-
-    ExamStudent findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Date minUploadTime);
-
-    List<Integer> findAbsentOrBreachLibraryStudent(int examId, String subjectCode);
-
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,String subjectCode);
-
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,String subjectCode, boolean upload, boolean absent);
-
-	public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String code,
-			String campusName, boolean upload, boolean absent);
-
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,boolean breach);
-
-    public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach);
-	
-	public String findIdsByMarkLogin(String markLogin);
-	
-	public String findIdsByMarkName(String markName);
-
-    List<ExamStudent> findByExamId(int examId,int pageNumber,int pageSize);
-
-    List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach);
-
-}
+package cn.com.qmth.stmms.biz.exam.service;
+
+import java.util.Date;
+import java.util.List;
+
+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.query.ExamStudentSearchQuery;
+
+public interface ExamStudentService {
+
+    public ExamStudent findById(int id);
+
+    public int batchSave(List<ExamStudent> list);
+
+    public ExamStudent save(ExamStudent student);
+
+    public void deleteById(int id);
+
+    public void delete(ExamStudent student);
+
+    public void deleteByExamId(int examId);
+
+    public ExamStudentSearchQuery findByQuery(ExamStudentSearchQuery query);
+
+    public long countByQuery(final ExamStudentSearchQuery query);
+
+    List<ExamStudent> findByExamId(int examId);
+
+    List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent, int pageNumber,
+            int pageSize);
+
+    ExamStudent findByExamIdAndExamNumber(int examId, String examNumber);
+
+    public long countByExamId(int examId);
+
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload);
+
+    List<String> findDistinctCampusName(int examId);
+
+    ExamStudentSearchQuery findDistinctCampusName(ExamStudentSearchQuery query);
+
+    List<ExamStudent> findByExamIdAndCampusName(int examId, String campusCode, int pageNumber, int pageSize);
+
+    List<String> findDistinctPackageCode(int examId);
+
+    long countByExamIdAndCampusName(int examId, String campusName);
+
+    long countByExamIdAndCampusName(int examId, String campusName, boolean upload);
+
+    long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload, boolean absent);
+
+    long countCampusByExam(int examId);
+
+    long countByExamIdAndUpload(int examId, boolean upload);
+
+    void updateSubjectInfo(ExamSubject subject);
+
+    void updateSubjectiveScore(int id, double score, String scoreList);
+
+    void updateManualAbsent(int id, boolean manualAbsent);
+
+    void updateManualAbsent(int examId, String examNumber, boolean manualAbsent);
+
+    void clearManualAbsent(int examId);
+
+    void updateException(int id, boolean exception);
+
+    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCode(Integer schoolId, String subjectCode,
+            String studentCode);
+
+    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
+            String studentCode, String examSeqCode);
+
+    public ExamStudent findByExamIdAndSubjectCodeAndUploadTimeAfter(int examId, String code, Date date);
+
+    public List<ExamStudent> findByExamIdAndUploadTimeAfter(int examId, Date date);
+
+    public long countByExamIdAndSubjectiveScoreListIsNotNull(Integer examId);
+
+    List<ExamStudent> findUploadedByExamIdAndSubjectCode(int examId, String code);
+
+    ExamStudent findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Date minUploadTime);
+
+    List<ExamStudent> findAbsentOrBreachLibraryStudent(int examId, String subjectCode);
+
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String subjectCode);
+
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String subjectCode, boolean upload,
+            boolean absent);
+
+    public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String code, String campusName, boolean upload,
+            boolean absent);
+
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
+            boolean breach);
+
+    public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach);
+
+    public String findIdsByMarkLogin(String markLogin);
+
+    public String findIdsByMarkName(String markName);
+
+    List<ExamStudent> findByExamId(int examId, int pageNumber, int pageSize);
+
+    List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
+            boolean breach);
+
+}

+ 0 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java

@@ -10,10 +10,6 @@ public interface MarkGroupService {
 
 
     MarkGroup save(MarkGroup markGroup);
     MarkGroup save(MarkGroup markGroup);
 
 
-    void deleteByExam(int examId);
-
-    void deleteByExamAndSubject(int examId, String subjectCode);
-
     MarkGroup findOne(int examId, String subjectCode, int number);
     MarkGroup findOne(int examId, String subjectCode, int number);
 
 
     long countByExamAndSubject(int examId, String subjectCode);
     long countByExamAndSubject(int examId, String subjectCode);
@@ -30,18 +26,8 @@ public interface MarkGroupService {
 
 
     void updateTitle(int examId, String subjectCode, int number, String title);
     void updateTitle(int examId, String subjectCode, int number, String title);
 
 
-    void updateTotalScore(int examId, String subjectCode, int number, Double score);
-
     void updateBuildTime(int examId, String subjectCode, int number, Date time);
     void updateBuildTime(int examId, String subjectCode, int number, Date time);
 
 
-    void updateLibraryCount(int examId, String subjectCode, int number);
-
-    void updateLibraryCount(int examId, String subjectCode);
-
-    void reset(MarkGroup group);
-
-    void delete(MarkGroup group);
-
     void resetBuildTime(int examId, String subjectCode);
     void resetBuildTime(int examId, String subjectCode);
 
 
 }
 }

+ 39 - 50
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerService.java

@@ -1,50 +1,39 @@
-package cn.com.qmth.stmms.biz.exam.service;
-
-import java.util.List;
-
-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.query.MarkerSearchQuery;
-
-public interface MarkerService {
-
-    Marker save(Marker marker);
-
-    Marker findById(Integer id);
-
-    Marker findByLoginName(String loginName);
-
-    List<Marker> findByExamAndSubjectAndGroup(int examId, String subjectCode, int groupNumber);
-
-    long countByExam(int examId);
-
-    void delete(Marker marker);
-
-    void deleteById(Integer markerId);
-
-    void deleteByExamAndSubject(int examId, String subjectCode);
-
-    void deleteByExam(int examId);
-
-    int batchCreate(ExamSubject subject, int groupNumber, int count, String password);
-
-    MarkerSearchQuery findByQuery(MarkerSearchQuery query);
-
-    List<Marker> getMarkCount(int examId);
-
-    long countByExamAndSubjectAndGroup(int examId, String subjectCode, int number);
-
-    void deleteByGroup(MarkGroup group);
-
-    List<Marker> getMarkCount(int examId, String subjectCode);
-    
-	List<Marker> findMode(String commo);
-
-	public List<Marker> findByStudentId(int studentId);
-
-    public int batchSave(List<Marker> list);
-
-    long countByLoginName(String loginName);
-
-}
+package cn.com.qmth.stmms.biz.exam.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
+
+public interface MarkerService {
+
+    Marker save(Marker marker);
+
+    Marker findById(Integer id);
+
+    Marker findByLoginName(String loginName);
+
+    List<Marker> findByExamAndSubjectAndGroup(int examId, String subjectCode, int groupNumber);
+
+    long countByExam(int examId);
+
+    int batchCreate(ExamSubject subject, int groupNumber, int count, String password);
+
+    MarkerSearchQuery findByQuery(MarkerSearchQuery query);
+
+    List<Marker> getMarkCount(int examId);
+
+    long countByExamAndSubjectAndGroup(int examId, String subjectCode, int number);
+
+    List<Marker> getMarkCount(int examId, String subjectCode);
+
+    List<Marker> findMode(String commo);
+
+    public List<Marker> findByStudentId(int studentId);
+
+    public int batchSave(List<Marker> list);
+
+    long countByLoginName(String loginName);
+
+}

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

@@ -1,139 +1,149 @@
-package cn.com.qmth.stmms.biz.exam.service.impl;
-
-import java.util.Date;
-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 org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.dao.ExamDao;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-
-@Service
-public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamService {
-
-    @Autowired
-    private ExamDao examDao;
-
-    @Transactional
-    // @CachePut(value = "exam_cache", key = "#exam.id", condition =
-    // "#exam!=null && #exam.id!=null")
-    public Exam save(Exam exam) {
-        Integer id = exam.getId();
-        if (id != null) {
-            exam.setUpdateTime(new Date());
-        } else {
-            exam.setCreateTime(new Date());
-        }
-        return examDao.save(exam);
-    }
-
-    // @Cacheable(value = "exam_cache", key = "#id", condition = "#id!=null")
-    public Exam findById(Integer id) {
-        return examDao.findOne(id);
-    }
-
-    @Transactional
-    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
-    // true)
-    public void updateStatus(int id, ExamStatus status) {
-        examDao.updateStatus(id, status);
-    }
-
-    @Transactional
-    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
-    // true)
-    public void deleteById(Integer id) {
-        examDao.delete(id);
-    }
-
-    @Override
-    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
-    // true)
-    public void delete(Exam exam) {
-        examDao.delete(exam);
-    }
-
-    @Override
-    public ExamSearchQuery findByQuery(final ExamSearchQuery query) {
-        checkQuery(query);
-        if (query.getOrderByCreateTimeDesc() != null) {
-            query.setSort(new Sort(query.getOrderByCreateTimeDesc() ? Direction.DESC : Direction.ASC, "createTime"));
-        }
-
-        Page<Exam> result = examDao.findAll(new Specification<Exam>() {
-
-            @Override
-            public Predicate toPredicate(Root<Exam> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
-                List<Predicate> predicates = new LinkedList<Predicate>();
-
-                if (query.getSchoolId() != null) {
-                    predicates.add(cb.equal(root.get("schoolId"), query.getSchoolId()));
-                }
-                if (query.getCreatorId() != null) {
-                    predicates.add(cb.equal(root.get("creatorId"), query.getCreatorId()));
-                }
-                if (StringUtils.isNotBlank(query.getName())) {
-                    predicates.add(cb.like(root.get("name").as(String.class), query.getName() + "%"));
-                }
-
-                if (query.getStatusSet() != null && query.getStatusSet().size() > 0) {
-                    List<Predicate> statusPredicates = new LinkedList<Predicate>();
-                    for (ExamStatus status : query.getStatusSet()) {
-                        statusPredicates.add(cb.equal(root.get("status"), status));
-                    }
-                    if (!statusPredicates.isEmpty()) {
-                        predicates.add(cb.or(statusPredicates.toArray(new Predicate[statusPredicates.size()])));
-                    }
-                }
-
-                if (query.getIds() != null && query.getIds().size() > 0) {
-                    List<Predicate> idsPredicates = new LinkedList<Predicate>();
-                    for (Integer id : query.getIds()) {
-                        idsPredicates.add(cb.equal(root.get("id"), id));
-                    }
-                    if (!idsPredicates.isEmpty()) {
-                        predicates.add(cb.or(idsPredicates.toArray(new Predicate[idsPredicates.size()])));
-                    }
-                }
-
-                return predicates.isEmpty() ? cb.conjunction()
-                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
-            }
-        }, query);
-        fillResult(result, query);
-        return query;
-    }
-
-    @Override
-    public List<Exam> findByStatus(ExamStatus status) {
-        return examDao.findByStatus(status);
-    }
-
-    @Override
-    public List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status) {
-        return examDao.findByCreatorAndStatus(id, status);
-    }
-
-    @Override
-    public List<Exam> findBySchoolId(Integer schoolId) {
-        return examDao.findBySchoolIdOrderByIdDesc(schoolId);
-    }
-
-}
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import java.util.Date;
+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 org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.ExamDao;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+@Service
+public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamService {
+
+    @Autowired
+    private ExamDao examDao;
+
+    @Transactional
+    // @CachePut(value = "exam_cache", key = "#exam.id", condition =
+    // "#exam!=null && #exam.id!=null")
+    public Exam save(Exam exam) {
+        Integer id = exam.getId();
+        if (id != null) {
+            exam.setUpdateTime(new Date());
+        } else {
+            exam.setCreateTime(new Date());
+        }
+        return examDao.save(exam);
+    }
+
+    // @Cacheable(value = "exam_cache", key = "#id", condition = "#id!=null")
+    public Exam findById(Integer id) {
+        return examDao.findOne(id);
+    }
+
+    @Transactional
+    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
+    // true)
+    public void updateStatus(int id, ExamStatus status) {
+        examDao.updateStatus(id, status);
+    }
+
+    @Transactional
+    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
+    // true)
+    public void deleteById(Integer id) {
+        examDao.delete(id);
+    }
+
+    @Override
+    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
+    // true)
+    @Transactional
+    public void delete(Exam exam) {
+        examDao.delete(exam);
+    }
+
+    @Override
+    @Transactional
+    public void updateUploadTime(Integer id) {
+        examDao.updateUploadTime(id, new Date());
+    }
+
+    @Override
+    public ExamSearchQuery findByQuery(final ExamSearchQuery query) {
+        checkQuery(query);
+        if (query.getOrderByCreateTimeDesc() != null) {
+            query.setSort(new Sort(query.getOrderByCreateTimeDesc() ? Direction.DESC : Direction.ASC, "createTime"));
+        }
+
+        Page<Exam> result = examDao.findAll(new Specification<Exam>() {
+
+            @Override
+            public Predicate toPredicate(Root<Exam> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+
+                if (query.getSchoolId() != null) {
+                    predicates.add(cb.equal(root.get("schoolId"), query.getSchoolId()));
+                }
+                if (query.getCreatorId() != null) {
+                    predicates.add(cb.equal(root.get("creatorId"), query.getCreatorId()));
+                }
+                if (StringUtils.isNotBlank(query.getName())) {
+                    predicates.add(cb.like(root.get("name").as(String.class), query.getName() + "%"));
+                }
+                if (query.getUploadTimeGt() != null) {
+                    predicates.add(cb.greaterThan(root.get("uploadTime").as(Date.class), query.getUploadTimeGt()));
+                }
+
+                if (query.getStatusSet() != null && query.getStatusSet().size() > 0) {
+                    List<Predicate> statusPredicates = new LinkedList<Predicate>();
+                    for (ExamStatus status : query.getStatusSet()) {
+                        statusPredicates.add(cb.equal(root.get("status"), status));
+                    }
+                    if (!statusPredicates.isEmpty()) {
+                        predicates.add(cb.or(statusPredicates.toArray(new Predicate[statusPredicates.size()])));
+                    }
+                }
+
+                if (query.getIds() != null && query.getIds().size() > 0) {
+                    List<Predicate> idsPredicates = new LinkedList<Predicate>();
+                    for (Integer id : query.getIds()) {
+                        idsPredicates.add(cb.equal(root.get("id"), id));
+                    }
+                    if (!idsPredicates.isEmpty()) {
+                        predicates.add(cb.or(idsPredicates.toArray(new Predicate[idsPredicates.size()])));
+                    }
+                }
+
+                return predicates.isEmpty() ? cb.conjunction()
+                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
+            }
+        }, query);
+        fillResult(result, query);
+        return query;
+    }
+
+    @Override
+    public List<Exam> findByStatus(ExamStatus status) {
+        return examDao.findByStatus(status);
+    }
+
+    @Override
+    public List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status) {
+        return examDao.findByCreatorAndStatus(id, status);
+    }
+
+    @Override
+    public List<Exam> findBySchoolId(Integer schoolId) {
+        return examDao.findBySchoolIdOrderByIdDesc(schoolId);
+    }
+
+}

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

@@ -1,672 +1,684 @@
-package cn.com.qmth.stmms.biz.exam.service.impl;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Expression;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
-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.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
-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.common.enums.ExamSubjectStatus;
-
-@Service
-public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
-
-    @Autowired
-    private ExamStudentDao studentDao;
-
-    @Autowired
-    private CampusService campusService;
-
-    @Autowired
-    private ExamPackageService packageService;
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private ExamService examService;
-
-    public static final String LOGINNAME_SPLITE = "-";
-
-    public static final String USER_PASSWORD = "123456";
-
-    public ExamStudent findById(int id) {
-        return studentDao.findOne(id);
-    }
-
-    /**
-     * 批量添加考生
-     * 
-     * @param list
-     * @return
-     */
-    @Transactional
-    public int batchSave(List<ExamStudent> list) {
-        if (list == null || list.isEmpty()) {
-            return 0;
-        }
-        int success = 0;
-        int examId = list.get(0).getExamId();
-        int schoolId = list.get(0).getSchoolId();
-        Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
-        Set<String> campusSet = new HashSet<String>();
-        Set<String> packageSet = new HashSet<String>();
-
-        for (ExamStudent student : list) {
-            if (!subjectMap.containsKey(student.getSubjectCode())) {
-                ExamSubject subject = new ExamSubject();
-                subject.setCode(student.getSubjectCode());
-                subject.setName(student.getSubjectName());
-                subject.setLevel(StringUtils.trimToNull(student.getSubjectLevel()));
-                subject.setCategory(StringUtils.trimToNull(student.getSubjectCategory()));
-                subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
-                subjectMap.put(subject.getCode(), subject);
-            }
-            campusSet.add(student.getCampusName());
-            if (StringUtils.isNotBlank(student.getPackageCode())) {
-                packageSet.add(student.getPackageCode());
-            }
-            success++;
-        }
-
-        for (ExamSubject es : subjectMap.values()) {
-            ExamSubject subject = subjectService.find(examId, es.getCode());
-            if (subject == null) {
-                subject = new ExamSubject();
-                subject.setExamId(examId);
-                subject.setCode(es.getCode());
-                subject.setName(es.getName());
-                subject.setLevel(es.getLevel());
-                subject.setCategory(es.getCategory());
-                subject.setStatus(ExamSubjectStatus.MARKING);
-                subject.setObjectiveScore(0d);
-                subject.setSubjectiveScore(0d);
-                subject.setTotalScore(0d);
-                subject.setUploadCount(0);
-                subject.setHasAnswer(false);
-                subject.setHasPaper(false);
-                subject.setRemark(es.getRemark());
-                subjectService.save(subject);
-            } else {
-                es.setName(subject.getName());
-                es.setLevel(subject.getLevel());
-                es.setCategory(subject.getCategory());
-            }
-        }
-
-        for (String name : campusSet) {
-            Campus campus = campusService.findBySchoolAndName(schoolId, name);
-            if (campus == null) {
-                campus = new Campus();
-                campus.setSchoolId(schoolId);
-                campus.setName(name);
-                campusService.save(campus);
-            }
-        }
-
-        for (String code : packageSet) {
-            ExamPackage examPackage = packageService.find(examId, code);
-            if (examPackage == null) {
-                examPackage = new ExamPackage();
-                examPackage.setExamId(examId);
-                examPackage.setCode(code);
-                examPackage.setPicCount(0);
-                packageService.save(examPackage);
-            }
-        }
-
-        for (ExamStudent student : list) {
-            ExamSubject subject = subjectMap.get(student.getSubjectCode());
-            student.setSubjectName(subject.getName());
-            student.setSubjectLevel(subject.getLevel());
-            student.setSubjectCategory(subject.getCategory());
-        }
-        studentDao.save(list);
-        return success;
-    }
-
-    @Transactional
-    public ExamStudent save(ExamStudent student) {
-        ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        if (subject == null) {
-            subject = new ExamSubject();
-            subject.setExamId(student.getExamId());
-            subject.setCode(student.getSubjectCode());
-            subject.setName(student.getSubjectName());
-            subject.setLevel(StringUtils.trimToNull(student.getSubjectLevel()));
-            subject.setCategory(StringUtils.trimToNull(student.getSubjectCategory()));
-            subject.setStatus(ExamSubjectStatus.MARKING);
-            subject.setObjectiveScore(0d);
-            subject.setSubjectiveScore(0d);
-            subject.setTotalScore(0d);
-            subject.setUploadCount(0);
-            subject.setHasAnswer(false);
-            subject.setHasPaper(false);
-            subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
-            subjectService.save(subject);
-        } else {
-            student.setSubjectName(subject.getName());
-            student.setSubjectLevel(subject.getLevel());
-            student.setSubjectCategory(subject.getCategory());
-        }
-
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        if (campus == null) {
-            campus = new Campus();
-            campus.setSchoolId(student.getSchoolId());
-            campus.setName(student.getCampusName());
-            campusService.save(campus);
-        }
-
-        if (StringUtils.isNotBlank(student.getPackageCode())) {
-            ExamPackage examPackage = packageService.find(student.getExamId(), student.getPackageCode());
-            if (examPackage == null) {
-                examPackage = new ExamPackage();
-                examPackage.setExamId(student.getExamId());
-                examPackage.setCode(student.getPackageCode());
-                examPackage.setPicCount(0);
-                packageService.save(examPackage);
-            }
-        }
-        return studentDao.save(student);
-    }
-
-    @Transactional
-    public void deleteById(int id) {
-        ExamStudent student = findById(id);
-        if (student != null) {
-            delete(student);
-        }
-    }
-
-    @Transactional
-    public void delete(ExamStudent student) {
-        studentDao.delete(student);
-    }
-
-    @Transactional
-    public void deleteByExamId(int examId) {
-        studentDao.deleteByExamId(examId);
-    }
-
-    public ExamStudentSearchQuery findByQuery(final ExamStudentSearchQuery query) {
-        checkQuery(query);
-        Page<ExamStudent> result = studentDao.findAll(buildSpecification(query), query);
-        fillResult(result, query);
-        return query;
-    }
-
-    public long countByQuery(final ExamStudentSearchQuery query) {
-        return studentDao.count(buildSpecification(query));
-    }
-
-    @Override
-    public List<ExamStudent> findByExamId(int examId) {
-        return studentDao.findByExamId(examId, null);
-    }
-
-    @Override
-    public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent, int pageNumber,
-            int pageSize) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setPageNumber(pageNumber);
-        query.setPageSize(pageSize);
-        return studentDao.findByExamIdAndUploadAndAbsent(examId, upload, absent, query);
-    }
-
-    @Override
-    public List<ExamStudent> findByExamIdAndCampusName(int examId, String campusName, int pageNumber, int pageSize) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setPageNumber(pageNumber);
-        query.setPageSize(pageSize);
-        return studentDao.findByExamIdAndCampusName(examId, campusName, query);
-    }
-
-    @Override
-    public ExamStudent findByExamIdAndExamNumber(int examId, String examNumber) {
-        List<ExamStudent> list = studentDao.findByExamIdAndExamNumber(examId, examNumber);
-        return list != null && list.size() > 0 ? list.get(0) : null;
-    }
-
-    public long countByExamId(int examId) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        return countByQuery(query);
-    }
-
-    @Override
-    public long countByExamIdAndUpload(int examId, boolean upload) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setUpload(upload);
-        return countByQuery(query);
-    }
-
-    public long countByExamIdAndSubjectCode(int examId, String subjectCode) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        return countByQuery(query);
-    }
-
-    public long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        query.setUpload(upload);
-        return countByQuery(query);
-    }
-
-    public long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload, boolean absent) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        query.setUpload(upload);
-        query.setAbsent(absent);
-        return countByQuery(query);
-    }
-
-    @Override
-    public long countByExamIdAndCampusName(int examId, String campusName) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setCampusName(campusName);
-        return countByQuery(query);
-    }
-
-    @Override
-    public long countByExamIdAndCampusName(int examId, String campusName, boolean upload) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setCampusName(campusName);
-        query.setUpload(upload);
-        return countByQuery(query);
-    }
-
-    @Override
-    public long countCampusByExam(int examId) {
-        return studentDao.countCampusNameByExamId(examId);
-    }
-
-    @Override
-    public List<String> findDistinctCampusName(int examId) {
-        return studentDao.findDistinctCampusName(examId);
-    }
-
-    @Override
-    public ExamStudentSearchQuery findDistinctCampusName(ExamStudentSearchQuery query) {
-        checkQuery(query);
-        query.setResult(studentDao.findDistinctCampusName(query.getExamId(), query));
-        query.setCurrentCount(query.getResult().size());
-        query.setTotalCount(studentDao.countDistinctCampusName(query.getExamId()));
-        query.setTotalPage((int) query.getTotalCount() / query.getPageSize());
-        return query;
-    }
-
-    @Override
-    public List<String> findDistinctPackageCode(int examId) {
-        return studentDao.findDistinctPackageCode(examId);
-    }
-    
-    @Override
-    @Transactional
-    public void updateManualAbsent(int id, boolean manualAbsent) {
-        studentDao.updateManualAbsent(id, manualAbsent);
-    }
-
-    @Override
-    @Transactional
-    public void updateManualAbsent(int examId, String examNumber, boolean manualAbsent) {
-        studentDao.updateManualAbsent(examId, examNumber, manualAbsent);
-    }
-    
-    @Override
-    @Transactional
-    public void clearManualAbsent(int examId) {
-        studentDao.clearManualAbsent(examId);
-    }
-
-    @Override
-    @Transactional
-    public void updateSubjectInfo(ExamSubject subject) {
-        if (subject != null) {
-            studentDao.updateSubjectInfo(subject.getExamId(), subject.getCode(), subject.getName(), subject.getLevel(),
-                    subject.getCategory());
-        }
-    }
-
-    @Override
-    @Transactional
-    public void updateSubjectiveScore(int id, double score, String scoreList) {
-        studentDao.updateSubjectiveScore(id, score, scoreList);
-    }
-
-    @Override
-    @Transactional
-    public void updateException(int id, boolean exception) {
-        studentDao.updateException(id, exception);
-    }
-
-    private Specification<ExamStudent> buildSpecification(final ExamStudentSearchQuery query) {
-        return new Specification<ExamStudent>() {
-
-            @Override
-            public Predicate toPredicate(Root<ExamStudent> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
-                List<Predicate> predicates = new LinkedList<Predicate>();
-                Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),root.get("subjectiveScore").as(Double.class));
-                if (query.getStartScroe()!=null ) {
-                    Predicate predicate1 = cb.ge(evaluationItemSum,query.getStartScroe());
-                    Predicate predicate2  = cb.le(evaluationItemSum,query.getEndScroe());
-                    if(query.getStartScroe() == 0){
-                        Predicate predicate = cb.or(cb.equal(root.get("absent"),true),cb.equal(root.get("breach"),true));
-                        Predicate predicate3 = cb.and(predicate1,predicate2);
-                        predicates.add(cb.or(predicate,predicate3));
-                    }else {
-                        predicates.add(cb.equal(root.get("absent"),  false));
-                        predicates.add(cb.equal(root.get("breach"),  false));
-                        predicates.add(cb.and(predicate1,predicate2));
-                    }
-                }
-//                if (query.getStartScroe()!=null && query.getEndScroe()!=null ) {
-//                    predicates.add(cb.between(evaluationItemSum, query.getStartScroe(), query.getEndScroe()));
-//                }
-                if (query.getExamId() > 0) {
-                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
-                }
-                if (StringUtils.isNotBlank(query.getIds())) {
-                    String[] ids = query.getIds().split(",");
-                    List<String> list = new ArrayList<String>();
-                    for(String str : ids){
-                        list.add(str);
-                    }
-                    predicates.add(root.get("id").in(list));
-                }
-                if (StringUtils.isNotBlank(query.getExamNumber())) {
-                    predicates.add(cb.equal(root.get("examNumber"), query.getExamNumber()));
-                } else if (StringUtils.isNotBlank(query.getExamNumberIn())) {
-                    String[] list = query.getExamNumberIn().split(",");
-                    if (list.length > 0) {
-                        Predicate[] sub = new Predicate[list.length];
-                        for (int i = 0; i < list.length; i++) {
-                            sub[i] = cb.equal(root.get("examNumber"), list[i]);
-                        }
-                        predicates.add(cb.or(sub));
-                    }
-                }
-                if (StringUtils.isNotEmpty(query.getStudentCode())) {
-                    predicates.add(cb.equal(root.get("studentCode"), query.getStudentCode()));
-                }
-                if (StringUtils.isNotBlank(query.getSubjectCode())) {
-                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
-                }
-                if (StringUtils.isNotBlank(query.getCampusName())) {
-                    predicates.add(cb.equal(root.get("campusName"), query.getCampusName()));
-                }
-                if (StringUtils.isNotBlank(query.getName())) {
-                    predicates.add(cb.like(root.get("name").as(String.class), query.getName() + "%"));
-                }
-                if (StringUtils.isNotBlank(query.getBatchCode())) {
-                    predicates.add(cb.equal(root.get("batchCode"), query.getBatchCode()));
-                }
-                if (StringUtils.isNotBlank(query.getPackageCode())) {
-                    predicates.add(cb.equal(root.get("packageCode"), query.getPackageCode()));
-                }
-                if (StringUtils.isNotBlank(query.getSubjectLevel())) {
-                    predicates.add(cb.equal(root.get("subjectLevel"), query.getSubjectLevel()));
-                }
-                if (StringUtils.isNotBlank(query.getSubjectCategory())) {
-                    predicates.add(cb.equal(root.get("subjectCategory"), query.getSubjectCategory()));
-                }
-                if (query.getObjectiveScore() != null) {
-                    predicates.add(cb.equal(root.get("objectiveScore"), query.getObjectiveScore()));
-                } else if (query.getObjectiveScoreGt() != null) {
-                    predicates.add(
-                            cb.greaterThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreGt()));
-                } else if (query.getObjectiveScoreLt() != null) {
-                    predicates
-                            .add(cb.lessThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreLt()));
-                }
-                if (query.getSubjectiveScore() != null) {
-                    predicates.add(cb.equal(root.get("subjectiveScore"), query.getSubjectiveScore()));
-                } else if (query.getSubjectiveScoreGt() != null) {
-                    predicates.add(
-                            cb.greaterThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreGt()));
-                } else if (query.getSubjectiveScoreLt() != null) {
-                    predicates.add(
-                            cb.lessThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreLt()));
-                }
-                if (query.getUpload() != null) {
-                    predicates.add(cb.equal(root.get("upload"), query.getUpload()));
-                }
-                if (query.getAbsent() != null) {
-                    if(query.getAbsent()){//缺考=缺考+ 未上传
-                        predicates.add(cb.or(cb.equal(root.get("absent"),true),cb.equal(root.get("upload"),false)));
-                    }else {
-                        predicates.add(cb.equal(root.get("absent"), query.getAbsent()));
-                        predicates.add(cb.equal(root.get("upload"), true));
-                    }
-                }
-                if (query.getBreach() != null) {
-                    predicates.add(cb.equal(root.get("breach"), query.getBreach()));
-                }
-                if (query.getException() != null) {
-                    predicates.add(cb.equal(root.get("exception"), query.getException()));
-                }
-                if (query.getUploadTimeNotNull() != null) {
-                    predicates.add(cb.isNotNull(root.get("uploadTime")));
-                }
-                if (query.getMinUploadTime() != null) {
-                    predicates.add(cb.greaterThan(root.get("uploadTime").as(Date.class), query.getMinUploadTime()));
-                }
-                if (query.getMaxUploadTime() != null) {
-                    predicates.add(cb.lessThan(root.get("uploadTime").as(Date.class), query.getMaxUploadTime()));
-                }
-                if (StringUtils.isNotBlank(query.getSubjectCodeIn())) {
-                    String[] list = query.getSubjectCodeIn().split(",");
-                    if (list.length > 0) {
-                        Predicate[] sub = new Predicate[list.length];
-                        for (int i = 0; i < list.length; i++) {
-                            sub[i] = cb.equal(root.get("subjectCode"), list[i]);
-                        }
-                        predicates.add(cb.or(sub));
-                    }
-                }
-                if (StringUtils.isNotBlank(query.getCampusNameIn())) {
-                    String[] list = query.getCampusNameIn().split(",");
-                    if (list.length > 0) {
-                        Predicate[] sub = new Predicate[list.length];
-                        for (int i = 0; i < list.length; i++) {
-                            sub[i] = cb.equal(root.get("campusName"), list[i]);
-                        }
-                        predicates.add(cb.or(sub));
-                    }
-                }
-                if (StringUtils.isNotBlank(query.getSubjectCodeNotIn())) {
-                    String[] list = query.getSubjectCodeNotIn().split(",");
-                    if (list.length > 0) {
-                        Predicate[] sub = new Predicate[list.length];
-                        for (int i = 0; i < list.length; i++) {
-                            sub[i] = cb.notEqual(root.get("subjectCode"), list[i]);
-                        }
-                        predicates.add(cb.and(sub));
-                    }
-                }
-                if (StringUtils.isNotBlank(query.getCampusNameNotIn())) {
-                    String[] list = query.getCampusNameNotIn().split(",");
-                    if (list.length > 0) {
-                        Predicate[] sub = new Predicate[list.length];
-                        for (int i = 0; i < list.length; i++) {
-                            sub[i] = cb.notEqual(root.get("campusName"), list[i]);
-                        }
-                        predicates.add(cb.and(sub));
-                    }
-                }
-                return predicates.isEmpty() ? cb.conjunction()
-                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
-            }
-        };
-    }
-
-    @Override
-    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCode(Integer schoolId, String subjectCode,
-            String studentCode) {
-        List<Exam> exams = examService.findBySchoolId(schoolId);
-        if (exams != null && exams.size() > 0) {
-            return studentDao.findByExamIdAndSubjectCodeAndStudentCode(exams.get(0).getId(), subjectCode, studentCode);
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
-            String studentCode, String examSeqCode) {
-        return studentDao.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode,
-                examSeqCode);
-    }
-
-    @Override
-    public List<ExamStudent> findByExamIdAndUploadTimeAfter(int examId, Date date) {
-        return studentDao.findByExamIdAndUploadTimeAfter(examId, date);
-    }
-
-    @Override
-    public List<ExamStudent> findUploadedByExamIdAndSubjectCode(int examId, String code) {
-        return studentDao.findByExamIdAndSubjectCodeAndUploadTimeNotNull(examId, code);
-    }
-
-    @Override
-    public ExamStudent findByExamIdAndSubjectCodeAndUploadTimeAfter(int examId, String code, Date date) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(code);
-        query.setMinUploadTime(date);
-        query.setUploadTimeNotNull(true);
-        query.setPageNumber(1);
-        query.setPageSize(1);
-        query.setSort(new Sort(Direction.ASC, "uploadTime"));
-        query = findByQuery(query);
-        return query.getCurrentCount() > 0 ? query.getResult().get(0) : null;
-    }
-
-    @Override
-    public ExamStudent findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Date minUploadTime) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setPageNumber(1);
-        query.setPageSize(1);
-        query.setSort(new Sort(Direction.ASC, "uploadTime"));
-        List<ExamStudent> list = minUploadTime != null
-                ? studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, minUploadTime, query)
-                : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, query);
-        return list.isEmpty() ? null : list.get(0);
-    }
-
-    @Override
-    public List<Integer> findAbsentOrBreachLibraryStudent(int examId, String subjectCode) {
-        return studentDao.findAbsentOrBreachLibraryStudent(examId, subjectCode);
-    }
-
-    @Override
-    public long countByExamIdAndSubjectiveScoreListIsNotNull(Integer examId) {
-        return studentDao.countByExamIdAndSubjectiveScoreListNotNull(examId);
-    }
-
-	@Override
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,String subjectCode) {
-		return studentDao.statisticsByExamIdAndSubjectCode(examId,subjectCode);
-	}
-
-	@Override
-	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,String subjectCode, boolean upload, boolean absent) {
-		return studentDao.statisticsByExamIdAndSubjectCode(examId,subjectCode,upload,absent);
-	}
-
-	@Override
-	public Long countByExamIdAndSubjectCodeAndCampus(Integer examId,
-			String subjectCode, String campusName, boolean upload, boolean absent) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        query.setCampusName(campusName);
-        query.setUpload(upload);
-        query.setAbsent(absent);
-        return countByQuery(query);
-	}
-	
-    @Override
-    public List<ExamStudent> findByExamId(int examId,int pageNumber, int pageSize) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setPageNumber(pageNumber);
-        query.setPageSize(pageSize);
-        return studentDao.findByExamId(examId, query);
-    }
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,boolean breach) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        query.setUpload(upload);
-        query.setAbsent(absent);
-        query.setBreach(breach);
-        return countByQuery(query);
-    }
-    public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach) {
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        if(breach != null){
-            query.setBreach(breach);
-        }
-        if(absent != null){
-            query.setAbsent(absent);
-        }
-        return countByQuery(query);
-    }
-	@Override
-	public String findIdsByMarkLogin(String markLogin) {
-	    List<String[]> o = studentDao.findIdsByMarkLogin(markLogin);
-	    return StringUtils.join(o, ",");
-	}
-	@Override
-    public String findIdsByMarkName(String MarkName) {
-        List<String[]> o = studentDao.findIdsByMarkName(MarkName);
-        return StringUtils.join(o, ",");
-    }
-    @Override
-    /**
-     * 根据缺考和违纪字段联合查询
-     */
-    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach){
-        return  studentDao.statisticsByAbsentAndBreach(examId,code,upload,absent,breach);
-    }
-}
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+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.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
+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.common.enums.ExamSubjectStatus;
+
+@Service
+public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
+
+    @Autowired
+    private ExamStudentDao studentDao;
+
+    @Autowired
+    private CampusService campusService;
+
+    @Autowired
+    private ExamPackageService packageService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamService examService;
+
+    public static final String LOGINNAME_SPLITE = "-";
+
+    public static final String USER_PASSWORD = "123456";
+
+    public ExamStudent findById(int id) {
+        return studentDao.findOne(id);
+    }
+
+    /**
+     * 批量添加考生
+     * 
+     * @param list
+     * @return
+     */
+    @Transactional
+    public int batchSave(List<ExamStudent> list) {
+        if (list == null || list.isEmpty()) {
+            return 0;
+        }
+        int success = 0;
+        int examId = list.get(0).getExamId();
+        int schoolId = list.get(0).getSchoolId();
+        Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
+        Set<String> campusSet = new HashSet<String>();
+        Set<String> packageSet = new HashSet<String>();
+
+        for (ExamStudent student : list) {
+            if (!subjectMap.containsKey(student.getSubjectCode())) {
+                ExamSubject subject = new ExamSubject();
+                subject.setCode(student.getSubjectCode());
+                subject.setName(student.getSubjectName());
+                subject.setLevel(StringUtils.trimToNull(student.getSubjectLevel()));
+                subject.setCategory(StringUtils.trimToNull(student.getSubjectCategory()));
+                subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
+                subjectMap.put(subject.getCode(), subject);
+            }
+            campusSet.add(student.getCampusName());
+            if (StringUtils.isNotBlank(student.getPackageCode())) {
+                packageSet.add(student.getPackageCode());
+            }
+            success++;
+        }
+
+        for (ExamSubject es : subjectMap.values()) {
+            ExamSubject subject = subjectService.find(examId, es.getCode());
+            if (subject == null) {
+                subject = new ExamSubject();
+                subject.setExamId(examId);
+                subject.setCode(es.getCode());
+                subject.setName(es.getName());
+                subject.setLevel(es.getLevel());
+                subject.setCategory(es.getCategory());
+                subject.setStatus(ExamSubjectStatus.MARKING);
+                subject.setObjectiveScore(0d);
+                subject.setSubjectiveScore(0d);
+                subject.setTotalScore(0d);
+                subject.setUploadCount(0);
+                subject.setHasAnswer(false);
+                subject.setHasPaper(false);
+                subject.setRemark(es.getRemark());
+                subjectService.save(subject);
+            } else {
+                es.setName(subject.getName());
+                es.setLevel(subject.getLevel());
+                es.setCategory(subject.getCategory());
+            }
+        }
+
+        for (String name : campusSet) {
+            Campus campus = campusService.findBySchoolAndName(schoolId, name);
+            if (campus == null) {
+                campus = new Campus();
+                campus.setSchoolId(schoolId);
+                campus.setName(name);
+                campusService.save(campus);
+            }
+        }
+
+        for (String code : packageSet) {
+            ExamPackage examPackage = packageService.find(examId, code);
+            if (examPackage == null) {
+                examPackage = new ExamPackage();
+                examPackage.setExamId(examId);
+                examPackage.setCode(code);
+                examPackage.setPicCount(0);
+                packageService.save(examPackage);
+            }
+        }
+
+        for (ExamStudent student : list) {
+            ExamSubject subject = subjectMap.get(student.getSubjectCode());
+            student.setSubjectName(subject.getName());
+            student.setSubjectLevel(subject.getLevel());
+            student.setSubjectCategory(subject.getCategory());
+        }
+        studentDao.save(list);
+        return success;
+    }
+
+    @Transactional
+    public ExamStudent save(ExamStudent student) {
+        ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
+        if (subject == null) {
+            subject = new ExamSubject();
+            subject.setExamId(student.getExamId());
+            subject.setCode(student.getSubjectCode());
+            subject.setName(student.getSubjectName());
+            subject.setLevel(StringUtils.trimToNull(student.getSubjectLevel()));
+            subject.setCategory(StringUtils.trimToNull(student.getSubjectCategory()));
+            subject.setStatus(ExamSubjectStatus.MARKING);
+            subject.setObjectiveScore(0d);
+            subject.setSubjectiveScore(0d);
+            subject.setTotalScore(0d);
+            subject.setUploadCount(0);
+            subject.setHasAnswer(false);
+            subject.setHasPaper(false);
+            subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
+            subjectService.save(subject);
+        } else {
+            student.setSubjectName(subject.getName());
+            student.setSubjectLevel(subject.getLevel());
+            student.setSubjectCategory(subject.getCategory());
+        }
+
+        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
+        if (campus == null) {
+            campus = new Campus();
+            campus.setSchoolId(student.getSchoolId());
+            campus.setName(student.getCampusName());
+            campusService.save(campus);
+        }
+
+        if (StringUtils.isNotBlank(student.getPackageCode())) {
+            ExamPackage examPackage = packageService.find(student.getExamId(), student.getPackageCode());
+            if (examPackage == null) {
+                examPackage = new ExamPackage();
+                examPackage.setExamId(student.getExamId());
+                examPackage.setCode(student.getPackageCode());
+                examPackage.setPicCount(0);
+                packageService.save(examPackage);
+            }
+        }
+        return studentDao.save(student);
+    }
+
+    @Transactional
+    public void deleteById(int id) {
+        ExamStudent student = findById(id);
+        if (student != null) {
+            delete(student);
+        }
+    }
+
+    @Transactional
+    public void delete(ExamStudent student) {
+        studentDao.delete(student);
+    }
+
+    @Transactional
+    public void deleteByExamId(int examId) {
+        studentDao.deleteByExamId(examId);
+    }
+
+    public ExamStudentSearchQuery findByQuery(final ExamStudentSearchQuery query) {
+        checkQuery(query);
+        Page<ExamStudent> result = studentDao.findAll(buildSpecification(query), query);
+        fillResult(result, query);
+        return query;
+    }
+
+    public long countByQuery(final ExamStudentSearchQuery query) {
+        return studentDao.count(buildSpecification(query));
+    }
+
+    @Override
+    public List<ExamStudent> findByExamId(int examId) {
+        return studentDao.findByExamId(examId, null);
+    }
+
+    @Override
+    public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent, int pageNumber,
+            int pageSize) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setPageNumber(pageNumber);
+        query.setPageSize(pageSize);
+        return studentDao.findByExamIdAndUploadAndAbsent(examId, upload, absent, query);
+    }
+
+    @Override
+    public List<ExamStudent> findByExamIdAndCampusName(int examId, String campusName, int pageNumber, int pageSize) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setPageNumber(pageNumber);
+        query.setPageSize(pageSize);
+        return studentDao.findByExamIdAndCampusName(examId, campusName, query);
+    }
+
+    @Override
+    public ExamStudent findByExamIdAndExamNumber(int examId, String examNumber) {
+        List<ExamStudent> list = studentDao.findByExamIdAndExamNumber(examId, examNumber);
+        return list != null && list.size() > 0 ? list.get(0) : null;
+    }
+
+    public long countByExamId(int examId) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        return countByQuery(query);
+    }
+
+    @Override
+    public long countByExamIdAndUpload(int examId, boolean upload) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setUpload(upload);
+        return countByQuery(query);
+    }
+
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        return countByQuery(query);
+    }
+
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        query.setUpload(upload);
+        return countByQuery(query);
+    }
+
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload, boolean absent) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        query.setUpload(upload);
+        query.setAbsent(absent);
+        return countByQuery(query);
+    }
+
+    @Override
+    public long countByExamIdAndCampusName(int examId, String campusName) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setCampusName(campusName);
+        return countByQuery(query);
+    }
+
+    @Override
+    public long countByExamIdAndCampusName(int examId, String campusName, boolean upload) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setCampusName(campusName);
+        query.setUpload(upload);
+        return countByQuery(query);
+    }
+
+    @Override
+    public long countCampusByExam(int examId) {
+        return studentDao.countCampusNameByExamId(examId);
+    }
+
+    @Override
+    public List<String> findDistinctCampusName(int examId) {
+        return studentDao.findDistinctCampusName(examId);
+    }
+
+    @Override
+    public ExamStudentSearchQuery findDistinctCampusName(ExamStudentSearchQuery query) {
+        checkQuery(query);
+        query.setResult(studentDao.findDistinctCampusName(query.getExamId(), query));
+        query.setCurrentCount(query.getResult().size());
+        query.setTotalCount(studentDao.countDistinctCampusName(query.getExamId()));
+        query.setTotalPage((int) query.getTotalCount() / query.getPageSize());
+        return query;
+    }
+
+    @Override
+    public List<String> findDistinctPackageCode(int examId) {
+        return studentDao.findDistinctPackageCode(examId);
+    }
+
+    @Override
+    @Transactional
+    public void updateManualAbsent(int id, boolean manualAbsent) {
+        studentDao.updateManualAbsent(id, manualAbsent);
+    }
+
+    @Override
+    @Transactional
+    public void updateManualAbsent(int examId, String examNumber, boolean manualAbsent) {
+        studentDao.updateManualAbsent(examId, examNumber, manualAbsent);
+    }
+
+    @Override
+    @Transactional
+    public void clearManualAbsent(int examId) {
+        studentDao.clearManualAbsent(examId);
+    }
+
+    @Override
+    @Transactional
+    public void updateSubjectInfo(ExamSubject subject) {
+        if (subject != null) {
+            studentDao.updateSubjectInfo(subject.getExamId(), subject.getCode(), subject.getName(), subject.getLevel(),
+                    subject.getCategory());
+        }
+    }
+
+    @Override
+    @Transactional
+    public void updateSubjectiveScore(int id, double score, String scoreList) {
+        studentDao.updateSubjectiveScore(id, score, scoreList);
+    }
+
+    @Override
+    @Transactional
+    public void updateException(int id, boolean exception) {
+        studentDao.updateException(id, exception);
+    }
+
+    private Specification<ExamStudent> buildSpecification(final ExamStudentSearchQuery query) {
+        return new Specification<ExamStudent>() {
+
+            @Override
+            public Predicate toPredicate(Root<ExamStudent> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),
+                        root.get("subjectiveScore").as(Double.class));
+                if (query.getStartScroe() != null) {
+                    Predicate predicate1 = cb.ge(evaluationItemSum, query.getStartScroe());
+                    Predicate predicate2 = cb.le(evaluationItemSum, query.getEndScroe());
+                    if (query.getStartScroe() == 0) {
+                        Predicate predicate = cb.or(cb.equal(root.get("absent"), true),
+                                cb.equal(root.get("breach"), true));
+                        Predicate predicate3 = cb.and(predicate1, predicate2);
+                        predicates.add(cb.or(predicate, predicate3));
+                    } else {
+                        predicates.add(cb.equal(root.get("absent"), false));
+                        predicates.add(cb.equal(root.get("breach"), false));
+                        predicates.add(cb.and(predicate1, predicate2));
+                    }
+                }
+                // if (query.getStartScroe()!=null && query.getEndScroe()!=null
+                // ) {
+                // predicates.add(cb.between(evaluationItemSum,
+                // query.getStartScroe(), query.getEndScroe()));
+                // }
+                if (query.getExamId() > 0) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (StringUtils.isNotBlank(query.getIds())) {
+                    String[] ids = query.getIds().split(",");
+                    List<String> list = new ArrayList<String>();
+                    for (String str : ids) {
+                        list.add(str);
+                    }
+                    predicates.add(root.get("id").in(list));
+                }
+                if (StringUtils.isNotBlank(query.getExamNumber())) {
+                    predicates.add(cb.equal(root.get("examNumber"), query.getExamNumber()));
+                } else if (StringUtils.isNotBlank(query.getExamNumberIn())) {
+                    String[] list = query.getExamNumberIn().split(",");
+                    if (list.length > 0) {
+                        Predicate[] sub = new Predicate[list.length];
+                        for (int i = 0; i < list.length; i++) {
+                            sub[i] = cb.equal(root.get("examNumber"), list[i]);
+                        }
+                        predicates.add(cb.or(sub));
+                    }
+                }
+                if (StringUtils.isNotEmpty(query.getStudentCode())) {
+                    predicates.add(cb.equal(root.get("studentCode"), query.getStudentCode()));
+                }
+                if (StringUtils.isNotBlank(query.getSubjectCode())) {
+                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
+                }
+                if (StringUtils.isNotBlank(query.getCampusName())) {
+                    predicates.add(cb.equal(root.get("campusName"), query.getCampusName()));
+                }
+                if (StringUtils.isNotBlank(query.getName())) {
+                    predicates.add(cb.like(root.get("name").as(String.class), query.getName() + "%"));
+                }
+                if (StringUtils.isNotBlank(query.getBatchCode())) {
+                    predicates.add(cb.equal(root.get("batchCode"), query.getBatchCode()));
+                }
+                if (StringUtils.isNotBlank(query.getPackageCode())) {
+                    predicates.add(cb.equal(root.get("packageCode"), query.getPackageCode()));
+                }
+                if (StringUtils.isNotBlank(query.getSubjectLevel())) {
+                    predicates.add(cb.equal(root.get("subjectLevel"), query.getSubjectLevel()));
+                }
+                if (StringUtils.isNotBlank(query.getSubjectCategory())) {
+                    predicates.add(cb.equal(root.get("subjectCategory"), query.getSubjectCategory()));
+                }
+                if (query.getObjectiveScore() != null) {
+                    predicates.add(cb.equal(root.get("objectiveScore"), query.getObjectiveScore()));
+                } else if (query.getObjectiveScoreGt() != null) {
+                    predicates.add(
+                            cb.greaterThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreGt()));
+                } else if (query.getObjectiveScoreLt() != null) {
+                    predicates
+                            .add(cb.lessThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreLt()));
+                }
+                if (query.getSubjectiveScore() != null) {
+                    predicates.add(cb.equal(root.get("subjectiveScore"), query.getSubjectiveScore()));
+                } else if (query.getSubjectiveScoreGt() != null) {
+                    predicates.add(
+                            cb.greaterThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreGt()));
+                } else if (query.getSubjectiveScoreLt() != null) {
+                    predicates.add(
+                            cb.lessThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreLt()));
+                }
+                if (query.getUpload() != null) {
+                    predicates.add(cb.equal(root.get("upload"), query.getUpload()));
+                }
+                if (query.getAbsent() != null) {
+                    if (query.getAbsent()) {// 缺考=缺考+ 未上传
+                        predicates.add(cb.or(cb.equal(root.get("absent"), true), cb.equal(root.get("upload"), false)));
+                    } else {
+                        predicates.add(cb.equal(root.get("absent"), query.getAbsent()));
+                        predicates.add(cb.equal(root.get("upload"), true));
+                    }
+                }
+                if (query.getBreach() != null) {
+                    predicates.add(cb.equal(root.get("breach"), query.getBreach()));
+                }
+                if (query.getException() != null) {
+                    predicates.add(cb.equal(root.get("exception"), query.getException()));
+                }
+                if (query.getUploadTimeNotNull() != null) {
+                    predicates.add(cb.isNotNull(root.get("uploadTime")));
+                }
+                if (query.getMinUploadTime() != null) {
+                    predicates.add(cb.greaterThan(root.get("uploadTime").as(Date.class), query.getMinUploadTime()));
+                }
+                if (query.getMaxUploadTime() != null) {
+                    predicates.add(cb.lessThan(root.get("uploadTime").as(Date.class), query.getMaxUploadTime()));
+                }
+                if (StringUtils.isNotBlank(query.getSubjectCodeIn())) {
+                    String[] list = query.getSubjectCodeIn().split(",");
+                    if (list.length > 0) {
+                        Predicate[] sub = new Predicate[list.length];
+                        for (int i = 0; i < list.length; i++) {
+                            sub[i] = cb.equal(root.get("subjectCode"), list[i]);
+                        }
+                        predicates.add(cb.or(sub));
+                    }
+                }
+                if (StringUtils.isNotBlank(query.getCampusNameIn())) {
+                    String[] list = query.getCampusNameIn().split(",");
+                    if (list.length > 0) {
+                        Predicate[] sub = new Predicate[list.length];
+                        for (int i = 0; i < list.length; i++) {
+                            sub[i] = cb.equal(root.get("campusName"), list[i]);
+                        }
+                        predicates.add(cb.or(sub));
+                    }
+                }
+                if (StringUtils.isNotBlank(query.getSubjectCodeNotIn())) {
+                    String[] list = query.getSubjectCodeNotIn().split(",");
+                    if (list.length > 0) {
+                        Predicate[] sub = new Predicate[list.length];
+                        for (int i = 0; i < list.length; i++) {
+                            sub[i] = cb.notEqual(root.get("subjectCode"), list[i]);
+                        }
+                        predicates.add(cb.and(sub));
+                    }
+                }
+                if (StringUtils.isNotBlank(query.getCampusNameNotIn())) {
+                    String[] list = query.getCampusNameNotIn().split(",");
+                    if (list.length > 0) {
+                        Predicate[] sub = new Predicate[list.length];
+                        for (int i = 0; i < list.length; i++) {
+                            sub[i] = cb.notEqual(root.get("campusName"), list[i]);
+                        }
+                        predicates.add(cb.and(sub));
+                    }
+                }
+                return predicates.isEmpty() ? cb.conjunction()
+                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
+            }
+        };
+    }
+
+    @Override
+    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCode(Integer schoolId, String subjectCode,
+            String studentCode) {
+        List<Exam> exams = examService.findBySchoolId(schoolId);
+        if (exams != null && exams.size() > 0) {
+            return studentDao.findByExamIdAndSubjectCodeAndStudentCode(exams.get(0).getId(), subjectCode, studentCode);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
+            String studentCode, String examSeqCode) {
+        return studentDao.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode,
+                examSeqCode);
+    }
+
+    @Override
+    public List<ExamStudent> findByExamIdAndUploadTimeAfter(int examId, Date date) {
+        return studentDao.findByExamIdAndUploadTimeAfter(examId, date);
+    }
+
+    @Override
+    public List<ExamStudent> findUploadedByExamIdAndSubjectCode(int examId, String code) {
+        return studentDao.findByExamIdAndSubjectCodeAndUploadTimeNotNull(examId, code);
+    }
+
+    @Override
+    public ExamStudent findByExamIdAndSubjectCodeAndUploadTimeAfter(int examId, String code, Date date) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(code);
+        query.setMinUploadTime(date);
+        query.setUploadTimeNotNull(true);
+        query.setPageNumber(1);
+        query.setPageSize(1);
+        query.setSort(new Sort(Direction.ASC, "uploadTime"));
+        query = findByQuery(query);
+        return query.getCurrentCount() > 0 ? query.getResult().get(0) : null;
+    }
+
+    @Override
+    public ExamStudent findUnLibraryStudent(int examId, String subjectCode, int groupNumber, Date minUploadTime) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setPageNumber(1);
+        query.setPageSize(1);
+        query.setSort(new Sort(Direction.ASC, "uploadTime"));
+        List<ExamStudent> list = minUploadTime != null
+                ? studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, minUploadTime, query)
+                : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, query);
+        return list.isEmpty() ? null : list.get(0);
+    }
+
+    @Override
+    public List<ExamStudent> findAbsentOrBreachLibraryStudent(int examId, String subjectCode) {
+        return studentDao.findAbsentOrBreachLibraryStudent(examId, subjectCode);
+    }
+
+    @Override
+    public long countByExamIdAndSubjectiveScoreListIsNotNull(Integer examId) {
+        return studentDao.countByExamIdAndSubjectiveScoreListNotNull(examId);
+    }
+
+    @Override
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String subjectCode) {
+        return studentDao.statisticsByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
+    @Override
+    public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId, String subjectCode, boolean upload,
+            boolean absent) {
+        return studentDao.statisticsByExamIdAndSubjectCode(examId, subjectCode, upload, absent);
+    }
+
+    @Override
+    public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String subjectCode, String campusName,
+            boolean upload, boolean absent) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        query.setCampusName(campusName);
+        query.setUpload(upload);
+        query.setAbsent(absent);
+        return countByQuery(query);
+    }
+
+    @Override
+    public List<ExamStudent> findByExamId(int examId, int pageNumber, int pageSize) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setPageNumber(pageNumber);
+        query.setPageSize(pageSize);
+        return studentDao.findByExamId(examId, query);
+    }
+
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
+            boolean breach) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        query.setUpload(upload);
+        query.setAbsent(absent);
+        query.setBreach(breach);
+        return countByQuery(query);
+    }
+
+    public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        if (breach != null) {
+            query.setBreach(breach);
+        }
+        if (absent != null) {
+            query.setAbsent(absent);
+        }
+        return countByQuery(query);
+    }
+
+    @Override
+    public String findIdsByMarkLogin(String markLogin) {
+        List<String[]> o = studentDao.findIdsByMarkLogin(markLogin);
+        return StringUtils.join(o, ",");
+    }
+
+    @Override
+    public String findIdsByMarkName(String MarkName) {
+        List<String[]> o = studentDao.findIdsByMarkName(MarkName);
+        return StringUtils.join(o, ",");
+    }
+
+    @Override
+    /**
+     * 根据缺考和违纪字段联合查询
+     */
+    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
+            boolean breach) {
+        return studentDao.statisticsByAbsentAndBreach(examId, code, upload, absent, breach);
+    }
+}

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

@@ -10,18 +10,11 @@ import org.springframework.transaction.annotation.Transactional;
 
 
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.biz.mark.service.ArbitrateHistoryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
 
 
 @Service("markGroupService")
 @Service("markGroupService")
 public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements MarkGroupService {
 public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements MarkGroupService {
@@ -29,83 +22,21 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
     @Autowired
     @Autowired
     private MarkGroupDao groupDao;
     private MarkGroupDao groupDao;
 
 
-    @Autowired
-    private ExamSubjectService subjectService;
-
     @Autowired
     @Autowired
     private ExamQuestionService questionService;
     private ExamQuestionService questionService;
 
 
-    @Autowired
-    private MarkerService markerService;
-
-    @Autowired
-    private MarkLibraryService libraryService;
-
-    @Autowired
-    private ArbitrateHistoryService arbitrateService;
-
-    @Autowired
-    private TaskService taskService;
-
     @Transactional
     @Transactional
     @Override
     @Override
     public MarkGroup save(MarkGroup group) {
     public MarkGroup save(MarkGroup group) {
-        if (group.getQuestionList() != null && !group.getQuestionList().isEmpty()) {
-            questionService.deleteByExamAndSubjectAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
-                    false, group.getNumber());
-            for (ExamQuestion question : group.getQuestionList()) {
-                questionService.save(question);
-            }
-        }
         return groupDao.save(group);
         return groupDao.save(group);
     }
     }
 
 
-    @Transactional
-    @Override
-    public void reset(MarkGroup group) {
-        groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
-
-        libraryService.resetByGroup(group);
-        arbitrateService.deleteByGroup(group);
-        taskService.clearCurrent(group.getExamId(), group.getSubjectCode(), group.getNumber());
-    }
-
     @Transactional
     @Transactional
     @Override
     @Override
     public void resetBuildTime(int examId, String subjectCode) {
     public void resetBuildTime(int examId, String subjectCode) {
         groupDao.updateBuildTime(examId, subjectCode, null);
         groupDao.updateBuildTime(examId, subjectCode, null);
     }
     }
 
 
-    @Transactional
-    @Override
-    public void delete(MarkGroup group) {
-        groupDao.delete(group);
-
-        taskService.clearCurrent(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        questionService.deleteByExamAndSubjectAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
-                false, group.getNumber());
-        libraryService.deleteByGroup(group);
-        arbitrateService.deleteByGroup(group);
-        markerService.deleteByGroup(group);
-        subjectService.updateScore(group.getExamId(), group.getSubjectCode());
-    }
-
-    @Transactional
-    @Override
-    public void updateLibraryCount(int examId, String subjectCode, int number) {
-        groupDao.updateLibraryCount(examId, subjectCode, number);
-        groupDao.updateMarkedCount(examId, subjectCode, number, LibraryStatus.MARKED, LibraryStatus.ARBITRATED);
-        groupDao.updateLeftCount(examId, subjectCode, number);
-    }
-
-    @Transactional
-    @Override
-    public void updateLibraryCount(int examId, String subjectCode) {
-        groupDao.updateLibraryCount(examId, subjectCode);
-        groupDao.updateMarkedCount(examId, subjectCode, LibraryStatus.MARKED, LibraryStatus.ARBITRATED);
-        groupDao.updateLeftCount(examId, subjectCode);
-    }
-
     @Transactional
     @Transactional
     @Override
     @Override
     public void updatePicList(int examId, String subjectCode, int number, List<PictureConfigItem> configList) {
     public void updatePicList(int examId, String subjectCode, int number, List<PictureConfigItem> configList) {
@@ -122,30 +53,12 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
         questionService.updateMainTitle(examId, subjectCode, false, number, title);
         questionService.updateMainTitle(examId, subjectCode, false, number, title);
     }
     }
 
 
-    @Transactional
-    @Override
-    public void updateTotalScore(int examId, String subjectCode, int number, Double score) {
-        groupDao.updateTotalScore(examId, subjectCode, number, score);
-    }
-
     @Transactional
     @Transactional
     @Override
     @Override
     public void updateBuildTime(int examId, String subjectCode, int number, Date time) {
     public void updateBuildTime(int examId, String subjectCode, int number, Date time) {
         groupDao.updateBuildTime(examId, subjectCode, number, time);
         groupDao.updateBuildTime(examId, subjectCode, number, time);
     }
     }
 
 
-    @Transactional
-    @Override
-    public void deleteByExam(int examId) {
-        groupDao.deleteByExamId(examId);
-    }
-
-    @Transactional
-    @Override
-    public void deleteByExamAndSubject(int examId, String subjectCode) {
-        groupDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
-    }
-
     @Override
     @Override
     public MarkGroup findOne(int examId, String subjectCode, int number) {
     public MarkGroup findOne(int examId, String subjectCode, int number) {
         MarkGroupPK pk = new MarkGroupPK();
         MarkGroupPK pk = new MarkGroupPK();

+ 238 - 270
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java

@@ -1,270 +1,238 @@
-package cn.com.qmth.stmms.biz.exam.service.impl;
-
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Random;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import cn.com.qmth.stmms.biz.common.BaseQuery;
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
-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.query.MarkerSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-
-@Service("markerService")
-public class MarkerServiceImpl extends BaseQueryService<Marker> implements MarkerService {
-
-    @Autowired
-    private MarkerDao markerDao;
-
-    @Autowired
-    private MarkLibraryDao libraryDao;
-
-    @Autowired
-    private MarkGroupService groupService;
-
-    @Transactional
-    @Override
-    public Marker save(Marker marker) {
-        Marker previous = findByLoginName(marker.getLoginName());
-        if (previous == null || (marker.getId() != null && previous.getId().equals(marker.getId()))) {
-            return markerDao.save(marker);
-        } else {
-            return null;
-        }
-    }
-
-    @Transactional
-    @Override
-    public void delete(Marker marker) {
-        markerDao.delete(marker);
-    }
-
-    @Transactional
-    @Override
-    public void deleteById(Integer markerId) {
-        markerDao.delete(markerId);
-    }
-
-    @Transactional
-    @Override
-    public void deleteByExamAndSubject(int examId, String subjectCode) {
-        markerDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
-    }
-
-    @Transactional
-    @Override
-    public void deleteByGroup(MarkGroup group) {
-        markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                group.getNumber());
-    }
-
-    @Transactional
-    @Override
-    public void deleteByExam(int examId) {
-        markerDao.deleteByExamId(examId);
-    }
-
-    @Override
-    public Marker findById(Integer id) {
-        return markerDao.findOne(id);
-    }
-
-    @Override
-    public Marker findByLoginName(String loginName) {
-        List<Marker> list = markerDao.findByLoginName(loginName);
-        return list != null && list.size() > 0 ? list.get(0) : null;
-    }
-
-    @Override
-    public List<Marker> findByExamAndSubjectAndGroup(int examId, String subjectCode, int number) {
-        return markerDao.findByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, number, null);
-    }
-
-    @Override
-    public long countByExam(int examId) {
-        return markerDao.countByExamId(examId);
-    }
-
-    @Override
-    public long countByExamAndSubjectAndGroup(int examId, String subjectCode, int number) {
-        return markerDao.countByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, number);
-    }
-
-    @Transactional
-    @Override
-    public int batchCreate(ExamSubject subject, int groupNumber, int count, String password) {
-        int result = 0;
-        if (subject != null && count > 0) {
-            if (groupNumber > 0) {
-                result = saveMarker(subject, groupNumber, count, password);
-            } else {
-                List<MarkGroup> groups = groupService.findByExamAndSubject(subject.getExamId(), subject.getCode());
-                for (MarkGroup markGroup : groups) {
-                    result = result + saveMarker(subject, markGroup.getNumber(), count, password);
-                }
-            }
-        }
-        return result;
-    }
-
-    private int saveMarker(ExamSubject subject, int groupNumber, int count, String password) {
-        int result = 0;
-        int start = 1;
-        Marker previous = findLastMarker(subject.getExamId(), subject.getCode());
-        if (previous != null) {
-            start = previous.getNumber() + 1;
-        }
-        int end = start + count - 1;
-        for (; start <= end; start++) {
-            Marker marker = new Marker();
-            marker.setExamId(subject.getExamId());
-            marker.setSubjectCode(subject.getCode());
-            if(StringUtils.isEmpty(password)){
-                Random random = new Random();
-                for (int i=0;i<6;i++)
-                {
-                    password+=random.nextInt(10);
-                }
-                marker.setPassword(password);
-                password = "";//随机码生产后将密码置空
-            }else {
-                marker.setPassword(password);
-            }
-            marker.setEnable(true);
-            marker.buildLoginName(start);
-            marker.setLoginName(marker.getLoginName());
-            marker.setName(marker.getLoginName());
-            marker.setGroupNumber(groupNumber);
-            if (save(marker) != null) {
-                result++;
-            }
-        }
-        return result;
-    }
-
-    private Marker findLastMarker(int examId, String subjectCode) {
-        Marker marker = null;
-        List<Marker> list = markerDao.findByExamIdAndSubjectCode(examId, subjectCode,
-                new BaseQuery<Marker>(1, 1, new Sort(Direction.DESC, "id")));
-        if (list != null && !list.isEmpty()) {
-            marker = list.get(0);
-        }
-        if (marker != null) {
-            return Marker.parseLoginName(marker.getLoginName());
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public List<Marker> getMarkCount(int examId) {
-        List<Marker> list = new LinkedList<Marker>();
-        List<Object[]> result = libraryDao.countByMarkerAndStatus(examId, LibraryStatus.MARKED);
-        if (result != null) {
-            for (Object[] array : result) {
-                try {
-                    Marker marker = findById((int) array[0]);
-                    marker.setMarkedCount((long) array[1]);
-                    list.add(marker);
-                } catch (Exception e) {
-                }
-            }
-        }
-        return list;
-    }
-
-    @Override
-    public List<Marker> getMarkCount(int examId, String subjectCode) {
-        List<Marker> list = new LinkedList<Marker>();
-        List<Object[]> result = libraryDao.countByMarkerAndStatus(examId, subjectCode, LibraryStatus.MARKED);
-        if (result != null) {
-            for (Object[] array : result) {
-                try {
-                    Marker marker = findById((int) array[0]);
-                    marker.setMarkedCount((long) array[1]);
-                    list.add(marker);
-                } catch (Exception e) {
-                }
-            }
-        }
-        return list;
-    }
-
-    @Override
-    public MarkerSearchQuery findByQuery(final MarkerSearchQuery query) {
-        checkQuery(query);
-        Page<Marker> result = markerDao.findAll(buildSpecification(query), query);
-        fillResult(result, query);
-        return query;
-    }
-
-    private Specification<Marker> buildSpecification(final MarkerSearchQuery query) {
-        return new Specification<Marker>() {
-
-            @Override
-            public Predicate toPredicate(Root<Marker> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
-                List<Predicate> predicates = new LinkedList<Predicate>();
-                if (query.getExamId() > 0) {
-                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
-                }
-                if (StringUtils.isNotBlank(query.getSubjectCode())) {
-                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
-                }
-                if (StringUtils.isNotBlank(query.getLoginName())) {
-                    predicates.add(cb.equal(root.get("loginName"), query.getLoginName()));
-                }
-                if (query.getGroupNumber() > 0) {
-                    predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
-                }
-                if (StringUtils.isNotBlank(query.getName())) {
-                    predicates.add(cb.equal(root.get("name"), query.getName()));
-                }
-                cQuery.orderBy(cb.desc(root.get("lastLoginTime").as(Date.class)));
-                return predicates.isEmpty() ? cb.conjunction()
-                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
-            }
-        };
-    }
-    
-	
-	@Override
-	public List<Marker> findByStudentId(int studentId){
-	    return  markerDao.findByStudentId(studentId);
-	}
-
-	@Override
-    public int batchSave(List<Marker> list){
-        markerDao.save(list);
-        return  list.size();
-    }
-    @Override
-    public long countByLoginName(String loginName){
-        return markerDao.countByLoginName(loginName);
-    }
-
-    @Override
-    public List<Marker> findMode(String commo) {
-        return markerDao.findByMode(commo);
-    }
-}
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
+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.query.MarkerSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Service("markerService")
+public class MarkerServiceImpl extends BaseQueryService<Marker> implements MarkerService {
+
+    @Autowired
+    private MarkerDao markerDao;
+
+    @Autowired
+    private MarkLibraryDao libraryDao;
+
+    @Autowired
+    private MarkGroupService groupService;
+
+    @Transactional
+    @Override
+    public Marker save(Marker marker) {
+        Marker previous = findByLoginName(marker.getLoginName());
+        if (previous == null || (marker.getId() != null && previous.getId().equals(marker.getId()))) {
+            return markerDao.save(marker);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public Marker findById(Integer id) {
+        return markerDao.findOne(id);
+    }
+
+    @Override
+    public Marker findByLoginName(String loginName) {
+        List<Marker> list = markerDao.findByLoginName(loginName);
+        return list != null && list.size() > 0 ? list.get(0) : null;
+    }
+
+    @Override
+    public List<Marker> findByExamAndSubjectAndGroup(int examId, String subjectCode, int number) {
+        return markerDao.findByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, number, null);
+    }
+
+    @Override
+    public long countByExam(int examId) {
+        return markerDao.countByExamId(examId);
+    }
+
+    @Override
+    public long countByExamAndSubjectAndGroup(int examId, String subjectCode, int number) {
+        return markerDao.countByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, number);
+    }
+
+    @Transactional
+    @Override
+    public int batchCreate(ExamSubject subject, int groupNumber, int count, String password) {
+        int result = 0;
+        if (subject != null && count > 0) {
+            if (groupNumber > 0) {
+                result = saveMarker(subject, groupNumber, count, password);
+            } else {
+                List<MarkGroup> groups = groupService.findByExamAndSubject(subject.getExamId(), subject.getCode());
+                for (MarkGroup markGroup : groups) {
+                    result = result + saveMarker(subject, markGroup.getNumber(), count, password);
+                }
+            }
+        }
+        return result;
+    }
+
+    private int saveMarker(ExamSubject subject, int groupNumber, int count, String password) {
+        int result = 0;
+        int start = 1;
+        Marker previous = findLastMarker(subject.getExamId(), subject.getCode());
+        if (previous != null) {
+            start = previous.getNumber() + 1;
+        }
+        int end = start + count - 1;
+        for (; start <= end; start++) {
+            Marker marker = new Marker();
+            marker.setExamId(subject.getExamId());
+            marker.setSubjectCode(subject.getCode());
+            if (StringUtils.isEmpty(password)) {
+                Random random = new Random();
+                for (int i = 0; i < 6; i++) {
+                    password += random.nextInt(10);
+                }
+                marker.setPassword(password);
+                password = "";// 随机码生产后将密码置空
+            } else {
+                marker.setPassword(password);
+            }
+            marker.setEnable(true);
+            marker.buildLoginName(start);
+            marker.setLoginName(marker.getLoginName());
+            marker.setName(marker.getLoginName());
+            marker.setGroupNumber(groupNumber);
+            if (save(marker) != null) {
+                result++;
+            }
+        }
+        return result;
+    }
+
+    private Marker findLastMarker(int examId, String subjectCode) {
+        Marker marker = null;
+        List<Marker> list = markerDao.findByExamIdAndSubjectCode(examId, subjectCode,
+                new BaseQuery<Marker>(1, 1, new Sort(Direction.DESC, "id")));
+        if (list != null && !list.isEmpty()) {
+            marker = list.get(0);
+        }
+        if (marker != null) {
+            return Marker.parseLoginName(marker.getLoginName());
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public List<Marker> getMarkCount(int examId) {
+        List<Marker> list = new LinkedList<Marker>();
+        List<Object[]> result = libraryDao.countByMarkerAndStatus(examId, LibraryStatus.MARKED);
+        if (result != null) {
+            for (Object[] array : result) {
+                try {
+                    Marker marker = findById((int) array[0]);
+                    marker.setMarkedCount((long) array[1]);
+                    list.add(marker);
+                } catch (Exception e) {
+                }
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public List<Marker> getMarkCount(int examId, String subjectCode) {
+        List<Marker> list = new LinkedList<Marker>();
+        List<Object[]> result = libraryDao.countByMarkerAndStatus(examId, subjectCode, LibraryStatus.MARKED);
+        if (result != null) {
+            for (Object[] array : result) {
+                try {
+                    Marker marker = findById((int) array[0]);
+                    marker.setMarkedCount((long) array[1]);
+                    list.add(marker);
+                } catch (Exception e) {
+                }
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public MarkerSearchQuery findByQuery(final MarkerSearchQuery query) {
+        checkQuery(query);
+        Page<Marker> result = markerDao.findAll(buildSpecification(query), query);
+        fillResult(result, query);
+        return query;
+    }
+
+    private Specification<Marker> buildSpecification(final MarkerSearchQuery query) {
+        return new Specification<Marker>() {
+
+            @Override
+            public Predicate toPredicate(Root<Marker> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                if (query.getExamId() > 0) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (StringUtils.isNotBlank(query.getSubjectCode())) {
+                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
+                }
+                if (StringUtils.isNotBlank(query.getLoginName())) {
+                    predicates.add(cb.equal(root.get("loginName"), query.getLoginName()));
+                }
+                if (query.getGroupNumber() > 0) {
+                    predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
+                }
+                if (StringUtils.isNotBlank(query.getName())) {
+                    predicates.add(cb.equal(root.get("name"), query.getName()));
+                }
+                cQuery.orderBy(cb.desc(root.get("lastLoginTime").as(Date.class)));
+                return predicates.isEmpty() ? cb.conjunction()
+                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
+            }
+        };
+    }
+
+    @Override
+    public List<Marker> findByStudentId(int studentId) {
+        return markerDao.findByStudentId(studentId);
+    }
+
+    @Override
+    public int batchSave(List<Marker> list) {
+        markerDao.save(list);
+        return list.size();
+    }
+
+    @Override
+    public long countByLoginName(String loginName) {
+        return markerDao.countByLoginName(loginName);
+    }
+
+    @Override
+    public List<Marker> findMode(String commo) {
+        return markerDao.findByMode(commo);
+    }
+}

+ 37 - 28
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -5,85 +5,94 @@ import java.util.List;
 import java.util.Set;
 import java.util.Set;
 
 
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.PagingAndSortingRepository;
 
 
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 
 
-public interface MarkLibraryDao
-        extends PagingAndSortingRepository<MarkLibrary, Integer>, JpaSpecificationExecutor<MarkLibrary> {
+public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, JpaSpecificationExecutor<MarkLibrary> {
 
 
-    List<MarkLibrary> findByExamId(int examId, Pageable page);
+    List<MarkLibrary> findByExamId(Integer examId, Pageable page);
 
 
-    List<MarkLibrary> findByExamIdAndSubjectCode(int examId, String subjectCode, Pageable page);
+    List<MarkLibrary> findByExamIdAndSubjectCode(Integer examId, String subjectCode, Pageable page);
 
 
-    List<MarkLibrary> findByExamIdAndStatus(int examId, LibraryStatus status, Pageable page);
+    List<MarkLibrary> findByExamIdAndStatus(Integer examId, LibraryStatus status, Pageable page);
 
 
-    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatus(int examId, String subjectCode, int groupNumber,
-            LibraryStatus status, Pageable page);
+    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode,
+            Integer groupNumber, LibraryStatus status, Pageable page);
 
 
-    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatusIn(int examId, String subjectCode,
-            int groupNumber, Set<LibraryStatus> statusSet, Pageable page);
+    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatusIn(Integer examId, String subjectCode,
+            Integer groupNumber, Set<LibraryStatus> statusSet, Pageable page);
 
 
-    List<MarkLibrary> findByExamIdAndMarkerId(int examId, int markerId, Pageable page);
+    List<MarkLibrary> findByExamIdAndMarkerId(Integer examId, Integer markerId, Pageable page);
 
 
-    List<MarkLibrary> findByExamIdAndExamNumber(int examId, String examNumber);
+    List<MarkLibrary> findByExamIdAndExamNumber(Integer examId, String examNumber);
 
 
     @Query("select l from MarkLibrary l where l.studentId=?1 order by l.groupNumber ")
     @Query("select l from MarkLibrary l where l.studentId=?1 order by l.groupNumber ")
-    List<MarkLibrary> findByStudentId(int studentId);
+    List<MarkLibrary> findByStudentId(Integer studentId);
 
 
-    List<MarkLibrary> findByStudentIdAndGroupNumber(int studentId, int groupNumber);
+    List<MarkLibrary> findByStudentIdAndGroupNumber(Integer studentId, Integer groupNumber);
+
+    @Query("select count(*) from MarkLibrary f where f.studentId=?1 and f.groupNumber=?2")
+    long countByStudentIdAndGroupNumber(Integer studentId, Integer groupNumber);
+
+    @Query("select count(*) from MarkLibrary f where f.studentId=?1 and f.markerId=?2")
+    long countByStudentIdAndMarkerId(Integer studentId, Integer markerId);
 
 
     @Query("select distinct l.campusId from MarkLibrary l where l.examId=?1 and l.tags is not null")
     @Query("select distinct l.campusId from MarkLibrary l where l.examId=?1 and l.tags is not null")
-    List<Integer> findTagCampusId(int examId);
+    List<Integer> findTagCampusId(Integer examId);
 
 
     @Query("select distinct l.subjectCode from MarkLibrary l where l.examId=?1 and l.tags is not null")
     @Query("select distinct l.subjectCode from MarkLibrary l where l.examId=?1 and l.tags is not null")
-    List<String> findTagSubjectCode(int examId);
+    List<String> findTagSubjectCode(Integer examId);
 
 
     @Modifying(clearAutomatically = true)
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?2, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.examId=?1")
     @Query("update MarkLibrary m set m.status=?2, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.examId=?1")
-    void resetByExamId(int examId, LibraryStatus status);
+    void resetByExamId(Integer examId, LibraryStatus status);
 
 
     @Modifying(clearAutomatically = true)
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?4, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3")
     @Query("update MarkLibrary m set m.status=?4, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3")
-    void resetByExamIdAndSubjectCodeAndNumber(int examId, String subjectCode, int number, LibraryStatus status);
+    void resetByExamIdAndSubjectCodeAndNumber(Integer examId, String subjectCode, Integer number, LibraryStatus status);
 
 
     @Modifying(clearAutomatically = true)
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?2, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.markerId=?1")
     @Query("update MarkLibrary m set m.status=?2, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.markerId=?1")
-    void resetByMarkerId(int markerId, LibraryStatus status);
+    void resetByMarkerId(Integer markerId, LibraryStatus status);
 
 
     @Modifying(clearAutomatically = true)
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?2, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.id=?1")
     @Query("update MarkLibrary m set m.status=?2, m.tags=null, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null where m.id=?1")
-    void resetById(int id, LibraryStatus status);
+    void resetById(Integer id, LibraryStatus status);
 
 
     @Query("select count(*) from MarkLibrary f where f.examId=?1")
     @Query("select count(*) from MarkLibrary f where f.examId=?1")
-    long countByExamId(int examId);
+    long countByExamId(Integer examId);
 
 
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2")
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2")
-    long countByExamIdAndSubjectCode(int examId, String subjectCode);
+    long countByExamIdAndSubjectCode(Integer examId, String subjectCode);
 
 
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.status=?3")
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.status=?3")
-    long countByExamIdAndSubjectCodeAndStatus(int examId, String subjectCode, LibraryStatus status);
+    long countByExamIdAndSubjectCodeAndStatus(Integer examId, String subjectCode, LibraryStatus status);
 
 
     @Query("select f.markerId, count(*) as markerCount from MarkLibrary f where f.examId=?1 and f.status=?2 group by f.markerId")
     @Query("select f.markerId, count(*) as markerCount from MarkLibrary f where f.examId=?1 and f.status=?2 group by f.markerId")
-    List<Object[]> countByMarkerAndStatus(int examId, LibraryStatus status);
+    List<Object[]> countByMarkerAndStatus(Integer examId, LibraryStatus status);
 
 
     @Query("select f.markerId, count(*) as markerCount from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.status=?3 group by f.markerId")
     @Query("select f.markerId, count(*) as markerCount from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.status=?3 group by f.markerId")
-    List<Object[]> countByMarkerAndStatus(int examId, String subjectCode, LibraryStatus status);
+    List<Object[]> countByMarkerAndStatus(Integer examId, String subjectCode, LibraryStatus status);
 
 
     @Modifying
     @Modifying
     @Query("delete MarkLibrary m where m.examId=?1")
     @Query("delete MarkLibrary m where m.examId=?1")
-    void deleteByExamId(int examId);
+    void deleteByExamId(Integer examId);
 
 
     @Modifying
     @Modifying
     @Query("delete MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3")
     @Query("delete MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3")
-    void deleteByExamIdAndSubjectCodeAndGroupNumber(int examId, String subjectCode, int groupNumber);
+    void deleteByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
+
+    @Modifying
+    @Query("delete MarkLibrary m where m.studentId=?1")
+    void deleteByStudentId(Integer studentId);
 
 
     @Query("select l from MarkLibrary l where l.studentId=?1 and l.status=?2 order by l.groupNumber ")
     @Query("select l from MarkLibrary l where l.studentId=?1 and l.status=?2 order by l.groupNumber ")
-    List<MarkLibrary> findByStudentIdAndStatus(int studentId, LibraryStatus status);
+    List<MarkLibrary> findByStudentIdAndStatus(Integer studentId, LibraryStatus status);
 
 
     @Modifying(clearAutomatically = true)
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.headerId=?3, m.headerScore=?4, m.headerScoreList=?5, m.headerTime=?6, "
     @Query("update MarkLibrary m set m.headerId=?3, m.headerScore=?4, m.headerScoreList=?5, m.headerTime=?6, "

+ 10 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkSpecialTagDao.java

@@ -9,22 +9,26 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 
 
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 
 
-public interface MarkSpecialTagDao extends PagingAndSortingRepository<MarkSpecialTag, Integer>,
-        JpaSpecificationExecutor<MarkSpecialTag> {
+public interface MarkSpecialTagDao
+        extends PagingAndSortingRepository<MarkSpecialTag, Integer>, JpaSpecificationExecutor<MarkSpecialTag> {
 
 
     @Modifying
     @Modifying
     @Query("delete from MarkSpecialTag s where s.libraryId = ?1")
     @Query("delete from MarkSpecialTag s where s.libraryId = ?1")
     public void deleteByLibraryId(Integer libraryId);
     public void deleteByLibraryId(Integer libraryId);
 
 
+    @Modifying
+    @Query("delete from MarkSpecialTag s where exists "
+            + "(select l.id from MarkLibrary l where l.studentId=?1 and s.libraryId=l.id)")
+    public void deleteByStudentId(Integer studentId);
+
     public List<MarkSpecialTag> findByLibraryIdOrderByIdAsc(Integer libraryId);
     public List<MarkSpecialTag> findByLibraryIdOrderByIdAsc(Integer libraryId);
-    
+
     @Modifying
     @Modifying
     @Query("delete from MarkSpecialTag s where s.libraryId in (select m.id from MarkLibrary m where m.markerId=?1)")
     @Query("delete from MarkSpecialTag s where s.libraryId in (select m.id from MarkLibrary m where m.markerId=?1)")
-	public void deleteByMarkerId(Integer markerId);
+    public void deleteByMarkerId(Integer markerId);
 
 
     @Modifying
     @Modifying
     @Query("delete from MarkSpecialTag s where s.libraryId in (select m.id from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3)")
     @Query("delete from MarkSpecialTag s where s.libraryId in (select m.id from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3)")
-	public void deleteByExamAndSubjectAndGroup(Integer examId,
-			String subjectCode, Integer groupNumber);
+    public void deleteByExamAndSubjectAndGroup(Integer examId, String subjectCode, Integer groupNumber);
 
 
 }
 }

+ 43 - 39
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkTrackDao.java

@@ -1,39 +1,43 @@
-package cn.com.qmth.stmms.biz.mark.dao;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-
-import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
-import cn.com.qmth.stmms.biz.mark.model.MarkTrackPK;
-
-public interface MarkTrackDao extends JpaRepository<MarkTrack, MarkTrackPK>, JpaSpecificationExecutor<MarkTrack> {
-
-    List<MarkTrack> findByPkStudentId(Integer studentId);
-
-    @Modifying
-    @Query("delete from MarkTrack t where t.pk.studentId=?1")
-    void deleteByStudentId(Integer studentId);
-
-    @Modifying
-    @Query("delete from MarkTrack t where t.pk.studentId=?1 and t.pk.questionNumber=?2")
-    void deleteByStudentIdAndQuestionNumber(Integer studentId, String questionNumber);
-
-    @Modifying
-    @Query("delete from MarkTrack t where t.examId=?1")
-    void deleteByExamId(Integer examId);
-
-    @Modifying
-    @Query("delete from MarkTrack t where t.examId=?1 and t.subjectCode=?2 and t.groupNumber=?3")
-    void deleteByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer number);
-
-    @Modifying
-    @Query("delete from MarkTrack t where t.markerId=?1")
-    void deleteByMarkerId(Integer markerId);
-
-    List<MarkTrack> findByPkStudentIdAndGroupNumber(Integer studentId, Integer number);
-
-}
+package cn.com.qmth.stmms.biz.mark.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
+import cn.com.qmth.stmms.biz.mark.model.MarkTrackPK;
+
+public interface MarkTrackDao extends JpaRepository<MarkTrack, MarkTrackPK>, JpaSpecificationExecutor<MarkTrack> {
+
+    List<MarkTrack> findByPkStudentId(Integer studentId);
+
+    @Modifying
+    @Query("delete from MarkTrack t where t.pk.studentId=?1 and t.markerId=?2")
+    void deleteByStudentIdAndMarkerId(Integer studentId, Integer markerId);
+
+    @Modifying
+    @Query("delete from MarkTrack t where t.pk.studentId=?1")
+    void deleteByStudentId(Integer studentId);
+
+    @Modifying
+    @Query("delete from MarkTrack t where t.pk.studentId=?1 and t.pk.questionNumber=?2")
+    void deleteByStudentIdAndQuestionNumber(Integer studentId, String questionNumber);
+
+    @Modifying
+    @Query("delete from MarkTrack t where t.examId=?1")
+    void deleteByExamId(Integer examId);
+
+    @Modifying
+    @Query("delete from MarkTrack t where t.examId=?1 and t.subjectCode=?2 and t.groupNumber=?3")
+    void deleteByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer number);
+
+    @Modifying
+    @Query("delete from MarkTrack t where t.markerId=?1")
+    void deleteByMarkerId(Integer markerId);
+
+    List<MarkTrack> findByPkStudentIdAndGroupNumber(Integer studentId, Integer number);
+
+}

+ 10 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkSpecialTag.java

@@ -1,19 +1,28 @@
 package cn.com.qmth.stmms.biz.mark.model;
 package cn.com.qmth.stmms.biz.mark.model;
 
 
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
 
 
 @Entity
 @Entity
 @Table(name = "m_special_tag")
 @Table(name = "m_special_tag")
 public class MarkSpecialTag {
 public class MarkSpecialTag {
+
     @Id
     @Id
     @GeneratedValue
     @GeneratedValue
     private Integer id;
     private Integer id;
+
     @Column(name = "library_id", nullable = false)
     @Column(name = "library_id", nullable = false)
     private Integer libraryId;
     private Integer libraryId;
+
     @Column(name = "tag_name", nullable = false)
     @Column(name = "tag_name", nullable = false)
     private String tagName;
     private String tagName;
+
     @Column(name = "position_x", nullable = false)
     @Column(name = "position_x", nullable = false)
     private Double positionX;
     private Double positionX;
+
     @Column(name = "position_y", nullable = false)
     @Column(name = "position_y", nullable = false)
     private Double positionY;
     private Double positionY;
 
 

+ 26 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/Task.java

@@ -332,6 +332,22 @@ public class Task implements Serializable {
         return map;
         return map;
     }
     }
 
 
+    public Map<String, List<MarkTrack>> getTrackMap(MarkLibrary library) {
+        Map<String, List<MarkTrack>> map = new HashMap<>();
+        if (trackList != null) {
+            for (TrackDTO dto : trackList) {
+                String questionNumber = dto.getQuestionNumber();
+                List<MarkTrack> list = map.get(questionNumber);
+                if (list == null) {
+                    list = new LinkedList<MarkTrack>();
+                    map.put(questionNumber, list);
+                }
+                list.add(dto.transform(library));
+            }
+        }
+        return map;
+    }
+
     public SpecialTagDTO[] getTagList() {
     public SpecialTagDTO[] getTagList() {
         return tagList;
         return tagList;
     }
     }
@@ -340,6 +356,16 @@ public class Task implements Serializable {
         this.tagList = tagList;
         this.tagList = tagList;
     }
     }
 
 
+    public List<MarkSpecialTag> getSpecialTagList(MarkLibrary library) {
+        List<MarkSpecialTag> list = new LinkedList<>();
+        if (tagList != null) {
+            for (SpecialTagDTO dto : tagList) {
+                list.add(dto.transform(library));
+            }
+        }
+        return list;
+    }
+
     public Integer getHeaderId() {
     public Integer getHeaderId() {
         return headerId;
         return headerId;
     }
     }

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

@@ -14,20 +14,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 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.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
 import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
-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.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
-import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 
 
 @Service
 @Service
@@ -36,59 +28,6 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
     @Autowired
     @Autowired
     private MarkLibraryDao libraryDao;
     private MarkLibraryDao libraryDao;
 
 
-    @Autowired
-    private MarkTrackService trackService;
-
-    @Autowired
-    private ExamQuestionService questionService;
-
-    @Autowired
-    private MarkSpecialTagService markSpecialTagService;
-
-    @Transactional
-    @Override
-    public void delete(MarkLibrary library) {
-        markSpecialTagService.deleteByLibraryId(library.getId());
-        libraryDao.delete(library);
-        if (library != null) {
-            List<ExamQuestion> examQuestions = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
-                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
-            for (ExamQuestion examQuestion : examQuestions) {
-                trackService.deleteByStudentIdAndQuestionNumber(library.getStudentId(),
-                        examQuestion.getQuestionNumber());
-            }
-        }
-    }
-
-    @Transactional
-    @Override
-    public void deleteByStudent(int studentId) {
-        List<MarkLibrary> library = findByStudentId(studentId);
-        if (library != null) {
-            for (MarkLibrary markLibrary : library) {
-                markSpecialTagService.deleteByLibraryId(markLibrary.getId());
-                this.delete(markLibrary);
-            }
-        }
-        trackService.deleteByStudentId(studentId);
-    }
-
-    @Transactional
-    @Override
-    public void deleteByGroup(MarkGroup group) {
-        markSpecialTagService.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(),
-                group.getNumber());
-        libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                group.getNumber());
-        trackService.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-    }
-
-    @Transactional
-    @Override
-    public MarkLibrary save(MarkLibrary library) {
-        return libraryDao.save(library);
-    }
-
     @Override
     @Override
     public MarkLibrary findById(int id) {
     public MarkLibrary findById(int id) {
         return libraryDao.findOne(id);
         return libraryDao.findOne(id);
@@ -124,88 +63,6 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                 statusSet, query);
                 statusSet, query);
     }
     }
 
 
-    @Override
-    @Transactional
-    public void resetByGroup(MarkGroup group) {
-        libraryDao.resetByExamIdAndSubjectCodeAndNumber(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                LibraryStatus.WAITING);
-        trackService.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        markSpecialTagService.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(),
-                group.getNumber());
-    }
-
-    @Override
-    @Transactional
-    public void resetByMarker(Marker marker) {
-        libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING);
-        trackService.deleteByMarkerId(marker.getId());
-        markSpecialTagService.deleteByMarkerId(marker.getId());
-    }
-
-    @Override
-    @Transactional
-    public void resetById(int id) {
-        MarkLibrary library = findById(id);
-        if (library != null) {
-            libraryDao.resetById(id, LibraryStatus.WAITING);
-            List<ExamQuestion> examQuestions = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
-                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
-            for (ExamQuestion examQuestion : examQuestions) {
-                trackService.deleteByStudentIdAndQuestionNumber(library.getStudentId(),
-                        examQuestion.getQuestionNumber());
-            }
-            markSpecialTagService.deleteByLibraryId(id);
-        }
-    }
-
-    @Override
-    @Transactional
-    public void backById(int id) {
-        back(findById(id));
-    }
-
-    @Override
-    @Transactional
-    public void back(MarkLibrary library) {
-        if (library != null) {
-            List<ExamQuestion> examQuestions = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
-                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
-            for (ExamQuestion examQuestion : examQuestions) {
-                trackService.deleteByStudentIdAndQuestionNumber(library.getStudentId(),
-                        examQuestion.getQuestionNumber());
-            }
-            markSpecialTagService.deleteByLibraryId(library.getId());
-
-            libraryDao.resetById(library.getId(), LibraryStatus.BACKED);
-        }
-    }
-
-    @Override
-    @Transactional
-    public void backWaitArbitrate(Integer studentId, Integer groupNumber) {
-        List<MarkLibrary> list = findByStudentAndGroup(studentId, groupNumber);
-        if (list != null) {
-            for (MarkLibrary library : list) {
-                if (library.getStatus() == LibraryStatus.WAIT_ARBITRATE) {
-                    back(library);
-                }
-            }
-        }
-    }
-
-    @Override
-    @Transactional
-    public void setArbitrate(Integer studentId, Integer groupNumber) {
-        libraryDao.updateByStudentIdAndGroupNumber(studentId, groupNumber, LibraryStatus.WAIT_ARBITRATE);
-    }
-
-    @Override
-    @Transactional
-    public void arbitrated(ArbitrateHistory history) {
-        libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(),
-                history.getTotalScore(), history.getScoreList(), history.getUpdateTime(), LibraryStatus.ARBITRATED);
-    }
-
     @Override
     @Override
     public List<Integer> findTagCampusId(int examId) {
     public List<Integer> findTagCampusId(int examId) {
         return libraryDao.findTagCampusId(examId);
         return libraryDao.findTagCampusId(examId);

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

@@ -1,13 +1,624 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.scheduling.annotation.Scheduled;
+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.campus.service.CampusService;
+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.MarkGroupDao;
+import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
+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.model.ArbitrateHistory;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.utils.CurrentTaskUtil;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.HistoryStatus;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 
+/**
+ * 与评卷相关的所有修改操作(非传播性的新增操作除外),全部汇总到这里进行集中控制
+ * 
+ * @author luoshi
+ *
+ */
+@Service("markService")
 public class MarkServiceImpl implements MarkService {
 public class MarkServiceImpl implements MarkService {
 
 
+    protected static final Logger log = LoggerFactory.getLogger(MarkServiceImpl.class);
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private CampusService campusService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
     @Autowired
     @Autowired
     private MarkGroupDao groupDao;
     private MarkGroupDao groupDao;
 
 
+    @Autowired
+    private ExamQuestionDao questionDao;
+
+    @Autowired
+    private MarkerDao markerDao;
+
+    @Autowired
+    private MarkLibraryDao libraryDao;
+
+    @Autowired
+    private ArbitrateHistoryDao arbitrateDao;
+
+    @Autowired
+    private MarkTrackDao trackDao;
+
+    @Autowired
+    private MarkSpecialTagDao specialTagDao;
+
+    @Value("${mark.cleanTimeoutMinute}")
+    private long timeoutMinute;
+
+    /**
+     * 某个大题已申请的评卷任务数量
+     * 
+     * @param group
+     * @return
+     */
+    @Override
+    public int applyCount(MarkGroup group) {
+        return CurrentTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
+    }
+
+    /**
+     * 某个评卷员已申请的评卷任务数量
+     * 
+     * @param marker
+     * @return
+     */
+    @Override
+    public int applyCount(Marker marker) {
+        return CurrentTaskUtil.count(marker);
+    }
+
+    /**
+     * 释放某个大题的锁定任务
+     * 
+     * @param group
+     */
+    @Override
+    @Transactional
+    public void releaseByGroup(MarkGroup group) {
+        CurrentTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
+    }
+
+    /**
+     * 重置某个大题的所有评卷任务
+     * 
+     * @param group
+     */
+    @Override
+    @Transactional
+    public void resetByGroup(MarkGroup group) {
+        groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        libraryDao.resetByExamIdAndSubjectCodeAndNumber(group.getExamId(), group.getSubjectCode(), group.getNumber(),
+                LibraryStatus.WAITING);
+        arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        releaseByGroup(group);
+    }
+
+    /**
+     * 删除某个大题
+     * 
+     * @param group
+     */
+    @Override
+    @Transactional
+    public void deleteGroup(MarkGroup group) {
+        questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
+                false, group.getNumber());
+        libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        subjectService.updateScore(group.getExamId(), group.getSubjectCode());
+
+        releaseByGroup(group);
+        groupDao.delete(group);
+    }
+
+    /**
+     * 修改某个大题给分步骤,并重置评卷任务
+     * 
+     * @param group
+     */
+    @Override
+    @Transactional
+    public void updateGroupScore(MarkGroup group, List<Double> scores) {
+        resetByGroup(group);
+        questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
+                false, group.getNumber());
+        int i = 0;
+        double totalScore = 0d;
+        for (Double score : scores) {
+            i++;
+            totalScore += score;
+            ExamQuestion question = new ExamQuestion();
+            question.setExamId(group.getExamId());
+            question.setSubjectCode(group.getSubjectCode());
+            question.setMainTitle(group.getTitle());
+            question.setMainNumber(group.getNumber());
+            question.setSubNumber(i);
+            question.setObjective(false);
+            question.setTotalScore(score);
+            question.setIntervalScore(1d);
+            questionDao.save(question);
+        }
+        groupDao.updateTotalScore(group.getExamId(), group.getSubjectCode(), group.getNumber(), totalScore);
+        subjectService.updateScore(group.getExamId(), group.getSubjectCode());
+    }
+
+    /**
+     * 评卷员申请领取某个评卷任务
+     * 
+     * @param library
+     * @param marker
+     */
+    @Override
+    @Transactional
+    public boolean applyLibrary(MarkLibrary library, Marker marker) {
+        // 首先判断多评情况下,同一个studentId是否已被该评卷员处理过
+        if (libraryDao.countByStudentIdAndMarkerId(library.getStudentId(), marker.getId()) > 0) {
+            return false;
+        }
+        return CurrentTaskUtil.add(marker, library.getId());
+    }
+
+    /**
+     * 释放某个评卷员某个锁定任务
+     * 
+     * @param marker
+     */
+    @Override
+    @Transactional
+    public void releaseLibrary(MarkLibrary library, Marker marker) {
+        CurrentTaskUtil.remove(marker, library.getId());
+    }
+
+    /**
+     * 释放某个评卷员的所有锁定任务
+     * 
+     * @param marker
+     */
+    @Override
+    @Transactional
+    public void releaseByMarker(Marker marker) {
+        CurrentTaskUtil.clear(marker);
+    }
+
+    /**
+     * 删除某个评卷员
+     * 
+     * @param marker
+     */
+    @Override
+    @Transactional
+    public void deleteMarker(Marker marker) {
+        releaseByMarker(marker);
+        libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING);
+        trackDao.deleteByMarkerId(marker.getId());
+        specialTagDao.deleteByMarkerId(marker.getId());
+        updateLibraryCount(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+        markerDao.delete(marker);
+    }
+
+    /**
+     * 根据考生ID删除评卷任务
+     * 
+     * @param studentId
+     */
+    @Override
+    @Transactional
+    public void deleteByStudent(ExamStudent student) {
+        trackDao.deleteByStudentId(student.getId());
+        specialTagDao.deleteByStudentId(student.getId());
+        libraryDao.deleteByStudentId(student.getId());
+        arbitrateDao.deleteByStudentId(student.getId());
+        updateLibraryCount(student.getExamId(), student.getSubjectCode());
+    }
+
+    /**
+     * 评卷员提交某个评卷任务
+     * 
+     * @param library
+     * @param trackMap
+     * @param tagList
+     */
+    @Override
+    @Transactional
+    public void submitLibrary(MarkLibrary library, Map<String, List<MarkTrack>> trackMap,
+            List<MarkSpecialTag> tagList) {
+        // 判断大题是否存在
+        MarkGroup group = groupDao.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
+        if (group == null) {
+            return;
+        }
+        // 保存阅卷轨迹
+        if (trackMap != null) {
+            for (String questionNumber : trackMap.keySet()) {
+                trackDao.deleteByStudentIdAndQuestionNumber(library.getStudentId(), questionNumber);
+                trackDao.save(trackMap.get(questionNumber));
+            }
+        }
+        // 保存特殊标记
+        if (tagList != null && tagList.size() > 0) {
+            specialTagDao.deleteByLibraryId(library.getId());
+            specialTagDao.save(tagList);
+        }
+
+        ArbitrateHistory history = null;
+        if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
+            // 多评模式
+            List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(library.getStudentId(),
+                    library.getGroupNumber());
+            for (MarkLibrary other : list) {
+                if (other.getId().equals(library.getId()) || other.getStatus() != LibraryStatus.MARKED
+                        || other.getMarkerScore() == null || other.getHeaderScore() != null) {
+                    // 未评卷或组长已打分,则跳过该任务
+                    continue;
+                }
+                if (Math.abs(other.getMarkerScore() - library.getMarkerScore()) > group.getArbitrateThreshold()) {
+                    // 分差超过阀值,触发仲裁
+                    history = new ArbitrateHistory();
+                    history.setExamId(library.getExamId());
+                    history.setSubjectCode(library.getSubjectCode());
+                    history.setGroupNumber(library.getGroupNumber());
+                    history.setStudentId(library.getStudentId());
+                    history.setExamNumber(library.getExamNumber());
+                    history.setStatus(HistoryStatus.WAITING);
+                    history.setCreateTime(new Date());
+                    arbitrateDao.save(history);
+
+                    library.setStatus(LibraryStatus.WAIT_ARBITRATE);
+                    break;
+                }
+            }
+        }
+        library = libraryDao.saveAndFlush(library);
+        // 触发仲裁后续处理
+        if (history != null) {
+            libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
+                    LibraryStatus.WAIT_ARBITRATE);
+        } else if (library.getStatus() == LibraryStatus.MARKED) {
+            // 评卷正常完成才尝试统分
+            scoreCalculate(library.getExamId(), library.getSubjectCode(), library.getStudentId());
+        }
+    }
+
+    /**
+     * 管理员/组长打回某个评卷任务
+     * 
+     * @param library
+     */
+    @Override
+    @Transactional
+    public void backLibrary(MarkLibrary library) {
+        if (library.getStatus() == LibraryStatus.MARKED) {
+            trackDao.deleteByStudentIdAndMarkerId(library.getStudentId(), library.getMarkerId());
+            specialTagDao.deleteByLibraryId(library.getId());
+            libraryDao.resetById(library.getId(), LibraryStatus.BACKED);
+            updateLibraryCount(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
+        }
+    }
+
+    /**
+     * 管理员/组长直接对考生打分
+     * 
+     * @param history
+     * @param user
+     */
+    @Override
+    @Transactional
+    public void submitStudent(ExamStudent student, User user) {
+
+    }
+
+    /**
+     * 管理员/组长处理仲裁卷
+     * 
+     * @param history
+     */
+    @Override
+    @Transactional
+    public void processArbitrate(ArbitrateHistory history) {
+        arbitrateDao.save(history);
+        libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(),
+                history.getTotalScore(), history.getScoreList(), history.getUpdateTime(), LibraryStatus.ARBITRATED);
+        updateLibraryCount(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
+        scoreCalculate(history.getExamId(), history.getSubjectCode(), history.getStudentId());
+    }
+
+    /**
+     * 定时生成评卷任务
+     */
+    @Scheduled(fixedDelay = 2 * 60 * 1000, initialDelay = 60 * 1000)
+    public void buildLibrary() {
+        log.debug("start auto-create library");
+        try {
+            Map<String, Campus> campusMap = new HashMap<String, Campus>();
+
+            ExamSearchQuery query = new ExamSearchQuery();
+            // 过去48小时内有考生更新上传的考试,才会尝试生成评卷任务
+            Calendar now = Calendar.getInstance();
+            now.add(Calendar.DAY_OF_YEAR, -2);
+            query.setUploadTimeGt(now.getTime());
+            query.addStatus(ExamStatus.START);
+            query.setSort(new Sort(Direction.DESC, "id"));
+            query.setPageNumber(1);
+            query.setPageSize(10);
+            query = examService.findByQuery(query);
+            while (query.getCurrentCount() > 0) {
+                for (Exam exam : query.getResult()) {
+                    buildLibraryByExam(exam, campusMap);
+                }
+                query.setPageNumber(query.getPageNumber() + 1);
+                query = examService.findByQuery(query);
+            }
+        } catch (Exception e) {
+        } finally {
+            log.debug("finish auto-create library");
+        }
+    }
+
+    private void buildLibraryByExam(Exam exam, Map<String, Campus> campusMap) {
+        // 获取主观题总分大于0的科目
+        List<ExamSubject> subjects = subjectService.list(exam.getId(), 0);
+        for (ExamSubject subject : subjects) {
+            // 清除缺考考生和违纪考生
+            List<ExamStudent> list = studentService.findAbsentOrBreachLibraryStudent(subject.getExamId(),
+                    subject.getCode());
+            if (list != null) {
+                for (ExamStudent student : list) {
+                    deleteByStudent(student);
+                }
+            }
+            // 处理正常考生
+            List<MarkGroup> groups = groupDao.findByExamIdAndSubjectCode(exam.getId(), subject.getCode());
+            for (MarkGroup group : groups) {
+                Date lastBuildTime = group.getBuildTime();
+                ExamStudent student = studentService.findUnLibraryStudent(exam.getId(), subject.getCode(),
+                        group.getNumber(), lastBuildTime);
+                while (student != null) {
+                    // 重复检测大题状态
+                    // TODO - 需要替换成读写锁
+                    MarkGroup current = group;
+                    if (current == null || (current.getBuildTime() == null && lastBuildTime != null)) {
+                        // 大题已被删除,或者已被重置,直接退出循环
+                        break;
+                    }
+                    // 补充学习中心集合
+                    Campus campus = campusMap.get(student.getSchoolId() + "_" + student.getCampusName());
+                    if (campus == null) {
+                        campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
+                        if (campus == null) {
+                            log.error("campus unexist for student id=" + student.getId());
+                            continue;
+                        } else {
+                            campusMap.put(student.getSchoolId() + "_" + student.getCampusName(), campus);
+                        }
+                    }
+                    // 查询是否已创建评卷任务
+                    if (libraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
+                        MarkLibrary library = new MarkLibrary();
+                        library.setExamId(student.getExamId());
+                        library.setSubjectCode(student.getSubjectCode());
+                        library.setGroupNumber(group.getNumber());
+                        library.setCampusId(campus.getId());
+                        library.setStudentId(student.getId());
+                        library.setExamNumber(student.getExamNumber());
+                        library.setTaskNumber(1);
+                        library.setStatus(LibraryStatus.WAITING);
+                        libraryDao.save(library);
+                        // 开启双评,且随机数超过双评比例,生成第二份评卷任务
+                        if (group.getDoubleRate() != null && group.getDoubleRate() > Math.random()) {
+                            library = new MarkLibrary();
+                            library.setExamId(student.getExamId());
+                            library.setSubjectCode(student.getSubjectCode());
+                            library.setGroupNumber(group.getNumber());
+                            library.setCampusId(campus.getId());
+                            library.setStudentId(student.getId());
+                            library.setExamNumber(student.getExamNumber());
+                            library.setTaskNumber(2);
+                            library.setStatus(LibraryStatus.WAITING);
+                            libraryDao.save(library);
+                        }
+                    }
+                    lastBuildTime = student.getUploadTime();
+                    group.setBuildTime(lastBuildTime);
+                    groupDao.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(),
+                            lastBuildTime);
+                    updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
+                    // 取下一个考生
+                    student = studentService.findUnLibraryStudent(exam.getId(), subject.getCode(), group.getNumber(),
+                            lastBuildTime);
+                }
+            }
+        }
+    }
+
+    /**
+     * 对某个考生某个科目进行主观题统分
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param studentId
+     */
+    @Override
+    @Transactional
+    public void scoreCalculate(Integer examId, String subjectCode, Integer studentId) {
+        List<MarkGroup> groups = groupDao.findByExamIdAndSubjectCode(examId, subjectCode);
+        List<ScoreItem> scoreList = new ArrayList<ScoreItem>();
+        double totalScore = 0.0;
+        // 循环所有大题
+        for (MarkGroup group : groups) {
+            if (calculateGroup(group, studentId)) {
+                totalScore += group.getMarkScore();
+                scoreList.addAll(group.getMarkScoreDetail());
+            } else {
+                // 未评完直接返回
+                return;
+            }
+        }
+        // 全部评完,更新考生主观题得分
+        studentService.updateSubjectiveScore(studentId, totalScore, ExamStudent.buildScoreList(scoreList));
+    }
+
+    private boolean calculateGroup(MarkGroup group, Integer studentId) {
+        double score = 0;
+        List<ScoreItem> detail = null;
+        int count = 0;
+        // 未设置算分策略的情况下,默认取平均分
+        ScorePolicy policy = group.getScorePolicy() != null ? group.getScorePolicy() : ScorePolicy.AVG;
+        List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(studentId, group.getNumber());
+        for (MarkLibrary library : list) {
+            if (library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.ARBITRATED) {
+                count++;
+                Double current = (library.getHeaderScore() != null ? library.getHeaderScore()
+                        : library.getMarkerScore());
+                List<ScoreItem> scores = library.getScoreList();
+                if (count == 1) {
+                    // 首份评卷任务,直接取总分与明细
+                    score = current;
+                    detail = scores;
+                } else {
+                    switch (policy) {
+                    case AVG:
+                        // 直接累加
+                        score += current;
+                        for (int i = 0; i < detail.size(); i++) {
+                            try {
+                                ScoreItem item = detail.get(i);
+                                ScoreItem other = scores.get(i);
+                                item.setScore(item.getScore() + other.getScore());
+                            } catch (Exception e) {
+                                continue;
+                            }
+                        }
+                        break;
+                    case MAX:
+                        if (current > score) {
+                            score = current;
+                            detail = scores;
+                        }
+                        break;
+                    case MIN:
+                        if (current < score) {
+                            score = current;
+                            detail = scores;
+                        }
+                        break;
+                    default:
+                        break;
+                    }
+                }
+            } else {
+                return false;
+            }
+        }
+        // 取平均分策略下,累计分数需要重新计算一次
+        if (policy == ScorePolicy.AVG && count > 1) {
+            score = score / count;
+            for (int i = 0; i < detail.size(); i++) {
+                ScoreItem item = detail.get(i);
+                item.setScore(item.getScore() / count);
+            }
+        }
+        group.setMarkScore(score);
+        group.setMarkScoreDetail(detail);
+        return true;
+    }
+
+    /**
+     * 更新某个大题评卷任务数量
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param groupNumber
+     */
+    @Override
+    public void updateLibraryCount(Integer examId, String subjectCode, Integer groupNumber) {
+        groupDao.updateLibraryCount(examId, subjectCode, groupNumber);
+        groupDao.updateMarkedCount(examId, subjectCode, groupNumber, LibraryStatus.MARKED, LibraryStatus.ARBITRATED);
+        groupDao.updateLeftCount(examId, subjectCode, groupNumber);
+    }
+
+    /**
+     * 更新某个科目所有大题评卷任务数量
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param groupNumber
+     */
+    @Override
+    public void updateLibraryCount(Integer examId, String subjectCode) {
+        groupDao.updateLibraryCount(examId, subjectCode);
+        groupDao.updateMarkedCount(examId, subjectCode, LibraryStatus.MARKED, LibraryStatus.ARBITRATED);
+        groupDao.updateLeftCount(examId, subjectCode);
+    }
+
+    /**
+     * 自动释放超时未处理的评卷任务
+     */
+    @Scheduled(cron = "${mark.cleanSchedule}")
+    public void cronCleanTask() {
+        try {
+            CurrentTaskUtil.clearTimeoutTask(timeoutMinute);
+        } catch (Exception e) {
+            log.error("CronCleanTask error", e);
+        }
+    }
+
 }
 }

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

@@ -18,7 +18,6 @@ import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
@@ -39,11 +38,8 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.biz.utils.CurrentTaskUtil;
-import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 
 
 /**
 /**
@@ -199,114 +195,6 @@ public class TaskServiceImpl implements TaskService {
         }
         }
     }
     }
 
 
-    @Override
-    @Transactional
-    public boolean submit(Task task) {
-        if (task == null) {
-            return false;
-        }
-        try {
-            submitTask(task);
-            return true;
-        } catch (Exception e) {
-            log.error("task submit faile", e);
-            return false;
-        }
-    }
-
-    private void submitTask(Task task) {
-        MarkLibrary library = updateLibrary(task);
-        // 正常完成评卷后尝试算分
-        if (library != null && library.getStatus() == LibraryStatus.MARKED) {
-            scoreCalculate(library.getExamId(), library.getSubjectCode(), library.getGroupNumber(),
-                    library.getStudentId());
-        }
-    }
-
-    @Override
-    public void scoreCalculate(Integer examId, String subjectCode, Integer groupNumber, Integer studentId) {
-        List<MarkGroup> groups = groupService.findByExamAndSubject(examId, subjectCode);
-        List<ScoreItem> scoreList = new ArrayList<ScoreItem>();
-        double totalScore = 0.0;
-        // 循环所有大题
-        for (MarkGroup group : groups) {
-            if (calculateGroup(group, studentId)) {
-                totalScore += group.getMarkScore();
-                scoreList.addAll(group.getMarkScoreDetail());
-            } else {
-                // 未评完直接返回
-                return;
-            }
-        }
-        // 全部评完,更新考生主观题得分
-        studentService.updateSubjectiveScore(studentId, totalScore, ExamStudent.buildScoreList(scoreList));
-    }
-
-    private boolean calculateGroup(MarkGroup group, Integer studentId) {
-        double score = 0;
-        List<ScoreItem> detail = null;
-        int count = 0;
-        // 未设置算分策略的情况下,默认取平均分
-        ScorePolicy policy = group.getScorePolicy() != null ? group.getScorePolicy() : ScorePolicy.AVG;
-        List<MarkLibrary> list = libraryService.findByStudentAndGroup(studentId, group.getNumber());
-        for (MarkLibrary library : list) {
-            if (library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.ARBITRATED) {
-                count++;
-                Double current = (library.getHeaderScore() != null ? library.getHeaderScore()
-                        : library.getMarkerScore());
-                List<ScoreItem> scores = library.getScoreList();
-                if (count == 1) {
-                    // 首份评卷任务,直接取总分与明细
-                    score = current;
-                    detail = scores;
-                } else {
-                    switch (policy) {
-                    case AVG:
-                        // 直接累加
-                        score += current;
-                        for (int i = 0; i < detail.size(); i++) {
-                            try {
-                                ScoreItem item = detail.get(i);
-                                ScoreItem other = scores.get(i);
-                                item.setScore(item.getScore() + other.getScore());
-                            } catch (Exception e) {
-                                continue;
-                            }
-                        }
-                        break;
-                    case MAX:
-                        if (current > score) {
-                            score = current;
-                            detail = scores;
-                        }
-                        break;
-                    case MIN:
-                        if (current < score) {
-                            score = current;
-                            detail = scores;
-                        }
-                        break;
-                    default:
-                        break;
-                    }
-                }
-            } else {
-                return false;
-            }
-        }
-        // 取平均分策略下,累计分数需要重新计算一次
-        if (policy == ScorePolicy.AVG && count > 1) {
-            score = score / count;
-            for (int i = 0; i < detail.size(); i++) {
-                ScoreItem item = detail.get(i);
-                item.setScore(item.getScore() / count);
-            }
-        }
-        group.setMarkScore(score);
-        group.setMarkScoreDetail(detail);
-        return true;
-    }
-
     /**
     /**
      * 保存评卷任务
      * 保存评卷任务
      * 
      * 
@@ -398,36 +286,6 @@ public class TaskServiceImpl implements TaskService {
         return library;
         return library;
     }
     }
 
 
-    @Override
-    public boolean setCurrent(Marker marker, int libraryId) {
-        return CurrentTaskUtil.add(marker, libraryId);
-    }
-
-    @Override
-    public void removeCurrent(Marker marker, int libraryId) {
-        CurrentTaskUtil.remove(marker, libraryId);
-    }
-
-    @Override
-    public int countCurrent(int examId, String subjectCode, int number) {
-        return CurrentTaskUtil.count(examId, subjectCode, number);
-    }
-
-    @Override
-    public int countCurrent(Marker marker) {
-        return CurrentTaskUtil.count(marker);
-    }
-
-    @Override
-    public void clearCurrent(int examId, String subjectCode, int number) {
-        CurrentTaskUtil.clear(examId, subjectCode, number);
-    }
-
-    @Override
-    public void clearCurrent(Marker marker) {
-        CurrentTaskUtil.clear(marker);
-    }
-
     public SpecialTagDTO[] getMarkSpecialTagList(Integer libraryId) {
     public SpecialTagDTO[] getMarkSpecialTagList(Integer libraryId) {
         SpecialTagDTO[] specialTags = null;
         SpecialTagDTO[] specialTags = null;
         List<MarkSpecialTag> list = markSpecialTagService.findByLibraryId(libraryId);
         List<MarkSpecialTag> list = markSpecialTagService.findByLibraryId(libraryId);
@@ -544,13 +402,4 @@ public class TaskServiceImpl implements TaskService {
         }
         }
     }
     }
 
 
-    /*
-     * 客户端非正常情况下退出系统时,对内存中的没有及时清除的任务进行处理
-     *
-     */
-    @Override
-    public void clearTaskMap(long cleanMapinterval) throws Exception {
-        CurrentTaskUtil.QuartzClearMap(cleanMapinterval);
-    }
-
 }
 }

+ 0 - 27
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java

@@ -3,17 +3,12 @@ package cn.com.qmth.stmms.biz.mark.service;
 import java.util.List;
 import java.util.List;
 import java.util.Set;
 import java.util.Set;
 
 
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 
 
 public interface MarkLibraryService {
 public interface MarkLibraryService {
 
 
-    MarkLibrary save(MarkLibrary library);
-
     MarkLibrary findById(int id);
     MarkLibrary findById(int id);
 
 
     List<MarkLibrary> findByStudentId(int studentId);
     List<MarkLibrary> findByStudentId(int studentId);
@@ -28,20 +23,6 @@ public interface MarkLibraryService {
     List<MarkLibrary> findByStatusSet(int examId, String subjectCode, int groupNumber, Set<LibraryStatus> statusSet,
     List<MarkLibrary> findByStatusSet(int examId, String subjectCode, int groupNumber, Set<LibraryStatus> statusSet,
             int pageNumber, int pageSize);
             int pageNumber, int pageSize);
 
 
-    void resetByMarker(Marker marker);
-
-    void resetById(int id);
-
-    void backById(int id);
-
-    void back(MarkLibrary library);
-
-    void backWaitArbitrate(Integer studentId, Integer groupNumber);
-
-    void delete(MarkLibrary library);
-
-    void deleteByStudent(int studentId);
-
     long countByExamAndSubjectAndGroupAndStatus(int examId, String subjectCode, int groupNumber, LibraryStatus status);
     long countByExamAndSubjectAndGroupAndStatus(int examId, String subjectCode, int groupNumber, LibraryStatus status);
 
 
     long countByMarker(int markerId);
     long countByMarker(int markerId);
@@ -54,12 +35,4 @@ public interface MarkLibraryService {
 
 
     List<MarkLibrary> findByStudentIdAndStatus(int studentId, LibraryStatus status);
     List<MarkLibrary> findByStudentIdAndStatus(int studentId, LibraryStatus status);
 
 
-    void resetByGroup(MarkGroup group);
-
-    void deleteByGroup(MarkGroup group);
-
-    void arbitrated(ArbitrateHistory history);
-
-    void setArbitrate(Integer studentId, Integer groupNumber);
-
 }
 }

+ 140 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -1,6 +1,146 @@
 package cn.com.qmth.stmms.biz.mark.service;
 package cn.com.qmth.stmms.biz.mark.service;
 
 
+import java.util.List;
+import java.util.Map;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
 
 
 public interface MarkService {
 public interface MarkService {
 
 
+    /**
+     * /** 释放某个大题的锁定任务
+     * 
+     * @param group
+     */
+    void releaseByGroup(MarkGroup group);
+
+    /**
+     * 重置某个大题的所有评卷任务
+     * 
+     * @param group
+     */
+    void resetByGroup(MarkGroup group);
+
+    /**
+     * 删除某个大题
+     * 
+     * @param group
+     */
+    void deleteGroup(MarkGroup group);
+
+    /**
+     * 修改并重置某个大题
+     * 
+     * @param group
+     */
+    void updateGroupScore(MarkGroup group, List<Double> scores);
+
+    /**
+     * 评卷员申请领取某个评卷任务
+     * 
+     * @param library
+     * @param marker
+     */
+    boolean applyLibrary(MarkLibrary library, Marker marker);
+
+    /**
+     * 释放某个评卷员某个锁定任务
+     * 
+     * @param marker
+     */
+    void releaseLibrary(MarkLibrary library, Marker marker);
+
+    /**
+     * 释放某个评卷员的所有锁定任务
+     * 
+     * @param marker
+     */
+    void releaseByMarker(Marker marker);
+
+    /**
+     * 删除某个评卷员
+     * 
+     * @param marker
+     */
+    void deleteMarker(Marker marker);
+
+    /**
+     * 根据考生删除评卷任务
+     * 
+     * @param student
+     */
+    void deleteByStudent(ExamStudent student);
+
+    /**
+     * 对某个考生某个科目进行主观题统分
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param studentId
+     */
+    void scoreCalculate(Integer examId, String subjectCode, Integer studentId);
+
+    /**
+     * 管理员/组长处理仲裁卷
+     * 
+     * @param history
+     */
+    void processArbitrate(ArbitrateHistory history);
+
+    /**
+     * 评卷员提交某个评卷任务
+     * 
+     * @param library
+     * @param trackMap
+     * @param tagList
+     */
+    void submitLibrary(MarkLibrary library, Map<String, List<MarkTrack>> trackMap, List<MarkSpecialTag> tagList);
+
+    /**
+     * 管理员/组长打回某个评卷任务
+     * 
+     * @param library
+     */
+    void backLibrary(MarkLibrary library);
+
+    /**
+     * 更新某个大题评卷任务数量
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param groupNumber
+     */
+    void updateLibraryCount(Integer examId, String subjectCode, Integer groupNumber);
+
+    /**
+     * 更新某个科目所有大题评卷任务数量
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param groupNumber
+     */
+    void updateLibraryCount(Integer examId, String subjectCode);
+
+    /**
+     * 某个大题已申请的评卷任务数量
+     * 
+     * @param group
+     * @return
+     */
+    int applyCount(MarkGroup group);
+
+    /**
+     * 某个评卷员已申请的评卷任务数量
+     * 
+     * @param marker
+     * @return
+     */
+    int applyCount(Marker marker);
+
 }
 }

+ 0 - 19
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/TaskService.java

@@ -3,7 +3,6 @@ package cn.com.qmth.stmms.biz.mark.service;
 import java.util.List;
 import java.util.List;
 
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 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.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
@@ -11,32 +10,14 @@ import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 
 
 public interface TaskService {
 public interface TaskService {
 
 
-    boolean submit(Task task);
-
     List<Task> findByQuery(MarkLibrarySearchQuery query);
     List<Task> findByQuery(MarkLibrarySearchQuery query);
 
 
     Task build(ArbitrateHistory history, MarkGroup group);
     Task build(ArbitrateHistory history, MarkGroup group);
 
 
     Task build(MarkLibrary library);
     Task build(MarkLibrary library);
 
 
-    boolean setCurrent(Marker marker, int libraryId);
-
-    void removeCurrent(Marker marker, int libraryId);
-
-    int countCurrent(int examId, String subjectCode, int number);
-
-    int countCurrent(Marker marker);
-
-    void clearCurrent(int examId, String subjectCode, int number);
-
-    void clearCurrent(Marker marker);
-
     Task build(Integer studentId);
     Task build(Integer studentId);
 
 
     boolean submitByStudent(Task task);
     boolean submitByStudent(Task task);
 
 
-    void clearTaskMap(long cleanMapinterval) throws Exception;
-
-    void scoreCalculate(Integer examId, String subjectCode, Integer groupNumber, Integer studentId);
-
 }
 }

+ 19 - 13
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/CurrentTaskUtil.java

@@ -123,49 +123,54 @@ public class CurrentTaskUtil {
     private static String getKey(Marker marker) {
     private static String getKey(Marker marker) {
         return getKey(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
         return getKey(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
     }
     }
-    public static void QuartzClearMap(long cleanMapinterval){
+
+    public static void clearTimeoutTask(long timeoutMinute) {
         synchronized (CurrentTaskUtil.class) {
         synchronized (CurrentTaskUtil.class) {
             SetMultimap<String, TaskEntry> taskMap1 = HashMultimap.create();
             SetMultimap<String, TaskEntry> taskMap1 = HashMultimap.create();
-    		//System.out.println("任务池大小:"+taskMap.size());
-    		//System.out.println("间隔时间:"+cleanMapinterval);
-            if(taskMap != null && taskMap.size()>0){
+            // System.out.println("任务池大小:"+taskMap.size());
+            // System.out.println("间隔时间:"+cleanMapinterval);
+            if (taskMap != null && taskMap.size() > 0) {
                 Multiset<String> keysTemp = taskMap.keys();
                 Multiset<String> keysTemp = taskMap.keys();
-                Set <String> setKey = new HashSet<String>();
-                for(String key : keysTemp){
+                Set<String> setKey = new HashSet<String>();
+                for (String key : keysTemp) {
                     setKey.add(key);
                     setKey.add(key);
                 }
                 }
-                for(String key : setKey){
+                for (String key : setKey) {
                     Set<TaskEntry> set = taskMap.get(key);
                     Set<TaskEntry> set = taskMap.get(key);
                     if (set != null) {
                     if (set != null) {
                         for (TaskEntry obj : set) {
                         for (TaskEntry obj : set) {
-                            if(getDateDifference(obj.timestamp)>=cleanMapinterval){//如果相隔20分钟,则该试卷的放入清空池中
+                            if (getDateDifference(obj.timestamp) >= timeoutMinute) {// 如果相隔20分钟,则该试卷的放入清空池中
                                 taskMap1.put(key, obj);
                                 taskMap1.put(key, obj);
                             }
                             }
                         }
                         }
                     }
                     }
                 }
                 }
             }
             }
-            for(Map.Entry<String, TaskEntry> taskEntry : taskMap1.entries()){
+            for (Map.Entry<String, TaskEntry> taskEntry : taskMap1.entries()) {
                 taskMap.remove(taskEntry.getKey(), taskEntry.getValue());
                 taskMap.remove(taskEntry.getKey(), taskEntry.getValue());
             }
             }
             taskMap1.clear();
             taskMap1.clear();
         }
         }
     }
     }
+
     /**
     /**
      * 获取当前时间戳
      * 获取当前时间戳
+     * 
      * @return
      * @return
      * @throws ParseException
      * @throws ParseException
      */
      */
-    public static  Long getDateString(){
+    public static Long getDateString() {
         return System.currentTimeMillis();
         return System.currentTimeMillis();
     }
     }
+
     /**
     /**
      * 时间戳相隔分钟
      * 时间戳相隔分钟
+     * 
      * @return
      * @return
      * @throws ParseException
      * @throws ParseException
      */
      */
-    public static Long getDateDifference(Long oldTime){
-        return  (getDateString() - oldTime) / (1000 * 60);
+    public static Long getDateDifference(Long oldTime) {
+        return (getDateString() - oldTime) / (1000 * 60);
     }
     }
 }
 }
 
 
@@ -180,7 +185,8 @@ class TaskEntry {
     public TaskEntry(int markerId, int libraryId) {
     public TaskEntry(int markerId, int libraryId) {
         this.markerId = markerId;
         this.markerId = markerId;
         this.libraryId = libraryId;
         this.libraryId = libraryId;
-        this.timestamp = System.currentTimeMillis();;
+        this.timestamp = System.currentTimeMillis();
+        ;
     }
     }
 
 
     @Override
     @Override

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

@@ -28,7 +28,7 @@ import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.query.ArbitrateHistorySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.ArbitrateHistorySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.ArbitrateHistoryService;
 import cn.com.qmth.stmms.biz.mark.service.ArbitrateHistoryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
@@ -54,10 +54,10 @@ public class ArbitrateController extends BaseExamController {
     private ArbitrateHistoryService arbitrateService;
     private ArbitrateHistoryService arbitrateService;
 
 
     @Autowired
     @Autowired
-    private MarkLibraryService libraryService;
+    private TaskService taskService;
 
 
     @Autowired
     @Autowired
-    private TaskService taskService;
+    private MarkService markService;
 
 
     // 并发处理互斥锁
     // 并发处理互斥锁
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
@@ -112,6 +112,7 @@ public class ArbitrateController extends BaseExamController {
         releaseByUser(wu.getUser().getId());
         releaseByUser(wu.getUser().getId());
         model.addAttribute("subjectCode", subjectCode);
         model.addAttribute("subjectCode", subjectCode);
         model.addAttribute("groupNumber", groupNumber);
         model.addAttribute("groupNumber", groupNumber);
+        model.addAttribute("group", group);
         return "modules/exam/arbitrateProcess";
         return "modules/exam/arbitrateProcess";
     }
     }
 
 
@@ -128,7 +129,7 @@ public class ArbitrateController extends BaseExamController {
                 obj.accumulate("message", "该仲裁卷已被处理");
                 obj.accumulate("message", "该仲裁卷已被处理");
             } else {
             } else {
                 if (subjectCheck(history.getSubjectCode(), RequestUtils.getWebUser(request))) {
                 if (subjectCheck(history.getSubjectCode(), RequestUtils.getWebUser(request))) {
-                    libraryService.backWaitArbitrate(history.getStudentId(), history.getGroupNumber());
+                    // TODO - 需要补充打回逻辑
                     obj.accumulate("success", true);
                     obj.accumulate("success", true);
                 } else {
                 } else {
                     obj.accumulate("success", false);
                     obj.accumulate("success", false);
@@ -195,12 +196,7 @@ public class ArbitrateController extends BaseExamController {
                 history.setScoreList(task.getScoreList());
                 history.setScoreList(task.getScoreList());
                 history.setStatus(HistoryStatus.MARKED);
                 history.setStatus(HistoryStatus.MARKED);
                 history.setUpdateTime(new Date());
                 history.setUpdateTime(new Date());
-                arbitrateService.save(history);
-                libraryService.arbitrated(history);
-                taskService.scoreCalculate(history.getExamId(), history.getSubjectCode(), history.getGroupNumber(),
-                        history.getStudentId());
-                groupService.updateLibraryCount(history.getExamId(), history.getSubjectCode(),
-                        history.getGroupNumber());
+                markService.processArbitrate(history);
                 releaseTask(history.getId());
                 releaseTask(history.getId());
                 result.accumulate("success", true);
                 result.accumulate("success", true);
                 result.accumulate("status", status(request, history.getSubjectCode(), history.getGroupNumber()));
                 result.accumulate("status", status(request, history.getSubjectCode(), history.getGroupNumber()));

+ 108 - 106
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -1,106 +1,108 @@
-package cn.com.qmth.stmms.admin.exam;
-
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import 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.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
-
-@Controller("libraryController")
-@RequestMapping("/admin/exam/library")
-public class LibraryController extends BaseExamController {
-
-    protected static Logger log = LoggerFactory.getLogger(LibraryController.class);
-
-    @Autowired
-    private MarkGroupService groupService;
-
-    @Autowired
-    private MarkLibraryService libraryService;
-
-    @Autowired
-    private MarkerService markerService;
-
-    @RequestMapping
-    public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query) {
-        int examId = getSessionExamId(request);
-        WebUser wu = RequestUtils.getWebUser(request);
-        List<ExamSubject> subjectList = getExamSubject(examId, wu);
-        if (subjectList.isEmpty()) {
-            return "redirect:/admin/exam/mark";
-        }
-        query.setExamId(examId);
-        if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
-            query.setSubjectCode(subjectList.get(0).getCode());
-        }
-        subjectFilter(query, wu);
-        List<MarkGroup> groupList = groupService.findByExamAndSubject(examId, query.getSubjectCode());
-        if (groupList.isEmpty()) {
-            return "redirect:/admin/exam/mark";
-        }
-        if (query.getGroupNumber() == 0) {
-            query.setGroupNumber(groupList.get(0).getNumber());
-        }
-        query = libraryService.findByQuery(query);
-        for (MarkLibrary library : query.getResult()) {
-            if (library.getMarkerId() != null) {
-                library.setMarker(markerService.findById(library.getMarkerId()));
-            }
-        }
-        model.addAttribute("query", query);
-        model.addAttribute("subjectList", subjectList);
-        model.addAttribute("groupList", groupList);
-        model.addAttribute("statusList", LibraryStatus.values());
-        model.addAttribute("markerList",
-                markerService.findByExamAndSubjectAndGroup(examId, query.getSubjectCode(), query.getGroupNumber()));
-        return "modules/exam/libraryList";
-    }
-
-    @RequestMapping(value = "/back", method = RequestMethod.POST)
-    @ResponseBody
-    @Transactional
-    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    public JSONObject back(HttpServletRequest request, @RequestParam Integer id) {
-        JSONObject obj = new JSONObject();
-        MarkLibrary library = libraryService.findById(id);
-        if (library != null) {
-            if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
-                libraryService.backById(id);
-                groupService.updateLibraryCount(library.getExamId(), library.getSubjectCode(),
-                        library.getGroupNumber());
-                obj.accumulate("success", true);
-            } else {
-                obj.accumulate("success", false);
-                obj.accumulate("message", "没有操作该评卷任务的权限");
-            }
-        } else {
-            obj.accumulate("success", false);
-            obj.accumulate("message", "该评卷任务不存在");
-        }
-        return obj;
-    }
-
-}
+package cn.com.qmth.stmms.admin.exam;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import 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.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
+
+@Controller("libraryController")
+@RequestMapping("/admin/exam/library")
+public class LibraryController extends BaseExamController {
+
+    protected static Logger log = LoggerFactory.getLogger(LibraryController.class);
+
+    @Autowired
+    private MarkGroupService groupService;
+
+    @Autowired
+    private MarkLibraryService libraryService;
+
+    @Autowired
+    private MarkerService markerService;
+
+    @Autowired
+    private MarkService markService;
+
+    @RequestMapping
+    public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query) {
+        int examId = getSessionExamId(request);
+        WebUser wu = RequestUtils.getWebUser(request);
+        List<ExamSubject> subjectList = getExamSubject(examId, wu);
+        if (subjectList.isEmpty()) {
+            return "redirect:/admin/exam/mark";
+        }
+        query.setExamId(examId);
+        if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
+            query.setSubjectCode(subjectList.get(0).getCode());
+        }
+        subjectFilter(query, wu);
+        List<MarkGroup> groupList = groupService.findByExamAndSubject(examId, query.getSubjectCode());
+        if (groupList.isEmpty()) {
+            return "redirect:/admin/exam/mark";
+        }
+        if (query.getGroupNumber() == 0) {
+            query.setGroupNumber(groupList.get(0).getNumber());
+        }
+        query = libraryService.findByQuery(query);
+        for (MarkLibrary library : query.getResult()) {
+            if (library.getMarkerId() != null) {
+                library.setMarker(markerService.findById(library.getMarkerId()));
+            }
+        }
+        model.addAttribute("query", query);
+        model.addAttribute("subjectList", subjectList);
+        model.addAttribute("groupList", groupList);
+        model.addAttribute("statusList", LibraryStatus.values());
+        model.addAttribute("markerList",
+                markerService.findByExamAndSubjectAndGroup(examId, query.getSubjectCode(), query.getGroupNumber()));
+        return "modules/exam/libraryList";
+    }
+
+    @RequestMapping(value = "/back", method = RequestMethod.POST)
+    @ResponseBody
+    @Transactional
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    public JSONObject back(HttpServletRequest request, @RequestParam Integer id) {
+        JSONObject obj = new JSONObject();
+        MarkLibrary library = libraryService.findById(id);
+        if (library != null) {
+            if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
+                markService.backLibrary(library);
+                obj.accumulate("success", true);
+            } else {
+                obj.accumulate("success", false);
+                obj.accumulate("message", "没有操作该评卷任务的权限");
+            }
+        } else {
+            obj.accumulate("success", false);
+            obj.accumulate("message", "该评卷任务不存在");
+        }
+        return obj;
+    }
+
+}

+ 0 - 133
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -1,11 +1,8 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
 import java.text.DecimalFormat;
 import java.text.DecimalFormat;
-import java.util.Date;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
@@ -13,9 +10,6 @@ import javax.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -25,25 +19,15 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import cn.com.qmth.stmms.admin.dto.MarkGroupDTO;
 import cn.com.qmth.stmms.admin.dto.MarkGroupDTO;
 import cn.com.qmth.stmms.admin.dto.MarkerInfoDTO;
 import cn.com.qmth.stmms.admin.dto.MarkerInfoDTO;
 import cn.com.qmth.stmms.admin.vo.SubjectLibraryVO;
 import cn.com.qmth.stmms.admin.vo.SubjectLibraryVO;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
-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.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.service.ArbitrateHistoryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -54,18 +38,9 @@ public class MarkController extends BaseExamController {
 
 
     protected static Logger log = LoggerFactory.getLogger(MarkController.class);
     protected static Logger log = LoggerFactory.getLogger(MarkController.class);
 
 
-    @Autowired
-    private ExamService examService;
-
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private ExamSubjectService subjectService;
     private ExamSubjectService subjectService;
 
 
-    @Autowired
-    private ExamStudentService studentService;
-
     @Autowired
     @Autowired
     private MarkLibraryService libraryService;
     private MarkLibraryService libraryService;
 
 
@@ -75,9 +50,6 @@ public class MarkController extends BaseExamController {
     @Autowired
     @Autowired
     private MarkGroupService groupService;
     private MarkGroupService groupService;
 
 
-    @Autowired
-    private ArbitrateHistoryService arbitrateService;
-
     /**
     /**
      * 评卷进度
      * 评卷进度
      * 
      * 
@@ -167,109 +139,4 @@ public class MarkController extends BaseExamController {
         }
         }
     }
     }
 
 
-    /**
-     * 定时生成评卷任务
-     */
-    @Scheduled(fixedDelay = 2 * 60 * 1000, initialDelay = 60 * 1000)
-    public void createLibrary() {
-        log.debug("start auto-create library");
-        try {
-            Map<String, Campus> campusMap = new HashMap<String, Campus>();
-
-            ExamSearchQuery query = new ExamSearchQuery();
-            query.addStatus(ExamStatus.START);
-            query.setSort(new Sort(Direction.DESC, "id"));
-            query.setPageNumber(1);
-            query.setPageSize(10);
-            query = examService.findByQuery(query);
-            while (query.getCurrentCount() > 0) {
-                for (Exam exam : query.getResult()) {
-                    createLibraryByExam(exam, campusMap);
-                }
-                query.setPageNumber(query.getPageNumber() + 1);
-                query = examService.findByQuery(query);
-            }
-        } catch (Exception e) {
-        } finally {
-            log.debug("finish auto-create library");
-        }
-    }
-
-    private void createLibraryByExam(Exam exam, Map<String, Campus> campusMap) {
-        List<ExamSubject> subjects = subjectService.list(exam.getId(), 0);
-        for (ExamSubject subject : subjects) {
-            // 清除缺考考生和违纪考生
-            List<Integer> idList = studentService.findAbsentOrBreachLibraryStudent(subject.getExamId(),
-                    subject.getCode());
-            if (idList != null) {
-                for (Integer studentId : idList) {
-                    libraryService.deleteByStudent(studentId);
-                    arbitrateService.deleteByStudent(studentId);
-                }
-                groupService.updateLibraryCount(subject.getExamId(), subject.getCode());
-            }
-            // 处理正常考生
-            List<MarkGroup> groups = groupService.findByExamAndSubject(exam.getId(), subject.getCode());
-            for (MarkGroup group : groups) {
-                Date lastBuildTime = group.getBuildTime();
-                ExamStudent student = studentService.findUnLibraryStudent(exam.getId(), subject.getCode(),
-                        group.getNumber(), lastBuildTime);
-                while (student != null) {
-                    // 重复检测大题状态
-                    MarkGroup current = groupService.findOne(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber());
-                    if (current == null || (current.getBuildTime() == null && lastBuildTime != null)) {
-                        // 大题已被删除,或者已被重置,直接退出循环
-                        break;
-                    }
-                    // 补充学习中心集合
-                    Campus campus = campusMap.get(student.getSchoolId() + "_" + student.getCampusName());
-                    if (campus == null) {
-                        campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-                        if (campus == null) {
-                            log.error("campus unexist for student id=" + student.getId());
-                            continue;
-                        } else {
-                            campusMap.put(student.getSchoolId() + "_" + student.getCampusName(), campus);
-                        }
-                    }
-                    // 查询是否已创建评卷任务
-                    List<MarkLibrary> list = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());
-                    if (list == null || list.isEmpty()) {
-                        MarkLibrary library = new MarkLibrary();
-                        library.setExamId(student.getExamId());
-                        library.setSubjectCode(student.getSubjectCode());
-                        library.setGroupNumber(group.getNumber());
-                        library.setCampusId(campus.getId());
-                        library.setStudentId(student.getId());
-                        library.setExamNumber(student.getExamNumber());
-                        library.setTaskNumber(1);
-                        library.setStatus(LibraryStatus.WAITING);
-                        libraryService.save(library);
-                        // 开启双评,且随机数超过双评比例,生成第二份评卷任务
-                        if (group.getDoubleRate() != null && group.getDoubleRate() > Math.random()) {
-                            library = new MarkLibrary();
-                            library.setExamId(student.getExamId());
-                            library.setSubjectCode(student.getSubjectCode());
-                            library.setGroupNumber(group.getNumber());
-                            library.setCampusId(campus.getId());
-                            library.setStudentId(student.getId());
-                            library.setExamNumber(student.getExamNumber());
-                            library.setTaskNumber(2);
-                            library.setStatus(LibraryStatus.WAITING);
-                            libraryService.save(library);
-                        }
-                    }
-                    lastBuildTime = student.getUploadTime();
-                    groupService.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                            lastBuildTime);
-                    groupService.updateLibraryCount(exam.getId(), subject.getCode(), group.getNumber());
-                    // 取下一个考生
-                    student = studentService.findUnLibraryStudent(exam.getId(), subject.getCode(), group.getNumber(),
-                            lastBuildTime);
-                }
-            }
-        }
-    }
-
 }
 }

+ 11 - 32
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -35,7 +35,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
@@ -63,13 +63,13 @@ public class MarkGroupController extends BaseExamController {
     private MarkerService markerService;
     private MarkerService markerService;
 
 
     @Autowired
     @Autowired
-    private TaskService taskService;
+    private ExamStudentService studentService;
 
 
     @Autowired
     @Autowired
-    private ExamStudentService examStudentService;
+    private CampusService campusService;
 
 
     @Autowired
     @Autowired
-    private CampusService campusService;
+    private MarkService markService;
 
 
     @Value("${slice.image.server}")
     @Value("${slice.image.server}")
     private String imageServer;
     private String imageServer;
@@ -90,7 +90,7 @@ public class MarkGroupController extends BaseExamController {
             group.setScoreList(questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
             group.setScoreList(questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
                     group.getNumber()));
                     group.getNumber()));
             group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subjectCode, group.getNumber()));
             group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subjectCode, group.getNumber()));
-            group.setCurrentCount(taskService.countCurrent(examId, subjectCode, group.getNumber()));
+            group.setCurrentCount(markService.applyCount(group));
             int percent = group.getLibraryCount() > 0
             int percent = group.getLibraryCount() > 0
                     ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount())
                     ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount())
                     : 0;
                     : 0;
@@ -130,7 +130,7 @@ public class MarkGroupController extends BaseExamController {
         if (subject == null) {
         if (subject == null) {
             return "redirect:/admin/exam/mark";
             return "redirect:/admin/exam/mark";
         }
         }
-        groupService.updateLibraryCount(examId, subjectCode);
+        markService.updateLibraryCount(examId, subjectCode);
 
 
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         return "redirect:/admin/exam/group";
         return "redirect:/admin/exam/group";
@@ -145,7 +145,7 @@ public class MarkGroupController extends BaseExamController {
         if (group == null) {
         if (group == null) {
             return "redirect:/admin/exam/mark";
             return "redirect:/admin/exam/mark";
         }
         }
-        taskService.clearCurrent(examId, group.getSubjectCode(), group.getNumber());
+        markService.releaseByGroup(group);
 
 
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         return "redirect:/admin/exam/group";
         return "redirect:/admin/exam/group";
@@ -161,7 +161,7 @@ public class MarkGroupController extends BaseExamController {
         if (group == null) {
         if (group == null) {
             return "redirect:/admin/exam/mark";
             return "redirect:/admin/exam/mark";
         }
         }
-        groupService.reset(group);
+        markService.resetByGroup(group);
 
 
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         return "redirect:/admin/exam/group";
         return "redirect:/admin/exam/group";
@@ -223,7 +223,7 @@ public class MarkGroupController extends BaseExamController {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         if (group != null) {
         if (group != null) {
-            groupService.delete(group);
+            markService.deleteGroup(group);
         }
         }
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         redirectAttributes.addAttribute("number", number);
         redirectAttributes.addAttribute("number", number);
@@ -265,28 +265,7 @@ public class MarkGroupController extends BaseExamController {
             // advance update
             // advance update
             List<Double> scores = buildDoubleList(scoreList);
             List<Double> scores = buildDoubleList(scoreList);
             if (scores.size() > 0) {
             if (scores.size() > 0) {
-                // reset current mark_library
-                groupService.reset(group);
-                // clear and replace exam_question
-                questionService.deleteByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false, number);
-                int i = 0;
-                double totalScore = 0d;
-                for (Double score : scores) {
-                    i++;
-                    totalScore += score;
-                    ExamQuestion question = new ExamQuestion();
-                    question.setExamId(examId);
-                    question.setSubjectCode(subjectCode);
-                    question.setMainTitle(group.getTitle());
-                    question.setMainNumber(number);
-                    question.setSubNumber(i);
-                    question.setObjective(false);
-                    question.setTotalScore(score);
-                    question.setIntervalScore(1d);
-                    questionService.save(question);
-                }
-                groupService.updateTotalScore(examId, subjectCode, number, totalScore);
-                subjectService.updateScore(examId, subjectCode);
+                markService.updateGroupScore(group, scores);
             }
             }
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             redirectAttributes.addAttribute("number", number);
             redirectAttributes.addAttribute("number", number);
@@ -385,7 +364,7 @@ public class MarkGroupController extends BaseExamController {
         query.setExamId(examId);
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
         query.setSubjectCode(subjectCode);
         query.setUpload(true);
         query.setUpload(true);
-        List<ExamStudent> examStudents = examStudentService.findByQuery(query).getResult();
+        List<ExamStudent> examStudents = studentService.findByQuery(query).getResult();
         MarkGroup group = null;
         MarkGroup group = null;
         if (number != null) {
         if (number != null) {
             group = groupService.findOne(examId, subjectCode, number);
             group = groupService.findOne(examId, subjectCode, number);

+ 6 - 18
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java

@@ -37,8 +37,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.MarkerExcelError;
 import cn.com.qmth.stmms.common.enums.MarkerExcelError;
@@ -70,10 +69,7 @@ public class MarkerController extends BaseExamController {
     private MarkLibraryService libraryService;
     private MarkLibraryService libraryService;
 
 
     @Autowired
     @Autowired
-    private MarkTrackService trackService;
-
-    @Autowired
-    private TaskService taskService;
+    private MarkService markService;
 
 
     @Value("${marker.showBtnImportAndBtnUpdateImport}")
     @Value("${marker.showBtnImportAndBtnUpdateImport}")
     private String showBtnImport;
     private String showBtnImport;
@@ -90,7 +86,7 @@ public class MarkerController extends BaseExamController {
             marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
             marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
             marker.setGroup(groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber()));
             marker.setGroup(groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber()));
             marker.setMarkedCount(libraryService.countByMarker(marker.getId()));
             marker.setMarkedCount(libraryService.countByMarker(marker.getId()));
-            marker.setCurrentCount(taskService.countCurrent(marker));
+            marker.setCurrentCount(markService.applyCount(marker));
         }
         }
         model.addAttribute("query", query);
         model.addAttribute("query", query);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("subjectList", getExamSubject(examId, wu));
@@ -122,7 +118,7 @@ public class MarkerController extends BaseExamController {
         JSONObject result = new JSONObject();
         JSONObject result = new JSONObject();
         Marker marker = markerService.findById(id);
         Marker marker = markerService.findById(id);
         if (marker != null) {
         if (marker != null) {
-            taskService.clearCurrent(marker);
+            markService.releaseByMarker(marker);
             result.accumulate("success", true);
             result.accumulate("success", true);
         } else {
         } else {
             result.accumulate("success", false);
             result.accumulate("success", false);
@@ -173,11 +169,7 @@ public class MarkerController extends BaseExamController {
     public String delete(@RequestParam Integer id, Model model, RedirectAttributes redirectAttributes) {
     public String delete(@RequestParam Integer id, Model model, RedirectAttributes redirectAttributes) {
         Marker marker = markerService.findById(id);
         Marker marker = markerService.findById(id);
         if (marker != null && !isMarking(marker.getExamId(), marker.getSubjectCode())) {
         if (marker != null && !isMarking(marker.getExamId(), marker.getSubjectCode())) {
-            libraryService.resetByMarker(marker);
-            taskService.clearCurrent(marker);
-            groupService.updateLibraryCount(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-            trackService.deleteByMarkerId(id);
-            markerService.deleteById(id);
+            markService.deleteMarker(marker);
         }
         }
         redirectAttributes.addAttribute("subjectCode", marker.getSubjectCode());
         redirectAttributes.addAttribute("subjectCode", marker.getSubjectCode());
         redirectAttributes.addAttribute("groupNumber", marker.getGroupNumber());
         redirectAttributes.addAttribute("groupNumber", marker.getGroupNumber());
@@ -192,11 +184,7 @@ public class MarkerController extends BaseExamController {
         Marker marker = markerService.findById(id);
         Marker marker = markerService.findById(id);
         JSONObject obj = new JSONObject();
         JSONObject obj = new JSONObject();
         if (marker != null) {
         if (marker != null) {
-            libraryService.resetByMarker(marker);
-            taskService.clearCurrent(marker);
-            groupService.updateLibraryCount(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-            trackService.deleteByMarkerId(id);
-            markerService.deleteById(id);
+            markService.deleteMarker(marker);
             obj.accumulate("success", true);
             obj.accumulate("success", true);
         } else {
         } else {
             obj.accumulate("success", false);
             obj.accumulate("success", false);

+ 342 - 345
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java

@@ -1,345 +1,342 @@
-package cn.com.qmth.stmms.admin.exam;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import com.google.common.collect.Lists;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.ExportExcel;
-import cn.com.qmth.stmms.common.utils.ImportExcel;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-@Controller("examStudentController")
-@RequestMapping("/admin/exam/student")
-public class StudentController extends BaseExamController {
-
-    protected static Logger log = LoggerFactory.getLogger(StudentController.class);
-
-    @Autowired
-    private CampusService campusService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private ExamService examService;
-
-    @Autowired
-    private MarkLibraryService libraryService;
-
-    @Autowired
-    private MarkGroupService groupService;
-
-    @Value("${sheet.image.server}")
-    private String imageServer;
-
-    @RequestMapping
-    public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query) {
-        WebUser wu = RequestUtils.getWebUser(request);
-        int examId = getSessionExamId(request);
-        query.setExamId(examId);
-        if (query.getBatchCode() != null) {
-            query.setBatchCode(StringUtils.upperCase(query.getBatchCode()));
-        }
-        subjectFilter(query, wu);
-        query = studentService.findByQuery(query);
-        if (query.getCurrentCount() > 0) {
-            for (ExamStudent student : query.getResult()) {
-                student.setSubject(subjectService.find(student.getExamId(), student.getSubjectCode()));
-                buildSheetUrl(student);
-            }
-            model.addAttribute("studentList", query.getResult());
-        }
-        model.addAttribute("query", query);
-        model.addAttribute("campusList", studentService.findDistinctCampusName(examId));
-        model.addAttribute("subjectList", getExamSubject(examId, wu));
-        model.addAttribute("levelList", subjectService.listLevel(examId));
-        model.addAttribute("categoryList", subjectService.listCategory(examId));
-        model.addAttribute("imageServer", imageServer);
-        return "modules/exam/studentList";
-    }
-
-    @RequestMapping(value = "/add")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String form(HttpServletRequest request, ExamStudent student, Model model) {
-        Exam exam = examService.findById(getSessionExamId(request));
-        model.addAttribute("student", student);
-        model.addAttribute("subjectList", getExamSubject(exam.getId(), RequestUtils.getWebUser(request)));
-        model.addAttribute("campusList", studentService.findDistinctCampusName(exam.getId()));
-        return "modules/exam/studentForm";
-    }
-
-    @RequestMapping(value = "/update")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String update(HttpServletRequest request, Integer id, Model model) {
-        Exam exam = examService.findById(getSessionExamId(request));
-        ExamStudent student = studentService.findById(id);
-        model.addAttribute("student", student);
-        model.addAttribute("subjectList", getExamSubject(exam.getId(), RequestUtils.getWebUser(request)));
-        model.addAttribute("campusList", studentService.findDistinctCampusName(exam.getId()));
-        return "modules/exam/studentForm";
-    }
-
-    @RequestMapping(value = "/save")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String save(ExamStudent student, Model model, RedirectAttributes redirectAttributes,
-            HttpServletRequest request, HttpServletResponse response) {
-        int examId = getSessionExamId(request);
-        Exam exam = examService.findById(examId);
-        ExamSubject subject = subjectService.find(examId, student.getSubjectCode());
-        Campus campus = campusService.findBySchoolAndName(exam.getSchoolId(), student.getCampusName());
-        if (subject == null) {
-            addMessage(redirectAttributes, "科目不存在");
-        } else if (campus == null) {
-            addMessage(redirectAttributes, "学习中心不存在");
-        } else {
-            if (student.getId() != null) {
-                ExamStudent previous = studentService.findById(student.getId());
-                if (previous != null) {
-                    // String previousSubjectCode = previous.getSubjectCode();
-                    if (!previous.isUpload()) {
-                        // 还未扫描上传的考生,才能修改准考证号、学习中心、科目
-                        previous.setCampusName(student.getCampusName());
-                        previous.setSubjectCode(subject.getCode());
-                        previous.setSubjectName(subject.getName());
-                        previous.setExamNumber(student.getExamNumber());
-                    }
-                    previous.setStudentCode(student.getStudentCode());
-                    previous.setName(student.getName());
-                    previous.setPackageCode(student.getPackageCode());
-                    if (checkExamNumber(previous, new HashMap<String, ExamStudent>(),new HashMap<String, ExamStudent>())) {
-                        previous = studentService.save(previous);
-                        // if
-                        // (!previousSubjectCode.equals(previous.getSubjectCode()))
-                        // {
-                        // // 更新科目上传考生数量
-                        // subjectService.updateUploadCount(examId,
-                        // previousSubjectCode);
-                        // subjectService.updateUploadCount(examId,
-                        // previous.getSubjectCode());
-                        // // 删除已生成的评卷任务
-                        // libraryService.deleteByStudent(previous.getId());
-                        // // 更新科目大题任务数量
-                        // groupService.updateLibraryCount(examId,
-                        // previousSubjectCode);
-                        // // 重置科目所有大题构造评卷任务时间
-                        // groupService.resetBuildTime(examId,
-                        // previous.getSubjectCode());
-                        // }
-                        addMessage(redirectAttributes, "考生" + previous.getName() + "保存成功");
-                    } else {
-                        addMessage(redirectAttributes, "准考证号" + previous.getExamNumber() + "已存在");
-                        redirectAttributes.addAttribute("id", student.getId());
-                        return "redirect:/admin/exam/student/update";
-                    }
-                } else {
-                    addMessage(redirectAttributes, "考生不存在");
-                }
-            } else {
-                student.setExamId(examId);
-                student.setSchoolId(exam.getSchoolId());
-                student.setSubjectName(subject.getName());
-                student.setAbsent(false);
-                student.setUpload(false);
-                student.setException(false);
-                student.setSliceCount(0);
-                student.setSheetCount(0);
-                student.setObjectiveScore(0d);
-                student.setSubjectiveScore(0d);
-                if (checkExamNumber(student, new HashMap<String, ExamStudent>(),new HashMap<String, ExamStudent>())) {
-                    studentService.save(student);
-                    addMessage(redirectAttributes, "考生" + student.getName() + "保存成功");
-                } else {
-                    addMessage(redirectAttributes, "准考证号" + student.getExamNumber() + "已存在");
-                    return "redirect:/admin/exam/student/add";
-                }
-            }
-        }
-        return "redirect:/admin/exam/student";
-    }
-
-    @RequestMapping(value = "/delete")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String delete(Integer id, RedirectAttributes redirectAttributes) {
-        ExamStudent student = studentService.findById(id);
-        if (student != null) {
-            studentService.deleteById(id);
-            libraryService.deleteByStudent(id);
-            subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode());
-            groupService.updateLibraryCount(student.getExamId(), student.getSubjectCode());
-            addMessage(redirectAttributes, "删除考生成功");
-        } else {
-            addMessage(redirectAttributes, "找不到对应的考生");
-        }
-        return "redirect:/admin/exam/student";
-    }
-
-    @RequestMapping(value = "/template")
-    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
-        try {
-            String fileName = "考生数据导入模板.xlsx";
-            List<ExamStudent> list = Lists.newArrayList();
-            list.add(new ExamStudent());
-            new ExportExcel("考生数据", ExamStudent.class, 2).setDataList(list).write(response, fileName).dispose();
-            return null;
-        } catch (Exception e) {
-            addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
-        }
-        return "redirect:/admin/exam/student";
-    }
-
-    @RequestMapping(value = "/import", method = RequestMethod.POST)
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
-        int examId = getSessionExamId(request);
-        Exam exam = examService.findById(examId);
-        try {
-            int successNum = 0;
-            int failureNum = 0;
-            StringBuilder failureMsg = new StringBuilder();
-            ImportExcel ei = new ImportExcel(file, 1, 0);
-            List<ExamStudent> list = ei.getDataList(ExamStudent.class);
-            List<ExamStudent> saveList = new LinkedList<ExamStudent>();
-            Map<String, ExamStudent> saveMap = new HashMap<String, ExamStudent>();
-            Map<String, ExamStudent> current = null;
-            // 当数据库中已存在考生小于一定数量,则一次性取出所有考生,用于校验准考证号是否重复
-            if (studentService.countByExamId(examId) < 10000) {
-                current = new HashMap<String, ExamStudent>();
-                List<ExamStudent> list2 = studentService.findByExamId(examId);
-                for (ExamStudent s : list2) {
-                    current.put(s.getExamNumber(), s);
-                }
-            }
-
-            for (ExamStudent student : list) {
-                if (StringUtils.isBlank(student.getStudentCode()) || StringUtils.isBlank(student.getName())
-                        || StringUtils.isBlank(student.getSubjectCode())
-                        || StringUtils.isBlank(student.getSubjectName())
-                        || StringUtils.isBlank(student.getCampusName())) {
-                    continue;
-                }
-
-                student.setExamId(examId);
-                student.setSchoolId(exam.getSchoolId());
-                student.setAbsent(false);
-                student.setUpload(false);
-                student.setException(false);
-                student.setSliceCount(0);
-                student.setSheetCount(0);
-                student.setObjectiveScore(0d);
-                student.setSubjectiveScore(0d);
-
-                if (checkExamNumber(student, current,saveMap)) {
-                    saveList.add(student);
-                    saveMap.put(student.getExamNumber(), student);
-                } else {
-                    failureMsg.append("<br/>准考证号 " + student.getExamNumber() + " 已存在; ");
-                    failureNum++;
-                }
-            }
-
-            successNum = studentService.batchSave(saveList);
-
-            if (failureNum > 0) {
-                failureMsg.insert(0, ",失败 " + failureNum + " 条用户");
-            }
-            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条用户" + failureMsg);
-        } catch (Exception e) {
-            log.error("Batch import student error!", e);
-            addMessage(redirectAttributes, "导入考生失败!失败信息:" + e.getMessage());
-        }
-        return "redirect:/admin/exam/student";
-    }
-
-    @RequestMapping(value = "/export", method = RequestMethod.POST)
-    public String exportFile(ExamStudentSearchQuery query, HttpServletRequest request, HttpServletResponse response,
-            RedirectAttributes redirectAttributes) {
-        WebUser wu = RequestUtils.getWebUser(request);
-        int examId = getSessionExamId(request);
-        try {
-            query.setPageNumber(1);
-            query.setPageSize(Integer.MAX_VALUE);
-            query.setExamId(examId);
-            query.orderByExamNumber();
-            subjectFilter(query, wu);
-            query = studentService.findByQuery(query);
-            for (ExamStudent student : query.getResult()) {
-                ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-                student.setSubjectName(subject != null ? subject.getName() : "");
-                student.setSubjectLevel(subject != null ? subject.getLevel() : "");
-                student.setSubjectCategory(subject != null ? subject.getCategory() : "");
-                student.setSubjectRemark(subject != null ? subject.getRemark() : "");
-            }
-            String fileName = "考生数据.xlsx";
-            new ExportExcel("考生数据", ExamStudent.class).setDataList(query.getResult()).write(response, fileName)
-                    .dispose();
-            return null;
-        } catch (Exception e) {
-            addMessage(redirectAttributes, "导出考生数据失败!" + e.getMessage());
-        }
-        return "redirect:/admin/exam/student";
-    }
-
-    private boolean checkExamNumber(ExamStudent student, Map<String, ExamStudent> current, Map<String, ExamStudent> saveMap) {
-        ExamStudent previous =  saveMap.get(student.getExamNumber());
-
-        if (previous != null) {
-            return false;
-        }
-
-        if (current != null) {
-            previous = current.get(student.getExamNumber());
-        } else {
-            previous = studentService.findByExamIdAndExamNumber(student.getExamId(), student.getExamNumber());
-        }
-
-        if (previous == null) {
-            return true;
-        }
-        if (student.getId() != null && student.getId().intValue() == previous.getId().intValue()) {
-            return true;
-        }
-        return false;
-    }
-
-    private void buildSheetUrl(ExamStudent student) {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        student.setSheetUrls(PictureUrlBuilder.getSheetUrls(student.getExamId(), campus.getId(),
-                student.getSubjectCode(), student.getExamNumber(), student.getSheetCount()));
-    }
-}
+package cn.com.qmth.stmms.admin.exam;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+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.service.MarkService;
+import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
+import cn.com.qmth.stmms.common.utils.ImportExcel;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+
+@Controller("examStudentController")
+@RequestMapping("/admin/exam/student")
+public class StudentController extends BaseExamController {
+
+    protected static Logger log = LoggerFactory.getLogger(StudentController.class);
+
+    @Autowired
+    private CampusService campusService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private MarkService markService;
+
+    @Value("${sheet.image.server}")
+    private String imageServer;
+
+    @RequestMapping
+    public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        int examId = getSessionExamId(request);
+        query.setExamId(examId);
+        if (query.getBatchCode() != null) {
+            query.setBatchCode(StringUtils.upperCase(query.getBatchCode()));
+        }
+        subjectFilter(query, wu);
+        query = studentService.findByQuery(query);
+        if (query.getCurrentCount() > 0) {
+            for (ExamStudent student : query.getResult()) {
+                student.setSubject(subjectService.find(student.getExamId(), student.getSubjectCode()));
+                buildSheetUrl(student);
+            }
+            model.addAttribute("studentList", query.getResult());
+        }
+        model.addAttribute("query", query);
+        model.addAttribute("campusList", studentService.findDistinctCampusName(examId));
+        model.addAttribute("subjectList", getExamSubject(examId, wu));
+        model.addAttribute("levelList", subjectService.listLevel(examId));
+        model.addAttribute("categoryList", subjectService.listCategory(examId));
+        model.addAttribute("imageServer", imageServer);
+        return "modules/exam/studentList";
+    }
+
+    @RequestMapping(value = "/add")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String form(HttpServletRequest request, ExamStudent student, Model model) {
+        Exam exam = examService.findById(getSessionExamId(request));
+        model.addAttribute("student", student);
+        model.addAttribute("subjectList", getExamSubject(exam.getId(), RequestUtils.getWebUser(request)));
+        model.addAttribute("campusList", studentService.findDistinctCampusName(exam.getId()));
+        return "modules/exam/studentForm";
+    }
+
+    @RequestMapping(value = "/update")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String update(HttpServletRequest request, Integer id, Model model) {
+        Exam exam = examService.findById(getSessionExamId(request));
+        ExamStudent student = studentService.findById(id);
+        model.addAttribute("student", student);
+        model.addAttribute("subjectList", getExamSubject(exam.getId(), RequestUtils.getWebUser(request)));
+        model.addAttribute("campusList", studentService.findDistinctCampusName(exam.getId()));
+        return "modules/exam/studentForm";
+    }
+
+    @RequestMapping(value = "/save")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String save(ExamStudent student, Model model, RedirectAttributes redirectAttributes,
+            HttpServletRequest request, HttpServletResponse response) {
+        int examId = getSessionExamId(request);
+        Exam exam = examService.findById(examId);
+        ExamSubject subject = subjectService.find(examId, student.getSubjectCode());
+        Campus campus = campusService.findBySchoolAndName(exam.getSchoolId(), student.getCampusName());
+        if (subject == null) {
+            addMessage(redirectAttributes, "科目不存在");
+        } else if (campus == null) {
+            addMessage(redirectAttributes, "学习中心不存在");
+        } else {
+            if (student.getId() != null) {
+                ExamStudent previous = studentService.findById(student.getId());
+                if (previous != null) {
+                    // String previousSubjectCode = previous.getSubjectCode();
+                    if (!previous.isUpload()) {
+                        // 还未扫描上传的考生,才能修改准考证号、学习中心、科目
+                        previous.setCampusName(student.getCampusName());
+                        previous.setSubjectCode(subject.getCode());
+                        previous.setSubjectName(subject.getName());
+                        previous.setExamNumber(student.getExamNumber());
+                    }
+                    previous.setStudentCode(student.getStudentCode());
+                    previous.setName(student.getName());
+                    previous.setPackageCode(student.getPackageCode());
+                    if (checkExamNumber(previous, new HashMap<String, ExamStudent>(),
+                            new HashMap<String, ExamStudent>())) {
+                        previous = studentService.save(previous);
+                        // if
+                        // (!previousSubjectCode.equals(previous.getSubjectCode()))
+                        // {
+                        // // 更新科目上传考生数量
+                        // subjectService.updateUploadCount(examId,
+                        // previousSubjectCode);
+                        // subjectService.updateUploadCount(examId,
+                        // previous.getSubjectCode());
+                        // // 删除已生成的评卷任务
+                        // libraryService.deleteByStudent(previous.getId());
+                        // // 更新科目大题任务数量
+                        // groupService.updateLibraryCount(examId,
+                        // previousSubjectCode);
+                        // // 重置科目所有大题构造评卷任务时间
+                        // groupService.resetBuildTime(examId,
+                        // previous.getSubjectCode());
+                        // }
+                        addMessage(redirectAttributes, "考生" + previous.getName() + "保存成功");
+                    } else {
+                        addMessage(redirectAttributes, "准考证号" + previous.getExamNumber() + "已存在");
+                        redirectAttributes.addAttribute("id", student.getId());
+                        return "redirect:/admin/exam/student/update";
+                    }
+                } else {
+                    addMessage(redirectAttributes, "考生不存在");
+                }
+            } else {
+                student.setExamId(examId);
+                student.setSchoolId(exam.getSchoolId());
+                student.setSubjectName(subject.getName());
+                student.setAbsent(false);
+                student.setUpload(false);
+                student.setException(false);
+                student.setSliceCount(0);
+                student.setSheetCount(0);
+                student.setObjectiveScore(0d);
+                student.setSubjectiveScore(0d);
+                if (checkExamNumber(student, new HashMap<String, ExamStudent>(), new HashMap<String, ExamStudent>())) {
+                    studentService.save(student);
+                    addMessage(redirectAttributes, "考生" + student.getName() + "保存成功");
+                } else {
+                    addMessage(redirectAttributes, "准考证号" + student.getExamNumber() + "已存在");
+                    return "redirect:/admin/exam/student/add";
+                }
+            }
+        }
+        return "redirect:/admin/exam/student";
+    }
+
+    @RequestMapping(value = "/delete")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String delete(Integer id, RedirectAttributes redirectAttributes) {
+        ExamStudent student = studentService.findById(id);
+        if (student != null) {
+            studentService.deleteById(id);
+            markService.deleteByStudent(student);
+            subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode());
+            addMessage(redirectAttributes, "删除考生成功");
+        } else {
+            addMessage(redirectAttributes, "找不到对应的考生");
+        }
+        return "redirect:/admin/exam/student";
+    }
+
+    @RequestMapping(value = "/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        try {
+            String fileName = "考生数据导入模板.xlsx";
+            List<ExamStudent> list = Lists.newArrayList();
+            list.add(new ExamStudent());
+            new ExportExcel("考生数据", ExamStudent.class, 2).setDataList(list).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:/admin/exam/student";
+    }
+
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
+        int examId = getSessionExamId(request);
+        Exam exam = examService.findById(examId);
+        try {
+            int successNum = 0;
+            int failureNum = 0;
+            StringBuilder failureMsg = new StringBuilder();
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<ExamStudent> list = ei.getDataList(ExamStudent.class);
+            List<ExamStudent> saveList = new LinkedList<ExamStudent>();
+            Map<String, ExamStudent> saveMap = new HashMap<String, ExamStudent>();
+            Map<String, ExamStudent> current = null;
+            // 当数据库中已存在考生小于一定数量,则一次性取出所有考生,用于校验准考证号是否重复
+            if (studentService.countByExamId(examId) < 10000) {
+                current = new HashMap<String, ExamStudent>();
+                List<ExamStudent> list2 = studentService.findByExamId(examId);
+                for (ExamStudent s : list2) {
+                    current.put(s.getExamNumber(), s);
+                }
+            }
+
+            for (ExamStudent student : list) {
+                if (StringUtils.isBlank(student.getStudentCode()) || StringUtils.isBlank(student.getName())
+                        || StringUtils.isBlank(student.getSubjectCode())
+                        || StringUtils.isBlank(student.getSubjectName())
+                        || StringUtils.isBlank(student.getCampusName())) {
+                    continue;
+                }
+
+                student.setExamId(examId);
+                student.setSchoolId(exam.getSchoolId());
+                student.setAbsent(false);
+                student.setUpload(false);
+                student.setException(false);
+                student.setSliceCount(0);
+                student.setSheetCount(0);
+                student.setObjectiveScore(0d);
+                student.setSubjectiveScore(0d);
+
+                if (checkExamNumber(student, current, saveMap)) {
+                    saveList.add(student);
+                    saveMap.put(student.getExamNumber(), student);
+                } else {
+                    failureMsg.append("<br/>准考证号 " + student.getExamNumber() + " 已存在; ");
+                    failureNum++;
+                }
+            }
+
+            successNum = studentService.batchSave(saveList);
+
+            if (failureNum > 0) {
+                failureMsg.insert(0, ",失败 " + failureNum + " 条用户");
+            }
+            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条用户" + failureMsg);
+        } catch (Exception e) {
+            log.error("Batch import student error!", e);
+            addMessage(redirectAttributes, "导入考生失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:/admin/exam/student";
+    }
+
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    public String exportFile(ExamStudentSearchQuery query, HttpServletRequest request, HttpServletResponse response,
+            RedirectAttributes redirectAttributes) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        int examId = getSessionExamId(request);
+        try {
+            query.setPageNumber(1);
+            query.setPageSize(Integer.MAX_VALUE);
+            query.setExamId(examId);
+            query.orderByExamNumber();
+            subjectFilter(query, wu);
+            query = studentService.findByQuery(query);
+            for (ExamStudent student : query.getResult()) {
+                ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
+                student.setSubjectName(subject != null ? subject.getName() : "");
+                student.setSubjectLevel(subject != null ? subject.getLevel() : "");
+                student.setSubjectCategory(subject != null ? subject.getCategory() : "");
+                student.setSubjectRemark(subject != null ? subject.getRemark() : "");
+            }
+            String fileName = "考生数据.xlsx";
+            new ExportExcel("考生数据", ExamStudent.class).setDataList(query.getResult()).write(response, fileName)
+                    .dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导出考生数据失败!" + e.getMessage());
+        }
+        return "redirect:/admin/exam/student";
+    }
+
+    private boolean checkExamNumber(ExamStudent student, Map<String, ExamStudent> current,
+            Map<String, ExamStudent> saveMap) {
+        ExamStudent previous = saveMap.get(student.getExamNumber());
+
+        if (previous != null) {
+            return false;
+        }
+
+        if (current != null) {
+            previous = current.get(student.getExamNumber());
+        } else {
+            previous = studentService.findByExamIdAndExamNumber(student.getExamId(), student.getExamNumber());
+        }
+
+        if (previous == null) {
+            return true;
+        }
+        if (student.getId() != null && student.getId().intValue() == previous.getId().intValue()) {
+            return true;
+        }
+        return false;
+    }
+
+    private void buildSheetUrl(ExamStudent student) {
+        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
+        student.setSheetUrls(PictureUrlBuilder.getSheetUrls(student.getExamId(), campus.getId(),
+                student.getSubjectCode(), student.getExamNumber(), student.getSheetCount()));
+    }
+}

+ 131 - 137
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TagController.java

@@ -1,137 +1,131 @@
-package cn.com.qmth.stmms.admin.exam;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.TagService;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.DateUtils;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
-
-@Controller("tagController")
-@RequestMapping("/admin/exam/tag")
-public class TagController extends BaseExamController {
-
-    protected static Logger log = LoggerFactory.getLogger(TagController.class);
-
-    @Autowired
-    private CampusService campusService;
-
-    @Autowired
-    ExamSubjectService subjectService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    MarkLibraryService libraryService;
-
-    @Autowired
-    private MarkGroupService groupService;
-
-    @Autowired
-    private TagService tagService;
-
-    @Value("${sheet.image.server}")
-    private String imageServer;
-
-    /**
-     * 标记试卷处理
-     * 
-     * @param request
-     * @param model
-     * @param query
-     * @return
-     */
-    @RequestMapping
-    public String list(HttpServletRequest request, Model model, MarkLibrarySearchQuery query) {
-        WebUser wu = RequestUtils.getWebUser(request);
-        int examId = getSessionExamId(request);
-        query.setExamId(examId);
-        query.setTagNotNull(true);
-        query.orderByExamNumber();
-        if (query.getTagId() == 0) {
-            query.setTagId(1);
-        }
-        subjectFilter(query, wu);
-        query = libraryService.findByQuery(query);
-
-        List<ExamStudent> list = new LinkedList<ExamStudent>();
-        for (MarkLibrary library : query.getResult()) {
-            ExamStudent student = studentService.findById(library.getStudentId());
-            student.setSheetUrls(PictureUrlBuilder.getSheetUrls(examId, library.getCampusId(), student.getSubjectCode(),
-                    student.getExamNumber(), student.getSheetCount()));
-            student.setMarkTime(DateUtils.formatDateTime(library.getMarkerTime()));
-            student.setLibraryId(library.getId());
-            list.add(student);
-        }
-        model.addAttribute("resultList", list);
-        model.addAttribute("query", query);
-        model.addAttribute("subjectList", getTagSubject(examId, wu));
-        model.addAttribute("campusList", getTagCampus(examId));
-        model.addAttribute("tagList", tagService.findAll());
-        model.addAttribute("imageServer", imageServer);
-        return "modules/exam/tagInfo";
-    }
-
-    @RequestMapping("/back")
-    @ResponseBody
-    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    public Object back(HttpServletRequest request, @RequestParam Integer libraryId) {
-        JSONObject result = new JSONObject();
-        MarkLibrary library = libraryService.findById(libraryId);
-        if (library != null) {
-            if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
-                libraryService.backById(library.getId());
-                groupService.updateLibraryCount(library.getExamId(), library.getSubjectCode(),
-                        library.getGroupNumber());
-                result.accumulate("success", true);
-            } else {
-                result.accumulate("success", false);
-                result.accumulate("message", "没有操作该评卷任务的权限");
-            }
-        } else {
-            result.accumulate("success", false);
-            result.accumulate("message", "找不到对应的评卷任务");
-        }
-        return result;
-    }
-
-    private List<Campus> getTagCampus(int examId) {
-        List<Campus> list = new LinkedList<Campus>();
-        List<Integer> ids = libraryService.findTagCampusId(examId);
-        for (Integer id : ids) {
-            Campus campus = campusService.findById(id);
-            if (campus != null) {
-                list.add(campus);
-            }
-        }
-        return list;
-    }
-
-}
+package cn.com.qmth.stmms.admin.exam;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.TagService;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.DateUtils;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
+
+@Controller("tagController")
+@RequestMapping("/admin/exam/tag")
+public class TagController extends BaseExamController {
+
+    protected static Logger log = LoggerFactory.getLogger(TagController.class);
+
+    @Autowired
+    private CampusService campusService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private MarkLibraryService libraryService;
+
+    @Autowired
+    private TagService tagService;
+
+    @Autowired
+    private MarkService markService;
+
+    @Value("${sheet.image.server}")
+    private String imageServer;
+
+    /**
+     * 标记试卷处理
+     * 
+     * @param request
+     * @param model
+     * @param query
+     * @return
+     */
+    @RequestMapping
+    public String list(HttpServletRequest request, Model model, MarkLibrarySearchQuery query) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        int examId = getSessionExamId(request);
+        query.setExamId(examId);
+        query.setTagNotNull(true);
+        query.orderByExamNumber();
+        if (query.getTagId() == 0) {
+            query.setTagId(1);
+        }
+        subjectFilter(query, wu);
+        query = libraryService.findByQuery(query);
+
+        List<ExamStudent> list = new LinkedList<ExamStudent>();
+        for (MarkLibrary library : query.getResult()) {
+            ExamStudent student = studentService.findById(library.getStudentId());
+            student.setSheetUrls(PictureUrlBuilder.getSheetUrls(examId, library.getCampusId(), student.getSubjectCode(),
+                    student.getExamNumber(), student.getSheetCount()));
+            student.setMarkTime(DateUtils.formatDateTime(library.getMarkerTime()));
+            student.setLibraryId(library.getId());
+            list.add(student);
+        }
+        model.addAttribute("resultList", list);
+        model.addAttribute("query", query);
+        model.addAttribute("subjectList", getTagSubject(examId, wu));
+        model.addAttribute("campusList", getTagCampus(examId));
+        model.addAttribute("tagList", tagService.findAll());
+        model.addAttribute("imageServer", imageServer);
+        return "modules/exam/tagInfo";
+    }
+
+    @RequestMapping("/back")
+    @ResponseBody
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    public Object back(HttpServletRequest request, @RequestParam Integer libraryId) {
+        JSONObject result = new JSONObject();
+        MarkLibrary library = libraryService.findById(libraryId);
+        if (library != null) {
+            if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
+                markService.backLibrary(library);
+                result.accumulate("success", true);
+            } else {
+                result.accumulate("success", false);
+                result.accumulate("message", "没有操作该评卷任务的权限");
+            }
+        } else {
+            result.accumulate("success", false);
+            result.accumulate("message", "找不到对应的评卷任务");
+        }
+        return result;
+    }
+
+    private List<Campus> getTagCampus(int examId) {
+        List<Campus> list = new LinkedList<Campus>();
+        List<Integer> ids = libraryService.findTagCampusId(examId);
+        for (Integer id : ids) {
+            Campus campus = campusService.findById(id);
+            if (campus != null) {
+                list.add(campus);
+            }
+        }
+        return list;
+    }
+
+}

+ 0 - 23
stmms-web/src/main/java/cn/com/qmth/stmms/admin/quartz/ScheduleRunner.java

@@ -1,23 +0,0 @@
-package cn.com.qmth.stmms.admin.quartz;
-
-import cn.com.qmth.stmms.biz.mark.service.Impl.TaskServiceImpl;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ScheduleRunner {
-    
-    @Value("${jvm.cleanMapinterval}")
-    private long cleanMapinterval;
-	@Scheduled(cron = "${jvm.cleanMapTimer}")
-    public void schClearTaskMap() {
-	    TaskService taskServiceImpl = new TaskServiceImpl();
-		try {
-			taskServiceImpl.clearTaskMap(cleanMapinterval);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-    }
-}

+ 163 - 158
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java

@@ -1,158 +1,163 @@
-package cn.com.qmth.stmms.common.controller;
-
-import java.beans.PropertyEditorSupport;
-import java.util.Date;
-
-import org.apache.commons.lang3.StringEscapeUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.propertyeditors.CustomBooleanEditor;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.biz.user.service.UserService;
-import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
-import cn.com.qmth.stmms.biz.utils.ScoreInfo;
-import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.DateUtils;
-
-public class BaseController {
-
-    @Autowired
-    private UserService userService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private ExamQuestionService questionService;
-
-    protected boolean checkLoginName(User user) {
-        User previous = userService.findByLoginName(user.getLoginName());
-        if (previous == null || (user.getId() != null && previous.getId().equals(user.getId()))) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * 初始化数据绑定 1. 将所有传递进来的String进行HTML编码,防止XSS攻击 2. 将字段中Date类型转换为String类型
-     */
-    @InitBinder
-    protected void initBinder(WebDataBinder binder) {
-        // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
-        binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
-
-            @Override
-            public void setAsText(String text) {
-                setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
-            }
-
-            @Override
-            public String getAsText() {
-                Object value = getValue();
-                return value != null ? value.toString() : "";
-            }
-        });
-        // Date 类型转换
-        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
-
-            @Override
-            public void setAsText(String text) {
-                setValue(DateUtils.parseDate(text));
-            }
-        });
-        // ExamSubjectStatus 类型转换
-        binder.registerCustomEditor(ExamSubjectStatus.class, new PropertyEditorSupport() {
-
-            @Override
-            public void setAsText(String text) {
-                try {
-                    setValue(ExamSubjectStatus.findByValue(Integer.valueOf(text)));
-                } catch (Exception e) {
-                    setValue(null);
-                }
-            }
-        });
-        // LibraryStatus 类型转换
-        binder.registerCustomEditor(LibraryStatus.class, new PropertyEditorSupport() {
-
-            @Override
-            public void setAsText(String text) {
-                try {
-                    setValue(LibraryStatus.findByValue(Integer.valueOf(text)));
-                } catch (Exception e) {
-                    setValue(null);
-                }
-            }
-        });
-        // Role 类型转换
-        binder.registerCustomEditor(Role.class, new PropertyEditorSupport() {
-
-            @Override
-            public void setAsText(String text) {
-                try {
-                    setValue(Role.findByValue(Integer.valueOf(text)));
-                } catch (Exception e) {
-                    setValue(null);
-                }
-            }
-        });
-
-        binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
-    }
-
-    protected ExamStudent saveUploadStudent(ExamStudent student) {
-        if (student.isAbsent()) {
-            // 缺考则强制删除评卷任务
-            // libraryService.deleteByStudent(student.getId());
-        } else {
-            // MarkLibrary library =
-            // libraryService.findByStudentId(student.getId());
-            // if (library == null) {
-            // Campus campus =
-            // campusSerivce.findBySchoolAndName(student.getSchoolId(),
-            // student.getCampusName());
-            //
-            // library = new MarkLibrary();
-            // library.setExamId(student.getExamId());
-            // library.setSubjectCode(student.getSubjectCode());
-            // library.setCampusId(campus.getId());
-            // library.setStudentId(student.getId());
-            // library.setExamNumber(student.getExamNumber());
-            // library.setPicStart(1);
-            // library.setPicCount(student.getSliceCount());
-            // library.setStatus(LibraryStatus.WAITING);
-            // } else {
-            // library.setPicCount(student.getSliceCount());
-            // }
-            // calculateObjectiveScore(student);
-            // libraryService.save(library);
-        }
-        calculateObjectiveScore(student);
-        ExamStudent saved = studentService.save(student);
-        subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode());
-        return saved;
-    }
-
-    private void calculateObjectiveScore(ExamStudent student) {
-        ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
-
-        ScoreInfo info = util.calculate(
-                questionService.findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), true),
-                null);
-
-        student.setObjectiveScore(info.getObjectiveScore());
-        student.setScoreList(info.getScoreList(), true);
-    }
-}
+package cn.com.qmth.stmms.common.controller;
+
+import java.beans.PropertyEditorSupport;
+import java.util.Date;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.propertyeditors.CustomBooleanEditor;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+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.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
+import cn.com.qmth.stmms.biz.utils.ScoreInfo;
+import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.DateUtils;
+
+public class BaseController {
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamQuestionService questionService;
+
+    protected boolean checkLoginName(User user) {
+        User previous = userService.findByLoginName(user.getLoginName());
+        if (previous == null || (user.getId() != null && previous.getId().equals(user.getId()))) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 初始化数据绑定 1. 将所有传递进来的String进行HTML编码,防止XSS攻击 2. 将字段中Date类型转换为String类型
+     */
+    @InitBinder
+    protected void initBinder(WebDataBinder binder) {
+        // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
+        binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
+            }
+
+            @Override
+            public String getAsText() {
+                Object value = getValue();
+                return value != null ? value.toString() : "";
+            }
+        });
+        // Date 类型转换
+        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                setValue(DateUtils.parseDate(text));
+            }
+        });
+        // ExamSubjectStatus 类型转换
+        binder.registerCustomEditor(ExamSubjectStatus.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(ExamSubjectStatus.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
+        // LibraryStatus 类型转换
+        binder.registerCustomEditor(LibraryStatus.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(LibraryStatus.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
+        // Role 类型转换
+        binder.registerCustomEditor(Role.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(Role.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
+
+        binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
+    }
+
+    protected ExamStudent saveUploadStudent(ExamStudent student) {
+        if (student.isAbsent()) {
+            // 缺考则强制删除评卷任务
+            // libraryService.deleteByStudent(student.getId());
+        } else {
+            // MarkLibrary library =
+            // libraryService.findByStudentId(student.getId());
+            // if (library == null) {
+            // Campus campus =
+            // campusSerivce.findBySchoolAndName(student.getSchoolId(),
+            // student.getCampusName());
+            //
+            // library = new MarkLibrary();
+            // library.setExamId(student.getExamId());
+            // library.setSubjectCode(student.getSubjectCode());
+            // library.setCampusId(campus.getId());
+            // library.setStudentId(student.getId());
+            // library.setExamNumber(student.getExamNumber());
+            // library.setPicStart(1);
+            // library.setPicCount(student.getSliceCount());
+            // library.setStatus(LibraryStatus.WAITING);
+            // } else {
+            // library.setPicCount(student.getSliceCount());
+            // }
+            // calculateObjectiveScore(student);
+            // libraryService.save(library);
+        }
+        calculateObjectiveScore(student);
+        ExamStudent saved = studentService.save(student);
+        examService.updateUploadTime(student.getExamId());
+        subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode());
+        return saved;
+    }
+
+    private void calculateObjectiveScore(ExamStudent student) {
+        ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
+
+        ScoreInfo info = util.calculate(
+                questionService.findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), true),
+                null);
+
+        student.setObjectiveScore(info.getObjectiveScore());
+        student.setScoreList(info.getScoreList(), true);
+    }
+}

+ 19 - 46
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -30,6 +30,7 @@ import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
 import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
@@ -60,6 +61,9 @@ public class MarkController extends BaseController {
     @Autowired
     @Autowired
     private TagService tagService;
     private TagService tagService;
 
 
+    @Autowired
+    private MarkService markService;
+
     @Value("${slice.image.server}")
     @Value("${slice.image.server}")
     private String sliceServer;
     private String sliceServer;
 
 
@@ -96,7 +100,7 @@ public class MarkController extends BaseController {
         modelAndView.addObject("subjectList", subjectService.list(marker.getExamId(), ExamSubjectStatus.MARKING, 0));
         modelAndView.addObject("subjectList", subjectService.list(marker.getExamId(), ExamSubjectStatus.MARKING, 0));
 
 
         if (StringUtils.isNotBlank(marker.getSubjectCode())) {
         if (StringUtils.isNotBlank(marker.getSubjectCode())) {
-            clearCurrentTask(marker);
+            markService.releaseByMarker(marker);
         }
         }
         return modelAndView;
         return modelAndView;
     }
     }
@@ -136,7 +140,7 @@ public class MarkController extends BaseController {
     @RequestMapping("/logout")
     @RequestMapping("/logout")
     public ModelAndView logout(HttpServletRequest request) {
     public ModelAndView logout(HttpServletRequest request) {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         Marker marker = RequestUtils.getWebUser(request).getMarker();
-        clearCurrentTask(marker);
+        markService.releaseByMarker(marker);
         return new ModelAndView("redirect:/mark-logout");
         return new ModelAndView("redirect:/mark-logout");
     }
     }
 
 
@@ -154,7 +158,7 @@ public class MarkController extends BaseController {
         modelAndView.addObject("cardServer", cardServer);
         modelAndView.addObject("cardServer", cardServer);
         modelAndView.addObject("marker", marker);
         modelAndView.addObject("marker", marker);
         modelAndView.addObject("subject", subjectService.find(marker.getExamId(), marker.getSubjectCode()));
         modelAndView.addObject("subject", subjectService.find(marker.getExamId(), marker.getSubjectCode()));
-        clearCurrentTask(marker);
+        markService.releaseByMarker(marker);
     }
     }
 
 
     @RequestMapping("/clear")
     @RequestMapping("/clear")
@@ -163,7 +167,7 @@ public class MarkController extends BaseController {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         if (marker != null) {
         if (marker != null) {
             // 清除该评卷员当前正在评卷的指定任务
             // 清除该评卷员当前正在评卷的指定任务
-            clearCurrentTask(marker);
+            markService.releaseByMarker(marker);
         }
         }
     }
     }
 
 
@@ -239,7 +243,7 @@ public class MarkController extends BaseController {
                 break;
                 break;
             }
             }
             for (MarkLibrary library : list) {
             for (MarkLibrary library : list) {
-                if (setCurrentTask(marker, library)) {
+                if (markService.applyLibrary(library, marker)) {
                     task = taskService.build(library);
                     task = taskService.build(library);
                     setTaskParameter(task, marker);
                     setTaskParameter(task, marker);
                     break;
                     break;
@@ -259,8 +263,16 @@ public class MarkController extends BaseController {
         JSONObject result = new JSONObject();
         JSONObject result = new JSONObject();
         try {
         try {
             task.setSpent((new Date().getTime() - task.getSpent()) / 1000);
             task.setSpent((new Date().getTime() - task.getSpent()) / 1000);
-            if (taskService.submit(task)) {
-                releaseCurrentTask(marker, task);
+            MarkLibrary library = libraryService.findById(task.getLibraryId());
+            if (library != null && library.getStatus() == LibraryStatus.WAITING) {
+                library.setMarkerId(marker.getId());
+                library.setMarkerTime(new Date());
+                library.setMarkerScore(task.getTotalScore());
+                library.setMarkerScoreList(task.getScoreList());
+                library.setStatus(LibraryStatus.MARKED);
+                library.setTags(StringUtils.trimToNull(task.getTags()));
+                markService.submitLibrary(library, task.getTrackMap(library), task.getSpecialTagList(library));
+                markService.releaseLibrary(library, marker);
                 result.accumulate("success", true);
                 result.accumulate("success", true);
                 result.accumulate("status", status(request));
                 result.accumulate("status", status(request));
             } else {
             } else {
@@ -328,43 +340,4 @@ public class MarkController extends BaseController {
         return array;
         return array;
     }
     }
 
 
-    /**
-     * 清除当前评卷员正在评卷的所有任务记录
-     * 
-     * @param marker
-     * @param task
-     * @param session
-     */
-    private void clearCurrentTask(Marker marker) {
-        taskService.clearCurrent(marker);
-    }
-
-    /**
-     * 清除当前评卷员已给分的评卷任务
-     * 
-     * @param marker
-     * @param task
-     * @param session
-     */
-    private void releaseCurrentTask(Marker marker, Task task) {
-        taskService.removeCurrent(marker, task.getLibraryId());
-    }
-
-    /**
-     * 尝试设置当前任务
-     * 
-     * @param marker
-     * @param libraryId
-     * @return
-     */
-    private boolean setCurrentTask(Marker marker, MarkLibrary library) {
-        // 首先判断多评情况下,同一个studentId是否已被该评卷员处理过
-        MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
-        query.setStudentId(library.getStudentId());
-        query.setMarkerId(marker.getId());
-        if (libraryService.countByQuery(query) > 0) {
-            return false;
-        }
-        return taskService.setCurrent(marker, library.getId());
-    }
 }
 }

+ 163 - 176
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkLeaderController.java

@@ -1,176 +1,163 @@
-package cn.com.qmth.stmms.mark;
-
-import java.util.Date;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONObject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-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.Marker;
-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.MarkerService;
-import cn.com.qmth.stmms.biz.exam.service.TagService;
-import cn.com.qmth.stmms.biz.mark.model.Task;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.common.controller.BaseController;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-@Controller
-@RequestMapping("/admin/mark/leader")
-public class MarkLeaderController extends BaseController {
-
-    private static Logger log = LoggerFactory.getLogger(MarkLeaderController.class);
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private MarkerService markerService;
-
-    @Autowired
-    private MarkLibraryService libraryService;
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private TagService tagService;
-    
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @RequestMapping("/index")
-    public ModelAndView index(HttpServletRequest request, @RequestParam(value = "studentId") Integer studentId) {
-    	ExamStudent student= studentService.findById(studentId);
-    	WebUser user= RequestUtils.getWebUser(request);
-    	Marker marker = new Marker();
-    	marker.setId(user.getId());
-    	marker.setName(user.getName());
-        marker.setExamId(student.getExamId());
-        marker.setSubjectCode(student.getSubjectCode());
-        ModelAndView modelAndView = new ModelAndView("modules/mark/markLeader");
-        preProcess(marker, studentId, modelAndView);
-        return modelAndView;
-    }
-
-    /**
-     * 进入评卷界面后的通用预处理
-     * 
-     * @param marker
-     * @param modelAndView
-     * @param modelAndView
-     */
-    private void preProcess(Marker marker,Integer studentId, ModelAndView modelAndView) {
-        modelAndView.addObject("sliceServer", sliceServer);
-        modelAndView.addObject("sheetServer", sheetServer);
-        modelAndView.addObject("cardServer", cardServer);
-        modelAndView.addObject("marker", marker);
-        modelAndView.addObject("studentId", studentId);
-        ExamStudent student= studentService.findById(studentId);
-        modelAndView.addObject("subject", subjectService.find(student.getExamId(), student.getSubjectCode()));
-    }
-
-    @RequestMapping("/status")
-    @ResponseBody
-    public JSONObject status(HttpServletRequest request,@RequestParam(value = "studentId",required = false) Integer studentId) {
-        JSONObject status = new JSONObject();
-        if(studentId==null){
-        	status.accumulate("valid", false);
-            status.accumulate("totalCount", 1);
-            status.accumulate("markedCount", 1);
-        }else{
-        	ExamStudent student= studentService.findById(studentId);
-        	ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        	if (subject == null || subject.getStatus() != ExamSubjectStatus.MARKING) {
-        		status.accumulate("valid", false);
-        		return status;
-        	}
-        	status.accumulate("valid", true);
-        }
-        return status;
-    }
-
-    @RequestMapping("/gettask")
-    @ResponseBody
-    public Task getTask(HttpServletRequest request, @RequestParam(value = "studentId", required = false) Integer studentId) {
-    	WebUser marker = RequestUtils.getWebUser(request);
-        Task task = null;
-        if (studentId == null) {
-            task = new Task();
-            task.setExist(false);
-            task.setMessage("当前无评卷任务");
-        }else{
-        	task = getTask(marker,studentId);
-        }
-        return task;
-    }
-
-    /**
-     * 设置任务通用属性
-     * 
-     * @param task
-     * @param marker
-     * @param stage
-     * @param count
-     * @param bmList
-     */
-    private void setTaskParameter(Task task, WebUser marker) {
-        task.setHeaderId(marker.getId());
-        task.setSpent(new Date().getTime());
-    }
-
-    private Task getTask(WebUser marker,Integer studentId) {
-        Task task = taskService.build(studentId);
-		setTaskParameter(task, marker);
-        return task;
-    }
-
-    @RequestMapping(value = "/savetask", method = RequestMethod.POST)
-    @ResponseBody
-    public JSONObject saveTask(HttpServletRequest request, @RequestBody Task task) {
-        JSONObject result = new JSONObject();
-        try {
-            task.setSpent((new Date().getTime() - task.getSpent()) / 1000);
-            if (taskService.submitByStudent(task)) {
-                result.accumulate("success", true);
-                result.accumulate("status", status(request,null));
-            } else {
-                result.accumulate("success", false);
-            }
-        } catch (Exception e) {
-            log.error("MarkController-保存任务出错", e);
-            result.accumulate("success", false);
-        }
-        return result;
-    }
-
-
-
-}
+package cn.com.qmth.stmms.mark;
+
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+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.Marker;
+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.model.Task;
+import cn.com.qmth.stmms.biz.mark.service.TaskService;
+import cn.com.qmth.stmms.common.controller.BaseController;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
+
+@Controller
+@RequestMapping("/admin/mark/leader")
+public class MarkLeaderController extends BaseController {
+
+    private static Logger log = LoggerFactory.getLogger(MarkLeaderController.class);
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private TaskService taskService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Value("${slice.image.server}")
+    private String sliceServer;
+
+    @Value("${sheet.image.server}")
+    private String sheetServer;
+
+    @Value("${card.server}")
+    private String cardServer;
+
+    @RequestMapping("/index")
+    public ModelAndView index(HttpServletRequest request, @RequestParam(value = "studentId") Integer studentId) {
+        ExamStudent student = studentService.findById(studentId);
+        WebUser user = RequestUtils.getWebUser(request);
+        Marker marker = new Marker();
+        marker.setId(user.getId());
+        marker.setName(user.getName());
+        marker.setExamId(student.getExamId());
+        marker.setSubjectCode(student.getSubjectCode());
+        ModelAndView modelAndView = new ModelAndView("modules/mark/markLeader");
+        preProcess(marker, studentId, modelAndView);
+        return modelAndView;
+    }
+
+    /**
+     * 进入评卷界面后的通用预处理
+     * 
+     * @param marker
+     * @param modelAndView
+     * @param modelAndView
+     */
+    private void preProcess(Marker marker, Integer studentId, ModelAndView modelAndView) {
+        modelAndView.addObject("sliceServer", sliceServer);
+        modelAndView.addObject("sheetServer", sheetServer);
+        modelAndView.addObject("cardServer", cardServer);
+        modelAndView.addObject("marker", marker);
+        modelAndView.addObject("studentId", studentId);
+        ExamStudent student = studentService.findById(studentId);
+        modelAndView.addObject("subject", subjectService.find(student.getExamId(), student.getSubjectCode()));
+    }
+
+    @RequestMapping("/status")
+    @ResponseBody
+    public JSONObject status(HttpServletRequest request,
+            @RequestParam(value = "studentId", required = false) Integer studentId) {
+        JSONObject status = new JSONObject();
+        if (studentId == null) {
+            status.accumulate("valid", false);
+            status.accumulate("totalCount", 1);
+            status.accumulate("markedCount", 1);
+        } else {
+            ExamStudent student = studentService.findById(studentId);
+            ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
+            if (subject == null || subject.getStatus() != ExamSubjectStatus.MARKING) {
+                status.accumulate("valid", false);
+                return status;
+            }
+            status.accumulate("valid", true);
+        }
+        return status;
+    }
+
+    @RequestMapping("/gettask")
+    @ResponseBody
+    public Task getTask(HttpServletRequest request,
+            @RequestParam(value = "studentId", required = false) Integer studentId) {
+        WebUser marker = RequestUtils.getWebUser(request);
+        Task task = null;
+        if (studentId == null) {
+            task = new Task();
+            task.setExist(false);
+            task.setMessage("当前无评卷任务");
+        } else {
+            task = getTask(marker, studentId);
+        }
+        return task;
+    }
+
+    /**
+     * 设置任务通用属性
+     * 
+     * @param task
+     * @param marker
+     * @param stage
+     * @param count
+     * @param bmList
+     */
+    private void setTaskParameter(Task task, WebUser marker) {
+        task.setHeaderId(marker.getId());
+        task.setSpent(new Date().getTime());
+    }
+
+    private Task getTask(WebUser marker, Integer studentId) {
+        Task task = taskService.build(studentId);
+        setTaskParameter(task, marker);
+        return task;
+    }
+
+    @RequestMapping(value = "/savetask", method = RequestMethod.POST)
+    @ResponseBody
+    public JSONObject saveTask(HttpServletRequest request, @RequestBody Task task) {
+        JSONObject result = new JSONObject();
+        try {
+            task.setSpent((new Date().getTime() - task.getSpent()) / 1000);
+            if (taskService.submitByStudent(task)) {
+                result.accumulate("success", true);
+                result.accumulate("status", status(request, null));
+            } else {
+                result.accumulate("success", false);
+            }
+        } catch (Exception e) {
+            log.error("MarkController-保存任务出错", e);
+            result.accumulate("success", false);
+        }
+        return result;
+    }
+
+}

+ 40 - 37
stmms-web/src/main/webapp/WEB-INF/application.properties

@@ -1,37 +1,40 @@
-#jdbc config
-driverClassName=com.mysql.jdbc.Driver
-#jdbc config
-url=jdbc:mysql://192.168.1.88:3306/stmms_fenti?useUnicode=true&characterEncoding=UTF-8
-username=root
-password=root
-
-#cookie config
-cookie.max.age=36000
-cookie.domain=
-cookie.path=/
-
-#server config
-##slice.image.server=http://gx-slice.b0.upaiyun.com
-##sheet.image.server=http://gx-sheet.b0.upaiyun.com
-##package.image.server=http://gx-package.b0.upaiyun.com
-##card.server=http://gx-card.b0.upaiyun.com
-##slice.image.server=http://${local.ip}:9000/gx-slice
-##sheet.image.server=http://${local.ip}:9000/gx-sheet
-##package.image.server=http://${local.ip}:9000/gx-package
-##card.server=http://${local.ip}:9000/gx-card
-slice.image.server=/file/ft-slice
-sheet.image.server=/file/ft-sheet
-package.image.server=/file/ft-package
-card.server=/file/ft-card
-
-##file root path
-file.root=/Users/luoshi/develop/data/stmms-gx/static
-
-##upyun image config
-upyun.sheet.bucket=ft-sheet
-upyun.sheet.username=qmth-picture
-upyun.sheet.password=qmth12345678
-
-upyun.slice.bucket=ft-slice
-upyun.slice.username=qmth-picture
-upyun.slice.password=qmth12345678
+#jdbc config
+driverClassName=com.mysql.jdbc.Driver
+#jdbc config
+url=jdbc:mysql://192.168.1.88:3306/stmms_fenti?useUnicode=true&characterEncoding=UTF-8
+username=root
+password=root
+
+#cookie config
+cookie.max.age=36000
+cookie.domain=
+cookie.path=/
+
+#server config
+##slice.image.server=http://gx-slice.b0.upaiyun.com
+##sheet.image.server=http://gx-sheet.b0.upaiyun.com
+##package.image.server=http://gx-package.b0.upaiyun.com
+##card.server=http://gx-card.b0.upaiyun.com
+##slice.image.server=http://${local.ip}:9000/gx-slice
+##sheet.image.server=http://${local.ip}:9000/gx-sheet
+##package.image.server=http://${local.ip}:9000/gx-package
+##card.server=http://${local.ip}:9000/gx-card
+slice.image.server=/file/ft-slice
+sheet.image.server=/file/ft-sheet
+package.image.server=/file/ft-package
+card.server=/file/ft-card
+
+##file root path
+file.root=/Users/luoshi/develop/data/stmms-gx/static
+
+##upyun image config
+upyun.sheet.bucket=ft-sheet
+upyun.sheet.username=qmth-picture
+upyun.sheet.password=qmth12345678
+
+upyun.slice.bucket=ft-slice
+upyun.slice.username=qmth-picture
+upyun.slice.password=qmth12345678
+
+mark.cleanTimeoutMinute=20
+mark.cleanSchedule=0 0/10 6-23 * * ?

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

@@ -0,0 +1,87 @@
+<%@ page language="java" pageEncoding="utf-8"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>讯飞云阅卷高校版</title>
+<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
+<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
+
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+
+<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
+
+<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/answer-view.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/paper-view.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+</head>
+<body>
+	<div class="container-fluid" id="container"></div>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			var mc = new MarkControl({
+				container : $('#container'),
+				staticServer : '${ctxStatic}',
+				imageServer : '${sliceServer}',
+				userName : '${web_user.name}',
+				logoutUrl: '${ctx}/mark/logout',
+				clearUrl: '${ctx}/mark/clear',
+				modules : {
+					'single-image-view' : {},
+					'image-builder': {},
+					'header-mark-status': {
+						title : '${group.subjectCode}-${group.number}'
+					},
+					'mark-board' : {
+						showScoreBoard : false,
+						autoSubmit : false,
+						needConfirm : false
+					},
+					'arbitration-process': {
+					},
+					'sheet-view' : {
+						server : '${sheetServer}'
+					},
+					'warning-info': {
+					},
+					'thumbnail':{
+					},
+					'view-sidebar':{
+						list: [
+							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
+							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
+						]
+					}
+				}
+			});
+			mc.start({
+				mode : 'loop',
+				statusUrl : '${ctx}/mark/status',
+				getUrl : '${ctx}/mark/gettask',
+				historyUrl : '${ctx}/mark/gethistory',
+				submitUrl : '${ctx}/mark/savetask',
+				clearUrl : '${ctx}/mark/clear'
+			});
+		});
+	</script>
+</body>
+</html>