Kaynağa Gözat

全卷复核

xiatian 1 yıl önce
ebeveyn
işleme
ccb73324dc

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

@@ -69,4 +69,8 @@ public interface ExamSubjectDao extends PagingAndSortingRepository<ExamSubject,
     @Query("update ExamSubject s set s.trialCount=?3 where s.pk.examId=?1 and s.pk.code=?2")
     public void updateTrialCount(int examId, String subjectCode, int trialCount);
 
+    @Modifying
+    @Query("update ExamSubject s set s.inspectRound=s.inspectRound+1 where s.pk.examId=?1 and s.pk.code=?2")
+	public void nextInspectRound(int examId, String subjectCode);
+
 }

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

@@ -26,4 +26,6 @@ public interface InspectHistoryDao extends PagingAndSortingRepository<InspectHis
     @Query("delete from InspectHistory m where m.examId=?1 and m.subjectCode=?2")
     void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
 
+	InspectHistory findByStudentIdAndInspectRound(Integer studentId, Integer inspectRound);
+
 }

+ 10 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -5,6 +5,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -362,7 +363,7 @@ public class ExamStudent implements Serializable {
     private String problemRestTime;
 
     @Transient
-    private List<InspectHistory> inspectHistoryList;
+    private Map<String,InspectHistory> inspectHistoryMap;
 
     public Integer getId() {
         return id;
@@ -913,15 +914,16 @@ public class ExamStudent implements Serializable {
         this.cardNumber = cardNumber;
     }
 
-    public List<InspectHistory> getInspectHistoryList() {
-        return inspectHistoryList;
-    }
 
-    public void setInspectHistoryList(List<InspectHistory> inspectHistoryList) {
-        this.inspectHistoryList = inspectHistoryList;
-    }
+    public Map<String, InspectHistory> getInspectHistoryMap() {
+		return inspectHistoryMap;
+	}
+
+	public void setInspectHistoryMap(Map<String, InspectHistory> inspectHistoryMap) {
+		this.inspectHistoryMap = inspectHistoryMap;
+	}
 
-    public Integer getInspectCount() {
+	public Integer getInspectCount() {
         return inspectCount;
     }
 

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

@@ -45,4 +45,8 @@ public interface ExamSubjectService {
 
     void updateTrialCount(int examId, String subjectCode, int trialCount);
 
+	int findMaxInspectRound(int examId, List<String> subjectCodes);
+
+	void nextInspectRound(int examId, String subjectCode);
+
 }

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/InspectHistoryService.java

@@ -8,12 +8,14 @@ public interface InspectHistoryService {
 
     InspectHistory save(InspectHistory i);
 
-    List<InspectHistory> findByStudentIdLimit3(Integer studentId);
-
     Integer countByStudentId(Integer studentId);
 
     void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
 
     void deleteByStudentId(Integer studentId);
 
+	InspectHistory findByStudentIdAndInspectRound(Integer id, Integer inspectRound);
+
+	List<InspectHistory> findByStudentIdIn(List<Integer> sids);
+
 }

+ 39 - 32
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/InspectedService.java

@@ -9,37 +9,44 @@ import java.util.List;
 
 public interface InspectedService {
 
-    List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus);
-
-    Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus);
-
-    void releaseByUserId(Integer examId, String subjectCode, Integer userId);
-
-    void releaseByStudent(ExamStudent student);
-
-    /**
-     * 申请领取某个任务
-     */
-    boolean applyStudent(ExamStudent student, Integer userId);
-
-    /**
-     * 是否已领取了某个任务
-     */
-    boolean hasApplied(ExamStudent student, Integer userId);
-
-    /**
-     * 复核
-     */
-    boolean inspect(ExamStudent student, Integer userId);
-
-    /**
-     * 取消复核
-     *
-     * @param studentId
-     * @return
-     */
-    boolean cancel(Integer studentId);
+	List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+			Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus);
+
+	Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+			Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus);
+
+	void releaseByUserId(Integer examId, String subjectCode, Integer userId);
+
+	void releaseByStudent(ExamStudent student);
+
+	/**
+	 * 申请领取某个任务
+	 */
+	boolean applyStudent(ExamStudent student, Integer userId);
+
+	/**
+	 * 是否已领取了某个任务
+	 */
+	boolean hasApplied(ExamStudent student, Integer userId);
+
+	/**
+	 * 复核
+	 */
+	boolean inspect(ExamStudent student, Integer userId);
+
+	/**
+	 * 取消复核
+	 *
+	 * @param studentId
+	 * @return
+	 */
+	boolean cancel(Integer studentId);
+
+	Integer needInspectCount(ExamStudentSearchQuery query, Integer mainNumber, Double mainStartScore,
+			Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus);
+
+	void fillInspectHistoryMap(List<ExamStudent> list, int maxInspectRound);
+
+	boolean inspectFinish(Integer examId, String subjectCode, Integer inspectRound);
 
 }

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

