Browse Source

美术阅卷10月屏蔽和优化task

wangliang 5 years ago
parent
commit
5d00b4635d
31 changed files with 2393 additions and 511 deletions
  1. 36 37
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/LoginInterceptor.java
  2. 8 8
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/api/AuthApi.java
  3. 1 1
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/AccessConfig.java
  4. 24 0
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/AdminLoginConfig.java
  5. 24 0
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/ClientLoginConfig.java
  6. 15 22
      stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/LoginConfig.java
  7. 46 7
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java
  8. 127 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/ExportLevelResultDTO.java
  9. 63 0
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/HeaderNode.java
  10. 414 10
      stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/ScoreExporter.java
  11. 86 85
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  12. 9 2
      stmms-ms-commons/pom.xml
  13. 5 0
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/SystemConfig.java
  14. 136 0
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/PageInfo.java
  15. 825 0
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/SqlUtil.java
  16. 0 1
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/excel/ExcelWriter.java
  17. 32 5
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/excel/ExportUtils.java
  18. 102 100
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLog.java
  19. 8 7
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ExamQuestionRepo.java
  20. 8 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkSubjectRepo.java
  21. 43 23
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  22. 103 49
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/specification/StudentSpecification.java
  23. 12 5
      stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/MarkLogAop.java
  24. 15 9
      stmms-ms-main/src/main/resources/application-dev.properties
  25. 4 0
      stmms-ms-main/src/main/resources/application-gz.properties
  26. 4 0
      stmms-ms-main/src/main/resources/application-qmth.properties
  27. 74 38
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java
  28. 110 88
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java
  29. 38 7
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  30. 13 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  31. 8 7
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

+ 36 - 37
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/LoginInterceptor.java

@@ -1,51 +1,50 @@
 package cn.com.qmth.stmms.ms.accesscontrol;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import cn.com.qmth.stmms.ms.accesscontrol.config.LoginConfig;
+import cn.com.qmth.stmms.ms.core.domain.user.AbstractUser;
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
-import cn.com.qmth.stmms.ms.accesscontrol.config.LoginConfig;
-import cn.com.qmth.stmms.ms.core.domain.user.AbstractUser;
-import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 public class LoginInterceptor extends HandlerInterceptorAdapter {
-	
+
     @Autowired
     private MarkUserRepo markUserRepo;
-    
+
     @Autowired
     private LoginConfig loginConfig;
 
-	@Override
-	public boolean preHandle(HttpServletRequest request,
-			HttpServletResponse response, Object handler) throws Exception {
-		String token = (String) request.getSession().getAttribute("token");
-		if (token != null) {
-			String loginName = token.substring(14);
-			if(loginConfig.getLoginName().equals(loginName)){
-				return true;
-			}
-			AbstractUser user = markUserRepo.findByLoginName(loginName);
-			String sessionId = request.getSession().getId();
-			if(user.getSessionId().equalsIgnoreCase(sessionId)){
-				return true;
-			}
-		}
-		response.sendError(HttpStatus.UNAUTHORIZED.value(), "没有登录或会话超时");
-		return false;
-	}
-
-	public void postHandle(HttpServletRequest request,
-			HttpServletResponse response) throws Exception {
-
-	}
-
-	public void afterCompletion(HttpServletRequest request,
-			HttpServletResponse response, Object handler, Exception ex)
-			throws Exception {
-
-	}
+    @Override
+    public boolean preHandle(HttpServletRequest request,
+                             HttpServletResponse response, Object handler) throws Exception {
+        String token = (String) request.getSession().getAttribute("token");
+        if (token != null) {
+            String loginName = token.substring(14);
+            if (loginConfig.adminLoginConfig().getLoginName().equals(loginName) || loginConfig.clientLoginConfig().getLoginName().equals(loginName)) {
+                return true;
+            }
+            AbstractUser user = markUserRepo.findByLoginName(loginName);
+            String sessionId = request.getSession().getId();
+            if (user.getSessionId().equalsIgnoreCase(sessionId)) {
+                return true;
+            }
+        }
+        response.sendError(HttpStatus.UNAUTHORIZED.value(), "没有登录或会话超时");
+        return false;
+    }
+
+    public void postHandle(HttpServletRequest request,
+                           HttpServletResponse response) throws Exception {
+
+    }
+
+    public void afterCompletion(HttpServletRequest request,
+                                HttpServletResponse response, Object handler, Exception ex)
+            throws Exception {
+
+    }
 }

+ 8 - 8
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/api/AuthApi.java

@@ -1,11 +1,9 @@
 package cn.com.qmth.stmms.ms.accesscontrol.api;
 
 import cn.com.qmth.stmms.ms.accesscontrol.config.LoginConfig;
-import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
-
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.StringUtils;
@@ -14,8 +12,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-import java.util.Date;
-
 /**
  * Created by zhengmin on 2016/11/1.
  */
