Browse Source

成绩校验

xiatian 1 year ago
parent
commit
91259d2e17
18 changed files with 766 additions and 161 deletions
  1. 94 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/ScoreVerifyVo.java
  2. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  3. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ScoreVerifyDetailDao.java
  4. 30 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java
  5. 11 9
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ScoreVerifyDetail.java
  6. 5 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ScoreVerifyQuery.java
  7. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  8. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ScoreVerifyDetailService.java
  9. 12 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ScoreVerifyService.java
  10. 6 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  11. 16 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ScoreVerifyDetailServiceImpl.java
  12. 248 50
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ScoreVerifyServiceImpl.java
  13. 160 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/Calculator.java
  14. 130 25
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreVerifyController.java
  15. 36 52
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreVerifyPage.jsp
  16. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreVerifyQuery.jsp
  17. 2 2
      stmms-web/src/main/webapp/sql/stmms_ft.sql
  18. 2 2
      stmms-web/src/main/webapp/sql/upgrade/1.3.14.sql

+ 94 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/ScoreVerifyVo.java

@@ -1,20 +1,28 @@
 package cn.com.qmth.stmms.biz.exam.bean;
 
 import java.util.Date;
+import java.util.List;
 
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import org.apache.commons.lang.StringUtils;
+
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.annotation.ExcelField;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
 
 public class ScoreVerifyVo {
-
+	private Integer examId;
 	// 考生id
 	private Integer studentId;
 	// 考生姓名
+	@ExcelField(title = "考生姓名*", align = 2, sort = 1)
 	private String studentName;
 	// 考生编号
+	@ExcelField(title = "考生编号*", align = 2, sort = 2)
 	private String studentCode;
 	// 科目
+	@ExcelField(title = "科目代码*", align = 2, sort = 3)
 	private String subjectCode;
+	@ExcelField(title = "科目名称*", align = 2, sort = 4)
 	private String subjectName;
 	// 上传状态
 	private Boolean upload;
@@ -27,6 +35,19 @@ public class ScoreVerifyVo {
 	// 校验时间
 	private Date scoreVerifyTime;
 	private Double objectiveScore;
+	private Boolean absent;
+	private List<String> sheetUrls;
+	private String answerUrl;
+	private String examNumber;
+	private Integer sheetCount;
+
+	public String getSheetUrlString() {
+		if (sheetUrls != null) {
+			return StringUtils.join(sheetUrls, ",");
+		} else {
+			return "";
+		}
+	}
 
 	public Integer getStudentId() {
 		return studentId;
@@ -63,6 +84,30 @@ public class ScoreVerifyVo {
 		return score;
 	}
 
+	public String getObjectiveScoreString() {
+		try {
+			return ScoreItem.NUMBER_FORMAT.format(objectiveScore);
+		} catch (Exception e) {
+			return "";
+		}
+	}
+
+	public String getSubjectiveScoreString() {
+		try {
+			return ScoreItem.NUMBER_FORMAT.format(subjectiveScore);
+		} catch (Exception e) {
+			return "";
+		}
+	}
+
+	public String getTotalScoreString() {
+		try {
+			return ScoreItem.NUMBER_FORMAT.format(getTotalScore());
+		} catch (Exception e) {
+			return "";
+		}
+	}
+
 	public Boolean getUpload() {
 		return upload;
 	}
@@ -127,5 +172,52 @@ public class ScoreVerifyVo {
 		this.objectiveScore = objectiveScore;
 	}
 
+	public Boolean getAbsent() {
+		return absent;
+	}
+
+	public void setAbsent(Boolean absent) {
+		this.absent = absent;
+	}
+
+	public Integer getExamId() {
+		return examId;
+	}
+
+	public void setExamId(Integer examId) {
+		this.examId = examId;
+	}
+
+	public List<String> getSheetUrls() {
+		return sheetUrls;
+	}
+
+	public void setSheetUrls(List<String> sheetUrls) {
+		this.sheetUrls = sheetUrls;
+	}
+
+	public String getAnswerUrl() {
+		return answerUrl;
+	}
+
+	public void setAnswerUrl(String answerUrl) {
+		this.answerUrl = answerUrl;
+	}
+
+	public String getExamNumber() {
+		return examNumber;
+	}
+
+	public void setExamNumber(String examNumber) {
+		this.examNumber = examNumber;
+	}
+
+	public Integer getSheetCount() {
+		return sheetCount;
+	}
+
+	public void setSheetCount(Integer sheetCount) {
+		this.sheetCount = sheetCount;
+	}
 
 }

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

@@ -239,5 +239,9 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     @Query("update ExamStudent s set s.college=?2 ,s.className=?3, s.teacher=?4,s.examRoom=?5, s.examSite=?6, s.remark=?7 where s.id=?1 ")
     public int updateInfo(Integer id, String college, String className, String teacher, String examRoom,
             String examSite, String remark);
+    
+    @Modifying
+    @Query("update ExamStudent s set s.scoreVerifyUser=?1,s.scoreVerifyTime=?2,s.scoreVerifyFlagged=?3 where s.id=?4 ")
+    public void scoreVerifyTag(Integer userId,Date time,Boolean tag,Integer studentId);
 
 }

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

@@ -8,4 +8,8 @@ import cn.com.qmth.stmms.biz.exam.model.ScoreVerifyDetail;
 public interface ScoreVerifyDetailDao
 		extends PagingAndSortingRepository<ScoreVerifyDetail, Integer>, JpaSpecificationExecutor<ScoreVerifyDetail> {
 
+	void deleteByScoreVerifyId(Integer id);
+
+	ScoreVerifyDetail findByScoreVerifyIdAndStudentId(Integer scoreVerifyId, Integer studentId);
+
 }

+ 30 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -286,21 +286,21 @@ public class ExamStudent implements Serializable {
     /**
      * 成绩校验人ID
      */
-    @Column(name = "score_check_user")
-    private Integer scoreCheckUser;
+    @Column(name = "score_verify_user")
+    private Integer scoreVerifyUser;
     
     /**
      * 成绩校验时间
      */
     @Temporal(TemporalType.TIMESTAMP)
-    @Column(name = "score_check_time")
-    private Date scoreCheckTime;
+    @Column(name = "score_verify_time")
+    private Date scoreVerifyTime;
     
     /**
      * 成绩校验标记结果
      */
-    @Column(name = "score_check_flagged")
-    private Boolean scoreCheckFlagged;
+    @Column(name = "score_verify_flagged")
+    private Boolean scoreVerifyFlagged;
     
 
     /**
@@ -929,4 +929,28 @@ public class ExamStudent implements Serializable {
         this.inspectCount = inspectCount;
     }
 
+	public Integer getScoreVerifyUser() {
+		return scoreVerifyUser;
+	}
+
+	public void setScoreVerifyUser(Integer scoreVerifyUser) {
+		this.scoreVerifyUser = scoreVerifyUser;
+	}
+
+	public Date getScoreVerifyTime() {
+		return scoreVerifyTime;
+	}
+
+	public void setScoreVerifyTime(Date scoreVerifyTime) {
+		this.scoreVerifyTime = scoreVerifyTime;
+	}
+
+	public Boolean getScoreVerifyFlagged() {
+		return scoreVerifyFlagged;
+	}
+
+	public void setScoreVerifyFlagged(Boolean scoreVerifyFlagged) {
+		this.scoreVerifyFlagged = scoreVerifyFlagged;
+	}
+
 }

+ 11 - 9
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ScoreVerifyDetail.java

@@ -11,8 +11,10 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
-/**成绩校验明细
- * @author Administrator 
+/**
+ * 成绩校验明细
+ * 
+ * @author Administrator
  */
 @Entity
 @Table(name = "eb_score_verify_detail")
@@ -42,15 +44,15 @@ public class ScoreVerifyDetail implements Serializable {
 	/**
 	 * 是否被标记
 	 */
-	@Column(name = "flagged", nullable = false)
+	@Column(name = "flagged")
 	private Boolean flagged;
 
 	/**
 	 * 校验时间
 	 */
 	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name = "create_time", nullable = false)
-	private Date createTime;
+	@Column(name = "verify_time")
+	private Date verifyTime;
 
 	public Integer getId() {
 		return id;
@@ -84,12 +86,12 @@ public class ScoreVerifyDetail implements Serializable {
 		this.flagged = flagged;
 	}
 
-	public Date getCreateTime() {
-		return createTime;
+	public Date getVerifyTime() {
+		return verifyTime;
 	}
 
-	public void setCreateTime(Date createTime) {
-		this.createTime = createTime;
+	public void setVerifyTime(Date verifyTime) {
+		this.verifyTime = verifyTime;
 	}
 
 }

+ 5 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ScoreVerifyQuery.java

@@ -5,6 +5,7 @@ import cn.com.qmth.stmms.biz.exam.bean.ScoreVerifyParam;
 import cn.com.qmth.stmms.biz.exam.bean.ScoreVerifyVo;
 
 public class ScoreVerifyQuery extends BaseQuery<ScoreVerifyVo> {
+	private Integer scoreVerifyId;
 
 	private ScoreVerifyParam param;
 
@@ -12,8 +13,6 @@ public class ScoreVerifyQuery extends BaseQuery<ScoreVerifyVo> {
 
 	private Integer userId;
 
-	private Boolean flagged;
-
 	public ScoreVerifyParam getParam() {
 		return param;
 	}
@@ -38,12 +37,12 @@ public class ScoreVerifyQuery extends BaseQuery<ScoreVerifyVo> {
 		this.userId = userId;
 	}
 
-	public Boolean getFlagged() {
-		return flagged;
+	public Integer getScoreVerifyId() {
+		return scoreVerifyId;
 	}
 
-	public void setFlagged(Boolean flagged) {
-		this.flagged = flagged;
+	public void setScoreVerifyId(Integer scoreVerifyId) {
+		this.scoreVerifyId = scoreVerifyId;
 	}
 
 }

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

@@ -180,4 +180,6 @@ public interface ExamStudentService {
 
     public int batchUpdate(List<ExamStudent> updateList);
 
+	void scoreVerifyTag(Integer userId, Integer studentId, Boolean tag);
+
 }

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

@@ -2,4 +2,6 @@ package cn.com.qmth.stmms.biz.exam.service;
 
 public interface ScoreVerifyDetailService {
 
+	void tag(Integer userId,Integer scoreVerifyId, Integer studentId, boolean isTag);
+
 }

+ 12 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ScoreVerifyService.java

@@ -8,11 +8,19 @@ import cn.com.qmth.stmms.biz.exam.query.ScoreVerifyQuery;
 
 public interface ScoreVerifyService {
 
-	List<ScoreVerifyVo> findByQuery(ScoreVerifyQuery query);
+	List<ScoreVerifyVo> findByQuery(ScoreVerifyQuery req);
 
-	Integer countByQuery(ScoreVerifyQuery query);
+	Integer countByQuery(Integer scoreVerifyId);
 
-	ScoreVerify findByExamIdAndUserId(Integer examId, Integer id);
+	ScoreVerify findByExamIdAndUserId(Integer examId, Integer userId);
 
-	void createQuery(ScoreVerifyQuery query);
+	Integer createQuery(ScoreVerifyQuery query);
+
+	Integer needVerifyCount(Integer scoreVerifyId);
+
+	void reset(Integer id);
+
+	List<ScoreVerifyVo> findFlagged(Integer id);
+
+	List<ScoreVerifyVo> needVerify(Integer id);
 }

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

@@ -1267,4 +1267,10 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         }
         return i;
     }
+    
+    @Transactional
+    @Override
+    public void scoreVerifyTag(Integer userId,Integer studentId,Boolean tag) {
+    	studentDao.scoreVerifyTag(userId, new Date(), tag, studentId);
+    }
 }

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

@@ -1,17 +1,32 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
+import java.util.Date;
+
 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.dao.ScoreVerifyDetailDao;
 import cn.com.qmth.stmms.biz.exam.model.ScoreVerifyDetail;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ScoreVerifyDetailService;
 
 @Service
 public class ScoreVerifyDetailServiceImpl extends BaseQueryService<ScoreVerifyDetail> implements ScoreVerifyDetailService {
-
+    @Autowired
+    private ExamStudentService studentService;
 	@Autowired
 	private ScoreVerifyDetailDao scoreVerifyDetailDao;
 
+	@Transactional
+	@Override
+	public void tag(Integer userId,Integer scoreVerifyId, Integer studentId, boolean isTag) {
+		ScoreVerifyDetail sd=scoreVerifyDetailDao.findByScoreVerifyIdAndStudentId(scoreVerifyId,studentId);
+		sd.setFlagged(isTag);
+		sd.setVerifyTime(new Date());
+		scoreVerifyDetailDao.save(sd);
+		studentService.scoreVerifyTag(userId, studentId, isTag);
+	}
+
 }

+ 248 - 50
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ScoreVerifyServiceImpl.java

@@ -1,7 +1,10 @@
 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 javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
@@ -19,67 +22,78 @@ import com.google.gson.Gson;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.bean.ScoreVerifyVo;
 import cn.com.qmth.stmms.biz.exam.dao.ScoreVerifyDao;
+import cn.com.qmth.stmms.biz.exam.dao.ScoreVerifyDetailDao;
 import cn.com.qmth.stmms.biz.exam.enums.ScoreVerifyRule;
+import cn.com.qmth.stmms.biz.exam.enums.ScoreVerifyRuleCompare;
 import cn.com.qmth.stmms.biz.exam.model.ScoreVerify;
+import cn.com.qmth.stmms.biz.exam.model.ScoreVerifyDetail;
 import cn.com.qmth.stmms.biz.exam.query.ScoreVerifyQuery;
 import cn.com.qmth.stmms.biz.exam.service.ScoreVerifyService;
 import cn.com.qmth.stmms.biz.exception.StatusException;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.biz.utils.Calculator;
 
 @Service
 public class ScoreVerifyServiceImpl extends BaseQueryService<ScoreVerify> implements ScoreVerifyService {
-	
+
 	@PersistenceContext
-    private EntityManager entityManager;
-	
+	private EntityManager entityManager;
+
 	@Autowired
 	private ScoreVerifyDao scoreVerifyDao;
+	
+	@Autowired
+	private ScoreVerifyDetailDao scoreVerifyDetailDao;
+
+	@Autowired
+	private FileService fileService;
 
+	private void buildSheetUrl(ScoreVerifyVo student) {
+		student.setSheetUrls(
+				fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
+	}
+
+	@SuppressWarnings("unchecked")
 	@Override
 	public List<ScoreVerifyVo> findByQuery(ScoreVerifyQuery req) {
-		int offset=(req.getPageNumber() - 1) * req.getPageSize();
-		StringBuilder sql = new StringBuilder();
-		sql.append("select t.id studentId,t.student_code studentCode,t.name studentName,t.subject_code subjectCode,t.subject_name subjectName, ");
-		sql.append("t.is_upload upload,t.subjective_score subjectiveScore,t.subjective_score_list subjectiveScoreList,t.objective_score objectiveScore, ");
-		sql.append("u.name scoreVerifyUserName,t.score_check_time scoreVerifyTime ");
-		sql.append("from eb_exam_student t left join b_user u on t.score_check_user=u.id where t.exam_id="+req.getExamId());
-		sql.append(getWhereSql(req));
-		sql.append("order by t.student_code,t.id ");
-        sql.append("limit "+offset+","+req.getPageSize());
-        Query query = entityManager.createNativeQuery(sql.toString());
-        query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ScoreVerifyVo.class));
-        return query.getResultList();
-	}
-	
-	private String getWhereSql(ScoreVerifyQuery req) {
+		int offset = (req.getPageNumber() - 1) * req.getPageSize();
 		StringBuilder sql = new StringBuilder();
-		if(StringUtils.isNotBlank(req.getParam().getStudentCode())) {
-			sql.append(" and t.student_code='"+req.getParam().getStudentCode()+"'");
-		}
-		if(StringUtils.isNotBlank(req.getParam().getStudentName())) {
-			sql.append(" and t.name='"+req.getParam().getStudentName()+"'");
-		}
-		ScoreVerifyRule rule=req.getParam().getRule();
-		if(rule!=null) {
-			if(ScoreVerifyRule.RULE1.equals(rule)) {
-				
-			}else if(ScoreVerifyRule.RULE2.equals(rule)) {
-				
-			}else if(ScoreVerifyRule.RULE3.equals(rule)) {
-				
+		sql.append(
+				" select t.sheet_count sheetCount,t.exam_number examNumber,t.exam_id examId,t.id studentId,t.student_code studentCode,t.name studentName,t.subject_code subjectCode,t.subject_name subjectName, ");
+		sql.append(
+				" t.is_upload upload,t.is_absent absent,t.subjective_score subjectiveScore,t.subjective_score_list subjectiveScoreList,t.objective_score objectiveScore, ");
+		sql.append(" u.name scoreVerifyUserName,t.score_verify_time scoreVerifyTime ");
+		sql.append(" from eb_score_verify_detail r left join eb_exam_student t on r.student_id=t.id ");
+		sql.append(" left join b_user u on t.score_verify_user=u.id where r.score_verify_id="+ req.getScoreVerifyId());
+		sql.append(" order by t.student_code,t.subject_code ");
+		sql.append(" limit " + offset + "," + req.getPageSize());
+		Query query = entityManager.createNativeQuery(sql.toString());
+		query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ScoreVerifyVo.class));
+		List<ScoreVerifyVo> ret = query.getResultList();
+		if (ret != null && !ret.isEmpty()) {
+			for (ScoreVerifyVo vo : ret) {
+				buildSheetUrl(vo);
 			}
 		}
-		return sql.toString();
+		return ret;
 	}
 
-
 	@Override
-	public Integer countByQuery(ScoreVerifyQuery req) {
+	public Integer needVerifyCount(Integer scoreVerifyId) {
 		StringBuilder sql = new StringBuilder();
 		sql.append("select count(1) ");
-		sql.append("from eb_exam_student t where t.exam_id="+req.getExamId());
-		sql.append(getWhereSql(req));
-        Query query = entityManager.createNativeQuery(sql.toString());
-        return Integer.valueOf(query.getResultList().get(0).toString());
+		sql.append("from eb_score_verify_detail t where t.score_verify_id=" + scoreVerifyId+" and t.flagged is null ");
+		Query query = entityManager.createNativeQuery(sql.toString());
+		return Integer.valueOf(query.getResultList().get(0).toString());
+	}
+	
+	@Override
+	public Integer countByQuery(Integer scoreVerifyId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select count(1) ");
+		sql.append("from eb_score_verify_detail t where t.score_verify_id=" + scoreVerifyId);
+		Query query = entityManager.createNativeQuery(sql.toString());
+		return Integer.valueOf(query.getResultList().get(0).toString());
 	}
 
 	@Override
@@ -89,27 +103,211 @@ public class ScoreVerifyServiceImpl extends BaseQueryService<ScoreVerify> implem
 
 	@Transactional
 	@Override
-	public void createQuery(ScoreVerifyQuery query) {
-		if (query.getParam() == null || (StringUtils.isBlank(query.getParam().getStudentCode())
-				&& StringUtils.isBlank(query.getParam().getStudentName()) && query.getParam().getRule() == null)) {
+	public Integer createQuery(ScoreVerifyQuery req) {
+		if (req.getParam() == null || (StringUtils.isBlank(req.getParam().getStudentCode())
+				&& StringUtils.isBlank(req.getParam().getStudentName()) && req.getParam().getRule() == null)) {
 			throw new StatusException("请选择至少一个条件");
 		}
-		if (ScoreVerifyRule.RULE2.equals(query.getParam().getRule())
-				|| ScoreVerifyRule.RULE3.equals(query.getParam().getRule())) {
-			if(query.getParam().getRuleCompare()==null) {
+		if (ScoreVerifyRule.RULE2.equals(req.getParam().getRule())
+				|| ScoreVerifyRule.RULE3.equals(req.getParam().getRule())) {
+			if (req.getParam().getRuleCompare() == null) {
 				throw new StatusException("请选择分数匹配条件");
 			}
-			if(query.getParam().getCompareScore()==null) {
+			if (req.getParam().getCompareScore() == null) {
 				throw new StatusException("请填写匹配分值");
 			}
 		}
-		ScoreVerify sv=new ScoreVerify();
+		ScoreVerify sv = new ScoreVerify();
 		sv.setCreateTime(new Date());
-		sv.setExamId(query.getExamId());
-		sv.setUserId(query.getUserId());
+		sv.setExamId(req.getExamId());
+		sv.setUserId(req.getUserId());
 		Gson gson = new Gson();
-		sv.setParams(gson.toJson(query.getParam()));
+		sv.setParams(gson.toJson(req.getParam()));
 		scoreVerifyDao.save(sv);
+		List<ScoreVerifyVo> allStudents=getAllStudent(req);
+		if(allStudents==null||allStudents.size()==0) {
+			throw new StatusException("没有满足条件的数据");
+		}
+		List<ScoreVerifyDetail> details=createDetailByQuery(sv.getId(), allStudents, req);
+		if(details==null||details.size()==0) {
+			throw new StatusException("没有满足条件的数据");
+		}
+		scoreVerifyDetailDao.save(details);
+		return sv.getId();
+	}
+
+	@SuppressWarnings("unchecked")
+	private List<ScoreVerifyVo> getAllStudent(ScoreVerifyQuery req) {
+		StringBuilder sql = new StringBuilder();
+		sql.append(
+				"select t.id studentId,t.student_code studentCode,t.subjective_score subjectiveScore,t.objective_score objectiveScore from eb_exam_student t  ");
+		sql.append("where exam_id=" + req.getExamId());
+		if (StringUtils.isNotBlank(req.getParam().getStudentCode())) {
+			sql.append(" and t.student_code='" + req.getParam().getStudentCode() + "'");
+		}
+		if (StringUtils.isNotBlank(req.getParam().getStudentName())) {
+			sql.append(" and t.name='" + req.getParam().getStudentName() + "'");
+		}
+		Query query = entityManager.createNativeQuery(sql.toString());
+		query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ScoreVerifyVo.class));
+		List<ScoreVerifyVo> ret = query.getResultList();
+		return ret;
+	}
+
+	private List<ScoreVerifyDetail> createDetailByQuery(Integer scoreVerifyId, List<ScoreVerifyVo> vos,
+			ScoreVerifyQuery req) {
+		List<ScoreVerifyDetail> ret = new ArrayList<>();
+		if (vos != null & vos.size() > 0) {
+			Map<String, List<ScoreVerifyVo>> voMap = new HashMap<>();
+			for (ScoreVerifyVo vo : vos) {
+				List<ScoreVerifyVo> tem = voMap.get(vo.getStudentCode());
+				if (tem == null) {
+					tem = new ArrayList<>();
+					voMap.put(vo.getStudentCode(), tem);
+				}
+				tem.add(vo);
+			}
+			for (List<ScoreVerifyVo> temVos : voMap.values()) {
+				if (checkInQuery(temVos, req)) {
+					ret.addAll(of(scoreVerifyId, temVos));
+				}
+			}
+		}
+		return ret;
+	}
+
+	private List<ScoreVerifyDetail> of(Integer scoreVerifyId, List<ScoreVerifyVo> vos) {
+		List<ScoreVerifyDetail> ret = new ArrayList<>();
+		for (ScoreVerifyVo vo : vos) {
+			ScoreVerifyDetail sv = new ScoreVerifyDetail();
+			sv.setScoreVerifyId(scoreVerifyId);
+			sv.setStudentId(vo.getStudentId());
+			ret.add(sv);
+		}
+		return ret;
+	}
+
+	private boolean checkInQuery(List<ScoreVerifyVo> vos, ScoreVerifyQuery req) {
+		ScoreVerifyRule rule = req.getParam().getRule();
+		if (rule == null) {
+			return true;
+		}
+		if (rule != null&&vos.size()==1) {
+			return false;
+		}
+		//两个条件,满足各自条件的list
+		List<ScoreVerifyVo> group1=new ArrayList<>();
+		List<ScoreVerifyVo> group2=new ArrayList<>();
+		if (ScoreVerifyRule.RULE1.equals(rule)) {
+			for (ScoreVerifyVo vo : vos) {
+				double totalScore=Calculator.add(vo.getObjectiveScore(),vo.getSubjectiveScore());
+				if(totalScore>0) {
+					group1.add(vo);
+				}
+				if(totalScore==0) {
+					group2.add(vo);
+				}
+			}
+		} else if (ScoreVerifyRule.RULE2.equals(rule)) {
+			for (ScoreVerifyVo vo : vos) {
+				double totalScore=Calculator.add(vo.getObjectiveScore(),vo.getSubjectiveScore());
+				if(totalScore<=5) {
+					group1.add(vo);
+				}
+				if(ScoreVerifyRuleCompare.EQUALS.equals(req.getParam().getRuleCompare())
+						&&totalScore==req.getParam().getCompareScore()) {
+					group2.add(vo);
+				}else if(ScoreVerifyRuleCompare.GT.equals(req.getParam().getRuleCompare())
+						&&totalScore>req.getParam().getCompareScore()) {
+					group2.add(vo);
+				}else if(ScoreVerifyRuleCompare.LT.equals(req.getParam().getRuleCompare())
+						&&totalScore<req.getParam().getCompareScore()) {
+					group2.add(vo);
+				}
+			}
+		} else if (ScoreVerifyRule.RULE3.equals(rule)) {
+			for (ScoreVerifyVo vo : vos) {
+				double totalScore=Calculator.add(vo.getObjectiveScore(),vo.getSubjectiveScore());
+				if(totalScore<=10) {
+					group1.add(vo);
+				}
+				if(ScoreVerifyRuleCompare.EQUALS.equals(req.getParam().getRuleCompare())
+						&&totalScore==req.getParam().getCompareScore()) {
+					group2.add(vo);
+				}else if(ScoreVerifyRuleCompare.GT.equals(req.getParam().getRuleCompare())
+						&&totalScore>req.getParam().getCompareScore()) {
+					group2.add(vo);
+				}else if(ScoreVerifyRuleCompare.LT.equals(req.getParam().getRuleCompare())
+						&&totalScore<req.getParam().getCompareScore()) {
+					group2.add(vo);
+				}
+			}
+		}
+		
+		if(group1.size()>0&&group2.size()>0) {
+			if(group1.size()>=2||group2.size()>=2) {
+				//两个list都有值,且至少有一个数量大于2的一定满足
+				return true;
+			}
+			if(group1.size()==1&&group2.size()==1
+					&&!group1.get(0).getStudentId().equals(group2.get(0).getStudentId())) {
+				//都只有一条的时候,id不同则通过
+				return true;
+			}
+		}
+		return false;
 	}
 
+	@Transactional
+	@Override
+	public void reset(Integer scoreVerifyId) {
+		scoreVerifyDao.delete(scoreVerifyId);
+		scoreVerifyDetailDao.deleteByScoreVerifyId(scoreVerifyId);
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ScoreVerifyVo> findFlagged(Integer scoreVerifyId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append(
+				" select t.sheet_count sheetCount,t.exam_number examNumber,t.exam_id examId,t.id studentId,t.student_code studentCode,t.name studentName,t.subject_code subjectCode,t.subject_name subjectName, ");
+		sql.append(
+				" t.is_upload upload,t.is_absent absent,t.subjective_score subjectiveScore,t.subjective_score_list subjectiveScoreList,t.objective_score objectiveScore, ");
+		sql.append(" u.name scoreVerifyUserName,t.score_verify_time scoreVerifyTime ");
+		sql.append(" from eb_score_verify_detail r left join eb_exam_student t on r.student_id=t.id ");
+		sql.append(" left join b_user u on t.score_verify_user=u.id where r.score_verify_id="+ scoreVerifyId+" and r.flagged =1 ");
+		sql.append(" order by t.student_code,t.subject_code ");
+		Query query = entityManager.createNativeQuery(sql.toString());
+		query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ScoreVerifyVo.class));
+		List<ScoreVerifyVo> ret = query.getResultList();
+		if (ret != null && !ret.isEmpty()) {
+			for (ScoreVerifyVo vo : ret) {
+				buildSheetUrl(vo);
+			}
+		}
+		return ret;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ScoreVerifyVo> needVerify(Integer scoreVerifyId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append(
+				" select t.sheet_count sheetCount,t.exam_number examNumber,t.exam_id examId,t.id studentId,t.student_code studentCode,t.name studentName,t.subject_code subjectCode,t.subject_name subjectName, ");
+		sql.append(
+				" t.is_upload upload,t.is_absent absent,t.subjective_score subjectiveScore,t.subjective_score_list subjectiveScoreList,t.objective_score objectiveScore, ");
+		sql.append(" u.name scoreVerifyUserName,t.score_verify_time scoreVerifyTime ");
+		sql.append(" from eb_score_verify_detail r left join eb_exam_student t on r.student_id=t.id ");
+		sql.append(" left join b_user u on t.score_verify_user=u.id where r.score_verify_id="+ scoreVerifyId+" and r.flagged is null ");
+		sql.append(" order by t.student_code,t.subject_code ");
+		Query query = entityManager.createNativeQuery(sql.toString());
+		query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(ScoreVerifyVo.class));
+		List<ScoreVerifyVo> ret = query.getResultList();
+		if (ret != null && !ret.isEmpty()) {
+			for (ScoreVerifyVo vo : ret) {
+				buildSheetUrl(vo);
+			}
+		}
+		return ret;
+	}
 }

+ 160 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/Calculator.java

@@ -0,0 +1,160 @@
+package cn.com.qmth.stmms.biz.utils;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.springframework.util.CollectionUtils;
+
+/**
+ * 计算器
+ *
+ */
+public class Calculator {
+	
+    public static double add(Double v1, Double v2) {
+    	if(v1==null) {
+    		v1=0.0;
+    	}
+    	if(v2==null) {
+    		v2=0.0;
+    	}
+        return add(v1, v2, 2);
+
+    }
+
+    /**
+     * 加法 保留两位小数
+     * 
+     * @param v1
+     * @param v2
+     * @return
+     */
+    public static double add(double v1, double v2) {
+        return add(v1, v2, 2);
+
+    }
+
+    /**
+     * 加法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double add(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.add(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+    
+    /** 加法 保留指定位小数
+     * @param ds
+     * @param len
+     * @return
+     */
+    public static double add(List<Double> ds, int len) {
+        if(CollectionUtils.isEmpty(ds)) {
+        	return 0;
+        }
+        BigDecimal ret = new BigDecimal(0.0);
+        for(Double d:ds) {
+            if(d!=null) {
+                ret=ret.add(new BigDecimal(d));
+            }
+        }
+        return ret.setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+
+    /**
+     * 减法 保留两位小数
+     * 
+     * @param v1
+     * @param v2
+     * @return
+     */
+    public static double subtract(double v1, double v2) {
+        return subtract(v1, v2, 2);
+
+    }
+
+    /**
+     * 减法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double subtract(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.subtract(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+
+    /**
+     * 乘法 保留两位小数
+     * 
+     * @param v1
+     * @param v2
+     * @return
+     */
+    public static double multiply(double v1, double v2) {
+        return multiply(v1, v2, 2);
+
+    }
+
+    /**
+     * 乘法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double multiply(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.multiply(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+    
+    
+    /**
+     * 除法 保留两位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double divide(double v1, double v2) {
+        return divide(v1, v2, 2);
+    }
+    
+    /**
+     * 除法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double divide(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    public static String divide2String(Double v1, Double v2, int len) {
+        if(v1==null||v2==null||v2==0) {
+            return "-";
+        }
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return String.valueOf(b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue());
+    }
+}

+ 130 - 25
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreVerifyController.java

@@ -2,8 +2,10 @@ package cn.com.qmth.stmms.admin.exam;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -11,22 +13,29 @@ import org.springframework.beans.factory.annotation.Autowired;
 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.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-import com.google.gson.Gson;
-
-import cn.com.qmth.stmms.biz.exam.bean.ScoreVerifyParam;
 import cn.com.qmth.stmms.biz.exam.bean.ScoreVerifyVo;
 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.ScoreVerify;
 import cn.com.qmth.stmms.biz.exam.query.ScoreVerifyQuery;
-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.ScoreVerifyDetailService;
 import cn.com.qmth.stmms.biz.exam.service.ScoreVerifyService;
 import cn.com.qmth.stmms.biz.exception.StatusException;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.biz.mark.model.Task;
+import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
 
 
 @Controller("scoreVerifyController")
@@ -34,15 +43,40 @@ import cn.com.qmth.stmms.common.utils.RequestUtils;
 public class ScoreVerifyController extends BaseExamController {
 
 	protected static Logger log = LoggerFactory.getLogger(ScoreVerifyController.class);
-
+	
+    @Autowired
+    private ExamStudentService studentService;
 	@Autowired
 	private ScoreVerifyService scoreVerifyService;
-
 	@Autowired
-	private ExamQuestionService questionService;
-
+	private ScoreVerifyDetailService scoreVerifyDetailService;
+	
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private FileService fileService;
 	@Autowired
 	private ExamService examService;
+	
+	@RequestMapping(value = "reset")
+	public String reset(Model model, HttpServletRequest request) {
+		Integer examId = getSessionExamId(request);
+		Exam exam = examService.findById(examId);
+		if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+			return "modules/exam/permission";
+		}
+		WebUser wu = RequestUtils.getWebUser(request);
+		ScoreVerify sv=scoreVerifyService.findByExamIdAndUserId(examId,wu.getId());
+		if(sv==null) {
+			model.addAttribute("errmsg", "没有数据需要重置");
+			model.addAttribute("showType", "query");
+			return "modules/exam/scoreVerify";
+		}else {
+	        scoreVerifyService.reset(sv.getId());
+	        model.addAttribute("showType", "query");
+			return "modules/exam/scoreVerify";
+		}
+	}
 
 	@RequestMapping(value = "init")
 	public String init(Model model, HttpServletRequest request, ScoreVerifyQuery query) {
@@ -59,9 +93,9 @@ public class ScoreVerifyController extends BaseExamController {
 			model.addAttribute("showType", "query");
 			return "modules/exam/scoreVerify";
 		}else {
-			Gson gson = new Gson();
-			ScoreVerifyParam param = gson.fromJson(sv.getParams(), ScoreVerifyParam.class);
-			query.setParam(param);
+			query.setScoreVerifyId(sv.getId());
+			model.addAttribute("fileServer", fileService.getFileServer());
+	        model.addAttribute("examType", exam.getType());
 			return query(model, request, query);
 		}
 	}
@@ -77,12 +111,12 @@ public class ScoreVerifyController extends BaseExamController {
 		query.setExamId(examId);
 		query.setUserId(wu.getId());
 		ScoreVerify sv=scoreVerifyService.findByExamIdAndUserId(examId,wu.getId());
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("examType", exam.getType());
 		if(sv==null) {
 			return createAndQuery(model, request, query);
 		}else {
-			Gson gson = new Gson();
-			ScoreVerifyParam param = gson.fromJson(sv.getParams(), ScoreVerifyParam.class);
-			query.setParam(param);
+			query.setScoreVerifyId(sv.getId());
 			return query(model, request, query);
 		}
 		
@@ -90,13 +124,12 @@ public class ScoreVerifyController extends BaseExamController {
 	
 	private String createAndQuery(Model model, HttpServletRequest request, ScoreVerifyQuery query) {
 		try {
-			scoreVerifyService.createQuery(query);
-			query.setFlagged(null);
-			Integer totalCount = scoreVerifyService.countByQuery(query);
+			Integer scoreVerifyId=scoreVerifyService.createQuery(query);
+			query.setScoreVerifyId(scoreVerifyId);
+			Integer totalCount = scoreVerifyService.countByQuery(scoreVerifyId);
 			if(totalCount>0) {
 				List<ScoreVerifyVo> list = scoreVerifyService.findByQuery(query);
-				query.setFlagged(true);
-				Integer needVerifyCount = scoreVerifyService.countByQuery(query);
+				Integer needVerifyCount = scoreVerifyService.needVerifyCount(scoreVerifyId);
 				query.setResult(list);
 				query.setTotalCount(totalCount);
 				model.addAttribute("needVerifyCount", needVerifyCount);
@@ -107,20 +140,19 @@ public class ScoreVerifyController extends BaseExamController {
 			}
 		} catch (StatusException e) {
 			model.addAttribute("errmsg", e.getDesc());
-		}finally {
-			model.addAttribute("showType", "page");
+			model.addAttribute("showType", "query");
+			return "modules/exam/scoreVerify";
 		}
+		model.addAttribute("showType", "page");
 		model.addAttribute("query", query);
 		return "modules/exam/scoreVerify";
 	}
 	
 	private String query(Model model, HttpServletRequest request, ScoreVerifyQuery query) {
-		query.setFlagged(null);
-		Integer totalCount = scoreVerifyService.countByQuery(query);
+		Integer totalCount = scoreVerifyService.countByQuery(query.getScoreVerifyId());
 		if(totalCount>0) {
 			List<ScoreVerifyVo> list = scoreVerifyService.findByQuery(query);
-			query.setFlagged(true);
-			Integer needVerifyCount = scoreVerifyService.countByQuery(query);
+			Integer needVerifyCount = scoreVerifyService.needVerifyCount(query.getScoreVerifyId());
 			query.setResult(list);
 			query.setTotalCount(totalCount);
 			model.addAttribute("needVerifyCount", needVerifyCount);
@@ -133,4 +165,77 @@ public class ScoreVerifyController extends BaseExamController {
 		model.addAttribute("showType", "page");
 		return "modules/exam/scoreVerify";
 	}
+	
+    @RequestMapping(value = "export", method = RequestMethod.POST)
+    public String exportFile(HttpServletRequest request, HttpServletResponse response,
+            RedirectAttributes redirectAttributes) {
+    	Integer examId = getSessionExamId(request);
+		Exam exam = examService.findById(examId);
+		if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+			return "modules/exam/permission";
+		}
+		WebUser wu = RequestUtils.getWebUser(request);
+    	ScoreVerify sv=scoreVerifyService.findByExamIdAndUserId(examId,wu.getId());
+    	if(sv==null) {
+    		addMessage(redirectAttributes, "没有数据需要导出");
+    		return "redirect:/admin/exam/score/verify/init";
+    	}
+        try {
+        	List<ScoreVerifyVo> list = scoreVerifyService.findFlagged(sv.getId());
+            String fileName = "标记卷数据.xlsx";
+            new ExportExcel("标记卷数据", ScoreVerifyVo.class).setDataList(list).write(response, fileName)
+                    .dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导出数据失败" + e.getMessage());
+        }
+        return "redirect:/admin/exam/score/verify/init";
+    }
+    
+    @ResponseBody
+    @RequestMapping(value = "needverify", method = RequestMethod.POST)
+    public List<Integer> needVerify(HttpServletRequest request) {
+    	Integer examId = getSessionExamId(request);
+		WebUser wu = RequestUtils.getWebUser(request);
+		ScoreVerify sv=scoreVerifyService.findByExamIdAndUserId(examId,wu.getId());
+		List<Integer> ret=new ArrayList<>();
+		if(sv==null) {
+    		return ret;
+    	}
+		List<ScoreVerifyVo> list = scoreVerifyService.needVerify(sv.getId());
+		if(list==null||list.size()==0) {
+			return ret;
+		}
+		ret=list.stream().map(e->e.getStudentId()).collect(Collectors.toList());
+		return ret;
+    }
+    
+    @RequestMapping("info")
+    @ResponseBody
+    public Task info(HttpServletRequest request, @RequestParam Integer studentId) {
+        ExamStudent student = studentService.findById(studentId);
+        Task task = null;
+        if (student != null) {
+            task = taskService.build(student);
+        }
+        return task;
+    }
+    
+    @RequestMapping("tag")
+    @ResponseBody
+    public Object tag(HttpServletRequest request, @RequestParam Integer studentId, @RequestParam boolean isTag) {
+        ExamStudent student = studentService.findById(studentId);
+        JSONObject obj = new JSONObject();
+        if (student != null) {
+            int examId = getSessionExamId(request);
+            WebUser wu = RequestUtils.getWebUser(request);
+            ScoreVerify sv=scoreVerifyService.findByExamIdAndUserId(examId,wu.getId());
+            scoreVerifyDetailService.tag(wu.getId(),sv.getId(),studentId,isTag);
+            obj.accumulate("success", true);
+        } else {
+            obj.accumulate("success", false);
+            obj.accumulate("message", "无法标记,请刷新页面");
+        }
+        return obj;
+    }
 }

+ 36 - 52
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreVerifyPage.jsp

@@ -24,8 +24,12 @@
 			value="${query.pageNumber }" /> <input type="hidden" id="pageSize"
 			name="pageSize" value="${query.pageSize }" />
 		<div>
-			<input id="btnQuery" class="btn" type="button" value="重置"
-				onclick="query()" />
+			<input id="btnResetData" class="btn" type="button" value="重置"
+				onclick="resetData()" />
+			<input id="btnStart" class="btn" type="button" value="批量校验:${needVerifyCount}"
+				onclick="goStart(${needVerifyCount})" />
+			<input id="btnExportData" class="btn" type="button" value="导出标记卷"
+			onclick="exportData()" />
 		</div>
 	</form>
 	<tags:message content="${message}" />
@@ -54,24 +58,24 @@
 						<td>${result.studentCode}</td>
 						<td>${result.subjectCode}-${result.subjectName}</td>
 						<td>
-                <c:if test="${student.upload==true}">
+                <c:if test="${result.upload==true}">
                     <c:if test="${examType!='MULTI_MEDIA'}">
-                        <a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
-                           data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
+                        <a class="sheet-link" href="##" data-sheet-url="${result.sheetUrlString}" 
+                           data-title="${result.examNumber}&nbsp;&nbsp;${result.studentName}&nbsp;&nbsp;客观总分${result.objectiveScoreString}&nbsp;&nbsp;主观总分${result.subjectiveScoreString}&nbsp;&nbsp;全卷总分${result.totalScoreString}">已上传</a>
                     </c:if>
                     <c:if test="${examType=='MULTI_MEDIA'}">
                         已上传
                     </c:if>
                     &nbsp;
-                    <c:if test="${student.absent==true}">
+                    <c:if test="${result.absent==true}">
                         缺考
                     </c:if>
-                    <c:if test="${student.absent==false}">
+                    <c:if test="${result.absent==false}">
                         正常
                     </c:if>
                 </c:if>
                 
-                <c:if test="${student.upload==false}">
+                <c:if test="${result.upload==false}">
                     未上传
                 </c:if>
             
@@ -83,7 +87,7 @@
 							href="${ctx}/web/admin/exam/track/student?studentId=${result.studentId}&subjectCode=${result.subjectCode}"
 							target="_blank">轨迹图</a>
 								<a target="_blank"
-									href="${ctx}/web/admin/exam/inspected/start?studentId=${result.studentId}&subjectCode=${result.subjectCode}">进入校验</a>
+									href="${ctx}/web/admin/exam/score/verify/start?studentId=${result.studentId}">进入校验</a>
 							</td>
 							<td>${result.scoreVerifyUserName}</td>
 							<td>
@@ -100,61 +104,41 @@
 		</table>
 	</form>
 	<div class="pagination">${query}</div>
+	<%@include file="/WEB-INF/views/include/sheetView.jsp" %>
 	<script type="text/javascript">
-
+	$(document).ready(function () {
+        $('.sheet-link').click(function () {
+            initSheetPopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+            return false;
+        });
+    });
 		function page(n, s) {
 			$("#pageNumber").val(n);
 			$("#pageSize").val(s);
 			$("#searchForm").attr('target', "_self");
-			$("#searchForm").attr('action', '${ctx}//admin/exam/score/verify/page');
+			$("#searchForm").attr('action', '${ctx}/admin/exam/score/verify/page');
 			$("#searchForm").submit();
 			return false;
 		}
-
-		function goStart() {
-			var url = '${ctx}/web/admin/exam/inspected/start?';
-			var subjectCode = $("#subject-select").val();
-			if (subjectCode == undefined || subjectCode == "") {
-				alert('请选择科目');
-				return;
-			}
-			url = url + 'subjectCode=' + subjectCode
-			var startScore = $("#startScore").val();
-			if (startScore != undefined && startScore != "") {
-				url = url + '&startScore=' + startScore;
-			}
-			var endScore = $("#endScore").val();
-			if (endScore != undefined && endScore != "") {
-				url = url + '&endScore=' + endScore;
-			}
-			var mainNumber = $("#question-select").val();
-			if (mainNumber != undefined && mainNumber != "") {
-				url = url + '&mainNumber=' + mainNumber;
-			}
-			var mainStartScore = $("#mainStartScore").val();
-			if (mainStartScore != undefined && mainStartScore != "") {
-				url = url + '&mainStartScore=' + mainStartScore;
-			}
-			var mainEndScore = $("#mainEndScore").val();
-			if (mainEndScore != undefined && mainEndScore != "") {
-				url = url + '&mainEndScore=' + mainEndScore;
-			}
-			var questionScore = $("#questionScore").val();
-			if (questionScore != undefined && questionScore != "") {
-				url = url + '&questionScore=' + questionScore;
-			}
-			var selectiveStatus = $("#selectiveStatus").val();
-			if (selectiveStatus != undefined && selectiveStatus != "") {
-				url = url + '&selectiveStatus=' + selectiveStatus;
-			}
-			var secretNumber = $("#secretNumber").val();
-			if (secretNumber != undefined && secretNumber != "") {
-				url = url + '&secretNumber=' + secretNumber;
+		function resetData() {
+			$("#searchForm").attr('target', "_self");
+			$("#searchForm").attr('action', '${ctx}/admin/exam/score/verify/reset');
+			$("#searchForm").submit();
+			return false;
+		}
+		function exportData() {
+			$("#searchForm").attr("action", "${ctx}/admin/exam/score/verify/export");
+	        $("#searchForm").submit();
+		}
+		function goStart(count) {
+			if (count==0) {
+				alert("没有数据需要校验");
+				return false;
 			}
+			var url = '${ctx}/web/admin/exam/score/verify/start';
 			window.open(url, '_blank');
 			return false;
 		}
-
 	</script>
 </body>
 </html>

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

@@ -64,9 +64,9 @@
 					alert("请填写匹配分值");
 					return false;
 				}
-				var pattern = /^[1-9]\d*$/; // 正则表达式
+				var pattern = /^0|([1-9]\d*)$/; // 正则表达式
 				if (!pattern.test($("#compareScore").val())) {
-					alert("分值请输入整数");
+					alert("分值请输入大于等于0的整数");
 					return false;
 				}
 			}

+ 2 - 2
stmms-web/src/main/webapp/sql/stmms_ft.sql

@@ -1139,8 +1139,8 @@ CREATE TABLE `eb_score_verify_detail`
 	`id`           int(11)     NOT NULL AUTO_INCREMENT COMMENT '主键',
     `score_verify_id`			int(11)     NOT NULL COMMENT '成绩校验查询条件ID',
     `student_id`			int(11)     NOT NULL COMMENT '考生ID',
-  	`flagged`		tinyint(1)  NOT NULL COMMENT '是否被标记',
-  	`create_time`  		datetime     NOT NULL COMMENT '校验时间',
+  	`flagged`		tinyint(1)  DEFAULT NULL COMMENT '是否被标记',
+  	`verify_time`  		datetime     DEFAULT NULL COMMENT '校验时间',
   PRIMARY KEY (`id`),
   UNIQUE KEY `index1` (`score_verify_id`,`student_id`)
 )  ENGINE = InnoDB

+ 2 - 2
stmms-web/src/main/webapp/sql/upgrade/1.3.14.sql

@@ -21,8 +21,8 @@ CREATE TABLE `eb_score_verify_detail`
 	`id`           int(11)     NOT NULL AUTO_INCREMENT COMMENT '主键',
     `score_verify_id`			int(11)     NOT NULL COMMENT '成绩校验查询条件ID',
     `student_id`			int(11)     NOT NULL COMMENT '考生ID',
-  	`flagged`		tinyint(1)  NOT NULL COMMENT '是否被标记',
-  	`create_time`  		datetime     NOT NULL COMMENT '校验时间',
+  	`flagged`		tinyint(1)  DEFAULT NULL COMMENT '是否被标记',
+  	`verify_time`  		datetime     DEFAULT NULL COMMENT '校验时间',
   PRIMARY KEY (`id`),
   UNIQUE KEY `index1` (`score_verify_id`,`student_id`)
 )  ENGINE = InnoDB