@@ -1,11 +1,16 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.dao.ExamSubjectDao;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+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;
@@ -14,21 +19,20 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.ExamSubjectDao;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 
 @Service("examSubjectService")
 public class ExamSubjectServiceImpl extends BaseQueryService<ExamSubject> implements ExamSubjectService {
 
     @Autowired
     private ExamSubjectDao subjectDao;
-
+    @PersistenceContext
+    private EntityManager entityManager;
     @Transactional
     @Override
     // @CachePut(value = "exam_subject_cache", key =
@@ -206,4 +210,20 @@ public class ExamSubjectServiceImpl extends BaseQueryService<ExamSubject> implem
         subjectDao.updateTrialCount(examId, subjectCode, trialCount);
     }
 
+	@Override
+	public int findMaxInspectRound(int examId, List<String> subjectCodes) {
+		StringBuilder sql = new StringBuilder("select max(s.inspect_round) from eb_exam_subject s ");
+		sql.append(" where s.exam_id="+examId+" and s.code in ('"+StringUtils.join(subjectCodes,"','")+"')");
+        Query countQuery = entityManager.createNativeQuery(sql.toString());
+        Object singleResult = countQuery.getResultList().get(0);
+        Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
+        return count;
+	}
+
+	@Transactional
+	@Override
+	public void nextInspectRound(int examId, String subjectCode) {
+		subjectDao.nextInspectRound(examId,subjectCode);
+	}
+
 }

+ 36 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectHistoryServiceImpl.java

@@ -2,6 +2,13 @@ package cn.com.qmth.stmms.biz.exam.service.impl;
 
 import java.util.List;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.SQLQuery;
+import org.hibernate.transform.Transformers;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -10,32 +17,29 @@ import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.InspectHistoryDao;
 import cn.com.qmth.stmms.biz.exam.model.InspectHistory;
 import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
