|
@@ -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);
|
|
|
+ }
|
|
|
}
|