Эх сурвалжийг харах

美术网上阅卷-动态新增科目

wangliang 5 жил өмнө
parent
commit
4bfe2dea65

+ 332 - 203
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/ScoreExporter.java

@@ -3,12 +3,15 @@ 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.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.vo.Subject;
@@ -28,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -70,6 +74,12 @@ public class ScoreExporter {
             LEVEL_FILE_NAME = "档位成绩表",
             SCORE_FILE_NAME = "分数成绩表";
 
+    @Resource
+    MarkSubjectRepo markSubjectRepo;
+
+    @Resource
+    ImageConfig imageConfig;
+
     //@RequestMapping(method = RequestMethod.GET)
     public void export(@RequestParam Long workId, HttpServletResponse response) {
         List<ScoreDTO> scoreDTOs = new ArrayList<>();
@@ -175,9 +185,10 @@ public class ScoreExporter {
      * @param sheet
      * @param style
      * @param row
+     * @param workId
      * @param subjectMap
      */
-    public Sheet drawExcelFixedHead(int type, Sheet sheet, CellStyle style, Row row, Map<String, Map<String, ExportLevelResultDTO>> subjectMap) {
+    public Sheet drawExcelFixedHead(int type, Sheet sheet, CellStyle style, Row row, Map<String, Map<String, ExportLevelResultDTO>> subjectMap, Long workId) {
         //准考证号
         Cell cell = row.createCell(0);
         cell.setCellValue(EXAM_NUMBER);
@@ -204,66 +215,89 @@ public class ScoreExporter {
         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(SC_NAME);
-        cell4.setCellStyle(style);
-        if (level != scSumCount) {
-            CellRangeAddress region5 = new CellRangeAddress(0, 0, (short) level, scSumCount);
-            sheet.addMergedRegion(region5);
-        }
-        LOGGER.info("level:{},scSumCount:{}", level, scSumCount);
+        if (!imageConfig.isCustomSubject()) {
+            //色彩
+            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(SC_NAME);
+            cell4.setCellStyle(style);
+            if (level != scSumCount) {
+                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(SM_NAME);
-        cell5.setCellStyle(style);
-        if (scSumCount != smSumCount) {
-            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开始
+            //素描
+            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(SM_NAME);
+            cell5.setCellStyle(style);
+            if (scSumCount != smSumCount) {
+                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(SX_NAME);
+            cell6.setCellStyle(style);
+            if (smSumCount != sxSumCount) {
+                CellRangeAddress region7 = new CellRangeAddress(0, 0, (short) smSumCount, sxSumCount);
+                sheet.addMergedRegion(region7);
+            }
+            LOGGER.info("smSumCount:{},sxSumCount:{}", smSumCount, sxSumCount);
         } else {
-            sxSumCount = smSumCount + size;
-        }
-        Cell cell6 = row.createCell(smSumCount);
-        cell6.setCellValue(SX_NAME);
-        cell6.setCellStyle(style);
-        if (smSumCount != sxSumCount) {
-            CellRangeAddress region7 = new CellRangeAddress(0, 0, (short) smSumCount, sxSumCount);
-            sheet.addMergedRegion(region7);
+            //自定义
+            int size = 0;
+            if (Objects.nonNull(subjectMap.get(Subject.CUSTOM.toString()))) {
+                size = subjectMap.get(Subject.CUSTOM.toString()).size();
+            }
+            int customSumCount = 0;
+            if (type == 2) {
+                customSumCount = level + size + 1;
+            } else {
+                customSumCount = level + size;
+            }
+            MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + Subject.CUSTOM.name());
+            Cell cell4 = row.createCell(level);
+            cell4.setCellValue(markSubject.getName());
+            cell4.setCellStyle(style);
+            if (level != customSumCount) {
+                CellRangeAddress region5 = new CellRangeAddress(0, 0, (short) level, customSumCount);
+                sheet.addMergedRegion(region5);
+            }
+            LOGGER.info("level:{},customSumCount:{}", level, customSumCount);
         }
-        LOGGER.info("smSumCount:{},sxSumCount:{}", smSumCount, sxSumCount);
         return sheet;
     }
 
@@ -276,17 +310,24 @@ public class ScoreExporter {
     @RequestMapping(value = "exportLevelResult", method = RequestMethod.GET)
     public void exportLevelResult(@RequestParam Long workId, HttpServletResponse response) {
         //测试-导出档位成绩表
-        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` 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 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 = 'SC' and mu.enabled = 1) temp, student t where (p.is_missing = true or p.is_test = 3) and p.work_id = ? and p.subject = 'SC' and t.exam_number = p.exam_number ";
-        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` 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 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 = 'SM' and mu.enabled = 1) temp, student t where (p.is_missing = true or p.is_test = 3) and p.work_id = ? and p.subject = 'SM' and t.exam_number = p.exam_number ";
-        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` 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 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 = 'SX' and mu.enabled = 1) temp, student t where (p.is_missing = true or p.is_test = 3) 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);
-        sxSql = sqlUtil.sqlPrint(sxSql, workId, workId, 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);
+        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` 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 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 = 'SC' and mu.enabled = 1) temp, student t where (p.is_missing = true or p.is_test = 3) and p.work_id = ? and p.subject = 'SC' and t.exam_number = p.exam_number ";
+            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` 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 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 = 'SM' and mu.enabled = 1) temp, student t where (p.is_missing = true or p.is_test = 3) and p.work_id = ? and p.subject = 'SM' and t.exam_number = p.exam_number ";
+            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` 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 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 = 'SX' and mu.enabled = 1) temp, student t where (p.is_missing = true or p.is_test = 3) 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);
+            sxSql = sqlUtil.sqlPrint(sxSql, 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<>();//课程老师批改集合
@@ -305,80 +346,122 @@ public class ScoreExporter {
             Row row = sheet.createRow(0);
 
             //绘制固定表头
-            sheet = drawExcelFixedHead(levelInterval, sheet, style, row, subjectMap);
+            sheet = drawExcelFixedHead(levelInterval, sheet, style, row, subjectMap, workId);
 
             //绘制动态表头
             Row 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);
-            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 (v.getMarkByLeader()) {
-                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()), level + (scMap == null ? 0 : scMap.size())));
-                            }
-                            if (Objects.nonNull(v.getLevel())) {
-                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + 1, level + (scMap == null ? 0 : 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 == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + levelInterval, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + levelInterval));
-                            }
-                            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()) + levelInterval + 1, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + levelInterval + 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 = 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);
+                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 (v.getMarkByLeader()) {
+                                    drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()), level + (scMap == null ? 0 : scMap.size())));
+                                }
+                                if (Objects.nonNull(v.getLevel())) {
+                                    drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()) + 1, level + (scMap == null ? 0 : 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 == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + levelInterval, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + levelInterval));
+                                }
+                                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()) + levelInterval + 1, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : 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 == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2));
+                                }
+                                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()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2 + 1, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2 + 1));
+                                }
                             }
