Browse Source

测试报告

wangliang 1 năm trước cách đây
mục cha
commit
829e6a1c28

+ 13 - 13
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/ReportCourseEvaluationResultDetailDto.java

@@ -17,8 +17,8 @@ public class ReportCourseEvaluationResultDetailDto implements Serializable {
     @ApiModelProperty(value = "考生集合")
     private List<ReportExamStudentDto> examStudentList;
 
-    @ApiModelProperty(value = "课程目标达成评价值图")
-    private List<ReportCourseTargetViewDto> courseTargetList;
+//    @ApiModelProperty(value = "课程目标达成评价值图")
+//    private List<ReportCourseTargetViewDto> courseTargetList;
 
     public ReportCourseEvaluationResultDetailDto() {
 
@@ -28,10 +28,10 @@ public class ReportCourseEvaluationResultDetailDto implements Serializable {
         this.examStudentList = examStudentList;
     }
 
-    public ReportCourseEvaluationResultDetailDto(List<ReportExamStudentDto> examStudentList, List<ReportCourseTargetViewDto> courseTargetList) {
-        this.examStudentList = examStudentList;
-        this.courseTargetList = courseTargetList;
-    }
+//    public ReportCourseEvaluationResultDetailDto(List<ReportExamStudentDto> examStudentList, List<ReportCourseTargetViewDto> courseTargetList) {
+//        this.examStudentList = examStudentList;
+//        this.courseTargetList = courseTargetList;
+//    }
 
     public List<ReportExamStudentDto> getExamStudentList() {
         return examStudentList;
@@ -41,11 +41,11 @@ public class ReportCourseEvaluationResultDetailDto implements Serializable {
         this.examStudentList = examStudentList;
     }
 
-    public List<ReportCourseTargetViewDto> getCourseTargetList() {
-        return courseTargetList;
-    }
-
-    public void setCourseTargetList(List<ReportCourseTargetViewDto> courseTargetList) {
-        this.courseTargetList = courseTargetList;
-    }
+//    public List<ReportCourseTargetViewDto> getCourseTargetList() {
+//        return courseTargetList;
+//    }
+//
+//    public void setCourseTargetList(List<ReportCourseTargetViewDto> courseTargetList) {
+//        this.courseTargetList = courseTargetList;
+//    }
 }

+ 64 - 64
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/ReportCourseTargetViewDto.java

@@ -1,64 +1,64 @@
-package com.qmth.distributed.print.business.bean.dto.report;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @Description: 报告课程考核成绩评价明细结果dto
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2024/2/26
- */
-public class ReportCourseTargetViewDto implements Serializable {
-
-    @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "课程目标id")
-    private Long targetId;
-
-    @ApiModelProperty(value = "课程目标名称")
-    private String targetName;
-
-    @ApiModelProperty(value = "平时成绩")
-    private Double usualScore;
-
-    @ApiModelProperty(value = "期末成绩")
-    private Double finalScore;
-
-    public Long getTargetId() {
-        return targetId;
-    }
-
-    public void setTargetId(Long targetId) {
-        this.targetId = targetId;
-    }
-
-    public String getTargetName() {
-        return targetName;
-    }
-
-    public void setTargetName(String targetName) {
-        this.targetName = targetName;
-    }
-
-    public Double getUsualScore() {
-        return usualScore;
-    }
-
-    public void setUsualScore(Double usualScore) {
-        this.usualScore = usualScore;
-    }
-
-    public Double getFinalScore() {
-        return finalScore;
-    }
-
-    public void setFinalScore(Double finalScore) {
-        this.finalScore = finalScore;
-    }
-}
+//package com.qmth.distributed.print.business.bean.dto.report;
+//
+//import com.fasterxml.jackson.annotation.JsonInclude;
+//import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+//import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+//import io.swagger.annotations.ApiModelProperty;
+//
+//import java.io.Serializable;
+//import java.util.List;
+//
+///**
+// * @Description: 报告课程考核成绩评价明细结果dto
+// * @Param:
+// * @return:
+// * @Author: wangliang
+// * @Date: 2024/2/26
+// */
+//public class ReportCourseTargetViewDto implements Serializable {
+//
+//    @JsonSerialize(using = ToStringSerializer.class)
+//    @ApiModelProperty(value = "课程目标id")
+//    private Long targetId;
+//
+//    @ApiModelProperty(value = "课程目标名称")
+//    private String targetName;
+//
+//    @ApiModelProperty(value = "平时成绩")
+//    private Double usualScore;
+//
+//    @ApiModelProperty(value = "期末成绩")
+//    private Double finalScore;
+//
+//    public Long getTargetId() {
+//        return targetId;
+//    }
+//
+//    public void setTargetId(Long targetId) {
+//        this.targetId = targetId;
+//    }
+//
+//    public String getTargetName() {
+//        return targetName;
+//    }
+//
+//    public void setTargetName(String targetName) {
+//        this.targetName = targetName;
+//    }
+//
+//    public Double getUsualScore() {
+//        return usualScore;
+//    }
+//
+//    public void setUsualScore(Double usualScore) {
+//        this.usualScore = usualScore;
+//    }
+//
+//    public Double getFinalScore() {
+//        return finalScore;
+//    }
+//
+//    public void setFinalScore(Double finalScore) {
+//        this.finalScore = finalScore;
+//    }
+//}

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/ReportExamStudentDto.java

@@ -1,6 +1,9 @@
 package com.qmth.distributed.print.business.bean.dto.report;
 
+import com.google.gson.reflect.TypeToken;
 import com.qmth.distributed.print.business.bean.result.FinalScoreResult;
+import com.qmth.distributed.print.business.entity.TRExamStudent;
+import com.qmth.teachcloud.common.util.GsonUtil;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
@@ -34,6 +37,14 @@ public class ReportExamStudentDto implements Serializable {
 
     }
 
+    public ReportExamStudentDto(TRExamStudent trExamStudent) {
+        this.name = trExamStudent.getName();
+        this.studentCode = trExamStudent.getStudentCode();
+        this.score = trExamStudent.getScore();
+        this.targetList = GsonUtil.fromJson(trExamStudent.getResultDetail(), new TypeToken<List<ReportExamStudentTargetDto>>() {
+        }.getType());
+    }
+
     public ReportExamStudentDto(String name, String studentCode, Double score) {
         this.name = name;
         this.studentCode = studentCode;

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TRExamStudent.java

@@ -2,6 +2,9 @@ package com.qmth.distributed.print.business.entity;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.bean.dto.report.ReportExamStudentDto;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.util.JacksonUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -43,6 +46,19 @@ public class TRExamStudent implements Serializable {
     @ApiModelProperty(value = "考生课程考核成绩评价明细结果")
     private String resultDetail;
 
+    public TRExamStudent() {
+
+    }
+
+    public TRExamStudent(Long rBasicInfoId, ReportExamStudentDto reportExamStudentDto) {
+        this.id = SystemConstant.getDbUuid();
+        this.rBasicInfoId = rBasicInfoId;
+        this.name = reportExamStudentDto.getName();
+        this.studentCode = reportExamStudentDto.getStudentCode();
+        this.score = reportExamStudentDto.getScore();
+        this.resultDetail = JacksonUtil.parseJson(reportExamStudentDto.getTargetList());
+    }
+
     public Double getScore() {
         return score;
     }

+ 31 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TRExamStudentService.java

@@ -1,7 +1,17 @@
 package com.qmth.distributed.print.business.service;
 
-import com.qmth.distributed.print.business.entity.TRExamStudent;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.dto.report.CourseTargetWeightDto;
+import com.qmth.distributed.print.business.bean.dto.report.DimensionDto;
+import com.qmth.distributed.print.business.bean.dto.report.ReportExamStudentDto;
+import com.qmth.distributed.print.business.bean.dto.report.UsualScoreOverviewDto;
+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.entity.TRExamStudent;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -13,4 +23,24 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface TRExamStudentService extends IService<TRExamStudent> {
 
+    /**
+     * 获取考生详细报告
+     *
+     * @param trBasicInfo
+     * @param examStudentList
+     * @param finalScoreExamStudentDimensionMap
+     * @param finalScoreResultMap
+     * @param paperStructResultMap
+     * @param targetMap
+     * @param finalScoreExamStudentDimensionSumMap
+     * @param usualScoreOverviewDtoMap
+     * @return
+     */
+    public List<ReportExamStudentDto> getExamStudentReportDetail(TRBasicInfo trBasicInfo, List<ReportExamStudentDto> examStudentList,
+                                                                 Map<String, Map<Long, Map<Long, DimensionDto>>> finalScoreExamStudentDimensionMap,
+                                                                 Map<String, FinalScoreResult> finalScoreResultMap,
+                                                                 Map<String, PaperStructResult> paperStructResultMap,
+                                                                 Map<Long, CourseTargetWeightDto> targetMap,
+                                                                 Map<Long, Map<Long, DimensionDto>> finalScoreExamStudentDimensionSumMap,
+                                                                 Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap);
 }

+ 131 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TRExamStudentServiceImpl.java

@@ -1,10 +1,24 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.entity.TRExamStudent;
 import com.qmth.distributed.print.business.mapper.TRExamStudentMapper;
 import com.qmth.distributed.print.business.service.TRExamStudentService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +31,120 @@ import org.springframework.stereotype.Service;
 @Service
 public class TRExamStudentServiceImpl extends ServiceImpl<TRExamStudentMapper, TRExamStudent> implements TRExamStudentService {
 
+    /**
+     * 获取考生详细报告
+     *
+     * @param trBasicInfo
+     * @param examStudentList
+     * @param finalScoreExamStudentDimensionMap
+     * @param finalScoreResultMap
+     * @param paperStructResultMap
+     * @param targetMap
+     * @param finalScoreExamStudentDimensionSumMap
+     * @param usualScoreOverviewDtoMap
+     * @return
+     */
+    @Override
+    @Transactional
+    public List<ReportExamStudentDto> getExamStudentReportDetail(TRBasicInfo trBasicInfo, List<ReportExamStudentDto> examStudentList,
+                                                                 Map<String, Map<Long, Map<Long, DimensionDto>>> finalScoreExamStudentDimensionMap,
+                                                                 Map<String, FinalScoreResult> finalScoreResultMap,
+                                                                 Map<String, PaperStructResult> paperStructResultMap,
+                                                                 Map<Long, CourseTargetWeightDto> targetMap,
+                                                                 Map<Long, Map<Long, DimensionDto>> finalScoreExamStudentDimensionSumMap,
+                                                                 Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap) {
+        if (!CollectionUtils.isEmpty(examStudentList)) {
+            List<TRExamStudent> trExamStudentList = new ArrayList<>(examStudentList.size());
+            for (ReportExamStudentDto reportExamStudentDto : examStudentList) {
+                Map<Long, Map<Long, DimensionDto>> map = finalScoreExamStudentDimensionMap.get(reportExamStudentDto.getStudentCode());
+                FinalScoreResult finalScoreResult = finalScoreResultMap.get(reportExamStudentDto.getStudentCode());
+                JSONArray finalScoreDetailJsonArray = JSONArray.parseArray(finalScoreResult.getFinalScoreDetail());
+                Map<String, ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoMap = null;
+                if (Objects.nonNull(finalScoreResult.getUsualScore())) {
+                    //计算平时作业
+                    List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = JSONArray.parseArray(finalScoreResult.getUsualScore(), ReportExamStudentUsualScoreObjDto.class);
+                    reportExamStudentUsualScoreObjDtoMap = reportExamStudentUsualScoreObjDtoList.stream().collect(Collectors.toMap(ReportExamStudentUsualScoreObjDto::getName, Function.identity(), (dto1, dto2) -> dto1));
+                }
+                //计算期末考试知识点分数
+                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) {
+                            Map<Long, DimensionDto> dimensionDtoMap = map.get(courseTargetDto.getTargetId());
+                            List<DimensionDto> dimensionDtoList = new ArrayList<>(dimensionDtoMap.values());
+                            if (CollectionUtils.isEmpty(reportExamStudentDto.getTargetList())) {
+                                List<ReportExamStudentTargetDto> targetList = new ArrayList<>();
+                                ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = null;
+                                ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = new ReportExamStudentFinalScoreDto(targetMap.get(courseTargetDto.getTargetId()).getFinalScoreWeight(), dimensionDtoList);
+                                if (!CollectionUtils.isEmpty(reportExamStudentUsualScoreObjDtoMap) && reportExamStudentUsualScoreObjDtoMap.containsKey("作业" + courseTargetDto.getTargetId())) {
+                                    if (Objects.nonNull(targetMap.get(courseTargetDto.getTargetId())) && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight())
+                                            && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()))) {
+                                        ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto = reportExamStudentUsualScoreObjDtoMap.get("作业" + courseTargetDto.getTargetId());
+                                        reportExamStudentUsualScoreDto = new ReportExamStudentUsualScoreDto(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()), Arrays.asList(reportExamStudentUsualScoreObjDto));
+                                    }
+                                }
+                                targetList.add(new ReportExamStudentTargetDto(courseTargetDto.getTargetId(), courseTargetDto.getTargetName(), reportExamStudentFinalScoreDto, reportExamStudentUsualScoreDto));
+                                reportExamStudentDto.setTargetList(targetList);
+                            } else {
+                                List<ReportExamStudentTargetDto> targetList = reportExamStudentDto.getTargetList();
+                                Map<Long, ReportExamStudentTargetDto> reportExamStudentTargetDtoMap = targetList.stream().collect(Collectors.toMap(ReportExamStudentTargetDto::getTargetId, Function.identity(), (dto1, dto2) -> dto1));
+                                if (!reportExamStudentTargetDtoMap.containsKey(courseTargetDto.getTargetId())) {
+                                    ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = null;
+                                    if (!CollectionUtils.isEmpty(reportExamStudentUsualScoreObjDtoMap) && reportExamStudentUsualScoreObjDtoMap.containsKey("作业" + courseTargetDto.getTargetId())) {
+                                        if (Objects.nonNull(targetMap.get(courseTargetDto.getTargetId())) && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight())
+                                                && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()))) {
+                                            ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto = reportExamStudentUsualScoreObjDtoMap.get("作业" + courseTargetDto.getTargetId());
+                                            reportExamStudentUsualScoreDto = new ReportExamStudentUsualScoreDto(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()), Arrays.asList(reportExamStudentUsualScoreObjDto));
+                                        }
+                                    }
+                                    targetList.add(new ReportExamStudentTargetDto(courseTargetDto.getTargetId(), courseTargetDto.getTargetName(), new ReportExamStudentFinalScoreDto(targetMap.get(courseTargetDto.getTargetId()).getFinalScoreWeight(), dimensionDtoList), reportExamStudentUsualScoreDto));
+                                }
+                            }
+                        }
+                    }
+                }
+                trExamStudentList.add(new TRExamStudent(trBasicInfo.getId(), reportExamStudentDto));
+            }
+            //加入平均分
+            Double avgScore = new BigDecimal(examStudentList.stream().mapToDouble(ReportExamStudentDto::getScore).average().orElse(0d)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+            ReportExamStudentDto reportExamStudentDto = new ReportExamStudentDto("平均分", "平均分", avgScore);
+            List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = new ArrayList<>();
+            reportExamStudentTargetDtoList.addAll(examStudentList.get(0).getTargetList());
+
+            BigDecimal size = new BigDecimal(examStudentList.size());
+            ReportExamStudentFinalScoreDto finalScoreAvgDto = reportExamStudentTargetDtoList.get(0).getFinalScore();
+            Map<Long, DimensionDto> dimensionFinalScoreDtoMap = finalScoreExamStudentDimensionSumMap.get(reportExamStudentTargetDtoList.get(0).getTargetId());
+            List<DimensionDto> dimensionFinalScoreDtoList = finalScoreAvgDto.getDimensionList();
+            for (DimensionDto dimensionFinalScoreDto : dimensionFinalScoreDtoList) {
+                if (dimensionFinalScoreDtoMap.containsKey(dimensionFinalScoreDto.getDimensionId())) {
+                    DimensionDto dimensionDto = dimensionFinalScoreDtoMap.get(dimensionFinalScoreDto.getDimensionId());
+                    Double avg = new BigDecimal(dimensionFinalScoreDto.getDimensionScore()).divide(size, 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                    dimensionFinalScoreDto.setDimensionScore(avg);
+                } else {
+                    dimensionFinalScoreDto.setDimensionScore(0d);
+                }
+            }
+
+            ReportExamStudentUsualScoreDto usualScoreAvgDto = reportExamStudentTargetDtoList.get(0).getUsualScore();
+            List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = usualScoreAvgDto.getScoreList();
+            for (ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto : reportExamStudentUsualScoreObjDtoList) {
+                if (usualScoreOverviewDtoMap.containsKey(reportExamStudentUsualScoreObjDto.getName())) {
+                    UsualScoreOverviewDto usualScoreOverviewDto = usualScoreOverviewDtoMap.get(reportExamStudentUsualScoreObjDto.getName());
+                    Double avg = new BigDecimal(usualScoreOverviewDto.getSumScore()).divide(size, 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                    reportExamStudentUsualScoreObjDto.setScore(avg);
+                } else {
+                    reportExamStudentUsualScoreObjDto.setScore(0d);
+                }
+            }
+            reportExamStudentDto.setTargetList(reportExamStudentTargetDtoList);
+            examStudentList.add(reportExamStudentDto);
+
+            trExamStudentList.add(new TRExamStudent(trBasicInfo.getId(), reportExamStudentDto));
+            this.remove(new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
+            this.saveBatch(trExamStudentList);
+        }
+        return examStudentList;
+    }
 }

+ 193 - 287
distributed-print/src/main/java/com/qmth/distributed/print/api/TRBasicInfoController.java

@@ -14,6 +14,7 @@ import com.qmth.distributed.print.business.bean.result.report.PaperStructResult;
 import com.qmth.distributed.print.business.bean.result.report.ReportResult;
 import com.qmth.distributed.print.business.entity.TCPaperStruct;
 import com.qmth.distributed.print.business.entity.TRBasicInfo;
+import com.qmth.distributed.print.business.entity.TRExamStudent;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -82,6 +83,9 @@ public class TRBasicInfoController {
     @Resource
     TCFinalScoreService tcFinalScoreService;
 
+    @Resource
+    TRExamStudentService trExamStudentService;
+
     @ApiOperation(value = "报告管理列表")
     @RequestMapping(value = "/report/list", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
@@ -106,6 +110,11 @@ public class TRBasicInfoController {
 
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         TRBasicInfo trBasicInfo = trBasicInfoService.getOne(new QueryWrapper<TRBasicInfo>().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
+
+        ReportCourseBasicInfoDto reportCourseBasicInfoDto = null;//课程基本情况
+        ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = null;//课程目标考核分布
+        ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = null;//课程考核成绩评价结果
+        ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = null;//课程目标达成评价明细结果
         if (Objects.isNull(trBasicInfo)) {
             BasicExam basicExam = basicExamService.getById(examId);
             Objects.requireNonNull(basicExam, "未找到考试信息");
@@ -115,337 +124,234 @@ public class TRBasicInfoController {
 
             //TODO 有测试数据,待肖飞补充授课对象和任课老师数据
             trBasicInfo = new TRBasicInfo(examId, courseCode, markPaper.getCourseName(), paperNumber, basicSemester.getName(), "测试班级1", "测试老师1", 40, sysUser.getId());
-        }
-        //测试数据
 
-        //公共信息
-        ReportCommonDto reportCommonDto = new ReportCommonDto(examId, courseCode, markPaper.getCourseName(), paperNumber);
-        //课程基本情况
-        ReportCourseBasicInfoDto reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
+            //测试数据
+            //课程基本情况
+            reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
 
-        //课程目标考核分布-题目信息
-        TCPaperStruct tcPaperStruct = tcPaperStructService.getOne(new QueryWrapper<TCPaperStruct>().lambda().eq(TCPaperStruct::getExamId, examId).eq(TCPaperStruct::getCourseCode, courseCode).eq(TCPaperStruct::getPaperNumber, paperNumber));
-        Objects.requireNonNull(tcPaperStruct, "未找到试卷蓝图信息");
+            //课程目标考核分布-题目信息
+            TCPaperStruct tcPaperStruct = tcPaperStructService.getOne(new QueryWrapper<TCPaperStruct>().lambda().eq(TCPaperStruct::getExamId, examId).eq(TCPaperStruct::getCourseCode, courseCode).eq(TCPaperStruct::getPaperNumber, paperNumber));
+            Objects.requireNonNull(tcPaperStruct, "未找到试卷蓝图信息");
 
-        List<PaperStructResult> paperStructResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStruct(), new TypeToken<List<PaperStructResult>>() {
-        }.getType());
+            List<PaperStructResult> paperStructResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStruct(), new TypeToken<List<PaperStructResult>>() {
+            }.getType());
 
-        Map<Long, CourseTargetWeightDto> targetMap = new LinkedHashMap<>();//课程目标map
-        ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = new ReportCourseEvaluationSpreadDto(paperStructResultList);
+            Map<Long, CourseTargetWeightDto> targetMap = new LinkedHashMap<>();//课程目标map
+            reportCourseEvaluationSpreadDto = new ReportCourseEvaluationSpreadDto(paperStructResultList);
 
-        //课程目标考核分布-分数图
-        FinalScoreDto finalScoreDto = tcFinalScoreService.finalScoreScoreOverView(examId, courseCode, paperNumber);
-        Objects.requireNonNull(finalScoreDto, "未找到期末成绩分数信息");
+            //课程目标考核分布-分数图
+            FinalScoreDto finalScoreDto = tcFinalScoreService.finalScoreScoreOverView(examId, courseCode, paperNumber);
+            Objects.requireNonNull(finalScoreDto, "未找到期末成绩分数信息");
 
-        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();
+            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();
 
-            scoreRangeVoList.remove(0);
-            List<ReportScoreRangeViewDto> scoreRangeViewDtoList = GsonUtil.fromJson(JacksonUtil.parseJson(scoreRangeVoList), new TypeToken<List<ReportScoreRangeViewDto>>() {
-            }.getType());
-            ReportScoreViewDto reportScoreViewDto = new ReportScoreViewDto(failCount, failRate, scoreRangeViewDtoList);
-            reportCourseEvaluationSpreadDto.setScoreList(reportScoreViewDto);
-        }
-        trBasicInfo.setCourseEvaluationSpread(JacksonUtil.parseJson(reportCourseEvaluationSpreadDto));
-
-        //查询考生数据
-        List<FinalScoreResult> finalScoreResultList = tcFinalScoreService.examStudentOverview(examId, courseCode, paperNumber);//考生成绩
-        Map<String, List<Double>> usualScoreMap = new LinkedHashMap<>();//汇总平常成绩分数(用来算最高分,最低分,平均分)
-        Map<Long, List<Double>> finalScoreTargetMap = new LinkedHashMap<>();//汇总各课程目标期末考试分数(用来算最高分,最低分,平均分)
-//        Map<Long, Map<Long, List<DimensionDto>>> finalScoreDimensionMap = new LinkedHashMap<>();//汇总知识点分数(用来算最高分,最低分,平均分)
-        Map<String, Map<Long, Map<Long, DimensionDto>>> finalScoreExamStudentDimensionMap = new LinkedHashMap<>();//汇总考生课程目标-知识点
-        Map<Long, Map<Long, DimensionDto>> finalScoreExamStudentDimensionSumMap = new LinkedHashMap<>();//汇总考生课程目标-知识点总分
-
-        Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap = new LinkedHashMap<>();//整体平常成绩分数图
-        Map<Long, FinalScoreOverviewDto> finalScoreOverviewDtoMap = new LinkedHashMap<>();//各课程目标期末考试分数图
-//        Map<Long, FinalScoreDimensionOverviewDto> finalScoreDimensionOverviewDtoMap = new LinkedHashMap<>();//各课程目标期末考试知识点分数图
-        List<ReportExamStudentDto> examStudentList = null;//考生集合
-        Map<String, FinalScoreResult> finalScoreResultMap = null;//考生成绩map
-        Map<String, PaperStructResult> paperStructResultMap = null;//试卷蓝图map
-        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());
-            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 (!finalScoreDimensionMap.containsKey(courseTargetDto.getTargetId())) {
-//                                    Map<Long, List<DimensionDto>> map = new LinkedHashMap<>();
-//                                    map.put(dimensionDto.getDimensionId(), new ArrayList<>(Arrays.asList(dimensionDto)));
-//                                    finalScoreDimensionMap.put(courseTargetDto.getTargetId(), map);
-//                                } else {
-//                                    Map<Long, List<DimensionDto>> map = finalScoreDimensionMap.get(courseTargetDto.getTargetId());
-//                                    if (!map.containsKey(dimensionDto.getDimensionId())) {
-//                                        map.put(dimensionDto.getDimensionId(), new ArrayList<>(Arrays.asList(dimensionDto)));
-//                                    } else {
-//                                        List<DimensionDto> list = map.get(dimensionDto.getDimensionId());
-//                                        list.add(dimensionDto);
-//                                        map.put(dimensionDto.getDimensionId(), list);
-//                                    }
-//                                    finalScoreDimensionMap.put(courseTargetDto.getTargetId(), map);
-//                                }
-
-                                //考生知识点
-                                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);
+                scoreRangeVoList.remove(0);
+                List<ReportScoreRangeViewDto> scoreRangeViewDtoList = GsonUtil.fromJson(JacksonUtil.parseJson(scoreRangeVoList), new TypeToken<List<ReportScoreRangeViewDto>>() {
+                }.getType());
+                ReportScoreViewDto reportScoreViewDto = new ReportScoreViewDto(failCount, failRate, scoreRangeViewDtoList);
+                reportCourseEvaluationSpreadDto.setScoreList(reportScoreViewDto);
+            }
+            trBasicInfo.setCourseEvaluationSpread(JacksonUtil.parseJson(reportCourseEvaluationSpreadDto));
+
+            //查询考生数据
+            List<FinalScoreResult> finalScoreResultList = tcFinalScoreService.examStudentOverview(examId, courseCode, paperNumber);//考生成绩
+            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<>();//汇总考生课程目标-知识点总分
+
+            Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap = new LinkedHashMap<>();//整体平常成绩分数图
+            Map<Long, FinalScoreOverviewDto> finalScoreOverviewDtoMap = new LinkedHashMap<>();//各课程目标期末考试分数图
+            List<ReportExamStudentDto> examStudentList = null;//考生集合
+            Map<String, FinalScoreResult> finalScoreResultMap = null;//考生成绩map
+            Map<String, PaperStructResult> paperStructResultMap = null;//试卷蓝图map
+            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());
+                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 {
-                                    Map<Long, Map<Long, DimensionDto>> map = finalScoreExamStudentDimensionMap.get(finalScoreResult.getStudentCode());
-                                    if (!map.containsKey(courseTargetDto.getTargetId())) {
+                                    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, DimensionDto> dimensionMap = map.get(courseTargetDto.getTargetId());
-                                        if (!dimensionMap.containsKey(dimensionDto.getDimensionId())) {
+                                        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 {
-                                            DimensionDto dimensionDtoTemp = dimensionMap.get(dimensionDto.getDimensionId());
-                                            dimensionDtoTemp.setDimensionScore(dimensionDtoTemp.getDimensionScore().doubleValue() + score.doubleValue());
+                                            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);
                                         }
-                                        map.put(courseTargetDto.getTargetId(), dimensionMap);
+                                        finalScoreExamStudentDimensionMap.put(finalScoreResult.getStudentCode(), map);
                                     }
-                                    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())) {
+                                    //目标-考生知识点总分
+                                    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 {
-                                        DimensionDto dimensionDtoTemp = dimensionMap.get(dimensionDto.getDimensionId());
-                                        dimensionDtoTemp.setDimensionScore(dimensionDtoTemp.getDimensionScore().doubleValue() + score.doubleValue());
-                                        dimensionMap.put(dimensionDto.getDimensionId(), dimensionDtoTemp);
+                                        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);
                                     }
