|
@@ -28,7 +28,11 @@ import com.qmth.teachcloud.obe.been.report.*;
|
|
import com.qmth.teachcloud.obe.been.result.FinalScoreResult;
|
|
import com.qmth.teachcloud.obe.been.result.FinalScoreResult;
|
|
import com.qmth.teachcloud.obe.been.result.ObeCourseWeightResult;
|
|
import com.qmth.teachcloud.obe.been.result.ObeCourseWeightResult;
|
|
import com.qmth.teachcloud.obe.been.result.report.PaperStructDimensionResult;
|
|
import com.qmth.teachcloud.obe.been.result.report.PaperStructDimensionResult;
|
|
-import com.qmth.teachcloud.obe.been.result.report.word.CourseReportBean;
|
|
|
|
|
|
+import com.qmth.teachcloud.obe.been.result.report.word.common.CourseBasicBean;
|
|
|
|
+import com.qmth.teachcloud.obe.been.result.report.word.common.CourseReportBean;
|
|
|
|
+import com.qmth.teachcloud.obe.been.result.report.word.custom.XagyuCourseBasicBean;
|
|
|
|
+import com.qmth.teachcloud.obe.been.result.report.word.custom.XagyuCourseReportBean;
|
|
|
|
+import com.qmth.teachcloud.obe.been.result.report.word.custom.XagyuCourseSuggestDto;
|
|
import com.qmth.teachcloud.obe.entity.*;
|
|
import com.qmth.teachcloud.obe.entity.*;
|
|
import com.qmth.teachcloud.obe.mapper.TRBasicInfoMapper;
|
|
import com.qmth.teachcloud.obe.mapper.TRBasicInfoMapper;
|
|
import com.qmth.teachcloud.obe.service.*;
|
|
import com.qmth.teachcloud.obe.service.*;
|
|
@@ -1485,4 +1489,369 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
|
|
}
|
|
}
|
|
return finalScatterYMap;
|
|
return finalScatterYMap;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构建公共课程目标达成度模板
|
|
|
|
+ *
|
|
|
|
+ * @param trBasicInfo
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public CourseReportBean buildCommonCourseDegreeReport(TRBasicInfo trBasicInfo) {
|
|
|
|
+ //评价样本的基本信息
|
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResultDetail());
|
|
|
|
+ List<CourseTargetWordDto> courseTargetWordDtoList = JSONArray.parseArray(jsonObject.get("targetWordMap").toString(), CourseTargetWordDto.class);
|
|
|
|
+
|
|
|
|
+ ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class);
|
|
|
|
+
|
|
|
|
+ StringJoiner courseTarget = new StringJoiner("");
|
|
|
|
+ courseTargetWordDtoList.stream().peek(s -> {
|
|
|
|
+ courseTarget.add(" ").add(s.getTargetName()).add("——").add(s.getGraduationRequirementPoint()).add("\r\n");
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+ CourseBasicBean courseBasicBean = new CourseBasicBean(trBasicInfo, courseTarget.toString(), reportCourseEvaluationResultDto.getTargetList().size());
|
|
|
|
+
|
|
|
|
+ CourseReportBean courseReportBean = new CourseReportBean(trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》", courseBasicBean);
|
|
|
|
+ //table1-课程目标目标与毕业要求指标点的对应关系
|
|
|
|
+ courseReportBean.setCourseTargetTable1(trBasicInfoService.buildWordTable1(courseTargetWordDtoList));
|
|
|
|
+
|
|
|
|
+ //table2-课程目标达成评价依据
|
|
|
|
+ courseReportBean.setCourseTargetTable2(trBasicInfoService.buildWordTable2(courseTargetWordDtoList));
|
|
|
|
+
|
|
|
|
+ //examstudent-课程目标达成评价依据-考生
|
|
|
|
+ courseReportBean.setExamStudentTable1(trBasicInfoService.buildWordTable5(trBasicInfo, courseReportBean));
|
|
|
|
+ return courseReportBean;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构建西安工业大学课程目标达成度模板
|
|
|
|
+ *
|
|
|
|
+ * @param trBasicInfo
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public XagyuCourseReportBean buildXagyuCourseDegreeReport(TRBasicInfo trBasicInfo) {
|
|
|
|
+ //评价样本的基本信息
|
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResultDetail());
|
|
|
|
+ List<CourseTargetWordDto> courseTargetWordDtoList = JSONArray.parseArray(jsonObject.get("targetWordMap").toString(), CourseTargetWordDto.class);
|
|
|
|
+ XagyuCourseBasicBean xagyucourseBasicBean = new XagyuCourseBasicBean(trBasicInfo);
|
|
|
|
+ XagyuCourseReportBean xagyuCourseReportBean = new XagyuCourseReportBean(trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》", xagyucourseBasicBean);
|
|
|
|
+ //table1-课程目标目标与毕业要求指标点的对应关系
|
|
|
|
+ xagyuCourseReportBean.setXagyuCourseTargetTable1(trBasicInfoService.buildWordTable1(courseTargetWordDtoList));
|
|
|
|
+ xagyuCourseReportBean.setXagyuCourseTargetTable2(trBasicInfoService.buildWordTable1(courseTargetWordDtoList));
|
|
|
|
+ //examstudent-课程目标达成评价依据-考生
|
|
|
|
+ xagyuCourseReportBean.setXagyuExamStudentTable1(trBasicInfoService.buildXagyuWordTable1(trBasicInfo, xagyuCourseReportBean));
|
|
|
|
+ return xagyuCourseReportBean;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构建西安工业大学课程目标达成度-各课程目标考核样本数据详情
|
|
|
|
+ *
|
|
|
|
+ * @param trBasicInfo
|
|
|
|
+ * @param xagyuCourseReportBean
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public TableRenderData buildXagyuWordTable1(TRBasicInfo trBasicInfo, XagyuCourseReportBean xagyuCourseReportBean) {
|
|
|
|
+ TableRenderData tableRenderDataExamStudent = null;
|
|
|
|
+ List<TRExamStudent> trExamStudentList = trExamStudentService.list(new QueryWrapper<TRExamStudent>().lambda()
|
|
|
|
+ .eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()).and(w -> w.ne(TRExamStudent::getStudentCode, "目标分")));
|
|
|
|
+ if (!CollectionUtils.isEmpty(trExamStudentList)) {
|
|
|
|
+ List<CellRenderData> examStudent_cells_1 = new ArrayList<>(), examStudent_cells_2 = 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);
|
|
|
|
+
|
|
|
|
+ Map<String, Integer> targetUsualScoreSizeMap = new LinkedHashMap<>();
|
|
|
|
+ Map<Long, BigDecimal> targetCourseDegreeMap = new LinkedHashMap<>();
|
|
|
|
+ TRExamStudent trExamStudentTemp = trExamStudentList.get(0);
|
|
|
|
+
|
|
|
|
+ RowRenderData[] rowRenderDataExamStudent = new RowRenderData[trExamStudentList.size() + 3];
|
|
|
|
+ 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());
|
|
|
|
+
|
|
|
|
+ rowRenderDataExamStudent[0] = examStudent_header_1;
|
|
|
|
+ rowRenderDataExamStudent[1] = examStudent_header_2;
|
|
|
|
+
|
|
|
|
+ ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class);
|
|
|
|
+ List<CourseTargetWebDto> courseTargetWebDtoList = reportCourseEvaluationResultDto.getTargetList();
|
|
|
|
+ for (CourseTargetWebDto c : courseTargetWebDtoList) {
|
|
|
|
+ if (!CollectionUtils.isEmpty(c.getEvaluationList())) {
|
|
|
|
+ targetUsualScoreSizeMap.put(c.getTargetName(), c.getEvaluationList().size() - 1);
|
|
|
|
+ } else {
|
|
|
|
+ targetUsualScoreSizeMap.put(c.getTargetName(), 0);
|
|
|
|
+ }
|
|
|
|
+ targetCourseDegreeMap.put(c.getTargetId(), c.getEvaluationValue());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Double courseDegree = 0.0d;
|
|
|
|
+ if (!CollectionUtils.isEmpty(targetCourseDegreeMap)) {
|
|
|
|
+ courseDegree = targetCourseDegreeMap.values().stream().filter(s -> Objects.nonNull(s)).collect(Collectors.toList()).stream().mapToDouble(b -> b.doubleValue()).min().orElse(0);
|
|
|
|
+ }
|
|
|
|
+ //首行
|
|
|
|
+ if (Objects.nonNull(trExamStudentTemp.getResultDetail())) {
|
|
|
|
+ List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudentTemp.getResultDetail(), ReportExamStudentTargetDto.class);
|
|
|
|
+ for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
|
|
|
|
+ int finalScoreSize = Objects.nonNull(reportExamStudentTargetDto.getFinalScore()) ? 1 : 0;
|
|
|
|
+ int size = finalScoreSize + (Objects.nonNull(reportExamStudentTargetDto.getUsualScore()) && !CollectionUtils.isEmpty(reportExamStudentTargetDto.getUsualScore().getScoreList()) ? reportExamStudentTargetDto.getUsualScore().getScoreList().size() : 0);
|
|
|
|
+ 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) {
|
|
|
|
+ examStudent_cells_1.add(Cells.of("").center().create());
|
|
|
|
+ examStudent_cells_2.add(Cells.of(reportExamStudentUsualScoreObjDto.getEvaluation()).center().create());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //期末考试
|
|
|
|
+ ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = reportExamStudentTargetDto.getFinalScore();
|
|
|
|
+ if (Objects.nonNull(reportExamStudentFinalScoreDto) && Objects.equals(reportExamStudentFinalScoreDto.getEvaluation(), SystemConstant.FINAL_SCORE_STR)) {
|
|
|
|
+ examStudent_cells_2.add(Cells.of(SystemConstant.FINAL_SCORE_STR).center().create());
|
|
|
|
+ } else {
|
|
|
|
+ int usualScoreSize = reportExamStudentTargetDto.getUsualScore().getScoreList().size();
|
|
|
|
+ while ((size - usualScoreSize) >= 0) {
|
|
|
|
+ examStudent_cells_1.remove(examStudent_cells_1.size() - 1);
|
|
|
|
+ size = size - 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ examStudent_cells_1.add(Cells.of("综合成绩").center().create());
|
|
|
|
+ examStudent_cells_2.add(Cells.of("综合成绩").center().create());
|
|
|
|
+ examStudent_cells_1.add(Cells.of("达成系数").center().create());
|
|
|
|
+ examStudent_cells_2.add(Cells.of("达成系数").center().create());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<BigDecimal> scoreList = new ArrayList<>();
|
|
|
|
+ List<TRExamStudent> sortTrExamStudentList = new ArrayList<>();
|
|
|
|
+ sortTrExamStudentList.addAll(trExamStudentList.subList(trExamStudentList.size() - 2, trExamStudentList.size()));
|
|
|
|
+
|
|
|
|
+ Collections.reverse(sortTrExamStudentList);
|
|
|
|
+ trExamStudentList.remove(trExamStudentList.size() - 1);
|
|
|
|
+ trExamStudentList.remove(trExamStudentList.size() - 1);
|
|
|
|
+ trExamStudentList.addAll(sortTrExamStudentList);
|
|
|
|
+
|
|
|
|
+ List<TRExamStudent> trExamStudentNewList = new ArrayList<>();
|
|
|
|
+ trExamStudentNewList.addAll(trExamStudentList);
|
|
|
|
+ trExamStudentNewList.remove(trExamStudentNewList.size() - 1);
|
|
|
|
+ trExamStudentNewList.remove(trExamStudentNewList.size() - 1);
|
|
|
|
+
|
|
|
|
+ BigDecimal targetAvgScore = new BigDecimal(trExamStudentNewList.stream().mapToDouble(s -> s.getScore().doubleValue()).sum()).divide(new BigDecimal(trExamStudentNewList.size()), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ Map<Long, ConcurrentMap<String, Integer>> scatterYMap = new LinkedHashMap<>();
|
|
|
|
+ for (int i = 0; i < trExamStudentList.size(); i++) {
|
|
|
|
+ TRExamStudent trExamStudent = trExamStudentList.get(i);
|
|
|
|
+ RowRenderData examStudent_row = new RowRenderData();
|
|
|
|
+ List<CellRenderData> examStudent_cells = new ArrayList<>();
|
|
|
|
+ switch (trExamStudent.getName()) {
|
|
|
|
+ case "平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of("平均分").create());
|
|
|
|
+ examStudent_cells.add(Cells.of("平均分").create());
|
|
|
|
+ examStudent_cells.add(Cells.of("平均分").create());
|
|
|
|
+ break;
|
|
|
|
+ case "各课程目标平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of("课程目标达成度").create());
|
|
|
|
+ examStudent_cells.add(Cells.of("课程目标达成度").create());
|
|
|
|
+ examStudent_cells.add(Cells.of("课程目标达成度").create());
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ examStudent_cells.add(Cells.of(String.valueOf(i + 1)).create());
|
|
|
|
+ examStudent_cells.add(Cells.of(trExamStudent.getStudentCode()).create());
|
|
|
|
+ examStudent_cells.add(Cells.of(trExamStudent.getName()).create());
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ examStudent_cells.add(Cells.of(trExamStudent.getAdministrativeClass()).create());
|
|
|
|
+
|
|
|
|
+ if (Objects.nonNull(trExamStudent.getResultDetail())) {
|
|
|
|
+ List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudent.getResultDetail(), ReportExamStudentTargetDto.class);
|
|
|
|
+ for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
|
|
|
|
+ if (Objects.nonNull(reportExamStudentTargetDto)) {
|
|
|
|
+ BigDecimal matrixDegree = reportExamStudentTargetDto.getMatrixDegree();
|
|
|
|
+ if (!Objects.equals(trExamStudent.getName(), "平均分")
|
|
|
|
+ && !Objects.equals(trExamStudent.getName(), "各课程目标平均分")
|
|
|
|
+ && Objects.nonNull(matrixDegree)) {
|
|
|
|
+ trBasicInfoService.getScatterValue(scatterYMap, reportExamStudentTargetDto);
|
|
|
|
+ }
|
|
|
|
+ ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = reportExamStudentTargetDto.getUsualScore();
|
|
|
|
+ //平常作业
|
|
|
|
+ if (Objects.nonNull(reportExamStudentUsualScoreDto) && !CollectionUtils.isEmpty(reportExamStudentUsualScoreDto.getScoreList())) {
|
|
|
|
+ List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = reportExamStudentUsualScoreDto.getScoreList();
|
|
|
|
+ for (ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto : reportExamStudentUsualScoreObjDtoList) {
|
|
|
|
+ switch (trExamStudent.getName()) {
|
|
|
|
+ case "平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of(SystemConstant.df.format(reportExamStudentUsualScoreObjDto.getMatrixAvgScore())).create());
|
|
|
|
+ break;
|
|
|
|
+ case "各课程目标平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of(targetCourseDegreeMap.get(reportExamStudentTargetDto.getTargetId()) + "").create());
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ examStudent_cells.add(Cells.of(SystemConstant.df.format(reportExamStudentUsualScoreObjDto.getScore())).create());
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //期末考试
|
|
|
|
+ ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = reportExamStudentTargetDto.getFinalScore();
|
|
|
|
+ if (Objects.nonNull(reportExamStudentFinalScoreDto) && Objects.equals(reportExamStudentFinalScoreDto.getEvaluation(), SystemConstant.FINAL_SCORE_STR)) {
|
|
|
|
+ xagyuCourseReportBean.getXagyuCourseBasicBean().setFinalScoreWeight(reportExamStudentFinalScoreDto.getTargetWeight());
|
|
|
|
+ switch (trExamStudent.getName()) {
|
|
|
|
+ case "平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of(SystemConstant.df.format(reportExamStudentFinalScoreDto.getMatrixAvgScore())).create());
|
|
|
|
+ break;
|
|
|
|
+ case "各课程目标平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of(targetCourseDegreeMap.get(reportExamStudentTargetDto.getTargetId()) + "").create());
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ examStudent_cells.add(Cells.of(SystemConstant.df.format(reportExamStudentFinalScoreDto.getTargetScoreSum())).create());
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ switch (trExamStudent.getName()) {
|
|
|
|
+ case "平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of(SystemConstant.df.format(targetAvgScore.setScale(2, BigDecimal.ROUND_HALF_UP))).create());
|
|
|
|
+ break;
|
|
|
|
+ case "各课程目标平均分":
|
|
|
|
+ examStudent_cells.add(Cells.of("").create());
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ scoreList.add(trExamStudent.getScore());
|
|
|
|
+ examStudent_cells.add(Cells.of(SystemConstant.df.format(trExamStudent.getScore())).create());
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ String key = examStudent_cells.get(examStudent_cells.size() - 1).getParagraphs().get(0).getContents().get(0).toString();
|
|
|
|
+ if (!Objects.equals(key.trim(), "") && !Objects.equals(key.trim(), "null")) {
|
|
|
|
+ examStudent_cells.add(Cells.of(SystemConstant.df.format(new BigDecimal(key).divide(SystemConstant.PERCENT, 2, BigDecimal.ROUND_HALF_UP))).create());
|
|
|
|
+ } else {
|
|
|
|
+ examStudent_cells.add(Cells.of("").create());
|
|
|
|
+ }
|
|
|
|
+ examStudent_row.setCells(examStudent_cells);
|
|
|
|
+ examStudent_row.setRowStyle(this.getRowStyle());
|
|
|
|
+ rowRenderDataExamStudent[i + 2] = examStudent_row;
|
|
|
|
+ }
|
|
|
|
+ LinkedMultiValueMap<Long, Map<String, String>> finalScatterYMap = trBasicInfoService.getFinalScatterValue(scatterYMap);
|
|
|
|
+ List<CellRenderData> cellRenderData_last_cell = new ArrayList<>();
|
|
|
|
+ RowRenderData examStudent_last_row = new RowRenderData();
|
|
|
|
+ cellRenderData_last_cell.add(Cells.of("课程达成度").create());
|
|
|
|
+ cellRenderData_last_cell.add(Cells.of("课程达成度").create());
|
|
|
|
+ cellRenderData_last_cell.add(Cells.of("课程达成度").create());
|
|
|
|
+ cellRenderData_last_cell.add(Cells.of("课程达成度").create());
|
|
|
|
+
|
|
|
|
+ int cellSize = rowRenderDataExamStudent[rowRenderDataExamStudent.length - 2].getCells().size();
|
|
|
|
+ for (int i = 4; i < cellSize; i++) {
|
|
|
|
+ cellRenderData_last_cell.add(Cells.of(courseDegree + "").center().create());
|
|
|
|
+ }
|
|
|
|
+ examStudent_last_row.setCells(cellRenderData_last_cell);
|
|
|
|
+ examStudent_last_row.setRowStyle(this.getRowStyle());
|
|
|
|
+ rowRenderDataExamStudent[rowRenderDataExamStudent.length - 1] = examStudent_last_row;
|
|
|
|
+
|
|
|
|
+ //表格合并,根据坐标
|
|
|
|
+ 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)));
|
|
|
|
+
|
|
|
|
+ //动态扩展列
|
|
|
|
+ List<CellRenderData> cellRenderDataList = examStudent_header_1.getCells();
|
|
|
|
+ for (int i = 0; i < cellRenderDataList.size(); i++) {
|
|
|
|
+ CellRenderData cellRenderData = cellRenderDataList.get(i);
|
|
|
|
+ String key = cellRenderData.getParagraphs().get(0).getContents().get(0).toString();
|
|
|
|
+ if (targetUsualScoreSizeMap.containsKey(key)) {
|
|
|
|
+ Integer cellNum = targetUsualScoreSizeMap.get(key);
|
|
|
|
+ if (cellNum.intValue() > 0) {
|
|
|
|
+ mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, i), MergeCellRule.Grid.of(0, i + cellNum)));
|
|
|
|
+ mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 2, i), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 2, i + cellNum)));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, 4), MergeCellRule.Grid.of(rowRenderDataExamStudent.length - 1, cellSize - 1)));
|
|
|
|
+ mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, rowRenderDataExamStudent[rowRenderDataExamStudent.length - 1].getCells().size() - 2), MergeCellRule.Grid.of(1, rowRenderDataExamStudent[rowRenderDataExamStudent.length - 1].getCells().size() - 2)));
|
|
|
|
+ mergeCellRuleExamStudent.getMapping().add(new MergeCellRule.GridRule(MergeCellRule.Grid.of(0, rowRenderDataExamStudent[rowRenderDataExamStudent.length - 1].getCells().size() - 1), MergeCellRule.Grid.of(1, rowRenderDataExamStudent[rowRenderDataExamStudent.length - 1].getCells().size() - 1)));
|
|
|
|
+
|
|
|
|
+ Tables.TableBuilder tableBuilderExamStudent = Tables.ofPercentWidth(tbPercentWidth);
|
|
|
|
+ for (int i = 0; i < rowRenderDataExamStudent.length; i++) {
|
|
|
|
+ tableBuilderExamStudent.addRow(rowRenderDataExamStudent[i]);
|
|
|
|
+ }
|
|
|
|
+ tableRenderDataExamStudent = tableBuilderExamStudent.mergeRule(mergeCellRuleExamStudent).left().create();
|
|
|
|
+
|
|
|
|
+ if (!CollectionUtils.isEmpty(scoreList)) {
|
|
|
|
+ Integer[] scoreSizes = new Integer[]{0, 0, 0, 0, 0};
|
|
|
|
+ BigDecimal[] scorePercent = new BigDecimal[]{new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0)};
|
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
|
+ Double maxScore = scoreList.stream().mapToDouble(s -> s.doubleValue()).max().orElse(0.0d);
|
|
|
|
+ Double minScore = scoreList.stream().mapToDouble(s -> s.doubleValue()).min().orElse(0.0d);
|
|
|
|
+ Double avgScore = scoreList.stream().mapToDouble(s -> s.doubleValue()).average().orElse(0.0d);
|
|
|
|
+ for (BigDecimal d : scoreList) {
|
|
|
|
+ if (d.doubleValue() <= 100 && d.doubleValue() >= 90d) {
|
|
|
|
+ scoreSizes[0] = scoreSizes[0] + 1;
|
|
|
|
+ } else if (d.doubleValue() <= 89.99d && d.doubleValue() >= 80d) {
|
|
|
|
+ scoreSizes[1] = scoreSizes[1] + 1;
|
|
|
|
+ } else if (d.doubleValue() <= 79.99d && d.doubleValue() >= 70d) {
|
|
|
|
+ scoreSizes[2] = scoreSizes[2] + 1;
|
|
|
|
+ } else if (d.doubleValue() <= 69.99d && d.doubleValue() >= 60d) {
|
|
|
|
+ scoreSizes[3] = scoreSizes[3] + 1;
|
|
|
|
+ } else {
|
|
|
|
+ scoreSizes[4] = scoreSizes[4] + 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < scoreSizes.length; i++) {
|
|
|
|
+ scorePercent[i] = new BigDecimal(scoreSizes[i]).divide(new BigDecimal(scoreList.size()), 4, BigDecimal.ROUND_HALF_UP).multiply(SystemConstant.PERCENT).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ }
|
|
|
|
+ map.put("scoreSizes", scoreSizes);
|
|
|
|
+ map.put("scorePercent", scorePercent);
|
|
|
|
+ map.put("maxScore", maxScore);
|
|
|
|
+ map.put("minScore", minScore);
|
|
|
|
+ map.put("avgScore", avgScore);
|
|
|
|
+ map.put("courseTargetWebDtoList", courseTargetWebDtoList);
|
|
|
|
+ xagyuCourseReportBean.setXagyuCourseTargetTable2(this.buildWordTable6(map));
|
|
|
|
+ xagyuCourseReportBean.setXagyuCourseTargetColumnDiagram1(this.buildCourseTargetColumnDiagram2(map));
|
|
|
|
+ this.buildXagyuCourseTargetColumnDiagram1(finalScatterYMap, xagyuCourseReportBean.getXagyuCourseBasicBean().getCourseSuggestList(), courseTargetWebDtoList);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return tableRenderDataExamStudent;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构建西安工业大学课程目标达成度(散点图)
|
|
|
|
+ *
|
|
|
|
+ * @param finalScatterYMap
|
|
|
|
+ * @param courseSuggestDtoList
|
|
|
|
+ * @param courseTargetWebDtoList
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public void buildXagyuCourseTargetColumnDiagram1(LinkedMultiValueMap<Long, Map<String, String>> finalScatterYMap, List<XagyuCourseSuggestDto> courseSuggestDtoList, List<CourseTargetWebDto> courseTargetWebDtoList) {
|
|
|
|
+ Map<Long, CourseTargetWebDto> courseTargetWebDtoMap = courseTargetWebDtoList.stream().collect(Collectors.toMap(CourseTargetWebDto::getTargetId, Function.identity(), (dto1, dto2) -> dto1));
|
|
|
|
+ for (XagyuCourseSuggestDto courseSuggestDto : courseSuggestDtoList) {
|
|
|
|
+ CourseTargetWebDto courseTargetWebDto = courseTargetWebDtoMap.get(courseSuggestDto.getTargetId());
|
|
|
|
+ List<Map<String, String>> list = finalScatterYMap.get(courseSuggestDto.getTargetId());
|
|
|
|
+ if (Objects.nonNull(courseTargetWebDto) && !CollectionUtils.isEmpty(list)) {
|
|
|
|
+ List<String> valueXList = new ArrayList<>();
|
|
|
|
+ List<Number> titleYList = new ArrayList<>();
|
|
|
|
+ for (Map<String, String> m : list) {
|
|
|
|
+ for (Map.Entry<String, String> entry : m.entrySet()) {
|
|
|
|
+ valueXList.add(entry.getValue());
|
|
|
|
+ titleYList.add(Double.parseDouble(entry.getKey()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ ChartMultiSeriesRenderData scatterMap = Charts.ofMultiSeries(courseTargetWebDto.getTargetName(), valueXList.toArray(new String[valueXList.size()]))
|
|
|
|
+ .addSeries("Y值", titleYList.toArray(new Number[titleYList.size()]))
|
|
|
|
+ .setxAsixTitle("学生代号")
|
|
|
|
+ .setyAsixTitle("达成值" + SystemConstant.df.format(courseTargetWebDto.getEvaluationValue()))
|
|
|
|
+ .create();
|
|
|
|
+ courseSuggestDto.setXagyuCourseTargetColumnDiagram2(scatterMap);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|