|
@@ -1,10 +1,32 @@
|
|
|
package com.qmth.distributed.print.business.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.google.gson.reflect.TypeToken;
|
|
|
+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.report.PaperStructResult;
|
|
|
import com.qmth.distributed.print.business.entity.TRBasicInfo;
|
|
|
import com.qmth.distributed.print.business.mapper.TRBasicInfoMapper;
|
|
|
+import com.qmth.distributed.print.business.service.TCFinalScoreService;
|
|
|
import com.qmth.distributed.print.business.service.TRBasicInfoService;
|
|
|
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.qmth.teachcloud.common.util.GsonUtil;
|
|
|
+import com.qmth.teachcloud.common.util.JacksonUtil;
|
|
|
+import com.qmth.teachcloud.mark.bean.archivescore.ScoreRangeVo;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkPaper;
|
|
|
+import com.qmth.teachcloud.mark.utils.Calculator;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+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>
|
|
@@ -17,4 +39,322 @@ import org.springframework.stereotype.Service;
|
|
|
@Service
|
|
|
public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBasicInfo> implements TRBasicInfoService {
|
|
|
|
|
|
+ @Resource
|
|
|
+ TCFinalScoreService tcFinalScoreService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取课程目标考核分布-分数图
|
|
|
+ *
|
|
|
+ * @param trBasicInfo
|
|
|
+ * @param markPaper
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ReportScoreViewDto getScoreList(TRBasicInfo trBasicInfo, MarkPaper markPaper) {
|
|
|
+ FinalScoreDto finalScoreDto = tcFinalScoreService.finalScoreScoreOverView(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber());
|
|
|
+ Objects.requireNonNull(finalScoreDto, "未找到期末成绩分数信息");
|
|
|
+
|
|
|
+ ReportScoreViewDto reportScoreViewDto = null;
|
|
|
+ fillScoreRange(finalScoreDto, trBasicInfo.getExamId(), trBasicInfo.getPaperNumber(), markPaper);
|
|
|
+ List<ScoreRangeVo> scoreRangeVoList = finalScoreDto.getScoreRange();
|
|
|
+ if (!CollectionUtils.isEmpty(scoreRangeVoList)) {
|
|
|
+ Integer failCount = scoreRangeVoList.get(0).getStudentCount();//第一行数据默认为不及格
|
|
|
+ Double failRate = scoreRangeVoList.get(0).getRate();
|
|
|
+
|
|
|
+ scoreRangeVoList.remove(0);
|
|
|
+ List<ReportScoreRangeViewDto> scoreRangeViewDtoList = GsonUtil.fromJson(JacksonUtil.parseJson(scoreRangeVoList), new TypeToken<List<ReportScoreRangeViewDto>>() {
|
|
|
+ }.getType());
|
|
|
+ reportScoreViewDto = new ReportScoreViewDto(failCount, failRate, scoreRangeViewDtoList);
|
|
|
+ }
|
|
|
+ return reportScoreViewDto;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取计算参数
|
|
|
+ *
|
|
|
+ * @param trBasicInfo
|
|
|
+ * @param paperStructResultList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> getReportCalculateParams(TRBasicInfo trBasicInfo, List<PaperStructResult> paperStructResultList) {
|
|
|
+ Map<String, Object> paramsMap = new HashMap<>();
|
|
|
+ //查询考生数据
|
|
|
+ List<FinalScoreResult> finalScoreResultList = tcFinalScoreService.examStudentOverview(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber());//考生成绩
|
|
|
+ Map<String, List<Double>> usualScoreMap = new LinkedHashMap<>();//汇总平常成绩分数(用来算最高分,最低分,平均分)
|
|
|
+ Map<Long, List<Double>> finalScoreTargetMap = new LinkedHashMap<>();//汇总各课程目标期末考试分数(用来算最高分,最低分,平均分)
|
|
|
+ Map<String, Map<Long, Map<Long, DimensionDto>>> finalScoreExamStudentDimensionMap = new LinkedHashMap<>();//汇总考生课程目标-知识点
|
|
|
+ Map<Long, Map<Long, DimensionDto>> finalScoreExamStudentDimensionSumMap = new LinkedHashMap<>();//汇总考生课程目标-知识点总分
|
|
|
+
|
|
|
+ List<ReportExamStudentDto> examStudentList = null;//考生集合
|
|
|
+ Map<String, FinalScoreResult> finalScoreResultMap = null;//考生成绩map
|
|
|
+ Map<String, PaperStructResult> paperStructResultMap = null;//试卷蓝图map
|
|
|
+ Map<Long, CourseTargetWeightDto> targetMap = null;
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(finalScoreResultList)) {
|
|
|
+ //期末成绩明细map
|
|
|
+ paperStructResultMap = paperStructResultList.stream().collect(Collectors.toMap(k -> k.getMainNumber() + "-" + k.getSubNumber(), Function.identity(), (dto1, dto2) -> dto1));
|
|
|
+ finalScoreResultMap = finalScoreResultList.stream().collect(Collectors.toMap(FinalScoreResult::getStudentCode, Function.identity(), (dto1, dto2) -> dto1));
|
|
|
+
|
|
|
+ examStudentList = new ArrayList<>(finalScoreResultList.size());
|
|
|
+ targetMap = new LinkedHashMap<>();
|
|
|
+ for (FinalScoreResult finalScoreResult : finalScoreResultList) {
|
|
|
+ //解析期末成绩知识点
|
|
|
+ JSONArray finalScoreDetailJsonArray = JSONArray.parseArray(finalScoreResult.getFinalScoreDetail());
|
|
|
+ for (int i = 0; i < finalScoreDetailJsonArray.size(); i++) {
|
|
|
+ JSONObject jsonObject = finalScoreDetailJsonArray.getJSONObject(i);
|
|
|
+ Double score = Objects.nonNull(jsonObject.get("score")) ? Double.parseDouble(jsonObject.get("score").toString()) : 0d;
|
|
|
+ PaperStructResult paperStructResult = paperStructResultMap.get(jsonObject.get("name").toString());
|
|
|
+ if (Objects.nonNull(paperStructResult)) {
|
|
|
+ List<CourseTargetDto> courseTargetDtoList = paperStructResult.getTargetList();
|
|
|
+
|
|
|
+ for (CourseTargetDto courseTargetDto : courseTargetDtoList) {
|
|
|
+ targetMap.put(courseTargetDto.getTargetId(), new CourseTargetWeightDto(courseTargetDto.getTargetId(), courseTargetDto.getTargetName()));
|
|
|
+
|
|
|
+ //课程目标
|
|
|
+ if (!finalScoreTargetMap.containsKey(courseTargetDto.getTargetId())) {
|
|
|
+ finalScoreTargetMap.put(courseTargetDto.getTargetId(), new ArrayList<>(Arrays.asList(score)));
|
|
|
+ } else {
|
|
|
+ List<Double> list = finalScoreTargetMap.get(courseTargetDto.getTargetId());
|
|
|
+ list.add(score);
|
|
|
+ finalScoreTargetMap.put(courseTargetDto.getTargetId(), list);
|
|
|
+ }
|
|
|
+ //知识点
|
|
|
+ List<DimensionDto> dimensionDtoList = courseTargetDto.getDimensionList();
|
|
|
+ for (DimensionDto dimensionDto : dimensionDtoList) {
|
|
|
+ //考生知识点
|
|
|
+ if (!finalScoreExamStudentDimensionMap.containsKey(finalScoreResult.getStudentCode())) {
|
|
|
+ Map<Long, Map<Long, DimensionDto>> map = new LinkedHashMap<>();
|
|
|
+ Map<Long, DimensionDto> dimensionMap = new LinkedHashMap<>();
|
|
|
+ dimensionMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
|
|
|
+ map.put(courseTargetDto.getTargetId(), dimensionMap);
|
|
|
+ finalScoreExamStudentDimensionMap.put(finalScoreResult.getStudentCode(), map);
|
|
|
+ } else {
|
|
|
+ Map<Long, Map<Long, DimensionDto>> map = finalScoreExamStudentDimensionMap.get(finalScoreResult.getStudentCode());
|
|
|
+ if (!map.containsKey(courseTargetDto.getTargetId())) {
|
|
|
+ Map<Long, DimensionDto> dimensionMap = new LinkedHashMap<>();
|
|
|
+ dimensionMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
|
|
|
+ map.put(courseTargetDto.getTargetId(), dimensionMap);
|
|
|
+ } else {
|
|
|
+ Map<Long, DimensionDto> dimensionMap = map.get(courseTargetDto.getTargetId());
|
|
|
+ if (!dimensionMap.containsKey(dimensionDto.getDimensionId())) {
|
|
|
+ dimensionMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
|
|
|
+ } else {
|
|
|
+ DimensionDto dimensionDtoTemp = dimensionMap.get(dimensionDto.getDimensionId());
|
|
|
+ dimensionDtoTemp.setDimensionScore(dimensionDtoTemp.getDimensionScore().doubleValue() + score.doubleValue());
|
|
|
+ }
|
|
|
+ map.put(courseTargetDto.getTargetId(), dimensionMap);
|
|
|
+ }
|
|
|
+ finalScoreExamStudentDimensionMap.put(finalScoreResult.getStudentCode(), map);
|
|
|
+ }
|
|
|
+
|
|
|
+ //目标-考生知识点总分
|
|
|
+ if (!finalScoreExamStudentDimensionSumMap.containsKey(courseTargetDto.getTargetId())) {
|
|
|
+ Map<Long, DimensionDto> dimensionMap = new LinkedHashMap<>();
|
|
|
+ dimensionMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
|
|
|
+ finalScoreExamStudentDimensionSumMap.put(courseTargetDto.getTargetId(), dimensionMap);
|
|
|
+ } else {
|
|
|
+ Map<Long, DimensionDto> dimensionMap = finalScoreExamStudentDimensionSumMap.get(courseTargetDto.getTargetId());
|
|
|
+ if (!dimensionMap.containsKey(dimensionDto.getDimensionId())) {
|
|
|
+ dimensionMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
|
|
|
+ } else {
|
|
|
+ DimensionDto dimensionDtoTemp = dimensionMap.get(dimensionDto.getDimensionId());
|
|
|
+ dimensionDtoTemp.setDimensionScore(dimensionDtoTemp.getDimensionScore().doubleValue() + score.doubleValue());
|
|
|
+ dimensionMap.put(dimensionDto.getDimensionId(), dimensionDtoTemp);
|
|
|
+ }
|
|
|
+ finalScoreExamStudentDimensionSumMap.put(courseTargetDto.getTargetId(), dimensionMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //解析平时作业分数图
|
|
|
+ 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));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ paramsMap.put("finalScoreResultList", finalScoreResultList);
|
|
|
+ paramsMap.put("usualScoreMap", usualScoreMap);
|
|
|
+ paramsMap.put("finalScoreTargetMap", finalScoreTargetMap);
|
|
|
+ paramsMap.put("finalScoreExamStudentDimensionMap", finalScoreExamStudentDimensionMap);
|
|
|
+ paramsMap.put("finalScoreExamStudentDimensionSumMap", finalScoreExamStudentDimensionSumMap);
|
|
|
+ paramsMap.put("examStudentList", examStudentList);
|
|
|
+ paramsMap.put("finalScoreResultMap", finalScoreResultMap);
|
|
|
+ paramsMap.put("paperStructResultMap", paperStructResultMap);
|
|
|
+ paramsMap.put("targetMap", targetMap);
|
|
|
+ paramsMap.put("paperStructResultList", paperStructResultList);
|
|
|
+ return paramsMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算报告中的各最大分最小分平均分总分
|
|
|
+ *
|
|
|
+ * @param paramsMap
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> reportCalculateMaxMinAvgSumScore(Map<String, Object> paramsMap) {
|
|
|
+ Map<String, List<Double>> usualScoreMap = (Map<String, List<Double>>) paramsMap.get("usualScoreMap");
|
|
|
+ Map<Long, List<Double>> finalScoreTargetMap = (Map<Long, List<Double>>) paramsMap.get("finalScoreTargetMap");
|
|
|
+ List<FinalScoreResult> finalScoreResultList = (List<FinalScoreResult>) paramsMap.get("finalScoreResultList");
|
|
|
+
|
|
|
+ Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap = new LinkedHashMap<>();//整体平常成绩分数图
|
|
|
+ Map<Long, FinalScoreOverviewDto> finalScoreOverviewDtoMap = new LinkedHashMap<>();//各课程目标期末考试分数图
|
|
|
+
|
|
|
+ //计算平常成绩最高分,最低分,平均分
|
|
|
+ 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();
|
|
|
+ Double sumScore = v.stream().mapToDouble(Double::doubleValue).sum();
|
|
|
+ usualScoreOverviewDtoMap.put(k, new UsualScoreOverviewDto(k, maxScore, minScore, avgScore, sumScore));
|
|
|
+ });
|
|
|
+
|
|
|
+ //计算各课程目标期末考试最高分,最低分,平均分
|
|
|
+ finalScoreTargetMap.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();
|
|
|
+ Double sumScore = v.stream().mapToDouble(Double::doubleValue).sum();
|
|
|
+ Double avgScore = new BigDecimal(sumScore).divide(new BigDecimal(finalScoreResultList.size()), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
+ finalScoreOverviewDtoMap.put(k, new FinalScoreOverviewDto(k, maxScore, minScore, avgScore, sumScore));
|
|
|
+ });
|
|
|
+
|
|
|
+ paramsMap.put("usualScoreOverviewDtoMap", usualScoreOverviewDtoMap);
|
|
|
+ paramsMap.put("finalScoreOverviewDtoMap", finalScoreOverviewDtoMap);
|
|
|
+ return paramsMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算课程达成度考生明细
|
|
|
+ *
|
|
|
+ * @param paramsMap
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ReportCourseEvaluationResultDto reportCalculateCourseEvaluationResult(Map<String, Object> paramsMap) {
|
|
|
+ ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = null;
|
|
|
+ List<PaperStructResult> paperStructResultList = (List<PaperStructResult>) paramsMap.get("paperStructResultList");
|
|
|
+ Map<Long, CourseTargetWeightDto> targetMap = (Map<Long, CourseTargetWeightDto>) paramsMap.get("targetMap");
|
|
|
+ Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap = (Map<String, UsualScoreOverviewDto>) paramsMap.get("usualScoreOverviewDtoMap");
|
|
|
+ Map<Long, FinalScoreOverviewDto> finalScoreOverviewDtoMap = (Map<Long, FinalScoreOverviewDto>) paramsMap.get("finalScoreOverviewDtoMap");
|
|
|
+
|
|
|
+ //TODO 课程考核成绩评价结果-待曹子轩补充目标/评价方式数据,有测试数据
|
|
|
+ if (!CollectionUtils.isEmpty(paperStructResultList)) {
|
|
|
+ List<CourseTargetDto> targetList = new ArrayList<>(targetMap.size());
|
|
|
+ AtomicInteger sequenceId = new AtomicInteger(1);//流程连接id
|
|
|
+ AtomicReference<Double> targetValue = new AtomicReference<>(0.0d);
|
|
|
+ targetMap.forEach((k, v) -> {
|
|
|
+ Double evaluationValue = 0.0d;
|
|
|
+ List<ReportEvaluationDto> reportEvaluationDtoList = new ArrayList<>();
|
|
|
+ UsualScoreOverviewDto usualScoreOverviewDto = usualScoreOverviewDtoMap.get("作业" + sequenceId.get());
|
|
|
+ FinalScoreOverviewDto finalScoreOverviewDto = finalScoreOverviewDtoMap.get(k);
|
|
|
+
|
|
|
+ ReportEvaluationDto reportEvaluationDto = new ReportEvaluationDto(usualScoreOverviewDto.getName(), new BigDecimal(30), 40d, usualScoreOverviewDto.getAvgScore());
|
|
|
+ reportEvaluationDtoList.add(reportEvaluationDto);
|
|
|
+
|
|
|
+ //课程目标-平时作业达成度计算
|
|
|
+ if (Objects.nonNull(reportEvaluationDto.getWeight()) && reportEvaluationDto.getWeight().doubleValue() > 0d) {
|
|
|
+ Double evaluationValueTemp = new BigDecimal(reportEvaluationDto.getAvg().doubleValue() + reportEvaluationDto.getScore().doubleValue()).divide(reportEvaluationDto.getWeight(), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
+ evaluationValue = evaluationValue.doubleValue() + evaluationValueTemp.doubleValue();
|
|
|
+ Map<String, BigDecimal> usualScoreWeight = v.getUsualScoreWeight();
|
|
|
+ usualScoreWeight = CollectionUtils.isEmpty(usualScoreWeight) ? new LinkedHashMap<>() : usualScoreWeight;
|
|
|
+ usualScoreWeight.put(reportEvaluationDto.getName(), reportEvaluationDto.getWeight().add(new BigDecimal(new Random().nextInt(10))));
|
|
|
+ v.setUsualScoreWeight(usualScoreWeight);
|
|
|
+ }
|
|
|
+
|
|
|
+ ReportEvaluationDto reportEvaluationDto1 = new ReportEvaluationDto("期末考试", new BigDecimal(70), 60d, finalScoreOverviewDto.getAvgScore());
|
|
|
+ reportEvaluationDtoList.add(reportEvaluationDto1);
|
|
|
+
|
|
|
+ //课程目标-期末成绩达成度计算
|
|
|
+ if (Objects.nonNull(reportEvaluationDto1.getWeight()) && reportEvaluationDto1.getWeight().doubleValue() > 0d) {
|
|
|
+ Double evaluationValueTemp = new BigDecimal(reportEvaluationDto1.getAvg().doubleValue() + reportEvaluationDto1.getScore().doubleValue()).divide(reportEvaluationDto1.getWeight(), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
+ evaluationValue = evaluationValue.doubleValue() + evaluationValueTemp.doubleValue();
|
|
|
+ v.setFinalScoreWeight(reportEvaluationDto1.getWeight().subtract(new BigDecimal(new Random().nextInt(10))));
|
|
|
+ }
|
|
|
+
|
|
|
+ CourseTargetDto courseTargetDto = new CourseTargetDto(k, v.getTargetName(), Long.parseLong(String.valueOf(sequenceId.get())), "评价方式" + sequenceId.get(), "评价方式描述" + sequenceId.get(), reportEvaluationDtoList, evaluationValue);
|
|
|
+ targetList.add(courseTargetDto);
|
|
|
+ targetValue.set(targetValue.get().doubleValue() + courseTargetDto.getEvaluationValue().doubleValue());
|
|
|
+ sequenceId.incrementAndGet();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return reportCourseEvaluationResultDto;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算分数范围
|
|
|
+ *
|
|
|
+ * @param finalScoreDto
|
|
|
+ * @param examId
|
|
|
+ * @param paperNumber
|
|
|
+ * @param markPaper
|
|
|
+ */
|
|
|
+ protected void fillScoreRange(FinalScoreDto finalScoreDto, Long examId, String paperNumber, MarkPaper markPaper) {
|
|
|
+ //分数区间
|
|
|
+ Double passScore = markPaper.getPassScore();//及格分
|
|
|
+ Objects.requireNonNull(passScore, "及格分为空");
|
|
|
+
|
|
|
+ Double totalScore = markPaper.getTotalScore();
|
|
|
+ Objects.requireNonNull(totalScore, "试卷满分为空");
|
|
|
+
|
|
|
+ List<ScoreRangeVo> scoreRange = new ArrayList<>();
|
|
|
+ finalScoreDto.setScoreRange(scoreRange);
|
|
|
+
|
|
|
+ //开始、结束分数区间
|
|
|
+ Double startInterval = 0.5d, endInterval = 9.5d, increaseStartScore = passScore - startInterval,
|
|
|
+ increaseEndScore = increaseStartScore + startInterval + endInterval;
|
|
|
+ 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(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, increaseStartScore, increaseEndScore));
|
|
|
+ } else {
|
|
|
+ while (increaseEndScore.doubleValue() < totalScore.doubleValue()) {
|
|
|
+ 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(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, increaseStartScore, increaseEndScore));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算分数比率
|
|
|
+ *
|
|
|
+ * @param toltal
|
|
|
+ * @param examId
|
|
|
+ * @param courseCode
|
|
|
+ * @param paperNumber
|
|
|
+ * @param start
|
|
|
+ * @param end
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ return new ScoreRangeVo(count, start, end, rate);
|
|
|
+ }
|
|
|
}
|