-                                    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);
+                    //解析平时作业分数图
+                    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));
                     }
-                    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));
                 }
-                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();
-            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));
-        });
-
-        //计算各课程目标下期末考试知识点最高分,最低分,平均分
-//        finalScoreDimensionMap.forEach((k, v) -> {
-//            v.forEach((k1, v1) -> {
-//                Double maxScore = v1.stream().mapToDouble(DimensionDto::getDimensionScore).max().orElse(0d);
-//                Double minScore = v1.stream().mapToDouble(DimensionDto::getDimensionScore).min().orElse(0d);
-//                Double avgScore = new BigDecimal(v1.stream().mapToDouble(DimensionDto::getDimensionScore).average().orElse(0d)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-//                finalScoreDimensionOverviewDtoMap.put(k, new FinalScoreDimensionOverviewDto(k1, maxScore, minScore, avgScore));
-//            });
-//        });
-
-        //TODO 课程考核成绩评价结果-待曹子轩补充目标/评价方式数据,有测试数据
-        ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = null;
-        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);
-                }
+            //计算平常成绩最高分,最低分,平均分
+            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));
+            });
 
-                ReportEvaluationDto reportEvaluationDto1 = new ReportEvaluationDto("期末考试", new BigDecimal(70), 60d, finalScoreOverviewDto.getAvgScore());
-                reportEvaluationDtoList.add(reportEvaluationDto1);
+            //计算各课程目标期末考试最高分,最低分,平均分
+            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));
+            });
 