-import cn.com.qmth.stmms.biz.user.dao.UserDao;
-import cn.com.qmth.stmms.biz.user.model.User;
 
 @Service("inspectHistoryService")
 public class InspectHistoryServiceImpl extends BaseQueryService<InspectHistory> implements InspectHistoryService {
-
+	@PersistenceContext
+	private EntityManager entityManager;
     @Autowired
     private InspectHistoryDao inspectHistoryDao;
 
-    @Autowired
-    private UserDao userDao;
 
     @Override
     public InspectHistory save(InspectHistory i) {
         return inspectHistoryDao.saveAndFlush(i);
     }
 
-    @Override
-    public List<InspectHistory> findByStudentIdLimit3(Integer studentId) {
-        List<InspectHistory> list = inspectHistoryDao.findByStudentIdLimit3(studentId, 3);
-        for (InspectHistory inspectHistory : list) {
-            User user = userDao.findOne(inspectHistory.getInspectorId());
-            inspectHistory.setInspectorName(user.getLoginName() + "/" + user.getName());
-        }
-        return list;
-    }
+//    @Override
+//    public List<InspectHistory> findByStudentIdLimit3(Integer studentId) {
+//        List<InspectHistory> list = inspectHistoryDao.findByStudentIdLimit3(studentId, 3);
+//        for (InspectHistory inspectHistory : list) {
+//            User user = userDao.findOne(inspectHistory.getInspectorId());
+//            inspectHistory.setInspectorName(user.getLoginName() + "/" + user.getName());
+//        }
+//        return list;
+//    }
 
     @Override
     public Integer countByStudentId(Integer studentId) {
@@ -54,4 +58,22 @@ public class InspectHistoryServiceImpl extends BaseQueryService<InspectHistory>
         inspectHistoryDao.deleteByStudentId(studentId);
     }
 
+	@Override
+	public InspectHistory findByStudentIdAndInspectRound(Integer studentId, Integer inspectRound) {
+		return inspectHistoryDao.findByStudentIdAndInspectRound(studentId,inspectRound);
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<InspectHistory> findByStudentIdIn(List<Integer> sids) {
+		StringBuilder sql = new StringBuilder();
+		sql.append(
+				"select t.id,t.exam_id examId,t.inspect_time inspectTime,t.inspector_id inspectorId,t.student_id studentId,t.subject_code subjectCode,t.inspect_round inspectRound,CONCAT(u.login_name, ' ', u.name) inspectorName "
+		+"from eb_inspect_history t  left join b_user u on t.inspector_id=u.id ");
+		sql.append("where t.student_id in(" + StringUtils.join(sids, ",")+")");
+		Query query = entityManager.createNativeQuery(sql.toString());
+		query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(InspectHistory.class));
+		return  query.getResultList();
+	}
+
 }

+ 136 - 92
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectedServiceImpl.java

@@ -1,28 +1,39 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.InspectHistory;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
+import cn.com.qmth.stmms.biz.exam.service.InspectedService;
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.common.enums.SelectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
 
 @Service
 public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implements InspectedService {
@@ -32,6 +43,9 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
 
     @Autowired
     private ExamStudentService studentService;
+    
+    @Autowired
+    private ExamSubjectService examSubjectService;
 
     @Autowired
     private UserService userService;
@@ -49,12 +63,12 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     @Override
     public List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
             Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus) {
+    	int offset=(query.getPageNumber() - 1) * query.getPageSize();
         StringBuilder dataSql = new StringBuilder("select s.id from eb_exam_student s ");
-        StringBuilder limitSql = new StringBuilder(" limit :offset,:pageSize");
-        Query dataQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore,
-                selectiveStatus, dataSql, limitSql);
-        dataQuery.setParameter("offset", (query.getPageNumber() - 1) * query.getPageSize());
-        dataQuery.setParameter("pageSize", query.getPageSize());
+        String whereSql = getWhereSql(query, status, mainNumber, mainStartScore, mainEndScore, questionScore,
+                selectiveStatus);
+        dataSql.append(whereSql).append(" order by s.inspect_time desc ").append(" limit "+offset+","+query.getPageSize());
+        Query dataQuery = entityManager.createNativeQuery(dataSql.toString());
         List<Integer> list = dataQuery.getResultList();
         List<ExamStudent> resultList = new ArrayList<ExamStudent>();
         if (list != null && !list.isEmpty()) {
@@ -70,48 +84,60 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
 
     }
 
