Browse Source

联考版-v3.1.0-测试bug修改

xiaof 2 years ago
parent
commit
5257925f53

+ 16 - 14
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/LoginInterceptor.java

@@ -1,7 +1,6 @@
 package cn.com.qmth.stmms.ms.accesscontrol;
 
 import cn.com.qmth.stmms.ms.accesscontrol.config.LoginConfig;
-import cn.com.qmth.stmms.ms.commons.utils.AesUtil;
 import cn.com.qmth.stmms.ms.commons.utils.EncrypAES;
 import cn.com.qmth.stmms.ms.core.cache.CacheService;
 import cn.com.qmth.stmms.ms.core.domain.user.AbstractUser;
@@ -33,11 +32,11 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
     public boolean preHandle(HttpServletRequest request,
                              HttpServletResponse response, Object handler) throws Exception {
         String authorization = request.getHeader("Authorization");
-        if(StringUtils.isEmpty(authorization)){
+        if (StringUtils.isEmpty(authorization)) {
             authorization = request.getParameter("Authorization");
         }
         String userId = request.getHeader("userId");
-        if(StringUtils.isEmpty(userId)){
+        if (StringUtils.isEmpty(userId)) {
             userId = request.getParameter("userId");
         }
         String token = cacheService.queryTokenCache(userId);
@@ -56,19 +55,22 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
             return true;
         }
         AbstractUser user = markUserRepo.findOne(Long.valueOf(userId));
-        if (Objects.equals(Role.COLLECTOR, ((MarkUser) user).getRole())) {
-            response.sendError(HttpStatus.UNAUTHORIZED.value(), "该账户只能在采集端登录");
-            return false;
-        }
+        // 管理员用户,不在数据库表中
+        if (user != null) {
+            if (Objects.equals(Role.COLLECTOR, ((MarkUser) user).getRole())) {
+                response.sendError(HttpStatus.UNAUTHORIZED.value(), "该账户只能在采集端登录");
+                return false;
+            }
 
-        if(!Objects.equals(Role.QC, ((MarkUser) user).getRole()) && !authorization.equals(token)){
-            response.sendError(HttpStatus.UNAUTHORIZED.value(), "该账号在其它地方登录");
-            return false;
-        }
+            if (!Objects.equals(Role.QC, ((MarkUser) user).getRole()) && !authorization.equals(token)) {
+                response.sendError(HttpStatus.UNAUTHORIZED.value(), "该账号在其它地方登录");
+                return false;
+            }
 
-        String sessionId = request.getSession().getId();
-        if (user.getSessionId().equalsIgnoreCase(sessionId)) {
-            return true;
+            String sessionId = request.getSession().getId();
+            if (user.getSessionId().equalsIgnoreCase(sessionId)) {
+                return true;
+            }
         }
         return true;
     }

+ 8 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ParamApi.java

@@ -122,6 +122,8 @@ public class ParamApi {
         Integer deviation = object.getInteger("deviation");
         Integer autoCallback = object.getInteger("autoCallback");
         Integer majority = object.getInteger("majority");
+        Integer autoCallbackShowDeviation = object.getInteger("autoCallbackShowDeviation");
+        Integer cumulativeError = object.getInteger("cumulativeError");
         Integer takeBest = object.getInteger("takeBest");
         Integer clearData = object.getInteger("clearData");
         Integer levelShowAllPaper = object.getInteger("levelShowAllPaper");
@@ -156,7 +158,9 @@ public class ParamApi {
 
         oldRoughLevelConfig.setDeviation(deviation);
         oldRoughLevelConfig.setAutoCallback(autoCallback);
+        oldRoughLevelConfig.setCumulativeError(cumulativeError);
         oldRoughLevelConfig.setMajority(majority);
+        oldRoughLevelConfig.setAutoCallbackShowDeviation(autoCallbackShowDeviation);
         oldRoughLevelConfig.setTakeBest(takeBest);
         oldRoughLevelConfig.setLevelShowAllPaper(levelShowAllPaper);
         oldRoughLevelConfig.setPropDenominator(propDenominator);
@@ -183,6 +187,8 @@ public class ParamApi {
         Integer deviation = object.getInteger("deviation");
         Integer autoCallback = object.getInteger("autoCallback");
         Integer majority = object.getInteger("majority");
+        Integer autoCallbackShowDeviation = object.getInteger("autoCallbackShowDeviation");
+        Integer cumulativeError = object.getInteger("cumulativeError");
         Integer takeBest = object.getInteger("takeBest");
         Integer clearData = object.getInteger("clearData");
         Integer levelShowAllPaper = object.getInteger("levelShowAllPaper");
@@ -220,6 +226,8 @@ public class ParamApi {
 
         oldLevelConfig.setDeviation(deviation);
         oldLevelConfig.setAutoCallback(autoCallback);
+        oldLevelConfig.setCumulativeError(cumulativeError);
+        oldLevelConfig.setAutoCallbackShowDeviation(autoCallbackShowDeviation);
         oldLevelConfig.setMajority(majority);
         oldLevelConfig.setTakeBest(takeBest);
         oldLevelConfig.setLevelShowAllPaper(levelShowAllPaper);

+ 3 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageServerConfig;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.utils.OssUtil;
+import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
@@ -218,8 +219,8 @@ public class ScoreApi {
 
     @RequestMapping(value = "merge/{subject}", method = RequestMethod.GET)
     public ResponseEntity merge(@PathVariable Subject subject) {
-        Work activedWork = workRepo.findByActiveTrue();
-        List<Paper> papers = paperRepo.findByWorkIdAndSubject(activedWork.getId(), subject);
+        Long workId = ServletUtil.getWordId();
+        List<Paper> papers = paperRepo.findByWorkIdAndSubject(workId, subject);
         Iterator<Paper> paperIterator = papers.iterator();
         long count = 0;
         /*while (paperIterator.hasNext()) {

+ 213 - 43
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/ScoreExporter.java

@@ -6,14 +6,8 @@ import cn.com.qmth.stmms.ms.admin.dto.ScoreDTO;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 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.MarkSubject;
-import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.domain.Student;
-import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
-import cn.com.qmth.stmms.ms.core.repository.ExamQuestionRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
-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.domain.*;
+import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import com.google.gson.Gson;
 import org.apache.commons.lang.math.NumberUtils;
@@ -26,13 +20,11 @@ import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 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;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+import java.awt.image.Kernel;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -45,18 +37,6 @@ import java.util.stream.Collectors;
 public class ScoreExporter {
     private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ScoreExporter.class);
 
-    @Autowired
-    private PaperRepo paperRepo;
-
-    @Autowired
-    private ExamQuestionRepo examQuestionRepo;
-
-    @Autowired
-    private StudentRepo studentRepo;
-
-    @Autowired
-    SqlUtil sqlUtil;
-
     private int level = 4,//动态报表开始列固定从4开始
             score = 6,//打分报表固定从6开始
             levelInterval = 2,//分档列固定从2开始
@@ -80,9 +60,24 @@ public class ScoreExporter {
             SC_NAME = "色彩",
             SM_NAME = "素描",
             SX_NAME = "速写",
+            ROUGH_LEVEL_FILE_NAME = "粗档位成绩表",
             LEVEL_FILE_NAME = "档位成绩表",
             SCORE_FILE_NAME = "分数成绩表";
 
+    private static final String[] roughLevels = {"一", "二", "三", "四", "五", "六", "七", "八", "九"};
+
+    @Autowired
+    private PaperRepo paperRepo;
+
+    @Autowired
+    private ExamQuestionRepo examQuestionRepo;
+
+    @Autowired
+    private StudentRepo studentRepo;
+
+    @Autowired
+    SqlUtil sqlUtil;
+
     @Resource
     MarkSubjectRepo markSubjectRepo;
 
@@ -244,7 +239,7 @@ public class ScoreExporter {
             if (Objects.nonNull(subjectMap.get(Subject.SC.toString()))) {
                 size = subjectMap.get(Subject.SC.toString()).size();
             }
-            int scSumCount  = level + size + 5;
+            int scSumCount = level + size + 5;
             Cell cell4 = row.createCell(level);
             cell4.setCellValue(markSubjectMap.get(Subject.SC.toString()));
             cell4.setCellStyle(style);
@@ -452,14 +447,191 @@ public class ScoreExporter {
      * @param workId
      * @param response
      */
-    @RequestMapping(value = "exportLevelResult", method = RequestMethod.GET)
+    @GetMapping("exportRoughLevelResult")
+    public void exportRoughLevelResult(@RequestParam Long workId, HttpServletResponse response) {
+        //测试-导出档位成绩表
+        StringBuilder sbAll = null;
+        if (!imageConfig.isCustomSubject()) {
+            String scSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`rough_level` level, p.id upload, p.is_missing isMissing, p.is_rough_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number and p.subject = 'SC' left join mark_task_rough_level AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = " + MarkStage.ROUGH_LEVEL + " AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`rough_level` level, p.id upload, p.is_missing missing, p.is_rough_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE p.is_missing = TRUE AND p.work_id = ? AND p.subject = 'SC' ";
+            String smSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`rough_level` level, p.id upload, p.is_missing isMissing, p.is_rough_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number and p.subject = 'SM' left join mark_task_rough_level AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SM') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = " + MarkStage.ROUGH_LEVEL + " AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`rough_level` level, p.id upload, p.is_missing missing, p.is_rough_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SM') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE p.is_missing = TRUE AND p.work_id = ? AND p.subject = 'SM' ";
+            String sxSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`rough_level` level, p.id upload, p.is_missing isMissing, p.is_rough_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number and p.subject = 'SX' left join mark_task_rough_level AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SX') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = " + MarkStage.ROUGH_LEVEL + " AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`rough_level` level, p.id upload, p.is_missing missing, p.is_rough_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SX') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE p.is_missing = TRUE AND p.work_id = ? AND p.subject = 'SX' ";
+            //拼装问号
+            scSql = sqlUtil.sqlPrint(scSql, workId, workId, workId, workId, workId, workId);
+            smSql = sqlUtil.sqlPrint(smSql, workId, workId, workId, workId, workId, workId);
+            sxSql = sqlUtil.sqlPrint(sxSql, workId, workId, workId, workId, workId, workId);
+            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);
+        } else {
+            String customSql = "select temp.*, mt.`result`, p.source_name as sourceName, 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 = 'CUSTOM' 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 and p.is_missing = false UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level` from paper p, (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 = 'CUSTOM' and mu.enabled = 1) temp, student t where (p.is_missing = true or p.is_test = 3) and p.work_id = ? and p.subject = 'CUSTOM' and t.exam_number = p.exam_number ";
+            customSql = sqlUtil.sqlPrint(customSql, workId, workId, workId, workId);
+            sbAll = new StringBuilder(customSql);
+        }
+        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
+            SXSSFWorkbook wb = new SXSSFWorkbook();
+            Sheet sheet = wb.createSheet(ROUGH_LEVEL_FILE_NAME);
+            CellStyle style = wb.createCellStyle();
+            style.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中格式
+            style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //垂直居中
+            Row row = sheet.createRow(0);
+
+            // 科目名称
+            List<MarkSubject> markSubjectList = markSubjectRepo.findAllByWorkId(workId);
+            Map<String, String> markSubjectMap = markSubjectList.stream().collect(Collectors.toMap(m -> m.getSubject().name(), MarkSubject::getName));
+
+            //绘制固定表头
+            sheet = drawExcelFixedHeadLevel(levelInterval, sheet, style, row, subjectMap, workId, markSubjectMap);
+            //绘制动态表头
+            Row dynamicHeadRow = sheet.createRow(1);
+            if (!imageConfig.isCustomSubject()) {
+                //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 = Objects.nonNull(scMap) && scMap.size() > 0 ? scMap.size() : 0;
+//                }
+                //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 + 6));
+                size = size + (Objects.nonNull(smMap) && smMap.size() > 0 ? smMap.size() : 0);
+//                }
+                //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 + 6 * 2));
+//                }
+                //加载excel数据
+                AtomicInteger cellIndex = new AtomicInteger(0);
+                Sheet 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);
+                    Row 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.getSourceName(), 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(roughLevels[Integer.parseInt(v.getLevel())], firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()), level + (scMap == null ? 0 : scMap.size())));
+                                }
+                                //上传
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getUpload()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + 1, level + (scMap == null ? 0 : scMap.size()) + 1));
+                                //缺考
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getMissing()) && v.getMissing() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + 2, level + (scMap == null ? 0 : scMap.size()) + 2));
+                                //标准卷
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getSample()) && v.getSample() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + 3, level + (scMap == null ? 0 : scMap.size()) + 3));
+                                //一键定档
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getOneClick()) && v.getOneClick() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + 4, level + (scMap == null ? 0 : scMap.size()) + 4));
+                                //改档
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getIsShift()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + 5, level + (scMap == null ? 0 : scMap.size()) + 5));
+                            } 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(roughLevels[Integer.parseInt(v.getLevel())], firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 1, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 1));
+                                }
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getUpload()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 2));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getMissing()) && v.getMissing() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 3, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 3));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getSample()) && v.getSample() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 4, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 4));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getOneClick()) && v.getOneClick() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 5, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 5));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getIsShift()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 6, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 6));
+                            } 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(roughLevels[Integer.parseInt(v.getLevel())], firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2));
+                                }
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getUpload()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 1, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 1));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getMissing()) && v.getMissing() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 2));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getSample()) && v.getSample() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 3, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 3));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getOneClick()) && v.getOneClick() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 4, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 4));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getIsShift()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 5, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + 6 * 2 + 5));
+                            }
+                        });
+                    }
+                    i.getAndIncrement();
+                });
+            } else {
+                //SC表头
+                Map<String, ExportLevelResultDTO> customMap = subjectMap.get(Subject.CUSTOM.toString());
+                int size = 0;
+                if (Objects.nonNull(customMap) && customMap.size() > 0) {
+                    drawExcelTeacher(levelInterval, customMap, sheet, style, dynamicHeadRow, new AtomicInteger(level));
+                    size = customMap.size();
+                }
+                //加载excel数据
+                AtomicInteger cellIndex = new AtomicInteger(0);
+                Sheet 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);
+                    Row 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.getSourceName(), 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) -> {
+                            ExportLevelResultDTO exportLevelResultDTO = customMap.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 + (customMap == null ? 0 : customMap.size()), level + (customMap == null ? 0 : customMap.size())));
+                            }
+                            if (Objects.nonNull(v.getLevel())) {
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + (customMap == null ? 0 : customMap.size()) + 1, level + (customMap == null ? 0 : customMap.size()) + 1));
+                            }
+                        });
+                    }
+                    i.getAndIncrement();
+                });
+            }
+            ExportUtils.exportEXCEL(LEVEL_FILE_NAME, wb, response);
+        }
+    }
+
+    /**
+     * 导出档位成绩
+     *
+     * @param workId
+     * @param response
+     */
+    @GetMapping("exportLevelResult")
     public void exportLevelResult(@RequestParam Long workId, HttpServletResponse response) {
         //测试-导出档位成绩表
         StringBuilder sbAll = null;
         if (!imageConfig.isCustomSubject()) {
-            String scSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing isMissing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number left join mark_task AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = 1 AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing missing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE (p.is_missing = TRUE OR p.is_test = 3) AND p.work_id = ? AND p.subject = 'SC' ";
-            String smSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing isMissing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number left join mark_task AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SM') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = 1 AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing missing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE (p.is_missing = TRUE OR p.is_test = 3) AND p.work_id = ? AND p.subject = 'SM' ";
-            String sxSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing isMissing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number left join mark_task AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SX') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = 1 AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing missing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE (p.is_missing = TRUE OR p.is_test = 3) AND p.work_id = ? AND p.subject = 'SX' ";
+            String scSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing isMissing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number and p.subject = 'SC' left join mark_task_level AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = " + MarkStage.LEVEL.ordinal() + " AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing missing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SC') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE p.is_missing = TRUE AND p.work_id = ? AND p.subject = 'SC' ";
+            String smSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing isMissing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number and p.subject = 'SM' left join mark_task_level AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SM') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = " + MarkStage.LEVEL.ordinal() + " AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing missing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SM') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE p.is_missing = TRUE AND p.work_id = ? AND p.subject = 'SM' ";
+            String sxSql = "select temp.*, mt.`result`, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing isMissing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t left join paper p on t.work_id = p.work_id and t.exam_number = p.exam_number and p.subject = 'SX' left join mark_task_level AS mt on p.work_id = mt.work_id and p.id = mt.paper_id left join (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 on mt.work_id = temp.workId and mt.marker_id = temp.id left join  (SELECT id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SX') cl ON p.work_id = cl.work_id and p.id = cl.paper_id WHERE mt.work_id = ? AND mt.stage = " + MarkStage.LEVEL.ordinal() + " AND p.is_missing = FALSE UNION ALL select temp.*, null as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, p.mark_by_leader as markByLeader, p.`level`, p.id upload, p.is_missing missing, p.is_sample isSample,p.is_one_click isOneClick, cl.id isShift from student t LEFT JOIN paper p ON t.work_id = p.work_id AND t.exam_number = p.exam_number LEFT JOIN (SELECT  id, work_id, paper_id FROM change_level WHERE work_id = ? AND subject = 'SX') cl ON p.work_id = cl.work_id AND p.id = cl.paper_id LEFT JOIN (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 ON 1 = 1 WHERE p.is_missing = TRUE AND p.work_id = ? AND p.subject = 'SX' ";
             //拼装问号
             scSql = sqlUtil.sqlPrint(scSql, workId, workId, workId, workId, workId, workId);
             smSql = sqlUtil.sqlPrint(smSql, workId, workId, workId, workId, workId, workId);
@@ -484,15 +656,13 @@ public class ScoreExporter {
             SXSSFWorkbook wb = new SXSSFWorkbook();
             Sheet sheet = wb.createSheet(LEVEL_FILE_NAME);
             CellStyle style = wb.createCellStyle();
-//            style.setAlignment(HorizontalAlignment.CENTER);// 左右居中
-//            style.setVerticalAlignment(VerticalAlignment.CENTER);
-            style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中格式
-            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //垂直居中
+            style.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中格式
+            style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //垂直居中
             Row row = sheet.createRow(0);
 
             // 科目名称
             List<MarkSubject> markSubjectList = markSubjectRepo.findAllByWorkId(workId);
-            Map<String, String> markSubjectMap = markSubjectList.stream().collect(Collectors.toMap(m->m.getSubject().name(), MarkSubject::getName));
+            Map<String, String> markSubjectMap = markSubjectList.stream().collect(Collectors.toMap(m -> m.getSubject().name(), MarkSubject::getName));
 
             //绘制固定表头
             sheet = drawExcelFixedHeadLevel(levelInterval, sheet, style, row, subjectMap, workId, markSubjectMap);
@@ -504,19 +674,19 @@ public class ScoreExporter {
                 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 = Objects.nonNull(scMap) && scMap.size() > 0 ? scMap.size() : 0;
+                drawExcelTeacher(levelInterval, scMap, sheet, style, dynamicHeadRow, new AtomicInteger(level));
+                size = Objects.nonNull(scMap) && scMap.size() > 0 ? scMap.size() : 0;
 //                }
                 //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 + 6));
-                    size = size + (Objects.nonNull(smMap) && smMap.size() > 0 ? smMap.size() : 0);
+                drawExcelTeacher(levelInterval, smMap, sheet, style, dynamicHeadRow, new AtomicInteger(level + size + 6));
+                size = size + (Objects.nonNull(smMap) && smMap.size() > 0 ? smMap.size() : 0);
 //                }
                 //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 + 6*2));
+                drawExcelTeacher(levelInterval, sxMap, sheet, style, dynamicHeadRow, new AtomicInteger(level + size + 6 * 2));
 //                }
                 //加载excel数据
                 AtomicInteger cellIndex = new AtomicInteger(0);
@@ -560,7 +730,7 @@ public class ScoreExporter {
                                 if (Objects.nonNull(v.getLevel())) {
                                     drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 1, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 1));
                                 }
-                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getUpload()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size())  + (smMap == null ? 0 : smMap.size()) + 5 + 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 2));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getUpload()) ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 2));
                                 drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getMissing()) && v.getMissing() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 3, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 3));
                                 drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getSample()) && v.getSample() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 4, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 4));
                                 drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(Objects.nonNull(v.getOneClick()) && v.getOneClick() ? "是" : "否", firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 5, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + 5 + 5));