-                //课程目标-期末成绩达成度计算
-                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))));
-                }
+            //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);
+                    }
 
-                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();
-            });
-            reportCourseEvaluationResultDto = new ReportCourseEvaluationResultDto("测试课程总目标1", targetValue.get(), targetList);
-            trBasicInfo.setCourseEvaluationResult(JacksonUtil.parseJson(reportCourseEvaluationResultDto));
-        }
+                    ReportEvaluationDto reportEvaluationDto1 = new ReportEvaluationDto("期末考试", new BigDecimal(70), 60d, finalScoreOverviewDto.getAvgScore());
+                    reportEvaluationDtoList.add(reportEvaluationDto1);
 
-        //课程目标达成评价明细结果-考生集合
-        ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = null;
-        if (!CollectionUtils.isEmpty(examStudentList)) {
-            for (ReportExamStudentDto reportExamStudentDto : examStudentList) {
-                Map<Long, Map<Long, DimensionDto>> map = finalScoreExamStudentDimensionMap.get(reportExamStudentDto.getStudentCode());
-                FinalScoreResult finalScoreResult = finalScoreResultMap.get(reportExamStudentDto.getStudentCode());
-                JSONArray finalScoreDetailJsonArray = JSONArray.parseArray(finalScoreResult.getFinalScoreDetail());
-                Map<String, ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoMap = null;
-                if (Objects.nonNull(finalScoreResult.getUsualScore())) {
-                    //计算平时作业
-                    List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = JSONArray.parseArray(finalScoreResult.getUsualScore(), ReportExamStudentUsualScoreObjDto.class);
-                    reportExamStudentUsualScoreObjDtoMap = reportExamStudentUsualScoreObjDtoList.stream().collect(Collectors.toMap(ReportExamStudentUsualScoreObjDto::getName, Function.identity(), (dto1, dto2) -> dto1));
-                }
-                //计算期末考试知识点分数
-                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) {
-                            Map<Long, DimensionDto> dimensionDtoMap = map.get(courseTargetDto.getTargetId());
-                            List<DimensionDto> dimensionDtoList = new ArrayList<>(dimensionDtoMap.values());
-                            if (CollectionUtils.isEmpty(reportExamStudentDto.getTargetList())) {
-                                List<ReportExamStudentTargetDto> targetList = new ArrayList<>();
-                                ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = null;
-                                ReportExamStudentFinalScoreDto reportExamStudentFinalScoreDto = new ReportExamStudentFinalScoreDto(targetMap.get(courseTargetDto.getTargetId()).getFinalScoreWeight(), dimensionDtoList);
-                                if (!CollectionUtils.isEmpty(reportExamStudentUsualScoreObjDtoMap) && reportExamStudentUsualScoreObjDtoMap.containsKey("作业" + courseTargetDto.getTargetId())) {
-                                    if (Objects.nonNull(targetMap.get(courseTargetDto.getTargetId())) && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight())
-                                            && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()))) {
-                                        ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto = reportExamStudentUsualScoreObjDtoMap.get("作业" + courseTargetDto.getTargetId());
-                                        reportExamStudentUsualScoreDto = new ReportExamStudentUsualScoreDto(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()), Arrays.asList(reportExamStudentUsualScoreObjDto));
-                                    }
-                                }
-                                targetList.add(new ReportExamStudentTargetDto(courseTargetDto.getTargetId(), courseTargetDto.getTargetName(), reportExamStudentFinalScoreDto, reportExamStudentUsualScoreDto));
-                                reportExamStudentDto.setTargetList(targetList);
-                            } else {
-                                List<ReportExamStudentTargetDto> targetList = reportExamStudentDto.getTargetList();
-                                Map<Long, ReportExamStudentTargetDto> reportExamStudentTargetDtoMap = targetList.stream().collect(Collectors.toMap(ReportExamStudentTargetDto::getTargetId, Function.identity(), (dto1, dto2) -> dto1));
-                                if (!reportExamStudentTargetDtoMap.containsKey(courseTargetDto.getTargetId())) {
-                                    ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = null;
-                                    if (!CollectionUtils.isEmpty(reportExamStudentUsualScoreObjDtoMap) && reportExamStudentUsualScoreObjDtoMap.containsKey("作业" + courseTargetDto.getTargetId())) {
-                                        if (Objects.nonNull(targetMap.get(courseTargetDto.getTargetId())) && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight())
-                                                && Objects.nonNull(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()))) {
-                                            ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto = reportExamStudentUsualScoreObjDtoMap.get("作业" + courseTargetDto.getTargetId());
-                                            reportExamStudentUsualScoreDto = new ReportExamStudentUsualScoreDto(targetMap.get(courseTargetDto.getTargetId()).getUsualScoreWeight().get("作业" + courseTargetDto.getTargetId()), Arrays.asList(reportExamStudentUsualScoreObjDto));
-                                        }
-                                    }
-                                    targetList.add(new ReportExamStudentTargetDto(courseTargetDto.getTargetId(), courseTargetDto.getTargetName(), new ReportExamStudentFinalScoreDto(targetMap.get(courseTargetDto.getTargetId()).getFinalScoreWeight(), dimensionDtoList), reportExamStudentUsualScoreDto));
-                                }
-                            }
-                        }
+                    //课程目标-期末成绩达成度计算
+                    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))));
                     }