-    private Query getQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus,
-            StringBuilder dataSql, StringBuilder limitSql) {
+    private String getWhereSql(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus) {
         StringBuilder whereSql = new StringBuilder(" WHERE s.is_upload = 1 and s.is_absent = 0 and s.is_breach = 0 ");
         if (query.getExamId() != null) {
-            whereSql.append(" and s.exam_id = :examId");
+            whereSql.append(" and s.exam_id ="+query.getExamId());
         }
         if (StringUtils.isNotBlank(query.getSubjectCode())) {
-            whereSql.append(" and s.subject_code = :subjectCode ");
+            whereSql.append(" and s.subject_code ='"+query.getSubjectCode()+"'");
         }
         if (StringUtils.isNotBlank(query.getSubjectCodeIn())) {
-            whereSql.append(" and s.subject_code in (:subjectCodeIn) ");
+            String[] subjectCodeIn = query.getSubjectCodeIn().split(",");
+            List<String> in = new ArrayList<String>();
+            for (String code : subjectCodeIn) {
+                in.add(code);
+            }
+            whereSql.append(" and s.subject_code in ('"+StringUtils.join(in, "','")+"') ");
         }
+        whereSql.append(" and s.subjective_status IN ('MARKED','INSPECTED')");
         if (status != null) {
-            whereSql.append(" and s.subjective_status = :status");
-        } else {
-            whereSql.append(" and s.subjective_status IN ('MARKED','INSPECTED')");
+            if(SubjectiveStatus.MARKED.equals(status)) {
+            	whereSql.append(" and not exists(select 1 from eb_inspect_history h "
+                    +"left join eb_exam_subject sub on h.exam_id=sub.exam_id and h.subject_code=sub.code "
+                    +"where s.id=h.student_id and h.inspect_round=sub.inspect_round) ");
+            }
+            if(SubjectiveStatus.INSPECTED.equals(status)) {
+            	whereSql.append(" and exists(select 1 from eb_inspect_history h "
+                    +"left join eb_exam_subject sub on h.exam_id=sub.exam_id and h.subject_code=sub.code "
+                    +"where s.id=h.student_id and h.inspect_round=sub.inspect_round) ");
+            }
         }
         if (query.getStartScore() != null) {
             whereSql.append(
-                    " and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) >= :startScore");
+                    " and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) >="+query.getStartScore());
         }
         if (query.getEndScore() != null) {
             whereSql.append(
-                    " and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) <= :endScore");
+                    " and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) <="+query.getEndScore());
         }
         if (StringUtils.isNotBlank(query.getSecretNumber())) {
-            whereSql.append(" and s.secret_number = :secretNumber");
+            whereSql.append(" and s.secret_number ='"+query.getSecretNumber()+"'");
         }
         if (mainNumber != null || mainStartScore != null || mainEndScore != null || questionScore != null) {
             whereSql.append(" and exists (select e.student_id from eb_subjective_score e where e.student_id = s.id ");
             if (mainNumber != null) {
-                whereSql.append(" and e.main_number = :mainNumber");
+                whereSql.append(" and e.main_number ="+mainNumber);
             }
             if (mainStartScore != null) {
-                whereSql.append(" and e.main_score >= :mainStartScore");
+                whereSql.append(" and e.main_score >="+mainStartScore);
             }
             if (mainEndScore != null) {
-                whereSql.append(" and e.main_score <= :mainEndScore");
+                whereSql.append(" and e.main_score <="+mainEndScore);
             }
             if (questionScore != null) {
-                whereSql.append(" and e.score = :questionScore");
+                whereSql.append(" and e.score ="+questionScore);
             }
             whereSql.append(" ) ");
         }
@@ -122,8 +148,13 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
                 .findByExamIdAndSubjectCode(query.getExamId(), query.getSubjectCode());
         if (selectiveStatus != null && SelectiveStatus.UN_SELECTIVE.equals(selectiveStatus) && !groups.isEmpty()
                 && !selectiveGroups.isEmpty()) {
+            List<Integer> groupNumbers = new ArrayList<Integer>();
+            for (int i = 0; i < groups.size(); i++) {
+                groupNumbers.add(groups.get(i).getNumber());
+            }
             whereSql.append(
-                    " and not exists (select e.student_id from eb_subjective_score e where e.student_id = s.id and e.group_number in (:groupNumbers) and e.group_score != -1 )");
+            " and not exists (select e.student_id from eb_subjective_score e where e.student_id = s.id and e.group_number in ("
+            +StringUtils.join(groupNumbers,",")+") and e.group_score != -1 )");
         }
         // 选做题多选做
         if (selectiveStatus != null && SelectiveStatus.MUTI_SELECTIVE.equals(selectiveStatus) && !groups.isEmpty()
@@ -137,70 +168,31 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
             whereSql.append(
                     " and exists (select ss.student_id from eb_selective_student ss where ss.student_id = s.id and ss.less_selective=1) ");
         }
