xiatian 2 روز پیش
والد
کامیت
3a5710c83c

+ 13 - 0
pom.xml

@@ -33,7 +33,20 @@
     </properties>
 
     <dependencyManagement>
+    
         <dependencies>
+                <!-- swagger -->  
+        <dependency>  
+            <groupId>io.springfox</groupId>  
+            <artifactId>springfox-swagger2</artifactId>  
+            <version>2.6.1</version>  
+        </dependency>  
+		<dependency>
+			<groupId>com.github.xiaoymin</groupId>
+			<artifactId>swagger-bootstrap-ui</artifactId>
+			<version>1.9.6</version>
+		</dependency>
+				<!-- swagger -->  
             <!-- ======================================== -->
             <!-- 子项目依赖 -->
             <!-- ======================================== -->

+ 384 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/MarkerVo.java

@@ -0,0 +1,384 @@
+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;
+
+public class MarkerVo {
+
+    private Integer id;
+
+    private Integer examId;
+
+    private String subjectCode;
+
+    private Integer groupNumber;
+
+    private Integer userId;
+
+    private Boolean enable;
+
+    private MarkMode mode;
+
+    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;
+
+    private String loginName;
+
+    private ExamSubject subject;
+
+    private MarkGroup group;
+
+    private Long markedCount;
+
+    private Long markedCountNa;
+
+    private Long currentCount;
+
+    private User user;
+
+    private Boolean reseting;
+
+    /**
+     * 班级数量
+     */
+    private Long classCount;
+
+    private Long arbitrateCount;
+
+    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 MarkGroup getGroup() {
+        return group;
+    }
+
+    public void setGroup(MarkGroup group) {
+        this.group = group;
+    }
+
+    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 MarkerVo of(Marker from) {
+        MarkerVo ret = new MarkerVo();
+        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.setGroup(from.getGroup());
+        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;
+    }
+}

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PageUtil.java

