Bläddra i källkod

测试word报告

wangliang 1 år sedan
förälder
incheckning
9c57a7bc8d

+ 4 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/report/word/CourseTargetTableBean3.java

@@ -24,7 +24,7 @@ public class CourseTargetTableBean3 implements Serializable {
     String content;
 
     @ApiModelProperty(name = "目标分值")
-    Double target = 0.0d;
+    BigDecimal target;
 
     @ApiModelProperty(name = "对应的课程目标")
     String courseTarget;
@@ -33,7 +33,7 @@ public class CourseTargetTableBean3 implements Serializable {
 
     }
 
-    public CourseTargetTableBean3(Integer num, String project, String content, Double target, String courseTarget) {
+    public CourseTargetTableBean3(Integer num, String project, String content, BigDecimal target, String courseTarget) {
         this.num = num;
         this.project = project;
         this.content = content;
@@ -65,11 +65,11 @@ public class CourseTargetTableBean3 implements Serializable {
         this.content = content;
     }
 
-    public Double getTarget() {
+    public BigDecimal getTarget() {
         return target;
     }
 
-    public void setTarget(Double target) {
+    public void setTarget(BigDecimal target) {
         this.target = target;
     }
 

+ 7 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/report/word/CourseTargetTableBean4.java

@@ -24,7 +24,7 @@ public class CourseTargetTableBean4 implements Serializable {
     String content;
 
     @ApiModelProperty(name = "目标分值")
-    Double target = 0.0d;
+    Double targetScore;
 
     @ApiModelProperty(name = "对应的课程目标")
     String courseTarget;
@@ -33,11 +33,11 @@ public class CourseTargetTableBean4 implements Serializable {
 
     }
 
-    public CourseTargetTableBean4(Integer num, String project, String content, Double target, String courseTarget) {
+    public CourseTargetTableBean4(Integer num, String project, String content, Double targetScore, String courseTarget) {
         this.num = num;
         this.project = project;
         this.content = content;
-        this.target = target;
+        this.targetScore = targetScore;
         this.courseTarget = courseTarget;
     }
 
@@ -65,12 +65,12 @@ public class CourseTargetTableBean4 implements Serializable {
         this.content = content;
     }
 
-    public Double getTarget() {
-        return target;
+    public Double getTargetScore() {
+        return targetScore;
     }
 
-    public void setTarget(Double target) {
-        this.target = target;
+    public void setTargetScore(Double targetScore) {
+        this.targetScore = targetScore;
     }
 
     public String getCourseTarget() {

+ 7 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/report/word/ExamStudentScoreBean.java

@@ -15,16 +15,16 @@ import java.math.BigDecimal;
 public class ExamStudentScoreBean implements Serializable {
 
     @ApiModelProperty(name = "作业分数")
-    Double score = 0.0d;
+    Double score;
 
     @ApiModelProperty(name = "课程目标考核要素的目标分")
-    Double targetAllAvgScore = 0.0d;
+    BigDecimal targetAllAvgScore;
 
     @ApiModelProperty(name = "课程目标考核要素的平均分")
-    Double allScore = 0.0d;
+    Double allScore;
 
     @ApiModelProperty(name = "各课程目标平均分")
-    Double avgAllScore = 0.0d;
+    Double avgAllScore;
 
     public ExamStudentScoreBean() {
 
@@ -34,7 +34,7 @@ public class ExamStudentScoreBean implements Serializable {
         this.score = score;
     }
 
-    public ExamStudentScoreBean(Double score, Double targetAllAvgScore, Double avgAllScore) {
+    public ExamStudentScoreBean(Double score, BigDecimal targetAllAvgScore, Double avgAllScore) {
         this.score = score;
         this.targetAllAvgScore = targetAllAvgScore;
         this.avgAllScore = avgAllScore;
@@ -48,11 +48,11 @@ public class ExamStudentScoreBean implements Serializable {
         this.score = score;
     }
 
-    public Double getTargetAllAvgScore() {
+    public BigDecimal getTargetAllAvgScore() {
         return targetAllAvgScore;
     }
 
-    public void setTargetAllAvgScore(Double targetAllAvgScore) {
+    public void setTargetAllAvgScore(BigDecimal targetAllAvgScore) {
         this.targetAllAvgScore = targetAllAvgScore;
     }
 

+ 228 - 170
distributed-print/src/main/java/com/qmth/distributed/print/api/TRBasicInfoController.java

@@ -152,192 +152,41 @@ public class TRBasicInfoController {
                              @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) throws IOException {
         TRBasicInfo trBasicInfo = trBasicInfoService.getOne(new QueryWrapper<TRBasicInfo>().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
         Objects.requireNonNull(trBasicInfo, "没有报告信息");
-        Objects.requireNonNull(trBasicInfo.getCourseEvaluationResultDetail(), "没有课程目标信息");
+        Objects.requireNonNull(trBasicInfo.getCourseEvaluationResult(), "没有课程目标信息");
+        Objects.requireNonNull(trBasicInfo.getCourseEvaluationResultDetail(), "没有课程考生信息");
 
+        //评价样本的基本信息
         String period = Objects.nonNull(trBasicInfo.getPeriod()) ? trBasicInfo.getPeriod() : null;
         String credit = Objects.nonNull(trBasicInfo.getCredit()) ? trBasicInfo.getCredit() : null;
-        if (Objects.nonNull(credit)) {
-            period = period + "/" + credit;
-        }
-        ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = Objects.nonNull(trBasicInfo.getCourseEvaluationResult()) ? JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class) : null;
+        period = Objects.nonNull(credit) ? period + "/" + credit : period;
+
+        ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class);
         CourseBasicBean courseBasicBean = new CourseBasicBean(trBasicInfo.getCourseName(),
-                trBasicInfo.getCourseCode(), null, trBasicInfo.getCourseType(), period, null, null, trBasicInfo.getDirector(), DateUtil.format(new Date(trBasicInfo.getCreateTime()), SystemConstant.DEFAULT_DATE_PATTERN), "测试:我们的目标是没有目标", Objects.nonNull(reportCourseEvaluationResultDto) && !CollectionUtils.isEmpty(reportCourseEvaluationResultDto.getTargetList()) ? reportCourseEvaluationResultDto.getTargetList().size() : null);
+                trBasicInfo.getCourseCode(), null, trBasicInfo.getCourseType(),
+                period, null, null, trBasicInfo.getDirector(),
+                DateUtil.format(new Date(trBasicInfo.getCreateTime()), SystemConstant.DEFAULT_DATE_PATTERN),
+                "测试:我们的目标是没有目标", reportCourseEvaluationResultDto.getTargetList().size());
 
-        CourseReportBean courseReportBean = new CourseReportBean(trBasicInfo.getOpenTime() + "《测试输出报告》", courseBasicBean);
+        CourseReportBean courseReportBean = new CourseReportBean(trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》", courseBasicBean);
 
         JSONObject jsonObject = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResultDetail());
         List<CourseTargetWordDto> courseTargetWordDtoList = JSONArray.parseArray(jsonObject.get("targetWordMap").toString(), CourseTargetWordDto.class);
         List<CourseTargetWebDto> courseTargetWebDtoList = JSONArray.parseArray(jsonObject.get("targetWebMap").toString(), CourseTargetWebDto.class);
 
-        //table1课程目标目标与毕业要求指标点的对应关系
-        RowRenderData header1 = Rows.of("课程目标", "毕业要求指标点").bgColor("F2F2F2").center().create();
-        Tables.TableBuilder tableBuilder1 = Tables.ofPercentWidth("100%");
-        tableBuilder1.addRow(header1);
-
+        //table1-课程目标目标与毕业要求指标点的对应关系
         List<String> header2_1List = new ArrayList<>(Arrays.asList("课程目标", "支撑毕业要求")), header2_2List = new ArrayList<>();
         header2_2List.addAll(header2_1List);
         header2_1List.add("考核/评价环节及目标分值");
+        courseReportBean.setCourseTargetTable1(this.buildTable1(courseTargetWordDtoList, header2_1List, header2_2List));
 
-        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("目标分值统计");
-
-        TableRenderData tableRenderData1 = tableBuilder1.left().create();
-        courseReportBean.setCourseTargetTable1(tableRenderData1);
-
-        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]);
-        }
-        TableRenderData tableRenderData2 = tableBuilder2.mergeRule(mergeCellRule2).left().create();
-//        TableRenderData tableRenderData2 = Tables.of(rowRenderData2).mergeRule(mergeCellRule2)
-//                .width(17f, new double[]{17 / 6, 22 / 6, 15 / 6, 15 / 6, 15 / 6, 15 / 6, 17 / 6})
-//                .left().create();
-        courseReportBean.setCourseTargetTable2(tableRenderData2);
-
-        //TODO 等待曹子轩接口table3-课程目标达成评价依据-平时作业目标分值
-        RowRenderData header3_1 = Rows.of("序号", "项目", "考核内容及要求", "目标分值", "对应的课程目标").bgColor("F2F2F2").center().create();
-        List<CourseTargetTableBean3> courseTargetTableBean3List = new ArrayList<>();
-        BigDecimal targetSum3 = new BigDecimal(0);
-        String tableFootTitle3 = "合计${sum}分,占课程总评成绩的30%";
-        for (int i = 0; i < 2; i++) {
-            CourseTargetTableBean3 courseTargetTableBean3 = new CourseTargetTableBean3((i + 1), "项目" + (i + 1), "内容" + (i + 1), new BigDecimal(i + 3).doubleValue(), "目标分值" + (i + 1));
-            targetSum3 = targetSum3.add(new BigDecimal(courseTargetTableBean3.getTarget()));
-            courseTargetTableBean3List.add(courseTargetTableBean3);
-        }
-        tableFootTitle3 = tableFootTitle3.replace("${sum}", targetSum3.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();
-
-//        TableRenderData tableRenderData3 = Tables.of(rowRenderData3).mergeRule(mergeCellRule3)
-//                .width(17f, new double[]{10 / 6, 15 / 6, 24 / 6, 15 / 6, 20 / 6}).left().create();
-        Tables.TableBuilder tableBuilder3 = Tables.ofPercentWidth("100%");
-        for (int i = 0; i < rowRenderData3.length; i++) {
-            tableBuilder3.addRow(rowRenderData3[i]);
-        }
-        TableRenderData tableRenderData3 = tableBuilder3.mergeRule(mergeCellRule3).left().create();
-        courseReportBean.setCourseTargetTable3(tableRenderData3);
-
-        //table4-课程目标达成评价依据-期末考试知识单元目标分值
-        RowRenderData header4_1 = Rows.of("序号", "考核项目", "考核内容所涵盖的知识单元", "目标分值", "对应的课程目标").bgColor("F2F2F2").center().create();
-        List<CourseTargetTableBean4> courseTargetTableBean4List = new ArrayList<>();
-        BigDecimal sum4 = new BigDecimal(0);
-        Integer seq4 = 0;
-        for (int i = 0; i < courseTargetWordDtoList.size(); i++) {
-            CourseTargetWordDto courseTargetWordDto = courseTargetWordDtoList.get(i);
-            List<DimensionDto> dimensionDtoList = courseTargetWordDto.getFinalScoreDto().getDimensionList();
-            for (DimensionDto dimensionDto : dimensionDtoList) {
-                sum4 = sum4.add(new BigDecimal(dimensionDto.getDimensionScore()));
-                seq4 = seq4 + 1;
-                CourseTargetTableBean4 courseTargetTableBean4 = new CourseTargetTableBean4(seq4, courseTargetWordDto.getGraduationRequirement(), dimensionDto.getDimensionName(), dimensionDto.getDimensionScore(), courseTargetWordDto.getTargetName());
-                courseTargetTableBean4List.add(courseTargetTableBean4);
-            }
-        }
-        String tableFootTitle4 = "合计${sum}分,占课程总评成绩的70%";
-        tableFootTitle4 = tableFootTitle4.replace("${sum}", sum4.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.getTarget().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;
+        //table2-课程目标达成评价依据
+        courseReportBean.setCourseTargetTable2(this.buildTable2(courseTargetWordDtoList, courseTargetWebDtoList, header2_1List, header2_2List));
 
-        // 表格合并,根据坐标
-        MergeCellRule mergeCellRule4 = MergeCellRule.builder().map(MergeCellRule.Grid.of(rowRenderData4.length - 1, 0), MergeCellRule.Grid.of(rowRenderData4.length - 1, 4)).
-                build();
+        //table3-课程课后作业考核/评价内容及目标分值
+        courseReportBean.setCourseTargetTable3(this.buildTable3(courseTargetWordDtoList));
 
-//        TableRenderData tableRenderData4 = Tables.of(rowRenderData3).mergeRule(mergeCellRule4)
-//                .width(17f, new double[]{10 / 6, 15 / 6, 24 / 6, 15 / 6, 20 / 6})
-//                .left().create();
-        Tables.TableBuilder tableBuilder4 = Tables.ofPercentWidth("100%");
-        for (int i = 0; i < rowRenderData4.length; i++) {
-            tableBuilder4.addRow(rowRenderData4[i]);
-        }
-        TableRenderData tableRenderData4 = tableBuilder4.mergeRule(mergeCellRule4).left().create();
-        courseReportBean.setCourseTargetTable4(tableRenderData4);
+        //table4-课程期末考试考核/评价内容及目标分值
+        courseReportBean.setCourseTargetTable4(this.buildTable4(courseTargetWordDtoList));
 
         //examstudent-课程目标达成评价依据-考生
 //        List<TRExamStudent> trExamStudentList = trExamStudentService.list(new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
@@ -586,4 +435,213 @@ public class TRBasicInfoController {
         rowStyle.setDefaultCellStyle(cellStyle);
         return rowStyle;
     }
+
+    /**
+     * 构建word动态表格1
+     *
+     * @param courseTargetWordDtoList
+     * @param header2_1List
+     * @param header2_2List
+     * @return
+     */
+    protected TableRenderData buildTable1(List<CourseTargetWordDto> courseTargetWordDtoList,
+                                          List<String> header2_1List,
+                                          List<String> header2_2List) {
+        //table1课程目标目标与毕业要求指标点的对应关系
+        RowRenderData header1 = Rows.of("课程目标", "毕业要求指标点").bgColor("F2F2F2").center().create();
+        Tables.TableBuilder tableBuilder1 = Tables.ofPercentWidth("100%");
+        tableBuilder1.addRow(header1);
+
+//        List<String> header2_1List = new ArrayList<>(Arrays.asList("课程目标", "支撑毕业要求")), header2_2List = new ArrayList<>();
+//        header2_2List.addAll(header2_1List);
+//        header2_1List.add("考核/评价环节及目标分值");
+
+        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
+     */
+    protected TableRenderData buildTable2(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
+     */
+    protected TableRenderData buildTable3(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 = 0;
+        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
+     */
+    protected TableRenderData buildTable4(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 = 0;
+        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();
+    }
 }