-                        } else if (k.contains(Subject.SX.toString())) {
-                            ExportLevelResultDTO exportLevelResultDTO = sxMap.get(v.getTeacherName());
+                        });
+                    }
+                    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 + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2));
+                                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 + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2 + 1, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + levelInterval * 2 + 1));
+                                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();
-            });
+                        });
+                    }
+                    i.getAndIncrement();
+                });
+            }
             ExportUtils.exportEXCEL(LEVEL_FILE_NAME, wb, response);
         }
     }
@@ -392,17 +475,24 @@ public class ScoreExporter {
     @RequestMapping(value = "exportScoreResult", method = RequestMethod.GET)
     public void exportScoreResult(@RequestParam Long workId, HttpServletResponse response) {
         //测试-导出分数成绩表
-        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, 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, 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, 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, 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, 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, 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);
-        sxSql = sqlUtil.sqlPrint(sxSql, workId, workId, 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);
+        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, 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, 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, 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, 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, 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, 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);
+            sxSql = sqlUtil.sqlPrint(sxSql, 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.*, 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, 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 = '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 = 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, 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 = 'CUSTOM' and mu.enabled = 1) temp, student t where p.is_missing = true 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<>();//课程老师批改集合
@@ -421,71 +511,110 @@ public class ScoreExporter {
             Row row = sheet.createRow(0);
 
             //绘制固定表头
-            sheet = drawExcelFixedHead(scoreInterval, sheet, style, row, subjectMap);
+            sheet = drawExcelFixedHead(scoreInterval, sheet, style, row, subjectMap, workId);
 
             //绘制动态表头
             Row 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);
-            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(v.getLevel(), firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()), level + (scMap == null ? 0 : 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 == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + scoreInterval, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + scoreInterval));
+            if (!imageConfig.isCustomSubject()) {
+                //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);
+                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(v.getLevel(), firstRow, firstRow, level + (scMap == null ? 0 : scMap.size()), level + (scMap == null ? 0 : 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 == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + scoreInterval, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : 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 == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + scoreInterval * 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + scoreInterval * 2));
+                                }
                             }