-                }
-            }
-            //加入平均分
-            Double avgScore = new BigDecimal(examStudentList.stream().mapToDouble(ReportExamStudentDto::getScore).average().orElse(0d)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-            ReportExamStudentDto reportExamStudentDto = new ReportExamStudentDto("平均分", "平均分", avgScore);
-            List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = new ArrayList<>();
-            reportExamStudentTargetDtoList.addAll(examStudentList.get(0).getTargetList());
-
-            BigDecimal size = new BigDecimal(examStudentList.size());
-            ReportExamStudentFinalScoreDto finalScoreAvgDto = reportExamStudentTargetDtoList.get(0).getFinalScore();
-            Map<Long, DimensionDto> dimensionFinalScoreDtoMap = finalScoreExamStudentDimensionSumMap.get(reportExamStudentTargetDtoList.get(0).getTargetId());
-            List<DimensionDto> dimensionFinalScoreDtoList = finalScoreAvgDto.getDimensionList();
-            for (DimensionDto dimensionFinalScoreDto : dimensionFinalScoreDtoList) {
-                if (dimensionFinalScoreDtoMap.containsKey(dimensionFinalScoreDto.getDimensionId())) {
-                    DimensionDto dimensionDto = dimensionFinalScoreDtoMap.get(dimensionFinalScoreDto.getDimensionId());
-                    Double avg = new BigDecimal(dimensionFinalScoreDto.getDimensionScore()).divide(size, 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                    dimensionFinalScoreDto.setDimensionScore(avg);
-                } else {
-                    dimensionFinalScoreDto.setDimensionScore(0d);
-                }
+
+                    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();
+                });
+                reportCourseEvaluationResultDto = new ReportCourseEvaluationResultDto("测试课程总目标1", targetValue.get(), targetList);
+                trBasicInfo.setCourseEvaluationResult(JacksonUtil.parseJson(reportCourseEvaluationResultDto));
             }
 