-        dataSql.append(whereSql);
-        StringBuilder orderSql = new StringBuilder(" order by s.inspect_time desc ");
-        dataSql.append(orderSql);
-        if (limitSql != null) {
-            dataSql.append(limitSql);
-        }
-        Query dataQuery = entityManager.createNativeQuery(dataSql.toString());
-
-        if (query.getExamId() != null) {
-            dataQuery.setParameter("examId", query.getExamId());
-        }
-        if (StringUtils.isNotBlank(query.getSubjectCode())) {
-            dataQuery.setParameter("subjectCode", query.getSubjectCode());
-        }
-        if (StringUtils.isNotBlank(query.getSubjectCodeIn())) {
-            String[] subjectCodeIn = query.getSubjectCodeIn().split(",");
-            List<String> in = new ArrayList<String>();
-            for (String code : subjectCodeIn) {
-                in.add(code);
-            }
-            dataQuery.setParameter("subjectCodeIn", in);
-        }
-        if (status != null) {
-            dataQuery.setParameter("status", status.toString());
-        }
-        if (query.getStartScore() != null) {
-            dataQuery.setParameter("startScore", query.getStartScore());
-        }
-        if (query.getEndScore() != null) {
-            dataQuery.setParameter("endScore", query.getEndScore());
-        }
-        if (mainNumber != null) {
-            dataQuery.setParameter("mainNumber", mainNumber);
-        }
-        if (mainStartScore != null) {
-            dataQuery.setParameter("mainStartScore", mainStartScore);
-        }
-        if (mainEndScore != null) {
-            dataQuery.setParameter("mainEndScore", mainEndScore);
-        }
-        if (questionScore != null) {
-            dataQuery.setParameter("questionScore", questionScore);
-        }
-        if (StringUtils.isNotBlank(query.getSecretNumber())) {
-            dataQuery.setParameter("secretNumber", query.getSecretNumber());
-        }
-        if (selectiveStatus != null && !groups.isEmpty() && !selectiveGroups.isEmpty()) {
-            if (selectiveStatus == SelectiveStatus.UN_SELECTIVE) {
-                List<Integer> groupNumbers = new ArrayList<Integer>();
-                for (int i = 0; i < groups.size(); i++) {
-                    groupNumbers.add(groups.get(i).getNumber());
-                }
-                dataQuery.setParameter("groupNumbers", groupNumbers);
-            }
-        }
-        return dataQuery;
+        return whereSql.toString();
     }
 
     @Override
     public Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
             Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus) {
         StringBuilder countSql = new StringBuilder("select count(s.id) from eb_exam_student s ");
-        Query countQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore,
-                selectiveStatus, countSql, null);
+        String whereSql = getWhereSql(query, status, mainNumber, mainStartScore, mainEndScore, questionScore,
+                selectiveStatus);
+        countSql.append(whereSql);
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+        Object singleResult = countQuery.getResultList().get(0);
+        Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
+        return count;
+    }
+    
+    @Override
+    public Integer needInspectCount(ExamStudentSearchQuery query, Integer mainNumber,
+            Double mainStartScore, Double mainEndScore, Double questionScore, 
+            SelectiveStatus selectiveStatus) {
+    	StringBuilder countSql = new StringBuilder("select count(s.id) from eb_exam_student s ");
+        String whereSql = getWhereSql(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore, mainEndScore, questionScore,
+                selectiveStatus);
+        countSql.append(whereSql);
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
         Object singleResult = countQuery.getResultList().get(0);
         Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
         return count;
@@ -250,6 +242,15 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     @Override
     public boolean inspect(ExamStudent student, Integer userId) {
         if (this.hasApplied(student, userId) && SubjectiveStatus.MARKED.equals(student.getSubjectiveStatus())) {
+        	if (!SubjectiveStatus.MARKED.equals(student.getSubjectiveStatus())
+        			&&!SubjectiveStatus.INSPECTED.equals(student.getSubjectiveStatus())) {
+        		return false;
+        	}
+        	ExamSubject subject=examSubjectService.find(student.getExamId(), student.getSubjectCode());
+        	InspectHistory old=inspectHistoryService.findByStudentIdAndInspectRound(student.getId(),subject.getInspectRound());
+        	if(old!=null) {
+        		return false;
+        	}
             Date now = new Date();
             studentService.updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.INSPECTED, now,
                     userId);
@@ -259,6 +260,7 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
             i.setSubjectCode(student.getSubjectCode());
             i.setInspectorId(userId);
             i.setInspectTime(now);
+            i.setInspectRound(subject.getInspectRound());
             inspectHistoryService.save(i);
             studentService.updateInspectCount(student.getId(), inspectHistoryService.countByStudentId(student.getId()));
             //this.releaseByStudent(student);
@@ -277,4 +279,46 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
         }
         return false;
     }