-                        } else if (k.contains(Subject.SX.toString())) {
-                            ExportLevelResultDTO exportLevelResultDTO = sxMap.get(v.getTeacherName());
+                        });
+                    }
+                    i.getAndIncrement();
+                });
+            } else {
+                //SC表头
+                Map<String, ExportLevelResultDTO> customMap = subjectMap.get(Subject.CUSTOM.toString());
+                int size = 0;
+                if (Objects.nonNull(customMap) && customMap.size() > 0) {
+                    drawExcelTeacher(scoreInterval, 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 (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()) + (sxMap == null ? 0 : sxMap.size()) + scoreInterval * 2, level + (scMap == null ? 0 : scMap.size()) + (smMap == null ? 0 : smMap.size()) + (sxMap == null ? 0 : sxMap.size()) + scoreInterval * 2));
+                                drawExcelFixedHead(finalSheet, style, hssfRow, new HeaderNode(v.getLevel(), firstRow, firstRow, level + (customMap == null ? 0 : customMap.size()), level + (customMap == null ? 0 : customMap.size())));
                             }
-                        }
-                    });
-                }
-                i.getAndIncrement();
-            });
+                        });
+                    }
+                    i.getAndIncrement();
+                });
+            }
             ExportUtils.exportEXCEL(SCORE_FILE_NAME, wb, response);
         }
     }

+ 24 - 9
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/UserExporter.java

@@ -2,17 +2,20 @@ package cn.com.qmth.stmms.ms.admin.exporter;
 
 import cn.com.qmth.stmms.ms.admin.assembler.MarkUserAssembler;
 import cn.com.qmth.stmms.ms.admin.dto.MarkUserDTO;
-import cn.com.qmth.stmms.ms.admin.dto.PaperCounter;
 import cn.com.qmth.stmms.ms.admin.dto.StudentDTO;
