|
@@ -4,6 +4,10 @@ import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.deepoove.poi.data.*;
|
|
|
+import com.deepoove.poi.data.style.CellStyle;
|
|
|
+import com.deepoove.poi.data.style.ParagraphStyle;
|
|
|
+import com.deepoove.poi.data.style.RowStyle;
|
|
|
import com.google.gson.reflect.TypeToken;
|
|
|
import com.qmth.distributed.print.business.bean.dto.CourseWeightDetailDto;
|
|
|
import com.qmth.distributed.print.business.bean.dto.CourseWeightDto;
|
|
@@ -11,6 +15,9 @@ import com.qmth.distributed.print.business.bean.dto.FinalScoreDto;
|
|
|
import com.qmth.distributed.print.business.bean.dto.report.*;
|
|
|
import com.qmth.distributed.print.business.bean.result.FinalScoreResult;
|
|
|
import com.qmth.distributed.print.business.bean.result.report.PaperStructResult;
|
|
|
+import com.qmth.distributed.print.business.bean.result.report.word.CourseTargetTableBean1;
|
|
|
+import com.qmth.distributed.print.business.bean.result.report.word.CourseTargetTableBean3;
|
|
|
+import com.qmth.distributed.print.business.bean.result.report.word.CourseTargetTableBean4;
|
|
|
import com.qmth.distributed.print.business.entity.TCPaperStruct;
|
|
|
import com.qmth.distributed.print.business.entity.TRBasicInfo;
|
|
|
import com.qmth.distributed.print.business.entity.TRExamStudent;
|
|
@@ -26,6 +33,8 @@ import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
import com.qmth.teachcloud.mark.bean.archivescore.ScoreRangeVo;
|
|
|
import com.qmth.teachcloud.mark.entity.MarkPaper;
|
|
|
import com.qmth.teachcloud.mark.utils.Calculator;
|
|
|
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
|
|
|
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
@@ -390,6 +399,247 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
|
|
|
return trBasicInfo;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * 构建word动态表格1
|
|
|
+ *
|
|
|
+ * @param courseTargetWordDtoList
|
|
|
+ * @param header2_1List
|
|
|
+ * @param header2_2List
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableRenderData buildWordTable1(List<CourseTargetWordDto> courseTargetWordDtoList,
|
|
|
+ List<String> header2_1List,
|
|
|
+ List<String> header2_2List) {
|
|
|
+
|
|
|
+ RowRenderData header1 = Rows.of("课程目标", "毕业要求指标点").bgColor("F2F2F2").center().create();
|
|
|
+ Tables.TableBuilder tableBuilder1 = Tables.ofPercentWidth("100%");
|
|
|
+ tableBuilder1.addRow(header1);
|
|
|
+
|
|
|
+ for (int i = 0; i < courseTargetWordDtoList.size(); i++) {
|
|
|
+ CourseTargetWordDto courseTargetWordDto = courseTargetWordDtoList.get(i);
|
|
|
+ List<ReportEvaluationDto> reportEvaluationDtoList = courseTargetWordDto.getUsualScoreDto().getUsualScoreDetailList();
|
|
|
+ for (ReportEvaluationDto r : reportEvaluationDtoList) {
|
|
|
+ header2_1List.add("");
|
|
|
+ header2_2List.add(r.getEvaluation());
|
|
|
+ }
|
|
|
+
|
|
|
+ CourseTargetTableBean1 courseTargetTableBean1 = new CourseTargetTableBean1(courseTargetWordDto.getTargetName(), courseTargetWordDto.getGraduationRequirement());
|
|
|
+ RowRenderData row = Rows.of(courseTargetTableBean1.getName(), courseTargetTableBean1.getTarget()).rowStyle(this.getRowStyle()).create();
|
|
|
+ tableBuilder1.addRow(row);
|
|
|
+ }
|
|
|
+ header2_1List.add("目标分值统计");
|
|
|
+ header2_2List.add("期末考试");
|
|
|
+ header2_2List.add("目标分值统计");
|
|
|
+ return tableBuilder1.left().create();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 构建word动态表格2
|
|
|
+ *
|
|
|
+ * @param courseTargetWordDtoList
|
|
|
+ * @param courseTargetWebDtoList
|
|
|
+ * @param header2_1List
|
|
|
+ * @param header2_2List
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableRenderData buildWordTable2(List<CourseTargetWordDto> courseTargetWordDtoList,
|
|
|
+ List<CourseTargetWebDto> courseTargetWebDtoList,
|
|
|
+ List<String> header2_1List,
|
|
|
+ List<String> header2_2List) {
|
|
|
+ RowRenderData header2_1 = Rows.of(header2_1List.toArray(new String[header2_1List.size()])).bgColor("F2F2F2").center().create();
|
|
|
+ RowRenderData header2_2 = Rows.of(header2_2List.toArray(new String[header2_1List.size()])).bgColor("F2F2F2").center().create();
|
|
|
+
|
|
|
+ RowRenderData[] rowRenderData2 = new RowRenderData[courseTargetWordDtoList.size() + 3];
|
|
|
+ Map<String, BigDecimal> rowRenderData2SumMap = new LinkedHashMap<>();
|
|
|
+ BigDecimal targetSum = new BigDecimal(0);
|
|
|
+ for (int i = 0; i < courseTargetWebDtoList.size(); i++) {
|
|
|
+ CourseTargetWebDto courseTargetWebDto = courseTargetWebDtoList.get(i);
|
|
|
+ List<ReportEvaluationDto> reportEvaluationDtoList = courseTargetWebDto.getEvaluationList();
|
|
|
+ Map<String, ReportEvaluationDto> reportEvaluationDtoMap = reportEvaluationDtoList.stream().collect(Collectors.toMap(ReportEvaluationDto::getEvaluation, Function.identity(), (dto1, dto2) -> dto1));
|
|
|
+ List<String> rowData = new ArrayList<>();
|
|
|
+ BigDecimal sumScore = new BigDecimal(0);
|
|
|
+ rowData.add(header2_2List.get(0));
|
|
|
+ rowData.add(header2_2List.get(1));
|
|
|
+ for (int y = 2; y < header2_2List.size() - 1; y++) {
|
|
|
+ String key = header2_2List.get(y);
|
|
|
+ if (!rowRenderData2SumMap.containsKey(key) && Objects.nonNull(reportEvaluationDtoMap.get(key))) {
|
|
|
+ rowRenderData2SumMap.put(key, reportEvaluationDtoMap.get(key).getTargetScore());
|
|
|
+ } else if (Objects.nonNull(reportEvaluationDtoMap.get(key))) {
|
|
|
+ BigDecimal bigDecimal = rowRenderData2SumMap.get(key);
|
|
|
+ bigDecimal = bigDecimal.add(reportEvaluationDtoMap.get(key).getTargetScore());
|
|
|
+ rowRenderData2SumMap.put(key, bigDecimal);
|
|
|
+ }
|
|
|
+ if (reportEvaluationDtoMap.containsKey(key)) {
|
|
|
+ BigDecimal targetScore = reportEvaluationDtoMap.get(key).getTargetScore();
|
|
|
+ rowData.add(targetScore.toString());
|
|
|
+ sumScore = sumScore.add(targetScore);
|
|
|
+ } else {
|
|
|
+ rowData.add("0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ rowData.add(sumScore.toString());
|
|
|
+ targetSum = targetSum.add(sumScore);
|
|
|
+ rowRenderData2SumMap.put("目标分值统计", targetSum);
|
|
|
+ rowRenderData2[i + 2] = Rows.of(rowData.toArray(new String[header2_2List.size()])).rowStyle(this.getRowStyle()).create();
|
|
|
+ }
|
|
|
+ rowRenderData2[0] = header2_1;
|
|
|
+ rowRenderData2[1] = header2_2;
|
|
|
+
|
|
|
+ List<String> header2FootList = new ArrayList<>(header2_2List.size());
|
|
|
+ header2FootList.add("合计");
|
|
|
+ header2FootList.add("");
|
|
|
+ for (int y = 2; y < header2_2List.size(); y++) {
|
|
|
+ header2FootList.add(rowRenderData2SumMap.get(header2_2List.get(y)).toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ RowRenderData header2_foot = Rows.of(header2FootList.toArray(new String[header2_2List.size()])).rowStyle(this.getRowStyle()).create();
|
|
|
+ rowRenderData2[rowRenderData2.length - 1] = header2_foot;
|
|
|
+
|
|
|
+
|
|
|
+ MergeCellRule mergeCellRule2 = MergeCellRule.builder().map(MergeCellRule.Grid.of(0, 0), MergeCellRule.Grid.of(1, 0)).
|
|
|
+ map(MergeCellRule.Grid.of(0, 1), MergeCellRule.Grid.of(1, 1)).
|
|
|
+ map(MergeCellRule.Grid.of(0, 2), MergeCellRule.Grid.of(0, header2FootList.size() - 2)).
|
|
|
+ map(MergeCellRule.Grid.of(0, header2FootList.size() - 1), MergeCellRule.Grid.of(1, header2FootList.size() - 1)).
|
|
|
+ map(MergeCellRule.Grid.of(rowRenderData2.length - 1, 0), MergeCellRule.Grid.of(rowRenderData2.length - 1, 1)).
|
|
|
+ build();
|
|
|
+
|
|
|
+ Tables.TableBuilder tableBuilder2 = Tables.ofPercentWidth("100%");
|
|
|
+ for (int i = 0; i < rowRenderData2.length; i++) {
|
|
|
+ tableBuilder2.addRow(rowRenderData2[i]);
|
|
|
+ }
|
|
|
+ return tableBuilder2.mergeRule(mergeCellRule2).left().create();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 构建word动态表格3
|
|
|
+ *
|
|
|
+ * @param courseTargetWordDtoList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableRenderData buildWordTable3(List<CourseTargetWordDto> courseTargetWordDtoList) {
|
|
|
+ RowRenderData header3_1 = Rows.of("序号", "项目", "考核内容及要求", "目标分值", "对应的课程目标").bgColor("F2F2F2").center().create();
|
|
|
+ String tableFootTitle3 = "合计${usualScoreSum}分,占课程总评成绩的${usualScoreSumWeight}%";
|
|
|
+ List<CourseTargetTableBean3> courseTargetTableBean3List = new ArrayList<>();
|
|
|
+ BigDecimal usualScoreSum3 = new BigDecimal(0), usualScoreTargetSumWeight3 = new BigDecimal(0);
|
|
|
+ Integer seq3 = 1;
|
|
|
+ for (CourseTargetWordDto courseTargetWordDto : courseTargetWordDtoList) {
|
|
|
+ UsualScoreWordDto usualScoreWordDto = courseTargetWordDto.getUsualScoreDto();
|
|
|
+ List<ReportEvaluationDto> reportEvaluationDtoList = usualScoreWordDto.getUsualScoreDetailList();
|
|
|
+ for (int i = 0; i < reportEvaluationDtoList.size(); i++) {
|
|
|
+ ReportEvaluationDto reportEvaluationDto = reportEvaluationDtoList.get(i);
|
|
|
+ CourseTargetTableBean3 courseTargetTableBean3 = new CourseTargetTableBean3(seq3++, reportEvaluationDto.getEvaluation(), reportEvaluationDto.getEvaluationDesc(), reportEvaluationDto.getTargetScore(), courseTargetWordDto.getTargetName());
|
|
|
+ courseTargetTableBean3List.add(courseTargetTableBean3);
|
|
|
+ }
|
|
|
+ usualScoreSum3 = usualScoreSum3.add(usualScoreWordDto.getUsualScoreTargetSumScore());
|
|
|
+ usualScoreTargetSumWeight3 = usualScoreTargetSumWeight3.add(usualScoreWordDto.getUsualScoreTargetSumWeight());
|
|
|
+ }
|
|
|
+ usualScoreTargetSumWeight3 = usualScoreTargetSumWeight3.divide(new BigDecimal(courseTargetWordDtoList.size()), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ tableFootTitle3 = tableFootTitle3.replace("${usualScoreSum}", usualScoreSum3.toString());
|
|
|
+ tableFootTitle3 = tableFootTitle3.replace("${usualScoreSumWeight}", usualScoreTargetSumWeight3.toString());
|
|
|
+
|
|
|
+ RowRenderData[] rowRenderData3 = new RowRenderData[courseTargetTableBean3List.size() + 2];
|
|
|
+ for (int i = 0; i < courseTargetTableBean3List.size(); i++) {
|
|
|
+ CourseTargetTableBean3 courseTargetTableBean3 = courseTargetTableBean3List.get(i);
|
|
|
+ rowRenderData3[i + 1] = Rows.of(courseTargetTableBean3.getNum().toString(), courseTargetTableBean3.getProject(), courseTargetTableBean3.getContent(), courseTargetTableBean3.getTarget().toString(), courseTargetTableBean3.getCourseTarget()).rowStyle(this.getRowStyle()).create();
|
|
|
+ }
|
|
|
+ rowRenderData3[0] = header3_1;
|
|
|
+ RowRenderData header3_foot = Rows.of(tableFootTitle3, "", "", "", "").center().create();
|
|
|
+ rowRenderData3[rowRenderData3.length - 1] = header3_foot;
|
|
|
+
|
|
|
+
|
|
|
+ MergeCellRule mergeCellRule3 = MergeCellRule.builder().map(MergeCellRule.Grid.of(rowRenderData3.length - 1, 0), MergeCellRule.Grid.of(rowRenderData3.length - 1, 4)).
|
|
|
+ build();
|
|
|
+
|
|
|
+ Tables.TableBuilder tableBuilder3 = Tables.ofPercentWidth("100%");
|
|
|
+ for (int i = 0; i < rowRenderData3.length; i++) {
|
|
|
+ tableBuilder3.addRow(rowRenderData3[i]);
|
|
|
+ }
|
|
|
+ return tableBuilder3.mergeRule(mergeCellRule3).left().create();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 构建word动态表格4
|
|
|
+ *
|
|
|
+ * @param courseTargetWordDtoList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableRenderData buildWordTable4(List<CourseTargetWordDto> courseTargetWordDtoList) {
|
|
|
+ RowRenderData header4_1 = Rows.of("序号", "考核项目", "考核内容所涵盖的知识单元", "目标分值", "对应的课程目标").bgColor("F2F2F2").center().create();
|
|
|
+ List<CourseTargetTableBean4> courseTargetTableBean4List = new ArrayList<>();
|
|
|
+ BigDecimal finalScoreSum4 = new BigDecimal(0), finalScoreTargetSumWeight4 = new BigDecimal(0);
|
|
|
+ Integer seq4 = 1;
|
|
|
+ for (int i = 0; i < courseTargetWordDtoList.size(); i++) {
|
|
|
+ CourseTargetWordDto courseTargetWordDto = courseTargetWordDtoList.get(i);
|
|
|
+ FinalScoreWordDto finalScoreWordDto = courseTargetWordDto.getFinalScoreDto();
|
|
|
+ finalScoreSum4 = finalScoreSum4.add(finalScoreWordDto.getFinalScoreTargetSumScore());
|
|
|
+ finalScoreTargetSumWeight4 = finalScoreTargetSumWeight4.add(finalScoreWordDto.getFinalScoreSumWeight());
|
|
|
+ List<DimensionDto> dimensionDtoList = courseTargetWordDto.getFinalScoreDto().getDimensionList();
|
|
|
+ for (DimensionDto dimensionDto : dimensionDtoList) {
|
|
|
+ CourseTargetTableBean4 courseTargetTableBean4 = new CourseTargetTableBean4(seq4++, courseTargetWordDto.getGraduationRequirement(), dimensionDto.getDimensionName(), dimensionDto.getDimensionScore(), courseTargetWordDto.getTargetName());
|
|
|
+ courseTargetTableBean4List.add(courseTargetTableBean4);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finalScoreTargetSumWeight4 = finalScoreTargetSumWeight4.divide(new BigDecimal(courseTargetWordDtoList.size()), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ String tableFootTitle4 = "合计${dimensionScoreSum}分,占课程总评成绩的${dimensionSumWeight}%";
|
|
|
+ tableFootTitle4 = tableFootTitle4.replace("${dimensionScoreSum}", finalScoreSum4.toString());
|
|
|
+ tableFootTitle4 = tableFootTitle4.replace("${dimensionSumWeight}", finalScoreTargetSumWeight4.toString());
|
|
|
+
|
|
|
+ RowRenderData[] rowRenderData4 = new RowRenderData[courseTargetTableBean4List.size() + 2];
|
|
|
+ for (int i = 0; i < courseTargetTableBean4List.size(); i++) {
|
|
|
+ CourseTargetTableBean4 courseTargetTableBean4 = courseTargetTableBean4List.get(i);
|
|
|
+ rowRenderData4[i + 1] = Rows.of(courseTargetTableBean4.getNum().toString(), courseTargetTableBean4.getProject(), courseTargetTableBean4.getContent(), courseTargetTableBean4.getTargetScore().toString(), courseTargetTableBean4.getCourseTarget()).rowStyle(this.getRowStyle()).create();
|
|
|
+ }
|
|
|
+ rowRenderData4[0] = header4_1;
|
|
|
+ RowRenderData header4_foot = Rows.of(tableFootTitle4, "", "", "", "").center().create();
|
|
|
+ rowRenderData4[rowRenderData4.length - 1] = header4_foot;
|
|
|
+
|
|
|
+
|
|
|
+ MergeCellRule mergeCellRule4 = MergeCellRule.builder().map(MergeCellRule.Grid.of(rowRenderData4.length - 1, 0), MergeCellRule.Grid.of(rowRenderData4.length - 1, 4)).
|
|
|
+ build();
|
|
|
+
|
|
|
+ Tables.TableBuilder tableBuilder4 = Tables.ofPercentWidth("100%");
|
|
|
+ for (int i = 0; i < rowRenderData4.length; i++) {
|
|
|
+ tableBuilder4.addRow(rowRenderData4[i]);
|
|
|
+ }
|
|
|
+ return tableBuilder4.mergeRule(mergeCellRule4).left().create();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 获取行样式
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ protected RowStyle getRowStyle() {
|
|
|
+ RowStyle rowStyle = new RowStyle();
|
|
|
+ ParagraphStyle paragraphStyle = new ParagraphStyle();
|
|
|
+ paragraphStyle.setAlign(ParagraphAlignment.LEFT);
|
|
|
+ CellStyle cellStyle = new CellStyle();
|
|
|
+ cellStyle.setDefaultParagraphStyle(paragraphStyle);
|
|
|
+ cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
|
|
|
+ rowStyle.setDefaultCellStyle(cellStyle);
|
|
|
+ return rowStyle;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 获取行样式
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ protected RowStyle getHeadRowStyle() {
|
|
|
+ RowStyle rowStyle = new RowStyle();
|
|
|
+ ParagraphStyle paragraphStyle = new ParagraphStyle();
|
|
|
+ paragraphStyle.setAlign(ParagraphAlignment.CENTER);
|
|
|
+ CellStyle cellStyle = new CellStyle();
|
|
|
+ cellStyle.setDefaultParagraphStyle(paragraphStyle);
|
|
|
+ cellStyle.setBackgroundColor("F2F2F2");
|
|
|
+ rowStyle.setDefaultCellStyle(cellStyle);
|
|
|
+ return rowStyle;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
* 计算分数范围
|
|
|
*
|