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

Merge remote-tracking branch 'origin/dev_v3.3.1' into dev_v3.3.1

caozixuan 1 год назад
Родитель
Сommit
f97cfe0bb3
17 измененных файлов с 312 добавлено и 160 удалено
  1. 29 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/CourseTargetValueDto.java
  2. 7 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/DimensionDto.java
  3. 59 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/ReportCourseTargetDto.java
  4. 0 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TRExamStudentService.java
  5. 27 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TRBasicInfoServiceImpl.java
  6. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TRExamStudentServiceImpl.java
  7. 50 18
      distributed-print/src/main/java/com/qmth/distributed/print/api/TRBasicInfoController.java
  8. 12 9
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArchiveController.java
  9. 29 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ArchiveStudentVo.java
  10. 9 9
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java
  11. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkSubjectiveScoreMapper.java
  12. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  13. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSubjectiveScoreService.java
  14. 36 42
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  15. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSubjectiveScoreServiceImpl.java
  16. 43 45
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml
  17. 4 1
      teachcloud-mark/src/main/resources/mapper/MarkSubjectiveScoreMapper.xml

+ 29 - 10
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/CourseTargetWeightDto.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/CourseTargetValueDto.java

@@ -4,6 +4,7 @@ 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 org.jetbrains.annotations.NotNull;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -11,14 +12,14 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * @Description: 课程目标权重dto
+ * @Description: 课程目标dto
  * @Param:
  * @return:
  * @Author: wangliang
  * @Date: 2024/2/26
  */
 @JsonInclude(JsonInclude.Include.NON_NULL)