@@ -9,7 +9,7 @@ import cn.com.qmth.stmms.biz.common.BaseQuery;
 
 public class PageUtil {
 
-    public static <T> PageResult<T> of(List<T> list, BaseQuery<T> query) {
+    public static <T, K> PageResult<T> of(List<T> list, BaseQuery<K> query) {
         PageResult<T> pageResult = new PageResult<>();
         pageResult.setResult(list);
         pageResult.setPageNumber(query.getPageNumber());

+ 9 - 0
stmms-web/pom.xml

@@ -14,6 +14,15 @@
 	<name>stmms-web</name>
 	<url>http://maven.apache.org</url>
 	<dependencies>
+        <dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+		</dependency>
+        <dependency>
+			<groupId>com.github.xiaoymin</groupId>
+			<artifactId>swagger-bootstrap-ui</artifactId>
+		</dependency>
+
 		<dependency>
 			<groupId>cn.com.qmth.stmms</groupId>
 			<artifactId>stmms-biz</artifactId>

+ 39 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/config/SwaggerConfig.java

@@ -0,0 +1,39 @@
+package cn.com.qmth.stmms.admin.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@EnableSwagger2
+public class SwaggerConfig extends WebMvcConfigurationSupport {
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
+                // 扫描指定包中的swagger注解
+                .apis(RequestHandlerSelectors.basePackage("cn.com.qmth.stmms.api.controller.admin"))
+                // 扫描所有有注解的api,用这种方式更灵活
+                // .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                .paths(PathSelectors.any()).build();
+    }
+
+    @Bean
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder().title("RESTful APIs").build();
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+    }
+
+}

+ 2 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/CopyObjectCodeGenerator.java

@@ -2,14 +2,14 @@ package cn.com.qmth.stmms.admin.utils;
 
 import java.lang.reflect.Field;
 
-import cn.com.qmth.stmms.biz.exam.bean.ExamVo;
+import cn.com.qmth.stmms.biz.exam.bean.MarkerVo;
 
 /**
  * 对象复制,属性copy代码生成
  */
 public class CopyObjectCodeGenerator {
 
-    private static Object ob = new ExamVo();
+    private static Object ob = new MarkerVo();
 
     private static String setName = "ret";
 

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

@@ -0,0 +1,749 @@
+package cn.com.qmth.stmms.api.controller.admin;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringEscapeUtils;
+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.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+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.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.qmth.boot.core.collection.PageResult;
+
+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.model.Exam;
+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.exam.query.MarkerSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.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.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.mark.service.RejectHistoryService;
+import cn.com.qmth.stmms.biz.mark.service.TrialService;
+import cn.com.qmth.stmms.biz.school.model.School;
+import cn.com.qmth.stmms.biz.school.service.SchoolService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
+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;
+import cn.com.qmth.stmms.common.enums.MarkerExcelError;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
+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;
+
+@Controller("adminMarkerController")
+@RequestMapping("/api/admin/exam/marker")
+public class MarkerController extends BaseApiController {
+
+    protected static Logger log = LoggerFactory.getLogger(MarkerController.class);
+
+    public static final String USER_PASSWORD = "123456";
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private MarkerService markerService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private MarkGroupService groupService;
+
+    @Autowired
+    private MarkService markService;
+
+    @Autowired
+    private LockService lockService;
+
+    @Autowired
+    private MarkerClassService classService;
+
+    @Autowired
+    private ExamQuestionService questionService;
+
+    @Autowired
+    private MarkLibraryService libraryService;
+
+    @Autowired
+    private TrialService trialService;
+
+    @Qualifier("task-executor")
+    @Autowired
+    private AsyncTaskExecutor taskExecutor;
+
+    @Autowired
+    private SchoolService schoolService;
+
+    @Autowired
+    private RejectHistoryService rejectHistoryService;
+
+    @Autowired
+    private SystemCache systemCache;
+
+    @Value("${mark.group.delete}")
+    private String markDeleteCode;
+
+    @Logging(menu = "评卷员查询", type = LogType.QUERY)
+    @ResponseBody
+    @RequestMapping(value = "list", method = RequestMethod.POST)
+    public PageResult<MarkerVo> getPage(MarkerSearchQuery query) {
+        ApiUser wu = getApiUser();
+        int examId = getSessionExamId();
+        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.orderById();
+        query = markerService.findByQuery(query);
+        List<MarkerVo> ret = new ArrayList<>();
+        for (Marker marker : query.getResult()) {
+            marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
+            MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
+            int percent = group.getLibraryCount() > 0
+                    ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount())
+                    : 0;
+            if (group.getMarkedCount() > 0 && percent == 0) {
+                percent = 1;
+            } else if (group.getLeftCount() > 0 && percent == 100) {
+                percent = 99;
+            }
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                    marker.getSubjectCode(), false, group.getNumber()));
+            group.setPercent(percent);
+            marker.setGroup(group);
+            marker.setMarkedCount(markService.markedCount(marker));
+            marker.setCurrentCount(markService.applyCount(marker));
+            marker.setUser(userService.findById(marker.getUserId()));
+            marker.setReseting(lockService.isLocked(LockType.MARKER_RESET, marker.getId()));
+            marker.setClassCount(classService.countByUserIdAndExamId(marker.getUserId(), examId));
+            ret.add(MarkerVo.of(marker));
+        }
+        return PageUtil.of(ret, query);
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "delete-check", method = RequestMethod.POST)
+    public Boolean deleteCheck(MarkerSearchQuery query) {
+        int examId = getSessionExamId();
+        Exam exam = examService.findById(examId);
+        School school = schoolService.findById(exam.getSchoolId());
+        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;
+    // // }
+}

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

@@ -26,7 +26,10 @@ import cn.com.qmth.stmms.biz.basic.service.RolePrivilegeService;
 import cn.com.qmth.stmms.biz.exception.StatusException;
 import cn.com.qmth.stmms.biz.utils.PageUtil;
 import cn.com.qmth.stmms.common.domain.ApiUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 
+@Api(tags = "角色权限")
 @Controller
 @RequestMapping("/api/admin/role")
 public class RoleController extends BaseApiController {
@@ -40,6 +43,7 @@ public class RoleController extends BaseApiController {
     @Autowired
     private PrivilegeService privilegeService;
 
+    @ApiOperation(value = "角色分页查询")
     @ResponseBody
     @RequestMapping(value = "page", method = RequestMethod.POST)
     public PageResult<RoleInfoVo> getPage(RoleInfoQuery query) {

+ 1 - 0
stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml

@@ -179,4 +179,5 @@
         <property name="defaultEncoding" value="UTF-8"/>
         <property name="basenames" value="/static/i18n/messages"/>
     </bean>
+<bean class="cn.com.qmth.stmms.admin.config.SwaggerConfig" />
 </beans>