xiatian 1 yıl önce
ebeveyn
işleme
7e1466cbe6

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

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
+import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
@@ -51,4 +52,6 @@ public interface ExamSubjectService {
 
     void updateSelective(int examId, String subjectCode, boolean selective);
 
+	String enableExport(Exam exam, String subjectCode);
+
 }

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

@@ -22,224 +22,292 @@ import org.springframework.transaction.annotation.Transactional;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
 import cn.com.qmth.stmms.biz.exam.dao.ExamSubjectDao;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
+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.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.utils.DoubleUtil;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.MarkStatus;
 
 @Service("examSubjectService")
 public class ExamSubjectServiceImpl extends BaseQueryService<ExamSubject> implements ExamSubjectService {
 
+	@Autowired
+	private ExamSubjectDao subjectDao;
+
+	@Autowired
+	private ExamStudentDao examStudentDao;
+
+	@PersistenceContext
+	private EntityManager entityManager;
     @Autowired
-    private ExamSubjectDao subjectDao;
+    private MarkGroupService groupService;
 
     @Autowired
-    private ExamStudentDao examStudentDao;
-
-    @PersistenceContext
-    private EntityManager entityManager;
-
-    @Transactional
-    @Override
-    // @CachePut(value = "exam_subject_cache", key =
-    // "T(String).valueOf(#subject.examId)+'-'+#subject.code", condition =
-    // "#subject!=null && #subject.examId!=null && #subject.code!=null")
-    public ExamSubject save(ExamSubject subject) {
-        return subjectDao.save(subject);
-    }
-
-    @Override
-    // @Cacheable(value = "exam_subject_cache", key =
-    // "T(String).valueOf(#examId)+'-'+#code", condition =
-    // "#examId>0 && #code!=null")
-    public ExamSubject find(int examId, String code) {
-        return subjectDao.findByExamIdAndCode(examId, code);
-    }
-
-    @Override
-    public List<ExamSubject> list(int examId) {
-        return subjectDao.findByExamId(examId);
-    }
-
-    @Override
-    public List<ExamSubject> list(int examId, Set<String> codes) {
-        return subjectDao.findByExamIdAndSubjectCodeIn(examId, codes);
-    }
-
-    @Override
-    public List<String> listLevel(int examId) {
-        return subjectDao.findDistinctLevel(examId);
-    }
-
-    @Override
-    public List<String> listCategory(int examId) {
-        return subjectDao.findDistinctCategory(examId);
-    }
-
-    @Override
-    public List<ExamSubject> list(int examId, int uploadCountGt) {
-        return subjectDao.findByExamIdAndUploadCountGt(examId, uploadCountGt);
-    }
-
-    @Override
-    public long count(int examId) {
-        return subjectDao.countByExamId(examId);
-    }
-
-    @Override
-    public ExamSubjectSearchQuery findByQuery(ExamSubjectSearchQuery query) {
-        checkQuery(query);
-        Page<ExamSubject> result = subjectDao.findAll(buildSpecification(query), query);
-        fillResult(result, query);
-        return query;
-    }
-
-    @Override
-    public long countByQuery(ExamSubjectSearchQuery query) {
-        return subjectDao.count(buildSpecification(query));
-    }
-
-    @Transactional
-    @Override
-    // @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
-    // allEntries = true)
-    public void delete(ExamSubject markSubject) {
-        subjectDao.delete(markSubject);
-    }
-
-    @Transactional
-    @Override
-    // @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
-    // allEntries = true)
-    public void deleteByExamId(int examId) {
-        subjectDao.deleteByExamId(examId);
-    }
-
-    @Transactional
-    @Override
-    // @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
-    // allEntries = true)
-    public void updateTotalScore(int examId) {
-        subjectDao.updateTotalScoreByExamId(examId);
-    }
-
-    @Transactional
-    @Override
-    // @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
-    // allEntries = true)
-    public void updateScore(int examId, String code, boolean objective, double score) {
-        if (objective) {
-            subjectDao.updateObjectiveScore(examId, code, score);
-        } else {
-            subjectDao.updateSubjectiveScore(examId, code, score);
-        }
-        subjectDao.updateTotalScoreByExamIdAndCode(examId, code);
-    }
-
-    private Specification<ExamSubject> buildSpecification(final ExamSubjectSearchQuery query) {
-        return new Specification<ExamSubject>() {
-
-            @Override
-            public Predicate toPredicate(Root<ExamSubject> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
-                List<Predicate> predicates = new LinkedList<Predicate>();
-                if (query.getExamId() > 0) {
-                    predicates.add(cb.equal(root.get("pk").get("examId"), query.getExamId()));
-                }
-                if (StringUtils.isNotEmpty(query.getCode())) {
-                    predicates.add(cb.equal(root.get("pk").get("code"), query.getCode()));
-                }
-                if (StringUtils.isNotBlank(query.getLevel())) {
-                    predicates.add(cb.equal(root.get("level"), query.getLevel()));
-                }
-                if (StringUtils.isNotBlank(query.getCategory())) {
-                    predicates.add(cb.equal(root.get("category"), query.getCategory()));
-                }
-                if (query.getTotalScoreNotEqual() != null) {
-                    predicates.add(cb.notEqual(root.get("totalScore"), query.getTotalScoreNotEqual()));
-                }
-                if (query.getSubjectiveScoreNotEqual() != null) {
-                    predicates.add(cb.notEqual(root.get("subjectiveScore"), query.getSubjectiveScoreNotEqual()));
-                }
-                if (query.getUploadCountGt() != null) {
-                    predicates.add(cb.gt(root.get("uploadCount").as(Integer.class), query.getUploadCountGt()));
-                }
-                if (query.getUploadCountEqual() != null) {
-                    predicates.add(cb.equal(root.get("uploadCount").as(Integer.class), query.getUploadCountEqual()));
-                }
-                if (query.getSelective() != null) {
-                    predicates.add(cb.equal(root.get("selective"), query.getSelective()));
-                }
-                if (StringUtils.isNotBlank(query.getCodeIn())) {
-                    String[] list = query.getCodeIn().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("pk").get("code"), list[i]);
-                        }
-                        predicates.add(cb.or(sub));
-                    }
-                }
-                if (StringUtils.isNotBlank(query.getCodeNotIn())) {
-                    String[] list = query.getCodeNotIn().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("pk").get("code"), list[i]);
-                        }
-                        predicates.add(cb.and(sub));
-                    }
-                }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
-            }
-        };
-    }
-
-    @Override
-    @Transactional
-    public void updateUploadCount(Integer examId, String subjectCode, int count) {
-        subjectDao.updateUploadCount(examId, subjectCode, count);
-    }
-
-    @Override
-    public List<ExamSubject> listSubjectiveScore(int examId, double subjectiveScore) {
-        return subjectDao.listSubjectiveScore(examId, subjectiveScore);
-    }
-
-    @Override
-    @Transactional
-    public void updateSliceConfig(Integer examId, String subjectCode, List<PictureConfigItem> configList) {
-        subjectDao.updateSliceConfig(examId, subjectCode,
-                configList != null ? StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) : "");
-    }
-
-    @Transactional
-    @Override
-    public void updateTrialCount(int examId, String subjectCode, int trialCount) {
-        subjectDao.updateTrialCount(examId, subjectCode, trialCount);
-    }
-
-    @Override
-    public int findMaxInspectRound(int examId, Set<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);
-        examStudentDao.cancelInspect(examId, subjectCode);
-    }
-
-    @Transactional
-    @Override
-    public void updateSelective(int examId, String subjectCode, boolean selective) {
-        subjectDao.updateSelective(examId, subjectCode, selective);
-    }
+    private ExamStudentService studentService;
+    @Autowired
+    private CheckStudentService checkStudentService;
+	@Transactional
+	@Override
+	// @CachePut(value = "exam_subject_cache", key =
+	// "T(String).valueOf(#subject.examId)+'-'+#subject.code", condition =
+	// "#subject!=null && #subject.examId!=null && #subject.code!=null")
+	public ExamSubject save(ExamSubject subject) {
+		return subjectDao.save(subject);
+	}
+
+	@Override
+	// @Cacheable(value = "exam_subject_cache", key =
+	// "T(String).valueOf(#examId)+'-'+#code", condition =
+	// "#examId>0 && #code!=null")
+	public ExamSubject find(int examId, String code) {
+		return subjectDao.findByExamIdAndCode(examId, code);
+	}
+
+	@Override
+	public List<ExamSubject> list(int examId) {
+		return subjectDao.findByExamId(examId);
+	}
+
+	@Override
+	public List<ExamSubject> list(int examId, Set<String> codes) {
+		return subjectDao.findByExamIdAndSubjectCodeIn(examId, codes);
+	}
+
+	@Override
+	public List<String> listLevel(int examId) {
+		return subjectDao.findDistinctLevel(examId);
+	}
+
+	@Override
+	public List<String> listCategory(int examId) {
+		return subjectDao.findDistinctCategory(examId);
+	}
+
+	@Override
+	public List<ExamSubject> list(int examId, int uploadCountGt) {
+		return subjectDao.findByExamIdAndUploadCountGt(examId, uploadCountGt);
+	}
+
+	@Override
+	public long count(int examId) {
+		return subjectDao.countByExamId(examId);
+	}
+
+	@Override
+	public ExamSubjectSearchQuery findByQuery(ExamSubjectSearchQuery query) {
+		checkQuery(query);
+		Page<ExamSubject> result = subjectDao.findAll(buildSpecification(query), query);
+		fillResult(result, query);
+		return query;
+	}
+
+	@Override
+	public long countByQuery(ExamSubjectSearchQuery query) {
+		return subjectDao.count(buildSpecification(query));
+	}
+
+	@Transactional
+	@Override
+	// @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
+	// allEntries = true)
+	public void delete(ExamSubject markSubject) {
+		subjectDao.delete(markSubject);
+	}
+
+	@Transactional
+	@Override
+	// @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
+	// allEntries = true)
+	public void deleteByExamId(int examId) {
+		subjectDao.deleteByExamId(examId);
+	}
+
+	@Transactional
+	@Override
+	// @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
+	// allEntries = true)
+	public void updateTotalScore(int examId) {
+		subjectDao.updateTotalScoreByExamId(examId);
+	}
+
+	@Transactional
+	@Override
+	// @CacheEvict(value = "exam_subject_cache", beforeInvocation = true,
+	// allEntries = true)
+	public void updateScore(int examId, String code, boolean objective, double score) {
+		if (objective) {
+			subjectDao.updateObjectiveScore(examId, code, score);
+		} else {
+			subjectDao.updateSubjectiveScore(examId, code, score);
+		}
+		subjectDao.updateTotalScoreByExamIdAndCode(examId, code);
+	}
+
+	private Specification<ExamSubject> buildSpecification(final ExamSubjectSearchQuery query) {
+		return new Specification<ExamSubject>() {
+
+			@Override
+			public Predicate toPredicate(Root<ExamSubject> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+				List<Predicate> predicates = new LinkedList<Predicate>();
+				if (query.getExamId() > 0) {
+					predicates.add(cb.equal(root.get("pk").get("examId"), query.getExamId()));
+				}
+				if (StringUtils.isNotEmpty(query.getCode())) {
+					predicates.add(cb.equal(root.get("pk").get("code"), query.getCode()));
+				}
+				if (StringUtils.isNotBlank(query.getLevel())) {
+					predicates.add(cb.equal(root.get("level"), query.getLevel()));
+				}
+				if (StringUtils.isNotBlank(query.getCategory())) {
+					predicates.add(cb.equal(root.get("category"), query.getCategory()));
+				}
+				if (query.getTotalScoreNotEqual() != null) {
+					predicates.add(cb.notEqual(root.get("totalScore"), query.getTotalScoreNotEqual()));
+				}
+				if (query.getSubjectiveScoreNotEqual() != null) {
+					predicates.add(cb.notEqual(root.get("subjectiveScore"), query.getSubjectiveScoreNotEqual()));
+				}
+				if (query.getUploadCountGt() != null) {
+					predicates.add(cb.gt(root.get("uploadCount").as(Integer.class), query.getUploadCountGt()));
+				}
+				if (query.getUploadCountEqual() != null) {
+					predicates.add(cb.equal(root.get("uploadCount").as(Integer.class), query.getUploadCountEqual()));
+				}
+				if (query.getSelective() != null) {
+					predicates.add(cb.equal(root.get("selective"), query.getSelective()));
+				}
+				if (StringUtils.isNotBlank(query.getCodeIn())) {
+					String[] list = query.getCodeIn().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("pk").get("code"), list[i]);
+						}
+						predicates.add(cb.or(sub));
+					}
+				}
+				if (StringUtils.isNotBlank(query.getCodeNotIn())) {
+					String[] list = query.getCodeNotIn().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("pk").get("code"), list[i]);
+						}
+						predicates.add(cb.and(sub));
+					}
+				}
+				return predicates.isEmpty() ? cb.conjunction()
+						: cb.and(predicates.toArray(new Predicate[predicates.size()]));
+			}
+		};
+	}
+
+	@Override
+	@Transactional
+	public void updateUploadCount(Integer examId, String subjectCode, int count) {
+		subjectDao.updateUploadCount(examId, subjectCode, count);
+	}
+
+	@Override
+	public List<ExamSubject> listSubjectiveScore(int examId, double subjectiveScore) {
+		return subjectDao.listSubjectiveScore(examId, subjectiveScore);
+	}
+
+	@Override
+	@Transactional
+	public void updateSliceConfig(Integer examId, String subjectCode, List<PictureConfigItem> configList) {
+		subjectDao.updateSliceConfig(examId, subjectCode,
+				configList != null ? StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) : "");
+	}
+
+	@Transactional
+	@Override
+	public void updateTrialCount(int examId, String subjectCode, int trialCount) {
+		subjectDao.updateTrialCount(examId, subjectCode, trialCount);
+	}
+
+	@Override
+	public int findMaxInspectRound(int examId, Set<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);
+		examStudentDao.cancelInspect(examId, subjectCode);
+	}
+
+	@Transactional
+	@Override
+	public void updateSelective(int examId, String subjectCode, boolean selective) {
+		subjectDao.updateSelective(examId, subjectCode, selective);
+	}
+
+	@Override
+	public String enableExport(Exam exam, String subjectCode) {
+		ExamSubject subject = find(exam.getId(), subjectCode);
+		if (subject == null) {
+			return subjectCode + "该科目不存在";
+		}
+		List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(exam.getId(), subjectCode,
+				MarkStatus.FORMAL, MarkStatus.TRIAL);
+		if (groups != null && !groups.isEmpty()) {
+			return subjectCode + "评卷未完成";
+		}
+		if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+			return null;
+		}
+		if (DoubleUtil.sum(subject.getObjectiveScore(), subject.getSubjectiveScore()) == 0) {
+			return subjectCode + "科目总分为0";
+		}
+		long groupCount = groupService.countByExamAndSubject(exam.getId(), subjectCode);
+		if (subject.getSubjectiveScore() != null && subject.getSubjectiveScore() > 0 && groupCount == 0) {
+			return subjectCode + "未设置评卷分组";
+		}
+		if (checkStudentService.countByExamIdAndSubjectCodeAndChecked(exam.getId(), subjectCode, false) > 0) {
+			return subjectCode + "人工确认未完成";
+		}
+		ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+		query.setExamId(exam.getId());
+		query.setUpload(false);
+		query.setManualAbsent(false);
+		query.setSubjectCode(subjectCode);
+		if (studentService.countByQuery(query) > 0) {
+			StringBuilder builder = new StringBuilder(subjectCode + "未上传考生必须人工指定缺考");
+			query.setPageSize(Integer.MAX_VALUE);
+			query = studentService.findByQuery(query);
+			for (ExamStudent s : query.getResult()) {
+				builder.append("," + s.getExamNumber());
+			}
+			return builder.toString();
+		}
+		query.setUpload(true);
+		query.setManualAbsent(true);
+		if (studentService.countByQuery(query) > 0) {
+			StringBuilder builder = new StringBuilder(subjectCode + "已上传考生有人工指定缺考");
+			query.setPageSize(Integer.MAX_VALUE);
+			query = studentService.findByQuery(query);
+			for (ExamStudent s : query.getResult()) {
+				builder.append("," + s.getExamNumber());
+			}
+			return builder.toString();
+		}
+		return null;
+	}
 
 }

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