@@ -637,9 +807,9 @@ public class ScoreExporter {
         //测试-导出分数成绩表
         StringBuilder sbAll = null;
         if (!imageConfig.isCustomSubject()) {
-            String scSql = "select temp.*, IFNULL(mt.`result`,0) as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) 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 and p.is_missing = false UNION ALL select temp.*, 0 as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level, p.mark_by_leader as markByLeader from paper p, (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, student t where p.is_missing = true and p.work_id = ? and p.subject = 'SC' and t.exam_number = p.exam_number ";
-            String smSql = "select temp.*, IFNULL(mt.`result`,0) as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) 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 and p.is_missing = false UNION ALL select temp.*, 0 as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level, p.mark_by_leader as markByLeader from paper p, (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, student t where p.is_missing = true and p.work_id = ? and p.subject = 'SM' and t.exam_number = p.exam_number ";
-            String sxSql = "select temp.*, IFNULL(mt.`result`,0) as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) 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 and p.is_missing = false UNION ALL select temp.*, 0 as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level, p.mark_by_leader as markByLeader from paper p, (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, student t where p.is_missing = true and p.work_id = ? and p.subject = 'SX' and t.exam_number = p.exam_number ";
+            String scSql = "select temp.*, IFNULL(mt.`result`,0) as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level,p.mark_by_leader as markByLeader from mark_task_score 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 = " + MarkStage.SCORE + " and p.is_missing = false UNION ALL select temp.*, 0 as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level, p.mark_by_leader as markByLeader from paper p, (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, student t where p.is_missing = true and p.work_id = ? and p.subject = 'SC' and t.exam_number = p.exam_number ";
+            String smSql = "select temp.*, IFNULL(mt.`result`,0) as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level,p.mark_by_leader as markByLeader from mark_task_score 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 = " + MarkStage.SCORE + " and p.is_missing = false UNION ALL select temp.*, 0 as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level, p.mark_by_leader as markByLeader from paper p, (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, student t where p.is_missing = true and p.work_id = ? and p.subject = 'SM' and t.exam_number = p.exam_number ";
+            String sxSql = "select temp.*, IFNULL(mt.`result`,0) as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level,p.mark_by_leader as markByLeader from mark_task_score 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 = " + MarkStage.SCORE + " and p.is_missing = false UNION ALL select temp.*, 0 as result, p.source_name as sourceName, p.exam_number as examNumber, p.student_name as studentName, t.area_name as areaName, t.school, t.exam_room examRoom, IFNULL(p.score,0) as level, p.mark_by_leader as markByLeader from paper p, (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, student t where p.is_missing = true and p.work_id = ? and p.subject = 'SX' and t.exam_number = p.exam_number ";
             //拼装问号
             scSql = sqlUtil.sqlPrint(scSql, workId, workId, workId, workId);
             smSql = sqlUtil.sqlPrint(smSql, workId, workId, workId, workId);

+ 7 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java

@@ -151,6 +151,13 @@ public class TrialService {
         for (Paper paper : paperList) {
             // 标准卷不清除档位
             paper.setBatchNo(null);
+            // 打回标记清除
+            paper.setRejected(false);
+            paper.setRejectedByLeader(false);
+            //仲裁标记清除
+            paper.setArbitrated(false);
+            //科组长标记状态清除
+            paper.setMark(false);
             // 区分粗分档和细分档
             if (MarkStage.ROUGH_LEVEL.equals(markSubject.getStage())) {
                 paper.setRoughLevel(paper.isRoughSample() ? paper.getRoughLevel() : null);

+ 35 - 55
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -113,53 +113,33 @@ public class CollectApi {
     @RequestMapping("user/login")
     public LoginDTO login(@RequestParam String loginname, @RequestParam String password) throws Exception {
         LoginDTO loginDTO = null;
-        Work activeWork = null;
-        if (loginname.equals(loginConfig.uploadLoginConfig().getLoginName()) && password.equals(loginConfig.uploadLoginConfig().getPassword())) {
-            activeWork = workRepo.findByActiveTrue();
-            if (Objects.isNull(activeWork)) {
-                throw new Exception("没有work");
-            }
-            loginDTO = new LoginDTO();
-            loginDTO.setExamId(activeWork.getId());
-            loginDTO.setExamName(activeWork.getName());
-        } else if (loginname.equals(loginConfig.adminLoginConfig().getLoginName()) && password.equals(loginConfig.adminLoginConfig().getPassword())) {
-            activeWork = workRepo.findByActiveTrue();
-            if (Objects.isNull(activeWork)) {
-                throw new Exception("没有work");
-            }
-            loginDTO = new LoginDTO();
-            loginDTO.setExamId(activeWork.getId());
-            loginDTO.setExamName(activeWork.getName());
-            loginDTO.setRoleCode("ADMIN");
-        } else {
-            MarkUser markUser = markUserRepo.findByLoginName(loginname);
-            //账号不存在
-            if (Objects.isNull(markUser)) {
-                throw new RuntimeException("账号不存在");
-            }
-            if (!markUser.isEnabled()) {
-                throw new RuntimeException("账号已禁用");
-            }
-            //不是采集员账号
-            else if (!Objects.equals(Role.COLLECTOR, markUser.getRole())) {
-                throw new RuntimeException("非采集端账号");
-            }
-            //密码错误
-            else if (!Objects.equals(markUser.getPassword(), password)) {
-                throw new RuntimeException("密码错误");
-            }
-            activeWork = workRepo.getOne(markUser.getWorkId());
-            if (Objects.isNull(activeWork)) {
-                throw new Exception("没有work");
-            }
-            loginDTO = new LoginDTO();
-            loginDTO.setUserId(markUser.getId());
-            loginDTO.setExamId(markUser.getWorkId());
-            loginDTO.setExamName(activeWork.getName());
-            loginDTO.setImageEnc(ParamCache.collectConfigMap.get(String.valueOf(activeWork.getId())).getImageEncrypt() == 1);
+        MarkUser markUser = markUserRepo.findByLoginName(loginname);
+        //账号不存在
+        if (Objects.isNull(markUser)) {
+            throw new RuntimeException("账号不存在");
+        }
+        if (!markUser.isEnabled()) {
+            throw new RuntimeException("账号已禁用");
         }
+        //不是采集员账号
+        else if (!Objects.equals(Role.COLLECTOR, markUser.getRole())) {
+            throw new RuntimeException("非采集端账号");
+        }
+        //密码错误
+        else if (!Objects.equals(markUser.getPassword(), password)) {
+            throw new RuntimeException("密码错误");
+        }
+        Work work = workRepo.getOne(markUser.getWorkId());
+        if (Objects.isNull(work)) {
+            throw new Exception("没有work");
+        }
+        loginDTO = new LoginDTO();
+        loginDTO.setUserId(markUser.getId());
+        loginDTO.setExamId(markUser.getWorkId());
+        loginDTO.setExamName(work.getName());
+        loginDTO.setImageEnc(ParamCache.collectConfigMap.get(String.valueOf(work.getId())).getImageEncrypt() == 1);
         List<CollectSubjectDTO> collectSubjectDTOs = new ArrayList<>();
-        activeWork.getSubjects().forEach(s -> {
+        work.getSubjects().forEach(s -> {
             int id = s.getSubject().ordinal() + 1;
             CollectSubjectDTO collectSubjectDTO = new CollectSubjectDTO(id, s.getName());
             if (!Strings.isNullOrEmpty(s.getCollectConfig())) {
@@ -171,7 +151,7 @@ public class CollectApi {
         loginDTO.setSubjects(collectSubjectDTOs);
 
         //采集参数
-        ParamSetting paramSetting = paramSettingRepo.findByWorkId(activeWork.getId());
+        ParamSetting paramSetting = paramSettingRepo.findByWorkId(work.getId());
         loginDTO.setParamSetting(paramSetting);
         return loginDTO;
     }
@@ -180,18 +160,18 @@ public class CollectApi {
     @RequestMapping(value = "exam/listStudents/{examNumber}", method = RequestMethod.GET)
     public List<CollectStuDTO> listStudents(@PathVariable String examNumber) {
         List<CollectStuDTO> list = new ArrayList<>();
-        Work activeWork = workRepo.findByActiveTrue();
+        Long workId = ServletUtil.getWordId();
         Consumer<Student> consumer = (s) -> {
             CollectStuDTO collectStuDTO = new CollectStuDTO();
-            collectStuDTO.setExamId(activeWork.getId());
+            collectStuDTO.setExamId(workId);
             collectStuDTO.setExamNumber(s.getRelateExamNumber());
             collectStuDTO.setName(s.getName());
             collectStuDTO.setSiteCode(s.getAreaName());
             collectStuDTO.setRoomCode(s.getExamRoom());
             list.add(collectStuDTO);
         };
-        Student student = studentRepo.findByWorkIdAndRelateExamNumber(activeWork.getId(), examNumber);
-        studentRepo.findByWorkIdAndExamRoom(activeWork.getId(), student.getExamRoom()).forEach(consumer);
+        Student student = studentRepo.findByWorkIdAndRelateExamNumber(workId, examNumber);
+        studentRepo.findByWorkIdAndExamRoom(workId, student.getExamRoom()).forEach(consumer);
         return list;
     }
 
@@ -229,17 +209,17 @@ public class CollectApi {
     @RequestMapping(value = "exam/students", method = RequestMethod.GET)
     public List<CollectStuDTO> getStudents() {
         List<CollectStuDTO> list = new ArrayList<>();
-        Work activeWork = workRepo.findByActiveTrue();
+        Long workId = ServletUtil.getWordId();
         Consumer<Student> consumer = (s) -> {
             CollectStuDTO collectStuDTO = new CollectStuDTO();
-            collectStuDTO.setExamId(activeWork.getId());
+            collectStuDTO.setExamId(workId);
             collectStuDTO.setExamNumber(s.getExamNumber());
             collectStuDTO.setName(s.getName());
             collectStuDTO.setSiteCode(s.getAreaName());
             collectStuDTO.setRoomCode(s.getExamRoom());
             list.add(collectStuDTO);
         };
-        studentRepo.findByWorkId(activeWork.getId()).forEach(consumer);
+        studentRepo.findByWorkId(workId).forEach(consumer);
         return list;
     }
 
@@ -726,8 +706,8 @@ public class CollectApi {
     @RequestMapping(value = "subject/collect-config", method = RequestMethod.POST)
     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());
+        Long workId = ServletUtil.getWordId();
+        MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + subject.toString());
         String config = Optional.ofNullable(collectSubjectDTO.getCollectConfig())
                 .map(Object::toString)
                 .map(s -> s.substring(1, s.length() - 1))

+ 6 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ParamSetting.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.core.domain;
 
 import cn.com.qmth.stmms.ms.core.domain.paramsetting.CollectConfig;
 import cn.com.qmth.stmms.ms.core.domain.paramsetting.LevelConfig;
+import cn.com.qmth.stmms.ms.core.domain.paramsetting.RoughLevelConfig;
 import cn.com.qmth.stmms.ms.core.domain.paramsetting.ScoreConfig;
 import com.alibaba.fastjson.JSON;
 
@@ -55,6 +56,8 @@ public class ParamSetting implements Serializable {
         levelConfig.setDeviation(4);//仲裁档位差
         levelConfig.setAutoCallback(0);//是否自动打回
         levelConfig.setMajority(1);//是否过半定档
+        levelConfig.setAutoCallbackShowDeviation(1);//自动打回时显示偏差
+        levelConfig.setCumulativeError(4);//打回累计误差
         levelConfig.setTakeBest(1);//取优原则
         levelConfig.setLevelShowAllPaper(0);//阅卷员是否显示所有试卷
         levelConfig.setPropDenominator(1);//档位百分比分母
@@ -65,10 +68,12 @@ public class ParamSetting implements Serializable {
         paramSetting.setLevelConfig(JSON.toJSONString(levelConfig));
 
         // 粗分档参数
-        LevelConfig roughLevelConfig = new LevelConfig();
+        RoughLevelConfig roughLevelConfig = new RoughLevelConfig();
         roughLevelConfig.setAutoCallback(0);//是否自动打回
         roughLevelConfig.setDeviation(4);//仲裁档位差
         roughLevelConfig.setMajority(1);//是否过半定档
+        roughLevelConfig.setAutoCallbackShowDeviation(1);//自动打回时显示偏差
+        roughLevelConfig.setCumulativeError(4);//打回累计误差
         roughLevelConfig.setTakeBest(1);//取优原则
         roughLevelConfig.setLevelShowAllPaper(0);//阅卷员是否显示所有试卷
         roughLevelConfig.setPropDenominator(1);//档位百分比分母

+ 26 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/LevelConfig.java

@@ -15,11 +15,21 @@ public class LevelConfig {
      */
     private Integer autoCallback;
 
+    /**
+     * 打回累计误差
+     */
+    private Integer cumulativeError;
+
     /**
      * 是否过半定档
      */
     private Integer majority;
 
+    /**
+     * 自动打回时显示偏差
+     */
+    private Integer autoCallbackShowDeviation;
+
     /**
      * 取优原则
      */
@@ -71,6 +81,14 @@ public class LevelConfig {
         this.autoCallback = autoCallback;
     }
 
+    public Integer getCumulativeError() {
+        return cumulativeError;
+    }
+
+    public void setCumulativeError(Integer cumulativeError) {
+        this.cumulativeError = cumulativeError;
+    }
+
     public Integer getMajority() {
         return majority;
     }
@@ -79,6 +97,14 @@ public class LevelConfig {
         this.majority = majority;
     }
 
+    public Integer getAutoCallbackShowDeviation() {
+        return autoCallbackShowDeviation;
+    }
+
+    public void setAutoCallbackShowDeviation(Integer autoCallbackShowDeviation) {
+        this.autoCallbackShowDeviation = autoCallbackShowDeviation;
+    }
+
     public Integer getTakeBest() {
         return takeBest;
     }

+ 26 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/paramsetting/RoughLevelConfig.java

@@ -15,11 +15,21 @@ public class RoughLevelConfig {
      */
     private Integer autoCallback;
 
+    /**
+     * 打回累计误差
+     */
+    private Integer cumulativeError;
+
     /**
      * 是否过半定档
      */
     private Integer majority;
 
+    /**
+     * 自动打回时显示偏差
+     */
+    private Integer autoCallbackShowDeviation;
+
     /**
      * 取优原则
      */
@@ -66,6 +76,14 @@ public class RoughLevelConfig {
         this.autoCallback = autoCallback;
     }
 
+    public Integer getCumulativeError() {
+        return cumulativeError;
+    }
+
+    public void setCumulativeError(Integer cumulativeError) {
+        this.cumulativeError = cumulativeError;
+    }
+
     public Integer getMajority() {
         return majority;
     }
@@ -74,6 +92,14 @@ public class RoughLevelConfig {
         this.majority = majority;
     }
 
+    public Integer getAutoCallbackShowDeviation() {
+        return autoCallbackShowDeviation;
+    }
+
+    public void setAutoCallbackShowDeviation(Integer autoCallbackShowDeviation) {
+        this.autoCallbackShowDeviation = autoCallbackShowDeviation;
+    }
+
     public Integer getTakeBest() {
         return takeBest;
     }

+ 13 - 7
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java

@@ -60,16 +60,20 @@ public class ScheduledTask implements InitializingBean {
     @Scheduled(cron = "0 0/5 * * * ?")
     public void repairRepeatSecretNumberTask() {
         if (Objects.nonNull(randomUtil.getRandomMap()) && randomUtil.getRandomMap().size() > 0) {
-            Work work = workRepo.findByActiveTrue();
-            if (Objects.nonNull(work)) {
+            List<Work> works = workRepo.findAll();
+            if (Objects.nonNull(works)) {
                 if (!this.repairPaper) {
                     LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号进来了");
-                    repairRepeatPaper(work.getId());
+                    for (Work work : works) {
+                        repairRepeatPaper(work.getId());
+                    }
                     LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号结束了");
                 }
                 if (!this.repairTask) {
                     LOGGER.info("repairRepeatSecretNumberTask 修复任务密号进来了");
-                    repairRepeatTask(work.getId());
+                    for (Work work : works) {
+                        repairRepeatTask(work.getId());
+                    }
                     LOGGER.info("repairRepeatSecretNumberTask 修复任务密号结束了");
                 }
             }
@@ -81,11 +85,13 @@ public class ScheduledTask implements InitializingBean {
      */
     @Scheduled(cron = "0 0/1 * * * ?")
     public void markTaskJob() {
-        Work work = workRepo.findByActiveTrue();
-        if (Objects.nonNull(work)) {
+        List<Work> works = workRepo.findAll();
+        if (Objects.nonNull(works)) {
             if (!markTaskJob) {
                 LOGGER.info("markTaskJob 进来了");
-                repairMarkTaskJob(work);
+                for (Work work : works) {
+                    repairMarkTaskJob(work);
+                }
                 LOGGER.info("markTaskJob 结束了");
             }
         }

+ 3 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MakrerApi.java

@@ -490,9 +490,10 @@ public class MakrerApi {
         long finalKdtotal = kdtotal;
         long finalTotal = total;
 
-        LevelStatDTO nullLevelStatDto = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals("null")).findFirst().get();
+        Optional<LevelStatDTO> optionalLevelStatDTO = levelStatDTOs.stream().filter(l -> String.valueOf(l.getId()).equals("null")).findFirst();
+        LevelStatDTO nullLevelStatDto = optionalLevelStatDTO.isPresent() ? optionalLevelStatDTO.get() : null;
 
-        if(nullLevelStatDto ==null) {
+        if (nullLevelStatDto == null) {
             LevelStatDTO levelStatDTO = new LevelStatDTO();
             //求任务数为null的条数
 //            int totalCount = markTaskLevelRepo.countScoreByQuestionIdAndMarkerIdAndStageAndResultIsNull(questionId, marker.getId(), MarkStage.LEVEL.ordinal(), batchNo);

+ 7 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkSubjectApi.java

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.ms.marking.api;
 import cn.com.qmth.stmms.ms.commons.utils.ServletUtil;
 import cn.com.qmth.stmms.ms.core.cache.ParamCache;
 import cn.com.qmth.stmms.ms.core.domain.*;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.domain.user.*;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
@@ -110,6 +111,9 @@ public class MarkSubjectApi {
                 markSubject.setStage(MarkStage.LEVEL);
             }
         } else if (MarkStage.ROUGH_LEVEL.equals(markSubject.getStage())) {
+            if (markSubject.getTest() == TrialEnum.START_TRIAL.getId()) {
+                throw new RuntimeException("当前为试评阶段,请结束试评后再试");
+            }
             markSubject.setStage(MarkStage.LEVEL);
             //是否有未结束的分档任务
             int count = paperRepo.countByWorkIdAndSubjectAndRoughLevelIsNullAndIsMissingFalseAndRoughBatchNoNotNullAndTest(workId, subject, markSubject.getTest());
@@ -121,6 +125,9 @@ public class MarkSubjectApi {
                 throw new RuntimeException("有未发布的评卷任务");
             }
         } else if (MarkStage.LEVEL.equals(markSubject.getStage())) {
+            if (markSubject.getTest() == TrialEnum.START_TRIAL.getId()) {
+                throw new RuntimeException("当前为试评阶段,请结束试评后再试");
+            }
             markSubject.setStage(MarkStage.SCORE);
             stageControlService.enterToScoreStage(markSubject);
         }

+ 2 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -107,6 +107,8 @@ public class PaperAssembler {
             paperDTO.setOneClick(paper.isOneClick());
             paperDTO.setIsRejectedByLeader(paper.isRejectedByLeader() != null && paper.isRejectedByLeader());
             paperDTO.setScanUserId(paper.getScanUserId());
+            paperDTO.setMark(paper.isMark());
+            paperDTO.setAdminMark(paper.isAdminMark());
             //打回总次数
             int rejectedCount = markLogRepo.countByWorkIdAndPaperIdAndOperType(paper.getWorkId(), paper.getId(), MarkLogOperType.CALLBACK_LEVEl.getId());
             paperDTO.setRejectedCount(rejectedCount);