|
@@ -1,11 +1,14 @@
|
|
|
package com.qmth.distributed.print.api;
|
|
|
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.google.gson.reflect.TypeToken;
|
|
|
import com.qmth.boot.api.constant.ApiConstant;
|
|
|
+import com.qmth.distributed.print.business.bean.dto.FinalScoreDto;
|
|
|
import com.qmth.distributed.print.business.bean.dto.report.*;
|
|
|
+import com.qmth.distributed.print.business.bean.result.FinalScoreResult;
|
|
|
import com.qmth.distributed.print.business.bean.result.ScoreResult;
|
|
|
import com.qmth.distributed.print.business.bean.result.report.PaperStructResult;
|
|
|
import com.qmth.distributed.print.business.bean.result.report.ReportResult;
|
|
@@ -23,14 +26,9 @@ import com.qmth.teachcloud.common.util.GsonUtil;
|
|
|
import com.qmth.teachcloud.common.util.JacksonUtil;
|
|
|
import com.qmth.teachcloud.common.util.ResultUtil;
|
|
|
import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
-import com.qmth.teachcloud.mark.bean.archivescore.OverViewVo;
|
|
|
import com.qmth.teachcloud.mark.bean.archivescore.ScoreRangeVo;
|
|
|
-import com.qmth.teachcloud.mark.bean.archivescore.ScoreReportVo;
|
|
|
import com.qmth.teachcloud.mark.entity.MarkPaper;
|
|
|
-import com.qmth.teachcloud.mark.entity.MarkStudent;
|
|
|
-import com.qmth.teachcloud.mark.mapper.MarkStudentMapper;
|
|
|
import com.qmth.teachcloud.mark.service.MarkPaperService;
|
|
|
-import com.qmth.teachcloud.mark.service.MarkStudentService;
|
|
|
import com.qmth.teachcloud.mark.utils.Calculator;
|
|
|
import io.swagger.annotations.*;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -43,9 +41,12 @@ import javax.validation.Valid;
|
|
|
import javax.validation.constraints.Max;
|
|
|
import javax.validation.constraints.Min;
|
|
|
import java.io.IOException;
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -72,9 +73,6 @@ public class TRBasicInfoController {
|
|
|
@Resource
|
|
|
BasicSemesterService basicSemesterService;
|
|
|
|
|
|
- @Resource
|
|
|
- ExamStudentService examStudentService;
|
|
|
-
|
|
|
@Resource
|
|
|
BasicExamService basicExamService;
|
|
|
|
|
@@ -82,10 +80,7 @@ public class TRBasicInfoController {
|
|
|
TCPaperStructService tcPaperStructService;
|
|
|
|
|
|
@Resource
|
|
|
- MarkStudentMapper markStudentMapper;
|
|
|
-
|
|
|
- @Resource
|
|
|
- MarkStudentService markStudentService;
|
|
|
+ TCFinalScoreService tcFinalScoreService;
|
|
|
|
|
|
@ApiOperation(value = "报告管理列表")
|
|
|
@RequestMapping(value = "/report/list", method = RequestMethod.POST)
|
|
@@ -137,12 +132,11 @@ public class TRBasicInfoController {
|
|
|
ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = new ReportCourseEvaluationSpreadDto(paperStructResultList);
|
|
|
|
|
|
//课程目标考核分布-分数图
|
|
|
- OverViewVo overViewVo = markStudentMapper.overview(examId, paperNumber);
|
|
|
- Objects.requireNonNull(overViewVo, "未找到分数信息");
|
|
|
+ FinalScoreDto finalScoreDto = tcFinalScoreService.finalScoreScoreOverView(examId, courseCode, paperNumber);
|
|
|
+ Objects.requireNonNull(finalScoreDto, "未找到期末成绩分数信息");
|
|
|
|
|
|
- ScoreReportVo ret = new ScoreReportVo();
|
|
|
- fillScoreRange(ret, examId, paperNumber, markPaper);
|
|
|
- List<ScoreRangeVo> scoreRangeVoList = ret.getScoreRange();
|
|
|
+ fillScoreRange(finalScoreDto, examId, paperNumber, markPaper);
|
|
|
+ List<ScoreRangeVo> scoreRangeVoList = finalScoreDto.getScoreRange();
|
|
|
if (!CollectionUtils.isEmpty(scoreRangeVoList)) {
|
|
|
Integer failCount = scoreRangeVoList.get(0).getStudentCount();//第一行数据默认为不及格
|
|
|
Double failRate = scoreRangeVoList.get(0).getRate();
|
|
@@ -155,6 +149,65 @@ public class TRBasicInfoController {
|
|
|
}
|
|
|
trBasicInfo.setCourseEvaluationSpread(JacksonUtil.parseJson(reportCourseEvaluationSpreadDto));
|
|
|
|
|
|
+ //查询考生数据
|
|
|
+ List<FinalScoreResult> finalScoreResultList = tcFinalScoreService.examStudentOverview(examId, courseCode, paperNumber);
|
|
|
+ Map<String, List<Double>> usualScoreMap = new LinkedHashMap<>();//汇总平常成绩分数(用来算最高分,最低分,平均分)
|
|
|
+ Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap = new LinkedHashMap<>();//整体平常成绩分数图
|
|
|
+// Map<Long, Map<String, List<Double>>> finalScoreTargetMap = new LinkedHashMap<>();//汇总目标分数(用来算最高分,最低分,平均分)
|
|
|
+ Map<Long, List<Double>> finalScoreTargetMap = new LinkedHashMap<>();//汇总目标分数(用来算最高分,最低分,平均分)
|
|
|
+ Map<Long, Map<String, List<Double>>> finalScoreDimensionMap = new LinkedHashMap<>();//汇总知识点分数(用来算最高分,最低分,平均分)
|
|
|
+// LinkedMultiValueMap<Long, UsualScoreOverviewDto> oList = new LinkedMultiValueMap<>();
|
|
|
+ if (!CollectionUtils.isEmpty(finalScoreResultList)) {
|
|
|
+ //期末成绩明细map
|
|
|
+ Map<String, PaperStructResult> paperStructResultMap = paperStructResultList.stream().collect(Collectors.toMap(k -> k.getMainNumber() + "-" + k.getSubNumber(), Function.identity(), (dto1, dto2) -> dto1));
|
|
|
+
|
|
|
+ List<ReportExamStudentDto> examStudentList = new ArrayList<>(finalScoreResultList.size());
|
|
|
+ for (FinalScoreResult finalScoreResult : finalScoreResultList) {
|
|
|
+ //解析期末成绩知识点
|
|
|
+ JSONArray finalScoreDetailJsonArray = JSONArray.parseArray(finalScoreResult.getFinalScoreDetail());
|
|
|
+ for (int i = 0; i < finalScoreDetailJsonArray.size(); i++) {
|
|
|
+ JSONObject jsonObject = finalScoreDetailJsonArray.getJSONObject(i);
|
|
|
+ PaperStructResult paperStructResult = paperStructResultMap.get(jsonObject.get("name").toString());
|
|
|
+ if (Objects.nonNull(paperStructResult)) {
|
|
|
+ List<CourseTargetDto> courseTargetDtoList = paperStructResult.getTargetList();
|
|
|
+ for (CourseTargetDto courseTargetDto : courseTargetDtoList) {
|
|
|
+ if (!finalScoreTargetMap.containsKey(courseTargetDto.getTargetId())) {
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ }
|
|
|
+ List<DimensionDto> dimensionDtoList = courseTargetDto.getDimensionList();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //解析平时作业分数图
|
|
|
+ JSONArray usualScoreJsonArray = JSONArray.parseArray(finalScoreResult.getUsualScore());
|
|
|
+ List<ReportExamStudentUsualScoreObjDto> scoreList = new ArrayList<>(usualScoreJsonArray.size());
|
|
|
+ for (int i = 0; i < usualScoreJsonArray.size(); i++) {
|
|
|
+ JSONObject jsonObject = usualScoreJsonArray.getJSONObject(i);
|
|
|
+ if (!usualScoreMap.containsKey(jsonObject.get("name"))) {
|
|
|
+ usualScoreMap.put(jsonObject.get("name").toString(), new ArrayList<>(Arrays.asList(Objects.nonNull(jsonObject.get("score")) ? Double.parseDouble(jsonObject.get("score").toString()) : 0d)));
|
|
|
+ } else {
|
|
|
+ List<Double> list = usualScoreMap.get(jsonObject.get("name").toString());
|
|
|
+ list.add(Objects.nonNull(jsonObject.get("score")) ? Double.parseDouble(jsonObject.get("score").toString()) : 0d);
|
|
|
+ usualScoreMap.put(jsonObject.get("name").toString(), list);
|
|
|
+ }
|
|
|
+ scoreList.add(new ReportExamStudentUsualScoreObjDto(jsonObject.get("name").toString(), Objects.nonNull(jsonObject.get("score")) ? Double.parseDouble(jsonObject.get("score").toString()) : 0d));
|
|
|
+ }
|
|
|
+ finalScoreResult.setUsualScoreDto(new ReportExamStudentUsualScoreDto(scoreList));
|
|
|
+ examStudentList.add(new ReportExamStudentDto(finalScoreResult));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //计算平常成绩最高分,最低分,平均分
|
|
|
+ usualScoreMap.forEach((k, v) -> {
|
|
|
+ Double maxScore = v.stream().mapToDouble(Double::doubleValue).max().orElse(0d);
|
|
|
+ Double minScore = v.stream().mapToDouble(Double::doubleValue).min().orElse(0d);
|
|
|
+ Double avgScore = new BigDecimal(v.stream().mapToDouble(Double::doubleValue).average().orElse(0d)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
+ usualScoreOverviewDtoMap.put(k, new UsualScoreOverviewDto(k, maxScore, minScore, avgScore));
|
|
|
+ });
|
|
|
+
|
|
|
//TODO 课程考核成绩评价结果-待曹子轩补充目标/评价方式数据,有测试数据
|
|
|
ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = null;
|
|
|
if (!CollectionUtils.isEmpty(paperStructResultList)) {
|
|
@@ -223,13 +276,12 @@ public class TRBasicInfoController {
|
|
|
/**
|
|
|
* 计算分数范围
|
|
|
*
|
|
|
- * @param ret
|
|
|
+ * @param finalScoreDto
|
|
|
* @param examId
|
|
|
* @param paperNumber
|
|
|
* @param markPaper
|
|
|
*/
|
|
|
- private void fillScoreRange(ScoreReportVo ret, Long examId, String paperNumber, MarkPaper markPaper) {
|
|
|
- int toltal = getCountByPaperNumber(examId, paperNumber);
|
|
|
+ protected void fillScoreRange(FinalScoreDto finalScoreDto, Long examId, String paperNumber, MarkPaper markPaper) {
|
|
|
//分数区间
|
|
|
Double passScore = markPaper.getPassScore();//及格分
|
|
|
Objects.requireNonNull(passScore, "及格分为空");
|
|
@@ -238,75 +290,47 @@ public class TRBasicInfoController {
|
|
|
Objects.requireNonNull(totalScore, "试卷满分为空");
|
|
|
|
|
|
List<ScoreRangeVo> scoreRange = new ArrayList<>();
|
|
|
- ret.setScoreRange(scoreRange);
|
|
|
+ finalScoreDto.setScoreRange(scoreRange);
|
|
|
|
|
|
//开始、结束分数区间
|
|
|
Double startInterval = 0.5d, endInterval = 9.5d, increaseStartScore = passScore - startInterval,
|
|
|
increaseEndScore = increaseStartScore + startInterval + endInterval;
|
|
|
- scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 1.0d, increaseStartScore));
|
|
|
+ scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, 1.0d, increaseStartScore));
|
|
|
increaseStartScore = increaseStartScore + startInterval;
|
|
|
increaseEndScore = increaseStartScore + endInterval;
|
|
|
if (totalScore.doubleValue() - increaseEndScore.doubleValue() == startInterval || increaseEndScore.doubleValue() >= totalScore.doubleValue()) {
|
|
|
increaseEndScore = totalScore;
|
|
|
- scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, increaseStartScore, increaseEndScore));
|
|
|
+ scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, increaseStartScore, increaseEndScore));
|
|
|
} else {
|
|
|
while (increaseEndScore.doubleValue() < totalScore.doubleValue()) {
|
|
|
- scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, increaseStartScore, increaseEndScore));
|
|
|
+ scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, increaseStartScore, increaseEndScore));
|
|
|
increaseStartScore = increaseEndScore + startInterval;
|
|
|
increaseEndScore = increaseStartScore + endInterval;
|
|
|
if (totalScore.doubleValue() - increaseEndScore.doubleValue() == startInterval || increaseEndScore.doubleValue() >= totalScore.doubleValue()) {
|
|
|
increaseEndScore = totalScore;
|
|
|
- scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, increaseStartScore, increaseEndScore));
|
|
|
+ scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, increaseStartScore, increaseEndScore));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取考生人数
|
|
|
- *
|
|
|
- * @param examId
|
|
|
- * @param paperNumber
|
|
|
- * @return
|
|
|
- */
|
|
|
- private int getCountByPaperNumber(Long examId, String paperNumber) {
|
|
|
- QueryWrapper<MarkStudent> wrapper = new QueryWrapper<>();
|
|
|
- LambdaQueryWrapper<MarkStudent> lw = wrapper.lambda();
|
|
|
- lw.eq(MarkStudent::getExamId, examId);
|
|
|
- lw.eq(MarkStudent::getPaperNumber, paperNumber);
|
|
|
- return markStudentService.count(wrapper);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 计算分数比率
|
|
|
*
|
|
|
* @param toltal
|
|
|
* @param examId
|
|
|
+ * @param courseCode
|
|
|
* @param paperNumber
|
|
|
* @param start
|
|
|
* @param end
|
|
|
* @return
|
|
|
*/
|
|
|
- private ScoreRangeVo getScoreRangeVo(int toltal, Long examId, String paperNumber, Double start, Double end) {
|
|
|
- int count = getCount(examId, paperNumber, start, end);
|
|
|
+ protected ScoreRangeVo getScoreRangeVo(int toltal, Long examId, String courseCode, String paperNumber, Double start, Double end) {
|
|
|
+ int count = tcFinalScoreService.getCountByScoreRange(examId, courseCode, paperNumber, start, end);
|
|
|
Double rate = null;
|
|
|
if (toltal != 0) {
|
|
|
rate = Calculator.multiply(count, toltal, 2);
|
|
|
}
|
|
|
- ScoreRangeVo vo = new ScoreRangeVo(count, start, end, rate);
|
|
|
- return vo;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 计算分数范围人数
|
|
|
- *
|
|
|
- * @param examId
|
|
|
- * @param paperNumber
|
|
|
- * @param start
|
|
|
- * @param end
|
|
|
- * @return
|
|
|
- */
|
|
|
- private int getCount(Long examId, String paperNumber, Double start, Double end) {
|
|
|
- return markStudentMapper.getCountByScoreRange(examId, paperNumber, start, end);
|
|
|
+ return new ScoreRangeVo(count, start, end, rate);
|
|
|
}
|
|
|
}
|