@@ -207,6 +207,8 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     @Override
     public Integer needInspectCount(InspectQuery query, Integer mainNumber,
             Double mainStartScore, Double mainEndScore,SelectiveStatus selectiveStatus) {
+    	Boolean inspected=query.getInspected();
+    	query.setInspected(false);
     	StringBuilder countSql = new StringBuilder("select count(s.id) from eb_exam_student s "
             +" left join eb_exam_subject es on s.exam_id=es.exam_id and s.subject_code=es.code ");
         String whereSql = getWhereSql(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore, mainEndScore,selectiveStatus);
@@ -214,6 +216,7 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
         Query countQuery = entityManager.createNativeQuery(countSql.toString());
         Object singleResult = countQuery.getResultList().get(0);
         Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
+        query.setInspected(inspected);
         return count;
     }
 

+ 18 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -164,6 +164,7 @@ public class InspectedController extends BaseExamController {
         model.addAttribute("status", status);
         model.addAttribute("selectiveStatus", selectiveStatus);
         model.addAttribute("exam", exam);
+        model.addAttribute("examFinish", checkFinish(exam));
         if (StringUtils.isNotBlank(query.getSubjectCode())) {
             ExamSubject es = subjectService.find(examId, query.getSubjectCode());
             if (inspectedService.inspectFinish(examId, query.getSubjectCode(), es.getInspectRound())) {
@@ -173,6 +174,17 @@ public class InspectedController extends BaseExamController {
         query.setInspected(inspected);
         return "modules/exam/inspectedList";
     }
+    
+    private boolean checkFinish(Exam exam) {
+    	List<ExamSubject> list = subjectService.list(exam.getId());
+        for (ExamSubject subject : list) {
+            String meaages = subjectService.enableExport(exam, subject.getCode());
+            if (meaages!= null) {
+            	return false;
+            }
+        }
+        return true;
+    }
 
     @Logging(menu = "开始考生复核", type = LogType.QUERY)
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
@@ -409,8 +421,8 @@ public class InspectedController extends BaseExamController {
         JSONObject status = new JSONObject();
         int examId = getSessionExamId(request);
         query.setExamId(examId);
-        Integer totalCount = inspectedService.countByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
-                mainEndScore, selectiveStatus);
+        Integer totalCount = inspectedService.needInspectCount(query, mainNumber, mainStartScore, mainEndScore,
+                selectiveStatus);
         status.accumulate("totalCount", totalCount);
         status.accumulate("valid", true);
         return status;
@@ -504,6 +516,7 @@ public class InspectedController extends BaseExamController {
     public String info(HttpServletRequest request, Model model, ExamSubjectSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
+        Exam exam = examService.findById(examId);
         query.setExamId(examId);
         Set<String> unFinishSet = studentService.findSubjectUnInspectedByExamId(examId);
         if (query.getFinished() != null) {
@@ -577,6 +590,7 @@ public class InspectedController extends BaseExamController {
         model.addAttribute("resultList", list);
         model.addAttribute("query", query);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
+        model.addAttribute("examFinish", checkFinish(exam));
         return "modules/exam/inspectedInfo";
     }
 
@@ -644,8 +658,8 @@ public class InspectedController extends BaseExamController {
         }
         try {
             List<InspectWorkVo> list = inspectHistoryService.findInspectWork(examId);
-            String fileName = "复核工作量.xlsx";
-            new ExportExcel("复核工作量", InspectWorkVo.class).setDataList(list).write(response, fileName).dispose();
+            String fileName = "复核工作量.xlsx";
+            new ExportExcel("复核工作量", InspectWorkVo.class).setDataList(list).write(response, fileName).dispose();
             return null;
         } catch (Exception e) {
             addErrMessage(redirectAttributes, e, "导出数据失败");

+ 4 - 66
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -31,24 +31,18 @@ import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
-import cn.com.qmth.stmms.biz.utils.DoubleUtil;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 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.ExamType;
 import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.Encodes;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
@@ -72,15 +66,9 @@ public class ScoreController extends BaseExamController {
     @Autowired
     private ExamPackageService packageService;
 
-    @Autowired
-    private MarkGroupService groupService;
-
     @Autowired
     private ExamService examService;
 
-    @Autowired
-    private CheckStudentService checkStudentService;
-
     @Autowired
     private FileService fileService;
 
@@ -117,7 +105,7 @@ public class ScoreController extends BaseExamController {
         String logMessage = getLogMessage(query, filter);
         RequestUtils.setLog(request, logMessage);
         Exam exam = examService.findById(examId);
-        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ? enableExport(exam,
+        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ? subjectService.enableExport(exam,
                 query.getSubjectCode()) : null;
         if (exportMessage != null) {
             view.addObject("exportMessage", exportMessage);
@@ -254,7 +242,7 @@ public class ScoreController extends BaseExamController {
         List<String> error = new ArrayList<String>();
         // 单科目导出
         if (StringUtils.isNotBlank(query.getSubjectCode())) {
-            String exportMessage = enableExport(exam, query.getSubjectCode());
+            String exportMessage = subjectService.enableExport(exam, query.getSubjectCode());
             // 判断不允许导出则直接返回
             if (exportMessage != null) {
                 addMessage(redirectAttributes, "该科目不能导出成绩 " + exportMessage);
@@ -270,7 +258,7 @@ public class ScoreController extends BaseExamController {
             }
             for (ExamSubject subject : list) {
                 // 遍历所有科目,判断是否允许导出
-                String meaages = enableExport(exam, subject.getCode());
+                String meaages = subjectService.enableExport(exam, subject.getCode());
                 if (meaages == null) {
                     subjectSet.add(subject.getCode());
                 } else {
@@ -354,7 +342,7 @@ public class ScoreController extends BaseExamController {
         JSONObject obj = new JSONObject();
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
-        String exportMessage = enableExport(exam, subjectCode);
+        String exportMessage = subjectService.enableExport(exam, subjectCode);
         if (exportMessage != null) {
             obj.accumulate("enableExport", false);
             obj.accumulate("exportMessage", exportMessage);
@@ -431,54 +419,4 @@ public class ScoreController extends BaseExamController {
         }
     }
 
-    private String enableExport(Exam exam, String subjectCode) {
-        ExamSubject subject = subjectService.find(exam.getId(), subjectCode);
-        if (subject == null) {
-            return subjectCode + "该科目不存在";
-        }
-        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(exam.getId(), subjectCode,
-                MarkStatus.FORMAL, MarkStatus.TRIAL);
-        if (groups != null && !groups.isEmpty()) {
-            return subjectCode + "评卷未完成";
-        }
-        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
-            return null;
-        }
-        if (DoubleUtil.sum(subject.getObjectiveScore(), subject.getSubjectiveScore()) == 0) {
-            return subjectCode + "科目总分为0";
-        }
-        long groupCount = groupService.countByExamAndSubject(exam.getId(), subjectCode);
-        if (subject.getSubjectiveScore() != null && subject.getSubjectiveScore() > 0 && groupCount == 0) {
-            return subjectCode + "未设置评卷分组";
-        }
-        if (checkStudentService.countByExamIdAndSubjectCodeAndChecked(exam.getId(), subjectCode, false) > 0) {
-            return subjectCode + "人工确认未完成";
-        }
-        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-        query.setExamId(exam.getId());
-        query.setUpload(false);
-        query.setManualAbsent(false);
-        query.setSubjectCode(subjectCode);
-        if (studentService.countByQuery(query) > 0) {
-            StringBuilder builder = new StringBuilder(subjectCode + "未上传考生必须人工指定缺考");
-            query.setPageSize(Integer.MAX_VALUE);
-            query = studentService.findByQuery(query);
-            for (ExamStudent s : query.getResult()) {
-                builder.append("," + s.getExamNumber());
-            }
-            return builder.toString();
-        }
-        query.setUpload(true);
-        query.setManualAbsent(true);
-        if (studentService.countByQuery(query) > 0) {
-            StringBuilder builder = new StringBuilder(subjectCode + "已上传考生有人工指定缺考");
-            query.setPageSize(Integer.MAX_VALUE);
-            query = studentService.findByQuery(query);
-            for (ExamStudent s : query.getResult()) {
-                builder.append("," + s.getExamNumber());
-            }
-            return builder.toString();
-        }
-        return null;
-    }
 }

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspectedInfo.jsp

@@ -14,7 +14,7 @@
         <c:if test="${fn:contains(role_privilege_codes, 'exam_inspected_info-list')}">
         <li><a href="${ctx}/admin/exam/inspected/list">全卷复核</a></li>
         </c:if>
-        <c:if test="${fn:contains(role_privilege_codes, 'exam_inspected_info-score_verify')}">
+        <c:if test="${examFinish && fn:contains(role_privilege_codes, 'exam_inspected_info-score_verify')}">
         <li><a href="${ctx}/admin/exam/score/verify/init">成绩校验</a></li>
         </c:if>
     </ul>

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

@@ -24,7 +24,7 @@
         <li><a href="${ctx}/admin/exam/inspected/info">成绩复核进度</a></li>
         </c:if>
         <li class="active"><a href="##">全卷复核</a></li>
-        <c:if test="${fn:contains(role_privilege_codes, 'exam_inspected_info-score_verify')}">
+        <c:if test="${examFinish && fn:contains(role_privilege_codes, 'exam_inspected_info-score_verify')}">
         <li><a href="${ctx}/admin/exam/score/verify/init">成绩校验</a></li>
         </c:if>
 </ul>
@@ -123,7 +123,7 @@
     </div>
 </form>
 <tags:message content="${message}"/>
-<form id="cancelForm" action="${ctx}/admin/exam/inspected/batchCancel" method="post" class="breadcrumb form-search">
+<form id="cancelForm" action="${ctx}/admin/exam/inspected/batchCancel" method="post" class="breadcrumb form-search"  style="overflow-x: auto;">
 <table id="contentTable" class="table table-striped table-bordered table-condensed">
     <thead>
     <tr>