@@ -34,9 +30,13 @@ public class AuthApi {
     @RequestMapping(value = "login", method = RequestMethod.POST)
     public MarkUser login(@RequestBody MarkUser user, HttpServletRequest request) {
         MarkUser domain = null;
-        if (loginConfig.getLoginName().equals(user.getLoginName()) &&
-                loginConfig.getPassword().equals(user.getPassword())) {
-            domain = new MarkUser(loginConfig.getLoginName(), loginConfig.getPassword(), null, null, "系统管理员", Role.ADMIN,null);
+
+        if (loginConfig.adminLoginConfig().getLoginName().equals(user.getLoginName()) &&
+                loginConfig.adminLoginConfig().getPassword().equals(user.getPassword())) {
+            domain = new MarkUser(loginConfig.adminLoginConfig().getLoginName(), loginConfig.adminLoginConfig().getPassword(), null, null, "系统管理员", Role.ADMIN, null);
+        } else if (loginConfig.clientLoginConfig().getLoginName().equals(user.getLoginName()) &&
+                loginConfig.clientLoginConfig().getPassword().equals(user.getPassword())) {
+            domain = new MarkUser(loginConfig.clientLoginConfig().getLoginName(), loginConfig.clientLoginConfig().getPassword(), null, null, "系统管理员", Role.ADMIN, null);
         } else {
 //            Work activeWork = workRepo.findByActiveTrue();
 //            String loginName = activeWork.getId() + "-" + user.getLoginName();
@@ -59,7 +59,7 @@ public class AuthApi {
         if (!StringUtils.isEmpty(token)) {
             session.setAttribute("token", null);
         }
-        session.setAttribute("token", new Date().getTime() + "#" + domain.getLoginName());
+        session.setAttribute("token", System.currentTimeMillis() + "#" + domain.getLoginName());
         return domain;
     }
 

+ 1 - 1
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/AccessConfig.java

@@ -32,6 +32,6 @@ public class AccessConfig extends WebMvcConfigurerAdapter {
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor( loginInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/admin/users/login",
-                "/api/user/login","/api/exam/students","/api/upload/student/*","/api/file/ms-slice/**","/api/subject/collect-config","/api/file/ms-sheet/**");
+                "/api/user/login","/api/user/getClientUser","/api/exam/students","/api/upload/student/*","/api/file/ms-slice/**","/api/subject/collect-config","/api/file/ms-sheet/**");
     }
 }

+ 24 - 0
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/AdminLoginConfig.java

@@ -0,0 +1,24 @@
+package cn.com.qmth.stmms.ms.accesscontrol.config;
+
+public class AdminLoginConfig {
+
+    private String loginName;
+
+    private String password;
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}

+ 24 - 0
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/ClientLoginConfig.java

@@ -0,0 +1,24 @@
+package cn.com.qmth.stmms.ms.accesscontrol.config;
+
+public class ClientLoginConfig {
+
+    private String loginName;
+
+	private String password;
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}

+ 15 - 22
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/config/LoginConfig.java

@@ -1,30 +1,23 @@
 package cn.com.qmth.stmms.ms.accesscontrol.config;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Component;
 
-@Component
-@ConfigurationProperties(prefix = "app.admin")
+@Configuration
 public class LoginConfig {
 
-	private String loginName;
-
-	private String password;
-
-	public String getLoginName() {
-		return loginName;
-	}
-
-	public void setLoginName(String loginName) {
-		this.loginName = loginName;
-	}
-
-	public String getPassword() {
-		return password;
-	}
-
-	public void setPassword(String password) {
-		this.password = password;
-	}
-
+    @Bean
+    @ConfigurationProperties(prefix = "app.admin", ignoreUnknownFields = false)
+    public AdminLoginConfig adminLoginConfig() {
+        return new AdminLoginConfig();
+    }
+
+    @Bean
+    @ConfigurationProperties(prefix = "app.client", ignoreUnknownFields = false)
+    public ClientLoginConfig clientLoginConfig() {
+        return new ClientLoginConfig();
+    }
 }

+ 46 - 7
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.ms.admin.api;
 import cn.com.qmth.stmms.ms.admin.assembler.ScoreAssembler;
 import cn.com.qmth.stmms.ms.admin.dto.ScoreCheckDTO;
 import cn.com.qmth.stmms.ms.admin.utils.WaterMarkUtils;
+import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Student;
@@ -13,14 +14,19 @@ import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
-
+import cn.com.qmth.stmms.ms.marking.assembler.PaperAssembler;
+import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
+import javax.persistence.criteria.Predicate;
 import java.awt.*;
 import java.io.File;
 import java.io.IOException;
@@ -52,6 +58,9 @@ public class ScoreApi {
     @Autowired
     private ScoreAssembler scoreAssembler;
 
+    @Autowired
+    private PaperAssembler paperAssembler;
+
     /**
      * 查询
      *
@@ -83,7 +92,7 @@ public class ScoreApi {
 
         return scoreAssembler.toDTO(student, papers);
     }
-    
+
     /**
      * 查询
      *
@@ -93,14 +102,14 @@ public class ScoreApi {
      */
     @RequestMapping(value = "search/byTaskSecretNumber", method = RequestMethod.GET)
     public ScoreCheckDTO getByTaskSecretNumber(@RequestParam Long workId,
-                                           @RequestParam String secretNumber) {
+                                               @RequestParam String secretNumber) {
         List<Paper> papers = new ArrayList<Paper>();
         List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndSecretNumber(workId, secretNumber);
         for (MarkTask markTask : markTasks) {
-        	papers.add(markTask.getPaper());
-		}
-        if(papers.isEmpty()){
-        	return null;
+            papers.add(markTask.getPaper());
+        }
+        if (papers.isEmpty()) {
+            return null;
         }
         String examNumber = papers.get(0).getExamNumber();
         Student student = studentRepo.findByWorkIdAndExamNumber(workId, examNumber);
@@ -282,4 +291,34 @@ public class ScoreApi {
         resultMap.put("watermarking", watermarking);
         return resultMap;
     }
+
+    @RequestMapping(value = "search/byCondition", method = RequestMethod.GET)
+    public PageableDTO byCondition(
+            @RequestParam Long workId,
+            @RequestParam String areaCode,
+            @RequestParam Subject subject,
+            @RequestParam(required = false) Long startNumber,
+            @RequestParam(required = false) Long endNumber,
+            @RequestParam(required = false) Boolean isManual,
+            Pageable pageable) {
+        Specification<Paper> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("workId"), workId));
+            predicates.add(builder.equal(root.get("areaCode"), areaCode));
+            predicates.add(builder.equal(root.get("subject"), subject));
+            if (startNumber != null && endNumber != null) {
+                predicates.add(builder.between(root.get("examNumber"), startNumber, endNumber));
+            } else if (startNumber != null) {
+                predicates.add(builder.equal(root.get("examNumber"), startNumber));
+            }
+            predicates.add(builder.equal(root.get("isManual"), Optional.ofNullable(isManual).orElse(true)));
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+        List<PaperDTO> paperDTOs = new ArrayList<>();
+        Page<Paper> paperPage = paperRepo.findAll(specification, pageable);
+        paperPage.getContent().forEach(p -> {
+            paperDTOs.add(paperAssembler.toDTOForSheet(p));
+        });
+        return new PageableDTO(paperDTOs, paperPage.getTotalElements(), paperPage.getTotalPages(), pageable.getPageNumber());
+    }
 }

+ 127 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/ExportLevelResultDTO.java

@@ -0,0 +1,127 @@
+package cn.com.qmth.stmms.ms.admin.dto;
+
+/**
+ * @Description: 导出档位表
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/13
+ */
+public class ExportLevelResultDTO {
+    private String examNumber;
+    private String studentName;
+    private String areaName;
+    private String areaCode;
+    //    private String groupCell;
+    private String result;
+    private String teacherName;
+    private Boolean markByLeader;
+    private String level;
+    private int firstCol;
+    private String subject;
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public int getFirstCol() {
+        return firstCol;
+    }
+
+    public void setFirstCol(int firstCol) {
+        this.firstCol = firstCol;
+    }
+
+    public Boolean getMarkByLeader() {
+        return markByLeader;
+    }
+
+    public void setMarkByLeader(Boolean markByLeader) {
+        this.markByLeader = markByLeader;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public ExportLevelResultDTO() {
+
+    }
+
+    public ExportLevelResultDTO(String examNumber, String teacherName, String result) {
+        this.examNumber = examNumber;
+        this.teacherName = teacherName;
+        this.result = result;
+    }
+
+    public ExportLevelResultDTO(String result, Boolean markByLeader, String level, String teacherName) {
+        this.result = result;
+        this.markByLeader = markByLeader;
+        this.level = level;
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+//    public String getGroupCell() {
+//        return groupCell;
+//    }
+
+//    public void setGroupCell(String groupCell) {
+//        this.groupCell = groupCell;
+//    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+}

+ 63 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/dto/HeaderNode.java

@@ -0,0 +1,63 @@
+package cn.com.qmth.stmms.ms.admin.dto;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class HeaderNode {
+    private String name;
+    private int firstRow;
+    private int lastRow;
+    private int firstCol;
+    private int lastCol;
+
+    public HeaderNode(String examNumber, int firstRow, int lastRow, AtomicInteger cellIndex, AtomicInteger index) {
+
+    }
+
+    public HeaderNode(String name, int firstRow, int lastRow, int firstCol, int lastCol) {
+        this.name = name;
+        this.firstRow = firstRow;
+        this.lastRow = lastRow;
+        this.firstCol = firstCol;
+        this.lastCol = lastCol;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getFirstRow() {
+        return firstRow;
+    }
+
+    public void setFirstRow(int firstRow) {
+        this.firstRow = firstRow;
+    }
+
+    public int getLastRow() {
+        return lastRow;
+    }
+
+    public void setLastRow(int lastRow) {
+        this.lastRow = lastRow;
+    }
+
+    public int getFirstCol() {
+        return firstCol;
+    }
+
+    public void setFirstCol(int firstCol) {
+        this.firstCol = firstCol;
+    }
+
+    public int getLastCol() {
+        return lastCol;
+    }
+
+    public void setLastCol(int lastCol) {
+        this.lastCol = lastCol;
+    }
+}

+ 414 - 10
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/ScoreExporter.java

@@ -1,6 +1,9 @@
 package cn.com.qmth.stmms.ms.admin.exporter;
 
+import cn.com.qmth.stmms.ms.admin.dto.ExportLevelResultDTO;
+import cn.com.qmth.stmms.ms.admin.dto.HeaderNode;
 import cn.com.qmth.stmms.ms.admin.dto.ScoreDTO;
+import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.Student;
@@ -8,7 +11,15 @@ import cn.com.qmth.stmms.ms.core.repository.ExamQuestionRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import com.google.gson.Gson;
 import org.apache.commons.lang.math.NumberUtils;
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -16,8 +27,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Created by zhengmin on 2017/1/18.
@@ -25,6 +36,7 @@ import java.util.List;
 @RestController
 @RequestMapping("export/score")
 public class ScoreExporter {
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ScoreExporter.class);
 
     @Autowired
     private PaperRepo paperRepo;
@@ -35,6 +47,15 @@ public class ScoreExporter {
     @Autowired
     private StudentRepo studentRepo;
 
+    @Autowired
+    SqlUtil sqlUtil;
+
+    private int level = 4,//动态报表开始列固定从4开始
+            levelInterval = 2,//分档列固定从2开始
+            scoreInterval = 1;//分数列固定从1开始
+
+    private final String LEADER = "科组长定档", avgSocre = "平均成绩", FINAL = "最终定档", TEACHER = "阅卷员", examNumber = "准考证号", name = "姓名", areaName = "考区", areaCode = "生源地", scName = "色彩", smName = "素描", sxName = "速写", MARK_LEADER = "MARK_LEADER", FINAL_STR = "FINAL_STR";
+
     //@RequestMapping(method = RequestMethod.GET)
     public void export(@RequestParam Long workId, HttpServletResponse response) {
         List<ScoreDTO> scoreDTOs = new ArrayList<>();
@@ -47,14 +68,11 @@ public class ScoreExporter {
             scoreDTO.setExamNumber(o[0].toString());
             scoreDTO.setStudentName(o[1].toString());
             String scoreList = String.valueOf(o[4]);
-
             if (scoreList != null && scoreList.split(",").length == 3) {
                 scoreDTO.setSc(scoreList.split(",")[0]);
                 scoreDTO.setSm(scoreList.split(",")[1]);
                 scoreDTO.setSx(scoreList.split(",")[2]);
             }
-
-
             scoreDTO.setAreaName(areaName);
             scoreDTO.setSourceName(sourceName);
             scoreDTOs.add(scoreDTO);
@@ -65,14 +83,10 @@ public class ScoreExporter {
 
     @RequestMapping(method = RequestMethod.GET)
     public void export2(@RequestParam Long workId, HttpServletResponse response) {
-
-
         List<ScoreDTO> scoreDTOs = new ArrayList<>();
         List<Student> students = studentRepo.findByWorkId(workId);
-
         for (Student student : students) {
             ScoreDTO scoreDTO = new ScoreDTO();
-
             scoreDTO.setSourceName(student.getSourceName());
             scoreDTO.setAreaName(student.getAreaName());
             scoreDTO.setExamNumber(student.getExamNumber());
@@ -88,10 +102,400 @@ public class ScoreExporter {
             scoreDTO.setSc(String.valueOf(scScore));
             scoreDTO.setSm(String.valueOf(smScore));
             scoreDTO.setSx(String.valueOf(sxScore));
-
             scoreDTOs.add(scoreDTO);
         }
         String fileName = "成绩总表";
         ExportUtils.exportEXCEL(fileName, ScoreDTO.class, scoreDTOs, response);
     }
+
+    /**
+     * 评卷元动态绘制
+     *
+     * @param type
+     * @param map
+     * @param sheet
+     * @param style
+     * @param row
+     * @param index
+     * @return
+     */
+    public void drawExcelTeacher(int type, Map<String, ExportLevelResultDTO> map, HSSFSheet sheet, HSSFCellStyle style, HSSFRow row, AtomicInteger index) {
+        map.forEach((k, v) -> {
+            drawExcelFixedHead(sheet, style, row, new HeaderNode(String.valueOf(v.getTeacherName()) + TEACHER, 1, 1, index.get(), index.get()));
+            v.setFirstCol(index.get());
+            index.getAndIncrement();
+        });
+        if (type == 2) {//type为2:分档报表
+            //科组长定档
+            drawExcelFixedHead(sheet, style, row, new HeaderNode(LEADER, 1, 1, index.get(), index.get()));
+            index.getAndIncrement();
+            //最终定档
+            drawExcelFixedHead(sheet, style, row, new HeaderNode(FINAL, 1, 1, index.get(), index.get()));
+        } else if (type == 1) {//type为1:分数报表
+            //平均成绩
+            drawExcelFixedHead(sheet, style, row, new HeaderNode(avgSocre, 1, 1, index.get(), index.get()));
+        }
+    }
+
+    /**
+     * 绘制excel列
+     *
+     * @param sheet
+     * @param style
+     * @param row
+     * @return
+     */
+    public HSSFSheet drawExcelFixedHead(HSSFSheet sheet, HSSFCellStyle style, HSSFRow row, HeaderNode headerNode) {
+        Cell cell = row.createCell(headerNode.getFirstCol());
+        cell.setCellValue(headerNode.getName());
+        cell.setCellStyle(style);
+        CellRangeAddress region = new CellRangeAddress(headerNode.getFirstRow(), headerNode.getLastRow(), (short) headerNode.getFirstCol(), (short) headerNode.getLastCol());
+        sheet.addMergedRegion(region);
+        return sheet;
+    }
+
+    /**
+     * 绘制固定表头
+     *
+     * @param type
+     * @param sheet
+     * @param style
+     * @param row
+     * @param subjectMap
+     */
+    public HSSFSheet drawExcelFixedHead(int type, HSSFSheet sheet, HSSFCellStyle style, HSSFRow row, Map<String, Map<String, ExportLevelResultDTO>> subjectMap) {
+        //准考证号
+        Cell cell = row.createCell(0);
+        cell.setCellValue(examNumber);
+        cell.setCellStyle(style);
+        CellRangeAddress region1 = new CellRangeAddress(0, 1, (short) 0, (short) 0);
+        sheet.addMergedRegion(region1);
+        sheet.setColumnWidth(0, 15 * 256);
+        //姓名
+        Cell cell1 = row.createCell(1);
+        cell1.setCellValue(name);
+        cell1.setCellStyle(style);
+        CellRangeAddress region2 = new CellRangeAddress(0, 1, (short) 1, (short) 1);
+        sheet.addMergedRegion(region2);
+        //考区
+        Cell cell2 = row.createCell(2);
+        cell2.setCellValue(areaName);
+        cell2.setCellStyle(style);
+        CellRangeAddress region3 = new CellRangeAddress(0, 1, (short) 2, (short) 2);
+        sheet.addMergedRegion(region3);
+        sheet.setColumnWidth(2, 30 * 256);
+        //生源地
+        Cell cell3 = row.createCell(3);
+        cell3.setCellValue(areaCode);
+        cell3.setCellStyle(style);
+        CellRangeAddress region4 = new CellRangeAddress(0, 1, (short) 3, (short) 3);
+        sheet.addMergedRegion(region4);
+        //色彩
+        int size = 0;
+        if (Objects.nonNull(subjectMap.get(Subject.SC.toString()))) {
+            size = subjectMap.get(Subject.SC.toString()).size();
+        }
+        int scSumCount = 0;
+        if (type == 2) {
+            scSumCount = level + size + 1;
+        } else {
+            scSumCount = level + size;
+        }
+        Cell cell4 = row.createCell(level);
+        cell4.setCellValue(scName);
+        cell4.setCellStyle(style);
+        CellRangeAddress region5 = new CellRangeAddress(0, 0, (short) level, scSumCount);
+        sheet.addMergedRegion(region5);
+        LOGGER.info("level:{},scSumCount:{}", level, scSumCount);
+
+        //素描
+        scSumCount = scSumCount + 1;//起始列+1
+        size = 0;
+        if (Objects.nonNull(subjectMap.get(Subject.SM.toString()))) {
+            size = subjectMap.get(Subject.SM.toString()).size();
+        }
+        int smSumCount = 0;
+        if (type == 2) {
+            smSumCount = scSumCount + size + 1;//最终列+1,因为从0开始
+        } else {
+            smSumCount = scSumCount + size;
+        }
+        Cell cell5 = row.createCell(scSumCount);
+        cell5.setCellValue(smName);
+        cell5.setCellStyle(style);
+        CellRangeAddress region6 = new CellRangeAddress(0, 0, (short) scSumCount, smSumCount);
+        sheet.addMergedRegion(region6);
+        LOGGER.info("scSumCount:{},smSumCount:{}", scSumCount, smSumCount);
+        //速写
+        smSumCount = smSumCount + 1;//起始列+1
+        size = 0;
+        if (Objects.nonNull(subjectMap.get(Subject.SX.toString()))) {
+            size = subjectMap.get(Subject.SX.toString()).size();
+        }
+        int sxSumCount = 0;
+        if (type == 2) {
+            sxSumCount = smSumCount + size + 1;//最终列+1,因为从0开始
+        } else {
+            sxSumCount = smSumCount + size;
+        }
+        Cell cell6 = row.createCell(smSumCount);
+        cell6.setCellValue(sxName);
+        cell6.setCellStyle(style);
+        CellRangeAddress region7 = new CellRangeAddress(0, 0, (short) smSumCount, sxSumCount);
+        sheet.addMergedRegion(region7);
+        LOGGER.info("smSumCount:{},sxSumCount:{}", smSumCount, sxSumCount);
+        return sheet;
+    }
+
+    /**
+     * 导出档位成绩
+     *
+     * @param workId
+     * @param response
+     */
+    @RequestMapping(value = "exportLevelResult", method = RequestMethod.GET)
+    public void exportLevelResult(@RequestParam Long workId, HttpServletResponse response) {
+        String fileName = "档位成绩表";
+        //测试-导出档位成绩表
+        String scSql = "select temp.*, mt.`result`, p.area_code as areaCode, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level` from mark_task as mt , (select mu.id, mu.name as teacherName, mu.`role`, mu.subject, mu.work_id as workId from mark_user as mu where mu.work_id = ? and mu.`role` = 'MARKER'and (mu.mark_right = 0 or mu.mark_right = 2) and mu.subject = 'SC'and mu.enabled = 1) temp, paper p, student t where mt.marker_id = temp.id and mt.paper_id = p.id and t.exam_number = p.exam_number and mt.work_id = ? and mt.stage = 1 ";
+        String smSql = "select temp.*, mt.`result`, p.area_code as areaCode, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level` from mark_task as mt , (select mu.id, mu.name as teacherName, mu.`role`, mu.subject, mu.work_id as workId from mark_user as mu where mu.work_id = ? and mu.`role` = 'MARKER'and (mu.mark_right = 0 or mu.mark_right = 2) and mu.subject = 'SM'and mu.enabled = 1) temp, paper p, student t where mt.marker_id = temp.id and mt.paper_id = p.id and t.exam_number = p.exam_number and mt.work_id = ? and mt.stage = 1 ";
+        String sxSql = "select temp.*, mt.`result`, p.area_code as areaCode, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level` from mark_task as mt , (select mu.id, mu.name as teacherName, mu.`role`, mu.subject, mu.work_id as workId from mark_user as mu where mu.work_id = ? and mu.`role` = 'MARKER'and (mu.mark_right = 0 or mu.mark_right = 2) and mu.subject = 'SX'and mu.enabled = 1) temp, paper p, student t where mt.marker_id = temp.id and mt.paper_id = p.id and t.exam_number = p.exam_number and mt.work_id = ? and mt.stage = 1 ";
+        //拼装问号
+        scSql = sqlUtil.sqlPrint(scSql, workId, workId);
+        smSql = sqlUtil.sqlPrint(smSql, workId, workId);
+        sxSql = sqlUtil.sqlPrint(sxSql, workId, workId);
+        StringBuilder sbAll = new StringBuilder(sqlUtil.sqlUnionAll(scSql));//union all
+        sbAll = sbAll.append(smSql);
+        sbAll = new StringBuilder(sqlUtil.sqlUnionAll(sbAll.toString()));//union all
+        sbAll = sbAll.append(sxSql);
+        List list = sqlUtil.execSqlForMap(sbAll.toString());
+        if (Objects.nonNull(list)) {
+            Map<String, Map<String, ExportLevelResultDTO>> subjectMap = new HashMap<>();//课程老师批改集合
+            Map<String, Map<String, ExportLevelResultDTO>> studentAnswerMap = new HashMap<>();//学生答题集合
+            Map<String, ExportLevelResultDTO> exportLevelResultDTOs = new HashMap();//学生集合
+            assembleData(list, subjectMap, studentAnswerMap, exportLevelResultDTOs);
+
+            //创建excel
+            HSSFWorkbook wb = new HSSFWorkbook();
+            HSSFSheet sheet = wb.createSheet(fileName);
+            HSSFCellStyle style = wb.createCellStyle();
+            style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中格式
+            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //垂直居中
+            HSSFRow row = sheet.createRow(0);
+
+            //绘制固定表头
+            sheet = drawExcelFixedHead(levelInterval, sheet, style, row, subjectMap);
+
+            //绘制动态表头
+            HSSFRow dynamicHeadRow = sheet.createRow(1);
+            //SC表头
+            Map<String, ExportLevelResultDTO> scMap = subjectMap.get(Subject.SC.toString());
+            int size = 0;
+            if (Objects.nonNull(scMap) && scMap.size() > 0) {
+                drawExcelTeacher(levelInterval, scMap, sheet, style, dynamicHeadRow, new AtomicInteger(level));
+                size = scMap.size();
+            }
+            //SM表头
+            Map<String, ExportLevelResultDTO> smMap = subjectMap.get(Subject.SM.toString());
+            if (Objects.nonNull(smMap) && smMap.size() > 0) {
+                drawExcelTeacher(levelInterval, smMap, sheet, style, dynamicHeadRow, new AtomicInteger(level + size + levelInterval));
+                size = size + smMap.size();
+            }
+            //SX表头
+            Map<String, ExportLevelResultDTO> sxMap = subjectMap.get(Subject.SX.toString());
+            if (Objects.nonNull(sxMap) && sxMap.size() > 0) {
+                drawExcelTeacher(levelInterval, sxMap, sheet, style, dynamicHeadRow, new AtomicInteger(level + size + levelInterval * 2));
+            }
+            //加载excel数据
+            AtomicInteger cellIndex = new AtomicInteger(0);
+            HSSFSheet finalSheet = sheet;
+            AtomicInteger i = new AtomicInteger(0);
+            AtomicInteger r = new AtomicInteger(2);
+            exportLevelResultDTOs.forEach((listk, listv) -> {
+                int firstRow = i.get() + r.get();
+                cellIndex.set(0);
+                HSSFRow hssfRow = finalSheet.createRow(firstRow);
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getExamNumber(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getStudentName(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getAreaName(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getAreaCode(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                Map<String, ExportLevelResultDTO> map = studentAnswerMap.get(listv.getExamNumber());
+                if (Objects.nonNull(map) && map.size() > 0) {
+                    map.forEach((k, v) -> {
+                        if (k.contains(Subject.SC.toString())) {
+                            ExportLevelResultDTO exportLevelResultDTO = scMap.get(v.getTeacherName());
+                            drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getResult(), firstRow, firstRow, exportLevelResultDTO.getFirstCol(), exportLevelResultDTO.getFirstCol()));
+                            if (v.getMarkByLeader()) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size(), level + scMap.size()));
+                            }
+                            if (Objects.nonNull(v.getLevel())) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size() + 1, level + scMap.size() + 1));
+                            }
+                        } else if (k.contains(Subject.SM.toString())) {
+                            ExportLevelResultDTO exportLevelResultDTO = smMap.get(v.getTeacherName());
+                            drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getResult(), firstRow, firstRow, exportLevelResultDTO.getFirstCol(), exportLevelResultDTO.getFirstCol()));
+                            if (v.getMarkByLeader()) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size() + smMap.size() + levelInterval, level + scMap.size() + smMap.size() + levelInterval));
+                            }
+                            if (Objects.nonNull(v.getLevel())) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size() + smMap.size() + levelInterval + 1, level + scMap.size() + smMap.size() + levelInterval + 1));
+                            }
+                        } else if (k.contains(Subject.SX.toString())) {
+                            ExportLevelResultDTO exportLevelResultDTO = sxMap.get(v.getTeacherName());
+                            drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getResult(), firstRow, firstRow, exportLevelResultDTO.getFirstCol(), exportLevelResultDTO.getFirstCol()));
+                            if (v.getMarkByLeader()) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size() + smMap.size() + sxMap.size() + levelInterval * 2, level + scMap.size() + smMap.size() + sxMap.size() + levelInterval * 2));
+                            }
+                            if (Objects.nonNull(v.getLevel())) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size() + smMap.size() + sxMap.size() + levelInterval * 2 + 1, level + scMap.size() + smMap.size() + sxMap.size() + levelInterval * 2 + 1));
+                            }
+                        }
+                    });
+                }
+                i.getAndIncrement();
+            });
+            ExportUtils.exportEXCEL(fileName, wb, response);
+        }
+    }
+
+    /**
+     * 导出分数成绩
+     *
+     * @param workId
+     * @param response
+     */
+    @RequestMapping(value = "exportScoreResult", method = RequestMethod.GET)
+    public void exportScoreResult(@RequestParam Long workId, HttpServletResponse response) {
+        String fileName = "分数成绩表";
+        //测试-导出分数成绩表
+        String scSql = "select temp.*, mt.`result`, p.area_code as areaCode, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.score as level,p.mark_by_leader as markByLeader from mark_task as mt , (select mu.id, mu.name as teacherName, mu.`role`, mu.subject, mu.work_id as workId from mark_user as mu where mu.work_id = ? and mu.`role` = 'MARKER'and (mu.mark_right = 1 or mu.mark_right = 2) and mu.subject = 'SC'and mu.enabled = 1) temp, paper p, student t where mt.marker_id = temp.id and mt.paper_id = p.id and t.exam_number = p.exam_number and mt.work_id = ? and mt.stage = 2 ";
+        String smSql = "select temp.*, mt.`result`, p.area_code as areaCode, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.score as level,p.mark_by_leader as markByLeader from mark_task as mt , (select mu.id, mu.name as teacherName, mu.`role`, mu.subject, mu.work_id as workId from mark_user as mu where mu.work_id = ? and mu.`role` = 'MARKER'and (mu.mark_right = 1 or mu.mark_right = 2) and mu.subject = 'SM'and mu.enabled = 1) temp, paper p, student t where mt.marker_id = temp.id and mt.paper_id = p.id and t.exam_number = p.exam_number and mt.work_id = ? and mt.stage = 2 ";
+        String sxSql = "select temp.*, mt.`result`, p.area_code as areaCode, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.score as level,p.mark_by_leader as markByLeader from mark_task as mt , (select mu.id, mu.name as teacherName, mu.`role`, mu.subject, mu.work_id as workId from mark_user as mu where mu.work_id = ? and mu.`role` = 'MARKER'and (mu.mark_right = 1 or mu.mark_right = 2) and mu.subject = 'SX'and mu.enabled = 1) temp, paper p, student t where mt.marker_id = temp.id and mt.paper_id = p.id and t.exam_number = p.exam_number and mt.work_id = ? and mt.stage = 2 ";
+        //拼装问号
+        scSql = sqlUtil.sqlPrint(scSql, workId, workId);
+        smSql = sqlUtil.sqlPrint(smSql, workId, workId);
+        sxSql = sqlUtil.sqlPrint(sxSql, workId, workId);
+        StringBuilder sbAll = new StringBuilder(sqlUtil.sqlUnionAll(scSql));//union all
+        sbAll = sbAll.append(smSql);
+        sbAll = new StringBuilder(sqlUtil.sqlUnionAll(sbAll.toString()));//union all
+        sbAll = sbAll.append(sxSql);
+        List list = sqlUtil.execSqlForMap(sbAll.toString());
+        if (Objects.nonNull(list)) {
+            Map<String, Map<String, ExportLevelResultDTO>> subjectMap = new HashMap<>();//课程老师批改集合
+            Map<String, Map<String, ExportLevelResultDTO>> studentAnswerMap = new HashMap<>();//学生答题集合
+            Map<String, ExportLevelResultDTO> exportLevelResultDTOs = new HashMap();//学生集合
+            assembleData(list, subjectMap, studentAnswerMap, exportLevelResultDTOs);
+
+            //创建excel
+            HSSFWorkbook wb = new HSSFWorkbook();
+            HSSFSheet sheet = wb.createSheet(fileName);
+            HSSFCellStyle style = wb.createCellStyle();
+            style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中格式
+            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //垂直居中
+            HSSFRow row = sheet.createRow(0);
+
+            //绘制固定表头
+            sheet = drawExcelFixedHead(scoreInterval, sheet, style, row, subjectMap);
+
+            //绘制动态表头
+            HSSFRow dynamicHeadRow = sheet.createRow(1);
+            //SC表头
+            Map<String, ExportLevelResultDTO> scMap = subjectMap.get(Subject.SC.toString());
+            int size = 0;
+            if (Objects.nonNull(scMap) && scMap.size() > 0) {
+                drawExcelTeacher(scoreInterval, scMap, sheet, style, dynamicHeadRow, new AtomicInteger(level));
+                size = scMap.size();
+            }
+            //SM表头
+            Map<String, ExportLevelResultDTO> smMap = subjectMap.get(Subject.SM.toString());
+            if (Objects.nonNull(smMap) && smMap.size() > 0) {
+                drawExcelTeacher(scoreInterval, smMap, sheet, style, dynamicHeadRow, new AtomicInteger(level + size + scoreInterval));
+                size = size + smMap.size();
+            }
+            //SX表头
+            Map<String, ExportLevelResultDTO> sxMap = subjectMap.get(Subject.SX.toString());
+            if (Objects.nonNull(sxMap) && sxMap.size() > 0) {
+                drawExcelTeacher(scoreInterval, sxMap, sheet, style, dynamicHeadRow, new AtomicInteger(level + size + scoreInterval * 2));
+            }
+            //加载excel数据
+            AtomicInteger cellIndex = new AtomicInteger(0);
+            HSSFSheet finalSheet = sheet;
+            AtomicInteger i = new AtomicInteger(0);
+            AtomicInteger r = new AtomicInteger(2);
+            exportLevelResultDTOs.forEach((listk, listv) -> {
+                int firstRow = i.get() + r.get();
+                cellIndex.set(0);
+                HSSFRow hssfRow = finalSheet.createRow(firstRow);
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getExamNumber(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getStudentName(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getAreaName(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(listv.getAreaCode(), firstRow, firstRow, cellIndex.get(), cellIndex.get()));
+                cellIndex.getAndIncrement();
+                Map<String, ExportLevelResultDTO> map = studentAnswerMap.get(listv.getExamNumber());
+                if (Objects.nonNull(map) && map.size() > 0) {
+                    map.forEach((k, v) -> {
+                        if (k.contains(Subject.SC.toString())) {
+                            ExportLevelResultDTO exportLevelResultDTO = scMap.get(v.getTeacherName());
+                            drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getResult(), firstRow, firstRow, exportLevelResultDTO.getFirstCol(), exportLevelResultDTO.getFirstCol()));
+                            if (Objects.nonNull(v.getLevel())) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size(), level + scMap.size()));
+                            }
+                        } else if (k.contains(Subject.SM.toString())) {
+                            ExportLevelResultDTO exportLevelResultDTO = smMap.get(v.getTeacherName());
+                            drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getResult(), firstRow, firstRow, exportLevelResultDTO.getFirstCol(), exportLevelResultDTO.getFirstCol()));
+                            if (Objects.nonNull(v.getLevel())) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size() + smMap.size() + scoreInterval, level + scMap.size() + smMap.size() + scoreInterval));
+                            }
+                        } else if (k.contains(Subject.SX.toString())) {
+                            ExportLevelResultDTO exportLevelResultDTO = sxMap.get(v.getTeacherName());
+                            drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getResult(), firstRow, firstRow, exportLevelResultDTO.getFirstCol(), exportLevelResultDTO.getFirstCol()));
+                            if (Objects.nonNull(v.getLevel())) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + scMap.size() + smMap.size() + sxMap.size() + scoreInterval * 2, level + scMap.size() + smMap.size() + sxMap.size() + scoreInterval * 2));
+                            }
+                        }
+                    });
+                }
+                i.getAndIncrement();
+            });
+            ExportUtils.exportEXCEL(fileName, wb, response);
+        }
+    }
+
+    /**
+     * 组装数据
+     *
+     * @param list
+     * @param subjectMap
+     * @param studentAnswerMap
+     * @param exportLevelResultDTOs
+     */
+    public void assembleData(List list, Map<String, Map<String, ExportLevelResultDTO>> subjectMap, Map<String, Map<String, ExportLevelResultDTO>> studentAnswerMap, Map<String, ExportLevelResultDTO> exportLevelResultDTOs) {
+        for (int i = 0; i < list.size(); i++) {
+            Map map = (Map) list.get(i);
+            Gson gson = new Gson();
+            ExportLevelResultDTO exportLevelResultDTO = gson.fromJson(gson.toJson(map), ExportLevelResultDTO.class);
+            exportLevelResultDTOs.put(exportLevelResultDTO.getExamNumber(), exportLevelResultDTO);
+            if (subjectMap.containsKey(exportLevelResultDTO.getSubject())) {
+                subjectMap.get(exportLevelResultDTO.getSubject()).put(exportLevelResultDTO.getTeacherName(), new ExportLevelResultDTO(exportLevelResultDTO.getExamNumber(), exportLevelResultDTO.getTeacherName(), exportLevelResultDTO.getResult()));
+            } else {
+                Map<String, ExportLevelResultDTO> m = new HashMap<>();
+                m.put(exportLevelResultDTO.getTeacherName(), new ExportLevelResultDTO(exportLevelResultDTO.getExamNumber(), exportLevelResultDTO.getTeacherName(), exportLevelResultDTO.getResult()));
+                subjectMap.put(exportLevelResultDTO.getSubject(), m);
+            }
+            if (studentAnswerMap.containsKey(exportLevelResultDTO.getExamNumber())) {
+                studentAnswerMap.get(exportLevelResultDTO.getExamNumber()).put(exportLevelResultDTO.getSubject() + ":" + exportLevelResultDTO.getTeacherName(), new ExportLevelResultDTO(exportLevelResultDTO.getResult(), exportLevelResultDTO.getMarkByLeader(), exportLevelResultDTO.getLevel(), exportLevelResultDTO.getTeacherName()));
+            } else {
+                Map<String, ExportLevelResultDTO> m = new HashMap<>();
+                m.put(exportLevelResultDTO.getSubject() + ":" + exportLevelResultDTO.getTeacherName(), new ExportLevelResultDTO(exportLevelResultDTO.getResult(), exportLevelResultDTO.getMarkByLeader(), exportLevelResultDTO.getLevel(), exportLevelResultDTO.getTeacherName()));
+                studentAnswerMap.put(exportLevelResultDTO.getExamNumber(), m);
+            }
+        }
+    }
 }

