Browse Source

评卷员管理

xiatian 1 day ago
parent
commit
4386360d37

+ 417 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/MarkerInfo.java

@@ -0,0 +1,417 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.common.enums.MarkMode;
+import io.swagger.annotations.ApiModelProperty;
+
+public class MarkerInfo {
+
+    @ApiModelProperty("评卷员id")
+    private Integer id;
+
+    @ApiModelProperty("")
+    private Integer examId;
+
+    @ApiModelProperty("")
+    private String subjectCode;
+
+    @ApiModelProperty("分组号")
+    private Integer groupNumber;
+
+    @ApiModelProperty("用户id")
+    private Integer userId;
+
+    @ApiModelProperty("启用禁用")
+    private Boolean enable;
+
+    @ApiModelProperty("评卷模式")
+    private MarkMode mode;
+
+    @ApiModelProperty("任务数")
+    private Integer topCount;
+
+    @ApiModelProperty("")
+    private Integer finishCount;
+
+    @ApiModelProperty("")
+    private Integer validCount;
+
+    @ApiModelProperty("")
+    private Integer rejectCount;
+
+    @ApiModelProperty("")
+    private Double avgSpeed;
+
+    @ApiModelProperty("")
+    private Double avgScore;
+
+    @ApiModelProperty("")
+    private Double stdevScore;
+
+    @ApiModelProperty("")
+    private Integer finishCountNa;
+
+    @ApiModelProperty("")
+    private Integer validCountNa;
+
+    @ApiModelProperty("")
+    private Double avgSpeedNa;
+
+    @ApiModelProperty("")
+    private Double avgScoreNa;
+
+    @ApiModelProperty("")
+    private Double stdevScoreNa;
+
+    /**
+     * 个性化评卷参数设置
+     */
+    @ApiModelProperty("")
+    private String markSetting;
+
+    @ApiModelProperty("")
+    private String subjectName;
+
+    @ApiModelProperty("")
+    private String groupName;
+
+    @ApiModelProperty("登录名")
+    private String loginName;
+
+    @ApiModelProperty("")
+    private ExamSubject subject;
+
+    @ApiModelProperty("分组名")
+    private String title;
+
+    @ApiModelProperty("已评数量")
+    private Long markedCount;
+
+    @ApiModelProperty("")
+    private Long markedCountNa;
+
+    @ApiModelProperty("正在评卷")
+    private Long currentCount;
+
+    @ApiModelProperty("")
+    private User user;
+
+    @ApiModelProperty("")
+    private Boolean reseting;
+
+    /**
+     * 班级数量
+     */
+    @ApiModelProperty("绑定班级")
+    private Long classCount;
+
+    @ApiModelProperty("")
+    private Long arbitrateCount;
+
+    @ApiModelProperty("")
+    private String arbitrateRatio;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public MarkMode getMode() {
+        return mode;
+    }
+
+    public void setMode(MarkMode mode) {
+        this.mode = mode;
+    }
+
+    public Integer getTopCount() {
+        return topCount;
+    }
+
+    public void setTopCount(Integer topCount) {
+        this.topCount = topCount;
+    }
+
+    public Integer getFinishCount() {
+        return finishCount;
+    }
+
+    public void setFinishCount(Integer finishCount) {
+        this.finishCount = finishCount;
+    }
+
+    public Integer getValidCount() {
+        return validCount;
+    }
+
+    public void setValidCount(Integer validCount) {
+        this.validCount = validCount;
+    }
+
+    public Integer getRejectCount() {
+        return rejectCount;
+    }
+
+    public void setRejectCount(Integer rejectCount) {
+        this.rejectCount = rejectCount;
+    }
+
+    public Double getAvgSpeed() {
+        return avgSpeed;
+    }
+
+    public void setAvgSpeed(Double avgSpeed) {
+        this.avgSpeed = avgSpeed;
+    }
+
+    public Double getAvgScore() {
+        return avgScore;
+    }
+
+    public void setAvgScore(Double avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public Double getStdevScore() {
+        return stdevScore;
+    }
+
+    public void setStdevScore(Double stdevScore) {
+        this.stdevScore = stdevScore;
+    }
+
+    public Integer getFinishCountNa() {
+        return finishCountNa;
+    }
+
+    public void setFinishCountNa(Integer finishCountNa) {
+        this.finishCountNa = finishCountNa;
+    }
+
+    public Integer getValidCountNa() {
+        return validCountNa;
+    }
+
+    public void setValidCountNa(Integer validCountNa) {
+        this.validCountNa = validCountNa;
+    }
+
+    public Double getAvgSpeedNa() {
+        return avgSpeedNa;
+    }
+
+    public void setAvgSpeedNa(Double avgSpeedNa) {
+        this.avgSpeedNa = avgSpeedNa;
+    }
+
+    public Double getAvgScoreNa() {
+        return avgScoreNa;
+    }
+
+    public void setAvgScoreNa(Double avgScoreNa) {
+        this.avgScoreNa = avgScoreNa;
+    }
+
+    public Double getStdevScoreNa() {
+        return stdevScoreNa;
+    }
+
+    public void setStdevScoreNa(Double stdevScoreNa) {
+        this.stdevScoreNa = stdevScoreNa;
+    }
+
+    public String getMarkSetting() {
+        return markSetting;
+    }
+
+    public void setMarkSetting(String markSetting) {
+        this.markSetting = markSetting;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public ExamSubject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(ExamSubject subject) {
+        this.subject = subject;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Long getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(Long markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public Long getMarkedCountNa() {
+        return markedCountNa;
+    }
+
+    public void setMarkedCountNa(Long markedCountNa) {
+        this.markedCountNa = markedCountNa;
+    }
+
+    public Long getCurrentCount() {
+        return currentCount;
+    }
+
+    public void setCurrentCount(Long currentCount) {
+        this.currentCount = currentCount;
+    }
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public Boolean getReseting() {
+        return reseting;
+    }
+
+    public void setReseting(Boolean reseting) {
+        this.reseting = reseting;
+    }
+
+    public Long getClassCount() {
+        return classCount;
+    }
+
+    public void setClassCount(Long classCount) {
+        this.classCount = classCount;
+    }
+
+    public Long getArbitrateCount() {
+        return arbitrateCount;
+    }
+
+    public void setArbitrateCount(Long arbitrateCount) {
+        this.arbitrateCount = arbitrateCount;
+    }
+
+    public String getArbitrateRatio() {
+        return arbitrateRatio;
+    }
+
+    public void setArbitrateRatio(String arbitrateRatio) {
+        this.arbitrateRatio = arbitrateRatio;
+    }
+
+    public static MarkerInfo of(Marker from) {
+        MarkerInfo ret = new MarkerInfo();
+        ret.setId(from.getId());
+        ret.setExamId(from.getExamId());
+        ret.setSubjectCode(from.getSubjectCode());
+        ret.setGroupNumber(from.getGroupNumber());
+        ret.setUserId(from.getUserId());
+        ret.setEnable(from.isEnable());
+        ret.setMode(from.getMode());
+        ret.setTopCount(from.getTopCount());
+        ret.setFinishCount(from.getFinishCount());
+        ret.setValidCount(from.getValidCount());
+        ret.setRejectCount(from.getRejectCount());
+        ret.setAvgSpeed(from.getAvgSpeed());
+        ret.setAvgScore(from.getAvgScore());
+        ret.setStdevScore(from.getStdevScore());
+        ret.setFinishCountNa(from.getFinishCountNa());
+        ret.setValidCountNa(from.getValidCountNa());
+        ret.setAvgSpeedNa(from.getAvgSpeedNa());
+        ret.setAvgScoreNa(from.getAvgScoreNa());
+        ret.setStdevScoreNa(from.getStdevScoreNa());
+        ret.setMarkSetting(from.getMarkSetting());
+        ret.setSubjectName(from.getSubjectName());
+        ret.setGroupName(from.getGroupName());
+        ret.setLoginName(from.getLoginName());
+        ret.setSubject(from.getSubject());
+        ret.setTitle(from.getGroup().getTitle());
+        ret.setMarkedCount(from.getMarkedCount());
+        ret.setMarkedCountNa(from.getMarkedCountNa());
+        ret.setCurrentCount(from.getCurrentCount());
+        ret.setUser(from.getUser());
+        ret.setReseting(from.isReseting());
+        ret.setClassCount(from.getClassCount());
+        ret.setArbitrateCount(from.getArbitrateCount());
+        ret.setArbitrateRatio(from.getArbitrateRatio());
+        return ret;
+    }
+}

+ 35 - 198
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/MarkerVo.java

@@ -1,85 +1,66 @@
 package cn.com.qmth.stmms.biz.exam.bean;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.enums.MarkMode;
+import io.swagger.annotations.ApiModelProperty;
 
 public class MarkerVo {
 
+    @ApiModelProperty("评卷员id")
     private Integer id;
 
+    @ApiModelProperty("")
     private Integer examId;
 
+    @ApiModelProperty("")
     private String subjectCode;
 
+    @ApiModelProperty("分组号")
     private Integer groupNumber;
 
+    @ApiModelProperty("用户id")
     private Integer userId;
 
+    @ApiModelProperty("启用禁用")
     private Boolean enable;
 
+    @ApiModelProperty("评卷模式")
     private MarkMode mode;
 
+    @ApiModelProperty("任务数")
     private Integer topCount;
 
-    private Integer finishCount;
-
-    private Integer validCount;
-
-    private Integer rejectCount;
-
-    private Double avgSpeed;
-
-    private Double avgScore;
-
-    private Double stdevScore;
-
-    private Integer finishCountNa;
-
-    private Integer validCountNa;
-
-    private Double avgSpeedNa;
-
-    private Double avgScoreNa;
-
-    private Double stdevScoreNa;
-
-    /**
-     * 个性化评卷参数设置
-     */
-    private String markSetting;
-
-    private String subjectName;
-
-    private String groupName;
-
+    @ApiModelProperty("登录名")
     private String loginName;
 
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("")
     private ExamSubject subject;
 
-    private MarkGroup group;
+    @ApiModelProperty("分组名")
+    private String title;
 
+    @ApiModelProperty("已评数量")
     private Long markedCount;
 
+    @ApiModelProperty("")
     private Long markedCountNa;
 
+    @ApiModelProperty("正在评卷")
     private Long currentCount;
 
-    private User user;
-
+    @ApiModelProperty("是否正在重置")
     private Boolean reseting;
 
     /**
      * 班级数量
      */
+    @ApiModelProperty("绑定班级")
     private Long classCount;
 
-    private Long arbitrateCount;
-
-    private String arbitrateRatio;
-
     public Integer getId() {
         return id;
     }
@@ -88,6 +69,14 @@ public class MarkerVo {
         this.id = id;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
     public Integer getExamId() {
         return examId;
     }
@@ -144,118 +133,6 @@ public class MarkerVo {
         this.topCount = topCount;
     }
 
-    public Integer getFinishCount() {
-        return finishCount;
-    }
-
-    public void setFinishCount(Integer finishCount) {
-        this.finishCount = finishCount;
-    }
-
-    public Integer getValidCount() {
-        return validCount;
-    }
-
-    public void setValidCount(Integer validCount) {
-        this.validCount = validCount;
-    }
-
-    public Integer getRejectCount() {
-        return rejectCount;
-    }
-
-    public void setRejectCount(Integer rejectCount) {
-        this.rejectCount = rejectCount;
-    }
-
-    public Double getAvgSpeed() {
-        return avgSpeed;
-    }
-
-    public void setAvgSpeed(Double avgSpeed) {
-        this.avgSpeed = avgSpeed;
-    }
-
-    public Double getAvgScore() {
-        return avgScore;
-    }
-
-    public void setAvgScore(Double avgScore) {
-        this.avgScore = avgScore;
-    }
-
-    public Double getStdevScore() {
-        return stdevScore;
-    }
-
-    public void setStdevScore(Double stdevScore) {
-        this.stdevScore = stdevScore;
-    }
-
-    public Integer getFinishCountNa() {
-        return finishCountNa;
-    }
-
-    public void setFinishCountNa(Integer finishCountNa) {
-        this.finishCountNa = finishCountNa;
-    }
-
-    public Integer getValidCountNa() {
-        return validCountNa;
-    }
-
-    public void setValidCountNa(Integer validCountNa) {
-        this.validCountNa = validCountNa;
-    }
-
-    public Double getAvgSpeedNa() {
-        return avgSpeedNa;
-    }
-
-    public void setAvgSpeedNa(Double avgSpeedNa) {
-        this.avgSpeedNa = avgSpeedNa;
-    }
-
-    public Double getAvgScoreNa() {
-        return avgScoreNa;
-    }
-
-    public void setAvgScoreNa(Double avgScoreNa) {
-        this.avgScoreNa = avgScoreNa;
-    }
-
-    public Double getStdevScoreNa() {
-        return stdevScoreNa;
-    }
-
-    public void setStdevScoreNa(Double stdevScoreNa) {
-        this.stdevScoreNa = stdevScoreNa;
-    }
-
-    public String getMarkSetting() {
-        return markSetting;
-    }
-
-    public void setMarkSetting(String markSetting) {
-        this.markSetting = markSetting;
-    }
-
-    public String getSubjectName() {
-        return subjectName;
-    }
-
-    public void setSubjectName(String subjectName) {
-        this.subjectName = subjectName;
-    }
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
-    }
-
     public String getLoginName() {
         return loginName;
     }
@@ -272,12 +149,12 @@ public class MarkerVo {
         this.subject = subject;
     }
 
-    public MarkGroup getGroup() {
-        return group;
+    public String getTitle() {
+        return title;
     }
 
-    public void setGroup(MarkGroup group) {
-        this.group = group;
+    public void setTitle(String title) {
+        this.title = title;
     }
 
     public Long getMarkedCount() {
@@ -304,14 +181,6 @@ public class MarkerVo {
         this.currentCount = currentCount;
     }
 
-    public User getUser() {
-        return user;
-    }
-
-    public void setUser(User user) {
-        this.user = user;
-    }
-
     public Boolean getReseting() {
         return reseting;
     }
@@ -328,22 +197,6 @@ public class MarkerVo {
         this.classCount = classCount;
     }
 
-    public Long getArbitrateCount() {
-        return arbitrateCount;
-    }
-
-    public void setArbitrateCount(Long arbitrateCount) {
-        this.arbitrateCount = arbitrateCount;
-    }
-
-    public String getArbitrateRatio() {
-        return arbitrateRatio;
-    }
-
-    public void setArbitrateRatio(String arbitrateRatio) {
-        this.arbitrateRatio = arbitrateRatio;
-    }
-
     public static MarkerVo of(Marker from) {
         MarkerVo ret = new MarkerVo();
         ret.setId(from.getId());
@@ -354,31 +207,15 @@ public class MarkerVo {
         ret.setEnable(from.isEnable());
         ret.setMode(from.getMode());
         ret.setTopCount(from.getTopCount());
-        ret.setFinishCount(from.getFinishCount());
-        ret.setValidCount(from.getValidCount());
-        ret.setRejectCount(from.getRejectCount());
-        ret.setAvgSpeed(from.getAvgSpeed());
-        ret.setAvgScore(from.getAvgScore());
-        ret.setStdevScore(from.getStdevScore());
-        ret.setFinishCountNa(from.getFinishCountNa());
-        ret.setValidCountNa(from.getValidCountNa());
-        ret.setAvgSpeedNa(from.getAvgSpeedNa());
-        ret.setAvgScoreNa(from.getAvgScoreNa());
-        ret.setStdevScoreNa(from.getStdevScoreNa());
-        ret.setMarkSetting(from.getMarkSetting());
-        ret.setSubjectName(from.getSubjectName());
-        ret.setGroupName(from.getGroupName());
         ret.setLoginName(from.getLoginName());
         ret.setSubject(from.getSubject());
-        ret.setGroup(from.getGroup());
+        ret.setTitle(from.getGroup().getTitle());
         ret.setMarkedCount(from.getMarkedCount());
         ret.setMarkedCountNa(from.getMarkedCountNa());
         ret.setCurrentCount(from.getCurrentCount());
-        ret.setUser(from.getUser());
         ret.setReseting(from.isReseting());
         ret.setClassCount(from.getClassCount());
-        ret.setArbitrateCount(from.getArbitrateCount());
-        ret.setArbitrateRatio(from.getArbitrateRatio());
+        ret.setName(from.getUser().getName());
         return ret;
     }
 }

+ 25 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/ResultMessage.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+public class ResultMessage {
+
+    private Boolean success;
+
+    private String message;
+
+    public Boolean getSuccess() {
+        return success;
+    }
+
+    public void setSuccess(Boolean success) {
+        this.success = success;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+}

+ 24 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/MarkerSearchQuery.java

@@ -5,25 +5,35 @@ import org.springframework.data.domain.Sort.Direction;
 
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
+import io.swagger.annotations.ApiModelProperty;
 
 public class MarkerSearchQuery extends BaseQuery<Marker> {
 
+    @ApiModelProperty("")
     private Integer id;
 
+    @ApiModelProperty("")
     private Integer examId;
 
+    @ApiModelProperty("科目代码")
     private String subjectCode;
 
+    @ApiModelProperty("分组号")
     private Integer groupNumber;
 
+    @ApiModelProperty("登录名")
     private String loginName;
 
+    @ApiModelProperty("姓名")
     private String name;
 
+    @ApiModelProperty("")
     private String subjectCodeIn;
-    
+
+    @ApiModelProperty("")
     private Boolean marked;
-    
+
+    @ApiModelProperty("")
     private Boolean noArbitrate;
 
     public void orderById() {
@@ -86,20 +96,20 @@ public class MarkerSearchQuery extends BaseQuery<Marker> {
         this.subjectCodeIn = subjectCodeIn;
     }
 
-	public Boolean getMarked() {
-		return marked;
-	}
+    public Boolean getMarked() {
+        return marked;
+    }
 
-	public void setMarked(Boolean marked) {
-		this.marked = marked;
-	}
+    public void setMarked(Boolean marked) {
+        this.marked = marked;
+    }
 
-	public Boolean getNoArbitrate() {
-		return noArbitrate;
-	}
+    public Boolean getNoArbitrate() {
+        return noArbitrate;
+    }
 
-	public void setNoArbitrate(Boolean noArbitrate) {
-		this.noArbitrate = noArbitrate;
-	}
+    public void setNoArbitrate(Boolean noArbitrate) {
+        this.noArbitrate = noArbitrate;
+    }
 
 }

+ 17 - 11
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/BaseApiController.java

@@ -1,16 +1,11 @@
 package cn.com.qmth.stmms.api.controller;
 
+import java.util.LinkedList;
+import java.util.List;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.common.domain.ApiUser;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,13 +13,18 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.biz.exam.bean.ResultMessage;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.school.model.School;
 import cn.com.qmth.stmms.biz.school.service.SchoolService;
 import cn.com.qmth.stmms.common.controller.BaseController;
-
-import java.util.LinkedList;
-import java.util.List;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
 
 public class BaseApiController extends BaseController {
 
@@ -54,6 +54,12 @@ public class BaseApiController extends BaseController {
         }
     }
 
+    protected ResultMessage resultOk() {
+        ResultMessage ret = new ResultMessage();
+        ret.setSuccess(true);
+        return ret;
+    }
+
     protected JSONObject result(boolean success) {
         JSONObject obj = new JSONObject();
         obj.accumulate("success", success);

+ 5 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/ExamController.java

@@ -22,6 +22,7 @@ import cn.com.qmth.stmms.api.controller.BaseApiController;
 import cn.com.qmth.stmms.biz.exam.bean.ExamReport;
 import cn.com.qmth.stmms.biz.exam.bean.ExamView;
 import cn.com.qmth.stmms.biz.exam.bean.ExamVo;
+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.query.ExamSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
@@ -124,7 +125,7 @@ public class ExamController extends BaseApiController {
     @ResponseBody
     @Logging(menu = "创建考试", type = LogType.ADD)
     @RequestMapping(value = "save", method = RequestMethod.POST)
-    public void save(@RequestBody ExamVo vo) {
+    public ResultMessage save(@RequestBody ExamVo vo) {
         User user = getApiUser().getUser();
         Exam exam = ExamVo.of(vo);
         exam.setSchoolId(user.getSchoolId());
@@ -140,6 +141,7 @@ public class ExamController extends BaseApiController {
         sasConfig.accumulate("excellentScore", vo.getExcellentScore());
         exam.setSasConfig(sasConfig.toString());
         exam = examService.save(exam);
+        return resultOk();
     }
 
     @ApiOperation(value = "考试编辑")
@@ -147,7 +149,7 @@ public class ExamController extends BaseApiController {
     @Logging(menu = "编辑考试", type = LogType.UPDATE)
     @SuppressWarnings("unchecked")
     @RequestMapping(value = "update", method = RequestMethod.POST)
-    public void edit(@RequestBody ExamVo exam) {
+    public ResultMessage edit(@RequestBody ExamVo exam) {
         User user = getApiUser().getUser();
         Exam oldExam = examService.findById(exam.getId());
         if (oldExam != null && oldExam.getSchoolId().equals(user.getSchoolId())) {
@@ -187,6 +189,7 @@ public class ExamController extends BaseApiController {
             oldExam.setTrackCountPolicy(exam.getTrackCountPolicy());
             examService.save(oldExam);
         }
+        return resultOk();
     }
 
     @ApiOperation(value = "考试详情")

+ 370 - 568
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/MarkerController.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.api.controller.admin;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -35,6 +36,7 @@ import cn.com.qmth.stmms.admin.thread.MarkerResetThread;
 import cn.com.qmth.stmms.api.controller.BaseApiController;
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
 import cn.com.qmth.stmms.biz.exam.bean.MarkerVo;
+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.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -46,6 +48,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exception.StatusException;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
@@ -60,7 +63,6 @@ import cn.com.qmth.stmms.biz.utils.PageUtil;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
-import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
@@ -71,9 +73,11 @@ import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 
+@Api(tags = "评卷员管理")
 @Controller("adminMarkerController")
 @RequestMapping("/api/admin/exam/marker")
 public class MarkerController extends BaseApiController {
@@ -131,6 +135,7 @@ public class MarkerController extends BaseApiController {
     @Value("${mark.group.delete}")
     private String markDeleteCode;
 
+    @ApiOperation(value = "评卷员分页查询")
     @Logging(menu = "评卷员查询", type = LogType.QUERY)
     @ResponseBody
     @RequestMapping(value = "list", method = RequestMethod.POST)
@@ -172,6 +177,7 @@ public class MarkerController extends BaseApiController {
         return PageUtil.of(ret, query);
     }
 
+    @ApiOperation(value = "重置是否弹窗确认")
     @ResponseBody
     @RequestMapping(value = "delete-check", method = RequestMethod.POST)
     public Boolean deleteCheck(MarkerSearchQuery query) {
@@ -181,569 +187,365 @@ public class MarkerController extends BaseApiController {
         return systemCache.isGroupDeleteWarn() ? true : school.isGroupDeleteCheck();
     }
 
-    // @RequestMapping("/query")
-    // @ResponseBody
-    // public JSONArray query(HttpServletRequest request, @RequestParam String
-    // subjectCode,
-    // @RequestParam(required = false) Integer groupNumber) {
-    // int examId = getSessionExamId(request);
-    // JSONArray array = new JSONArray();
-    // MarkerSearchQuery query = new MarkerSearchQuery();
-    // query.setExamId(examId);
-    // query.setSubjectCode(subjectCode);
-    // query.setGroupNumber(groupNumber);
-    // query.setPageSize(Integer.MAX_VALUE);
-    // List<Marker> list = markerService.findByQuery(query).getResult();
-    // for (Marker marker : list) {
-    // JSONObject obj = new JSONObject();
-    // obj.accumulate("id", marker.getId());
-    // User user = userService.findById(marker.getUserId());
-    // obj.accumulate("loginName", user.getLoginName());
-    // obj.accumulate("name", user.getName());
-    // array.add(obj);
-    // }
-    // return array;
-    // }
-    //
-    // @Logging(menu = "评卷员回收任务", type = LogType.UPDATE)
-    // @RequestMapping("/release")
-    // @ResponseBody
-    // @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN
-    // })
-    // public JSONObject release(@RequestParam Integer[] ids) {
-    // for (Integer id : ids) {
-    // Marker marker = markerService.findById(id);
-    // if (marker != null) {
-    // try {
-    // lockService.waitlock(LockType.MARKER, marker.getId());
-    // markService.releaseByMarker(marker);
-    // } catch (Exception e) {
-    // log.error("release marker error", e);
-    // } finally {
-    // lockService.unlock(LockType.MARKER, marker.getId());
-    // }
-    // }
-    // }
-    // JSONObject result = new JSONObject();
-    // result.accumulate("success", true);
-    // return result;
-    // }
-    //
-    // // @RequestMapping("/batch-create")
-    // // @RoleRequire(Role.SCHOOL_ADMIN)
-    // // public String createInit(Model model, HttpServletRequest request,
-    // // @RequestParam(required = false) String subjectCode,
-    // // @RequestParam(required = false) Integer groupNumber) {
-    // // int examId = getSessionExamId(request);
-    // // model.addAttribute("subjectList", getExamSubject(examId,
-    // // RequestUtils.getWebUser(request)));
-    // // if (subjectCode != null) {
-    // // model.addAttribute("subjectCode", subjectCode);
-    // // model.addAttribute("groupList",
-    // groupService.findByExamAndSubject(examId,
-    // // subjectCode));
-    // // if (groupNumber != null) {
-    // // model.addAttribute("groupNumber", groupNumber);
-    // // }
-    // // } else {
-    // // model.addAttribute("groupList", new ArrayList<MarkGroup>());
-    // // }
-    // // return "modules/exam/markerCreate";
-    // // }
-    //
-    // // @Logging(menu = "创建评卷员", type = LogType.ADD)
-    // // @RequestMapping(value = "/batch-create", method = RequestMethod.POST)
-    // // @RoleRequire(Role.SCHOOL_ADMIN)
-    // // public ModelAndView create(HttpServletRequest request, @RequestParam
-    // // String subjectCode,
-    // // @RequestParam Integer groupNumber, @RequestParam Integer count,
-    // // @RequestParam(required = false) String password) {
-    // // int examId = getSessionExamId(request);
-    // // ExamSubject subject = subjectService.find(examId, subjectCode);
-    // // ModelAndView view = new ModelAndView("redirect:/admin/exam/marker");
-    // // if (subject != null && count > 0) {
-    // // // markerService.batchCreate(subject, groupNumber, count, password);
-    // // }
-    // // view.addObject("subjectCode", subjectCode);
-    // // if (groupNumber > 0) {
-    // // view.addObject("groupNumber", groupNumber);
-    // // }
-    // // return view;
-    // // }
-    //
-    // @Logging(menu = "评卷员重置", type = LogType.UPDATE)
-    // @RequestMapping(value = "/reset", method = RequestMethod.POST)
-    // @ResponseBody
-    // @RoleRequire(Role.SCHOOL_ADMIN)
-    // public JSONObject resetMarker(HttpServletRequest request, @RequestParam
-    // Integer id,
-    // @RequestParam(required = false) String deleteCode) {
-    // Marker marker = markerService.findById(id);
-    // JSONObject obj = new JSONObject();
-    // int examId = getSessionExamId(request);
-    // if (marker != null) {
-    // Exam exam = examService.findById(examId);
-    // School school = schoolService.findById(exam.getSchoolId());
-    // boolean warn = systemCache.isGroupDeleteWarn() ? true :
-    // school.isGroupDeleteCheck();
-    // MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(),
-    // marker.getGroupNumber());
-    // if (warn && group.getLibraryCount() != 0 && group.getLeftCount() == 0
-    // && !markDeleteCode.equals(deleteCode)) {
-    // obj.accumulate("success", false);
-    // obj.accumulate("message", "重置失败,授权码不正确");
-    // return obj;
-    // }
-    // if (group.getStatus() == MarkStatus.FINISH) {
-    // obj.accumulate("success", false);
-    // obj.accumulate("message", "重置失败,关联分组已关闭");
-    // return obj;
-    // }
-    // if (lockService.trylock(LockType.MARKER_RESET, marker.getId())) {
-    // taskExecutor.submit(new MarkerResetThread(marker, group, markService,
-    // libraryService, trialService,
-    // markerService, groupService, lockService));
-    // obj.accumulate("success", true);
-    // } else {
-    // obj.accumulate("success", false);
-    // obj.accumulate("message", "评卷员正在重置");
-    // }
-    // } else {
-    // obj.accumulate("success", false);
-    // obj.accumulate("message", "重置失败,该评卷员不存在");
-    // }
-    // return obj;
-    // }
-    //
-    // @Logging(menu = "评卷员禁用/启用", type = LogType.UPDATE)
-    // @RequestMapping(value = "/toggle", method = RequestMethod.POST)
-    // @ResponseBody
-    // @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN
-    // })
-    // public JSONObject toggle(@RequestParam Integer[] ids, @RequestParam
-    // Boolean enable) {
-    // for (Integer id : ids) {
-    // Marker marker = markerService.findById(id);
-    // if (marker != null) {
-    // marker.setEnable(enable);
-    // markerService.save(marker);
-    // }
-    // }
-    // JSONObject obj = new JSONObject();
-    // obj.accumulate("success", true);
-    // return obj;
-    // }
-    //
-    // // @Logging(menu = "评卷员导出", type = LogType.EXPORT)
-    // // @RequestMapping(value = "/export", method = RequestMethod.POST)
-    // // public String exportFile(MarkerSearchQuery query, HttpServletRequest
-    // // request, HttpServletResponse response,
-    // // RedirectAttributes redirectAttributes) {
-    // // WebUser wu = RequestUtils.getWebUser(request);
-    // // int examId = getSessionExamId(request);
-    // // query.setExamId(examId);
-    // // try {
-    // // query.setPageNumber(1);
-    // // query.setPageSize(Integer.MAX_VALUE);
-    // // query.setExamId(examId);
-    // // query.orderById();
-    // // subjectFilter(query, wu);
-    // // String fileName = "评卷员账号.xlsx";
-    // // query = markerService.findByQuery(query);
-    // // for (Marker marker : query.getResult()) {
-    // // ExamSubject subject = subjectService.find(examId,
-    // // marker.getSubjectCode());
-    // // if (subject != null) {
-    // // marker.setSubjectName(subject.getCode() + "-" + subject.getName());
-    // // } else {
-    // // marker.setSubjectName("");
-    // // }
-    // // MarkGroup group = groupService.findOne(examId,
-    // marker.getSubjectCode(),
-    // // marker.getGroupNumber());
-    // // if (group != null) {
-    // //
-    // group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-    // // group.getSubjectCode(), false, group.getNumber()));
-    // // marker.setGroupName(group.getNumber() + "-" + group.getTitle());
-    // // } else {
-    // // marker.setGroupName("");
-    // // }
-    // // }
-    // // new ExportExcel("评卷员数据",
-    // // Marker.class).setDataList(query.getResult()).write(response,
-    // // fileName).dispose();
-    // // return null;
-    // // } catch (Exception e) {
-    // // addMessage(redirectAttributes, "导出评卷员失败!" + e.getMessage());
-    // // }
-    // // return "redirect:/admin/exam/marker?repage";
-    // // }
-    //
-    // @Logging(menu = "评卷员重置密码", type = LogType.UPDATE)
-    // @RequestMapping(value = "/reSetPassword", method = RequestMethod.POST)
-    // @ResponseBody
-    // public JSONObject reSetPassword(@RequestParam Integer[] ids,
-    // @RequestParam String password) {
-    // for (Integer id : ids) {
-    // Marker marker = markerService.findById(id);
-    // User user = userService.findById(marker.getUserId());
-    // if (user == null) {
-    // continue;
-    // }
-    // password = StringEscapeUtils.unescapeHtml(password);
-    // user.setPassword(EncryptUtils.md5(password));
-    // user.setRandomPassword(null);
-    // user = userService.save(user);
-    // }
-    // JSONObject obj = new JSONObject();
-    // obj.accumulate("success", true);
-    // return obj;
-    // }
-    //
-    // @Logging(menu = "评卷员设置任务数量", type = LogType.UPDATE)
-    // @RequestMapping(value = "/setTaskCount", method = RequestMethod.POST)
-    // @ResponseBody
-    // public JSONObject setTaskCount(@RequestParam Integer[] ids, @RequestParam
-    // Integer taskCount) {
-    // for (Integer id : ids) {
-    // Marker marker = markerService.findById(id);
-    // if (marker != null) {
-    // marker.setTopCount(taskCount);
-    // marker = markerService.save(marker);
-    // }
-    // }
-    // JSONObject obj = new JSONObject();
-    // obj.accumulate("success", true);
-    // return obj;
-    // }
-    //
-    // @RequestMapping(value = "/template")
-    // public String importFileTemplate(HttpServletResponse response,
-    // RedirectAttributes redirectAttributes) {
-    // try {
-    // String fileName = "评卷员数据导入模板.xlsx";
-    // List<Marker> list = Lists.newArrayList();
-    // list.add(new Marker());
-    // new ExportExcel("评卷员数据", Marker.class,
-    // 2).setDataList(list).write(response, fileName).dispose();
-    // return null;
-    // } catch (Exception e) {
-    // addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
-    // }
-    // return "redirect:" + "/admin/exam/marker";
-    // }
-    //
-    // @Logging(menu = "评卷员导入", type = LogType.IMPORT_FILE)
-    // @RequestMapping(value = "/import", method = RequestMethod.POST)
-    // public String importFile(HttpServletRequest request, MultipartFile file,
-    // RedirectAttributes redirectAttributes,
-    // @RequestParam String subjectCode) {
-    // int examId = getSessionExamId(request);
-    // WebUser wu = RequestUtils.getWebUser(request);
-    // Integer schoolId = wu.getUser().getSchoolId();
-    // try {
-    // int successNum = 0;
-    // int failureNum = 0;
-    // StringBuilder failureMsg = new StringBuilder();
-    // ImportExcel ei = new ImportExcel(file, 1, 0);
-    // List<Marker> list = ei.getDataList(Marker.class);
-    //
-    // Map<String, User> userMap = new HashMap<String, User>();
-    // Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
-    // Map<String, MarkGroup> groupMap = new HashMap<String, MarkGroup>();
-    // Map<String, Marker> markerMap = new HashMap<String, Marker>();
-    // for (Marker marker : list) {
-    // if (StringUtils.isBlank(marker.getLoginName())) {
-    // failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," +
-    // marker.getSubjectCode()
-    // + MarkerExcelError.NAMENULL.getName());
-    // failureNum++;
-    // continue;
-    // }
-    // ExamSubject examSubject = subjectMap.get(marker.getSubjectCode());
-    // if (examSubject == null) {
-    // examSubject = subjectService.find(examId, marker.getSubjectCode());
-    // if (examSubject == null) {
-    // failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," +
-    // marker.getSubjectCode()
-    // + MarkerExcelError.CODENULL.getName());
-    // failureNum++;
-    // continue;
-    // }
-    // }
-    // MarkGroup markGroup = groupMap.get(marker.getSubjectCode() + "-" +
-    // marker.getGroupNumber());
-    // if (markGroup == null) {
-    // markGroup = groupService.findOne(examId, marker.getSubjectCode(),
-    // marker.getGroupNumber());
-    // if (markGroup == null) {
-    // failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," +
-    // marker.getSubjectCode()
-    // + MarkerExcelError.GROUPNULL.getName());
-    // failureNum++;
-    // continue;
-    // }
-    // }
-    // User user = userMap.get(marker.getLoginName().trim());
-    // if (user == null) {
-    // user = userService.findByLoginName(marker.getLoginName().trim());
-    // if (user != null && !schoolId.equals(user.getSchoolId())) {
-    // failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," +
-    // marker.getSubjectCode()
-    // + MarkerExcelError.NAMEUSED.getName());
-    // failureNum++;
-    // continue;
-    // }
-    // if (user != null && !user.getRole().equals(Role.MARKER)) {
-    // failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," +
-    // marker.getSubjectCode()
-    // + MarkerExcelError.NAMENOTMARKER.getName());
-    // failureNum++;
-    // continue;
-    // }
-    // if (user == null) {
-    // user = getUser(userMap, marker.getLoginName().trim(), schoolId);
-    // }
-    // }
-    // subjectMap.put(examSubject.getCode(), examSubject);
-    // groupMap.put(markGroup.getSubjectCode() + "-" + markGroup.getNumber(),
-    // markGroup);
-    // marker = getMarker(markerMap, examId, examSubject.getCode(),
-    // markGroup.getNumber(), user.getId());
-    // }
-    // List<Marker> saveList = new ArrayList<Marker>();
-    // for (Marker m : markerMap.values()) {
-    // saveList.add(m);
-    // }
-    // successNum = markerService.batchSave(saveList);
-    // if (failureNum > 0) {
-    // failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
-    // }
-    // String message = "已成功导入 " + successNum + " 条评卷员 ";
-    // addMessage(redirectAttributes, message + failureMsg);
-    // RequestUtils.setLog(request, message);
-    // } catch (Exception e) {
-    // log.error("Batch import marker error!", e);
-    // if (StringUtils.isBlank(e.getMessage())) {
-    // addMessage(redirectAttributes, "导入评卷员失败!");
-    // } else {
-    // addMessage(redirectAttributes, "导入评卷员失败!失败信息:" + e.getMessage());
-    // }
-    // }
-    // return "redirect:" + "/admin/exam/marker?subjectCode=" + subjectCode;
-    // }
-    //
-    // private Marker getMarker(Map<String, Marker> markerMap, int examId,
-    // String subjectCode, Integer groupNumber,
-    // Integer userId) {
-    // String key = examId + "-" + subjectCode + "-" + groupNumber + "-" +
-    // userId;
-    // Marker marker = markerMap.get(key);
-    // if (marker == null) {
-    // marker = markerService.findByExamAndSubjectAndNumberAndUserId(examId,
-    // subjectCode, groupNumber, userId);
-    // }
-    // if (marker == null) {
-    // marker = new Marker();
-    // marker.setExamId(examId);
-    // marker.setSubjectCode(subjectCode);
-    // marker.setGroupNumber(groupNumber);
-    // marker.setUserId(userId);
-    // marker.setEnable(true);
-    // }
-    // markerMap.put(key, marker);
-    // return marker;
-    // }
-    //
-    // private User getUser(Map<String, User> saveMap, String loginName, Integer
-    // schoolId) {
-    // User user = saveMap.get(loginName);
-    // if (user == null) {
-    // user = new User();
-    // user.setLoginName(loginName);
-    // user.setName(loginName);
-    // user.setPassword(EncryptUtils.md5(USER_PASSWORD));
-    // user.setRole(Role.MARKER);
-    // user.setSource(UserSource.INTERNAL);
-    // user.setSchoolId(schoolId);
-    // user.setEnable(true);
-    // user.setCreatedTime(new Date());
-    // userService.save(user);
-    // saveMap.put(loginName, user);
-    // }
-    // return user;
-    // }
-    //
-    // @RequestMapping("/save")
-    // public String add(Model model, HttpServletRequest request,
-    // UserSearchQuery query, @RequestParam String subjectCode,
-    // @RequestParam Integer groupNumber) {
-    // int examId = getSessionExamId(request);
-    // Exam exam = examService.findById(examId);
-    // query.setSchoolId(exam.getSchoolId());
-    // query.setRole(Role.MARKER);
-    // query = userService.findByQuery(query);
-    // model.addAttribute("query", query);
-    // model.addAttribute("subject", subjectService.find(examId, subjectCode));
-    // model.addAttribute("group", groupService.findOne(examId, subjectCode,
-    // groupNumber));
-    // return "modules/exam/markerSubject";
-    // }
-    //
-    // @Logging(menu = "评卷员绑定", type = LogType.ADD)
-    // @RequestMapping(value = "/add", method = RequestMethod.POST)
-    // public String save(@RequestParam String subjectCode, @RequestParam
-    // Integer groupNumber,
-    // @RequestParam Integer[] userIds, HttpServletRequest request,
-    // RedirectAttributes redirectAttributes) {
-    // int examId = getSessionExamId(request);
-    // MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
-    // if (group != null) {
-    // markerService.save(group, userIds);
-    // addMessage(redirectAttributes, "设置成功");
-    // return "redirect:/admin/exam/marker?subjectCode=" + subjectCode +
-    // "&groupNumber=" + groupNumber;
-    // }
-    // addMessage(redirectAttributes, "科目分组不存在");
-    // return "redirect:/admin/exam/marker";
-    // }
-    //
-    // @RequestMapping("/delete")
-    // public String delete(@RequestParam Integer markerId, RedirectAttributes
-    // redirectAttributes) {
-    // Marker marker = markerService.findById(markerId);
-    // if (marker == null) {
-    // return "redirect:/admin/exam/marker";
-    // }
-    // long count = libraryService.countByMarker(markerId);
-    // long trialCount =
-    // trialService.countByMarkerIdAndMarkerScoreIsNotNull(markerId);
-    // long rejectCount = rejectHistoryService.countByMarkerId(markerId);
-    // int examId = marker.getExamId();
-    // String subjectCode = marker.getSubjectCode();
-    // Integer groupNumber = marker.getGroupNumber();
-    // if (count > 0 || trialCount > 0 || rejectCount > 0) {
-    // addMessage(redirectAttributes, "删除评卷员失败,该评卷员已开始评卷");
-    // } else {
-    // try {
-    // lockService.watch(LockType.EXAM_SUBJECT, examId, subjectCode);
-    // lockService.watch(LockType.GROUP, examId, subjectCode, groupNumber);
-    // lockService.waitlock(LockType.MARKER, markerId);
-    // markService.deleteMarker(marker);
-    // } catch (Exception e) {
-    // log.error("release marker error", e);
-    // } finally {
-    // lockService.unlock(LockType.MARKER, markerId);
-    // lockService.unwatch(LockType.GROUP, examId, subjectCode, groupNumber);
-    // lockService.unwatch(LockType.EXAM_SUBJECT, examId, subjectCode);
-    // }
-    // }
-    // return "redirect:/admin/exam/marker?subjectCode=" + subjectCode +
-    // "&groupNumber=" + groupNumber;
-    // }
-    //
-    // @RequestMapping(value = "/class/{markerId}", method = RequestMethod.GET)
-    // public String classList(@PathVariable Integer markerId, Model model,
-    // RedirectAttributes redirectAttributes) {
-    // Marker marker = markerService.findById(markerId);
-    // if (marker != null) {
-    // marker.setUser(userService.findById(marker.getUserId()));
-    // model.addAttribute("marker", marker);
-    // Set<String> classes =
-    // classService.findClassNameByUserIdAndExamId(marker.getUserId(),
-    // marker.getExamId());
-    // model.addAttribute("classes", classes);
-    // return "modules/exam/markerClass";
-    // }
-    // addMessage(redirectAttributes, "评卷员不存在");
-    // return "redirect:/admin/exam/marker";
-    // }
-    //
-    // @Logging(menu = "评卷员班级绑定", type = LogType.UPDATE)
-    // @RequestMapping(value = "/class/{markerId}", method = RequestMethod.POST)
-    // public String classSave(@PathVariable Integer markerId,
-    // @RequestParam(required = false) String[] classes,
-    // Model model, RedirectAttributes redirectAttributes) {
-    // Marker marker = markerService.findById(markerId);
-    // if (marker != null) {
-    // classService.save(marker.getUserId(), marker.getExamId(), classes);
-    // addMessage(redirectAttributes, "保存成功");
-    // return "redirect:" + "/admin/exam/marker?subjectCode=" +
-    // marker.getSubjectCode() + "&groupNumber="
-    // + marker.getGroupNumber();
-    // }
-    // addMessage(redirectAttributes, "评卷员不存在");
-    // return "redirect:/admin/exam/marker";
-    // }
-    //
-    // @Logging(menu = "评卷员班级清空", type = LogType.DELETE)
-    // @RequestMapping(value = "/class/delete", method = RequestMethod.GET)
-    // public String classDelete(@RequestParam Integer markerId, Model model,
-    // RedirectAttributes redirectAttributes) {
-    // Marker marker = markerService.findById(markerId);
-    // if (marker != null) {
-    // classService.deleteByUserIdAndExamId(marker.getUserId(),
-    // marker.getExamId());
-    // addMessage(redirectAttributes, "清空成功");
-    // return "redirect:" + "/admin/exam/marker?subjectCode=" +
-    // marker.getSubjectCode() + "&groupNumber="
-    // + marker.getGroupNumber();
-    // }
-    // addMessage(redirectAttributes, "评卷员不存在");
-    // return "redirect:/admin/exam/marker";
-    // }
-    //
-    // // @RequestMapping(value = "/account/{markerId}")
-    // // public String editAccount(HttpServletRequest request, Model model,
-    // // RedirectAttributes redirectAttributes,
-    // // @PathVariable Integer markerId) {
-    // // Exam exam = examService.findById(getSessionExamId(request));
-    // // Marker marker = markerService.findById(markerId);
-    // // if (exam != null && marker != null &&
-    // // exam.getId().equals(marker.getExamId())) {
-    // // model.addAttribute("marker", marker);
-    // // model.addAttribute("openAccountList",
-    // // userService.listUnbindOpenAccount(exam.getSchoolId(),
-    // // marker.getExamId(), marker.getSubjectCode(),
-    // marker.getGroupNumber()));
-    // // return "modules/exam/markerAccount";
-    // // }
-    // // addMessage(redirectAttributes, "评卷员不存在");
-    // // return "redirect:/admin/exam/marker";
-    // // }
-    //
-    // // @RequestMapping(value = "/account/bind", method = RequestMethod.POST)
-    // // @ResponseBody
-    // // @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    // // public boolean bindAccount(@RequestParam Integer markerId,
-    // @RequestParam
-    // // Integer accountId) {
-    // // Marker marker = markerService.findById(markerId);
-    // // if (marker == null) {
-    // // return false;
-    // // }
-    // // OpenAccount oa = userService.findOpenAccount(accountId);
-    // // if (oa == null || !oa.isEnable()) {
-    // // return false;
-    // // }
-    // // if
-    // //
-    // (markerService.countByExamAndSubjectAndGroupAndOpenAccount(marker.getExamId(),
-    // // marker.getSubjectCode(),
-    // // marker.getGroupNumber(), accountId) == 0) {
-    // // markerService.updateOpenAccountById(markerId, accountId);
-    // // return true;
-    // // }
-    // // return false;
-    // // }
-    //
-    // // @RequestMapping(value = "/account/unbind", method =
-    // RequestMethod.POST)
-    // // @ResponseBody
-    // // @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    // // public boolean unbindOpenAccount(@RequestParam Integer markerId) {
-    // // markerService.updateOpenAccountById(markerId, null);
-    // // return true;
-    // // }
+    @ApiOperation(value = "评卷员下拉列表")
+    @RequestMapping(value = "query", method = RequestMethod.POST)
+    @ResponseBody
+    public List<MarkerVo> query(@RequestParam String subjectCode, @RequestParam(required = false) Integer groupNumber) {
+        int examId = getSessionExamId();
+        List<MarkerVo> array = new ArrayList<>();
+        MarkerSearchQuery query = new MarkerSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        query.setGroupNumber(groupNumber);
+        query.setPageSize(Integer.MAX_VALUE);
+        List<Marker> list = markerService.findByQuery(query).getResult();
+        for (Marker marker : list) {
+            MarkerVo obj = new MarkerVo();
+            obj.setId(marker.getId());
+            User user = userService.findById(marker.getUserId());
+            obj.setLoginName(user.getLoginName());
+            obj.setName(user.getName());
+            array.add(obj);
+        }
+        return array;
+    }
+
+    @ApiOperation(value = "回收")
+    @Logging(menu = "评卷员回收任务", type = LogType.UPDATE)
+    @RequestMapping(value = "release", method = RequestMethod.POST)
+    @ResponseBody
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
+    public ResultMessage release(@RequestParam Integer[] ids) {
+        for (Integer id : ids) {
+            Marker marker = markerService.findById(id);
+            if (marker != null) {
+                try {
+                    lockService.waitlock(LockType.MARKER, marker.getId());
+                    markService.releaseByMarker(marker);
+                } catch (Exception e) {
+                    log.error("release marker error", e);
+                    throw new RuntimeException("回收出错", e);
+                } finally {
+                    lockService.unlock(LockType.MARKER, marker.getId());
+                }
+            }
+        }
+        return resultOk();
+    }
+
+    @ApiOperation(value = "评卷员重置")
+    @Logging(menu = "评卷员重置", type = LogType.UPDATE)
+    @RequestMapping(value = "reset", method = RequestMethod.POST)
+    @ResponseBody
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public ResultMessage resetMarker(@RequestParam Integer id,
+            @ApiParam("授权码") @RequestParam(required = false) String deleteCode) {
+        Marker marker = markerService.findById(id);
+        int examId = getSessionExamId();
+        if (marker != null) {
+            Exam exam = examService.findById(examId);
+            School school = schoolService.findById(exam.getSchoolId());
+            boolean warn = systemCache.isGroupDeleteWarn() ? true : school.isGroupDeleteCheck();
+            MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
+            if (warn && group.getLibraryCount() != 0 && group.getLeftCount() == 0
+                    && !markDeleteCode.equals(deleteCode)) {
+                throw new StatusException("重置失败,授权码不正确");
+            }
+            if (group.getStatus() == MarkStatus.FINISH) {
+                throw new StatusException("重置失败,关联分组已关闭");
+            }
+            if (lockService.trylock(LockType.MARKER_RESET, marker.getId())) {
+                taskExecutor.submit(new MarkerResetThread(marker, group, markService, libraryService, trialService,
+                        markerService, groupService, lockService));
+                return resultOk();
+            } else {
+                throw new StatusException("评卷员正在重置");
+            }
+        } else {
+            throw new StatusException("重置失败,该评卷员不存在");
+        }
+    }
+
+    @ApiOperation(value = "评卷员禁用、启用")
+    @Logging(menu = "评卷员禁用/启用", type = LogType.UPDATE)
+    @RequestMapping(value = "toggle", method = RequestMethod.POST)
+    @ResponseBody
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
+    public ResultMessage toggle(@RequestParam Integer[] ids, @RequestParam Boolean enable) {
+        for (Integer id : ids) {
+            Marker marker = markerService.findById(id);
+            if (marker != null) {
+                marker.setEnable(enable);
+                markerService.save(marker);
+            }
+        }
+        return resultOk();
+    }
+
+    @ApiOperation(value = "重置密码")
+    @Logging(menu = "评卷员重置密码", type = LogType.UPDATE)
+    @RequestMapping(value = "reset-password", method = RequestMethod.POST)
+    @ResponseBody
+    public ResultMessage reSetPassword(@RequestParam Integer[] ids, @RequestParam String password) {
+        for (Integer id : ids) {
+            Marker marker = markerService.findById(id);
+            User user = userService.findById(marker.getUserId());
+            if (user == null) {
+                continue;
+            }
+            password = StringEscapeUtils.unescapeHtml(password);
+            user.setPassword(EncryptUtils.md5(password));
+            user.setRandomPassword(null);
+            user = userService.save(user);
+        }
+        return resultOk();
+    }
+
+    @ApiOperation(value = "设置任务数量")
+    @Logging(menu = "评卷员设置任务数量", type = LogType.UPDATE)
+    @RequestMapping(value = "set-task-count", method = RequestMethod.POST)
+    @ResponseBody
+    public ResultMessage setTaskCount(@RequestParam Integer[] ids, @RequestParam Integer taskCount) {
+        for (Integer id : ids) {
+            Marker marker = markerService.findById(id);
+            if (marker != null) {
+                marker.setTopCount(taskCount);
+                marker = markerService.save(marker);
+            }
+        }
+        return resultOk();
+    }
+
+    @ResponseBody
+    @ApiOperation(value = "导入模版下载")
+    @RequestMapping(value = "template", method = RequestMethod.POST)
+    public void importFileTemplate(HttpServletResponse response) {
+        String fileName = "评卷员数据导入模板.xlsx";
+        List<Marker> list = Lists.newArrayList();
+        list.add(new Marker());
+        try {
+            new ExportExcel("评卷员数据", Marker.class, 2).setDataList(list).write(response, fileName).dispose();
+        } catch (IOException e) {
+            throw new RuntimeException("导入模板下载失败", e);
+        }
+    }
+
+    @ResponseBody
+    @ApiOperation(value = "导入")
+    @Logging(menu = "评卷员导入", type = LogType.IMPORT_FILE)
+    @RequestMapping(value = "import", method = RequestMethod.POST)
+    public ResultMessage importFile(MultipartFile file, @RequestParam String subjectCode) {
+        ResultMessage ret = new ResultMessage();
+        int examId = getSessionExamId();
+        ApiUser wu = RequestUtils.getApiUser();
+        Integer schoolId = wu.getUser().getSchoolId();
+        try {
+            int successNum = 0;
+            int failureNum = 0;
+            StringBuilder failureMsg = new StringBuilder();
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<Marker> list = ei.getDataList(Marker.class);
+
+            Map<String, User> userMap = new HashMap<String, User>();
+            Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
+            Map<String, MarkGroup> groupMap = new HashMap<String, MarkGroup>();
+            Map<String, Marker> markerMap = new HashMap<String, Marker>();
+            for (Marker marker : list) {
+                if (StringUtils.isBlank(marker.getLoginName())) {
+                    failureMsg.append("\r\n评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
+                            + MarkerExcelError.NAMENULL.getName());
+                    failureNum++;
+                    continue;
+                }
+                ExamSubject examSubject = subjectMap.get(marker.getSubjectCode());
+                if (examSubject == null) {
+                    examSubject = subjectService.find(examId, marker.getSubjectCode());
+                    if (examSubject == null) {
+                        failureMsg.append("\r\n评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
+                                + MarkerExcelError.CODENULL.getName());
+                        failureNum++;
+                        continue;
+                    }
+                }
+                MarkGroup markGroup = groupMap.get(marker.getSubjectCode() + "-" + marker.getGroupNumber());
+                if (markGroup == null) {
+                    markGroup = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
+                    if (markGroup == null) {
+                        failureMsg.append("\r\n评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
+                                + MarkerExcelError.GROUPNULL.getName());
+                        failureNum++;
+                        continue;
+                    }
+                }
+                User user = userMap.get(marker.getLoginName().trim());
+                if (user == null) {
+                    user = userService.findByLoginName(marker.getLoginName().trim());
+                    if (user != null && !schoolId.equals(user.getSchoolId())) {
+                        failureMsg.append("\r\n评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
+                                + MarkerExcelError.NAMEUSED.getName());
+                        failureNum++;
+                        continue;
+                    }
+                    if (user != null && !user.getRole().equals(Role.MARKER)) {
+                        failureMsg.append("\r\n评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
+                                + MarkerExcelError.NAMENOTMARKER.getName());
+                        failureNum++;
+                        continue;
+                    }
+                    if (user == null) {
+                        user = getUser(userMap, marker.getLoginName().trim(), schoolId);
+                    }
+                }
+                subjectMap.put(examSubject.getCode(), examSubject);
+                groupMap.put(markGroup.getSubjectCode() + "-" + markGroup.getNumber(), markGroup);
+                marker = getMarker(markerMap, examId, examSubject.getCode(), markGroup.getNumber(), user.getId());
+            }
+            List<Marker> saveList = new ArrayList<Marker>();
+            for (Marker m : markerMap.values()) {
+                saveList.add(m);
+            }
+            successNum = markerService.batchSave(saveList);
+            if (failureNum > 0) {
+                failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
+            }
+            String message = "已成功导入 " + successNum + " 条评卷员 ";
+            ret.setSuccess(true);
+            ret.setMessage(message + failureMsg);
+            RequestUtils.setLog(message);
+        } catch (Exception e) {
+            log.error("Batch import marker error!", e);
+            throw new RuntimeException("导入评卷员失败", e);
+        }
+        return ret;
+    }
+
+    private Marker getMarker(Map<String, Marker> markerMap, int examId, String subjectCode, Integer groupNumber,
+            Integer userId) {
+        String key = examId + "-" + subjectCode + "-" + groupNumber + "-" + userId;
+        Marker marker = markerMap.get(key);
+        if (marker == null) {
+            marker = markerService.findByExamAndSubjectAndNumberAndUserId(examId, subjectCode, groupNumber, userId);
+        }
+        if (marker == null) {
+            marker = new Marker();
+            marker.setExamId(examId);
+            marker.setSubjectCode(subjectCode);
+            marker.setGroupNumber(groupNumber);
+            marker.setUserId(userId);
+            marker.setEnable(true);
+        }
+        markerMap.put(key, marker);
+        return marker;
+    }
+
+    private User getUser(Map<String, User> saveMap, String loginName, Integer schoolId) {
+        User user = saveMap.get(loginName);
+        if (user == null) {
+            user = new User();
+            user.setLoginName(loginName);
+            user.setName(loginName);
+            user.setPassword(EncryptUtils.md5(USER_PASSWORD));
+            user.setRole(Role.MARKER);
+            user.setSource(UserSource.INTERNAL);
+            user.setSchoolId(schoolId);
+            user.setEnable(true);
+            user.setCreatedTime(new Date());
+            userService.save(user);
+            saveMap.put(loginName, user);
+        }
+        return user;
+    }
+
+    @ResponseBody
+    @ApiOperation(value = "评卷员绑定")
+    @Logging(menu = "评卷员绑定", type = LogType.ADD)
+    @RequestMapping(value = "add", method = RequestMethod.POST)
+    public ResultMessage add(@RequestParam String subjectCode, @RequestParam Integer groupNumber,
+            @RequestParam Integer[] userIds) {
+        int examId = getSessionExamId();
+        MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
+        if (group != null) {
+            markerService.save(group, userIds);
+            return resultOk();
+        } else {
+            throw new StatusException("科目分组不存在");
+        }
+    }
+
+    @ApiOperation(value = "解绑")
+    @ResponseBody
+    @RequestMapping(value = "delete", method = RequestMethod.POST)
+    public ResultMessage delete(@RequestParam Integer markerId) {
+        Marker marker = markerService.findById(markerId);
+        if (marker == null) {
+            throw new StatusException("未找到评卷员信息");
+        }
+        long count = libraryService.countByMarker(markerId);
+        long trialCount = trialService.countByMarkerIdAndMarkerScoreIsNotNull(markerId);
+        long rejectCount = rejectHistoryService.countByMarkerId(markerId);
+        int examId = marker.getExamId();
+        String subjectCode = marker.getSubjectCode();
+        Integer groupNumber = marker.getGroupNumber();
+        if (count > 0 || trialCount > 0 || rejectCount > 0) {
+            throw new StatusException("删除评卷员失败,该评卷员已开始评卷");
+        } else {
+            try {
+                lockService.watch(LockType.EXAM_SUBJECT, examId, subjectCode);
+                lockService.watch(LockType.GROUP, examId, subjectCode, groupNumber);
+                lockService.waitlock(LockType.MARKER, markerId);
+                markService.deleteMarker(marker);
+            } catch (Exception e) {
+                log.error("release marker error", e);
+                throw new RuntimeException("解绑出错", e);
+            } finally {
+                lockService.unlock(LockType.MARKER, markerId);
+                lockService.unwatch(LockType.GROUP, examId, subjectCode, groupNumber);
+                lockService.unwatch(LockType.EXAM_SUBJECT, examId, subjectCode);
+            }
+        }
+        return resultOk();
+    }
+
+    /*
+     * TODO
+     * 
+     * @RequestMapping(value = "/class/{markerId}", method = RequestMethod.GET)
+     * public String classList(@PathVariable Integer markerId, Model model,
+     * RedirectAttributes redirectAttributes) { Marker marker =
+     * markerService.findById(markerId); if (marker != null) {
+     * marker.setUser(userService.findById(marker.getUserId()));
+     * model.addAttribute("marker", marker); Set<String> classes =
+     * classService.findClassNameByUserIdAndExamId(marker.getUserId(),
+     * marker.getExamId()); model.addAttribute("classes", classes); return
+     * "modules/exam/markerClass"; } addMessage(redirectAttributes, "评卷员不存在");
+     * return "redirect:/admin/exam/marker"; }
+     * 
+     * @Logging(menu = "评卷员班级绑定", type = LogType.UPDATE)
+     * 
+     * @RequestMapping(value = "/class/{markerId}", method = RequestMethod.POST)
+     * public String classSave(@PathVariable Integer
+     * markerId, @RequestParam(required = false) String[] classes, Model model,
+     * RedirectAttributes redirectAttributes) { Marker marker =
+     * markerService.findById(markerId); if (marker != null) {
+     * classService.save(marker.getUserId(), marker.getExamId(), classes);
+     * addMessage(redirectAttributes, "保存成功"); return "redirect:" +
+     * "/admin/exam/marker?subjectCode=" + marker.getSubjectCode() +
+     * "&groupNumber=" + marker.getGroupNumber(); }
+     * addMessage(redirectAttributes, "评卷员不存在"); return
+     * "redirect:/admin/exam/marker"; }
+     * 
+     * @Logging(menu = "评卷员班级清空", type = LogType.DELETE)
+     * 
+     * @RequestMapping(value = "/class/delete", method = RequestMethod.GET)
+     * public String classDelete(@RequestParam Integer markerId, Model model,
+     * RedirectAttributes redirectAttributes) { Marker marker =
+     * markerService.findById(markerId); if (marker != null) {
+     * classService.deleteByUserIdAndExamId(marker.getUserId(),
+     * marker.getExamId()); addMessage(redirectAttributes, "清空成功"); return
+     * "redirect:" + "/admin/exam/marker?subjectCode=" + marker.getSubjectCode()
+     * + "&groupNumber=" + marker.getGroupNumber(); }
+     * addMessage(redirectAttributes, "评卷员不存在"); return
+     * "redirect:/admin/exam/marker"; }
+     */
+
 }

+ 3 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/RoleController.java

@@ -23,6 +23,7 @@ import cn.com.qmth.stmms.biz.basic.model.Privilege;
 import cn.com.qmth.stmms.biz.basic.service.PrivilegeService;
 import cn.com.qmth.stmms.biz.basic.service.RoleInfoService;
 import cn.com.qmth.stmms.biz.basic.service.RolePrivilegeService;
+import cn.com.qmth.stmms.biz.exam.bean.ResultMessage;
 import cn.com.qmth.stmms.biz.exception.StatusException;
 import cn.com.qmth.stmms.biz.utils.PageUtil;
 import cn.com.qmth.stmms.common.domain.ApiUser;
@@ -107,7 +108,7 @@ public class RoleController extends BaseApiController {
     @ApiOperation(value = "保存权限")
     @ResponseBody
     @RequestMapping(value = "privilege/save", method = RequestMethod.POST)
-    public void privilegeSave(RolePrivilegeDomain domain) {
+    public ResultMessage privilegeSave(RolePrivilegeDomain domain) {
         if (StringUtils.isBlank(domain.getRole())) {
             throw new StatusException("role不能为空");
         }
@@ -117,6 +118,6 @@ public class RoleController extends BaseApiController {
         ApiUser wu = getApiUser();
         domain.setUserId(wu.getUser().getId());
         rolePrivilegeService.save(domain);
+        return resultOk();
     }
-
 }

+ 4 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/RequestUtils.java

@@ -200,6 +200,10 @@ public class RequestUtils {
         }
     }
 
+    public static void setLog(String content) {
+        getRequest().setAttribute(REQUEST_OPERATION_LOG_KEY, content);
+    }
+
     public static void setLog(HttpServletRequest request, String content) {
         request.setAttribute(REQUEST_OPERATION_LOG_KEY, content);
     }