+
+	@Override
+	public void fillInspectHistoryMap(List<ExamStudent> list, int maxInspectRound) {
+		List<Integer> sids=list.stream().map(e->e.getId()).collect(Collectors.toList());
+		List<InspectHistory> ihs=inspectHistoryService.findByStudentIdIn(sids);
+		if(ihs==null||ihs.size()==0) {
+			return;
+		}
+		Map<Integer,Map<String,InspectHistory>> map=new HashMap<>();
+		for(InspectHistory ih:ihs) {
+			Map<String,InspectHistory> tem=map.get(ih.getStudentId());
+			if(tem==null) {
+				tem=new HashMap<>();
+				map.put(ih.getStudentId(),tem);
+			}
+			tem.put(ih.getInspectRound().toString(),ih);
+		}
+		for(ExamStudent es:list) {
+			es.setInspectHistoryMap(map.get(es.getId()));
+		}
+	}
+
+	@Override
+	public boolean inspectFinish(Integer examId, String subjectCode, Integer inspectRound) {
+		ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+        sQuery.setExamId(examId);
+        sQuery.setUpload(true);
+        sQuery.setAbsent(false);
+        sQuery.setBreach(false);
+        sQuery.setSubjectCode(subjectCode);
+        long totalPaperCount = studentService.countByQuery(sQuery);
+        StringBuilder countSql = new StringBuilder("select count(s.id) from eb_exam_student s  where s.exam_id ="
+        +examId+" and s.subject_code ='"+subjectCode+"'");
+        countSql.append(" and s.subjective_status IN ('MARKED','INSPECTED')");
+        countSql.append(" and exists(select 1 from eb_inspect_history h "
+                +" left join eb_exam_subject sub on h.exam_id=sub.exam_id and h.subject_code=sub.code "
+                +" where s.id=h.student_id and h.inspect_round="+inspectRound+") ");
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+        Object singleResult = countQuery.getResultList().get(0);
+        Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
+		return totalPaperCount==count;
+	}
 }

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

@@ -1,12 +1,39 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletRequest;
+
+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.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.mvc.support.RedirectAttributes;
+
 import cn.com.qmth.stmms.admin.dto.RejectResult;
 import cn.com.qmth.stmms.admin.vo.InspectedSubjectVO;
 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.*;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.InspectedService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
@@ -16,25 +43,14 @@ import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.*;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.SelectiveStatus;
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONObject;
-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.*;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
 
 @Controller("inspectedController")
 @RequestMapping("/admin/exam/inspected")