-            ReportExamStudentUsualScoreDto usualScoreAvgDto = reportExamStudentTargetDtoList.get(0).getUsualScore();
-            List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = usualScoreAvgDto.getScoreList();
-            for (ReportExamStudentUsualScoreObjDto reportExamStudentUsualScoreObjDto : reportExamStudentUsualScoreObjDtoList) {
-                if (usualScoreOverviewDtoMap.containsKey(reportExamStudentUsualScoreObjDto.getName())) {
-                    UsualScoreOverviewDto usualScoreOverviewDto = usualScoreOverviewDtoMap.get(reportExamStudentUsualScoreObjDto.getName());
-                    Double avg = new BigDecimal(usualScoreOverviewDto.getSumScore()).divide(size, 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-                    reportExamStudentUsualScoreObjDto.setScore(avg);
-                } else {
-                    reportExamStudentUsualScoreObjDto.setScore(0d);
+            //课程目标达成评价明细结果-考生集合
+            List<ReportExamStudentDto> examStudentNewList = trExamStudentService.getExamStudentReportDetail(trBasicInfo, examStudentList, finalScoreExamStudentDimensionMap,
+                    finalScoreResultMap, paperStructResultMap, targetMap, finalScoreExamStudentDimensionSumMap,
+                    usualScoreOverviewDtoMap);
+            reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentNewList);
+        } else {
+            reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
+            reportCourseEvaluationSpreadDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationSpread(), ReportCourseEvaluationSpreadDto.class);
+            reportCourseEvaluationResultDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class);
+
+            List<TRExamStudent> trExamStudentList = trExamStudentService.list(new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
+            if (!CollectionUtils.isEmpty(trExamStudentList)) {
+                List<ReportExamStudentDto> examStudentList = new ArrayList<>(trExamStudentList.size());
+                for (TRExamStudent trExamStudent : trExamStudentList) {
+                    examStudentList.add(new ReportExamStudentDto(trExamStudent));
                 }
+                reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentList);
             }
-            reportExamStudentDto.setTargetList(reportExamStudentTargetDtoList);
-            examStudentList.add(reportExamStudentDto);
-            reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentList);
-            trBasicInfo.setCourseEvaluationResultDetail(JacksonUtil.parseJson(reportCourseEvaluationResultDetailDto));
         }
 
         trBasicInfo.updateInfo(sysUser.getId());
         //课程目标达成评价明细结果-课程目标达成评价值图
         trBasicInfoService.saveOrUpdate(trBasicInfo);
 
+        ReportCommonDto reportCommonDto = new ReportCommonDto(examId, courseCode, markPaper.getCourseName(), paperNumber);//公共信息
         trBasicInfo.setReportResult(new ReportResult(reportCommonDto, reportCourseBasicInfoDto, reportCourseEvaluationSpreadDto, reportCourseEvaluationResultDto, reportCourseEvaluationResultDetailDto));
         return ResultUtil.ok(trBasicInfo.getReportResult());
     }