Просмотр исходного кода

课程目标达成度散点图

wangliang 8 месяцев назад
Родитель
Сommit
08980c55ab

BIN
distributed-print/src/main/resources/static/course_degree_report.docx


+ 12 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/obe/CourseSuggestDto.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.obe.been.obe;
 
+import com.deepoove.poi.data.ChartMultiSeriesRenderData;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
@@ -22,6 +23,9 @@ public class CourseSuggestDto implements Serializable {
     @ApiModelProperty("目标名称")
     private String targetName;
 
+    @ApiModelProperty(name = "课程目标散点图")
+    private ChartMultiSeriesRenderData courseTargetColumnDiagram3;
+
     @ApiModelProperty("达成情况")
     private String finishPoints;
 
@@ -31,6 +35,14 @@ public class CourseSuggestDto implements Serializable {
     @ApiModelProperty("课程持续改进")
     private String courseSuggest;
 
+    public ChartMultiSeriesRenderData getCourseTargetColumnDiagram3() {
+        return courseTargetColumnDiagram3;
+    }
+
+    public void setCourseTargetColumnDiagram3(ChartMultiSeriesRenderData courseTargetColumnDiagram3) {
+        this.courseTargetColumnDiagram3 = courseTargetColumnDiagram3;
+    }
+
     public Long getTargetId() {
         return targetId;
     }

+ 13 - 4
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TRBasicInfoService.java

@@ -5,15 +5,14 @@ import com.deepoove.poi.data.ChartMultiSeriesRenderData;
 import com.deepoove.poi.data.TableRenderData;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.obe.been.dto.CourseWeightDto;
-import com.qmth.teachcloud.obe.been.report.CourseTargetWordDto;
-import com.qmth.teachcloud.obe.been.report.ReportCourseBasicInfoDto;
-import com.qmth.teachcloud.obe.been.report.ReportCourseEvaluationResultDto;
-import com.qmth.teachcloud.obe.been.report.ReportScoreViewDto;
+import com.qmth.teachcloud.obe.been.obe.CourseSuggestDto;
+import com.qmth.teachcloud.obe.been.report.*;
 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.word.CourseReportBean;
 import com.qmth.teachcloud.obe.entity.ObeCourseOutline;
 import com.qmth.teachcloud.obe.entity.TRBasicInfo;
+import org.springframework.util.LinkedMultiValueMap;
 
 import java.util.List;
 import java.util.Map;
@@ -129,6 +128,16 @@ public interface TRBasicInfoService extends IService<TRBasicInfo> {
      */
     public ChartMultiSeriesRenderData buildCourseTargetColumnDiagram2(Map<String, Object> map);
 
+    /**
+     * 构建word图形表格3(散点图)
+     *
+     * @param finalScatterYMap
+     * @param courseSuggestDtoList
+     * @param courseTargetWebDtoList
+     */
+    public void buildCourseTargetColumnDiagram3(LinkedMultiValueMap<Long, Map<String, String>> finalScatterYMap,
+                                                List<CourseSuggestDto> courseSuggestDtoList, List<CourseTargetWebDto> courseTargetWebDtoList);
+
     /**
      * 根据考试id/课程编码/试卷编码删除数据
      *

+ 79 - 1
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TRBasicInfoServiceImpl.java

@@ -23,6 +23,7 @@ import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.bean.archivescore.ScoreRangeVo;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.obe.been.dto.*;
+import com.qmth.teachcloud.obe.been.obe.CourseSuggestDto;
 import com.qmth.teachcloud.obe.been.report.*;
 import com.qmth.teachcloud.obe.been.result.FinalScoreResult;
 import com.qmth.teachcloud.obe.been.result.ObeCourseWeightResult;
@@ -38,10 +39,13 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -97,7 +101,6 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
     protected static final String tbPercentWidth = "100%";
     protected static final String[] scoreTitles = new String[]{"100-90", "89-80", "79-70", "69-60", "<60"};
 
-
     @Override
     public TRBasicInfo queryBasicInfo(Long cultureProgramId, Long courseId, String paperNumber) {
         QueryWrapper<TRBasicInfo> queryWrapper = new QueryWrapper<>();
@@ -756,6 +759,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
             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();
@@ -783,6 +787,12 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
                     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)) {
+                                this.getScatterValue(scatterYMap, reportExamStudentTargetDto);
+                            }
                             ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = reportExamStudentTargetDto.getUsualScore();
                             //平常作业
                             if (Objects.nonNull(reportExamStudentUsualScoreDto) && !CollectionUtils.isEmpty(reportExamStudentUsualScoreDto.getScoreList())) {
@@ -836,6 +846,16 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
                 examStudent_row.setRowStyle(this.getRowStyle());
                 rowRenderDataExamStudent[i + 2] = examStudent_row;
             }
+            LinkedMultiValueMap<Long, Map<String, String>> finalScatterYMap = new LinkedMultiValueMap<>();
+            for (Map.Entry<Long, ConcurrentMap<String, Integer>> entry : scatterYMap.entrySet()) {
+                ConcurrentMap<String, Integer> concurrentMap = entry.getValue();
+                for (Map.Entry<String, Integer> entry1 : concurrentMap.entrySet()) {
+                    Map<String, String> mapNew = new HashMap<>();
+                    mapNew.put(entry1.getKey(), entry1.getValue().toString());
+                    finalScatterYMap.add(entry.getKey(), mapNew);
+                }
+            }
+
             List<CellRenderData> cellRenderData_last_cell = new ArrayList<>();
             RowRenderData examStudent_last_row = new RowRenderData();
             cellRenderData_last_cell.add(Cells.of("课程达成度").create());
@@ -915,6 +935,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
                 courseReportBean.setCourseTargetTable6(this.buildWordTable6(map));
                 courseReportBean.setCourseTargetColumnDiagram1(this.buildCourseTargetColumnDiagram1(map));
                 courseReportBean.setCourseTargetColumnDiagram2(this.buildCourseTargetColumnDiagram2(map));
+                this.buildCourseTargetColumnDiagram3(finalScatterYMap, courseReportBean.getCourseBasicBean().getCourseSuggestList(), courseTargetWebDtoList);
             }
         }
         return tableRenderDataExamStudent;
@@ -1023,6 +1044,40 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
         return chart;
     }
 
+    /**
+     * 构建word图形表格3(散点图)
+     *
+     * @param finalScatterYMap
+     * @param courseSuggestDtoList
+     * @param courseTargetWebDtoList
+     */
+    @Override
+    public void buildCourseTargetColumnDiagram3(LinkedMultiValueMap<Long, Map<String, String>> finalScatterYMap,
+                                                List<CourseSuggestDto> courseSuggestDtoList,
+                                                List<CourseTargetWebDto> courseTargetWebDtoList) {
+        Map<Long, CourseTargetWebDto> courseTargetWebDtoMap = courseTargetWebDtoList.stream().collect(Collectors.toMap(CourseTargetWebDto::getTargetId, Function.identity(), (dto1, dto2) -> dto1));
+        for (CourseSuggestDto 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.setCourseTargetColumnDiagram3(scatterMap);
+            }
+        }
+    }
+
     /**
      * 删除报表数据
      *
@@ -1363,4 +1418,27 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
         }
         return new ScoreRangeVo(count, start, end, rate);
     }
+
+    /**
+     * 获取散点图值
+     *
+     * @param scatterYMap
+     * @param reportExamStudentTargetDto
+     */
+    protected void getScatterValue(Map<Long, ConcurrentMap<String, Integer>> scatterYMap, ReportExamStudentTargetDto reportExamStudentTargetDto) {
+        ConcurrentMap<String, Integer> map = null;
+        if (!scatterYMap.containsKey(reportExamStudentTargetDto.getTargetId())) {
+            map = new ConcurrentHashMap<>();
+            map.put(reportExamStudentTargetDto.getMatrixDegree().toString(), 1);
+        } else {
+            map = scatterYMap.get(reportExamStudentTargetDto.getTargetId());
+            if (!map.containsKey(reportExamStudentTargetDto.getMatrixDegree().toString())) {
+                map.put(reportExamStudentTargetDto.getMatrixDegree().toString(), 1);
+            } else {
+                Integer value = map.get(reportExamStudentTargetDto.getMatrixDegree().toString());
+                map.put(reportExamStudentTargetDto.getMatrixDegree().toString(), ++value);
+            }
+        }
+        scatterYMap.put(reportExamStudentTargetDto.getTargetId(), map);
+    }
 }