@@ -69,9 +85,6 @@ public class InspectedController extends BaseExamController {
     @Autowired
     private ExamSubjectService subjectService;
 
-    @Autowired
-    private InspectHistoryService inspectHistoryService;
-
     @Value("${slice.split.config}")
     private String splitConfig;
 
@@ -100,16 +113,23 @@ public class InspectedController extends BaseExamController {
                 .findByQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore, selectiveStatus);
         for (ExamStudent e : list) {
             e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
-            e.setInspectHistoryList(inspectHistoryService.findByStudentIdLimit3(e.getId()));
+//            e.setInspectHistoryList(inspectHistoryService.findByStudentIdLimit3(e.getId()));
+        }
+        int maxInspectRound=1;
+        if(list!=null&&list.size()>0) {
+        	List<String> subjectCodes=list.stream().map(e->e.getSubjectCode()).collect(Collectors.toList());
+        	maxInspectRound=subjectService.findMaxInspectRound(examId,subjectCodes);
+        	inspectedService.fillInspectHistoryMap(list,maxInspectRound);
         }
         Integer totalCount = inspectedService
                 .countByQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore, selectiveStatus);
         Integer inspectCount = inspectedService
-                .countByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore, mainEndScore, questionScore,
+                .needInspectCount(query,mainNumber, mainStartScore, mainEndScore, questionScore,
                         selectiveStatus);
         query.setResult(list);
         query.setTotalCount(totalCount);
         model.addAttribute("query", query);
+        model.addAttribute("maxInspectRound", maxInspectRound);
         model.addAttribute("inspectCount", inspectCount);
         model.addAttribute("questionList",
                 questionService.findMainByExamAndSubjectAndObjective(examId, query.getSubjectCode(), false));
@@ -123,6 +143,12 @@ public class InspectedController extends BaseExamController {
         model.addAttribute("status", status);
         model.addAttribute("selectiveStatus", selectiveStatus);
         model.addAttribute("exam", exam);
+        if(StringUtils.isNotBlank(query.getSubjectCode())) {
+        	ExamSubject es=subjectService.find(examId, query.getSubjectCode());
+        	if(inspectedService.inspectFinish(examId, query.getSubjectCode(),es.getInspectRound())) {
+        		model.addAttribute("showNextInspect", true);
+        	}
+        }
         return "modules/exam/inspectedList";
     }
 
@@ -258,6 +284,20 @@ public class InspectedController extends BaseExamController {
         }
         return obj;
     }
+    
+    @Logging(menu = "再次复核", type = LogType.UPDATE)
+    @RequestMapping(value = "nextround", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.INSPECTOR, Role.COLLEGE_ADMIN })
+    public String nextround(RedirectAttributes ra,HttpServletRequest request, @RequestParam String subjectCode) {
+    	int examId = getSessionExamId(request);
+    	ExamSubject es=subjectService.find(examId, subjectCode);
+    	if(!inspectedService.inspectFinish(examId, subjectCode,es.getInspectRound())) {
+    		ra.addFlashAttribute("errmsg", "该科目第"+es.getInspectRound()+"次复核还未完成");
+    		return "redirect:/admin/exam/inspected/list?subjectCode=" + subjectCode;
+    	}
+    	subjectService.nextInspectRound(examId, subjectCode);
+        return "redirect:/admin/exam/inspected/list?subjectCode=" + subjectCode;
+    }
 
     @Logging(menu = "打回", type = LogType.UPDATE)
     @RequestMapping(value = "/rejected", method = RequestMethod.POST)

+ 45 - 35
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspectedList.jsp

@@ -81,6 +81,11 @@
         &nbsp;
         <input id="btnStart" class="btn" type="button" value="批量复核:${inspectCount }" onclick="goStart()"/>
         </c:if>
+        &nbsp;
+        <c:if test="${!empty showNextInspect}">
+        &nbsp;
+        <input id="btnNextRound" class="btn" type="button" value="再次复核" onclick="nextRound()"/>
+        </c:if>
         &nbsp;
          <input id="btnCancel" class="btn" type="button" value="取消复核" onclick="goCancel()"/>
           &nbsp;
