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