-public class CourseTargetWeightDto implements Serializable {
+public class CourseTargetValueDto implements Serializable, Comparable<CourseTargetValueDto> {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "课程目标id")
@@ -49,32 +50,39 @@ public class CourseTargetWeightDto implements Serializable {
     @ApiModelProperty(value = "期末成绩权重")
     private BigDecimal finalScoreWeight;
 
-    public CourseTargetWeightDto() {
+    public CourseTargetValueDto() {
 
     }
 
-    public CourseTargetWeightDto(Long targetId, String targetName) {
+    public CourseTargetValueDto(Long targetId, String targetName) {
         this.targetId = targetId;
         this.targetName = targetName;
     }
 
-
-    public CourseTargetWeightDto(CourseTargetDto courseTargetDto) {
+    public CourseTargetValueDto(CourseTargetDto courseTargetDto) {
         this.targetId = courseTargetDto.getTargetId();
         this.targetName = courseTargetDto.getTargetName();
         this.graduationRequirement = courseTargetDto.getGraduationRequirement();
-        this.evaluationId = courseTargetDto.getEvaluationId();
-        this.evaluation = courseTargetDto.getEvaluation();
-        this.evaluationDesc = courseTargetDto.getEvaluationDesc();
+        setValue(courseTargetDto);
     }
 
-    public CourseTargetWeightDto(Long targetId, String targetName, Map<String, BigDecimal> usualScoreWeight, BigDecimal finalScoreWeight) {
+    public CourseTargetValueDto(Long targetId, String targetName, Map<String, BigDecimal> usualScoreWeight, BigDecimal finalScoreWeight) {
         this.targetId = targetId;
         this.targetName = targetName;
         this.usualScoreWeight = usualScoreWeight;
         this.finalScoreWeight = finalScoreWeight;
     }
 
+    public void setValue(CourseTargetDto courseTargetDto) {
+        this.evaluationId = courseTargetDto.getEvaluationId();
+        this.evaluation = courseTargetDto.getEvaluation();
+        this.evaluationDesc = courseTargetDto.getEvaluationDesc();
+    }
+
+    public void updateInfo(CourseTargetDto courseTargetDto) {
+        setValue(courseTargetDto);
+    }
+
     public String getGraduationRequirement() {
         return graduationRequirement;
     }
@@ -146,4 +154,15 @@ public class CourseTargetWeightDto implements Serializable {
     public void setFinalScoreWeight(BigDecimal finalScoreWeight) {
         this.finalScoreWeight = finalScoreWeight;
     }
+
+    @Override
+    public int compareTo(@NotNull CourseTargetValueDto o) {
+        if (o.getTargetId().longValue() < this.getTargetId().longValue()) {
+            return 1;
+        } else if (o.getTargetId().longValue() > this.getTargetId().longValue()) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
 }

+ 7 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/report/DimensionDto.java

@@ -4,6 +4,7 @@ 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 org.jetbrains.annotations.NotNull;
 
 import java.io.Serializable;
 
@@ -15,7 +16,7 @@ import java.io.Serializable;
  * @Date: 2024/2/26
  */
 @JsonInclude(JsonInclude.Include.NON_NULL)
-public class DimensionDto implements Serializable {
+public class DimensionDto implements Serializable, Comparable<DimensionDto> {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "知识点id")
@@ -41,13 +42,6 @@ public class DimensionDto implements Serializable {
         this.dimensionScore = dimensionScore;
     }
 
-    public DimensionDto(Long dimensionId, String dimensionCode, String dimensionName, Double dimensionScore) {
-        this.dimensionId = dimensionId;
-        this.dimensionCode = dimensionCode;
-        this.dimensionName = dimensionName;
-        this.dimensionScore = dimensionScore;
-    }
-
     public Long getDimensionId() {
         return dimensionId;
     }
@@ -79,4 +73,9 @@ public class DimensionDto implements Serializable {
     public void setDimensionScore(Double dimensionScore) {
         this.dimensionScore = dimensionScore;
     }
+
+    @Override
+    public int compareTo(@NotNull DimensionDto o) {
+        return this.getDimensionCode().compareTo(o.getDimensionCode());
+    }
 }

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

@@ -0,0 +1,59 @@
+package com.qmth.distributed.print.business.bean.dto.report;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 报告课程目标dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/2/26
+ */
+public class ReportCourseTargetDto implements Serializable, Comparable<ReportCourseTargetDto> {
+
+    @ApiModelProperty(value = "课程目标id")
+    private Long targetId;
+
+    @ApiModelProperty(value = "课程目标值")
+    private CourseTargetValueDto courseTargetValueDto;
+
+    public ReportCourseTargetDto() {
+
+    }
+
+    public ReportCourseTargetDto(Long targetId, CourseTargetValueDto courseTargetValueDto) {
+        this.targetId = targetId;
+        this.courseTargetValueDto = courseTargetValueDto;
+    }
+
+    public Long getTargetId() {
+        return targetId;
+    }
+
+    public void setTargetId(Long targetId) {
+        this.targetId = targetId;
+    }
+
+    public CourseTargetValueDto getCourseTargetValueDto() {
+        return courseTargetValueDto;
+    }
+
+    public void setCourseTargetValueDto(CourseTargetValueDto courseTargetValueDto) {
+        this.courseTargetValueDto = courseTargetValueDto;
+    }
+
+    @Override
+    public int compareTo(@NotNull ReportCourseTargetDto o) {
+        if (o.getTargetId().longValue() < this.getTargetId().longValue()) {
+            return 1;
+        } else if (o.getTargetId().longValue() > this.getTargetId().longValue()) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
+}

+ 0 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TRExamStudentService.java

@@ -1,12 +1,7 @@
 package com.qmth.distributed.print.business.service;
 
 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;
 

+ 27 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TRBasicInfoServiceImpl.java

@@ -26,7 +26,6 @@ import com.qmth.teachcloud.mark.utils.Calculator;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
-import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -104,13 +103,13 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
         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<Long, Map<Long, DimensionDto>> targetDimensionMap = new LinkedHashMap<>();//课程目标-知识点
 
         List<ReportExamStudentDto> examStudentList = null;//考生集合
         Map<String, FinalScoreResult> finalScoreResultMap = null;//考生成绩map
         Map<String, PaperStructResult> paperStructResultMap = null;//试卷蓝图map
-        Map<Long, CourseTargetWeightDto> targetMap = null;
+        Map<Long, CourseTargetValueDto> targetMap = null;
 
-        LinkedMultiValueMap<Long, DimensionDto> targetDimensionMap = new LinkedMultiValueMap<>();//课程目标知识点
         if (!CollectionUtils.isEmpty(finalScoreResultList)) {
             //期末成绩明细map
             paperStructResultMap = paperStructResultList.stream().collect(Collectors.toMap(k -> k.getMainNumber() + "-" + k.getSubNumber(), Function.identity(), (dto1, dto2) -> dto1));
@@ -129,7 +128,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
                         List<CourseTargetDto> courseTargetDtoList = paperStructResult.getTargetList();
 
                         for (CourseTargetDto courseTargetDto : courseTargetDtoList) {
-                            targetMap.put(courseTargetDto.getTargetId(), new CourseTargetWeightDto(courseTargetDto));
+                            targetMap.put(courseTargetDto.getTargetId(), new CourseTargetValueDto(courseTargetDto));
 
                             //课程目标
                             if (!finalScoreTargetMap.containsKey(courseTargetDto.getTargetId())) {
@@ -142,7 +141,6 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
                             //知识点
                             List<DimensionDto> dimensionDtoList = courseTargetDto.getDimensionList();
                             for (DimensionDto dimensionDto : dimensionDtoList) {
-                                targetDimensionMap.add(courseTargetDto.getTargetId(), dimensionDto);
                                 //考生知识点
                                 if (!finalScoreExamStudentDimensionMap.containsKey(finalScoreResult.getStudentCode())) {
                                     Map<Long, Map<Long, DimensionDto>> map = new LinkedHashMap<>();
@@ -173,11 +171,17 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
                                 if (!finalScoreExamStudentDimensionSumMap.containsKey(courseTargetDto.getTargetId())) {
                                     Map<Long, DimensionDto> dimensionMap = new LinkedHashMap<>();
                                     dimensionMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
+                                    Map<Long, DimensionDto> dimensionTempMap = new LinkedHashMap<>();
+                                    dimensionTempMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
                                     finalScoreExamStudentDimensionSumMap.put(courseTargetDto.getTargetId(), dimensionMap);
+                                    targetDimensionMap.put(courseTargetDto.getTargetId(), dimensionTempMap);
                                 } else {
                                     Map<Long, DimensionDto> dimensionMap = finalScoreExamStudentDimensionSumMap.get(courseTargetDto.getTargetId());
                                     if (!dimensionMap.containsKey(dimensionDto.getDimensionId())) {
                                         dimensionMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
+                                        Map<Long, DimensionDto> dimensionTempMap = targetDimensionMap.get(courseTargetDto.getTargetId());
+                                        dimensionTempMap.put(dimensionDto.getDimensionId(), new DimensionDto(dimensionDto, score));
+                                        targetDimensionMap.put(courseTargetDto.getTargetId(), dimensionTempMap);
                                     } else {
                                         DimensionDto dimensionDtoTemp = dimensionMap.get(dimensionDto.getDimensionId());
                                         dimensionDtoTemp.setDimensionScore(dimensionDtoTemp.getDimensionScore().doubleValue() + score.doubleValue());
@@ -209,6 +213,13 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
             }
         }
 
+        Map<Long, CourseTargetValueDto> finalTargetMap = targetMap;
+        targetDimensionMap.forEach((k, v) -> {
+            List<DimensionDto> dimensionDtoList = new ArrayList<>(v.values());
+            Collections.sort(dimensionDtoList);
+            finalTargetMap.get(k).setDimensionList(dimensionDtoList);
+        });
+
         paramsMap.put("finalScoreResultList", finalScoreResultList);
         paramsMap.put("usualScoreMap", usualScoreMap);
         paramsMap.put("finalScoreTargetMap", finalScoreTargetMap);
@@ -271,7 +282,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
     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<Long, CourseTargetValueDto> targetMap = (Map<Long, CourseTargetValueDto>) paramsMap.get("targetMap");
         Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap = (Map<String, UsualScoreOverviewDto>) paramsMap.get("usualScoreOverviewDtoMap");
         Map<Long, FinalScoreOverviewDto> finalScoreOverviewDtoMap = (Map<Long, FinalScoreOverviewDto>) paramsMap.get("finalScoreOverviewDtoMap");
 
@@ -316,6 +327,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
 
                 CourseTargetDto courseTargetDto = new CourseTargetDto(k, v.getTargetName(), k, "评价方式" + k, "评价方式描述" + k, reportEvaluationDtoList, evaluationValue);
                 targetList.add(courseTargetDto);
+                v.updateInfo(courseTargetDto);
                 targetValue.set(new BigDecimal(targetValue.get()).add(new BigDecimal(courseTargetDto.getEvaluationValue())).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
             });
             Collections.sort(targetList);
@@ -377,6 +389,15 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
         if (Objects.nonNull(reportCourseEvaluationResultDetailDto)) {
             trBasicInfo.getReportResult().setCourseEvaluationResultDetailInfo(reportCourseEvaluationResultDetailDto);
         }
+        if (Objects.nonNull(paramsMap.get("targetMap"))) {
+            Map<Long, CourseTargetValueDto> targetMap = (Map<Long, CourseTargetValueDto>) paramsMap.get("targetMap");
+            List<ReportCourseTargetDto> reportCourseTargetDtoList = new ArrayList<>();
+            targetMap.forEach((k, v) -> {
+                reportCourseTargetDtoList.add(new ReportCourseTargetDto(k, v));
+            });
+            Collections.sort(reportCourseTargetDtoList);
+            trBasicInfo.setCourseEvaluationResultDetail(JacksonUtil.parseJson(reportCourseTargetDtoList));
+        }
 
         trBasicInfo.getReportResult().setCommonInfo(new ReportCommonDto(markPaper.getExamId(), markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber()));
         return trBasicInfo;

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

@@ -45,7 +45,7 @@ public class TRExamStudentServiceImpl extends ServiceImpl<TRExamStudentMapper, T
         Map<String, Map<Long, Map<Long, DimensionDto>>> finalScoreExamStudentDimensionMap = (Map<String, Map<Long, Map<Long, DimensionDto>>>) paramsMap.get("finalScoreExamStudentDimensionMap");
         Map<String, FinalScoreResult> finalScoreResultMap = (Map<String, FinalScoreResult>) paramsMap.get("finalScoreResultMap");
         Map<String, PaperStructResult> paperStructResultMap = (Map<String, PaperStructResult>) paramsMap.get("paperStructResultMap");
-        Map<Long, CourseTargetWeightDto> targetMap = (Map<Long, CourseTargetWeightDto>) paramsMap.get("targetMap");
+        Map<Long, CourseTargetValueDto> targetMap = (Map<Long, CourseTargetValueDto>) paramsMap.get("targetMap");
         Map<Long, Map<Long, DimensionDto>> finalScoreExamStudentDimensionSumMap = (Map<Long, Map<Long, DimensionDto>>) paramsMap.get("finalScoreExamStudentDimensionSumMap");
         Map<String, UsualScoreOverviewDto> usualScoreOverviewDtoMap = (Map<String, UsualScoreOverviewDto>) paramsMap.get("usualScoreOverviewDtoMap");
         if (!CollectionUtils.isEmpty(examStudentList)) {
@@ -115,7 +115,6 @@ public class TRExamStudentServiceImpl extends ServiceImpl<TRExamStudentMapper, T
             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 {
@@ -135,6 +134,7 @@ public class TRExamStudentServiceImpl extends ServiceImpl<TRExamStudentMapper, T
                 }
             }
             reportExamStudentDto.setTargetList(reportExamStudentTargetDtoList);
+            examStudentList.get(0).setTargetList(JSONArray.parseArray(trExamStudentList.get(0).getResultDetail(), ReportExamStudentTargetDto.class));
             examStudentList.add(reportExamStudentDto);
 
             trExamStudentList.add(new TRExamStudent(trBasicInfo.getId(), reportExamStudentDto));

+ 50 - 18
distributed-print/src/main/java/com/qmth/distributed/print/api/TRBasicInfoController.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.api;
 
 import cn.hutool.core.date.DateUtil;
+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;
@@ -43,6 +44,10 @@ 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>
@@ -150,6 +155,7 @@ public class TRBasicInfoController {
                              @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) throws IOException {
         TRBasicInfo trBasicInfo = trBasicInfoService.getOne(new QueryWrapper<TRBasicInfo>().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
         Objects.requireNonNull(trBasicInfo, "没有报告信息");
+        Objects.requireNonNull(trBasicInfo.getCourseEvaluationResultDetail(), "没有课程目标信息");
 
         String period = Objects.nonNull(trBasicInfo.getPeriod()) ? trBasicInfo.getPeriod() : null;
         String credit = Objects.nonNull(trBasicInfo.getCredit()) ? trBasicInfo.getCredit() : null;
@@ -162,35 +168,61 @@ public class TRBasicInfoController {
 
         CourseReportBean courseReportBean = new CourseReportBean(trBasicInfo.getOpenTime() + "《测试输出报告》", courseBasicBean);
 
+        List<ReportCourseTargetDto> reportCourseTargetDtoList = JSONArray.parseArray(trBasicInfo.getCourseEvaluationResultDetail(), ReportCourseTargetDto.class);
+        Map<Long, ReportCourseTargetDto> courseTargetValueDtoMap = reportCourseTargetDtoList.stream().collect(Collectors.toMap(ReportCourseTargetDto::getTargetId, Function.identity(), (dto1, dto2) -> dto1));
+
         //table1
         RowRenderData header1 = Rows.of("课程目标", "毕业要求指标点").bgColor("F2F2F2").center().create();
         Tables.TableBuilder tableBuilder1 = Tables.ofPercentWidth("100%");
         tableBuilder1.addRow(header1);
-        Map<String, Integer> courseTargetMap = new LinkedHashMap<>();
-        for (int i = 0; i < 2; i++) {
-            CourseTargetTableBean1 courseTargetTableBean1 = new CourseTargetTableBean1("课程目标" + (i + 1), "完成目标" + (i + 1));
+
+        Map<String, Long> courseTargetMap = new LinkedHashMap<>();
+        List<String> header2_1List = new ArrayList<>(Arrays.asList("课程目标", "支撑毕业要求")), header2_2List = new ArrayList<>();
+        header2_2List.addAll(header2_1List);
+        header2_1List.add("考核/评价环节及目标分值");
+
+        courseTargetValueDtoMap.forEach((k, v) -> {
+            CourseTargetValueDto courseTargetValueDto = v.getCourseTargetValueDto();
+            Map<String, BigDecimal> usualScoreWeightMap = courseTargetValueDto.getUsualScoreWeight();
+            usualScoreWeightMap.forEach((k1, v1) -> {
+                header2_1List.add("");
+                header2_2List.add(k1);
+            });
+
+            CourseTargetTableBean1 courseTargetTableBean1 = new CourseTargetTableBean1(courseTargetValueDto.getTargetName(), courseTargetValueDto.getGraduationRequirement());
             RowRenderData row = Rows.of(courseTargetTableBean1.getName(), courseTargetTableBean1.getTarget()).rowStyle(this.getRowStyle()).create();
             tableBuilder1.addRow(row);
-            courseTargetMap.put(courseTargetTableBean1.getName(), i + 1);
-        }
+            courseTargetMap.put(courseTargetTableBean1.getName(), k);
+        });
+        header2_1List.add("目标分值统计");
+        header2_2List.add("期末考试");
+        header2_2List.add("目标分值统计");
+
         TableRenderData tableRenderData1 = tableBuilder1.left().create();
         courseReportBean.setCourseTargetTable1(tableRenderData1);
 
-        //table2
-        RowRenderData header2_1 = Rows.of("课程目标", "支撑毕业要求", "考核/评价环节及目标分值", "", "", "", "目标分值统计").bgColor("F2F2F2").center().create();
-        RowRenderData header2_2 = Rows.of("课程目标", "支撑毕业要求", "平时表现", "课后作业", "课程实验", "期末考试", "目标分值统计").bgColor("F2F2F2").center().create();
+        //TODO 等待曹子轩接口table2
+        RowRenderData header2_1 = Rows.of(header2_1List.toArray(new String[header2_1List.size()])).bgColor("F2F2F2").center().create();
+        RowRenderData header2_2 = Rows.of(header2_2List.toArray(new String[header2_1List.size()])).bgColor("F2F2F2").center().create();
 
         List<CourseTargetTableBean2> courseTargetTableBean2List = new ArrayList<>();
-        BigDecimal bigDecimalExpressionSum = new BigDecimal(0), homeworkSum = new BigDecimal(0), testSum = new BigDecimal(0), examSum = new BigDecimal(0), targetSum2 = new BigDecimal(0);
-        for (int i = 0; i < 2; i++) {
-            CourseTargetTableBean2 courseTargetTableBean2 = new CourseTargetTableBean2("课程目标" + (i + 1), "考核目标" + (i + 1), new BigDecimal(i + 2), new BigDecimal(i + 3), new BigDecimal(i + 4), new BigDecimal(i + 5), new BigDecimal(i + 10));
-            bigDecimalExpressionSum = bigDecimalExpressionSum.add(courseTargetTableBean2.getExpression());
-            homeworkSum = homeworkSum.add(courseTargetTableBean2.getHomework());
-            testSum = testSum.add(courseTargetTableBean2.getTest());
-            examSum = examSum.add(courseTargetTableBean2.getExam());
-            targetSum2 = targetSum2.add(courseTargetTableBean2.getTargetSum());
+        AtomicReference<BigDecimal> bigDecimalExpressionSum = new AtomicReference<>(new BigDecimal(0));
+        AtomicReference<BigDecimal> homeworkSum = new AtomicReference<>(new BigDecimal(0));
+        AtomicReference<BigDecimal> testSum = new AtomicReference<>(new BigDecimal(0));
+        AtomicReference<BigDecimal> examSum = new AtomicReference<>(new BigDecimal(0));
+        AtomicReference<BigDecimal> targetSum2 = new AtomicReference<>(new BigDecimal(0));
+        AtomicInteger atomicReference = new AtomicInteger(0);
+        courseTargetValueDtoMap.forEach((k, v) -> {
+            CourseTargetValueDto courseTargetValueDto = v.getCourseTargetValueDto();
+            CourseTargetTableBean2 courseTargetTableBean2 = new CourseTargetTableBean2(courseTargetValueDto.getTargetName(), courseTargetValueDto.getGraduationRequirement(), new BigDecimal(atomicReference.get() + 2), new BigDecimal(atomicReference.get() + 3), new BigDecimal(atomicReference.get() + 4), new BigDecimal(atomicReference.get() + 5), new BigDecimal(atomicReference.get() + 10));
+            bigDecimalExpressionSum.set(bigDecimalExpressionSum.get().add(courseTargetTableBean2.getExpression()));
+            homeworkSum.set(homeworkSum.get().add(courseTargetTableBean2.getHomework()));
+            testSum.set(testSum.get().add(courseTargetTableBean2.getTest()));
+            examSum.set(examSum.get().add(courseTargetTableBean2.getExam()));
+            targetSum2.set(targetSum2.get().add(courseTargetTableBean2.getTargetSum()));
             courseTargetTableBean2List.add(courseTargetTableBean2);
-        }
+            atomicReference.decrementAndGet();
+        });
 
         RowRenderData[] rowRenderData2 = new RowRenderData[courseTargetTableBean2List.size() + 3];
         for (int i = 0; i < courseTargetTableBean2List.size(); i++) {
@@ -222,7 +254,7 @@ public class TRBasicInfoController {
 //                .left().create();
         courseReportBean.setCourseTargetTable2(tableRenderData2);
 
-        //table3
+        //TODO 等待曹子轩接口table3
         RowRenderData header3_1 = Rows.of("序号", "项目", "考核内容及要求", "目标分值", "对应的课程目标").bgColor("F2F2F2").center().create();
         List<CourseTargetTableBean3> courseTargetTableBean3List = new ArrayList<>();
         BigDecimal targetSum3 = new BigDecimal(0);

+ 12 - 9
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArchiveController.java

@@ -3,17 +3,20 @@ package com.qmth.distributed.print.api.mark;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 
-import com.alibaba.fastjson.JSONObject;
-import com.qmth.distributed.print.business.service.BasicExamService;
-import com.qmth.teachcloud.common.entity.BasicExam;
-import com.qmth.teachcloud.common.entity.BasicSemester;
-import com.qmth.teachcloud.common.service.BasicSemesterService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
 
+import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.service.BasicExamService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicExam;
+import com.qmth.teachcloud.common.entity.BasicSemester;
+import com.qmth.teachcloud.common.service.BasicSemesterService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreQuery;
@@ -73,9 +76,9 @@ public class MarkArchiveController {
 
     @ApiOperation(value = "成绩报告")
     @RequestMapping(value = "score/report", method = RequestMethod.POST)
-    public Result scoreReport(@RequestParam Long examId, @RequestParam String paperNumber) {
-        ScoreReportVo scoreReportVo = markStudentService.scoreReport(examId, paperNumber);
-        BasicExam basicExam = basicExamService.getById(examId);
+    public Result scoreReport(@Validated ArchiveStudentQuery query) {
+        ScoreReportVo scoreReportVo = markStudentService.scoreReport(query);
+        BasicExam basicExam = basicExamService.getById(query.getExamId());
         BasicSemester basicSemester = basicSemesterService.getById(basicExam.getSemesterId());
         scoreReportVo.setExamName(basicExam.getName());
         scoreReportVo.setSemesterName(basicSemester.getName());

+ 29 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ArchiveStudentVo.java

@@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
 
 public class ArchiveStudentVo {
@@ -197,4 +198,32 @@ public class ArchiveStudentVo {
         }
         return scoreList;
     }
+    public List<ScoreItem> getScoreList(boolean objective, List<MarkQuestion> questionList) {
+        List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
+        try {
+            String[] values = StringUtils.split(objective ? objectiveScoreList : subjectiveScoreList, SPLIT);
+            int i = 0;
+            for (String value : values) {
+                i++;
+                if (questionList.size() < i) {
+                    break;
+                }
+                MarkQuestion question = questionList.get(i - 1);
+                if (question.getTotalScore() == null || question.getTotalScore() == 0) {
+                    continue;
+                }
+                ScoreItem item = ScoreItem.parse(value, objective);
+                item.setObjective(objective);
+                item.setMainNumber(question.getMainNumber());
+                item.setTitle(question.getMainTitle());
+                item.setTotalScore(question.getTotalScore());
+                item.setSubNumber(question.getSubNumber());
+                if (item != null) {
+                    scoreList.add(item);
+                }
+            }
+        } catch (Exception e) {
+        }
+        return scoreList;
+    }
 }

+ 9 - 9
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java

@@ -1,10 +1,13 @@
 package com.qmth.teachcloud.mark.mapper;
 
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
-import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.mark.bean.archivescore.*;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
@@ -13,9 +16,6 @@ import com.qmth.teachcloud.mark.bean.student.StudentVo;
 import com.qmth.teachcloud.mark.dto.UnexistStudentDto;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
 
 /**
  * <p>
@@ -51,20 +51,20 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
 
 	List<ArchiveStudentVo> studentList(@Param("req") ArchiveStudentQuery query);
 
-	OverViewVo overview(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+	OverViewVo overview(@Param("req") ArchiveStudentQuery query);
 
 	int getCountByScoreRange(@Param("examId") Long examId, @Param("paperNumber") String paperNumber,
 			@Param("start") Double start, @Param("end") Double end);
 
-	List<CollegeVo> college(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
-	List<ClassVo> classData(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
-	List<TeacherVo> teacher(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+	List<CollegeVo> college(@Param("req") ArchiveStudentQuery query);
+	List<ClassVo> classData(@Param("req") ArchiveStudentQuery query);
+	List<TeacherVo> teacher(@Param("req") ArchiveStudentQuery query);
 
     List<UnexistStudentDto> listUnexistStudentByExamIdAndCoursePaperId(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("coursePaperId") String coursePaperId, @Param("status") String status, @Param("dpr") DataPermissionRule dpr);
 
 	IPage<ArchiveStudentVo> studentList(@Param("page") Page<ArchiveStudentVo> page, @Param("req") ArchiveStudentQuery query);
 
-	List<TeacherClassVo> teacherClass(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+	List<TeacherClassVo> teacherClass(@Param("req") ArchiveStudentQuery query);
 
     int selectCountByQuery(@Param("markStudent") MarkStudent markStudent, @Param("dpr") DataPermissionRule dpr);
 

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkSubjectiveScoreMapper.java

@@ -17,6 +17,6 @@ import java.util.List;
  */
 public interface MarkSubjectiveScoreMapper extends MppBaseMapper<MarkSubjectiveScore> {
 
-	List<QuestionVo> getSubjectiveVo(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
+	List<QuestionVo> getSubjectiveVo(@Param("studentIds")List<Long> studentIds);
 
 }

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -116,7 +116,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
 
     void scoreExport(ArchiveStudentQuery query, HttpServletResponse response);
 
-    ScoreReportVo scoreReport(Long examId, String paperNumber);
+    ScoreReportVo scoreReport(ArchiveStudentQuery query);
 
     void exportUnexist(Long examId, String courseCode, String coursePaperId, HttpServletResponse response);
 

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkSubjectiveScoreService.java

@@ -27,7 +27,7 @@ public interface MarkSubjectiveScoreService extends IMppService<MarkSubjectiveSc
 
     void deleteByExamIdAndPaperNumberAndGroupNumber(Long examId, String paperNumber, Integer groupNumber);
 
-	List<QuestionVo> getSubjectiveVo(Long examId, String paperNumber);
+	List<QuestionVo> getSubjectiveVo(List<Long> studentIds);
 	
 	  List<MarkSubjectiveScore> listByStudentId(Long studentId);
 }

+ 36 - 42
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -898,7 +898,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 "成绩"};
         List<MarkQuestion> oQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(query.getExamId(), query.getPaperNumber(), null, true);
         List<MarkQuestion> sQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(query.getExamId(), query.getPaperNumber(), null, false);
-        List<String> columnNameList = Arrays.asList(columnName);
+        List<String> columnNameList = new ArrayList<>(Arrays.asList(columnName));
         for (MarkQuestion question : oQuestionList) {
             columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "选项");
             columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "得分");
@@ -918,17 +918,17 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             valueList.add(s.getClassName());
             valueList.add(s.getCourseCode());
             valueList.add(s.getCourseName());
-            valueList.add(s.getObjectiveScore().toString());
-            valueList.add(s.getSubjectiveScore().toString());
-            valueList.add(s.getTotalScore().toString());
-            for (ScoreItem item : s.getScoreList(true)) {
+            valueList.add(s.getObjectiveScore()==null?"":s.getObjectiveScore().toString());
+            valueList.add(s.getSubjectiveScore()==null?"":s.getSubjectiveScore().toString());
+            valueList.add(s.getTotalScore()==null?"":s.getTotalScore().toString());
+            for (ScoreItem item : s.getScoreList(true,oQuestionList)) {
                 valueList.add(item.getAnswer());
-                valueList.add(item.getScore().toString());
+                valueList.add(item.getScore()==null?"":item.getScore().toString());
             }
-            for (ScoreItem item : s.getScoreList(false)) {
+            for (ScoreItem item : s.getScoreList(false,sQuestionList)) {
                 valueList.add(item.getScore().toString());
             }
-            String[] columnValue = valueList.toArray(new String[0]);
+            String[] columnValue = valueList.toArray(new String[valueList.size()]);
             columnValues.add(columnValue);
         }
         try {
@@ -948,9 +948,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Override
-    public ScoreReportVo scoreReport(Long examId, String paperNumber) {
+    public ScoreReportVo scoreReport(ArchiveStudentQuery query) {
         ScoreReportVo ret = new ScoreReportVo();
-        ret.setOverview(baseMapper.overview(examId, paperNumber));
+        ret.setOverview(baseMapper.overview(query));
         if (ret.getOverview() != null) {
             double total = ret.getOverview().getStudentCount() - ret.getOverview().getAbsentCount();
             ret.getOverview().setPassRate(
@@ -959,10 +959,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                     .divide2String(Calculator.multiply(ret.getOverview().getExcellentCount(), 100), total, 2));
             ret.getOverview().setAvgScore(Calculator.round(ret.getOverview().getAvgScore(), 2));
         }
+        List<ArchiveStudentVo> studentList= baseMapper.studentList(query);
+        fillScoreRange(ret, studentList);
 
-        fillScoreRange(ret, examId, paperNumber);
-
-        ret.setCollege(baseMapper.college(examId, paperNumber));
+        ret.setCollege(baseMapper.college(query));
         if (CollectionUtils.isNotEmpty(ret.getCollege())) {
             for (CollegeVo vo : ret.getCollege()) {
                 double total = vo.getStudentCount() - vo.getAbsentCount();
@@ -975,7 +975,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
-        ret.setClassData(baseMapper.classData(examId, paperNumber));
+        ret.setClassData(baseMapper.classData(query));
         if (CollectionUtils.isNotEmpty(ret.getClassData())) {
             for (ClassVo vo : ret.getClassData()) {
                 double total = vo.getStudentCount() - vo.getAbsentCount();
@@ -988,7 +988,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
-        ret.setTeacher(baseMapper.teacher(examId, paperNumber));
+        ret.setTeacher(baseMapper.teacher(query));
         if (CollectionUtils.isNotEmpty(ret.getTeacher())) {
             for (TeacherVo vo : ret.getTeacher()) {
                 double total = vo.getStudentCount() - vo.getAbsentCount();
@@ -1001,7 +1001,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
-        ret.setTeacherClass(baseMapper.teacherClass(examId, paperNumber));
+        ret.setTeacherClass(baseMapper.teacherClass(query));
         if (CollectionUtils.isNotEmpty(ret.getTeacherClass())) {
             for (TeacherClassVo vo : ret.getTeacherClass()) {
                 double total = vo.getStudentCount() - vo.getAbsentCount();
@@ -1012,9 +1012,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
-        fillObjective(ret, examId, paperNumber);
-
-        ret.setSubjective(markSubjectiveScoreService.getSubjectiveVo(examId, paperNumber));
+        fillObjective(ret, studentList,query.getExamId(),query.getPaperNumber());
+        List<Long> studentIds = studentList.stream().map(ArchiveStudentVo::getStudentId).collect(Collectors.toList());
+        ret.setSubjective(markSubjectiveScoreService.getSubjectiveVo(studentIds));
         if (CollectionUtils.isNotEmpty(ret.getSubjective())) {
             for (QuestionVo vo : ret.getSubjective()) {
                 double total = vo.getStudentCount();
@@ -1168,12 +1168,11 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         return this.update(updateWrapper);
     }
 
-    private void fillObjective(ScoreReportVo ret, Long examId, String paperNumber) {
+    private void fillObjective(ScoreReportVo ret, List<ArchiveStudentVo> studentList,Long examId, String paperNumber) {
         List<MarkQuestion> qs = markQuestionService.listByExamIdAndPaperNumberAndPaperType(examId, paperNumber, null, true);
-        List<MarkStudent> students = listByExamIdAndPaperNumberAndNotAbsent(examId, paperNumber);
         Map<String, QuestionVo> map = new HashMap<>();
         List<QuestionVo> list = new ArrayList<>();
-        for (MarkStudent s : students) {
+        for (ArchiveStudentVo s : studentList) {
             List<ScoreItem> sis = s.getScoreList(true, qs);
             if (CollectionUtils.isNotEmpty(sis)) {
                 for (ScoreItem si : sis) {
@@ -1247,27 +1246,26 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         return this.list(wrapper);
     }
 
-    private void fillScoreRange(ScoreReportVo ret, Long examId, String paperNumber) {
-        int toltal = getCountByPaperNumber(examId, paperNumber);
+    private void fillScoreRange(ScoreReportVo ret, List<ArchiveStudentVo> list ) {
         List<ScoreRangeVo> scoreRange = new ArrayList<>();
         ret.setScoreRange(scoreRange);
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 1.0, 9.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 10.0, 19.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 20.0, 29.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 30.0, 39.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 40.0, 49.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 50.0, 59.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 60.0, 69.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 70.0, 79.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 80.0, 89.5));
-        scoreRange.add(getScoreRangeVo(toltal, examId, paperNumber, 90.0, 100.0));
+        scoreRange.add(getScoreRangeVo( list, 1.0, 9.5));
+        scoreRange.add(getScoreRangeVo( list, 10.0, 19.5));
+        scoreRange.add(getScoreRangeVo( list, 20.0, 29.5));
+        scoreRange.add(getScoreRangeVo( list, 30.0, 39.5));
+        scoreRange.add(getScoreRangeVo( list, 40.0, 49.5));
+        scoreRange.add(getScoreRangeVo( list, 50.0, 59.5));
+        scoreRange.add(getScoreRangeVo( list, 60.0, 69.5));
+        scoreRange.add(getScoreRangeVo( list, 70.0, 79.5));
+        scoreRange.add(getScoreRangeVo( list, 80.0, 89.5));
+        scoreRange.add(getScoreRangeVo( list, 90.0, 100.0));
     }
 
-    private ScoreRangeVo getScoreRangeVo(int toltal, Long examId, String paperNumber, Double start, Double end) {
-        int count = getCount(examId, paperNumber, start, end);
+    private ScoreRangeVo getScoreRangeVo(List<ArchiveStudentVo> list, Double start, Double end) {
+        int count = (int) list.stream().filter(s-> s.getTotalScore()>=start && s.getTotalScore()<=end).count();
         Double rate = null;
-        if (toltal != 0) {
-            rate = Calculator.multiply(count, toltal, 2);
+        if (list.size() != 0) {
+            rate = Calculator.multiply(count, list.size(), 2);
         }
         ScoreRangeVo vo = new ScoreRangeVo(count, start, end, rate);
         return vo;
@@ -1281,10 +1279,6 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         return this.count(wrapper);
     }
 
-    private int getCount(Long examId, String paperNumber, Double start, Double end) {
-        return baseMapper.getCountByScoreRange(examId, paperNumber, start, end);
-    }
-
     @Override
     public int getAssignedCount(Long examId, Boolean checked, String courseCode, String coursePaperId,
                                 MarkPaperStatus status, DataPermissionRule dpr) {

+ 2 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkSubjectiveScoreServiceImpl.java

@@ -97,8 +97,8 @@ public class MarkSubjectiveScoreServiceImpl extends MppServiceImpl<MarkSubjectiv
 //    }
 
 	@Override
-	public List<QuestionVo> getSubjectiveVo(Long examId, String paperNumber) {
-		return this.baseMapper.getSubjectiveVo(examId, paperNumber);
+	public List<QuestionVo> getSubjectiveVo(List<Long> studentIds) {
+		return this.baseMapper.getSubjectiveVo(studentIds);
 	}
 
 	@Override

+ 43 - 45
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -294,55 +294,58 @@
     </select>
     <select id="studentList"
             resultType="com.qmth.teachcloud.mark.bean.archivescore.ArchiveStudentVo">
-        select t.*,t.id studentId, ifnull(t.objective_score,0)+ifnull(t.subjective_score,0) totalScore
-        from mark_student t
-        where t.exam_id=#{req.examId} and t.paper_number=#{req.paperNumber}
+        select s.*,s.id studentId, ifnull(s.objective_score,0)+ifnull(s.subjective_score,0) totalScore
+        from mark_student s
+        <include refid="archiveQuery"/>
+        <if test="req.orderType != null and req.orderType != '' and req.orderField != null and req.orderField != ''">
+            <choose>
+                <when test="req.orderField == 'totalScore'">
+                    <if test="req.orderType == 'ASC'">
+                        order by (ifnull(s.objective_score, 0) + ifnull(s.subjective_score, 0)) ASC
+                    </if>
+                    <if test="req.orderType == 'DESC'">
+                        order by (ifnull(s.objective_score, 0) + ifnull(s.subjective_score, 0)) DESC
+                    </if>
+                </when>
+                <otherwise>
+                    order by #{req.orderField} #{req.orderType}
+                </otherwise>
+            </choose>
+        </if>
+        <if test="req.orderType == null or req.orderType == '' or req.orderField == null or req.orderField == ''">
+            order by s.student_code
+        </if>
+    </select>
+    <sql id="archiveQuery">
+        where s.exam_id=#{req.examId} and s.paper_number=#{req.paperNumber}
         <if test="req.studentCode != null and req.studentCode !=''">
-            and t.student_code=#{req.studentCode}
+            and s.student_code=#{req.studentCode}
         </if>
         <if test="req.startStudentCode != null and req.startStudentCode !=''">
-            and t.student_code &gt;= #{req.startStudentCode}
+            and s.student_code &gt;= #{req.startStudentCode}
         </if>
         <if test="req.endStudentCode != null and req.endStudentCode !=''">
-            and t.student_code &lt;= #{req.endStudentCode}
+            and s.student_code &lt;= #{req.endStudentCode}
         </if>
         <if test="req.studentName != null and req.studentName !=''">
-            and t.student_name=#{req.studentName}
+            and s.student_name=#{req.studentName}
         </if>
         <if test="req.college != null and req.college !=''">
-            and t.college like concat(#{req.college}, '%')
+            and s.college like concat(#{req.college}, '%')
         </if>
         <if test="req.majorName != null and req.majorName !=''">
-            and t.major_name like concat(#{req.majorName}, '%')
+            and s.major_name like concat(#{req.majorName}, '%')
         </if>
         <if test="req.className != null and req.className !=''">
-            and t.class_name like concat(#{req.className}, '%')
+            and s.class_name like concat(#{req.className}, '%')
         </if>
         <if test="req.startScore != null and req.startScore !=''">
-            and (ifnull(t.objective_score,0)+ifnull(t.subjective_score,0)) &gt;= #{req.startScore}
+            and (ifnull(s.objective_score,0)+ifnull(s.subjective_score,0)) &gt;= #{req.startScore}
         </if>
         <if test="req.endScore != null and req.endScore !=''">
-            and (ifnull(t.objective_score,0)+ifnull(t.subjective_score,0)) &lt;= #{req.endScore}
-        </if>
-        <if test="req.orderType != null and req.orderType != '' and req.orderField != null and req.orderField != ''">
-            <choose>
-                <when test="req.orderField == 'totalScore'">
-                    <if test="req.orderType == 'ASC'">
-                        order by (ifnull(t.objective_score, 0) + ifnull(t.subjective_score, 0)) ASC
-                    </if>
-                    <if test="req.orderType == 'DESC'">
-                        order by (ifnull(t.objective_score, 0) + ifnull(t.subjective_score, 0)) DESC
-                    </if>
-                </when>
-                <otherwise>
-                    order by #{req.orderField} #{req.orderType}
-                </otherwise>
-            </choose>
+            and (ifnull(s.objective_score,0)+ifnull(s.subjective_score,0)) &lt;= #{req.endScore}
         </if>
-        <if test="req.orderType == null or req.orderType == '' or req.orderField == null or req.orderField == ''">
-            order by t.student_code
-        </if>
-    </select>
+    </sql>
     <select id="overview" resultType="com.qmth.teachcloud.mark.bean.archivescore.OverViewVo">
         SELECT count(*)                                                                                 studentCount,
                sum(case
@@ -363,8 +366,7 @@
                  left join mark_paper t on s.exam_id = t.exam_id
             and s.paper_number = t.paper_number
             and s.paper_type = t.paper_type
-        WHERE s.exam_id = #{examId}
-          and s.paper_number = #{paperNumber}
+        <include refid="archiveQuery"/>
     </select>
     <select id="getCountByScoreRange" resultType="int">
         SELECT count(*)
@@ -391,9 +393,8 @@
                  left join mark_paper t on s.exam_id = t.exam_id
             and s.paper_number = t.paper_number
             and s.paper_type = t.paper_type
-        WHERE s.exam_id = #{examId}
-          and s.paper_number = #{paperNumber}
-          and s.college is not null
+            <include refid="archiveQuery"/>
+            and s.college is not null
         group by s.college
     </select>
     <select id="classData" resultType="com.qmth.teachcloud.mark.bean.archivescore.ClassVo">
@@ -413,9 +414,8 @@
                  left join mark_paper t on s.exam_id = t.exam_id
             and s.paper_number = t.paper_number
             and s.paper_type = t.paper_type
-        WHERE s.exam_id = #{examId}
-          and s.paper_number = #{paperNumber}
-          and s.class_name is not null
+            <include refid="archiveQuery"/>
+            and s.class_name is not null
         group by s.class_name
     </select>
     <select id="teacher" resultType="com.qmth.teachcloud.mark.bean.archivescore.TeacherVo">
@@ -435,9 +435,8 @@
                  left join mark_paper t on s.exam_id = t.exam_id
             and s.paper_number = t.paper_number
             and s.paper_type = t.paper_type
-        WHERE s.exam_id = #{examId}
-          and s.paper_number = #{paperNumber}
-          and s.teacher is not null
+            <include refid="archiveQuery"/>
+            and s.teacher is not null
         group by s.teacher
     </select>
     <select id="findOne" resultType="com.qmth.teachcloud.mark.bean.student.StudentVo"
@@ -502,9 +501,8 @@
                  left join mark_paper t on s.exam_id = t.exam_id
             and s.paper_number = t.paper_number
             and s.paper_type = t.paper_type
-        WHERE s.exam_id = #{examId}
-          and s.paper_number = #{paperNumber}
-          and s.class_name is not null
+            <include refid="archiveQuery"/>
+            and s.class_name is not null
         group by s.teacher, s.class_name
     </select>
     <select id="selectCountByQuery" resultType="java.lang.Integer">

+ 4 - 1
teachcloud-mark/src/main/resources/mapper/ExamTaskPaperDataService.xml → teachcloud-mark/src/main/resources/mapper/MarkSubjectiveScoreMapper.xml

@@ -26,7 +26,10 @@
         left join mark_question t on t.exam_id=s.exam_id and t.paper_number=s.paper_number 
         and t.main_number=s.main_number and t.sub_number=s.sub_number
         WHERE
-            s.exam_id = #{examId} and s.paper_number = #{paperNumber}
+            s.student_id In
+            <foreach collection="studentIds" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
         group by t.main_title,t.main_number,t.sub_number,t.total_score
         order by t.main_number,t.sub_number
     </select>