Browse Source

全卷复核

xiatian 14 giờ trước cách đây
mục cha
commit
ba7c5617fb

+ 99 - 89
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/ExamStudentVo.java

@@ -21,6 +21,7 @@ import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.annotation.ExcelField;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
+import io.swagger.annotations.ApiModelProperty;
 
 public class ExamStudentVo {
 
@@ -28,7 +29,6 @@ public class ExamStudentVo {
 
     public static final String SPLIT = ";";
 
-
     private Integer id;
 
     /**
@@ -46,16 +46,18 @@ public class ExamStudentVo {
      */
     private String campusName;
 
+    @ApiModelProperty("")
+    @ExcelField(title = "科目*", align = 2, sort = 10)
+    private String subjectText;
+
     /**
      * 科目代码
      */
-    @ExcelField(title = "科目代码*", align = 2, sort = 1)
     private String subjectCode;
 
     /**
      * 科目名称
      */
-    @ExcelField(title = "科目名称*", align = 2, sort = 2)
     private String subjectName;
 
     /**
@@ -76,9 +78,14 @@ public class ExamStudentVo {
     /**
      * 密号
      */
-    @ExcelField(title = "密号*", align = 2, sort = 3)
+    @ApiModelProperty("密号")
+    @ExcelField(title = "密号", align = 2, sort = 20)
     private String secretNumber;
 
+    @ApiModelProperty("选做异常")
+    @ExcelField(title = "选做异常", align = 2, sort = 30)
+    private String selectiveError;
+
     /**
      * 姓名
      */
@@ -172,20 +179,24 @@ public class ExamStudentVo {
      * 主观总分
      */
     private Double subjectiveScore;
-    
-    
-    @ExcelField(title = "客观分*", align = 2, sort = 4)
+
+    @ApiModelProperty("客观分")
+    @ExcelField(title = "客观分", align = 2, sort = 40)
     private String objectiveScoreString;
-    
-    @ExcelField(title = "主观分*", align = 2, sort = 5)
+
+    @ApiModelProperty("主观分")
+    @ExcelField(title = "主观分", align = 2, sort = 50)
     private String subjectiveScoreString;
-    @ExcelField(title = "试卷总分*", align = 2, sort = 6)
+
+    @ApiModelProperty("试卷总分")
+    @ExcelField(title = "试卷总分", align = 2, sort = 60)
     private String totalScoreString;
 
     /**
      * 主观题得分明细
      */
-    @ExcelField(title = "得分明细*", align = 2, sort =7)
+    @ApiModelProperty("得分明细")
+    @ExcelField(title = "得分明细", align = 2, sort = 70)
     private String subjectiveScoreList;
 
     /**
@@ -224,28 +235,27 @@ public class ExamStudentVo {
     private Integer cardNumber;
 
     private Integer inspectCount;
-    
+
     /**
      * 当前轮次是否已复核
      */
     private boolean inspected;
-    
+
     /**
      * 成绩校验人ID
      */
     private Integer scoreVerifyUser;
-    
+
     /**
      * 成绩校验时间
      */
     @Temporal(TemporalType.TIMESTAMP)
     private Date scoreVerifyTime;
-    
+
     /**
      * 成绩校验标记结果
      */
     private Boolean scoreVerifyFlagged;
-    
 
     /**
      * 科目备注信息
@@ -280,11 +290,9 @@ public class ExamStudentVo {
 
     private String problemRestTime;
 
-    private Map<String,InspectHistory> inspectHistoryMap;
-    
+    private Map<String, InspectHistory> inspectHistoryMap;
+
     private Boolean selective;
-    
-    private String selectiveError;
 
     public Integer getId() {
         return id;
@@ -391,7 +399,7 @@ public class ExamStudentVo {
 
     public void setObjectiveScore(Double objectiveScore) {
         this.objectiveScore = objectiveScore;
-        
+
     }
 
     public Double getSubjectiveScore() {
@@ -647,7 +655,6 @@ public class ExamStudentVo {
         this.libraryId = libraryId;
     }
 
-
     public boolean isBreach() {
         return breach;
     }
@@ -744,7 +751,6 @@ public class ExamStudentVo {
         this.objectiveQuestionList = objectiveQuestionList;
     }
 
-
     public SubjectiveStatus getSubjectiveStatus() {
         return subjectiveStatus;
     }
@@ -752,17 +758,15 @@ public class ExamStudentVo {
     public void setSubjectiveStatus(String subjectiveStatusStr) {
         this.subjectiveStatus = SubjectiveStatus.valueOf(subjectiveStatusStr);
     }
-    
+
     public void copySubjectiveStatus(SubjectiveStatus sta) {
         this.subjectiveStatus = sta;
     }
-    
 
     public String getSecretNumber() {
         return secretNumber;
     }
 
-
     public Date getInspectTime() {
         return inspectTime;
     }
@@ -791,7 +795,6 @@ public class ExamStudentVo {
         this.inspectorId = inspectorId;
     }
 
-
     public String getProblemUserName() {
         return problemUserName;
     }
@@ -816,16 +819,15 @@ public class ExamStudentVo {
         this.cardNumber = cardNumber;
     }
 
-
     public Map<String, InspectHistory> getInspectHistoryMap() {
-		return inspectHistoryMap;
-	}
+        return inspectHistoryMap;
+    }
 
-	public void setInspectHistoryMap(Map<String, InspectHistory> inspectHistoryMap) {
-		this.inspectHistoryMap = inspectHistoryMap;
-	}
+    public void setInspectHistoryMap(Map<String, InspectHistory> inspectHistoryMap) {
+        this.inspectHistoryMap = inspectHistoryMap;
+    }
 
-	public Integer getInspectCount() {
+    public Integer getInspectCount() {
         return inspectCount;
     }
 
@@ -833,59 +835,67 @@ public class ExamStudentVo {
         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;
-	}
-
-	public boolean getInspected() {
-		return inspected;
-	}
-
-	public void setInspected(boolean inspected) {
-		this.inspected = inspected;
-	}
-	
-	public static ExamStudentVo of(ExamStudent e) {
-		ExamStudentVo vo=new ExamStudentVo();
-		BeanUtils.copyProperties(e, vo);
-		vo.copySubjectiveStatus(e.getSubjectiveStatus());
-		return vo;
-	}
-
-	public Boolean getSelective() {
-		return selective;
-	}
-
-	public void setSelective(Boolean selective) {
-		this.selective = selective;
-	}
-
-	public String getSelectiveError() {
-		return selectiveError;
-	}
-
-	public void setSelectiveError(String selectiveError) {
-		this.selectiveError = selectiveError;
-	}
-	
+    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;
+    }
+
+    public boolean getInspected() {
+        return inspected;
+    }
+
+    public void setInspected(boolean inspected) {
+        this.inspected = inspected;
+    }
+
+    public static ExamStudentVo of(ExamStudent e) {
+        ExamStudentVo vo = new ExamStudentVo();
+        BeanUtils.copyProperties(e, vo);
+        vo.copySubjectiveStatus(e.getSubjectiveStatus());
+        return vo;
+    }
+
+    public Boolean getSelective() {
+        return selective;
+    }
+
+    public void setSelective(Boolean selective) {
+        this.selective = selective;
+    }
+
+    public String getSelectiveError() {
+        return selectiveError;
+    }
+
+    public void setSelectiveError(String selectiveError) {
+        this.selectiveError = selectiveError;
+    }
+
+    public String getSubjectText() {
+        return subjectText;
+    }
+
+    public void setSubjectText(String subjectText) {
+        this.subjectText = subjectText;
+    }
+
 }

+ 51 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/InspectedSubjectChatVo.java

@@ -0,0 +1,51 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class InspectedSubjectChatVo {
+
+    @ApiModelProperty("任务待完成")
+    private Long unMarkedCount;
+
+    @ApiModelProperty("任务已完成")
+    private Long markedCount;
+
+    @ApiModelProperty("科目待完成")
+    private Long unFinishCount;
+
+    @ApiModelProperty("科目已完成")
+    private Long finishCount;
+
+    public Long getUnMarkedCount() {
+        return unMarkedCount;
+    }
+
+    public void setUnMarkedCount(Long unMarkedCount) {
+        this.unMarkedCount = unMarkedCount;
+    }
+
+    public Long getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(Long markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public Long getUnFinishCount() {
+        return unFinishCount;
+    }
+
+    public void setUnFinishCount(Long unFinishCount) {
+        this.unFinishCount = unFinishCount;
+    }
+
+    public Long getFinishCount() {
+        return finishCount;
+    }
+
+    public void setFinishCount(Long finishCount) {
+        this.finishCount = finishCount;
+    }
+
+}

+ 29 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/InspectedSubjectStatusVo.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class InspectedSubjectStatusVo {
+
+    @ApiModelProperty("是否显示再次复核按钮")
+    private Boolean showNextInspect;
+
+    @ApiModelProperty("是否显示再次复核提示")
+    private Boolean showNextInspectMsg;
+
+    public Boolean getShowNextInspect() {
+        return showNextInspect;
+    }
+
+    public void setShowNextInspect(Boolean showNextInspect) {
+        this.showNextInspect = showNextInspect;
+    }
+
+    public Boolean getShowNextInspectMsg() {
+        return showNextInspectMsg;
+    }
+
+    public void setShowNextInspectMsg(Boolean showNextInspectMsg) {
+        this.showNextInspectMsg = showNextInspectMsg;
+    }
+
+}

+ 29 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/NextRoundCheckVo.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class NextRoundCheckVo {
+
+    @ApiModelProperty("是否可以再次复核状态值,-1-不可以再次复核,并弹出消息,0-需要弹出消息以待确认,1-可以再次复核")
+    private Integer status;
+
+    @ApiModelProperty("消息")
+    private String message;
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+}

+ 173 - 58
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/InspectQuery.java

@@ -10,120 +10,191 @@ import org.springframework.data.domain.Sort.Direction;
 
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.bean.ExamStudentVo;
+import cn.com.qmth.stmms.common.enums.SelectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import io.swagger.annotations.ApiModelProperty;
 
 public class InspectQuery extends BaseQuery<ExamStudentVo> {
 
+    @ApiModelProperty(hidden = true)
+    private Integer studentId;
+
+    @ApiModelProperty(hidden = true)
     private Integer examId;
 
+    @ApiModelProperty(hidden = true)
     private Integer schoolId;
 
+    @ApiModelProperty(hidden = true)
     private String campusName;
 
+    @ApiModelProperty(hidden = true)
     private String name;
 
+    @ApiModelProperty(hidden = true)
     private String examNumberIn;
 
+    @ApiModelProperty(hidden = true)
     private String examNumber;
 
+    @ApiModelProperty("密号")
     private String secretNumber;
 
+    @ApiModelProperty(hidden = true)
     private String studentCode;
 
+    @ApiModelProperty("科目代码")
     private String subjectCode;
 
+    @ApiModelProperty(hidden = true)
     private String batchCode;
 
+    @ApiModelProperty(hidden = true)
     private String packageCode;
 
+    @ApiModelProperty(hidden = true)
     private String subjectLevel;
 
+    @ApiModelProperty(hidden = true)
     private String subjectCategory;
 
+    @ApiModelProperty(hidden = true)
     private String examSite;
 
+    @ApiModelProperty(hidden = true)
     private String examRoom;
 
+    @ApiModelProperty(hidden = true)
     private Double objectiveScore;
 
+    @ApiModelProperty(hidden = true)
     private Double objectiveScoreGt;
 
+    @ApiModelProperty(hidden = true)
     private Double objectiveScoreLt;
 
+    @ApiModelProperty(hidden = true)
     private Set<SubjectiveStatus> statusSet;
 
+    @ApiModelProperty(hidden = true)
     private Double subjectiveScore;
 
+    @ApiModelProperty(hidden = true)
     private Double subjectiveScoreGt;
 
+    @ApiModelProperty(hidden = true)
     private Double subjectiveScoreLt;
 
+    @ApiModelProperty(hidden = true)
     private Boolean upload;
 
+    @ApiModelProperty(hidden = true)
     private Boolean absent;
 
+    @ApiModelProperty(hidden = true)
     private Boolean manualAbsent;
 
+    @ApiModelProperty(hidden = true)
     private Boolean exception;
 
+    @ApiModelProperty(hidden = true)
     private Boolean uploadTimeNotNull;
 
+    @ApiModelProperty(hidden = true)
     private Date minUploadTime;
 
+    @ApiModelProperty(hidden = true)
     private Date maxUploadTime;
 
+    @ApiModelProperty(hidden = true)
     private String campusNameIn;
 
+    @ApiModelProperty(hidden = true)
     private String subjectCodeIn;
 
+    @ApiModelProperty(hidden = true)
     private String examSiteIn;
 
+    @ApiModelProperty(hidden = true)
     private String campusNameNotIn;
 
+    @ApiModelProperty(hidden = true)
     private String subjectCodeNotIn;
 
+    @ApiModelProperty(hidden = true)
     private String examSiteNotIn;
 
+    @ApiModelProperty(hidden = true)
     private String ids;
 
+    @ApiModelProperty("试卷总分起始")
     private Double startScore;
 
+    @ApiModelProperty("试卷总分截止")
     private Double endScore;
 
+    @ApiModelProperty(hidden = true)
     private Boolean breach;
 
+    @ApiModelProperty("学院")
     private String college;
 
+    @ApiModelProperty(hidden = true)
     private String className;
 
+    @ApiModelProperty(hidden = true)
     private String teacher;
 
+    @ApiModelProperty(hidden = true)
     private String paperType;
 
+    @ApiModelProperty(hidden = true)
     private List<Integer> studentIds;
 
+    @ApiModelProperty(hidden = true)
     private Integer inspectorId;
-    
+
+    @ApiModelProperty("复核人")
     private String inspectorName;
 
+    @ApiModelProperty(hidden = true)
     private Integer sheetCount;
-    
-    //是否已复核
+
+    // 是否已复核
+    @ApiModelProperty("是否已复核")
     private Boolean inspected;
-    
+
+    @ApiModelProperty("小题得分")
     private Double questionScore;
-    
+
+    @ApiModelProperty("小题得分是否选的空")
     private Boolean questionScoreEmpty;
-    
-    //不可重复
+
+    // 不可重复
+    @ApiModelProperty(hidden = true)
     private Boolean inspectUnrepeated;
-    
+
+    @ApiModelProperty(hidden = true)
     private boolean export;
-    
+
+    @ApiModelProperty("是否选做科目")
     private Boolean selective;
-    
+
+    @ApiModelProperty("复核次数")
     private Integer inspectRound;
 
+    @ApiModelProperty("选做题状态")
+    private SelectiveStatus selectiveStatus;
+
+    @ApiModelProperty("大题号")
+    private Integer mainNumber;
+
+    @ApiModelProperty("大题分截止")
+    private Double mainStartScore;
+
+    @ApiModelProperty("大题分截止")
+    private Double mainEndScore;
+
     public InspectQuery() {
         super();
         this.statusSet = new HashSet<>();
@@ -513,68 +584,112 @@ public class InspectQuery extends BaseQuery<ExamStudentVo> {
         this.sheetCount = sheetCount;
     }
 
-	public Boolean getInspected() {
-		return inspected;
-	}
+    public Boolean getInspected() {
+        return inspected;
+    }
 
-	public void setInspected(Boolean inspected) {
-		this.inspected = inspected;
-	}
+    public void setInspected(Boolean inspected) {
+        this.inspected = inspected;
+    }
 
-	public String getInspectorName() {
-		return inspectorName;
-	}
+    public String getInspectorName() {
+        return inspectorName;
+    }
 
-	public void setInspectorName(String inspectorName) {
-		this.inspectorName = inspectorName;
-	}
+    public void setInspectorName(String inspectorName) {
+        this.inspectorName = inspectorName;
+    }
 
-	public Double getQuestionScore() {
-		return questionScore;
-	}
+    public Double getQuestionScore() {
+        return questionScore;
+    }
 
-	public void setQuestionScore(Double questionScore) {
-		this.questionScore = questionScore;
-	}
+    public void setQuestionScore(Double questionScore) {
+        this.questionScore = questionScore;
+    }
 
-	public Boolean getQuestionScoreEmpty() {
-		return questionScoreEmpty;
-	}
+    public Boolean getQuestionScoreEmpty() {
+        return questionScoreEmpty;
+    }
 
-	public void setQuestionScoreEmpty(Boolean questionScoreEmpty) {
-		this.questionScoreEmpty = questionScoreEmpty;
-	}
+    public void setQuestionScoreEmpty(Boolean questionScoreEmpty) {
+        this.questionScoreEmpty = questionScoreEmpty;
+    }
 
-	public Boolean getInspectUnrepeated() {
-		return inspectUnrepeated;
-	}
+    public Boolean getInspectUnrepeated() {
+        return inspectUnrepeated;
+    }
 
-	public void setInspectUnrepeated(Boolean inspectUnrepeated) {
-		this.inspectUnrepeated = inspectUnrepeated;
-	}
+    public void setInspectUnrepeated(Boolean inspectUnrepeated) {
+        this.inspectUnrepeated = inspectUnrepeated;
+    }
 
-	public boolean isExport() {
-		return export;
-	}
+    public boolean isExport() {
+        return export;
+    }
 
-	public void setExport(boolean export) {
-		this.export = export;
-	}
+    public void setExport(boolean export) {
+        this.export = export;
+    }
 
-	public Boolean getSelective() {
-		return selective;
-	}
+    public Boolean getSelective() {
+        return selective;
+    }
 
-	public void setSelective(Boolean selective) {
-		this.selective = selective;
-	}
+    public void setSelective(Boolean selective) {
+        this.selective = selective;
+    }
+
+    public Integer getInspectRound() {
+        return inspectRound;
+    }
 
-	public Integer getInspectRound() {
-		return inspectRound;
-	}
+    public void setInspectRound(Integer inspectRound) {
+        this.inspectRound = inspectRound;
+    }
 
-	public void setInspectRound(Integer inspectRound) {
-		this.inspectRound = inspectRound;
-	}
+    public SelectiveStatus getSelectiveStatus() {
+        return selectiveStatus;
+    }
+
+    public void setSelectiveStatus(SelectiveStatus selectiveStatus) {
+        this.selectiveStatus = selectiveStatus;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Double getMainStartScore() {
+        return mainStartScore;
+    }
+
+    public void setMainStartScore(Double mainStartScore) {
+        this.mainStartScore = mainStartScore;
+    }
+
+    public Double getMainEndScore() {
+        return mainEndScore;
+    }
+
+    public void setMainEndScore(Double mainEndScore) {
+        this.mainEndScore = mainEndScore;
+    }
+
+    public void setStatusSet(Set<SubjectiveStatus> statusSet) {
+        this.statusSet = statusSet;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
 
 }

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

@@ -5,53 +5,48 @@ import java.util.List;
 import cn.com.qmth.stmms.biz.exam.bean.ExamStudentVo;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.query.InspectQuery;
-import cn.com.qmth.stmms.common.enums.SelectiveStatus;
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 
 public interface InspectedService {
 
-	List<ExamStudentVo> findByQuery(InspectQuery query, SubjectiveStatus status, Integer mainNumber,
-			Double mainStartScore, Double mainEndScore, SelectiveStatus selectiveStatus);
+    List<ExamStudentVo> findByQuery(InspectQuery query);
 
-	Integer countByQuery(InspectQuery query, SubjectiveStatus status, Integer mainNumber,
-			Double mainStartScore, Double mainEndScore, SelectiveStatus selectiveStatus);
+    Integer countByQuery(InspectQuery query);
 
-	void releaseByUserId(Integer examId, String subjectCode, Integer userId);
+    void releaseByUserId(Integer examId, String subjectCode, Integer userId);
 
-	void releaseByStudent(ExamStudent student);
+    void releaseByStudent(ExamStudent student);
 
-	/**
-	 * 申请领取某个任务
-	 */
-	boolean applyStudent(ExamStudentVo student, Integer userId);
+    /**
+     * 申请领取某个任务
+     */
+    boolean applyStudent(ExamStudentVo student, Integer userId);
 
-	/**
-	 * 是否已领取了某个任务
-	 */
-	boolean hasApplied(ExamStudent student, Integer userId);
+    /**
+     * 是否已领取了某个任务
+     */
+    boolean hasApplied(ExamStudent student, Integer userId);
 
-	/**
-	 * 复核
-	 */
-	boolean inspect(ExamStudent student, Integer userId);
+    /**
+     * 复核
+     */
+    boolean inspect(ExamStudent student, Integer userId);
 
-	/**
-	 * 取消复核
-	 *
-	 * @param studentId
-	 * @return
-	 */
-	boolean cancelByStudent(Integer studentId);
+    /**
+     * 取消复核
+     *
+     * @param studentId
+     * @return
+     */
+    boolean cancelByStudent(Integer studentId);
 
-	Integer needInspectCount(InspectQuery query, Integer mainNumber, Double mainStartScore,
-			Double mainEndScore, SelectiveStatus selectiveStatus);
+    Integer needInspectCount(InspectQuery query);
 
-	void fillInspectHistoryMap(List<ExamStudentVo> list, int maxInspectRound);
+    void fillInspectHistoryMap(List<ExamStudentVo> list, int maxInspectRound);
 
-	boolean inspectFinish(Integer examId, String subjectCode, Integer inspectRound);
+    boolean inspectFinish(Integer examId, String subjectCode, Integer inspectRound);
 
-	void clearByStudent(Integer studentId);
-	
-	void cancelBySubject(Integer examId, String subjectCode);
+    void clearByStudent(Integer studentId);
+
+    void cancelBySubject(Integer examId, String subjectCode);
 
 }

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

@@ -51,25 +51,33 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
 
     @SuppressWarnings("unchecked")
     @Override
-    public List<ExamStudentVo> findByQuery(InspectQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, SelectiveStatus selectiveStatus) {
+    public List<ExamStudentVo> findByQuery(InspectQuery query) {
         int offset = (query.getPageNumber() - 1) * query.getPageSize();
         StringBuilder sql = new StringBuilder();
         sql.append(" select s.id,s.exam_id examId,s.school_id schoolId,s.subject_code subjectCode,");
-        sql.append(" s.subject_name subjectName,s.paper_type paperType,s.exam_number examNumber,s.secret_number secretNumber,");
-        sql.append(" s.student_code studentCode,s.name,s.package_code packageCode,s.campus_name campusName,s.exam_site examSite,");
-        sql.append(" s.exam_room examRoom,s.remark,s.batch_code batchCode,s.sheet_count sheetCount,s.slice_count sliceCount,s.answers,");
-        sql.append(" s.is_upload upload,s.is_absent absent,s.is_manual_absent manualAbsent,s.is_breach breach,s.is_exception exception,");
-        sql.append(" s.upload_time uploadTime,s.objective_score objectiveScore,s.objective_score_list objectiveScoreList,");
-        sql.append(" s.subjective_status subjectiveStatus,s.subjective_score subjectiveScore,s.subjective_score_list subjectiveScoreList,");
-        sql.append(" s.subject_level subjectLevel,s.subject_category subjectCategory,s.college,s.class_name className,s.teacher,");
+        sql.append(
+                " s.subject_name subjectName,s.paper_type paperType,s.exam_number examNumber,s.secret_number secretNumber,");
+        sql.append(
+                " s.student_code studentCode,s.name,s.package_code packageCode,s.campus_name campusName,s.exam_site examSite,");
+        sql.append(
+                " s.exam_room examRoom,s.remark,s.batch_code batchCode,s.sheet_count sheetCount,s.slice_count sliceCount,s.answers,");
+        sql.append(
+                " s.is_upload upload,s.is_absent absent,s.is_manual_absent manualAbsent,s.is_breach breach,s.is_exception exception,");
+        sql.append(
+                " s.upload_time uploadTime,s.objective_score objectiveScore,s.objective_score_list objectiveScoreList,");
+        sql.append(
+                " s.subjective_status subjectiveStatus,s.subjective_score subjectiveScore,s.subjective_score_list subjectiveScoreList,");
+        sql.append(
+                " s.subject_level subjectLevel,s.subject_category subjectCategory,s.college,s.class_name className,s.teacher,");
         sql.append(" s.card_number cardNumber,s.inspect_count inspectCount,s.score_verify_user scoreVerifyUser,");
-        sql.append(" s.score_verify_time scoreVerifyTime,s.score_verify_flagged scoreVerifyFlagged,s.inspect_time inspectTime,");
+        sql.append(
+                " s.score_verify_time scoreVerifyTime,s.score_verify_flagged scoreVerifyFlagged,s.inspect_time inspectTime,");
         sql.append(" s.inspector_id inspectorId,s.inspected, ");
         sql.append(" (case when ss.not_selective=1 or ss.less_selective=1 then '是' else '否' end) selectiveError ");
-        sql.append(" from eb_exam_student s left join eb_exam_subject es on s.exam_id=es.exam_id and s.subject_code=es.code ");
+        sql.append(
+                " from eb_exam_student s left join eb_exam_subject es on s.exam_id=es.exam_id and s.subject_code=es.code ");
         sql.append(" left join eb_selective_student ss on ss.student_id = s.id ");
-        String whereSql = getWhereSql(query, status, mainNumber, mainStartScore, mainEndScore, selectiveStatus);
+        String whereSql = getWhereSql(query);
         sql.append(whereSql).append(" order by s.inspect_time desc,s.id asc");
         if (!query.isExport()) {
             sql.append(" limit " + offset + "," + query.getPageSize());
@@ -81,8 +89,11 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
 
     }
 
-    private String getWhereSql(InspectQuery query, SubjectiveStatus status, Integer mainNumber, Double mainStartScore,
-            Double mainEndScore, SelectiveStatus selectiveStatus) {
+    private String getWhereSql(InspectQuery query) {
+        Integer mainNumber = query.getMainNumber();
+        Double mainStartScore = query.getMainStartScore();
+        Double mainEndScore = query.getMainEndScore();
+        SelectiveStatus selectiveStatus = query.getSelectiveStatus();
         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 =" + query.getExamId());
@@ -97,18 +108,20 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
             whereSql.append(" and es.selective =" + (query.getSelective() ? 1 : 0));
         }
         if (StringUtils.isNotBlank(query.getInspectorName())) {
-            whereSql.append(" and exists (select 1 from eb_inspect_history ei left join b_user bu on ei.inspector_id=bu.id "
-                    + " where ei.student_id = s.id and (bu.login_name like '"
-                    + query.getInspectorName()
-                    + "%' or bu.name like '" + query.getInspectorName() + "%'))");
+            whereSql.append(
+                    " and exists (select 1 from eb_inspect_history ei left join b_user bu on ei.inspector_id=bu.id "
+                            + " where ei.student_id = s.id and (bu.login_name like '" + query.getInspectorName()
+                            + "%' or bu.name like '" + query.getInspectorName() + "%'))");
         }
-        if (query.getInspectRound()!=null) {
-            whereSql.append(" and exists (select 1 from eb_inspect_history ei where ei.student_id = s.id and ei.inspect_round="
-                    + query.getInspectRound() + ")");
+        if (query.getInspectRound() != null) {
+            whereSql.append(
+                    " and exists (select 1 from eb_inspect_history ei where ei.student_id = s.id and ei.inspect_round="
+                            + query.getInspectRound() + ")");
         }
         if (query.getInspectUnrepeated() != null && query.getInspectUnrepeated()) {
-            whereSql.append(" and not exists (select 1 from eb_inspect_history ei where ei.student_id = s.id and ei.inspector_id="
-                    + query.getInspectorId() + ")");
+            whereSql.append(
+                    " and not exists (select 1 from eb_inspect_history ei where ei.student_id = s.id and ei.inspector_id="
+                            + query.getInspectorId() + ")");
         }
         if (StringUtils.isNotBlank(query.getSubjectCodeIn())) {
             String[] subjectCodeIn = query.getSubjectCodeIn().split(",");
@@ -123,12 +136,14 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
             whereSql.append(" and s.inspected =" + (query.getInspected() ? 1 : 0));
         }
         if (query.getStartScore() != null) {
-            whereSql.append(" and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) >="
-                    + query.getStartScore());
+            whereSql.append(
+                    " 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))) <="
-                    + query.getEndScore());
+            whereSql.append(
+                    " 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 ='" + query.getSecretNumber() + "'");
@@ -153,7 +168,8 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
                         if (query.getQuestionScoreEmpty()) {
                             whereSql.append(" and e.score =0 and e.unanswered_count >0");
                         } else {
-                            whereSql.append(" and e.score =0 and (e.unanswered_count is null or e.unanswered_count =0)");
+                            whereSql.append(
+                                    " and e.score =0 and (e.unanswered_count is null or e.unanswered_count =0)");
                         }
                     } else {
                         whereSql.append(" and e.score =0");
@@ -178,14 +194,18 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
         // 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 ("
+        // " 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.UN_SELECTIVE.equals(selectiveStatus)) {
-//            whereSql.append(" and not exists (select 1 from eb_subjective_score e left join eb_mark_group mg "
-//                    + " on e.exam_id=mg.exam_id and e.subject_code=mg.subject_code and e.group_number=mg.number"
-//                    + " where e.student_id = s.id  and e.group_score != -1 and mg.is_selective=1)"
-//                    + " and es.selective=1");
+            // whereSql.append(" and not exists (select 1 from
+            // eb_subjective_score e left join eb_mark_group mg "
+            // + " on e.exam_id=mg.exam_id and e.subject_code=mg.subject_code
+            // and e.group_number=mg.number"
+            // + " where e.student_id = s.id and e.group_score != -1 and
+            // mg.is_selective=1)"
+            // + " and es.selective=1");
             whereSql.append(" and  ss.not_selective=1 ");
         }
         // 选做题多选做
@@ -208,12 +228,11 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     }
 
     @Override
-    public Integer countByQuery(InspectQuery query, SubjectiveStatus status, Integer mainNumber, Double mainStartScore,
-            Double mainEndScore, SelectiveStatus selectiveStatus) {
+    public Integer countByQuery(InspectQuery query) {
         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 ");
         countSql.append(" left join eb_selective_student ss on ss.student_id = s.id ");
-        String whereSql = getWhereSql(query, status, mainNumber, mainStartScore, mainEndScore, selectiveStatus);
+        String whereSql = getWhereSql(query);
         countSql.append(whereSql);
         Query countQuery = entityManager.createNativeQuery(countSql.toString());
         Object singleResult = countQuery.getResultList().get(0);
@@ -222,15 +241,13 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     }
 
     @Override
-    public Integer needInspectCount(InspectQuery query, Integer mainNumber, Double mainStartScore, Double mainEndScore,
-            SelectiveStatus selectiveStatus) {
+    public Integer needInspectCount(InspectQuery query) {
         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 ");
         countSql.append(" left join eb_selective_student ss on ss.student_id = s.id ");
-        String whereSql = getWhereSql(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore, mainEndScore,
-                selectiveStatus);
+        String whereSql = getWhereSql(query);
         countSql.append(whereSql);
         Query countQuery = entityManager.createNativeQuery(countSql.toString());
         Object singleResult = countQuery.getResultList().get(0);
@@ -365,15 +382,20 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
         sQuery.setInspected(false);
         sQuery.setSubjectCode(subjectCode);
         long needInspectCount = 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.inspected=1");
-//        // 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());
+        // 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.inspected=1");
+        // // 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 needInspectCount == 0;
     }
 

+ 169 - 182
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -99,6 +99,7 @@ public class InspectedController extends BaseExamController {
 
     @Autowired
     private CollationLabelService collationLabelService;
+
     @Autowired
     private OperationLogService logService;
 
@@ -110,11 +111,7 @@ public class InspectedController extends BaseExamController {
     private static final String DEFAULT_SECRET_NUMBER = "***";
 
     @RequestMapping(value = "/list")
-    public String list(Model model, HttpServletRequest request, InspectQuery query,
-            @RequestParam(required = false) SubjectiveStatus status,
-            @RequestParam(required = false) SelectiveStatus selectiveStatus,
-            @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
-            @RequestParam(required = false) Double mainEndScore) {
+    public String list(Model model, HttpServletRequest request, InspectQuery query) {
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
@@ -128,11 +125,11 @@ public class InspectedController extends BaseExamController {
             subjectList.forEach(e -> subjectCodeIn.add(e.getCode()));
             query.setSubjectCodeIn(StringUtils.join(subjectCodeIn, ","));
         }
-        if(wu.getRole() != Role.SCHOOL_ADMIN&&subjectList!=null&&subjectList.size()>0&&query.getSubjectCode()==null) {
-        	query.setSubjectCode(subjectList.get(0).getCode());
+        if (wu.getRole() != Role.SCHOOL_ADMIN && subjectList != null && subjectList.size() > 0
+                && query.getSubjectCode() == null) {
+            query.setSubjectCode(subjectList.get(0).getCode());
         }
-        List<ExamStudentVo> list = inspectedService.findByQuery(query, status, mainNumber, mainStartScore,
-                mainEndScore, selectiveStatus);
+        List<ExamStudentVo> list = inspectedService.findByQuery(query);
         for (ExamStudentVo e : list) {
             e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
             // e.setInspectHistoryList(inspectHistoryService.findByStudentIdLimit3(e.getId()));
@@ -143,10 +140,8 @@ public class InspectedController extends BaseExamController {
             maxInspectRound = subjectService.findMaxInspectRound(examId, subjectCodes);
             inspectedService.fillInspectHistoryMap(list, maxInspectRound);
         }
-        Integer totalCount = inspectedService.countByQuery(query, status, mainNumber, mainStartScore, mainEndScore,
-                selectiveStatus);
-        Integer inspectCount = inspectedService.needInspectCount(query, mainNumber, mainStartScore, mainEndScore,
-                selectiveStatus);
+        Integer totalCount = inspectedService.countByQuery(query);
+        Integer inspectCount = inspectedService.needInspectCount(query);
         query.setResult(list);
         query.setTotalCount(totalCount);
         model.addAttribute("query", query);
@@ -154,27 +149,26 @@ public class InspectedController extends BaseExamController {
         model.addAttribute("inspectCount", inspectCount);
         model.addAttribute("questionList",
                 questionService.findMainByExamAndSubjectAndObjective(examId, query.getSubjectCode(), false));
-        model.addAttribute("mainNumber", mainNumber);
-        model.addAttribute("mainStartScore", mainStartScore);
-        model.addAttribute("mainEndScore", mainEndScore);
+        model.addAttribute("mainNumber", query.getMainNumber());
+        model.addAttribute("mainStartScore", query.getMainStartScore());
+        model.addAttribute("mainEndScore", query.getMainEndScore());
         model.addAttribute("subjectList", subjectList);
         model.addAttribute("statusList", SubjectiveStatus.getOptionList());
         model.addAttribute("selectiveStatusList", SelectiveStatus.getOptionList());
-        model.addAttribute("status", status);
-        model.addAttribute("selectiveStatus", selectiveStatus);
+        model.addAttribute("selectiveStatus", query.getSelectiveStatus());
         model.addAttribute("exam", exam);
         model.addAttribute("examFinish", checkFinish(exam));
         model.addAttribute("collegeList", studentService.findDistinctCollege(examId));
         model.addAttribute("inspectRoundList", inspectHistoryService.findInspectRound(examId));
         if (StringUtils.isNotBlank(query.getSubjectCode())) {
-        	if(!exam.getInspectRoundLimit()) {
-        		model.addAttribute("showNextInspect", true);
-        	}else {
-	            ExamSubject es = subjectService.find(examId, query.getSubjectCode());
-	            if (inspectedService.inspectFinish(examId, query.getSubjectCode(), es.getInspectRound())) {
-	                model.addAttribute("showNextInspect", true);
-	            }
-        	}
+            if (!exam.getInspectRoundLimit()) {
+                model.addAttribute("showNextInspect", true);
+            } else {
+                ExamSubject es = subjectService.find(examId, query.getSubjectCode());
+                if (inspectedService.inspectFinish(examId, query.getSubjectCode(), es.getInspectRound())) {
+                    model.addAttribute("showNextInspect", true);
+                }
+            }
         }
         return "modules/exam/inspectedList";
     }
@@ -194,11 +188,8 @@ public class InspectedController extends BaseExamController {
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
     @ResponseBody
     public Task getTask(HttpServletRequest request, HttpServletResponse response, RedirectAttributes ra,
-            InspectQuery query,
-            @RequestParam(required = false, defaultValue = "false") SelectiveStatus selectiveStatus,
-            @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
-            @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore,
-            @RequestParam(required = false) Integer studentId) {
+            InspectQuery query) {
+        Integer studentId = query.getStudentId();
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
         Exam exam = examService.findById(examId);
@@ -226,37 +217,36 @@ public class InspectedController extends BaseExamController {
             if (inspectedService.applyStudent(ExamStudentVo.of(student), wu.getId())) {
                 task = taskService.build(student, wu.getUser());
             }
-        }else {
-	        int retry = 1;
-	        while (task == null) {
-	            List<ExamStudentVo> list = new ArrayList<>();
-	            // 需要判断评卷员是否绑定了班级
-	            query.setExamId(examId);
-	            query.setPageNumber(retry);
-	            query.setPageSize(20);
-	            List<ExamSubject> subjectList = getExamSubject(examId, wu);
-	            if (StringUtils.isBlank(query.getSubjectCode()) && !subjectList.isEmpty()) {
-	                query.setSubjectCode(subjectList.get(0).getCode());
-	            }
-	            query.setInspected(false);
-	            query.setInspectUnrepeated(exam.getInspectUnrepeated());
-	            query.setInspectorId(wu.getId());
-	            list = inspectedService.findByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
-	                    mainEndScore, selectiveStatus);
-	            if (list.isEmpty()) {
-	                break;
-	            }
-	            for (ExamStudentVo student : list) {
-	                if (inspectedService.applyStudent(student, wu.getId())) {
-	                    task = taskService.build(ExamStudent.of(student), wu.getUser());
-	                    break;
-	                }
-	            }
-	            if (task == null) {
-	                retry++;
-	            }
-	        }
-	    }
+        } else {
+            int retry = 1;
+            while (task == null) {
+                List<ExamStudentVo> list = new ArrayList<>();
+                // 需要判断评卷员是否绑定了班级
+                query.setExamId(examId);
+                query.setPageNumber(retry);
+                query.setPageSize(20);
+                List<ExamSubject> subjectList = getExamSubject(examId, wu);
+                if (StringUtils.isBlank(query.getSubjectCode()) && !subjectList.isEmpty()) {
+                    query.setSubjectCode(subjectList.get(0).getCode());
+                }
+                query.setInspected(false);
+                query.setInspectUnrepeated(exam.getInspectUnrepeated());
+                query.setInspectorId(wu.getId());
+                list = inspectedService.findByQuery(query);
+                if (list.isEmpty()) {
+                    break;
+                }
+                for (ExamStudentVo student : list) {
+                    if (inspectedService.applyStudent(student, wu.getId())) {
+                        task = taskService.build(ExamStudent.of(student), wu.getUser());
+                        break;
+                    }
+                }
+                if (task == null) {
+                    retry++;
+                }
+            }
+        }
         return task;
     }
 
@@ -267,8 +257,8 @@ public class InspectedController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         JSONObject obj = new JSONObject();
         ExamStudent student = studentService.findById(studentId);
-        if(student==null) {
-        	obj.accumulate("success", false);
+        if (student == null) {
+            obj.accumulate("success", false);
             obj.accumulate("message", "未找到考生信息");
             return obj;
         }
@@ -311,15 +301,15 @@ public class InspectedController extends BaseExamController {
         return obj;
     }
 
-//    @Logging(menu = "取消复核", type = LogType.UPDATE)
+    // @Logging(menu = "取消复核", type = LogType.UPDATE)
     @RequestMapping(value = "/cancel", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.INSPECTOR, Role.COLLEGE_ADMIN })
     public JSONObject cancel(HttpServletRequest request, @RequestParam Integer studentId) {
         JSONObject obj = new JSONObject();
         ExamStudent student = studentService.findById(studentId);
-        if(student==null) {
-        	obj.accumulate("success", false);
+        if (student == null) {
+            obj.accumulate("success", false);
             obj.accumulate("message", "未找到考生信息");
             return obj;
         }
@@ -329,7 +319,7 @@ public class InspectedController extends BaseExamController {
             try {
                 lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
                 lockService.waitlock(LockType.STUDENT, studentId);
-                if (student.getInspected()&&inspectedService.cancelByStudent(studentId)) {
+                if (student.getInspected() && inspectedService.cancelByStudent(studentId)) {
                     OperationLog log = new OperationLog();
                     log.setCreateTime(new Date());
                     log.setMenu("取消复核");
@@ -341,7 +331,8 @@ public class InspectedController extends BaseExamController {
                     int examId = SessionExamUtils.getExamId(request);
                     log.setExamId(examId > 0 ? examId : null);
                     log.setSchoolId(wu.getUser().getSchoolId());
-                    log.setDescription("科目代码:"+student.getSubjectCode()+" 准考证号:"+student.getExamNumber()+" 密号:"+student.getSecretNumber());
+                    log.setDescription("科目代码:" + student.getSubjectCode() + " 准考证号:" + student.getExamNumber() + " 密号:"
+                            + student.getSecretNumber());
                     logService.save(log);
                     obj.accumulate("success", true);
                 } else {
@@ -362,55 +353,57 @@ public class InspectedController extends BaseExamController {
         }
         return obj;
     }
-    
+
     @RequestMapping(value = "nextround/check", method = RequestMethod.POST)
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.INSPECTOR, Role.COLLEGE_ADMIN })
     @ResponseBody
-    public JSONObject nextroundCheck(RedirectAttributes ra, HttpServletRequest request, @RequestParam String subjectCode) {
-    	JSONObject obj = new JSONObject();
-    	//status -1 错误,0需确认,1通过
+    public JSONObject nextroundCheck(RedirectAttributes ra, HttpServletRequest request,
+            @RequestParam String subjectCode) {
+        JSONObject obj = new JSONObject();
+        // status -1 错误,0需确认,1通过
         int examId = getSessionExamId(request);
         lockService.waitlock(LockType.EXAM_SUBJECT, examId, subjectCode);
-		try {
-			Exam exam = examService.findById(examId);
-			ExamSubject es = subjectService.find(examId, subjectCode);
-			if(exam.getInspectRoundLimit()) {
-				if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
-	                obj.put("status", -1);
-	                obj.put("message", "该科目第" + es.getInspectRound() + "次复核还未完成");
-	                return obj;
-	            }else {
-	            	obj.put("status", 1);
-	                return obj;
-	            }
-			}else {
-				ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
-		        sQuery.setExamId(examId);
-		        sQuery.setUpload(true);
-		        sQuery.setAbsent(false);
-		        sQuery.setBreach(false);
-		        sQuery.setSubjectCode(subjectCode);
-		        sQuery.setInspected(true);
-		        long inspectedCount = studentService.countByQuery(sQuery);
-		        if(inspectedCount==0) {
-		        	obj.put("status", -1);
-		            obj.put("message", "本轮无复核记录,无法开启再次复核");
-		            return obj;
-		        }
-		        sQuery.setInspected(null);
-		        long totalCount = studentService.countByQuery(sQuery);
-		        if(inspectedCount==totalCount) {
-		        	obj.put("status", 1);
-		            return obj;
-		        }else {
-			        String percent = totalCount > 0 ? (new DecimalFormat("####.###")
-		                    .format(inspectedCount * 100.0 / totalCount) + "%") : "0%";
-			        String msg="本轮复核进度为"+percent+",还有"+(totalCount-inspectedCount)+"份未完成复核,是否进入下一轮复核?";
-			        obj.put("status", 0);
-		            obj.put("message", msg);
-		            return obj;
-		        }
-			}
+        try {
+            Exam exam = examService.findById(examId);
+            ExamSubject es = subjectService.find(examId, subjectCode);
+            if (exam.getInspectRoundLimit()) {
+                if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
+                    obj.put("status", -1);
+                    obj.put("message", "该科目第" + es.getInspectRound() + "次复核还未完成");
+                    return obj;
+                } else {
+                    obj.put("status", 1);
+                    return obj;
+                }
+            } else {
+                ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+                sQuery.setExamId(examId);
+                sQuery.setUpload(true);
+                sQuery.setAbsent(false);
+                sQuery.setBreach(false);
+                sQuery.setSubjectCode(subjectCode);
+                sQuery.setInspected(true);
+                long inspectedCount = studentService.countByQuery(sQuery);
+                if (inspectedCount == 0) {
+                    obj.put("status", -1);
+                    obj.put("message", "本轮无复核记录,无法开启再次复核");
+                    return obj;
+                }
+                sQuery.setInspected(null);
+                long totalCount = studentService.countByQuery(sQuery);
+                if (inspectedCount == totalCount) {
+                    obj.put("status", 1);
+                    return obj;
+                } else {
+                    String percent = totalCount > 0
+                            ? (new DecimalFormat("####.###").format(inspectedCount * 100.0 / totalCount) + "%")
+                            : "0%";
+                    String msg = "本轮复核进度为" + percent + ",还有" + (totalCount - inspectedCount) + "份未完成复核,是否进入下一轮复核?";
+                    obj.put("status", 0);
+                    obj.put("message", msg);
+                    return obj;
+                }
+            }
         } finally {
             lockService.unlock(LockType.EXAM_SUBJECT, examId, subjectCode);
         }
@@ -420,54 +413,54 @@ public class InspectedController extends BaseExamController {
     @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) {
-    	String url="redirect:/admin/exam/inspected/list?subjectCode="+subjectCode;
+        String url = "redirect:/admin/exam/inspected/list?subjectCode=" + subjectCode;
         int examId = getSessionExamId(request);
         lockService.waitlock(LockType.EXAM_SUBJECT, examId, subjectCode);
         try {
-        	Exam exam = examService.findById(examId);
-        	ExamSubject es = subjectService.find(examId, subjectCode);
-        	StringBuilder sb=new StringBuilder();
-        	sb.append("科目代码:"+subjectCode);
-            sb.append(" | 开启第"+(es.getInspectRound()+1)+"轮");
+            Exam exam = examService.findById(examId);
+            ExamSubject es = subjectService.find(examId, subjectCode);
+            StringBuilder sb = new StringBuilder();
+            sb.append("科目代码:" + subjectCode);
+            sb.append(" | 开启第" + (es.getInspectRound() + 1) + "轮");
             sb.append(" | 上轮进度");
-        	ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
-	        sQuery.setExamId(examId);
-	        sQuery.setUpload(true);
-	        sQuery.setAbsent(false);
-	        sQuery.setBreach(false);
-	        sQuery.setSubjectCode(subjectCode);
-	        sQuery.setInspected(true);
-			if(exam.getInspectRoundLimit()) {
-				if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
-	                ra.addFlashAttribute("errmsg", "该科目第" + es.getInspectRound() + "次复核还未完成");
-	                return url;
-	            }else {
-	            	long inspectedCount = studentService.countByQuery(sQuery);
-	            	sQuery.setInspected(null);
-			        long totalCount = studentService.countByQuery(sQuery);
-			        sb.append(" 总量:"+totalCount);
-			        sb.append(" 已复核:"+inspectedCount);
-			        sb.append(" 未复核:"+(totalCount-inspectedCount));
-	            	subjectService.nextInspectRound(examId, subjectCode);
-	            	
-	            	RequestUtils.setLog(request, sb.toString());
-	                return url;
-	            }
-			}else {
-		        long inspectedCount = studentService.countByQuery(sQuery);
-		        if(inspectedCount==0) {
-		            ra.addFlashAttribute("errmsg", "本轮无复核记录,无法开启再次复核");
-	                return url;
-		        }
-		        sQuery.setInspected(null);
-		        long totalCount = studentService.countByQuery(sQuery);
-		        sb.append(" 总量:"+totalCount);
-		        sb.append(" 已复核:"+inspectedCount);
-		        sb.append(" 未复核:"+(totalCount-inspectedCount));
-		        subjectService.nextInspectRound(examId, subjectCode);
-		        RequestUtils.setLog(request, sb.toString());
+            ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+            sQuery.setExamId(examId);
+            sQuery.setUpload(true);
+            sQuery.setAbsent(false);
+            sQuery.setBreach(false);
+            sQuery.setSubjectCode(subjectCode);
+            sQuery.setInspected(true);
+            if (exam.getInspectRoundLimit()) {
+                if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
+                    ra.addFlashAttribute("errmsg", "该科目第" + es.getInspectRound() + "次复核还未完成");
+                    return url;
+                } else {
+                    long inspectedCount = studentService.countByQuery(sQuery);
+                    sQuery.setInspected(null);
+                    long totalCount = studentService.countByQuery(sQuery);
+                    sb.append(" 总量:" + totalCount);
+                    sb.append(" 已复核:" + inspectedCount);
+                    sb.append(" 未复核:" + (totalCount - inspectedCount));
+                    subjectService.nextInspectRound(examId, subjectCode);
+
+                    RequestUtils.setLog(request, sb.toString());
+                    return url;
+                }
+            } else {
+                long inspectedCount = studentService.countByQuery(sQuery);
+                if (inspectedCount == 0) {
+                    ra.addFlashAttribute("errmsg", "本轮无复核记录,无法开启再次复核");
+                    return url;
+                }
+                sQuery.setInspected(null);
+                long totalCount = studentService.countByQuery(sQuery);
+                sb.append(" 总量:" + totalCount);
+                sb.append(" 已复核:" + inspectedCount);
+                sb.append(" 未复核:" + (totalCount - inspectedCount));
+                subjectService.nextInspectRound(examId, subjectCode);
+                RequestUtils.setLog(request, sb.toString());
                 return url;
-			}
+            }
         } finally {
             lockService.unlock(LockType.EXAM_SUBJECT, examId, subjectCode);
         }
@@ -486,7 +479,8 @@ public class InspectedController extends BaseExamController {
             obj.accumulate("message", "无法打回");
             return obj;
         }
-        if (student.getSubjectiveStatus().equals(SubjectiveStatus.MARKED) && subjectCheck(student.getSubjectCode(), wu)) {
+        if (student.getSubjectiveStatus().equals(SubjectiveStatus.MARKED)
+                && subjectCheck(student.getSubjectCode(), wu)) {
             try {
                 lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
                 lockService.waitlock(LockType.STUDENT, student.getId());
@@ -516,8 +510,8 @@ public class InspectedController extends BaseExamController {
     @Logging(menu = "回看全卷复核任务", type = LogType.QUERY)
     @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
     @ResponseBody
-    public Object getHistory(HttpServletRequest request, @RequestParam String subjectCode,
-            @RequestParam int pageNumber, @RequestParam int pageSize) throws Exception {
+    public Object getHistory(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam int pageNumber,
+            @RequestParam int pageSize) throws Exception {
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
         List<Task> list = new ArrayList<>();
@@ -540,15 +534,11 @@ public class InspectedController extends BaseExamController {
 
     @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
     @ResponseBody
-    public JSONObject status(HttpServletRequest request, InspectQuery query,
-            @RequestParam(required = false) SelectiveStatus selectiveStatus,
-            @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
-            @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore) {
+    public JSONObject status(HttpServletRequest request, InspectQuery query) {
         JSONObject status = new JSONObject();
         int examId = getSessionExamId(request);
         query.setExamId(examId);
-        Integer totalCount = inspectedService.needInspectCount(query, mainNumber, mainStartScore, mainEndScore,
-                selectiveStatus);
+        Integer totalCount = inspectedService.needInspectCount(query);
         status.accumulate("totalCount", totalCount);
         status.accumulate("valid", true);
         return status;
@@ -587,7 +577,7 @@ public class InspectedController extends BaseExamController {
         List<CollationLabel> list = collationLabelService.list(examId);
         ObjectMapper mapper = new ObjectMapper();
         try {
-            setting.accumulate("collationLabelList",mapper.writeValueAsString(list));
+            setting.accumulate("collationLabelList", mapper.writeValueAsString(list));
         } catch (JsonProcessingException e) {
             log.error("MarkController-整理异常获取出错", e);
         }
@@ -625,7 +615,7 @@ public class InspectedController extends BaseExamController {
         }
     }
 
-//    @Logging(menu = "取消复核", type = LogType.UPDATE)
+    // @Logging(menu = "取消复核", type = LogType.UPDATE)
     @RequestMapping(value = "/batchCancel", method = RequestMethod.POST)
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.INSPECTOR, Role.COLLEGE_ADMIN })
     public String batchCancel(HttpServletRequest request, @RequestParam Integer[] ids) {
@@ -636,7 +626,7 @@ public class InspectedController extends BaseExamController {
                 try {
                     lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
                     lockService.waitlock(LockType.STUDENT, student.getId());
-                    if(student.getInspected()&&inspectedService.cancelByStudent(id)){
+                    if (student.getInspected() && inspectedService.cancelByStudent(id)) {
                         OperationLog log = new OperationLog();
                         log.setCreateTime(new Date());
                         log.setMenu("取消复核");
@@ -648,7 +638,8 @@ public class InspectedController extends BaseExamController {
                         int examId = SessionExamUtils.getExamId(request);
                         log.setExamId(examId > 0 ? examId : null);
                         log.setSchoolId(wu.getUser().getSchoolId());
-                        log.setDescription("科目代码:"+student.getSubjectCode()+" 准考证号:"+student.getExamNumber()+" 密号:"+student.getSecretNumber());
+                        log.setDescription("科目代码:" + student.getSubjectCode() + " 准考证号:" + student.getExamNumber()
+                                + " 密号:" + student.getSecretNumber());
                         logService.save(log);
                     }
                 } catch (Exception e) {
@@ -732,8 +723,9 @@ public class InspectedController extends BaseExamController {
             if (vo.getLeftCount() < 0) {
                 vo.setLeftCount(0);
             }
-            String percent = totalPaperCount > 0 ? (new DecimalFormat("####.###")
-                    .format(inspectedCount * 100.0 / totalPaperCount) + "%") : "0%";
+            String percent = totalPaperCount > 0
+                    ? (new DecimalFormat("####.###").format(inspectedCount * 100.0 / totalPaperCount) + "%")
+                    : "0%";
             vo.setPercent(percent);
             if (unFinishSet.contains(vo.getSubject().getCode())) {
                 vo.setFinishCount(vo.getSubject().getInspectRound() - 1);
@@ -758,11 +750,11 @@ public class InspectedController extends BaseExamController {
         long total = studentService.countByQuery(sQuery);
         model.addAttribute("unMarkedCount", total - markedCount);
         model.addAttribute("markedCount", markedCount);
-//        long subjectCount = subjectService.count(examId);
+        // long subjectCount = subjectService.count(examId);
         Set<String> hasTask = studentService.findSubjectHasTaskByExamId(examId);
-        long hasTaskCount=0;
-        if(hasTask!=null) {
-        	hasTaskCount=hasTask.size();
+        long hasTaskCount = 0;
+        if (hasTask != null) {
+            hasTaskCount = hasTask.size();
         }
         model.addAttribute("unFinishCount", unFinishSet.size());
         model.addAttribute("finishCount", hasTaskCount - unFinishSet.size());
@@ -775,11 +767,7 @@ public class InspectedController extends BaseExamController {
 
     @RequestMapping(value = "list/export", method = RequestMethod.POST)
     public String exportListFile(HttpServletRequest request, HttpServletResponse response,
-            RedirectAttributes redirectAttributes, InspectQuery query,
-            @RequestParam(required = false) SubjectiveStatus status,
-            @RequestParam(required = false) SelectiveStatus selectiveStatus,
-            @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
-            @RequestParam(required = false) Double mainEndScore) {
+            RedirectAttributes redirectAttributes, InspectQuery query) {
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
@@ -794,8 +782,7 @@ public class InspectedController extends BaseExamController {
             query.setSubjectCodeIn(StringUtils.join(subjectCodeIn, ","));
         }
         query.setExport(true);
-        List<ExamStudentVo> list = inspectedService.findByQuery(query, status, mainNumber, mainStartScore,
-                mainEndScore, selectiveStatus);
+        List<ExamStudentVo> list = inspectedService.findByQuery(query);
         for (ExamStudentVo e : list) {
             e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
             if (exam.isForbiddenInfo() && !Role.SCHOOL_ADMIN.equals(wu.getRole())) {

+ 118 - 80
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/InspectedSubjectVO.java

@@ -1,80 +1,118 @@
-package cn.com.qmth.stmms.admin.vo;
-
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-
-public class InspectedSubjectVO {
-
-    private ExamSubject subject;
-
-    /**
-     * 试卷总量
-     */
-    private long totalPaperCount;
-    
-    private long totalCount;
-
-    private long inspectedCount;
-
-    private long leftCount;
-
-    private String percent;
-
-    private Integer finishCount;
-
-    public ExamSubject getSubject() {
-        return subject;
-    }
-
-    public void setSubject(ExamSubject subject) {
-        this.subject = subject;
-    }
-
-    public long getTotalCount() {
-        return totalCount;
-    }
-
-    public void setTotalCount(long totalCount) {
-        this.totalCount = totalCount;
-    }
-
-    public long getInspectedCount() {
-        return inspectedCount;
-    }
-
-    public void setInspectedCount(long inspectedCount) {
-        this.inspectedCount = inspectedCount;
-    }
-
-    public long getLeftCount() {
-        return leftCount;
-    }
-
-    public void setLeftCount(long leftCount) {
-        this.leftCount = leftCount;
-    }
-
-    public String getPercent() {
-        return percent;
-    }
-
-    public void setPercent(String percent) {
-        this.percent = percent;
-    }
-
-    public Integer getFinishCount() {
-        return finishCount;
-    }
-
-    public void setFinishCount(Integer finishCount) {
-        this.finishCount = finishCount;
-    }
-
-	public long getTotalPaperCount() {
-		return totalPaperCount;
-	}
-
-	public void setTotalPaperCount(long totalPaperCount) {
-		this.totalPaperCount = totalPaperCount;
-	}
-
-}
+package cn.com.qmth.stmms.admin.vo;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+import io.swagger.annotations.ApiModelProperty;
+
+public class InspectedSubjectVO {
+
+    @ExcelField(title = "科目", align = 2, sort = 10)
+    @ApiModelProperty("科目")
+    private String subjectText;
+
+    @ExcelField(title = "选做科目", align = 2, sort = 20)
+    @ApiModelProperty("选做科目")
+    private String selectiveText;
+
+    private ExamSubject subject;
+
+    /**
+     * 试卷总量
+     */
+    @ExcelField(title = "试卷总量", align = 2, sort = 30)
+    @ApiModelProperty("试卷总量")
+    private long totalPaperCount;
+
+    @ExcelField(title = "任务数", align = 2, sort = 40)
+    @ApiModelProperty("任务数")
+    private long totalCount;
+
+    @ExcelField(title = "已复核数", align = 2, sort = 50)
+    @ApiModelProperty("已复核数")
+    private long inspectedCount;
+
+    @ExcelField(title = "待复核数", align = 2, sort = 60)
+    @ApiModelProperty("待复核数")
+    private long leftCount;
+
+    @ExcelField(title = "完成进度", align = 2, sort = 70)
+    @ApiModelProperty("完成进度")
+    private String percent;
+
+    @ExcelField(title = "已复核次数", align = 2, sort = 80)
+    @ApiModelProperty("已复核次数")
+    private Integer finishCount;
+
+    public ExamSubject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(ExamSubject subject) {
+        this.subject = subject;
+    }
+
+    public long getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(long totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public long getInspectedCount() {
+        return inspectedCount;
+    }
+
+    public void setInspectedCount(long inspectedCount) {
+        this.inspectedCount = inspectedCount;
+    }
+
+    public long getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(long leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    public String getPercent() {
+        return percent;
+    }
+
+    public void setPercent(String percent) {
+        this.percent = percent;
+    }
+
+    public Integer getFinishCount() {
+        return finishCount;
+    }
+
+    public void setFinishCount(Integer finishCount) {
+        this.finishCount = finishCount;
+    }
+
+    public long getTotalPaperCount() {
+        return totalPaperCount;
+    }
+
+    public void setTotalPaperCount(long totalPaperCount) {
+        this.totalPaperCount = totalPaperCount;
+    }
+
+    public String getSubjectText() {
+        return subjectText;
+    }
+
+    public void setSubjectText(String subjectText) {
+        this.subjectText = subjectText;
+    }
+
+    public String getSelectiveText() {
+        return selectiveText;
+    }
+
+    public void setSelectiveText(String selectiveText) {
+        this.selectiveText = selectiveText;
+    }
+
+}

+ 554 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/InspectedController.java

@@ -0,0 +1,554 @@
+package cn.com.qmth.stmms.api.controller.admin;
+
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.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.qmth.boot.core.collection.PageResult;
+
+import cn.com.qmth.stmms.admin.utils.ExportInspectExcel;
+import cn.com.qmth.stmms.admin.vo.InspectedSubjectVO;
+import cn.com.qmth.stmms.api.controller.BaseApiController;
+import cn.com.qmth.stmms.biz.exam.bean.ExamStudentVo;
+import cn.com.qmth.stmms.biz.exam.bean.InspectWorkVo;
+import cn.com.qmth.stmms.biz.exam.bean.InspectedSubjectChatVo;
+import cn.com.qmth.stmms.biz.exam.bean.InspectedSubjectStatusVo;
+import cn.com.qmth.stmms.biz.exam.bean.NextRoundCheckVo;
+import cn.com.qmth.stmms.biz.exam.bean.ResultMessage;
+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.OperationLog;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.query.InspectQuery;
+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.InspectHistoryService;
+import cn.com.qmth.stmms.biz.exam.service.InspectedService;
+import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
+import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.exception.StatusException;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.utils.PageUtil;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+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.SubjectiveStatus;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api(tags = "成绩复核")
+@Controller("adminInspectedController")
+@RequestMapping("/api/admin/exam/inspected")
+public class InspectedController extends BaseApiController {
+
+    protected static Logger log = LoggerFactory.getLogger(InspectedController.class);
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private InspectedService inspectedService;
+
+    @Autowired
+    private InspectHistoryService inspectHistoryService;
+
+    @Autowired
+    private LockService lockService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private OperationLogService logService;
+
+    @Value("${slice.split.config}")
+    private String splitConfig;
+
+    public static final String UN_SELECTIVE_SCORE = "-1";
+
+    private static final String DEFAULT_SECRET_NUMBER = "***";
+
+    @ApiOperation(value = "考试是否结束")
+    @RequestMapping(value = "exam/finish", method = RequestMethod.POST)
+    @ResponseBody
+    public Boolean examFinish() {
+        int examId = getSessionExamId();
+        Exam exam = examService.findById(examId);
+        return checkFinish(exam);
+    }
+
+    @ApiOperation(value = "成绩复核进度图表")
+    @RequestMapping(value = "chat", method = RequestMethod.POST)
+    @ResponseBody
+    public InspectedSubjectChatVo chat(ExamSubjectSearchQuery query) {
+        int examId = getSessionExamId();
+        query.setExamId(examId);
+        Set<String> unFinishSet = studentService.findSubjectUnInspectedByExamId(examId);
+        ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+        sQuery.setExamId(examId);
+        sQuery.setUpload(true);
+        sQuery.setAbsent(false);
+        sQuery.setBreach(false);
+        sQuery.setInspected(true);
+        long markedCount = studentService.countByQuery(sQuery);
+        sQuery.setInspected(null);
+        sQuery.addStatus(SubjectiveStatus.MARKED);
+        long total = studentService.countByQuery(sQuery);
+        Set<String> hasTask = studentService.findSubjectHasTaskByExamId(examId);
+        long hasTaskCount = 0;
+        if (hasTask != null) {
+            hasTaskCount = hasTask.size();
+        }
+        InspectedSubjectChatVo vo = new InspectedSubjectChatVo();
+        vo.setFinishCount(hasTaskCount - unFinishSet.size());
+        vo.setMarkedCount(markedCount);
+        vo.setUnFinishCount(Long.valueOf(unFinishSet.size()));
+        vo.setUnMarkedCount(total - markedCount);
+        return vo;
+    }
+
+    @Logging(menu = "成绩复核进度查询", type = LogType.QUERY)
+    @ApiOperation(value = "成绩复核进度查询")
+    @RequestMapping(value = "info", method = RequestMethod.POST)
+    @ResponseBody
+    public PageResult<InspectedSubjectVO> info(ExamSubjectSearchQuery query) {
+        return infoPage(query);
+    }
+
+    private PageResult<InspectedSubjectVO> infoPage(ExamSubjectSearchQuery query) {
+        ApiUser wu = getApiUser();
+        int examId = getSessionExamId();
+        query.setExamId(examId);
+        Set<String> unFinishSet = studentService.findSubjectUnInspectedByExamId(examId);
+        Set<String> hasTaskSet = studentService.findSubjectHasTaskByExamId(examId);
+        if (query.getFinished() != null) {
+            String subjectCodeIn = StringUtils.join(unFinishSet, ",");
+            String hasTaskSetIn = StringUtils.join(hasTaskSet, ",");
+            if (query.getFinished()) {
+                query.setCodeNotIn(subjectCodeIn);
+                query.setCodeIn(hasTaskSetIn);
+            } else {
+                query.setCodeIn(subjectCodeIn);
+            }
+        }
+        List<ExamSubject> subjectList = getExamSubject(examId, wu);
+        if (StringUtils.isBlank(query.getCode()) && wu.getRole() != Role.SCHOOL_ADMIN) {
+            List<String> subjectCodeIn = new ArrayList<String>();
+            subjectList.forEach(e -> subjectCodeIn.add(e.getCode()));
+            subjectCodeQuery(query, subjectCodeIn);
+        }
+        query = subjectService.findByQuery(query);
+        if (unFinishSet.isEmpty() && query.getFinished() != null && !query.getFinished()) {
+            query.setResult(new ArrayList<ExamSubject>());
+        }
+
+        List<InspectedSubjectVO> list = new LinkedList<InspectedSubjectVO>();
+        for (ExamSubject subject : query.getResult()) {
+            InspectedSubjectVO vo = new InspectedSubjectVO();
+            vo.setSubject(subject);
+            vo.setSubjectText(subject.getCode() + "-" + subject.getName());
+            vo.setSelectiveText(subject.isSelective() ? "是" : "否");
+            ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+            sQuery.setExamId(examId);
+            sQuery.setUpload(true);
+            sQuery.setAbsent(false);
+            sQuery.setBreach(false);
+            sQuery.setSubjectCode(subject.getCode());
+            long totalPaperCount = studentService.countByQuery(sQuery);
+            vo.setTotalPaperCount(totalPaperCount);
+            sQuery.setInspected(true);
+            long inspectedCount = studentService.countByQuery(sQuery);
+            vo.setInspectedCount(inspectedCount);
+            sQuery.addStatus(SubjectiveStatus.MARKED);
+            sQuery.setInspected(null);
+            long totalCount = studentService.countByQuery(sQuery);
+            vo.setTotalCount(totalCount);
+            vo.setLeftCount(totalCount - inspectedCount);
+            if (vo.getLeftCount() < 0) {
+                vo.setLeftCount(0);
+            }
+            String percent = totalPaperCount > 0
+                    ? (new DecimalFormat("####.###").format(inspectedCount * 100.0 / totalPaperCount) + "%")
+                    : "0%";
+            vo.setPercent(percent);
+            if (unFinishSet.contains(vo.getSubject().getCode())) {
+                vo.setFinishCount(vo.getSubject().getInspectRound() - 1);
+            } else {
+                if (totalCount == 0) {
+                    vo.setFinishCount(vo.getSubject().getInspectRound() - 1);
+                } else {
+                    vo.setFinishCount(vo.getSubject().getInspectRound());
+                }
+            }
+            list.add(vo);
+        }
+        return PageUtil.of(list, query);
+    }
+
+    @ApiOperation(value = "成绩复核进度导出")
+    @RequestMapping(value = "info/export", method = RequestMethod.POST)
+    @ResponseBody
+    public void infoExport(ExamSubjectSearchQuery query, HttpServletResponse response) {
+        String fileName = "成绩复核进度数据.xlsx";
+        query.setPageNumber(1);
+        query.setPageSize(Integer.MAX_VALUE);
+        PageResult<InspectedSubjectVO> page = infoPage(query);
+        try {
+            new ExportExcel("成绩复核进度数据", InspectedSubjectVO.class).setDataList(page.getResult())
+                    .write(response, fileName).dispose();
+        } catch (IOException e) {
+            throw new StatusException("成绩复核进度数据导出出错", e);
+        }
+    }
+
+    @ApiOperation(value = "科目状态信息")
+    @RequestMapping(value = "subject/status", method = RequestMethod.POST)
+    @ResponseBody
+    public InspectedSubjectStatusVo subjectStatus(InspectQuery query) {
+        int examId = getSessionExamId();
+        Exam exam = examService.findById(examId);
+        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+            throw new StatusException("多媒体阅卷无此功能权限");
+        }
+        InspectedSubjectStatusVo ret = new InspectedSubjectStatusVo();
+        if (StringUtils.isNotBlank(query.getSubjectCode())) {
+            ExamSubject es = subjectService.find(examId, query.getSubjectCode());
+            Boolean inspectFinish = inspectedService.inspectFinish(examId, query.getSubjectCode(),
+                    es.getInspectRound());
+            ret.setShowNextInspectMsg(inspectFinish);
+            if (!exam.getInspectRoundLimit()) {
+                ret.setShowNextInspect(true);
+            } else {
+                if (inspectFinish) {
+                    ret.setShowNextInspect(true);
+                } else {
+                    ret.setShowNextInspect(false);
+                }
+            }
+        }
+        return ret;
+    }
+
+    @ApiOperation(value = "复核轮数列表")
+    @RequestMapping(value = "round/list", method = RequestMethod.POST)
+    @ResponseBody
+    public List<Integer> roundList(InspectQuery query) {
+        int examId = getSessionExamId();
+        return inspectHistoryService.findInspectRound(examId);
+    }
+
+    @ApiOperation(value = "全卷复核查询")
+    @RequestMapping(value = "list", method = RequestMethod.POST)
+    @ResponseBody
+    public PageResult<ExamStudentVo> list(InspectQuery query) {
+        int examId = getSessionExamId();
+        Exam exam = examService.findById(examId);
+        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+            throw new StatusException("多媒体阅卷无此功能权限");
+        }
+        ApiUser wu = getApiUser();
+        query.setExamId(examId);
+        List<ExamSubject> subjectList = getExamSubject(examId, wu);
+        if (StringUtils.isBlank(query.getSubjectCode()) && wu.getRole() != Role.SCHOOL_ADMIN) {
+            List<String> subjectCodeIn = new ArrayList<String>();
+            subjectList.forEach(e -> subjectCodeIn.add(e.getCode()));
+            query.setSubjectCodeIn(StringUtils.join(subjectCodeIn, ","));
+        }
+        if (wu.getRole() != Role.SCHOOL_ADMIN && subjectList != null && subjectList.size() > 0
+                && query.getSubjectCode() == null) {
+            query.setSubjectCode(subjectList.get(0).getCode());
+        }
+        List<ExamStudentVo> list = inspectedService.findByQuery(query);
+        for (ExamStudentVo e : list) {
+            e.setSubjectText(e.getSubjectCode() + "-" + e.getSubjectName());
+            e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
+        }
+        int maxInspectRound = 1;
+        if (list != null && list.size() > 0) {
+            Set<String> subjectCodes = list.stream().map(e -> e.getSubjectCode()).collect(Collectors.toSet());
+            maxInspectRound = subjectService.findMaxInspectRound(examId, subjectCodes);
+            inspectedService.fillInspectHistoryMap(list, maxInspectRound);
+        }
+        Integer totalCount = inspectedService.countByQuery(query);
+        query.setResult(list);
+        query.setTotalCount(totalCount);
+        return PageUtil.of(query);
+    }
+
+    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;
+    }
+
+    @ApiOperation(value = "再次复核操作前校验")
+    @RequestMapping(value = "nextround/check", method = RequestMethod.POST)
+    @ResponseBody
+    public NextRoundCheckVo nextroundCheck(@RequestParam String subjectCode) {
+        NextRoundCheckVo obj = new NextRoundCheckVo();
+        // status -1 错误,0需确认,1通过
+        int examId = getSessionExamId();
+        lockService.waitlock(LockType.EXAM_SUBJECT, examId, subjectCode);
+        try {
+            Exam exam = examService.findById(examId);
+            ExamSubject es = subjectService.find(examId, subjectCode);
+            if (exam.getInspectRoundLimit()) {
+                if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
+                    obj.setStatus(-1);
+                    obj.setMessage("该科目第" + es.getInspectRound() + "次复核还未完成");
+                    return obj;
+                } else {
+                    String msg = es.getCode() + "-" + es.getName() + ",复核进度已到100%,是否确定开启新一轮复核?";
+                    obj.setMessage(msg);
+                    obj.setStatus(0);
+                    return obj;
+                }
+            } else {
+                ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+                sQuery.setExamId(examId);
+                sQuery.setUpload(true);
+                sQuery.setAbsent(false);
+                sQuery.setBreach(false);
+                sQuery.setSubjectCode(subjectCode);
+                sQuery.setInspected(true);
+                long inspectedCount = studentService.countByQuery(sQuery);
+                if (inspectedCount == 0) {
+                    obj.setStatus(-1);
+                    obj.setMessage("本轮无复核记录,无法开启再次复核");
+                    return obj;
+                }
+                sQuery.setInspected(null);
+                long totalCount = studentService.countByQuery(sQuery);
+                if (inspectedCount == totalCount) {
+                    String msg = es.getCode() + "-" + es.getName() + ",复核进度已到100%,是否确定开启新一轮复核?";
+                    obj.setMessage(msg);
+                    obj.setStatus(0);
+                    return obj;
+                } else {
+                    String percent = totalCount > 0
+                            ? (new DecimalFormat("####.###").format(inspectedCount * 100.0 / totalCount) + "%")
+                            : "0%";
+                    String msg = "本轮复核进度为" + percent + ",还有" + (totalCount - inspectedCount) + "份未完成复核,是否进入下一轮复核?";
+                    obj.setStatus(0);
+                    obj.setMessage(msg);
+                    return obj;
+                }
+            }
+        } finally {
+            lockService.unlock(LockType.EXAM_SUBJECT, examId, subjectCode);
+        }
+    }
+
+    @ApiOperation(value = "再次复核")
+    @Logging(menu = "再次复核", type = LogType.UPDATE)
+    @RequestMapping(value = "nextround", method = RequestMethod.POST)
+    @ResponseBody
+    public ResultMessage nextround(@RequestParam String subjectCode) {
+        int examId = getSessionExamId();
+        lockService.waitlock(LockType.EXAM_SUBJECT, examId, subjectCode);
+        try {
+            Exam exam = examService.findById(examId);
+            ExamSubject es = subjectService.find(examId, subjectCode);
+            StringBuilder sb = new StringBuilder();
+            sb.append("科目代码:" + subjectCode);
+            sb.append(" | 开启第" + (es.getInspectRound() + 1) + "轮");
+            sb.append(" | 上轮进度");
+            ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+            sQuery.setExamId(examId);
+            sQuery.setUpload(true);
+            sQuery.setAbsent(false);
+            sQuery.setBreach(false);
+            sQuery.setSubjectCode(subjectCode);
+            sQuery.setInspected(true);
+            if (exam.getInspectRoundLimit()) {
+                if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
+                    throw new StatusException("该科目第" + es.getInspectRound() + "次复核还未完成");
+                } else {
+                    long inspectedCount = studentService.countByQuery(sQuery);
+                    sQuery.setInspected(null);
+                    long totalCount = studentService.countByQuery(sQuery);
+                    sb.append(" 总量:" + totalCount);
+                    sb.append(" 已复核:" + inspectedCount);
+                    sb.append(" 未复核:" + (totalCount - inspectedCount));
+                    subjectService.nextInspectRound(examId, subjectCode);
+
+                    RequestUtils.setLog(sb.toString());
+                    return resultOk();
+                }
+            } else {
+                long inspectedCount = studentService.countByQuery(sQuery);
+                if (inspectedCount == 0) {
+                    throw new StatusException("本轮无复核记录,无法开启再次复核");
+                }
+                sQuery.setInspected(null);
+                long totalCount = studentService.countByQuery(sQuery);
+                sb.append(" 总量:" + totalCount);
+                sb.append(" 已复核:" + inspectedCount);
+                sb.append(" 未复核:" + (totalCount - inspectedCount));
+                subjectService.nextInspectRound(examId, subjectCode);
+                RequestUtils.setLog(sb.toString());
+                return resultOk();
+            }
+        } finally {
+            lockService.unlock(LockType.EXAM_SUBJECT, examId, subjectCode);
+        }
+    }
+
+    @ApiOperation(value = "取消复核")
+    @RequestMapping(value = "batch-cancel", method = RequestMethod.POST)
+    @ResponseBody
+    public ResultMessage batchCancel(@RequestParam List<Integer> studentIds) {
+        ApiUser wu = getApiUser();
+        for (Integer id : studentIds) {
+            ExamStudent student = studentService.findById(id);
+            if (student != null && subjectCheck(student.getSubjectCode(), wu)) {
+                try {
+                    lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
+                    lockService.waitlock(LockType.STUDENT, student.getId());
+                    if (student.getInspected() && inspectedService.cancelByStudent(id)) {
+                        OperationLog log = new OperationLog();
+                        log.setCreateTime(new Date());
+                        log.setMenu("取消复核");
+                        log.setType(LogType.UPDATE);
+                        log.setMarker(false);
+                        log.setOperatorId(wu.getUser().getId());
+                        log.setIpAddress(wu.getUser().getLastLoginIp());
+                        log.setLoginName(wu.getUser().getLoginName());
+                        int examId = getSessionExamId();
+                        log.setExamId(examId > 0 ? examId : null);
+                        log.setSchoolId(wu.getUser().getSchoolId());
+                        log.setDescription("科目代码:" + student.getSubjectCode() + " 准考证号:" + student.getExamNumber()
+                                + " 密号:" + student.getSecretNumber());
+                        logService.save(log);
+                    }
+                } catch (Exception e) {
+                    log.error("back inspected error", e);
+                } finally {
+                    lockService.unlock(LockType.STUDENT, student.getId());
+                    lockService.unwatch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
+                }
+            }
+        }
+        return resultOk();
+    }
+
+    private void subjectCodeQuery(ExamSubjectSearchQuery query, List<String> subjectCodeIn) {
+        if (StringUtils.isEmpty(query.getCodeIn())) {
+            query.setCodeIn(StringUtils.join(subjectCodeIn, ","));
+        } else {
+            Set<String> set = new HashSet<>();
+            for (String c : query.getCodeIn().split(",")) {
+                set.add(c);
+            }
+            set.addAll(subjectCodeIn);
+            query.setCodeIn(StringUtils.join(set, ","));
+        }
+    }
+
+    @ApiOperation(value = "全卷复核导出")
+    @RequestMapping(value = "list/export", method = RequestMethod.POST)
+    @ResponseBody
+    public void exportListFile(HttpServletResponse response, InspectQuery query) {
+        int examId = getSessionExamId();
+        Exam exam = examService.findById(examId);
+        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+            throw new StatusException("多媒体阅卷无此功能权限");
+        }
+        ApiUser wu = getApiUser();
+        query.setExamId(examId);
+        List<ExamSubject> subjectList = getExamSubject(examId, wu);
+        if (StringUtils.isBlank(query.getSubjectCode()) && wu.getRole() != Role.SCHOOL_ADMIN) {
+            List<String> subjectCodeIn = new ArrayList<String>();
+            subjectList.forEach(e -> subjectCodeIn.add(e.getCode()));
+            query.setSubjectCodeIn(StringUtils.join(subjectCodeIn, ","));
+        }
+        query.setExport(true);
+        List<ExamStudentVo> list = inspectedService.findByQuery(query);
+        for (ExamStudentVo e : list) {
+            e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
+            if (exam.isForbiddenInfo() && !Role.SCHOOL_ADMIN.equals(wu.getRole())) {
+                e.setSecretNumber(DEFAULT_SECRET_NUMBER);
+            }
+        }
+        int maxInspectRound = 1;
+        if (list != null && list.size() > 0) {
+            Set<String> subjectCodes = list.stream().map(e -> e.getSubjectCode()).collect(Collectors.toSet());
+            maxInspectRound = subjectService.findMaxInspectRound(examId, subjectCodes);
+            inspectedService.fillInspectHistoryMap(list, maxInspectRound);
+        }
+        try {
+            String fileName = "复核列表.xlsx";
+            List<String> headerList = getInspectHeader(maxInspectRound);
+            ExportInspectExcel excel = new ExportInspectExcel("复核列表", headerList, ExamStudentVo.class);
+            excel.setDataList(list);
+            excel.write(response, fileName).dispose();
+        } catch (Exception e) {
+            throw new StatusException("导出数据失败", e);
+        }
+    }
+
+    private List<String> getInspectHeader(int maxInspectRound) {
+        List<String> ret = new ArrayList<>();
+        for (int i = 1; i <= maxInspectRound; i++) {
+            ret.add("复核人" + i);
+            ret.add("复核时间" + i);
+        }
+        return ret;
+    }
+
+    @ApiOperation(value = "复核工作量导出")
+    @RequestMapping(value = "work/export", method = RequestMethod.POST)
+    @ResponseBody
+    public void exportWorkFile(HttpServletRequest request, HttpServletResponse response,
+            RedirectAttributes redirectAttributes) {
+        Integer examId = getSessionExamId(request);
+        Exam exam = examService.findById(examId);
+        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+            throw new StatusException("多媒体阅卷无此功能权限");
+        }
+        try {
+            List<InspectWorkVo> list = inspectHistoryService.findInspectWork(examId);
+            String fileName = "复核员工作量.xlsx";
+            new ExportExcel("复核员工作量", InspectWorkVo.class).setDataList(list).write(response, fileName).dispose();
+        } catch (Exception e) {
+            throw new StatusException("导出数据失败", e);
+        }
+    }
+
+}