+ 86 - 85
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -1,36 +1,5 @@
 package cn.com.qmth.stmms.ms.collect.api;
 
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.function.Consumer;
-
-import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.sf.json.JSONObject;
-
-import org.apache.commons.codec.digest.DigestUtils;
-import org.assertj.core.util.Strings;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.FileCopyUtils;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-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.RestController;
-
 import cn.com.qmth.stmms.ms.accesscontrol.config.LoginConfig;
 import cn.com.qmth.stmms.ms.admin.service.DataUploadService;
 import cn.com.qmth.stmms.ms.collect.dto.CollectStuDTO;
@@ -47,6 +16,21 @@ import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import net.sf.json.JSONObject;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.assertj.core.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.function.Consumer;
 
 /**
  * Created by dizhi on 2016/12/24.
@@ -75,23 +59,24 @@ public class CollectApi {
 
     @Autowired
     private ImageCompressionConfig compressionConfig;
-    
+
     @Autowired
     private PaperRepo paperRepo;
 
     @RequestMapping("user/login")
-    public LoginDTO login(@RequestParam String loginname,@RequestParam String password){
+    public LoginDTO login(@RequestParam String loginname, @RequestParam String password) {
         LoginDTO loginDTO = null;
-        if(loginname.equals(loginConfig.getLoginName()) && password.equals(loginConfig.getPassword())){
+        if (loginname.equals(loginConfig.adminLoginConfig().getLoginName()) && password.equals(loginConfig.adminLoginConfig().getPassword()) ||
+                loginname.equals(loginConfig.clientLoginConfig().getLoginName()) && password.equals(loginConfig.clientLoginConfig().getPassword())) {
             Work activeWork = workRepo.findByActiveTrue();
             loginDTO = new LoginDTO();
             loginDTO.setExamId(activeWork.getId());
             loginDTO.setExamName(activeWork.getName());
             List<CollectSubjectDTO> collectSubjectDTOs = new ArrayList<>();
             activeWork.getSubjects().forEach(s -> {
-                int id = s.getSubject().ordinal()+1;
-                CollectSubjectDTO collectSubjectDTO = new CollectSubjectDTO(id,s.getName());
-                if(!Strings.isNullOrEmpty(s.getCollectConfig())){
+                int id = s.getSubject().ordinal() + 1;
+                CollectSubjectDTO collectSubjectDTO = new CollectSubjectDTO(id, s.getName());
+                if (!Strings.isNullOrEmpty(s.getCollectConfig())) {
                     JSONObject json = JSONObject.fromObject(s.getCollectConfig());
                     collectSubjectDTO.setCollectConfig(json);
                 }
@@ -103,8 +88,21 @@ public class CollectApi {
         return loginDTO;
     }
 
-    @RequestMapping(value = "exam/students",method = RequestMethod.GET)
-    public List<CollectStuDTO> getStudents(){
+    /**
+     * 获取客户端账户名和密码
+     *
+     * @return
+     */
+    @RequestMapping(value = "user/getClientUser", method = RequestMethod.GET)
+    public Map getClientUser() {
+        Map map = new HashMap();
+        map.put("clientUserName", loginConfig.clientLoginConfig().getLoginName());
+        map.put("clientUserPwd", loginConfig.clientLoginConfig().getPassword());
+        return map;
+    }
+
+    @RequestMapping(value = "exam/students", method = RequestMethod.GET)
+    public List<CollectStuDTO> getStudents() {
         List<CollectStuDTO> list = new ArrayList<>();
         Work activeWork = workRepo.findByActiveTrue();
         Consumer<Student> consumer = (s) -> {
@@ -122,48 +120,50 @@ public class CollectApi {
 
     @RequestMapping(value = "upload/student/{subjectId}", method = RequestMethod.POST)
     public List<CollectStuDTO> saveStudent(HttpServletRequest request, @PathVariable Integer subjectId,
-                                 @RequestBody CollectStuDTO[] uploadStudentArray) throws IOException {
-        Subject subject = Subject.values()[subjectId-1];
+                                           @RequestBody CollectStuDTO[] uploadStudentArray) throws IOException {
+        Subject subject = Subject.values()[subjectId - 1];
         Work activeWork = workRepo.findByActiveTrue();
         List<CollectStuDTO> list = new ArrayList<>();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
-        for(CollectStuDTO dto : uploadStudentArray){
-            Student student = studentRepo.findByWorkIdAndExamNumber(activeWork.getId(),dto.getExamNumber());
-            if(!dto.isAbsent()){
-            	dataUploadService.savePaper(student,subject,dto.isManual());
+        for (CollectStuDTO dto : uploadStudentArray) {
+            Student student = studentRepo.findByWorkIdAndExamNumber(activeWork.getId(), dto.getExamNumber());
+            if (!dto.isAbsent()) {
+                dataUploadService.savePaper(student, subject, dto.isManual());
             }
             dto.setUploadTime(sdf.format(new Date()));
             list.add(dto);
         }
         return list;
     }
+
     /**
      * 上传裁切原图并压缩
+     *
      * @param workId
      * @param subjectId
      * @param fileName
      * @param request
      * @param response
-     * @throws Exception 
+     * @throws Exception
      */
-    @RequestMapping(value = "file/ms-slice/{workId}/{subjectId}/{fileName}", method = { RequestMethod.PUT, RequestMethod.POST })
-    public void upload(@PathVariable Long workId,@PathVariable Integer subjectId,
-    					@PathVariable String fileName,
-                       HttpServletRequest request,HttpServletResponse response) throws Exception{
-    	InputStream inputStream = request.getInputStream();
-        Student student = studentRepo.findByWorkIdAndExamNumber(workId,fileName);
-        Subject subject = Subject.values()[subjectId-1];
+    @RequestMapping(value = "file/ms-slice/{workId}/{subjectId}/{fileName}", method = {RequestMethod.PUT, RequestMethod.POST})
+    public void upload(@PathVariable Long workId, @PathVariable Integer subjectId,
+                       @PathVariable String fileName,
+                       HttpServletRequest request, HttpServletResponse response) throws Exception {
+        InputStream inputStream = request.getInputStream();
+        Student student = studentRepo.findByWorkIdAndExamNumber(workId, fileName);
+        Subject subject = Subject.values()[subjectId - 1];
         //保存遮盖图
         String savePath = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
-        			+ File.separator + student.getAreaCode();
+                + File.separator + student.getAreaCode();
         File outFile = saveImage(student, inputStream, savePath);
-        
+
         // 生成缩略图
         String thumbDir = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
-        			+ File.separator + student.getAreaCode();
+                + File.separator + student.getAreaCode();
         File thumb = new File(thumbDir);
         if (!thumb.exists()) {
-        	thumb.mkdirs();
+            thumb.mkdirs();
         }
         BufferedImage bufferedImage = ImageCompression.compress(outFile, compressionConfig);
         String thumbFileName = thumbDir + File.separator + student.getExamNumber() + ".jpg";
@@ -172,26 +172,27 @@ public class CollectApi {
         String md5 = request.getHeader("md5");
         FileInputStream in = new FileInputStream(outFile);
         String sliceMD5 = DigestUtils.md5Hex(in);
-        if(!md5.equalsIgnoreCase(sliceMD5)){
-        	throw new Exception("图片md5值不一致");
+        if (!md5.equalsIgnoreCase(sliceMD5)) {
+            throw new Exception("图片md5值不一致");
         }
         in.close();
 //        ImageCompression.imageThumbnail(outFile,new File(thumbFileName),compressionConfig);
     }
 
-	private File saveImage(Student student, InputStream inputStream,
-			String savePath) throws IOException, FileNotFoundException {
-		File out = new File(savePath);
-		if (!out.exists()) {
-			out.mkdirs();
-		}
-		File outFile = new File(savePath + File.separator + student.getExamNumber() + ".jpg");
-		FileCopyUtils.copy(inputStream, new FileOutputStream(outFile));
-		return outFile;
-	}
-	
+    private File saveImage(Student student, InputStream inputStream,
+                           String savePath) throws IOException, FileNotFoundException {
+        File out = new File(savePath);
+        if (!out.exists()) {
+            out.mkdirs();
+        }
+        File outFile = new File(savePath + File.separator + student.getExamNumber() + ".jpg");
+        FileCopyUtils.copy(inputStream, new FileOutputStream(outFile));
+        return outFile;
+    }
+
     /**
      * 上传裁切原图并压缩
+     *
      * @param workId
      * @param subjectId
      * @param fileName
@@ -199,36 +200,36 @@ public class CollectApi {
      * @param response
      * @throws IOException
      */
-    @RequestMapping(value = "file/ms-sheet/{workId}/{subjectId}/{fileName}", method = { RequestMethod.PUT, RequestMethod.POST })
-    public void uploadsheet(@PathVariable Long workId,@PathVariable Integer subjectId,
-    					@PathVariable String fileName,
-                       HttpServletRequest request,HttpServletResponse response) throws Exception{
-        Student student = studentRepo.findByWorkIdAndExamNumber(workId,fileName);
-        Subject subject = Subject.values()[subjectId-1];
+    @RequestMapping(value = "file/ms-sheet/{workId}/{subjectId}/{fileName}", method = {RequestMethod.PUT, RequestMethod.POST})
+    public void uploadsheet(@PathVariable Long workId, @PathVariable Integer subjectId,
+                            @PathVariable String fileName,
+                            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        Student student = studentRepo.findByWorkIdAndExamNumber(workId, fileName);
+        Subject subject = Subject.values()[subjectId - 1];
         InputStream inputStream = request.getInputStream();
         //保存原图图
         String savePath = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
-        			+ File.separator + student.getAreaCode();
+                + File.separator + student.getAreaCode();
         File outFile = saveImage(student, inputStream, savePath);
-        
+
         String md5 = request.getHeader("md5");
         FileInputStream in = new FileInputStream(outFile);
         String sheetMD5 = DigestUtils.md5Hex(in);
-        if(!md5.equalsIgnoreCase(sheetMD5)){
-        	throw new Exception("图片md5值不一致");
+        if (!md5.equalsIgnoreCase(sheetMD5)) {
+            throw new Exception("图片md5值不一致");
         }
         in.close();
     }
-    
+
     @RequestMapping(value = "subject/collect-config", method = RequestMethod.POST)
-    public boolean updateConfig(@RequestBody  CollectSubjectDTO collectSubjectDTO){
-        Subject subject = Subject.values()[collectSubjectDTO.getSubjectId()-1];
+    public boolean updateConfig(@RequestBody CollectSubjectDTO collectSubjectDTO) {
+        Subject subject = Subject.values()[collectSubjectDTO.getSubjectId() - 1];
         Work activeWork = workRepo.findByActiveTrue();
         MarkSubject markSubject = markSubjectRepo.findOne(activeWork.getId() + "-" + subject.toString());
         String config = Optional.ofNullable(collectSubjectDTO.getCollectConfig())
                 .map(Object::toString)
-                .map(s -> s.substring(1,s.length()-1))
-                .map(s -> s.replaceAll("\\\\","")).get();
+                .map(s -> s.substring(1, s.length() - 1))
+                .map(s -> s.replaceAll("\\\\", "")).get();
         markSubject.setCollectConfig(config);
         markSubjectRepo.save(markSubject);
         return true;

+ 9 - 2
stmms-ms-commons/pom.xml

@@ -28,11 +28,18 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
         </dependency>
-
         <dependency>
             <groupId>net.coobird</groupId>
             <artifactId>thumbnailator</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.1.16</version>
+        </dependency>
     </dependencies>
 </project>

+ 5 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/SystemConfig.java

@@ -58,6 +58,11 @@ public class SystemConfig {
                 + subject + "/" + areaCode + "/" + examNumber + ".jpg?random=" + UUID.randomUUID().toString();
     }
 
+    public String getSheetUrl(Long workId,String subject,String areaCode,String examNumber){
+        return imageServerConfig.getImageServer() + "/sheet/" + String.valueOf(workId) + "/"
+                + subject + "/" + areaCode + "/" + examNumber + ".jpg?random=" + UUID.randomUUID().toString();
+    }
+
 	public String getSheetDir() {
 		return sheetDir;
 	}

+ 136 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/PageInfo.java

@@ -0,0 +1,136 @@
+package cn.com.qmth.stmms.ms.commons.utils;
+
+import org.springframework.data.domain.Page;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 分页
+ *
+ * @author WANGWEI
+ * @date 2018年6月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ * @param <T>
+ */
+public class PageInfo<T> implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 当前页码
+	 */
+	private long index = 1;
+
+	/**
+	 * 每页的数量
+	 */
+	private long limit = 10;
+
+	/**
+	 * 当前页的数量
+	 */
+	private long size;
+
+	/**
+	 * 总记录数
+	 */
+	private long total;
+
+	/**
+	 * 总页数
+	 */
+	private long pages;
+
+	/**
+	 * 结果集
+	 */
+	private List<T> list;
+
+	/**
+	 * 构造函数
+	 *
+	 */
+	public PageInfo() {
+
+	}
+
+	/**
+	 * 构造函数
+	 *
+	 * @param page
+	 */
+	public PageInfo(Page<T> page) {
+		this.total = page.getTotalElements();
+		this.pages = page.getTotalPages();
+		this.index = page.getNumber();
+		this.size = page.getNumberOfElements();
+		this.limit = page.getSize();
+
+		this.list = page.getContent();
+	}
+
+	/**
+	 * 构造函数
+	 *
+	 * @param page
+	 * @param list
+	 */
+	public PageInfo(Page<?> page, List<T> list) {
+		this.total = page.getTotalElements();
+		this.pages = page.getTotalPages();
+		this.index = page.getNumber();
+		this.size = page.getNumberOfElements();
+		this.limit = page.getSize();
+
+		this.list = list;
+	}
+
+	public long getIndex() {
+		return index;
+	}
+
+	public void setIndex(long index) {
+		this.index = index;
+	}
+
+	public long getLimit() {
+		return limit;
+	}
+
+	public void setLimit(long limit) {
+		this.limit = limit;
+	}
+
+	public long getSize() {
+		return size;
+	}
+
+	public void setSize(long size) {
+		this.size = size;
+	}
+
+	public long getTotal() {
+		return total;
+	}
+
+	public void setTotal(long total) {
+		this.total = total;
+	}
+
+	public long getPages() {
+		return pages;
+	}
+
+	public void setPages(long pages) {
+		this.pages = pages;
+	}
+
+	public List<T> getList() {
+		return list;
+	}
+
+	public void setList(List<T> list) {
+		this.list = list;
+	}
+
+}

+ 825 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/SqlUtil.java

@@ -0,0 +1,825 @@
+package cn.com.qmth.stmms.ms.commons.utils;
+
+import org.apache.poi.ss.formula.functions.T;
+import org.hibernate.SQLQuery;
+import org.hibernate.transform.Transformers;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: sql工具类
+ * @Author: wangliang
+ * @Date: 2018/10/27
+ */
+@Component("sqlUtil")
+public class SqlUtil {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SqlUtil.class);
+
+    @Autowired
+    private EntityManager entityManager;
+
+    /**
+     * 执行sql 把结果转换成map,支持分页
+     *
+     * @param sql
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    public PageInfo execSqlForMapPageInfo(String sql, Integer curPage, Integer pageSize, String... arguments) {
+        if (sql == null || curPage == null || pageSize == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        return (PageInfo) execSqlTrans(sql, null, 1, true, curPage, pageSize, arguments);
+    }
+
+    /**
+     * 执行sql 把结果转换成map,支持分页
+     *
+     * @param sql
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    public PageInfo execSqlForMapPageInfo(String sql, Integer curPage, Integer pageSize, Object... arguments) {
+        if (sql == null || curPage == null || pageSize == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        return (PageInfo) execSqlTrans(sql, null, 1, true, curPage, pageSize, arguments);
+    }
+
+    /**
+     * sql 执行count
+     *
+     * @param sql
+     * @param execSql
+     * @param arguments
+     * @return
+     */
+    public Integer getTotalCountCustom(String sql, boolean execSql, Object... arguments) {
+        try {
+            List<Object> args = new ArrayList<>();
+            for (Object s : arguments) {
+                args.add(s);
+            }
+            String countSql = null;
+            if (!execSql) {
+                countSql = getCountSqlWithOutDistinct(sql);
+            } else {
+                countSql = sql;
+            }
+            Query query = entityManager.createNativeQuery(countSql);
+            for (int i = 0; i < args.size(); i++) {
+                query.setParameter(i + 1, args.get(i));
+            }
+            return Integer.parseInt(query.getSingleResult().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 自定义sql查询
+     *
+     * @param sql
+     * @param curPage
+     * @param pageSize
+     * @param total
+     * @param arguments
+     * @return
+     */
+    public PageInfo execSqlForMapPageInfoCustom(String sql, Integer curPage, Integer pageSize, Integer total, Object... arguments) {
+        if (sql == null || curPage == null || pageSize == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        return (PageInfo) execSqlTrans(sql, null, 1, true, curPage, pageSize, total, arguments);
+    }
+
+    /**
+     * 执行sql 把结果转换成map
+     *
+     * @param sql
+     * @param arguments
+     * @return
+     */
+    public List<T> execSqlForMap(String sql, String... arguments) {
+        if (sql == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        Query query = (Query) execSqlTrans(sql, null, 1, false, null, null, arguments);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果转换成map
+     *
+     * @param sql
+     * @param arguments
+     * @return
+     */
+    public List<T> execSqlForMap(String sql, Object... arguments) {
+        if (sql == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        Query query = (Query) execSqlTrans(sql, null, 1, false, null, null, arguments);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果按顺序排进List,支持分页
+     *
+     * @param sql
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    public PageInfo execSqlForListPageInfo(String sql, Integer curPage, Integer pageSize, String... arguments) {
+        if (sql == null || curPage == null || pageSize == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        return (PageInfo) execSqlTrans(sql, null, 2, true, curPage, pageSize, arguments);
+    }
+
+    /**
+     * 执行sql 把结果按顺序排进List,支持分页
+     *
+     * @param sql
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    public PageInfo execSqlForListPageInfo(String sql, Integer curPage, Integer pageSize, Object... arguments) {
+        if (sql == null || curPage == null || pageSize == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        return (PageInfo) execSqlTrans(sql, null, 2, true, curPage, pageSize, arguments);
+    }
+
+    /**
+     * 执行sql 把结果按顺序排进List
+     *
+     * @param sql
+     * @param arguments
+     * @return
+     */
+    public List<T> execSqlForList(String sql, String... arguments) {
+        if (sql == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        Query query = (Query) execSqlTrans(sql, null, 2, false, null, null, arguments);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果按顺序排进List
+     *
+     * @param sql
+     * @param arguments
+     * @return
+     */
+    public List<T> execSqlForList(String sql, Object... arguments) {
+        if (sql == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        Query query = (Query) execSqlTrans(sql, null, 2, false, null, null, arguments);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果通过setter方法注入到指定的对像属性中,支持分页
+     *
+     * @param sql
+     * @param cla
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    public PageInfo execSqlForAliasToBeanPageInfo(String sql, Class cla, Integer curPage, Integer pageSize, String... arguments) {
+        if (sql == null || cla == null || curPage == null || pageSize == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        return (PageInfo) execSqlTrans(sql, cla, 3, true, curPage, pageSize, arguments);
+    }
+
+    /**
+     * 执行sql 把结果通过setter方法注入到指定的对像属性中,支持分页
+     *
+     * @param sql
+     * @param cla
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    public PageInfo execSqlForAliasToBeanPageInfo(String sql, Class cla, Integer curPage, Integer pageSize, Object... arguments) {
+        if (sql == null || cla == null || curPage == null || pageSize == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        return (PageInfo) execSqlTrans(sql, cla, 3, true, curPage, pageSize, arguments);
+    }
+
+    /**
+     * 执行sql 把结果通过setter方法注入到指定的对像属性中
+     *
+     * @param sql
+     * @param cla
+     * @param arguments
+     * @return
+     */
+    public List<T> execSqlForAliasToBean(String sql, Class cla, String... arguments) {
+        if (sql == null || cla == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        Query query = (Query) execSqlTrans(sql, cla, 3, false, null, null, arguments);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果通过setter方法注入到指定的对像属性中
+     *
+     * @param sql
+     * @param cla
+     * @param arguments
+     * @return
+     */
+    public List<T> execSqlForAliasToBean(String sql, Class cla, Object... arguments) {
+        if (sql == null || cla == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        Query query = (Query) execSqlTrans(sql, cla, 3, false, null, null, arguments);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果转换成map
+     *
+     * @param sql
+     * @return
+     */
+    public List<T> execSqlForMap(String sql) {
+        Query query = entityManager.createNativeQuery(sql);
+        query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果按顺序排进List
+     *
+     * @param sql
+     * @return
+     */
+    public List<T> execSqlForList(String sql) {
+        Query query = entityManager.createNativeQuery(sql);
+        query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
+        return query.getResultList();
+    }
+
+    /**
+     * 执行sql 把结果按顺序排进List
+     *
+     * @param sql
+     * @return
+     */
+    public List<T> execSqlForAliasToBean(String sql, Class cla) {
+        Query query = entityManager.createNativeQuery(sql);
+        query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(cla));
+        return query.getResultList();
+    }
+
+    /**
+     * sql 拼接and条件
+     *
+     * @param sql
+     * @param fields
+     * @param fieldValues
+     * @param opers
+     * @return
+     */
+    public String sqlConditionAnd(String sql, String[] fields, String[] fieldValues, String[] opers) {
+        if (sql == null || fields == null || fieldValues == null || opers == null) {
+            throw new NullPointerException();
+        }
+        return sqlConditionTrans(sql, "and", fields, fieldValues, opers);
+    }
+
+    /**
+     * sql 拼接and条件
+     *
+     * @param sql
+     * @param fields
+     * @param fieldValues
+     * @param opers
+     * @return
+     */
+    public String sqlConditionAnd(String sql, String[] fields, Object[] fieldValues, String[] opers) {
+        if (sql == null || fields == null || fieldValues == null || opers == null) {
+            throw new NullPointerException();
+        }
+        return sqlConditionTrans(sql, "and", fields, fieldValues, opers);
+    }
+
+    /**
+     * sql findInSetAnd
+     *
+     * @param sql
+     * @param field
+     * @param fieldValue
+     * @return
+     */
+    public String sqlFindInSetAnd(String sql, String field, String fieldValue) {
+        if (sql == null || field == null || fieldValue == null) {
+            throw new NullPointerException();
+        }
+        return new StringBuffer(sql).append(" FIND_IN_SET ").append("(" + fieldValue + "," + field + ")").toString();
+    }
+
+    /**
+     * sql findInSetOr
+     *
+     * @param sql
+     * @param field
+     * @param fieldValue
+     * @return
+     */
+    public String sqlFindInSetOr(String sql, String field, String fieldValue) {
+        if (sql == null || field == null || fieldValue == null) {
+            throw new NullPointerException();
+        }
+        return new StringBuffer(sql).append(" or FIND_IN_SET ").append("(" + fieldValue + "," + field + ")").toString();
+    }
+
+    /**
+     * sql 拼接or条件
+     *
+     * @param sql
+     * @param fields
+     * @param fieldValues
+     * @param opers
+     * @return
+     */
+    public String sqlConditionOr(String sql, String[] fields, String[] fieldValues, String[] opers) {
+        if (sql == null || fields == null || fieldValues == null || opers == null) {
+            throw new NullPointerException();
+        }
+        return sqlConditionTrans(sql, "or", fields, fieldValues, opers);
+    }
+
+    /**
+     * sql 拼接or条件
+     *
+     * @param sql
+     * @param fields
+     * @param fieldValues
+     * @param opers
+     * @return
+     */
+    public String sqlConditionOr(String sql, String[] fields, Object[] fieldValues, String[] opers) {
+        if (sql == null || fields == null || fieldValues == null || opers == null) {
+            throw new NullPointerException();
+        }
+        return sqlConditionTrans(sql, "or", fields, fieldValues, opers);
+    }
+
+    /**
+     * sql 排序
+     *
+     * @param sql
+     * @param field
+     * @return
+     */
+    public String sqlOrderBy(String sql, String field) {
+        if (sql == null || field == null) {
+            throw new NullPointerException();
+        }
+        return new StringBuffer(sql).append(" order by ").append(" " + field + " ").toString();
+    }
+
+    /**
+     * sql 排序 降序
+     *
+     * @param sql
+     * @param field
+     * @return
+     */
+    public String sqlOrderByDesc(String sql, String field) {
+        if (sql == null || field == null) {
+            throw new NullPointerException();
+        }
+        return new StringBuffer(sql).append(" order by ").append(" " + field + " ").append(" desc ").toString();
+    }
+
+    /**
+     * sql group by
+     *
+     * @param sql
+     * @param field
+     * @return
+     */
+    public String sqlGroupBy(String sql, String field) {
+        if (sql == null || field == null) {
+            throw new NullPointerException();
+        }
+        return new StringBuffer(sql).append(" group by ").append(" " + field + " ").toString();
+    }
+
+    /**
+     * sql sqlLimit
+     *
+     * @param sql
+     * @param curPage
+     * @param pageSize
+     * @return
+     */
+    public String sqlLimit(String sql, Integer curPage, Integer pageSize) {
+        return new StringBuffer(sql).append(" limit ").append(curPage).append(",").append(pageSize).toString();
+    }
+
+    /**
+     * sql union
+     *
+     * @param sql
+     * @return
+     */
+    public String sqlUnion(String sql) {
+        return new StringBuffer(sql).append(" union ").toString();
+    }
+
+    /**
+     * sql union all
+     *
+     * @param sql
+     * @return
+     */
+    public String sqlUnionAll(String sql) {
+        return new StringBuffer(sql).append(" union all ").toString();
+    }
+
+    /**
+     * sql 条件转换
+     *
+     * @param sql
+     * @param conditionStr
+     * @param fields
+     * @param fieldValues
+     * @param opers
+     * @return
+     */
+    private String sqlConditionTrans(String sql, String conditionStr, String[] fields, String[] fieldValues, String[] opers) {
+        StringBuffer stringBuffer = new StringBuffer(sql);
+        try {
+            for (int i = 0; i < fields.length; i++) {
+                stringBuffer.append(" " + conditionStr + " ").append(" " + fields[i] + " ").append(" " + opers[i] + " ").append(" " + fieldValues[i] + " ");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return stringBuffer.toString();
+    }
+
+    /**
+     * sql 条件转换
+     *
+     * @param sql
+     * @param conditionStr
+     * @param fields
+     * @param fieldValues
+     * @param opers
+     * @return
+     */
+    private String sqlConditionTrans(String sql, String conditionStr, String[] fields, Object[] fieldValues, String[] opers) {
+        StringBuffer stringBuffer = new StringBuffer(sql);
+        try {
+            for (int i = 0; i < fields.length; i++) {
+                stringBuffer.append(" " + conditionStr + " ").append(" " + fields[i] + " ").append(" " + opers[i] + " ").append(fieldValues[i]);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return stringBuffer.toString();
+    }
+
+    /**
+     * sql 占位符替换
+     *
+     * @param sql
+     * @param str
+     * @param fromIndex
+     * @param count
+     * @param arguments
+     * @return
+     */
+    private String searchStrAndRep(String sql, String str, int fromIndex, int count, String... arguments) {
+        if (sql == null || str == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        try {
+            int index = sql.indexOf(str, fromIndex);
+            if (index != -1) {
+                StringBuilder stringBuilder = new StringBuilder(sql);
+                stringBuilder = new StringBuilder(stringBuilder.substring(0, index)).append(stringBuilder.replace(0, index + 1, "'" + arguments[count] + "'"));
+                return searchStrAndRep(stringBuilder.toString(), str, index + 1, count + 1, arguments);
+            } else {
+                LOGGER.debug("execSql:" + sql);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return sql;
+    }
+
+    /**
+     * sql 占位符替换
+     *
+     * @param sql
+     * @param str
+     * @param fromIndex
+     * @param count
+     * @param arguments
+     * @return
+     */
+    private String searchStrAndRep(String sql, String str, int fromIndex, int count, Object... arguments) {
+        if (sql == null || str == null || arguments == null) {
+            throw new NullPointerException();
+        }
+        try {
+            int index = sql.indexOf(str, fromIndex);
+            if (index != -1) {
+                StringBuilder stringBuilder = new StringBuilder(sql);
+                stringBuilder = new StringBuilder(stringBuilder.substring(0, index)).append(stringBuilder.replace(0, index + 1, String.valueOf(arguments[count])));
+                return searchStrAndRep(stringBuilder.toString(), str, index + 1, count + 1, arguments);
+            } else {
+                LOGGER.debug("execSql:" + sql);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return sql;
+    }
+
+    public ResponseEntity<T> sqlTransEntity() {
+        return null;
+    }
+
+    /**
+     * sql 执行count
+     *
+     * @param sql
+     * @param args
+     * @return
+     */
+    private Integer getTotalCount(String sql, List args) {
+        try {
+            String countSql = getCountSqlWithOutDistinct(sql);
+            Query query = entityManager.createNativeQuery(countSql);
+            for (int i = 0; i < args.size(); i++) {
+                query.setParameter(i + 1, args.get(i));
+            }
+            return Integer.parseInt(query.getSingleResult().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * sql count拼接
+     *
+     * @param sql
+     * @return
+     * @throws Exception
+     */
+    private String getCountSqlWithOutDistinct(String sql) throws Exception {
+        String newsql = null;
+        String countCondition = " count(*) ";
+        if (sql.toLowerCase().contains("distinct")) {
+//            throw new Exception("不能处理空字符串和包含distinct的sql");
+            countCondition = " count(distinct t.id) ";
+        }
+        try {
+            int start = sql.toLowerCase().indexOf("select");
+            int end = sql.toLowerCase().lastIndexOf("from");
+            newsql = sql.substring(0, start + 6) + countCondition + sql.substring(end);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return newsql;
+    }
+
+    /**
+     * sql 结果trans转换
+     *
+     * @param sql
+     * @param cla
+     * @param type
+     * @param isShowPage
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    private Object execSqlTrans(String sql, Class cla, int type, boolean isShowPage, Integer curPage, Integer pageSize, String... arguments) {
+        Query query = null;
+        try {
+            List<String> args = new ArrayList<String>();
+            for (String s : arguments) {
+                args.add(s);
+            }
+            Integer total = getTotalCount(sql.toString(), args);
+            total = total == null ? 0 : total;
+            query = entityManager.createNativeQuery(sql.toString());
+            switch (type) {
+                case 2:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
+                    break;
+                case 3:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(cla));
+                    break;
+                default:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
+                    break;
+            }
+            for (int i = 0; i < args.size(); i++) {
+                query.setParameter(i + 1, args.get(i));
+            }
+            sqlPrint(sql, arguments);
+            if (isShowPage) {
+                //设置分页信息
+                PageInfo pageInfo = new PageInfo();
+                query.setMaxResults(pageSize);
+                query.setFirstResult(curPage * pageSize);
+                pageInfo.setTotal(total);
+                pageInfo.setList(query.getResultList());
+                return pageInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return query;
+    }
+
+    /**
+     * sql 结果trans转换
+     *
+     * @param sql
+     * @param cla
+     * @param type
+     * @param isShowPage
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    private Object execSqlTrans(String sql, Class cla, int type, boolean isShowPage, Integer curPage, Integer pageSize, Object... arguments) {
+        Query query = null;
+        try {
+            List<Object> args = new ArrayList<>();
+            for (Object s : arguments) {
+                args.add(s);
+            }
+            Integer total = getTotalCount(sql.toString(), args);
+            total = total == null ? 0 : total;
+            query = entityManager.createNativeQuery(sql.toString());
+            switch (type) {
+                case 2:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
+                    break;
+                case 3:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(cla));
+                    break;
+                default:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
+                    break;
+            }
+            for (int i = 0; i < args.size(); i++) {
+                query.setParameter(i + 1, args.get(i));
+            }
+            sqlPrint(sql, arguments);
+            if (isShowPage) {
+                //设置分页信息
+                PageInfo pageInfo = new PageInfo();
+                query.setMaxResults(pageSize);
+                query.setFirstResult(curPage * pageSize);
+                pageInfo.setTotal(total);
+                pageInfo.setList(query.getResultList());
+                return pageInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return query;
+    }
+
+    /**
+     * sql 结果trans转换
+     *
+     * @param sql
+     * @param cla
+     * @param type
+     * @param isShowPage
+     * @param curPage
+     * @param pageSize
+     * @param arguments
+     * @return
+     */
+    private Object execSqlTrans(String sql, Class cla, int type, boolean isShowPage, Integer curPage, Integer pageSize, Integer total, Object... arguments) {
+        Query query = null;
+        try {
+            List<Object> args = new ArrayList<>();
+            for (Object s : arguments) {
+                args.add(s);
+            }
+            query = entityManager.createNativeQuery(sql.toString());
+            switch (type) {
+                case 2:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
+                    break;
+                case 3:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(cla));
+                    break;
+                default:
+                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
+                    break;
+            }
+            for (int i = 0; i < args.size(); i++) {
+                query.setParameter(i + 1, args.get(i));
+            }
+            sqlPrint(sql, arguments);
+            if (isShowPage) {
+                //设置分页信息
+                PageInfo pageInfo = new PageInfo();
+                query.setMaxResults(pageSize);
+                query.setFirstResult(curPage * pageSize);
+                pageInfo.setTotal(total);
+                pageInfo.setList(query.getResultList());
+                return pageInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return query;
+    }
+
+    /**
+     * sql打印,替代占位符
+     *
+     * @param sql
+     * @param arguments
+     * @return
+     */
+    public String sqlPrint(String sql, String... arguments) {
+        try {
+            int lastIndexOrder = sql.lastIndexOf("?");
+            if (lastIndexOrder == -1) {
+                LOGGER.error("没有?参数");
+            } else {
+                return searchStrAndRep(sql, "?", 0, 0, arguments);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return sql;
+    }
+
+    /**
+     * sql打印,替代占位符
+     *
+     * @param sql
+     * @param arguments
+     * @return
+     */
+    public String sqlPrint(String sql, Object... arguments) {
+        try {
+            int lastIndexOrder = sql.lastIndexOf("?");
+            if (lastIndexOrder == -1) {
+                LOGGER.error("没有?参数");
+            } else {
+                return searchStrAndRep(sql, "?", 0, 0, arguments);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return sql;
+    }
+}

+ 0 - 1
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/excel/ExcelWriter.java

@@ -182,6 +182,5 @@ public class ExcelWriter extends ExcelUtils{
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
-
     }
 }

+ 32 - 5
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/excel/ExportUtils.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.stmms.ms.commons.utils.excel;
 
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.net.URLEncoder;
@@ -15,20 +17,45 @@ public class ExportUtils {
 
     private static final String DEFALUT_EXT = ".xlsx";
 
-    public static void exportEXCEL(String fileName,Class<?> dataClass,
-                             Collection<?> dataset,HttpServletResponse response) {
+    public static void exportEXCEL(String fileName, Class<?> dataClass,
+                                   Collection<?> dataset, HttpServletResponse response) {
         try {
-        	
+
             response.setHeader("Content-Disposition", "inline; filename="
-                    +URLEncoder.encode(fileName, "UTF-8") + DEFALUT_EXT);
+                    + URLEncoder.encode(fileName, "UTF-8") + DEFALUT_EXT);
             response.setContentType(DEFALUT_CONTENT_TYPE);
             ServletOutputStream outputStream = response.getOutputStream();
             ExcelWriter excelExporter = new ExcelWriter(dataClass);
-            excelExporter.write("sheet1",dataset,outputStream);
+            excelExporter.write("sheet1", dataset, outputStream);
             outputStream.flush();
             outputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
+
+    /**
+     * excort导出
+     *
+     * @param fileName
+     * @param wb
+     * @param response
+     */
+    public static void exportEXCEL(String fileName, HSSFWorkbook wb, HttpServletResponse response) {
+        try {
+            try {
+                response.setHeader("Content-Disposition", "inline; filename="
+                        + URLEncoder.encode(fileName, "UTF-8") + DEFALUT_EXT);
+                response.setContentType(DEFALUT_CONTENT_TYPE);
+                ServletOutputStream outputStream = response.getOutputStream();
+                wb.write(outputStream);
+                outputStream.flush();
+                outputStream.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 102 - 100
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLog.java

@@ -1,141 +1,143 @@
 package cn.com.qmth.stmms.ms.core.domain;
 
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.Date;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
 /**
- * 
- * @Description: 操作记录
  * @author ting.yin
+ * @Description: 操作记录
  * @date 2016年10月21日
  */
 @Entity
 public class MarkLog implements Serializable {
 
-	private static final long serialVersionUID = -8376036816154911286L;
+    private static final long serialVersionUID = -8376036816154911286L;
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    private Long workId;
 
-	@Id
-	@GeneratedValue
-	private Long id;
+    private Long paperId;
 
-	private Long workId;
+    private Long markerId;
 
-	private MarkStage markStage;
+    private String markerName;
 
-	private String loginName;
-	
-	private String markerName;
+    @Enumerated(value = EnumType.ORDINAL)
+    private MarkStage markStage;
 
-	private String examNumber;
-	
-	private String secretNumber;
+    private String remark;
 
-	private String remark;
-	
-	private String result;
+    private String result;
 
-	@Temporal(value = TemporalType.DATE)
-	private Date createdOn;
+    @Enumerated(value = EnumType.STRING)
+    private Subject subject;
 
-	public MarkLog() {
-	}
+    @Temporal(value = TemporalType.DATE)
+    private Date createdOn;
 
-	public MarkLog(Long workId, MarkStage markStage, String loginName, String markerName,
-			String examNumber,String secretNumber,String result) {
-		this.workId = workId;
-		this.markStage = markStage;
-		this.loginName = loginName;
-		this.markerName = markerName;
-		this.examNumber = examNumber;
-		this.secretNumber = secretNumber;
-		this.result = result;
-		this.createdOn = new Date();
-	}
+    public MarkLog() {
+    }
 
-	public Long getId() {
-		return id;
-	}
+    public MarkLog(Long workId, Long paperId, Long markerId, String markerName, MarkStage markStage, String remark,
+                   String result, Subject subject) {
+        this.workId = workId;
+        this.paperId = paperId;
+        this.markerId = markerId;
+        this.markerName = markerName;
+        this.markStage = markStage;
+        this.remark = remark;
+        this.result = result;
+        this.subject = subject;
+        this.createdOn = new Date();
+    }
 
-	public void setId(Long id) {
-		this.id = id;
-	}
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
 
-	public Long getWorkId() {
-		return workId;
-	}
+    public Long getPaperId() {
+        return paperId;
+    }
 
-	public void setWorkId(Long workId) {
-		this.workId = workId;
-	}
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
 
-	public MarkStage getMarkStage() {
-		return markStage;
-	}
+    public Long getMarkerId() {
+        return markerId;
+    }
 
-	public void setMarkStage(MarkStage markStage) {
-		this.markStage = markStage;
-	}
+    public void setMarkerId(Long markerId) {
+        this.markerId = markerId;
+    }
 
-	public String getRemark() {
-		return remark;
-	}
+    public String getMarkerName() {
+        return markerName;
+    }
 
-	public void setRemark(String remark) {
-		this.remark = remark;
-	}
+    public void setMarkerName(String markerName) {
+        this.markerName = markerName;
+    }
 
-	public Date getCreatedOn() {
-		return createdOn;
-	}
+    public Subject getSubject() {
+        return subject;
+    }
 
-	public void setCreatedOn(Date createdOn) {
-		this.createdOn = createdOn;
-	}
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
 
-	public String getResult() {
-		return result;
-	}
+    public Long getId() {
+        return id;
+    }
 
-	public void setResult(String result) {
-		this.result = result;
-	}
+    public void setId(Long id) {
+        this.id = id;
+    }
 
-	public String getLoginName() {
-		return loginName;
-	}
+    public Long getWorkId() {
+        return workId;
+    }
 
-	public void setLoginName(String loginName) {
-		this.loginName = loginName;
-	}
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
 
-	public String getMarkName() {
-		return markerName;
-	}
+    public MarkStage getMarkStage() {
+        return markStage;
+    }
 
-	public void setMarkName(String markName) {
-		this.markerName = markName;
-	}
+    public void setMarkStage(MarkStage markStage) {
+        this.markStage = markStage;
+    }
 
-	public String getExamNumber() {
-		return examNumber;
-	}
+    public String getRemark() {
+        return remark;
+    }
 
-	public void setExamNumber(String examNumber) {
-		this.examNumber = examNumber;
-	}
-
-	public String getSecretNumber() {
-		return secretNumber;
-	}
-
-	public void setSecretNumber(String secretNumber) {
-		this.secretNumber = secretNumber;
-	}
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
 
+    public Date getCreatedOn() {
+        return createdOn;
+    }
+
+    public void setCreatedOn(Date createdOn) {
+        this.createdOn = createdOn;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
 }

+ 8 - 7
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ExamQuestionRepo.java

@@ -2,7 +2,6 @@ package cn.com.qmth.stmms.ms.core.repository;
 
 import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
-
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
@@ -10,16 +9,18 @@ import java.util.List;
 /**
  * Created by zhengmin on 2016/10/9.
  */
-public interface ExamQuestionRepo extends JpaRepository<ExamQuestion,Long>{
+public interface ExamQuestionRepo extends JpaRepository<ExamQuestion, Long> {
 
     List<ExamQuestion> findByWorkIdAndSubject(Long workId, Subject subject);
 
-	long countByWorkId(Long workId);
+    long countByWorkId(Long workId);
+
+    long countByWorkIdAndAreaCode(Long workId, String areaCode);
 
-	long countByWorkIdAndAreaCode(Long workId,String areaCode);
+    ExamQuestion findByWorkIdAndSubjectAndAreaCode(Long workId,
+                                                   Subject subject, String areaCode);
 
-	ExamQuestion findByWorkIdAndSubjectAndAreaCode(Long workId,
-			Subject subject, String areaCode);
+    void deleteByWorkId(Long workId);
 
-	void deleteByWorkId(Long workId);
+    List<ExamQuestion> findAllByAreaCodeAndSubject(String areaCode, Subject subject);
 }

+ 8 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkSubjectRepo.java

@@ -3,9 +3,17 @@ package cn.com.qmth.stmms.ms.core.repository;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+
 /**
  * Created by zhengmin on 2016/9/24.
  */
 public interface MarkSubjectRepo extends JpaRepository<MarkSubject,String> {
 
+    /**
+     * 根据workId查找所有科目
+     * @param workId
+     * @return
+     */
+    public List<MarkSubject> findAllByWorkId(Long workId);
 }

+ 43 - 23
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -1,15 +1,13 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
-import java.util.List;
-
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
-import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
+import java.util.List;
 
 /**
  * Created by zhengmin on 2016/9/23.
@@ -35,6 +33,10 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
 
     long countByMarkerIdAndQuestionId(Long markerId, Long questionId);
 
+    long countByQuestionIdIn(List<Long> questionIds);
+
+    long countByQuestionId(Long questionId);
+
     int countByWorkIdAndSubjectAndMarkerIdAndStageAndResult(Long workId, Subject subject, Long markerId, MarkStage stage, String result);
 
     int countByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionIdAndResult(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId, String result);
@@ -87,14 +89,20 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     /**
      * 统计评卷员指定试题的各档位数量
      *
-     * @param questionId
+     * @param questionIds
      * @param markerId
      * @return
      */
+//    @Query(value = "SELECT t.result,COUNT(*) FROM mark_task t " +
+//            "WHERE t.`question_id` = ? AND t.`marker_id` = ? and t.stage = 1 " +
+//            "GROUP BY t.`result` ORDER BY t.result", nativeQuery = true)
+//    List<Object[]> countGroupByQuestionIdAndLevel(Long questionId, Long markerId);
+
+    //2019.10.16修改为所有试卷
     @Query(value = "SELECT t.result,COUNT(*) FROM mark_task t " +
-            "WHERE t.`question_id` = ? AND t.`marker_id` = ? and t.stage = 1 " +
-            "GROUP BY t.`result` ORDER BY t.result", nativeQuery = true)
-    List<Object[]> countGroupByQuestionIdAndLevel(Long questionId, Long markerId);
+            "WHERE t.`question_id` in (?) and t.stage = 1 " +
+            "GROUP BY t.`result`,t.question_id ORDER BY t.result", nativeQuery = true)
+    List<Object[]> countGroupByQuestionIdAndLevel(List<Long> questionId);
 
     @Query(value = "SELECT t.result,COUNT(*) FROM mark_task t " +
             "WHERE t.`marker_id` = ? and t.stage = 1 " +
@@ -102,13 +110,25 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
     List<Object[]> countGroupByLevel(Long markerId);
 
 
+    //    @Query(value = "SELECT COUNT(*) FROM mark_task t " +
+//            "WHERE t.`marker_id` = ? and t.stage = 1 and t.result = ? ", nativeQuery = true)
+//    int countByLevelAndResult(Long markerId, String result);
+    //2019.10.16修改为所有老师的评卷
     @Query(value = "SELECT COUNT(*) FROM mark_task t " +
-            "WHERE t.`marker_id` = ? and t.stage = 1 and t.result = ? ", nativeQuery = true)
-    int countByLevelAndResult(Long markerId, String result);
+            "WHERE t.`question_id` in (?) and t.stage = 1 and t.result = ? ", nativeQuery = true)
+    int countByLevelAndResult(Long questionId, String result);
 
+    //    @Query(value = "SELECT COUNT(*) FROM mark_task t " +
+//            "WHERE t.`marker_id` = ? and t.stage = 1 and t.result is null", nativeQuery = true)
+//    int countByLevel(Long markerId);
+    //2019.10.16修改为所有老师的评卷
     @Query(value = "SELECT COUNT(*) FROM mark_task t " +
-            "WHERE t.`marker_id` = ? and t.stage = 1 and t.result is null", nativeQuery = true)
-    int countByLevel(Long markerId);
+            "WHERE t.`question_id` in (?) and t.stage = 1 and t.result is null", nativeQuery = true)
+    int countByLevel(Long questionId);
+
+    int countByQuestionIdInAndStageAndResult(List<Long> questionIds, MarkStage stage, String result);
+
+    int countByQuestionIdInAndStageAndResultIsNull(List<Long> questionIds, MarkStage stage);
 
 
     /**
@@ -119,18 +139,18 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     Long countByPaperId(Long id);
 
-	int countByWorkIdAndSubjectAndStageAndResult(Long workId,Subject markSubject, MarkStage level, String code);
+    int countByWorkIdAndSubjectAndStageAndResult(Long workId, Subject markSubject, MarkStage level, String code);
+
+    int countByWorkIdAndSubjectAndStage(Long workId, Subject markSubject, MarkStage level);
 
-	int countByWorkIdAndSubjectAndStage(Long workId, Subject markSubject,MarkStage level);
+    int countByWorkIdAndSubjectAndStageAndQuestionIdAndResult(Long workId, Subject subject, MarkStage level, Long id, String code);
 
-	int countByWorkIdAndSubjectAndStageAndQuestionIdAndResult(Long workId, Subject subject, MarkStage level, Long id,String code);
+    int countByWorkIdAndSubjectAndStageAndQuestionId(Long workId, Subject subject, MarkStage level, Long id);
 
-	int countByWorkIdAndSubjectAndStageAndQuestionId(Long workId,Subject subject, MarkStage level, Long id);
+    List<MarkTask> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
 
-	List<MarkTask> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
-	
-	 @Query(value = "SELECT max(t.randomSeq) FROM MarkTask t " +
-	            "WHERE t.workId = ?1 and t.subject = ?2 and t.markerId = ?3 and t.stage = ?4 and t.questionId = ?5 ")
-	Integer findRandomSeqByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId);
+    @Query(value = "SELECT max(t.randomSeq) FROM MarkTask t " +
+            "WHERE t.workId = ?1 and t.subject = ?2 and t.markerId = ?3 and t.stage = ?4 and t.questionId = ?5 ")
+    Integer findRandomSeqByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(Long workId, Subject subject, Long markerId, MarkStage stage, Long questionId);
 
 }

+ 103 - 49
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/specification/StudentSpecification.java

@@ -1,14 +1,12 @@
 package cn.com.qmth.stmms.ms.core.specification;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.criteria.Predicate;
-
-import org.springframework.data.jpa.domain.Specification;
-
 import cn.com.qmth.stmms.ms.commons.utils.specification.PagingAndSortingSpecification;
 import cn.com.qmth.stmms.ms.core.domain.Student;
+import org.springframework.data.jpa.domain.Specification;
+
+import javax.persistence.criteria.Predicate;
+import java.util.ArrayList;
+import java.util.List;
 
 public class StudentSpecification extends PagingAndSortingSpecification {
 
@@ -18,24 +16,68 @@ public class StudentSpecification extends PagingAndSortingSpecification {
     private String name;
     private String uploadStatus;
     private Boolean isAbsent;
+    private Long startNumber;//起始考号
+    private Long endNumber;//终止考号
+    private Boolean upload;//上传状态
+    private String subject;//科目
+
+    public Boolean getAbsent() {
+        return isAbsent;
+    }
+
+    public void setAbsent(Boolean absent) {
+        isAbsent = absent;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public Long getStartNumber() {
+        return startNumber;
+    }
+
+    public void setStartNumber(Long startNumber) {
+        this.startNumber = startNumber;
+    }
+
+    public Long getEndNumber() {
+        return endNumber;
+    }
+
+    public void setEndNumber(Long endNumber) {
+        this.endNumber = endNumber;
+    }
+
+    public Boolean getUpload() {
+        return upload;
+    }
+
+    public void setUpload(Boolean upload) {
+        this.upload = upload;
+    }
 
     public String getWorkId() {
-		return workId;
-	}
+        return workId;
+    }
 
-	public void setWorkId(String workId) {
-		this.workId = workId;
-	}
+    public void setWorkId(String workId) {
+        this.workId = workId;
+    }
 
     public String getAreaCode() {
-		return areaCode;
-	}
+        return areaCode;
+    }
 
-	public void setAreaCode(String areaCode) {
-		this.areaCode = areaCode;
-	}
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
 
-	public String getName() {
+    public String getName() {
         return name;
     }
 
@@ -44,50 +86,62 @@ public class StudentSpecification extends PagingAndSortingSpecification {
     }
 
     public String getExamNumber() {
-		return examNumber;
-	}
+        return examNumber;
+    }
 
-	public void setExamNumber(String examNumber) {
-		this.examNumber = examNumber;
-	}
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
 
-	public Boolean getIsAbsent() {
-		return isAbsent;
-	}
+    public Boolean getIsAbsent() {
+        return isAbsent;
+    }
 
-	public void setIsAbsent(Boolean isAbsent) {
-		this.isAbsent = isAbsent;
-	}
+    public void setIsAbsent(Boolean isAbsent) {
+        this.isAbsent = isAbsent;
+    }
 
-	public String getUploadStatus() {
-		return uploadStatus;
-	}
+    public String getUploadStatus() {
+        return uploadStatus;
+    }
 
-	public void setUploadStatus(String uploadStatus) {
-		this.uploadStatus = uploadStatus;
-	}
+    public void setUploadStatus(String uploadStatus) {
+        this.uploadStatus = uploadStatus;
+    }
 
-	@Override
-    public Specification<Student> getSpecification(){
+    @Override
+    public Specification<Student> getSpecification() {
         return (root, query, cb) -> {
             List<Predicate> predicates = new ArrayList<Predicate>();
-            if(getName() != null){
-                predicates.add(cb.like(root.get("name"), "%"+getName()+"%"));
+            if (getName() != null) {
+                predicates.add(cb.like(root.get("name"), "%" + getName() + "%"));
             }
-            if(getExamNumber() != null){
-                predicates.add(cb.like(root.get("examNumber"),"%"+getExamNumber()+"%"));
+//            if(getExamNumber() != null){
+//                predicates.add(cb.like(root.get("examNumber"),"%"+getExamNumber()+"%"));
+//            }
+            if (getWorkId() != null) {
+                predicates.add(cb.equal(root.get("workId"), getWorkId()));
             }
-            if(getWorkId() != null){
-                predicates.add(cb.equal(root.get("workId"),getWorkId()));
+            if (getAreaCode() != null) {
+                predicates.add(cb.equal(root.get("areaCode"), getAreaCode()));
             }
-            if(getAreaCode() != null){
-                predicates.add(cb.equal(root.get("areaCode"),getAreaCode()));
+            if (getIsAbsent() != null) {
+                predicates.add(cb.equal(root.get("isAbsent"), getIsAbsent()));
             }
-            if(getIsAbsent()!= null){
-                predicates.add(cb.equal(root.get("isAbsent"),getIsAbsent()));
+//            if (getUploadStatus() != null) {
+//                predicates.add(cb.like(root.get("uploadStatus"), "%" + getUploadStatus() + "%"));
+//            }
+            if (startNumber != null && endNumber != null) {
+                predicates.add(cb.between(root.get("examNumber"), startNumber, endNumber));
+            } else if (startNumber != null) {
+                predicates.add(cb.equal(root.get("examNumber"), startNumber));
+            } else if (endNumber != null) {
+                predicates.add(cb.equal(root.get("examNumber"), endNumber));
             }
-            if(getUploadStatus() != null){
-                predicates.add(cb.like(root.get("uploadStatus"),"%"+getUploadStatus()+"%"));
+            if (getUpload() != null && !getUpload()) {
+                predicates.add(cb.equal(root.get("uploadStatus"), "SX:0,SC:0,SM:0"));
+            } else if (getUpload() != null && getUpload()) {
+                predicates.add(cb.equal(root.get("uploadStatus"), "SX:1,SC:1,SM:1"));
             }
             return cb.and(predicates.toArray(new Predicate[predicates.size()]));
         };

+ 12 - 5
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/MarkLogAop.java

@@ -54,14 +54,21 @@ public class MarkLogAop {
     @Autowired
     private LoginConfig loginConfig;
 
+    /**
+     * 评卷员切入点
+     */
 	@Pointcut("execution(* cn.com.qmth.stmms.ms.marking.api.MarkTaskApi.marking(..))")
 	public void getTask() {
 	}
 
+    /**
+     * 评卷员切入方法
+     * @param joinPoint
+     */
 	@AfterReturning(pointcut = "getTask()")
 	public void afterMarkPoint(JoinPoint joinPoint) {
-		MarkTask markTask = (MarkTask) joinPoint.getArgs()[0];
-		MarkUser markUser = markUserRepo.findOne(markTask.getMarkerId());
+//		MarkTask markTask = (MarkTask) joinPoint.getArgs()[0];
+//		MarkUser markUser = markUserRepo.findOne(markTask.getMarkerId());
 //		MarkLog markLog = new MarkLog(markTask.getWorkId(),
 //									markTask.getStage(),
 //									markUser.getLoginName(),
@@ -70,9 +77,9 @@ public class MarkLogAop {
 //									markTask.getPaper().getSecretNumber(),
 //									markTask.getResult());
 //		markLogRepo.save(markLog);
-		String info = markUser.getLoginName() + ":" + markUser.getName() + ":" + markTask.getSubject() +
-				":" + markTask.getPaper().getId() + ":" + markTask.getResult();
-		logger.info(info);
+//		String info = markUser.getLoginName() + ":" + markUser.getName() + ":" + markTask.getSubject() +
+//				":" + markTask.getPaper().getId() + ":" + markTask.getResult();
+//		logger.info(info);
 	}
 
 	/**

+ 15 - 9
stmms-ms-main/src/main/resources/application-dev.properties

@@ -1,6 +1,6 @@
-spring.datasource.url=jdbc:mysql://localhost:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.url=jdbc:mysql://localhost:3306/stmms-ms-3?useUnicode=true&characterEncoding=UTF-8
 spring.datasource.username=root
-spring.datasource.password=123456
+spring.datasource.password=123456789
 
 spring.datasource.validation-query=SELECT 1 FROM DUAL
 spring.datasource.test-on-borrow=true
@@ -15,8 +15,8 @@ server.compression.mime-types: application/json,application/xml,text/html,text/x
 
 
 logging.file=./logs/sys.log
-logging.level.org.springframework=ERROR
-logging.level.org.hibernate=ERROR
+logging.level.org.springframework=info
+logging.level.org.hibernate=info
 
 spring.jpa.show-sql=true
 spring.jpa.hibernate.ddl-auto=update
@@ -25,12 +25,18 @@ spring.jpa.hibernate.ddl-auto=update
 spring.http.multipart.max-file-size=10Mb
 
 app.config.deviation=2
+#超级管理员账号
 app.admin.loginName=admin-cy
+#超级管理员密码
 app.admin.password=123456
-
-sys.config.imageDir=/Users/ting.yin/Downloads/meishu/images
-sys.config.thumbDir=/Users/ting.yin/Downloads/meishu/thumbs
-sys.config.sheetDir=/Users/ting.yin/Downloads/meishu/sheet
+#采集端-超级管理员账号
+app.client.loginName=client-cy
+#采集端-超级管理员密码
+app.client.password=123456
+
+sys.config.imageDir=/Users/king/Downloads/meishu/images
+sys.config.thumbDir=/Users/king/Downloads/meishu/thumbs
+sys.config.sheetDir=/Users/king/Downloads/meishu/sheet
 sys.config.watermark=/Users/yuanpan/tmp/stmms-ms/static/watermark
 #sys.config.imageDir=.\\static\\images
 #sys.config.thumbDir=.\\static\\thumbs
@@ -41,7 +47,7 @@ sys.config.imageServer.ip=localhost
 
 
 #\u524d\u7aef\u9759\u6001\u8d44\u6e90\u76ee\u5f55
-web.upload-path=/Users/ting.yin/Downloads/meishu
+web.upload-path=/Users/king/git/MS/static/
 spring.mvc.static-path-pattern=/**
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
 

+ 4 - 0
stmms-ms-main/src/main/resources/application-gz.properties

@@ -35,6 +35,10 @@ app.config.deviation=2
 app.admin.loginName=admin-cy
 #超级管理员密码
 app.admin.password=123456
+#采集端-超级管理员账号
+app.client.loginName=client-cy
+#采集端-超级管理员密码
+app.client.password=123456
 #大图存放目录
 sys.config.imageDir=D:\\stmms-ms\\images
 #缩略图存放目录

+ 4 - 0
stmms-ms-main/src/main/resources/application-qmth.properties

@@ -32,6 +32,10 @@ spring.http.multipart.max-file-size=10Mb
 app.config.deviation=2
 app.admin.loginName=admin-cy
 app.admin.password=123456
+#采集端-超级管理员账号
+app.client.loginName=client-cy
+#采集端-超级管理员密码
+app.client.password=123456
 
 sys.config.imageDir=D:\\stmms-ms\\images
 sys.config.thumbDir=D:\\stmms-ms\\thumbs

+ 74 - 38
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java

@@ -1,32 +1,32 @@
 package cn.com.qmth.stmms.ms.marking.api;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
+import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
+import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
+import cn.com.qmth.stmms.ms.core.domain.Level;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.domain.user.Role;
+import cn.com.qmth.stmms.ms.core.repository.*;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
 import cn.com.qmth.stmms.ms.marking.assembler.LevelStatAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.MarkerAssembler;
 import cn.com.qmth.stmms.ms.marking.assembler.QuestionStatAssembler;
 import cn.com.qmth.stmms.ms.marking.dto.LevelStatDTO;
 import cn.com.qmth.stmms.ms.marking.dto.MarkerDTO;
 import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
-
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import cn.com.qmth.stmms.ms.core.domain.Level;
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
-import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
-import cn.com.qmth.stmms.ms.core.domain.user.MarkRight;
-import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
-import cn.com.qmth.stmms.ms.core.domain.user.Role;
-import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 评卷中,评卷员的相关数据api
@@ -35,6 +35,7 @@ import cn.com.qmth.stmms.ms.core.vo.Subject;
 @RestController
 @RequestMapping("api/markers")
 public class MakrerApi {
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(MakrerApi.class);
 
     @Autowired
     private MarkUserRepo markUserRepo;
@@ -57,6 +58,12 @@ public class MakrerApi {
     @Autowired
     private LevelStatAssembler levelStatAssembler;
 
+    @Autowired
+    ExamQuestionRepo examQuestionRepo;
+
+    @Autowired
+    SqlUtil sqlUtil;
+
     /**
      * 评卷员信息
      *
@@ -72,9 +79,8 @@ public class MakrerApi {
     /**
      * 评卷员列表
      *
-     * @param workId    评卷工作id
-     * @param subject   科目
-     * @param markStage 允许参与的阶段
+     * @param workId  评卷工作id
+     * @param subject 科目
      * @return
      */
     @RequestMapping(method = RequestMethod.GET)
@@ -99,29 +105,52 @@ public class MakrerApi {
      * @return
      */
     @RequestMapping(value = "{marker}/stat/levels", method = RequestMethod.GET)
-    public List<LevelStatDTO> levelStats(@PathVariable MarkUser marker, @RequestParam Long questionId) {
+    public List<LevelStatDTO> levelStats(@PathVariable MarkUser marker, @RequestParam Long questionId) throws Exception {
         List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
 //        markTaskRepo.countGroupByLevel(marker.getId())
 //                .forEach(o -> {
 //                    levelStatAssembler.toDTO(o);
 //                    levelStatDTOs.add();
 //                });
-
-        markTaskRepo.countGroupByQuestionIdAndLevel(questionId, marker.getId())
-                .forEach(o -> {
-                    LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
-                    if (levelStatDTO.getId() == null) {
-                        int gcount = markTaskRepo.countByLevel(marker.getId());
-                        levelStatDTO.setGcount(gcount);
-                    } else {
-                        int gcount = markTaskRepo.countByLevelAndResult(marker.getId(), levelStatDTO.getId().toString());
-                        levelStatDTO.setGcount(gcount);
-                    }
-                    levelStatDTOs.add(levelStatDTO);
-                });
+        ExamQuestion examQuestion = examQuestionRepo.findOne(questionId);
+        if (Objects.isNull(examQuestion)) {
+            throw new Exception("当前考试试卷为空");
+        }
+        //获取当前考试当前科目所在地区的所有questionId
+        List<ExamQuestion> examQuestionList = examQuestionRepo.findAllByAreaCodeAndSubject(examQuestion.getAreaCode(), examQuestion.getSubject());
+        List<Long> questionIds = examQuestionList.stream()
+                .map(m -> m.getId())
+                .collect(Collectors.toList());
+        StringBuilder startSql = new StringBuilder("SELECT t.result,COUNT(*) as sumCount FROM mark_task t WHERE t.`question_id` in ( ");
+        String endSql = " ) and t.stage = 1 GROUP BY t.`result`,t.question_id ORDER BY t.result ";
+        questionIds.forEach(o -> startSql.append(o).append(","));
+        //当前老师当前试卷的评档次数
+        StringBuilder sql = new StringBuilder(startSql.toString().substring(0, startSql.toString().length() - 1));
+        sql.append(endSql);
+        List list = sqlUtil.execSqlForMap(sql.toString());
+        for (int i = 0; i < list.size(); i++) {
+            Map map = (Map) list.get(i);
+            List finalList = (List) map.values().stream()
+                    .collect(Collectors.toList());
+            Object[] o = finalList.toArray();
+            LevelStatDTO levelStatDTO = levelStatAssembler.toDTO(o);
+            if (levelStatDTO.getId() == null) {
+                //当前老师未评档的次数
+//              int gcount = markTaskRepo.countByLevel(marker.getId());
+                int gcount = markTaskRepo.countByQuestionIdInAndStageAndResultIsNull(questionIds, MarkStage.LEVEL);
+                levelStatDTO.setGcount(gcount);
+            } else {
+                //当前老师每个档位已评档位的次数
+//              int gcount = markTaskRepo.countByLevelAndResult(marker.getId(), levelStatDTO.getId().toString());
+                int gcount = markTaskRepo.countByQuestionIdInAndStageAndResult(questionIds, MarkStage.LEVEL, levelStatDTO.getId().toString());
+                levelStatDTO.setGcount(gcount);
+            }
+            levelStatDTOs.add(levelStatDTO);
+        }
         MarkSubject markSubject = markSubjectRepo.findOne(marker.getWorkId() + "-" + marker.getSubject().toString());
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
         for (Level level : levels) {
+            //所有档位依次比较
             long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
             if (count == 0) {
                 LevelStatDTO dto = new LevelStatDTO();
@@ -129,13 +158,20 @@ public class MakrerApi {
                 dto.setCount(0);
                 dto.setPercent(0.0);
 
-                int gcount = markTaskRepo.countByLevelAndResult(marker.getId(), level.getCode());
+                //当前老师当前档位评档次数(所有考试)
+//                int gcount = markTaskRepo.countByLevelAndResult(marker.getId(), level.getCode());
+                int gcount = markTaskRepo.countByQuestionIdInAndStageAndResult(questionIds, MarkStage.LEVEL, level.getCode());
                 dto.setGcount(gcount);
                 levelStatDTOs.add(dto);
             }
         }
-        long kdtotal = markTaskRepo.countByMarkerIdAndQuestionId(marker.getId(), questionId);
-        long total = markTaskRepo.countByMarkerId(marker.getId());
+
+        //当前老师当前试卷的评档次数(不分档位)
+//        long kdtotal = markTaskRepo.countByMarkerIdAndQuestionId(marker.getId(), questionId);
+        long kdtotal = markTaskRepo.countByQuestionIdIn(questionIds);
+        //当前老师所有的评档次数(不分档位)
+//        long total = markTaskRepo.countByMarkerId(marker.getId());
+        long total = markTaskRepo.countByQuestionId(questionId);
 
         levelStatDTOs.forEach(o -> {
             if (o.getId() != null) {

+ 110 - 88
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.ms.marking.api;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import cn.com.qmth.stmms.ms.marking.assembler.LevelStatAssembler;
-import cn.com.qmth.stmms.ms.marking.assembler.QuestionStatAssembler;
-import cn.com.qmth.stmms.ms.marking.dto.LevelStatDTO;
-import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
-import cn.com.qmth.stmms.ms.marking.service.StageControlService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
@@ -23,6 +8,21 @@ import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
 import cn.com.qmth.stmms.ms.core.domain.user.Role;
 import cn.com.qmth.stmms.ms.core.repository.*;
+import cn.com.qmth.stmms.ms.marking.assembler.LevelStatAssembler;
+import cn.com.qmth.stmms.ms.marking.assembler.QuestionStatAssembler;
+import cn.com.qmth.stmms.ms.marking.dto.LevelStatDTO;
+import cn.com.qmth.stmms.ms.marking.dto.QuestionStatDTO;
+import cn.com.qmth.stmms.ms.marking.service.StageControlService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 评卷科目数据api
@@ -46,57 +46,71 @@ public class MarkSubjectApi {
 
     @Autowired
     private LevelStatAssembler levelStatAssembler;
-    
-	@Autowired
-	private MarkerGroupRepo markerGroupRepo;
-	
-	@Autowired
-	private MarkUserRepo markUserRepo;
-	
-	@Autowired
-	private StageControlService stageControlService;
+
+    @Autowired
+    private MarkerGroupRepo markerGroupRepo;
+
+    @Autowired
+    private MarkUserRepo markUserRepo;
+
+    @Autowired
+    private StageControlService stageControlService;
+
+    /**
+     * 查询所有科目状态
+     *
+     * @param workId
+     * @return
+     */
+    @RequestMapping(value = "getAllSubjectStage/{workId}", method = RequestMethod.GET)
+    public List<MarkSubject> getAllSubjectStage(@PathVariable Long workId) {
+        return markSubjectRepo.findAllByWorkId(workId);
+    }
 
     /**
      * 当个评卷科目信息
+     *
      * @param markSubjectId 评卷科目id
      * @return
      */
-    @RequestMapping(value = "{markSubjectId}",method = RequestMethod.GET)
-    public MarkSubject get(@PathVariable String markSubjectId){
+    @RequestMapping(value = "{markSubjectId}", method = RequestMethod.GET)
+    public MarkSubject get(@PathVariable String markSubjectId) {
         return markSubjectRepo.findOne(markSubjectId);
     }
 
     /**
      * 该评卷科目下的评卷员列表
+     *
      * @param markSubject 评卷科目id
      * @return
      */
-    @RequestMapping(value = "{markSubject}/markers",method = RequestMethod.GET)
-    public List<MarkUser> markUsers(@PathVariable MarkSubject markSubject){
-        List<MarkUser>  markUsers = markUserRepo.findByWorkIdAndSubjectAndRole(markSubject.getWorkId(),markSubject.getSubject(), Role.MARKER);
-        if(MarkStage.LEVEL == markSubject.getStage() ){
-            markUsers = markUsers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_LEVELING||m.getMarkRight() == MarkRight.ALLOW_ALL).collect(Collectors.toList());
-        }else if(MarkStage.SCORE == markSubject.getStage()){
-            markUsers = markUsers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_SCORING||m.getMarkRight() == MarkRight.ALLOW_ALL).collect(Collectors.toList());
+    @RequestMapping(value = "{markSubject}/markers", method = RequestMethod.GET)
+    public List<MarkUser> markUsers(@PathVariable MarkSubject markSubject) {
+        List<MarkUser> markUsers = markUserRepo.findByWorkIdAndSubjectAndRole(markSubject.getWorkId(), markSubject.getSubject(), Role.MARKER);
+        if (MarkStage.LEVEL == markSubject.getStage()) {
+            markUsers = markUsers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_LEVELING || m.getMarkRight() == MarkRight.ALLOW_ALL).collect(Collectors.toList());
+        } else if (MarkStage.SCORE == markSubject.getStage()) {
+            markUsers = markUsers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_SCORING || m.getMarkRight() == MarkRight.ALLOW_ALL).collect(Collectors.toList());
         }
         return markUsers;
     }
 
     /**
      * 该评卷科目的试题统计信息
+     *
      * @param markSubject 评卷科目id
      * @return
      */
-    @RequestMapping(value = "{markSubject}/stat/questions",method = RequestMethod.GET)
-    public List<QuestionStatDTO> questions(@PathVariable MarkSubject markSubject){
+    @RequestMapping(value = "{markSubject}/stat/questions", method = RequestMethod.GET)
+    public List<QuestionStatDTO> questions(@PathVariable MarkSubject markSubject) {
         List<QuestionStatDTO> questionStatDTOs = new ArrayList<>();
         List<Object[]> qStats = null;
-        if(markSubject.getStage() == MarkStage.LEVEL){
-        	qStats = paperRepo.countGroupByQuestionForLevel(markSubject.getWorkId(),markSubject.getSubject().toString());
-        }else{
-        	qStats = paperRepo.countGroupByQuestionForScore(markSubject.getWorkId(),markSubject.getSubject().toString());
+        if (markSubject.getStage() == MarkStage.LEVEL) {
+            qStats = paperRepo.countGroupByQuestionForLevel(markSubject.getWorkId(), markSubject.getSubject().toString());
+        } else {
+            qStats = paperRepo.countGroupByQuestionForScore(markSubject.getWorkId(), markSubject.getSubject().toString());
         }
-        for(Object[] objects : qStats){
+        for (Object[] objects : qStats) {
             QuestionStatDTO dto = questionStatAssembler.toDTO(objects);
             questionStatDTOs.add(dto);
         }
@@ -105,21 +119,22 @@ public class MarkSubjectApi {
 
     /**
      * 该评卷科目的分档统计信息
+     *
      * @param markSubject 评卷科目id
-     * @param questionId 试题id
+     * @param questionId  试题id
      * @return
      */
-    @RequestMapping(value = "{markSubject}/stat/levels",method = RequestMethod.GET)
-    public List<LevelStatDTO> levelStat(@PathVariable MarkSubject markSubject, @RequestParam Long questionId){
+    @RequestMapping(value = "{markSubject}/stat/levels", method = RequestMethod.GET)
+    public List<LevelStatDTO> levelStat(HttpServletRequest request, @PathVariable MarkSubject markSubject, @RequestParam Long questionId) {
         List<LevelStatDTO> levelStatDTOs = new ArrayList<>();
         paperRepo.countGroupByLevel(questionId)
                 .forEach(o -> {
                     levelStatDTOs.add(levelStatAssembler.toDTO(o));
                 });
         List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
-        for(Level level : levels){
+        for (Level level : levels) {
             long count = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals(level.getCode())).count();
-            if(count == 0){
+            if (count == 0) {
                 LevelStatDTO dto = new LevelStatDTO();
                 dto.setId(level.getCode());
                 dto.setCount(0);
@@ -127,10 +142,10 @@ public class MarkSubjectApi {
                 levelStatDTOs.add(dto);
             }
         }
-        long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(),questionId);
+        long total = paperRepo.countByWorkIdAndQuestionId(markSubject.getWorkId(), questionId);
         levelStatDTOs.forEach(o -> {
-            if(o.getId()!=null){
-                double p = (double)o.getCount()/total;
+            if (o.getId() != null) {
+                double p = (double) o.getCount() / total;
                 BigDecimal bd = new BigDecimal(p).setScale(3, RoundingMode.HALF_EVEN);
                 o.setPercent(bd.doubleValue());
             }
@@ -140,80 +155,87 @@ public class MarkSubjectApi {
 
     /**
      * 该评卷科目下的评卷员分组列表
+     *
      * @param markSubject 评卷科目id
      * @return
      */
-	@RequestMapping(value = "{markSubject}/markergroups",method = RequestMethod.GET)
-	public List<MarkerGroup> getMarkerGroups(@PathVariable MarkSubject markSubject) {
-		return markerGroupRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
-	}
+    @RequestMapping(value = "{markSubject}/markergroups", method = RequestMethod.GET)
+    public List<MarkerGroup> getMarkerGroups(@PathVariable MarkSubject markSubject) {
+        return markerGroupRepo.findByWorkIdAndSubject(markSubject.getWorkId(), markSubject.getSubject());
+    }
 
     /**
      * 创建评卷组
+     *
      * @param markSubject 评卷科目id
      * @param markerGroup 评卷组
      */
-	@RequestMapping(value = "{markSubject}/markergroups",method = RequestMethod.POST)
-	public void createMarkerGroup(@PathVariable MarkSubject markSubject,@RequestBody MarkerGroup markerGroup) {
-		markerGroup.setWorkId(markSubject.getWorkId());
-		markerGroup.setSubject(markSubject.getSubject());
-		markerGroupRepo.save(markerGroup);
-	}
+    @RequestMapping(value = "{markSubject}/markergroups", method = RequestMethod.POST)
+    public void createMarkerGroup(@PathVariable MarkSubject markSubject, @RequestBody MarkerGroup markerGroup) {
+        markerGroup.setWorkId(markSubject.getWorkId());
+        markerGroup.setSubject(markSubject.getSubject());
+        markerGroupRepo.save(markerGroup);
+    }
 
     /**
      * 修改评卷组名
+     *
      * @param markSubject 评卷科目id
-     * @param domain 评卷组id
+     * @param domain      评卷组id
      * @param markerGroup 评卷组
      */
-	@RequestMapping(value = "{markSubject}/markergroups/{domain}", method = RequestMethod.PATCH)
-	public void updateMarkerGroup(@PathVariable MarkSubject markSubject,@PathVariable MarkerGroup domain,@RequestBody MarkerGroup markerGroup) {
-		domain.setName(markerGroup.getName());
-		markerGroupRepo.save(markerGroup);
-	}
+    @RequestMapping(value = "{markSubject}/markergroups/{domain}", method = RequestMethod.PATCH)
+    public void updateMarkerGroup(@PathVariable MarkSubject markSubject, @PathVariable MarkerGroup domain, @RequestBody MarkerGroup markerGroup) {
+        domain.setName(markerGroup.getName());
+        markerGroupRepo.save(markerGroup);
+    }
 
     /**
      * 删除评卷组
+     *
      * @param markSubject 评卷科目id
-     * @param domain 评卷组id
+     * @param domain      评卷组id
      */
-	@RequestMapping(value = "{markSubject}/markergroups/{domain}", method = RequestMethod.DELETE)
-	public void removeMarkerGroup(@PathVariable MarkSubject markSubject,@PathVariable MarkerGroup domain) {
-		markerGroupRepo.delete(domain);
-	}
+    @RequestMapping(value = "{markSubject}/markergroups/{domain}", method = RequestMethod.DELETE)
+    public void removeMarkerGroup(@PathVariable MarkSubject markSubject, @PathVariable MarkerGroup domain) {
+        markerGroupRepo.delete(domain);
+    }
 
     /**
      * 单个评卷组信息
+     *
      * @param markSubject 评卷科目id
-     * @param domain 评卷组id
+     * @param domain      评卷组id
      * @return
      */
-	@RequestMapping(value = "{markSubject}/markergroups/{domain}", method = RequestMethod.GET)
-	public MarkerGroup getMarkerGroup(@PathVariable MarkSubject markSubject,@PathVariable MarkerGroup domain) {
-		return domain;
-	}
+    @RequestMapping(value = "{markSubject}/markergroups/{domain}", method = RequestMethod.GET)
+    public MarkerGroup getMarkerGroup(@PathVariable MarkSubject markSubject, @PathVariable MarkerGroup domain) {
+        return domain;
+    }
 
     /**
      * 为评卷组设置评卷员
+     *
      * @param markSubject 评卷科目id
-     * @param domain 评卷组id
-     * @param markerIds 评卷员用户id数组
+     * @param domain      评卷组id
+     * @param markerIds   评卷员用户id数组
      */
-	@RequestMapping(value = "{markSubject}/markergroups/{domain}/setmaker", method = RequestMethod.PATCH)
-	public void setMaker(@PathVariable MarkSubject markSubject,@PathVariable MarkerGroup domain,@RequestParam Long... markerIds) {
-		domain.setMarkers(new HashSet<MarkUser>());
-		for (Long markerId : markerIds) {
-			domain.addMarker(markUserRepo.findOne(markerId));
-		}
-		markerGroupRepo.save(domain);
-	}
+    @RequestMapping(value = "{markSubject}/markergroups/{domain}/setmaker", method = RequestMethod.PATCH)
+    public void setMaker(@PathVariable MarkSubject markSubject, @PathVariable MarkerGroup domain, @RequestParam Long... markerIds) {
+        domain.setMarkers(new HashSet<MarkUser>());
+        for (Long markerId : markerIds) {
+            domain.addMarker(markUserRepo.findOne(markerId));
+        }
+        markerGroupRepo.save(domain);
+    }
 
     /**
      * 该评卷科目进入下一阶段
+     *
      * @param markSubject 评卷科目id
      */
-	@RequestMapping(value = "{markSubject}", method = RequestMethod.PATCH)
-	public void goNext(@PathVariable MarkSubject markSubject) {
-		stageControlService.goNext(markSubject);
-	}
+    @RequestMapping(value = "{markSubject}", method = RequestMethod.PATCH)
+    public void goNext(@PathVariable MarkSubject markSubject) {
+        stageControlService.goNext(markSubject);
+    }
 }

+ 38 - 7
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -1,17 +1,12 @@
 package cn.com.qmth.stmms.ms.marking.assembler;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.marking.dto.PaperDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
-import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
-import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
-
 /**
  * Created by zhengmin on 2016/10/10.
  */
@@ -60,4 +55,40 @@ public class PaperAssembler {
         }
         return paperDTO;
     }
+
+    public PaperDTO toDTOForSheet(Paper paper) {
+        PaperDTO paperDTO = null;
+        if (paper != null) {
+            paperDTO = new PaperDTO();
+            paperDTO.setId(paper.getId());
+            paperDTO.setExamNumber(paper.getExamNumber());
+            paperDTO.setSn(paper.getSecretNumber());
+            paperDTO.setLevel(paper.getLevel());
+            paperDTO.setManual(paper.isManual());
+            paperDTO.setScore(paper.getScore());
+            paperDTO.setArbitrated(paper.isArbitrated());
+            paperDTO.setRejected(paper.isRejected());
+            paperDTO.setSample(paper.isSample());
+            paperDTO.setMarkByLeader(paper.isMarkByLeader());
+            paperDTO.setTagged(paper.isTagged());
+            paperDTO.setMarkedLogic(paper.isMarkedLogic());
+            paperDTO.setRedoLevel(paper.getRedoLevel());
+            paperDTO.setUpdatedOn(paper.getUpdatedOn());
+            String imgSrc = systemConfig.getImageUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
+            String thumbSrc = systemConfig.getThumbUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
+            String sheetSrc = systemConfig.getSheetUrl(paper.getWorkId(), paper.getSubject().toString(), paper.getAreaCode(), paper.getExamNumber());
+            paperDTO.setImgSrc(imgSrc);
+            paperDTO.setThumbSrc(thumbSrc);
+            paperDTO.setSheetSrc(sheetSrc);
+            paperDTO.setAreaCode(paper.getAreaCode());
+            if (paper.getInspectScore() != null) {
+                paperDTO.setInspectScore(paper.getInspectScore().intValue());
+            }
+            if (paper.getInspectLevel() != null) {
+                paperDTO.setInspectLevel(paper.getInspectLevel());
+            }
+
+        }
+        return paperDTO;
+    }
 }

+ 13 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java

@@ -33,9 +33,22 @@ public class PaperDTO implements Serializable{
     private Integer inspectScore;
     private String inspectLevel;
     private Long inspector;
+    private String sheetSrc;
 
     private List<MarkTaskDTO> markResults = new ArrayList<>();
 
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getSheetSrc() {
+        return sheetSrc;
+    }
+
+    public void setSheetSrc(String sheetSrc) {
+        this.sheetSrc = sheetSrc;
+    }
+
     public Long getId() {
         return id;
     }

+ 8 - 7
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -143,13 +143,14 @@ public class MarkingService {
      */
     @Transactional
     public Paper levelMarkPaper(Paper paper, String level,boolean isSample) {
-    	if(isSample){
-    		MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject().toString());
-    		long sampleCount = paperRepo.countByWorkIdAndSubjectAndIsSampleIsTrue(paper.getWorkId(), paper.getSubject());
-    		if(sampleCount >= markSubject.getSampleCount()){
-    			throw new RuntimeException("标准卷上限已达到");
-    		}
-    	}
+        //2019.10.12 湖北美术统考去掉标准卷设置数量
+//    	if(isSample){
+//    		MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject().toString());
+//    		long sampleCount = paperRepo.countByWorkIdAndSubjectAndIsSampleIsTrue(paper.getWorkId(), paper.getSubject());
+//    		if(sampleCount >= markSubject.getSampleCount()){
+//    			throw new RuntimeException("标准卷上限已达到");
+//    		}
+//    	}
     	paper.determineLevel(level);
     	paper.setMarkByLeader(true);
     	paper.setSample(isSample);