@@ -101,12 +106,10 @@
         <th>主观分</th>
         <th>试卷总分</th>
         <th>得分明细</th>
-        <th>复核人1</th>
-        <th>复核时间1</th>
-        <th>复核人2</th>
-        <th>复核时间2</th>
-        <th>复核人3</th>
-        <th>复核时间3</th>
+        <c:forEach begin="1" end="${maxInspectRound}" step="1" varStatus="status">
+        <th>复核人${status.index}</th>
+        <th>复核时间${status.index}</th>
+        </c:forEach>
         <th>操作</th>
     </tr>
     </thead>
@@ -120,36 +123,31 @@
             <td>${result.subjectiveScoreString}</td>
             <td><fmt:formatNumber pattern="###.###" value="${result.totalScore}"/></td>
             <td>${result.subjectiveScoreList}</td>
-            <c:if test="${result.inspectHistoryList!=null}">
-            <c:forEach items="${result.inspectHistoryList}" var="history">
-	            <td> ${history.inspectorName} </td>
-	            <td>
-	            	<c:if test="${history.inspectTime!=null}">
-	                    <fmt:formatDate value="${history.inspectTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
-	                </c:if>
-	                <c:if test="${history.inspectTime==null}">
-	                    &nbsp;
-	                </c:if>
-	            </td>
-            </c:forEach>
+            <c:if test="${!empty result.inspectHistoryMap}">
+	            <c:forEach begin="1" end="${maxInspectRound}" step="1" varStatus="status">
+	            	<c:set var="inspectHistory" value="${result.inspectHistoryMap.get(fn:trim(status.index))}" />
+	            	<c:if test="${!empty inspectHistory}">
+	            		<td> ${inspectHistory.inspectorName} </td>
+	            		<td>
+			            	<c:if test="${inspectHistory.inspectTime!=null}">
+			                    <fmt:formatDate value="${inspectHistory.inspectTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+			                </c:if>
+			                <c:if test="${inspectHistory.inspectTime==null}">
+			                    &nbsp;
+			                </c:if>
+			            </td>
+	            	</c:if>
+	            	<c:if test="${empty inspectHistory}">
+	            		<td></td>
+             			<td></td>
+	            	</c:if>
+	            </c:forEach>
             </c:if>
-            <c:if test="${result.inspectHistoryList!=null && result.inspectHistoryList.size()==2}">
-            	<td></td>
-             	<td></td>
-            </c:if>
-            <c:if test="${result.inspectHistoryList!=null && result.inspectHistoryList.size()==1}">
-            	<td></td>
-             	<td></td>
-             	<td></td>
-             	<td></td>
-            </c:if>
-            <c:if test="${result.inspectHistoryList==null || result.inspectHistoryList.size()==0}">
-            	<td></td>
-             	<td></td>
-              	<td></td>
-           		<td></td>
-          		<td></td>
-      			<td></td>
+            <c:if test="${empty result.inspectHistoryMap}">
+	            <c:forEach begin="1" end="${maxInspectRound}" step="1" varStatus="status">
+	            	<td></td>
+             		<td></td>
+	            </c:forEach>
             </c:if>
             <td>
             	 <a href="${ctx}/web/admin/exam/track/student?studentId=${result.id}&subjectCode=${result.subjectCode}" target="_blank">轨迹图</a>
@@ -337,6 +335,18 @@
         $("#cancelForm").submit();
         return false;
     }
+    function nextRound() {
+    	var subjectCode =  $("#subject-select").val();
+    	if(subjectCode==undefined || subjectCode==""){
+    		 alert('请选择科目');
+    		 return;
+    	}
+        $("#cancelForm").attr('target', "_self");
+        $("#cancelForm").attr('action', '${ctx}/admin/exam/inspected/nextround?subjectCode='+subjectCode);
+        $("#cancelForm").submit();
+        return false;
+    }
+    
 </script>
 </body>
 </html>