+import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 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.Work;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
+import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.List;
@@ -35,23 +38,29 @@ public class UserExporter {
     @Autowired
     private MarkUserAssembler markUserAssembler;
 
+    @Resource
+    MarkSubjectRepo markSubjectRepo;
+
+    @Resource
+    ImageConfig imageConfig;
+
     @RequestMapping(method = RequestMethod.GET)
-    public void export(@RequestParam Long workId, @RequestParam(required = false) Subject subject,HttpServletResponse response){
+    public void export(@RequestParam Long workId, @RequestParam(required = false) Subject subject, HttpServletResponse response) {
         List<MarkUserDTO> markUserDTOs = new ArrayList<>();
         Stream<MarkUser> markUserStream = markUserRepo.findByWorkId(workId).stream();
-        if(subject != null){
+        if (subject != null) {
             markUserStream = markUserStream.filter(u -> u.getSubject() == subject);
         }
         markUserStream.forEach(u -> {
             markUserDTOs.add(markUserAssembler.toDTO(u));
         });
         String fileName = "用户列表";
-        ExportUtils.exportEXCEL(fileName,MarkUserDTO.class,markUserDTOs,response);
+        ExportUtils.exportEXCEL(fileName, MarkUserDTO.class, markUserDTOs, response);
     }
 
-    @RequestMapping(value = "{work}/{subject}/export",method = RequestMethod.GET)
-    public void countGropuByQuestion(@PathVariable Work work, @PathVariable Subject subject, HttpServletResponse response){
-        if(work != null) {
+    @RequestMapping(value = "{work}/{subject}/export", method = RequestMethod.GET)
+    public void countGropuByQuestion(@PathVariable Work work, @PathVariable Subject subject, HttpServletResponse response) {
+        if (work != null) {
             List<StudentDTO> list = new ArrayList<>();
             List<Object[]> result = studentRepo.listMissingBySubject(work.getId(), subject.toString());
             result.forEach(i -> {
@@ -64,8 +73,14 @@ public class UserExporter {
                 studentDTO.setSourceName(String.valueOf(i[5]));
                 list.add(studentDTO);
             });
-            String fileName =subject.toString()+ "缺考名单";
-            ExportUtils.exportEXCEL(fileName,StudentDTO.class,list,response);
+            String fileName = null;
+            if (!imageConfig.isCustomSubject()) {
+                fileName = subject.toString() + "缺考名单";
+            } else {
+                MarkSubject markSubject = markSubjectRepo.findOne(work.getId() + "-" + Subject.CUSTOM.name());
+                fileName = markSubject.getName() + "缺考名单";
+            }
+            ExportUtils.exportEXCEL(fileName, StudentDTO.class, list, response);
         }
     }
 }

+ 19 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -89,6 +89,9 @@ public class DataUploadService {
             FileInputStream sheetIn = null;
             FileInputStream slicein = null;
             Student student = studentRepo.findOne(studentId);
+            if (imageConfig.isCustomSubject()) {
+                subject = Subject.CUSTOM;
+            }
             if (imageConfig.isImageEnc()) {
                 //保存裁切原图+文件名加密
                 String imageDir = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject
@@ -250,8 +253,14 @@ public class DataUploadService {
 
                     long isExist = examQuestionRepo.countByWorkIdAndAreaCode(workId, dto.getAreaCode());
                     if (isExist == 0) {
-                        for (Subject subject : Subject.values()) {
-                            ExamQuestion question = new ExamQuestion(dto.getAreaCode(), subject, workId, dto.getAreaName());
+                        if (!imageConfig.isCustomSubject()) {
+                            for (Subject subject : Subject.values()) {
+                                ExamQuestion question = new ExamQuestion(dto.getAreaCode(), subject, workId, dto.getAreaName());
+                                examQuestionRepo.save(question);
+                            }
+                        } else {
+                            MarkSubject markSubject = markSubjectRepo.findOne(workId + "-" + Subject.CUSTOM.name());
+                            ExamQuestion question = new ExamQuestion(dto.getAreaCode(), Subject.CUSTOM, markSubject.getName(), workId, dto.getAreaName());
                             examQuestionRepo.save(question);
                         }
                     }
@@ -259,11 +268,18 @@ public class DataUploadService {
                     if (student == null && !isAbsent) {
                         student = new Student(dto.getName(), dto.getExamNumber(), dto.getAreaName(), dto.getAreaCode(),
                                 workId, dto.getExamRoom(), dto.getSourceName(), String.valueOf(TrialEnum.DEFAULT.getId()));
+                        if (imageConfig.isCustomSubject()) {
+                            student.setUploadStatus("CUSTOM:0");
+                        }
                         studentRepo.save(student);
                     } else if (student != null) {
                         if (isAbsent) {
                             student.setAbsent(isAbsent);
-                            student.setUploadStatus("SX:0,SC:0,SM:0");
+                            if (!imageConfig.isCustomSubject()) {
+                                student.setUploadStatus("SX:0,SC:0,SM:0");
+                            } else {
+                                student.setUploadStatus("CUSTOM:0");
+                            }
 
                             /**
                              * 查询该考生所有paper,若paper无任务则删除,有任务就保留

+ 14 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/WorkService.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.admin.service;
 
+import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
@@ -11,6 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+
 /**
  * 评卷工作服务
  */
@@ -26,6 +29,9 @@ public class WorkService {
     @Autowired
     private MarkSubjectRepo markSubjectRepo;
 
+    @Resource
+    ImageConfig imageConfig;
+
     /**
      * 删除评卷工作
      *
@@ -50,8 +56,14 @@ public class WorkService {
     public void save(Work work) {
         workRepo.save(work);
         Subject[] subjects = Subject.values();
-        for (Subject subject : subjects) {
-            MarkSubject markSubject = new MarkSubject(subject, work.getId());
+        if (!imageConfig.isCustomSubject()) {
+            for (int i = 0; i < subjects.length - 1; i++) {
+                MarkSubject markSubject = new MarkSubject(subjects[i], work.getId());
+                markSubject.setWorkId(work.getId());
+                markSubjectRepo.save(markSubject);
+            }
+        } else {
+            MarkSubject markSubject = new MarkSubject(work.getName(), Subject.CUSTOM, work.getId());
             markSubject.setWorkId(work.getId());
             markSubjectRepo.save(markSubject);
         }

+ 5 - 0
stmms-ms-collect/pom.xml

@@ -35,6 +35,11 @@
             <artifactId>json-lib-ext-spring</artifactId>
             <version>1.0.2</version>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.8.0</version>
+        </dependency>
 
     </dependencies>
 </project>

+ 106 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/AliYunOssConfig.java

@@ -0,0 +1,106 @@
+package cn.com.qmth.stmms.ms.commons.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Description: 阿里云oss config
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/3/30
+ */
+@Configuration
+@ConfigurationProperties(prefix = "aliyun.oss", ignoreUnknownFields = false)
+public class AliYunOssConfig {
+
+    private String endpoint;
+
+    private String endpointInner;
+
+    private String accessKeyId;
+
+    private String accessKeySecret;
+
+    private String bucket;
+
+    private String tmpdir;
+
+    /**
+     * @return the tmpdir
+     */
+    public String getTmpdir() {
+        return tmpdir;
+    }
+
+    /**
+     * @param tmpdir the tmpdir to set
+     */
+    public void setTmpdir(String tmpdir) {
+        this.tmpdir = tmpdir;
+    }
+
+    /**
+     * @return the endpoint
+     */
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    /**
+     * @param endpoint the endpoint to set
+     */
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public String getEndpointInner() {
+        return endpointInner;
+    }
+
+    public void setEndpointInner(String endpointInner) {
+        this.endpointInner = endpointInner;
+    }
+
+    /**
+     * @return the accessKeyId
+     */
+    public String getAccessKeyId() {
+        return accessKeyId;
+    }
+
+    /**
+     * @param accessKeyId the accessKeyId to set
+     */
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    /**
+     * @return the accessKeySecret
+     */
+    public String getAccessKeySecret() {
+        return accessKeySecret;
+    }
+
+    /**
+     * @param accessKeySecret the accessKeySecret to set
+     */
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+
+    /**
+     * @return the bucket
+     */
+    public String getBucket() {
+        return bucket;
+    }
+
+    /**
+     * @param bucket the bucket to set
+     */
+    public void setBucket(String bucket) {
+        this.bucket = bucket;
+    }
+}

+ 10 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/ImageConfig.java

@@ -16,6 +16,16 @@ public class ImageConfig {
 
     private boolean imageEnc;//是否开启图片加密
 
+    private boolean customSubject;//是否开启自定义科目考试
+
+    public boolean isCustomSubject() {
+        return customSubject;
+    }
+
+    public void setCustomSubject(boolean customSubject) {
+        this.customSubject = customSubject;
+    }
+
     public boolean isImageEnc() {
         return imageEnc;
     }

+ 88 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/CommandUtil.java

@@ -0,0 +1,88 @@
+package cn.com.qmth.stmms.ms.commons.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Scanner;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Description: command 工具
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/3/30
+ */
+public class CommandUtil {
+
+    /**
+     * 执行shell或linux脚本命令
+     *
+     * @param command
+     * @return
+     * @throws IOException
+     */
+    public static String run(String command) throws IOException {
+        Scanner input = null;
+        String result = "";
+        Process process = null;
+        try {
+            process = Runtime.getRuntime().exec(command);
+            try {
+                //等待命令执行完成
+                process.waitFor(10, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            InputStream is = process.getInputStream();
+            input = new Scanner(is);
+            while (input.hasNextLine()) {
+                result += input.nextLine() + "\n";
+            }
+            result = command + "\n" + result; //加上命令本身,打印出来
+        } finally {
+            if (input != null) {
+                input.close();
+            }
+            if (process != null) {
+                process.destroy();
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 执行shell或linux脚本命令(带参数)
+     *
+     * @param command
+     * @return
+     * @throws IOException
+     */
+    public static String run(String[] command) throws IOException {
+        Scanner input = null;
+        String result = "";
+        Process process = null;
+        try {
+            process = Runtime.getRuntime().exec(command);
+            try {
+                //等待命令执行完成
+                process.waitFor(10, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            InputStream is = process.getInputStream();
+            input = new Scanner(is);
+            while (input.hasNextLine()) {
+                result += input.nextLine() + "\n";
+            }
+            result = command + "\n" + result; //加上命令本身,打印出来
+        } finally {
+            if (input != null) {
+                input.close();
+            }
+            if (process != null) {
+                process.destroy();
+            }
+        }
+        return result;
+    }
+}

+ 3 - 3
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/RandomUtil.java

@@ -37,13 +37,13 @@ public class RandomUtil {
         List list = randomMap.get(workId);
         if (Objects.isNull(list)) {
             randomMap.clear();
-            list = new ArrayList();
+            list = new ArrayList(randomSize);
         }
         if (list.size() == 0 || againRandom) {
             long start = System.currentTimeMillis();
             if (againRandom) {
                 randomMap.clear();
-                list = new ArrayList();
+                list = new ArrayList(randomSize);
                 randomNum++;
             }
             Long randomReq = workId % 10;
@@ -59,7 +59,7 @@ public class RandomUtil {
             myThreadPool.arbitratePoolTaskExecutor.execute(new Runnable() {
                 @Override
                 public void run() {
-                    Set<Long> set = new HashSet<>();
+                    Set<Long> set = new HashSet<>(randomSize);
                     for (int i = 0; i < randomSize; i++) {
                         long id = (long) (Math.random() * minSize + maxSize * finalRandomReq);
                         set.add(id);

+ 16 - 8
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ExamQuestion.java

@@ -11,7 +11,7 @@ import java.io.Serializable;
  * Created by zhengmin on 2016/9/21.
  */
 @Entity
-public class ExamQuestion implements Serializable{
+public class ExamQuestion implements Serializable {
 
     private static final long serialVersionUID = 966670964450775040L;
 
@@ -31,7 +31,7 @@ public class ExamQuestion implements Serializable{
 
     @NotNull
     private Long workId;
-    
+
     private String areaName;
 
     @Basic
@@ -54,6 +54,14 @@ public class ExamQuestion implements Serializable{
         this.areaName = areaName;
     }
 
+    public ExamQuestion(String areaCode, Subject subject, String subjectName, Long workId, String areaName) {
+        this.areaCode = areaCode;
+        this.name = subjectName + this.areaCode;
+        this.subject = subject;
+        this.workId = workId;
+        this.areaName = areaName;
+    }
+
     public ExamQuestion() {
     }
 
@@ -89,13 +97,13 @@ public class ExamQuestion implements Serializable{
         this.subject = subject;
     }
 
-	public String getAreaName() {
-		return areaName;
-	}
+    public String getAreaName() {
+        return areaName;
+    }
 
-	public void setAreaName(String areaName) {
-		this.areaName = areaName;
-	}
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
 
     public static long getSerialVersionUID() {
         return serialVersionUID;

+ 6 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java

@@ -83,6 +83,12 @@ public class MarkSubject implements Serializable {
         this.stage = MarkStage.INIT;
     }
 
+    public MarkSubject(String name, Subject subject, Long workId) {
+        this.id = workId + "-" + subject;
+        this.name = name;
+        this.stage = MarkStage.INIT;
+    }
+
     public MarkSubject() {
     }
 

+ 2 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/vo/Subject.java

@@ -7,7 +7,8 @@ public enum Subject {
 
     SX("速写"),
     SC("色彩"),
-    SM("素描");
+    SM("素描"),
+    CUSTOM("自定义");
 
     private String name;
 

+ 13 - 3
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/ExamQuestionApi.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.ms.marking.api;
 
+import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
 import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
 import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.ExamQuestionRepo;
@@ -10,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 /**
@@ -23,14 +25,22 @@ public class ExamQuestionApi {
     @Autowired
     private ExamQuestionRepo examQuestionRepo;
 
+    @Resource
+    ImageConfig imageConfig;
+
     /**
      * 试题列表
-     * @param workId 评卷工作id
+     *
+     * @param workId  评卷工作id
      * @param subject 科目
      * @return
      */
     @RequestMapping(method = RequestMethod.GET)
-    public List<ExamQuestion> list(@RequestParam Long workId, @RequestParam Subject subject){
-        return examQuestionRepo.findByWorkIdAndSubjectAndTest(workId,subject, TrialEnum.DEFAULT.getId());
+    public List<ExamQuestion> list(@RequestParam Long workId, @RequestParam Subject subject) {
+        if (!imageConfig.isCustomSubject()) {
+            return examQuestionRepo.findByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.DEFAULT.getId());
+        } else {
+            return examQuestionRepo.findByWorkIdAndSubjectAndTest(workId, Subject.CUSTOM, TrialEnum.DEFAULT.getId());
+        }
     }
 }