wangliang il y a 1 an
Parent
commit
5fe95cb68b

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

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

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

@@ -15,7 +15,7 @@ import java.math.BigDecimal;
 public class CourseTargetTableBean4 implements Serializable {
 
     @ApiModelProperty(name = "序号")
-    String num;
+    Integer num = 0;
 
     @ApiModelProperty(name = "考核项目")
     String project;
@@ -24,7 +24,7 @@ public class CourseTargetTableBean4 implements Serializable {
     String content;
 
     @ApiModelProperty(name = "目标分值")
-    BigDecimal target = new BigDecimal(0);
+    Double target = 0.0d;
 
     @ApiModelProperty(name = "对应的课程目标")
     String courseTarget;
@@ -33,7 +33,7 @@ public class CourseTargetTableBean4 implements Serializable {
 
     }
 
-    public CourseTargetTableBean4(String num, String project, String content, BigDecimal target, String courseTarget) {
+    public CourseTargetTableBean4(Integer num, String project, String content, Double target, String courseTarget) {
         this.num = num;
         this.project = project;
         this.content = content;
@@ -41,11 +41,11 @@ public class CourseTargetTableBean4 implements Serializable {
         this.courseTarget = courseTarget;
     }
 
-    public String getNum() {
+    public Integer getNum() {
         return num;
     }
 
-    public void setNum(String num) {
+    public void setNum(Integer num) {
         this.num = num;
     }
 
@@ -65,11 +65,11 @@ public class CourseTargetTableBean4 implements Serializable {
         this.content = content;
     }
 
-    public BigDecimal getTarget() {
+    public Double getTarget() {
         return target;
     }
 
-    public void setTarget(BigDecimal target) {
+    public void setTarget(Double target) {
         this.target = target;
     }
 

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

@@ -15,60 +15,60 @@ import java.math.BigDecimal;
 public class ExamStudentScoreBean implements Serializable {
 
     @ApiModelProperty(name = "作业分数")
-    BigDecimal score = new BigDecimal(0);
+    Double score = 0.0d;
 
     @ApiModelProperty(name = "课程目标考核要素的目标分")
-    BigDecimal targetAllAvgScore = new BigDecimal(2);
+    Double targetAllAvgScore = 0.0d;
 
     @ApiModelProperty(name = "课程目标考核要素的平均分")
-    BigDecimal allScore = new BigDecimal(0);
+    Double allScore = 0.0d;
 
     @ApiModelProperty(name = "各课程目标平均分")
-    BigDecimal avgAllScore = new BigDecimal(0);
+    Double avgAllScore = 0.0d;
 
     public ExamStudentScoreBean() {
 
     }
 
-    public ExamStudentScoreBean(BigDecimal score) {
+    public ExamStudentScoreBean(Double score) {
         this.score = score;
     }
 
-    public ExamStudentScoreBean(BigDecimal score, BigDecimal targetAllAvgScore, BigDecimal avgAllScore) {
+    public ExamStudentScoreBean(Double score, Double targetAllAvgScore, Double avgAllScore) {
         this.score = score;
         this.targetAllAvgScore = targetAllAvgScore;
         this.avgAllScore = avgAllScore;
     }
 
-    public BigDecimal getAllScore() {
-        return allScore;
-    }
-
-    public void setAllScore(BigDecimal allScore) {
-        this.allScore = allScore;
-    }
-
-    public BigDecimal getScore() {
+    public Double getScore() {
         return score;
     }
 
-    public void setScore(BigDecimal score) {
+    public void setScore(Double score) {
         this.score = score;
     }
 
-    public BigDecimal getTargetAllAvgScore() {
+    public Double getTargetAllAvgScore() {
         return targetAllAvgScore;
     }
 
-    public void setTargetAllAvgScore(BigDecimal targetAllAvgScore) {
+    public void setTargetAllAvgScore(Double targetAllAvgScore) {
         this.targetAllAvgScore = targetAllAvgScore;
     }
 
-    public BigDecimal getAvgAllScore() {
+    public Double getAllScore() {
+        return allScore;
+    }
+
+    public void setAllScore(Double allScore) {
+        this.allScore = allScore;
+    }
+
+    public Double getAvgAllScore() {
         return avgAllScore;
     }
 
-    public void setAvgAllScore(BigDecimal avgAllScore) {
+    public void setAvgAllScore(Double avgAllScore) {
         this.avgAllScore = avgAllScore;
     }
 }

+ 31 - 32
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/report/word/ExamStudentTableBean.java

@@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
 import org.springframework.util.LinkedMultiValueMap;
 
 import java.io.Serializable;
-import java.math.BigDecimal;
 import java.util.Map;
 
 /**
@@ -17,88 +16,88 @@ import java.util.Map;
 public class ExamStudentTableBean implements Serializable {
 
     @ApiModelProperty(name = "序号")
-    String num;
+    Integer num = 0;
 
     @ApiModelProperty(name = "学号")
-    String examNumber;
+    String studentCode;
 
     @ApiModelProperty(name = "姓名")
     String name;
 
     @ApiModelProperty(name = "行政班级")
-    String clazz;
+    String administrativeClass;
 
     @ApiModelProperty(name = "目标成绩")
-    LinkedMultiValueMap<String, Map<String, ExamStudentScoreBean>> map;
+    LinkedMultiValueMap<Long, Map<String, ExamStudentScoreBean>> map;
 
     @ApiModelProperty(name = "综合成绩")
-    BigDecimal sumScore = new BigDecimal(0);
+    Double sumScore = 0.0d;
 
     public ExamStudentTableBean() {
 
     }
 
-    public ExamStudentTableBean(String num, String examNumber, String name, String clazz) {
+    public ExamStudentTableBean(Integer num, String studentCode, String name, String administrativeClass) {
         this.num = num;
-        this.examNumber = examNumber;
+        this.studentCode = studentCode;
         this.name = name;
-        this.clazz = clazz;
+        this.administrativeClass = administrativeClass;
     }
 
-    public ExamStudentTableBean(String num, String examNumber, String name, String clazz, LinkedMultiValueMap<String, Map<String, ExamStudentScoreBean>> map, BigDecimal sumScore) {
+    public ExamStudentTableBean(Integer num, String studentCode, String name, String administrativeClass, LinkedMultiValueMap<Long, Map<String, ExamStudentScoreBean>> map, Double sumScore) {
         this.num = num;
-        this.examNumber = examNumber;
+        this.studentCode = studentCode;
         this.name = name;
-        this.clazz = clazz;
+        this.administrativeClass = administrativeClass;
         this.map = map;
         this.sumScore = sumScore;
     }
 
-    public LinkedMultiValueMap<String, Map<String, ExamStudentScoreBean>> getMap() {
+    public LinkedMultiValueMap<Long, Map<String, ExamStudentScoreBean>> getMap() {
         return map;
     }
 
-    public void setMap(LinkedMultiValueMap<String, Map<String, ExamStudentScoreBean>> map) {
+    public void setMap(LinkedMultiValueMap<Long, Map<String, ExamStudentScoreBean>> map) {
         this.map = map;
     }
 
-    public String getNum() {
-        return num;
+    public String getName() {
+        return name;
     }
 
-    public void setNum(String num) {
-        this.num = num;
+    public void setName(String name) {
+        this.name = name;
     }
 
-    public String getExamNumber() {
-        return examNumber;
+    public Integer getNum() {
+        return num;
     }
 
-    public void setExamNumber(String examNumber) {
-        this.examNumber = examNumber;
+    public void setNum(Integer num) {
+        this.num = num;
     }
 
-    public String getName() {
-        return name;
+    public String getStudentCode() {
+        return studentCode;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
     }
 
-    public String getClazz() {
-        return clazz;
+    public String getAdministrativeClass() {
+        return administrativeClass;
     }
 
-    public void setClazz(String clazz) {
-        this.clazz = clazz;
+    public void setAdministrativeClass(String administrativeClass) {
+        this.administrativeClass = administrativeClass;
     }
 
-    public BigDecimal getSumScore() {
+    public Double getSumScore() {
         return sumScore;
     }
 
-    public void setSumScore(BigDecimal sumScore) {
+    public void setSumScore(Double sumScore) {
         this.sumScore = sumScore;
     }
 }

+ 235 - 175
distributed-print/src/main/java/com/qmth/distributed/print/api/TRBasicInfoController.java

@@ -18,6 +18,7 @@ import com.qmth.distributed.print.business.bean.result.report.word.*;
 import com.qmth.distributed.print.business.entity.TRBasicInfo;
 import com.qmth.distributed.print.business.entity.TRExamStudent;
 import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.distributed.print.business.service.TCFinalScoreService;
 import com.qmth.distributed.print.business.service.TRBasicInfoService;
 import com.qmth.distributed.print.business.service.TRExamStudentService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
@@ -74,6 +75,9 @@ public class TRBasicInfoController {
     @Resource
     TRExamStudentService trExamStudentService;
 
+    @Resource
+    TCFinalScoreService tcFinalScoreService;
+
     @ApiOperation(value = "报告管理列表")
     @RequestMapping(value = "/report/list", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
@@ -168,21 +172,22 @@ public class TRBasicInfoController {
 
         CourseReportBean courseReportBean = new CourseReportBean(trBasicInfo.getOpenTime() + "《测试输出报告》", courseBasicBean);
 
+        //targetMap
         List<ReportCourseTargetDto> reportCourseTargetDtoList = JSONArray.parseArray(trBasicInfo.getCourseEvaluationResultDetail(), ReportCourseTargetDto.class);
         Map<Long, ReportCourseTargetDto> courseTargetValueDtoMap = reportCourseTargetDtoList.stream().collect(Collectors.toMap(ReportCourseTargetDto::getTargetId, Function.identity(), (dto1, dto2) -> dto1));
 
-        //table1
+        //table1课程目标目标与毕业要求指标点的对应关系
         RowRenderData header1 = Rows.of("课程目标", "毕业要求指标点").bgColor("F2F2F2").center().create();
         Tables.TableBuilder tableBuilder1 = Tables.ofPercentWidth("100%");
         tableBuilder1.addRow(header1);
 
-        Map<String, Long> courseTargetMap = new LinkedHashMap<>();
         List<String> header2_1List = new ArrayList<>(Arrays.asList("课程目标", "支撑毕业要求")), header2_2List = new ArrayList<>();
         header2_2List.addAll(header2_1List);
         header2_1List.add("考核/评价环节及目标分值");
 
-        courseTargetValueDtoMap.forEach((k, v) -> {
-            CourseTargetValueDto courseTargetValueDto = v.getCourseTargetValueDto();
+        for (int i = 0; i < reportCourseTargetDtoList.size(); i++) {
+            ReportCourseTargetDto reportCourseTargetDto = reportCourseTargetDtoList.get(i);
+            CourseTargetValueDto courseTargetValueDto = reportCourseTargetDto.getCourseTargetValueDto();
             Map<String, BigDecimal> usualScoreWeightMap = courseTargetValueDto.getUsualScoreWeight();
             usualScoreWeightMap.forEach((k1, v1) -> {
                 header2_1List.add("");
@@ -192,8 +197,7 @@ public class TRBasicInfoController {
             CourseTargetTableBean1 courseTargetTableBean1 = new CourseTargetTableBean1(courseTargetValueDto.getTargetName(), courseTargetValueDto.getGraduationRequirement());
             RowRenderData row = Rows.of(courseTargetTableBean1.getName(), courseTargetTableBean1.getTarget()).rowStyle(this.getRowStyle()).create();
             tableBuilder1.addRow(row);
-            courseTargetMap.put(courseTargetTableBean1.getName(), k);
-        });
+        }
         header2_1List.add("目标分值统计");
         header2_2List.add("期末考试");
         header2_2List.add("目标分值统计");
@@ -201,7 +205,7 @@ public class TRBasicInfoController {
         TableRenderData tableRenderData1 = tableBuilder1.left().create();
         courseReportBean.setCourseTargetTable1(tableRenderData1);
 
-        //TODO 等待曹子轩接口table2
+        //TODO 等待曹子轩接口table2-课程目标达成评价依据-课程目标毕业要求
         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();
 
@@ -212,8 +216,9 @@ public class TRBasicInfoController {
         AtomicReference<BigDecimal> examSum = new AtomicReference<>(new BigDecimal(0));
         AtomicReference<BigDecimal> targetSum2 = new AtomicReference<>(new BigDecimal(0));
         AtomicInteger atomicReference = new AtomicInteger(0);
-        courseTargetValueDtoMap.forEach((k, v) -> {
-            CourseTargetValueDto courseTargetValueDto = v.getCourseTargetValueDto();
+        for (int i = 0; i < reportCourseTargetDtoList.size(); i++) {
+            ReportCourseTargetDto reportCourseTargetDto = reportCourseTargetDtoList.get(i);
+            CourseTargetValueDto courseTargetValueDto = reportCourseTargetDto.getCourseTargetValueDto();
             CourseTargetTableBean2 courseTargetTableBean2 = new CourseTargetTableBean2(courseTargetValueDto.getTargetName(), courseTargetValueDto.getGraduationRequirement(), new BigDecimal(atomicReference.get() + 2), new BigDecimal(atomicReference.get() + 3), new BigDecimal(atomicReference.get() + 4), new BigDecimal(atomicReference.get() + 5), new BigDecimal(atomicReference.get() + 10));
             bigDecimalExpressionSum.set(bigDecimalExpressionSum.get().add(courseTargetTableBean2.getExpression()));
             homeworkSum.set(homeworkSum.get().add(courseTargetTableBean2.getHomework()));
@@ -222,7 +227,7 @@ public class TRBasicInfoController {
             targetSum2.set(targetSum2.get().add(courseTargetTableBean2.getTargetSum()));
             courseTargetTableBean2List.add(courseTargetTableBean2);
             atomicReference.decrementAndGet();
-        });
+        }
 
         RowRenderData[] rowRenderData2 = new RowRenderData[courseTargetTableBean2List.size() + 3];
         for (int i = 0; i < courseTargetTableBean2List.size(); i++) {
@@ -254,14 +259,14 @@ public class TRBasicInfoController {
 //                .left().create();
         courseReportBean.setCourseTargetTable2(tableRenderData2);
 
-        //TODO 等待曹子轩接口table3
+        //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), "目标分值" + (i + 1));
-            targetSum3 = targetSum3.add(courseTargetTableBean3.getTarget());
+            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());
@@ -269,7 +274,7 @@ public class TRBasicInfoController {
         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(), courseTargetTableBean3.getProject(), courseTargetTableBean3.getContent(), courseTargetTableBean3.getTarget().toString(), courseTargetTableBean3.getCourseTarget()).rowStyle(this.getRowStyle()).create();
+            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();
@@ -288,26 +293,33 @@ public class TRBasicInfoController {
         TableRenderData tableRenderData3 = tableBuilder3.mergeRule(mergeCellRule3).left().create();
         courseReportBean.setCourseTargetTable3(tableRenderData3);
 
-        //table4
+        //table4-课程目标达成评价依据-期末考试知识单元目标分值
         RowRenderData header4_1 = Rows.of("序号", "考核项目", "考核内容所涵盖的知识单元", "目标分值", "对应的课程目标").bgColor("F2F2F2").center().create();
         List<CourseTargetTableBean4> courseTargetTableBean4List = new ArrayList<>();
-        BigDecimal targetSum4 = new BigDecimal(0);
-        String tableFootTitle4 = "合计${sum}分,占课程总评成绩的70%";
-        for (int i = 0; i < 2; i++) {
-            CourseTargetTableBean4 courseTargetTableBean4 = new CourseTargetTableBean4("" + (i + 1), "考核项目" + (i + 1), "考核内容" + (i + 1), new BigDecimal(i + 3), "考核目标分值" + (i + 1));
-            targetSum4 = targetSum4.add(courseTargetTableBean4.getTarget());
-            courseTargetTableBean4List.add(courseTargetTableBean4);
+        BigDecimal sum4 = new BigDecimal(0);
+        Integer seq4 = 0;
+        for (int i = 0; i < reportCourseTargetDtoList.size(); i++) {
+            ReportCourseTargetDto reportCourseTargetDto = reportCourseTargetDtoList.get(i);
+            CourseTargetValueDto courseTargetValueDto = reportCourseTargetDto.getCourseTargetValueDto();
+            List<DimensionDto> dimensionDtoList = courseTargetValueDto.getDimensionList();
+            for (DimensionDto dimensionDto : dimensionDtoList) {
+                sum4 = sum4.add(new BigDecimal(dimensionDto.getDimensionScore()));
+                seq4 = seq4 + 1;
+                CourseTargetTableBean4 courseTargetTableBean4 = new CourseTargetTableBean4(seq4, courseTargetValueDto.getGraduationRequirement(), dimensionDto.getDimensionName(), dimensionDto.getDimensionScore(), courseTargetValueDto.getTargetName());
+                courseTargetTableBean4List.add(courseTargetTableBean4);
+            }
         }
-        tableFootTitle4 = tableFootTitle4.replace("${sum}", targetSum4.toString());
+        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);
-            rowRenderData3[i + 1] = Rows.of(courseTargetTableBean4.getNum(), courseTargetTableBean4.getProject(), courseTargetTableBean4.getContent(), courseTargetTableBean4.getTarget().toString(), courseTargetTableBean4.getCourseTarget()).rowStyle(this.getRowStyle()).create();
+            rowRenderData4[i + 1] = Rows.of(courseTargetTableBean4.getNum().toString(), courseTargetTableBean4.getProject(), courseTargetTableBean4.getContent(), courseTargetTableBean4.getTarget().toString(), courseTargetTableBean4.getCourseTarget()).rowStyle(this.getRowStyle()).create();
         }
-        rowRenderData3[0] = header4_1;
+        rowRenderData4[0] = header4_1;
         RowRenderData header4_foot = Rows.of(tableFootTitle4, "", "", "", "").center().create();
-        rowRenderData3[rowRenderData4.length - 1] = header4_foot;
+        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)).
@@ -318,177 +330,225 @@ public class TRBasicInfoController {
 //                .left().create();
         Tables.TableBuilder tableBuilder4 = Tables.ofPercentWidth("100%");
         for (int i = 0; i < rowRenderData4.length; i++) {
-            tableBuilder4.addRow(rowRenderData3[i]);
+            tableBuilder4.addRow(rowRenderData4[i]);
         }
         TableRenderData tableRenderData4 = tableBuilder4.mergeRule(mergeCellRule4).left().create();
         courseReportBean.setCourseTargetTable4(tableRenderData4);
 
-        //examstudent
-        List<CellRenderData> examStudent_cells_1 = new ArrayList<>(), examStudent_cells_2 = new ArrayList<>(), examStudent_cells_3 = new ArrayList<>(), examStudent_cells_4 = new ArrayList<>(), examStudent_cells_5 = new ArrayList<>();
-        examStudent_cells_1.add(Cells.of("序号").center().create());
-        examStudent_cells_1.add(Cells.of("学号").center().create());
-        examStudent_cells_1.add(Cells.of("姓名").center().create());
-        examStudent_cells_1.add(Cells.of("行政班级").center().create());
-        examStudent_cells_2.addAll(examStudent_cells_1);
-
-        examStudent_cells_3.add(Cells.of("课程目标考核要素的目标分").center().create());
-        examStudent_cells_3.add(Cells.of("").center().create());
-        examStudent_cells_3.add(Cells.of("").center().create());
-        examStudent_cells_3.add(Cells.of("").center().create());
-
-        examStudent_cells_4.add(Cells.of("课程目标考核要素的平均分").center().create());
-        examStudent_cells_4.add(Cells.of("").center().create());
-        examStudent_cells_4.add(Cells.of("").center().create());
-        examStudent_cells_4.add(Cells.of("").center().create());
-
-        examStudent_cells_5.add(Cells.of("各课程目标平均分").center().create());
-        examStudent_cells_5.add(Cells.of("").center().create());
-        examStudent_cells_5.add(Cells.of("").center().create());
-        examStudent_cells_5.add(Cells.of("").center().create());
-
-        List<ExamStudentTableBean> examStudentTableBeanList = new ArrayList<>();
-        int randomHomework = new Random().nextInt(20) + 1;//随机作业
-//        int randomHomework = 10;
-        int targetSize = courseTargetMap.size();
-        for (int i = 0; i < 20; i++) {
-            LinkedMultiValueMap<String, Map<String, ExamStudentScoreBean>> scoreMap = new LinkedMultiValueMap<>();
-            int finalI = i;
-            courseTargetMap.forEach((k, v) -> {
-                if (finalI == 0) {
-                    examStudent_cells_1.add(Cells.of("目标" + v.toString()).center().create());
-                }
-                for (int y = 0; y < randomHomework; y++) {
-                    if (finalI == 0) {
-                        examStudent_cells_1.add(Cells.of("").center().create());
-                        examStudent_cells_2.add(Cells.of("作业" + v + "_" + (y + 1)).center().create());
+        //examstudent-课程目标达成评价依据-考生
+        List<TRExamStudent> trExamStudentList = trExamStudentService.list(new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
+        if (!CollectionUtils.isEmpty(trExamStudentList)) {
+//            List<FinalScoreResult> finalScoreResultList = tcFinalScoreService.examStudentOverview(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber());//考生成绩
+//            Map<String, FinalScoreResult> finalScoreResultMap = finalScoreResultList.stream().collect(Collectors.toMap(FinalScoreResult::getStudentCode, Function.identity(), (dto1, dto2) -> dto1));
+
+            List<CellRenderData> examStudent_cells_1 = new ArrayList<>(), examStudent_cells_2 = new ArrayList<>(), examStudent_cells_3 = new ArrayList<>(), examStudent_cells_4 = new ArrayList<>(), examStudent_cells_5 = new ArrayList<>();
+            examStudent_cells_1.add(Cells.of("序号").center().create());
+            examStudent_cells_1.add(Cells.of("学号").center().create());
+            examStudent_cells_1.add(Cells.of("姓名").center().create());
+            examStudent_cells_1.add(Cells.of("行政班级").center().create());
+            examStudent_cells_2.addAll(examStudent_cells_1);
+
+            examStudent_cells_3.add(Cells.of("课程目标考核要素的目标分").center().create());
+            examStudent_cells_3.add(Cells.of("").center().create());
+            examStudent_cells_3.add(Cells.of("").center().create());
+            examStudent_cells_3.add(Cells.of("").center().create());
+
+            examStudent_cells_4.add(Cells.of("课程目标考核要素的平均分").center().create());
+            examStudent_cells_4.add(Cells.of("").center().create());
+            examStudent_cells_4.add(Cells.of("").center().create());
+            examStudent_cells_4.add(Cells.of("").center().create());
+
+            examStudent_cells_5.add(Cells.of("各课程目标平均分").center().create());
+            examStudent_cells_5.add(Cells.of("").center().create());
+            examStudent_cells_5.add(Cells.of("").center().create());
+            examStudent_cells_5.add(Cells.of("").center().create());
+
+            List<ExamStudentTableBean> examStudentTableBeanList = new ArrayList<>();
+            int seq5 = 0;
+//            AtomicInteger usualScoreSize = new AtomicInteger(1);
+            Map<Long, Integer> targetUsualScoreSizeMap = new HashMap<>();
+            trExamStudentList.remove(trExamStudentList.size() - 1);
+            TRExamStudent trExamStudentTemp = trExamStudentList.get(0);
+
+            //首行
+            if (Objects.nonNull(trExamStudentTemp.getResultDetail())) {
+                List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudentTemp.getResultDetail(), ReportExamStudentTargetDto.class);
+                for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
+                    examStudent_cells_1.add(Cells.of(reportExamStudentTargetDto.getTargetName()).center().create());
+                    ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = reportExamStudentTargetDto.getUsualScore();
+                    //平常作业
+                    if (Objects.nonNull(reportExamStudentUsualScoreDto) && !CollectionUtils.isEmpty(reportExamStudentUsualScoreDto.getScoreList())) {
+                        List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = reportExamStudentUsualScoreDto.getScoreList();
+                        for (ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto : reportExamStudentUsualScoreObjDtoList) {
+                            if (!targetUsualScoreSizeMap.containsKey(reportExamStudentTargetDto.getTargetId())) {
+                                targetUsualScoreSizeMap.put(reportExamStudentTargetDto.getTargetId(), 1);
+                            } else {
+                                Integer size = targetUsualScoreSizeMap.get(reportExamStudentTargetDto.getTargetId());
+                                targetUsualScoreSizeMap.put(reportExamStudentTargetDto.getTargetId(), size++);
+                            }
+                            examStudent_cells_1.add(Cells.of("").center().create());
+                            examStudent_cells_2.add(Cells.of(reportExamStudentUsualScoreObjDto.getName()).center().create());
+                        }
+                    }
+                    //期末考试
+                    ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = reportExamStudentTargetDto.getFinalScore();
+                    if (Objects.nonNull(reportExamStudentFinalScoreDto) && !CollectionUtils.isEmpty(reportExamStudentFinalScoreDto.getDimensionList())) {
+                        examStudent_cells_2.add(Cells.of("期末考试").center().create());
                     }
-                    scoreMap.add(k, Collections.singletonMap("作业" + v + "_" + (y + 1), new ExamStudentScoreBean(new BigDecimal(new Random().nextInt(100) + 1))));
-                }
-                scoreMap.add(k, Collections.singletonMap("期末考试", new ExamStudentScoreBean(new BigDecimal(new Random().nextInt(100) + 1))));
-                if (finalI == 0) {
-                    examStudent_cells_2.add(Cells.of("期末考试").center().create());
                 }
-            });
-            if (finalI == 0) {
                 examStudent_cells_1.add(Cells.of("综合成绩").center().create());
                 examStudent_cells_2.add(Cells.of("综合成绩").center().create());
             }
-            examStudentTableBeanList.add(new ExamStudentTableBean(i + 1 + "", "2023000" + (i + 1), "测试考生" + (i + 1), "测试班级", scoreMap, new BigDecimal(new Random().nextInt(100) + 1)));
-        }
 
-        String title = "2023级启明大学";
-        String sumTitle = "学生共${sum}名";
-        sumTitle = sumTitle.replace("${sum}", examStudentTableBeanList.size() + "");
-
-        courseReportBean.setExamStudentTitle1(title + sumTitle);
-        courseReportBean.setExamStudentTitle2(title + "《" + courseReportBean.getCourseBasicBean().getCourseName() + "》");
-
-        RowRenderData[] rowRenderDataExamStudent = new RowRenderData[examStudentTableBeanList.size() + 5];
-
-        RowRenderData examStudent_header_1 = new RowRenderData();
-        examStudent_header_1.setCells(examStudent_cells_1);
-        examStudent_header_1.setRowStyle(this.getHeadRowStyle());
-
-        RowRenderData examStudent_header_2 = new RowRenderData();
-        examStudent_header_2.setCells(examStudent_cells_2);
-        examStudent_header_2.setRowStyle(this.getHeadRowStyle());
-
-        for (int i = 0; i < examStudentTableBeanList.size(); i++) {
-            ExamStudentTableBean e = examStudentTableBeanList.get(i);
-            RowRenderData examStudent_row = new RowRenderData();
-            List<CellRenderData> examStudent_cells = new ArrayList<>();
-            examStudent_cells.add(Cells.of(e.getNum()).create());
-            examStudent_cells.add(Cells.of(e.getExamNumber()).create());
-            examStudent_cells.add(Cells.of(e.getName()).create());
-            examStudent_cells.add(Cells.of(e.getClazz()).create());
-
-            String key = null;
-            LinkedMultiValueMap<String, Map<String, ExamStudentScoreBean>> map = e.getMap();
-            for (Map.Entry<String, List<Map<String, ExamStudentScoreBean>>> entry : map.entrySet()) {
-                List<Map<String, ExamStudentScoreBean>> list = entry.getValue();
-                BigDecimal courseSumAvg = new BigDecimal(0);
-                for (int y = 0; y < list.size(); y++) {
-                    Map<String, ExamStudentScoreBean> m = list.get(y);
-                    for (Map.Entry<String, ExamStudentScoreBean> entry1 : m.entrySet()) {
-                        courseSumAvg = courseSumAvg.add(entry1.getValue().getScore());
-                        entry1.getValue().setAllScore(new BigDecimal(new Random().nextInt(10) + 1));
-                        key = entry1.getKey();
-                        examStudent_cells.add(Cells.of(entry1.getValue().getScore().toString()).create());
-                    }
-                    if (y == list.size() - 1) {
-                        courseSumAvg = courseSumAvg.divide(new BigDecimal(list.size()), 2, BigDecimal.ROUND_HALF_UP)
-                                .setScale(2, BigDecimal.ROUND_HALF_UP);
-                        list.get(y).get(key).setAvgAllScore(courseSumAvg);
+            for (int i = 0; i < trExamStudentList.size(); i++) {
+                TRExamStudent trExamStudent = trExamStudentList.get(i);
+                LinkedMultiValueMap<Long, Map<String, ExamStudentScoreBean>> scoreMap = new LinkedMultiValueMap<>();
+                if (Objects.nonNull(trExamStudent.getResultDetail())) {
+                    List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudent.getResultDetail(), ReportExamStudentTargetDto.class);
+                    for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
+                        if (Objects.nonNull(reportExamStudentTargetDto)) {
+                            ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = reportExamStudentTargetDto.getUsualScore();
+                            //平常作业
+                            if (Objects.nonNull(reportExamStudentUsualScoreDto) && !CollectionUtils.isEmpty(reportExamStudentUsualScoreDto.getScoreList())) {
+                                List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = reportExamStudentUsualScoreDto.getScoreList();
+                                for (ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto : reportExamStudentUsualScoreObjDtoList) {
+                                    scoreMap.add(reportExamStudentTargetDto.getTargetId(), Collections.singletonMap(reportExamStudentUsualScoreObjDto.getName(), new ExamStudentScoreBean(reportExamStudentUsualScoreObjDto.getScore())));
+                                }
+                            }
+                            //期末考试
+                            ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = reportExamStudentTargetDto.getFinalScore();
+                            if (Objects.nonNull(reportExamStudentFinalScoreDto) && !CollectionUtils.isEmpty(reportExamStudentFinalScoreDto.getDimensionList())) {
+                                Double sumScore = reportExamStudentFinalScoreDto.getDimensionList().stream().mapToDouble(DimensionDto::getDimensionScore).sum();
+                                scoreMap.add(reportExamStudentTargetDto.getTargetId(), Collections.singletonMap("期末考试", new ExamStudentScoreBean(sumScore)));
+                            }
+                        }
                     }
+                    seq5 = seq5 + 1;
+                    examStudentTableBeanList.add(new ExamStudentTableBean(seq5, trExamStudent.getStudentCode(), trExamStudent.getName(), trExamStudent.getAdministrativeClass(), scoreMap, 0.0d));
                 }
             }
-            if (i == examStudentTableBeanList.size() - 1) {
-                LinkedMultiValueMap<String, Map<String, ExamStudentScoreBean>> map1 = e.getMap();
-                for (Map.Entry<String, List<Map<String, ExamStudentScoreBean>>> entry1 : map1.entrySet()) {
-                    List<Map<String, ExamStudentScoreBean>> list1 = entry1.getValue();
-                    for (int k = 0; k < list1.size(); k++) {
-                        Map<String, ExamStudentScoreBean> m = list1.get(k);
-                        for (Map.Entry<String, ExamStudentScoreBean> entry2 : m.entrySet()) {
-                            examStudent_cells_3.add(Cells.of(entry2.getValue().getTargetAllAvgScore().toString()).create());
-                            examStudent_cells_4.add(Cells.of(entry2.getValue().getAllScore().toString()).create());
+
+            String title = trBasicInfo.getTeachingObject();
+            String sumTitle = "学生共${sum}名";
+            sumTitle = sumTitle.replace("${sum}", trExamStudentList.size() + "");
+
+            courseReportBean.setExamStudentTitle1(title + sumTitle);
+            courseReportBean.setExamStudentTitle2(title + "《" + courseReportBean.getCourseBasicBean().getCourseName() + "》");
+
+            RowRenderData[] rowRenderDataExamStudent = new RowRenderData[trExamStudentList.size() + 5];
+
+            RowRenderData examStudent_header_1 = new RowRenderData();
+            examStudent_header_1.setCells(examStudent_cells_1);
+            examStudent_header_1.setRowStyle(this.getHeadRowStyle());
+
+            RowRenderData examStudent_header_2 = new RowRenderData();
+            examStudent_header_2.setCells(examStudent_cells_2);
+            examStudent_header_2.setRowStyle(this.getHeadRowStyle());
+
+            for (int i = 0; i < examStudentTableBeanList.size(); i++) {
+                ExamStudentTableBean e = examStudentTableBeanList.get(i);
+                RowRenderData examStudent_row = new RowRenderData();
+                List<CellRenderData> examStudent_cells = new ArrayList<>();
+                examStudent_cells.add(Cells.of(e.getNum().toString()).create());
+                examStudent_cells.add(Cells.of(e.getStudentCode()).create());
+                examStudent_cells.add(Cells.of(e.getName()).create());
+                examStudent_cells.add(Cells.of(e.getAdministrativeClass()).create());
+
+                String key = null;
+                LinkedMultiValueMap<Long, Map<String, ExamStudentScoreBean>> map = e.getMap();
+                for (Map.Entry<Long, List<Map<String, ExamStudentScoreBean>>> entry : map.entrySet()) {
+                    List<Map<String, ExamStudentScoreBean>> list = entry.getValue();
+                    BigDecimal courseSumAvg = new BigDecimal(0);
+                    for (int y = 0; y < list.size(); y++) {
+                        Map<String, ExamStudentScoreBean> m = list.get(y);
+                        for (Map.Entry<String, ExamStudentScoreBean> entry1 : m.entrySet()) {
+                            courseSumAvg = courseSumAvg.add(new BigDecimal(entry1.getValue().getScore()));
+                            entry1.getValue().setAllScore(new BigDecimal(new Random().nextInt(10) + 1).doubleValue());
+                            key = entry1.getKey();
+                            examStudent_cells.add(Cells.of(entry1.getValue().getScore().toString()).create());
+                        }
+                        if (y == list.size() - 1) {
+                            courseSumAvg = courseSumAvg.divide(new BigDecimal(list.size()), 2, BigDecimal.ROUND_HALF_UP)
+                                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            list.get(y).get(key).setAvgAllScore(courseSumAvg.doubleValue());
                         }
                     }
-                    examStudent_cells_5.add(Cells.of(list1.get(list1.size() - 1).get(key).getAvgAllScore().toString()).create());
-                    for (int k = 1; k < list1.size(); k++) {
-                        examStudent_cells_5.add(Cells.of("").create());
+                }
+                if (i == examStudentTableBeanList.size() - 1) {
+                    LinkedMultiValueMap<Long, Map<String, ExamStudentScoreBean>> map1 = e.getMap();
+                    for (Map.Entry<Long, List<Map<String, ExamStudentScoreBean>>> entry1 : map1.entrySet()) {
+                        List<Map<String, ExamStudentScoreBean>> list1 = entry1.getValue();
+                        for (int k = 0; k < list1.size(); k++) {
+                            Map<String, ExamStudentScoreBean> m = list1.get(k);
+                            for (Map.Entry<String, ExamStudentScoreBean> entry2 : m.entrySet()) {
+                                examStudent_cells_3.add(Cells.of(entry2.getValue().getTargetAllAvgScore().toString()).create());
+                                examStudent_cells_4.add(Cells.of(entry2.getValue().getAllScore().toString()).create());
+                            }
+                        }
+                        examStudent_cells_5.add(Cells.of(list1.get(list1.size() - 1).get(key).getAvgAllScore().toString()).create());
+                        for (int k = 1; k < list1.size(); k++) {
+                            examStudent_cells_5.add(Cells.of("").create());
+                        }
                     }
+                    examStudent_cells_3.add(Cells.of(e.getSumScore().toString()).create());
+                    examStudent_cells_4.add(Cells.of(e.getSumScore().toString()).create());
+                    examStudent_cells_3.add(Cells.of("").create());
+                    examStudent_cells_4.add(Cells.of("").create());
+                    examStudent_cells_5.add(Cells.of("").create());
                 }
-                examStudent_cells_3.add(Cells.of(e.getSumScore().toString()).create());
-                examStudent_cells_4.add(Cells.of(e.getSumScore().toString()).create());
-                examStudent_cells_5.add(Cells.of("").create());
+                examStudent_cells.add(Cells.of(e.getSumScore().toString()).create());
+                examStudent_cells.add(Cells.of("").create());
+                examStudent_row.setCells(examStudent_cells);
+                examStudent_row.setRowStyle(this.getRowStyle());
+                rowRenderDataExamStudent[i + 2] = examStudent_row;
             }
-            examStudent_cells.add(Cells.of(e.getSumScore().toString()).create());
-            examStudent_row.setCells(examStudent_cells);
-            examStudent_row.setRowStyle(this.getRowStyle());
-            rowRenderDataExamStudent[i + 2] = examStudent_row;
-        }
-
-        rowRenderDataExamStudent[0] = examStudent_header_1;
-        rowRenderDataExamStudent[1] = examStudent_header_2;
-        RowRenderData examStudent_row3 = new RowRenderData();
-        examStudent_row3.setCells(examStudent_cells_3);
-        examStudent_row3.setRowStyle(this.getRowStyle());
-        RowRenderData examStudent_row4 = new RowRenderData();
-        examStudent_row4.setCells(examStudent_cells_4);
-        examStudent_row4.setRowStyle(this.getRowStyle());
-        RowRenderData examStudent_row5 = new RowRenderData();
-        examStudent_row5.setCells(examStudent_cells_5);
-        examStudent_row5.setRowStyle(this.getRowStyle());
-
-        rowRenderDataExamStudent[rowRenderDataExamStudent.length - 3] = examStudent_row3;
-        rowRenderDataExamStudent[rowRenderDataExamStudent.length - 2] = examStudent_row4;
-        rowRenderDataExamStudent[rowRenderDataExamStudent.length - 1] = examStudent_row5;
 
-        // 表格合并,根据坐标
-        MergeCellRule mergeCellRuleExamStudent = MergeCellRule.builder().build();
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 0), MergeCellRule.Grid.of(1, 0)));
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 1), MergeCellRule.Grid.of(1, 1)));
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 2), MergeCellRule.Grid.of(1, 2)));
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 3), MergeCellRule.Grid.of(1, 3)));
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 3, 0), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 3, 3)));
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 2, 0), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 2, 3)));
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, 0), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, 3)));
-
-        //动态扩展列
-        int initNum = 4;
-        for (int i = 0; i < targetSize; i++) {
-            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, initNum), MergeCellRule.Grid.of(0, initNum + randomHomework)));
-            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, initNum), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, initNum + randomHomework)));
-            initNum = initNum + randomHomework + 1;
-        }
-        mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, initNum), MergeCellRule.Grid.of(1, initNum)));
+            rowRenderDataExamStudent[0] = examStudent_header_1;
+            rowRenderDataExamStudent[1] = examStudent_header_2;
+            RowRenderData examStudent_row3 = new RowRenderData();
+            examStudent_row3.setCells(examStudent_cells_3);
+            examStudent_row3.setRowStyle(this.getRowStyle());
+            RowRenderData examStudent_row4 = new RowRenderData();
+            examStudent_row4.setCells(examStudent_cells_4);
+            examStudent_row4.setRowStyle(this.getRowStyle());
+            RowRenderData examStudent_row5 = new RowRenderData();
+            examStudent_row5.setCells(examStudent_cells_5);
+            examStudent_row5.setRowStyle(this.getRowStyle());
+
+            rowRenderDataExamStudent[rowRenderDataExamStudent.length - 3] = examStudent_row3;
+            rowRenderDataExamStudent[rowRenderDataExamStudent.length - 2] = examStudent_row4;
+            rowRenderDataExamStudent[rowRenderDataExamStudent.length - 1] = examStudent_row5;
+
+            // 表格合并,根据坐标
+            MergeCellRule mergeCellRuleExamStudent = MergeCellRule.builder().build();
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 0), MergeCellRule.Grid.of(1, 0)));
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 1), MergeCellRule.Grid.of(1, 1)));
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 2), MergeCellRule.Grid.of(1, 2)));
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, 3), MergeCellRule.Grid.of(1, 3)));
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 3, 0), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 3, 3)));
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 2, 0), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 2, 3)));
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, 0), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, 3)));
+
+            //动态扩展列
+            AtomicInteger initNum = new AtomicInteger(4);
+            targetUsualScoreSizeMap.forEach((k, v) -> {
+                int increaseNum = 1;
+                while (increaseNum <= v) {
+                    mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, initNum.get()), MergeCellRule.Grid.of(0, initNum.get() + increaseNum)));
+                    mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, initNum.get()), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, initNum.get() + increaseNum)));
+                    increaseNum++;
+                }
+                initNum.set(initNum.get() + increaseNum);
+            });
+            mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, initNum.get()), MergeCellRule.Grid.of(1, initNum.get())));
 
-        Tables.TableBuilder tableBuilderExamStudent = Tables.ofPercentWidth("100%");
-        for (int i = 0; i < rowRenderDataExamStudent.length; i++) {
-            tableBuilderExamStudent.addRow(rowRenderDataExamStudent[i]);
+            Tables.TableBuilder tableBuilderExamStudent = Tables.ofPercentWidth("100%");
+            for (int i = 0; i < rowRenderDataExamStudent.length; i++) {
+                tableBuilderExamStudent.addRow(rowRenderDataExamStudent[i]);
+            }
+            TableRenderData tableRenderDataExamStudent = tableBuilderExamStudent.mergeRule(mergeCellRuleExamStudent).left().create();
+            courseReportBean.setExamStudentTable1(tableRenderDataExamStudent);
         }
-        TableRenderData tableRenderDataExamStudent = tableBuilderExamStudent.mergeRule(mergeCellRuleExamStudent).left().create();
-        courseReportBean.setExamStudentTable1(tableRenderDataExamStudent);
 
         XWPFTemplate template = XWPFTemplate.compile("/Users/king/git/teachcloud-server/distributed-print/src/main/resources/static/course_degree_report.docx").render(courseReportBean);
         template.writeToFile("/Users/king/Downloads/demo_course_degree_report.docx");