瀏覽代碼

add:新需求相关

caozixuan 3 年之前
父節點
當前提交
f567b197c0
共有 22 個文件被更改,包括 1959 次插入169 次删除
  1. 73 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/gradeAnalyze/ModuleDefine.java
  2. 59 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/gradeAnalyze/ModuleEvaluation.java
  3. 59 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/gradeAnalyze/SecondaryDimensionLevelDefine.java
  4. 131 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeacherRankForClazz.java
  5. 579 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseClazzTeacher.java
  6. 37 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseRecord.java
  7. 4 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/enums/SemesterEnum.java
  8. 78 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseClazzTeacherMapper.java
  9. 46 40
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeForReportService.java
  10. 36 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/DataAnalyzeService.java
  11. 75 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseClazzTeacherService.java
  12. 292 79
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeForReportServiceImpl.java
  13. 56 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/DataAnalyzeServiceImpl.java
  14. 73 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseClazzTeacherServiceImpl.java
  15. 221 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseClazzTeacherMapper.xml
  16. 2 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/BasicDatasourceController.java
  17. 9 4
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/CourseController.java
  18. 7 2
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/DataAnalyzeController.java
  19. 14 9
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/DataDriveController.java
  20. 8 4
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TAExamCourseCollegeTeacherController.java
  21. 31 23
      teachcloud-report/src/test/java/com/qmth/teachcloud/report/AnalyzeForStudentServiceTest.java
  22. 69 3
      teachcloud-report/src/test/java/com/qmth/teachcloud/report/report/CourseReportTest.java

+ 73 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/gradeAnalyze/ModuleDefine.java

@@ -0,0 +1,73 @@
+package com.qmth.teachcloud.report.business.bean.dto.gradeAnalyze;
+
+import java.util.List;
+
+/**
+ * @Description: 知识模块
+ * @Author: CaoZixuan
+ * @Date: 2022-05-19
+ */
+public class ModuleDefine {
+    // 模块定义 --
+    // 模块类型
+    private String moduleType;
+    // 模块解释
+    private String interpret;
+    // 备注
+    private String remark;
+    // 二级维度精熟度定义
+    private List<SecondaryDimensionLevelDefine> secondaryDimensionLevelDefineList;
+    // 模块评价 --
+    // 计算方式(得分率,百分等级)
+    private String formula;
+    // 模块评价
+    private List<ModuleEvaluation> moduleEvaluationList;
+
+    public String getModuleType() {
+        return moduleType;
+    }
+
+    public void setModuleType(String moduleType) {
+        this.moduleType = moduleType;
+    }
+
+    public String getInterpret() {
+        return interpret;
+    }
+
+    public void setInterpret(String interpret) {
+        this.interpret = interpret;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public List<SecondaryDimensionLevelDefine> getSecondaryDimensionLevelDefineList() {
+        return secondaryDimensionLevelDefineList;
+    }
+
+    public void setSecondaryDimensionLevelDefineList(List<SecondaryDimensionLevelDefine> secondaryDimensionLevelDefineList) {
+        this.secondaryDimensionLevelDefineList = secondaryDimensionLevelDefineList;
+    }
+
+    public String getFormula() {
+        return formula;
+    }
+
+    public void setFormula(String formula) {
+        this.formula = formula;
+    }
+
+    public List<ModuleEvaluation> getModuleEvaluationList() {
+        return moduleEvaluationList;
+    }
+
+    public void setModuleEvaluationList(List<ModuleEvaluation> moduleEvaluationList) {
+        this.moduleEvaluationList = moduleEvaluationList;
+    }
+}

+ 59 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/gradeAnalyze/ModuleEvaluation.java

@@ -0,0 +1,59 @@
+package com.qmth.teachcloud.report.business.bean.dto.gradeAnalyze;
+
+/**
+ * @Description: 模块评价
+ * @Author: CaoZixuan
+ * @Date: 2022-05-19
+ */
+public class ModuleEvaluation {
+    // B
+    private String levelCode;
+    // 表现良好水平
+    private String levelName;
+    // 作答结果反映你在本次测验中处于良好水平。你能理解并基本掌握本学期的绝大部分知识点,能够将所学的物理知识用于解决相关的物理问题。但可能在知识体系上还存在漏洞,对某些知识点掌握的还不够熟练,或者是综合分析的能力还不够强。总之你还有进步的空间。
+    private String result;
+    // 建议你根据本次报告的反馈,进行有针对性的强化学习,逐个攻破曾困扰你的难题,加深对所学知识、概念的理解、进一步提高灵活应用能力和综合分析能力。相信你在下一次的测评中能够更上一层楼。
+    private String advice;
+    // [0.75,0.9)
+    private String scope;
+
+    public String getLevelCode() {
+        return levelCode;
+    }
+
+    public void setLevelCode(String levelCode) {
+        this.levelCode = levelCode;
+    }
+
+    public String getLevelName() {
+        return levelName;
+    }
+
+    public void setLevelName(String levelName) {
+        this.levelName = levelName;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public String getAdvice() {
+        return advice;
+    }
+
+    public void setAdvice(String advice) {
+        this.advice = advice;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+}

+ 59 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/gradeAnalyze/SecondaryDimensionLevelDefine.java

@@ -0,0 +1,59 @@
+package com.qmth.teachcloud.report.business.bean.dto.gradeAnalyze;
+
+/**
+ * @Description: 模块二级维度定义
+ * @Author: CaoZixuan
+ * @Date: 2022-05-19
+ */
+public class SecondaryDimensionLevelDefine {
+    // 较好掌握:75%≤个人得分率<90%
+    private String define;
+    // B
+    private String level;
+    // 0.75
+    private String min;
+    // 0.9
+    private String max;
+    // [0.75,0.9)
+    private String scope;
+
+    public String getDefine() {
+        return define;
+    }
+
+    public void setDefine(String define) {
+        this.define = define;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public String getMin() {
+        return min;
+    }
+
+    public void setMin(String min) {
+        this.min = min;
+    }
+
+    public String getMax() {
+        return max;
+    }
+
+    public void setMax(String max) {
+        this.max = max;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+}

+ 131 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeacherRankForClazz.java

@@ -0,0 +1,131 @@
+package com.qmth.teachcloud.report.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description:
+ * @Author: CaoZixuan
+ * @Date:
+ */
+public class TeacherRankForClazz {
+    @ApiModelProperty(value = "班级编号")
+    private String clazzCode;
+
+    @ApiModelProperty(value = "教师名称")
+    private String teacherName;
+
+    @ApiModelProperty(value = "主体学院名称")
+    private String inspectCollegeName;
+
+    @ApiModelProperty(value = "课程编号")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "开课学院")
+    private String teachCollegeName;
+
+    @ApiModelProperty(value = "客观题均分")
+    private Double objAvgScore;
+
+    @ApiModelProperty(value = "主观题均分")
+    private Double subAvgScore;
+
+    @ApiModelProperty(value = "卷面平均分")
+    private Double avgScore;
+
+    @ApiModelProperty(value = "最终平均分")
+    private Double avgScoreAssign;
+
+    @ApiModelProperty(value = "主体学院院内排名")
+    private Integer rank;
+
+    public String getClazzCode() {
+        return clazzCode;
+    }
+
+    public void setClazzCode(String clazzCode) {
+        this.clazzCode = clazzCode;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getInspectCollegeName() {
+        return inspectCollegeName;
+    }
+
+    public void setInspectCollegeName(String inspectCollegeName) {
+        this.inspectCollegeName = inspectCollegeName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getTeachCollegeName() {
+        return teachCollegeName;
+    }
+
+    public void setTeachCollegeName(String teachCollegeName) {
+        this.teachCollegeName = teachCollegeName;
+    }
+
+    public Double getObjAvgScore() {
+        return objAvgScore;
+    }
+
+    public void setObjAvgScore(Double objAvgScore) {
+        this.objAvgScore = objAvgScore;
+    }
+
+    public Double getSubAvgScore() {
+        return subAvgScore;
+    }
+
+    public void setSubAvgScore(Double subAvgScore) {
+        this.subAvgScore = subAvgScore;
+    }
+
+    public Double getAvgScore() {
+        return avgScore;
+    }
+
+    public void setAvgScore(Double avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public Double getAvgScoreAssign() {
+        return avgScoreAssign;
+    }
+
+    public void setAvgScoreAssign(Double avgScoreAssign) {
+        this.avgScoreAssign = avgScoreAssign;
+    }
+
+    public Integer getRank() {
+        return rank;
+    }
+
+    public void setRank(Integer rank) {
+        this.rank = rank;
+    }
+}

+ 579 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseClazzTeacher.java

@@ -0,0 +1,579 @@
+package com.qmth.teachcloud.report.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
+
+/**
+ * @Description: 参考课程班级下授课教师维度分析表
+ * @Author: CaoZixuan
+ * @Date: 2022-06-24
+ */
+@ApiModel(value = "TAExamCourseClazzTeacher对象", description = "参考课程班级下授课教师维度分析表")
+public class TAExamCourseClazzTeacher implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "exam_id")
+    private Long examId;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "科目编码")
+    @TableField(value = "course_code")
+    private String courseCode;
+
+    @ApiModelProperty(value = "科目名称")
+    @TableField(value = "course_name")
+    private String courseName;
+
+    @ApiModelProperty(value = "授课班级id(此表以该字段为统计)")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "clazz_id")
+    private Long clazzId;
+
+    @ApiModelProperty(value = "授课班级编号(冗余)")
+    @TableField(value = "clazz_code")
+    private String clazzCode;
+
+    @ApiModelProperty(value = "授课教师id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "teacher_id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "主体考察学院id(班级所在最多数学生所在学院)")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "main_college_ids")
+    private String mainCollegeIds;
+
+    @ApiModelProperty(value = "主体考察学院名称(冗余)")
+    @TableField(value = "main_college_names")
+    private String mainCollegeNames;
+
+    @ApiModelProperty(value = "授课教师名称(冗余)")
+    @TableField(value = "teacher_name")
+    private String teacherName;
+
+    @ApiModelProperty(value = "客观题卷面平均分")
+    @TableField(value = "obj_avg_score")
+    private BigDecimal objAvgScore;
+
+    @ApiModelProperty(value = "主观题卷面平均分")
+    @TableField(value = "sub_avg_score")
+    private BigDecimal subAvgScore;
+
+    @ApiModelProperty(value = "卷面平均分")
+    @TableField(value = "avg_score")
+    private BigDecimal avgScore;
+
+    @ApiModelProperty(value = "赋分后授课学生最低分")
+    @TableField(value = "min_score_assign")
+    private BigDecimal minScoreAssign;
+
+    @ApiModelProperty(value = "赋分后授课学生最高分")
+    @TableField(value = "max_score_assign")
+    private BigDecimal maxScoreAssign;
+
+    @ApiModelProperty(value = "赋分后授课学生平均分")
+    @TableField(value = "avg_score_assign")
+    private BigDecimal avgScoreAssign;
+
+    @ApiModelProperty(value = "授课学生分数上四分位数")
+    @TableField(value = "upper_quartile")
+    private BigDecimal upperQuartile;
+
+    @ApiModelProperty(value = "授课学生中位数")
+    @TableField(value = "median")
+    private BigDecimal median;
+
+    @ApiModelProperty(value = "授课学生分数下四分位数")
+    @TableField(value = "lower_quartile")
+    private BigDecimal lowerQuartile;
+
+    @ApiModelProperty(value = "授课学生分数众数")
+    @TableField(value = "mode")
+    private String mode;
+
+    @ApiModelProperty(value = "授课学生分数标准差")
+    @TableField(value = "standard_deviation")
+    private BigDecimal standardDeviation;
+
+    @ApiModelProperty(value = "授课学生分数相对位置")
+    @TableField(value = "relative_position")
+    private BigDecimal relativePosition;
+
+    @ApiModelProperty(value = "授课学生实际参考人数")
+    @TableField(value = "reality_count")
+    private Integer realityCount;
+
+    @ApiModelProperty(value = "授课学生缺考人数")
+    @TableField(value = "absent_count")
+    private Integer absentCount;
+
+    @ApiModelProperty(value = "总人数")
+    @TableField(value = "total_count")
+    private Integer totalCount;
+
+    @ApiModelProperty(value = "授课学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "teach_college_id")
+    private Long teachCollegeId;
+
+    @ApiModelProperty(value = "授课学院名称")
+    @TableField(value = "teach_college_name")
+    private String teachCollegeName;
+
+    @ApiModelProperty(value = "该科目,授课班级下排名")
+    @TableField(value = "teacher_rank")
+    private Integer teacherRank;
+
+    @ApiModelProperty(value = "教师人数")
+    @TableField(value = "teacher_count")
+    private Integer teacherCount;
+
+    @ApiModelProperty(value = "其他班级授课学生最低分(赋分)")
+    @TableField(value = "other_clazz_min_score_assign")
+    private BigDecimal otherClazzMinScoreAssign;
+
+    @ApiModelProperty(value = "其他班级授课学生最高分(赋分)")
+    @TableField(value = "other_clazz_max_score_assign")
+    private BigDecimal otherClazzMaxScoreAssign;
+
+    @ApiModelProperty(value = "其他班级授课学生平均分(赋分)")
+    @TableField(value = "other_clazz_avg_score_assign")
+    private BigDecimal otherClazzAvgScoreAssign;
+
+    @ApiModelProperty(value = "其他班级授课学生分数上四分位数")
+    @TableField(value = "other_clazz_upper_quartile")
+    private BigDecimal otherClazzUpperQuartile;
+
+    @ApiModelProperty(value = "其他班级授课学生中位数")
+    @TableField(value = "other_clazz_median")
+    private BigDecimal otherClazzMedian;
+
+    @ApiModelProperty(value = "其他班级授课学生分数下四分位数")
+    @TableField(value = "other_clazz_lower_quartile")
+    private BigDecimal otherClazzLowerQuartile;
+
+    @ApiModelProperty(value = "其他班级授课学生分数众数")
+    @TableField(value = "other_clazz_mode")
+    private String otherClazzMode;
+
+    @ApiModelProperty(value = "其他班级授课学生实际参考人数")
+    @TableField(value = "other_clazz_reality_count")
+    private Integer otherClazzRealityCount;
+
+    @ApiModelProperty(value = "其他班级授课学生缺考人数")
+    @TableField(value = "other_clazz_absent_count")
+    private Integer otherClazzAbsentCount;
+
+    @ApiModelProperty(value = "其他班级总人数")
+    @TableField(value = "other_clazz_total_count")
+    private Integer otherClazzTotalCount;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public Long getClazzId() {
+        return clazzId;
+    }
+
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
+    }
+
+    public String getClazzCode() {
+        return clazzCode;
+    }
+
+    public void setClazzCode(String clazzCode) {
+        this.clazzCode = clazzCode;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getMainCollegeIds() {
+        return mainCollegeIds;
+    }
+
+    public void setMainCollegeIds(String mainCollegeIds) {
+        this.mainCollegeIds = mainCollegeIds;
+    }
+
+    public String getMainCollegeNames() {
+        return mainCollegeNames;
+    }
+
+    public void setMainCollegeNames(String mainCollegeNames) {
+        this.mainCollegeNames = mainCollegeNames;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public BigDecimal getObjAvgScore() {
+        if (Objects.nonNull(objAvgScore)) {
+            return objAvgScore.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setObjAvgScore(BigDecimal objAvgScore) {
+        this.objAvgScore = objAvgScore;
+    }
+
+    public BigDecimal getSubAvgScore() {
+        if (Objects.nonNull(subAvgScore)) {
+            return subAvgScore.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setSubAvgScore(BigDecimal subAvgScore) {
+        this.subAvgScore = subAvgScore;
+    }
+
+    public BigDecimal getAvgScore() {
+        if (Objects.nonNull(avgScore)) {
+            return avgScore.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setAvgScore(BigDecimal avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public BigDecimal getMinScoreAssign() {
+        if (Objects.nonNull(minScoreAssign)) {
+            return minScoreAssign.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setMinScoreAssign(BigDecimal minScoreAssign) {
+        this.minScoreAssign = minScoreAssign;
+    }
+
+    public BigDecimal getMaxScoreAssign() {
+        if (Objects.nonNull(maxScoreAssign)) {
+            return maxScoreAssign.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setMaxScoreAssign(BigDecimal maxScoreAssign) {
+        this.maxScoreAssign = maxScoreAssign;
+    }
+
+    public BigDecimal getAvgScoreAssign() {
+        if (Objects.nonNull(avgScoreAssign)) {
+            return avgScoreAssign.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setAvgScoreAssign(BigDecimal avgScoreAssign) {
+        this.avgScoreAssign = avgScoreAssign;
+    }
+
+    public BigDecimal getUpperQuartile() {
+        if (Objects.nonNull(upperQuartile)) {
+            return upperQuartile.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setUpperQuartile(BigDecimal upperQuartile) {
+        this.upperQuartile = upperQuartile;
+    }
+
+    public BigDecimal getMedian() {
+        if (Objects.nonNull(median)) {
+            return median.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setMedian(BigDecimal median) {
+        this.median = median;
+    }
+
+    public BigDecimal getLowerQuartile() {
+        if (Objects.nonNull(lowerQuartile)) {
+            return lowerQuartile.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setLowerQuartile(BigDecimal lowerQuartile) {
+        this.lowerQuartile = lowerQuartile;
+    }
+
+    public String getMode() {
+        return mode;
+    }
+
+    public void setMode(String mode) {
+        this.mode = mode;
+    }
+
+    public BigDecimal getStandardDeviation() {
+        if (Objects.nonNull(standardDeviation)) {
+            return standardDeviation.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setStandardDeviation(BigDecimal standardDeviation) {
+        this.standardDeviation = standardDeviation;
+    }
+
+    public BigDecimal getRelativePosition() {
+        if (Objects.nonNull(relativePosition)) {
+            return relativePosition.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setRelativePosition(BigDecimal relativePosition) {
+        this.relativePosition = relativePosition;
+    }
+
+    public Integer getRealityCount() {
+        return realityCount;
+    }
+
+    public void setRealityCount(Integer realityCount) {
+        this.realityCount = realityCount;
+    }
+
+    public Integer getAbsentCount() {
+        return absentCount;
+    }
+
+    public void setAbsentCount(Integer absentCount) {
+        this.absentCount = absentCount;
+    }
+
+    public Integer getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(Integer totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public Long getTeachCollegeId() {
+        return teachCollegeId;
+    }
+
+    public void setTeachCollegeId(Long teachCollegeId) {
+        this.teachCollegeId = teachCollegeId;
+    }
+
+    public String getTeachCollegeName() {
+        return teachCollegeName;
+    }
+
+    public void setTeachCollegeName(String teachCollegeName) {
+        this.teachCollegeName = teachCollegeName;
+    }
+
+    public Integer getTeacherRank() {
+        return teacherRank;
+    }
+
+    public void setTeacherRank(Integer teacherRank) {
+        this.teacherRank = teacherRank;
+    }
+
+    public Integer getTeacherCount() {
+        return teacherCount;
+    }
+
+    public void setTeacherCount(Integer teacherCount) {
+        this.teacherCount = teacherCount;
+    }
+
+    public BigDecimal getOtherClazzMinScoreAssign() {
+        if (Objects.nonNull(otherClazzMinScoreAssign)) {
+            return otherClazzMinScoreAssign.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setOtherClazzMinScoreAssign(BigDecimal otherClazzMinScoreAssign) {
+        this.otherClazzMinScoreAssign = otherClazzMinScoreAssign;
+    }
+
+    public BigDecimal getOtherClazzMaxScoreAssign() {
+        if (Objects.nonNull(otherClazzMaxScoreAssign)) {
+            return otherClazzMaxScoreAssign.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setOtherClazzMaxScoreAssign(BigDecimal otherClazzMaxScoreAssign) {
+        this.otherClazzMaxScoreAssign = otherClazzMaxScoreAssign;
+    }
+
+    public BigDecimal getOtherClazzAvgScoreAssign() {
+        if (Objects.nonNull(otherClazzAvgScoreAssign)) {
+            return otherClazzAvgScoreAssign.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setOtherClazzAvgScoreAssign(BigDecimal otherClazzAvgScoreAssign) {
+        this.otherClazzAvgScoreAssign = otherClazzAvgScoreAssign;
+    }
+
+    public BigDecimal getOtherClazzUpperQuartile() {
+        if (Objects.nonNull(otherClazzUpperQuartile)) {
+            return otherClazzUpperQuartile.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setOtherClazzUpperQuartile(BigDecimal otherClazzUpperQuartile) {
+        this.otherClazzUpperQuartile = otherClazzUpperQuartile;
+    }
+
+    public BigDecimal getOtherClazzMedian() {
+        if (Objects.nonNull(otherClazzMedian)) {
+            return otherClazzMedian.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setOtherClazzMedian(BigDecimal otherClazzMedian) {
+        this.otherClazzMedian = otherClazzMedian;
+    }
+
+    public BigDecimal getOtherClazzLowerQuartile() {
+        if (Objects.nonNull(otherClazzLowerQuartile)) {
+            return otherClazzLowerQuartile.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setOtherClazzLowerQuartile(BigDecimal otherClazzLowerQuartile) {
+        this.otherClazzLowerQuartile = otherClazzLowerQuartile;
+    }
+
+    public String getOtherClazzMode() {
+        return otherClazzMode;
+    }
+
+    public void setOtherClazzMode(String otherClazzMode) {
+        this.otherClazzMode = otherClazzMode;
+    }
+
+    public Integer getOtherClazzRealityCount() {
+        return otherClazzRealityCount;
+    }
+
+    public void setOtherClazzRealityCount(Integer otherClazzRealityCount) {
+        this.otherClazzRealityCount = otherClazzRealityCount;
+    }
+
+    public Integer getOtherClazzAbsentCount() {
+        return otherClazzAbsentCount;
+    }
+
+    public void setOtherClazzAbsentCount(Integer otherClazzAbsentCount) {
+        this.otherClazzAbsentCount = otherClazzAbsentCount;
+    }
+
+    public Integer getOtherClazzTotalCount() {
+        return otherClazzTotalCount;
+    }
+
+    public void setOtherClazzTotalCount(Integer otherClazzTotalCount) {
+        this.otherClazzTotalCount = otherClazzTotalCount;
+    }
+}

+ 37 - 3
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseRecord.java

@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Objects;
 
 /**
@@ -40,6 +41,18 @@ public class TAExamCourseRecord implements Serializable {
     @TableField(value = "exam_record_id")
     private Long examRecordId;
 
+    @ApiModelProperty(value = "客观题总分")
+    @TableField(value = "objective_score")
+    private BigDecimal objectiveScore;
+
+    @ApiModelProperty(value = "主观题总分")
+    @TableField(value = "subjective_score")
+    private BigDecimal subjectiveScore;
+
+    @ApiModelProperty(value = "卷面成绩")
+    @TableField(value = "total_score")
+    private BigDecimal totalScore;
+
     @ApiModelProperty(value = "赋分后成绩")
     @TableField(value = "assigned_score")
     private BigDecimal assignedScore;
@@ -112,9 +125,6 @@ public class TAExamCourseRecord implements Serializable {
     @TableField(value = "major_id")
     private Long majorId;
 
-    @ApiModelProperty(value = "卷面成绩")
-    @TableField(value = "total_score")
-    private BigDecimal totalScore;
 
     @ApiModelProperty(value = "是否缺考")
     @TableField(value = "absent")
@@ -335,4 +345,28 @@ public class TAExamCourseRecord implements Serializable {
     public void setSchoolId(Long schoolId) {
         this.schoolId = schoolId;
     }
+
+    public BigDecimal getObjectiveScore() {
+        if (Objects.nonNull(objectiveScore)) {
+            return objectiveScore.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setObjectiveScore(BigDecimal objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+    public BigDecimal getSubjectiveScore() {
+        if (Objects.nonNull(subjectiveScore)) {
+            return subjectiveScore.setScale(SystemConstant.CALCULATE_SCALE, RoundingMode.HALF_UP);
+        } else {
+            return null;
+        }
+    }
+
+    public void setSubjectiveScore(BigDecimal subjectiveScore) {
+        this.subjectiveScore = subjectiveScore;
+    }
 }

+ 4 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/enums/SemesterEnum.java

@@ -15,9 +15,11 @@ public enum SemesterEnum {
 
     SECOND("2020-2021学年度第2学期"),
 
-    THIRD("2021-2022学年度第1学期");
+    THIRD("2021-2022学年度第1学期"),
 
-    private String title;
+    FOURTH("2021-2022学年度第2学期");
+
+    private final String title;
 
     private SemesterEnum(String title) {
         this.title = title;

+ 78 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseClazzTeacherMapper.java

@@ -0,0 +1,78 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+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.report.business.bean.result.TeacherRankForClazz;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseClazzTeacher;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Description: 班级下授课教师维度mapper
+ * @Author: CaoZixuan
+ * @Date: 2022-06-24
+ */
+public interface TAExamCourseClazzTeacherMapper extends BaseMapper<TAExamCourseClazzTeacher> {
+
+    /**
+     * 开课院长看板 - 教师各课堂成绩排名
+     *
+     * @param page             分页参数
+     * @param schoolId         学校id
+     * @param semester         学期
+     * @param examId           考试id
+     * @param courseCode       课程编号
+     * @param inspectCollegeId 开课学院id
+     * @param collegeIds       数据权限
+     * @param column           排序列
+     * @param order            排序方式
+     * @return 分页结果
+     */
+    IPage<TeacherRankForClazz> listClassRank(@Param("page") Page<TeacherRankForClazz> page, @Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("inspectCollegeId") Long inspectCollegeId, @Param("collegeIds") List<Long> collegeIds, @Param("column") String column, @Param("order") String order);
+
+    /**
+     * 开课院长看板 - 开课课程考试总览-教师各课堂成绩排名接口
+     *
+     * @param page       分页信息
+     * @param schoolId   学校id
+     * @param semester   学期
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @param column     排序列
+     * @param order      排序方式
+     * @return 分页结果
+     */
+    IPage<TeacherRankForClazz> surveyTeacherTeacherView(@Param("page") Page<TeacherRankForClazz> page, @Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("column") String column, @Param("order") String order);
+
+    /**
+     * 教务处看板 - 全校课程考试分析 - 教师各课堂成绩排名
+     *
+     * @param page       分页信息
+     * @param schoolId   学校id
+     * @param semester   学期
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @param column     排序列
+     * @param order      排序方式
+     * @return 分页结果
+     */
+    IPage<TeacherRankForClazz> listTeacherClassRank(@Param("page") Page<TeacherRankForClazz> page, @Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("column") String column, @Param("order") String order);
+
+    /**
+     *
+     * @param page 分页信息
+     * @param schoolId 学校id
+     * @param semester 学期
+     * @param examId 考试id
+     * @param inspectCollegeId 考察学院id
+     * @param courseCode 课程编号
+     * @param teacherId 教师id
+     * @param collegeIds 数据权限
+     * @param column 排序列
+     * @param order 排序方式
+     * @return 分页结果
+     */
+    IPage<TeacherRankForClazz> listAllTeacherClassRank(@Param("page") Page<TeacherRankForClazz> page, @Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("inspectCollegeId") Long inspectCollegeId, @Param("courseCode") String courseCode, @Param("teacherId") Long teacherId, @Param("collegeIds") List<Long> collegeIds, @Param("column") String column, @Param("order") String order);
+}

+ 46 - 40
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeForReportService.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.report.business.service;
 
 import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
+import org.springframework.scheduling.annotation.Async;
 
 /**
  * @Description: 对个人看板的分析
@@ -14,27 +15,25 @@ public interface AnalyzeForReportService {
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourse(Long examId, String courseCode);
+    void buildAnalyzeExamCourse(Long examId, String courseCode);
 
     /**
      * 构建考试记录分析表数据 't_a_exam_course_record'
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseRecord(Long examId, String courseCode);
+    void buildAnalyzeExamCourseRecord(Long examId, String courseCode);
 
     /**
      * 构建以考试课程-考查学院维度的分析表 't_a_exam_course_college_inspect'
-     *
-     * @param examId     考试id
+     *  @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
+     * @return
      */
-    String buildAnalyzeExamCourseCollegeInspect(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseCollegeInspect(Long examId, String courseCode);
     
 
     /**
@@ -42,9 +41,9 @@ public interface AnalyzeForReportService {
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseClazz(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseClazz(Long examId, String courseCode);
 
     /**
      * 分析计算某科目考试的所有考查点得分率并将计算结果插入't_a_exam_course_dio'和't_a_exam_course_record_dio'和‘t_a_exam_course_record_mod’表中
@@ -67,120 +66,127 @@ public interface AnalyzeForReportService {
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzePointScoreRate(Long examId, String courseCode) throws Exception;
+    void buildAnalyzePointScoreRate(Long examId, String courseCode) throws Exception;
 
     /**
      * 构建考试课程考查学院维度分析表
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseCollegeInspectDio(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseCollegeInspectDio(Long examId, String courseCode);
 
     /**
      * 构建考试课程教师维度分析表
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode);
 
     /**
      * 构建表't_a_exam_course_teacher_college_dio'表来记录教师在每个授课学院各个考察点的得分率
      * @param examId 考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseTeacherCollegeDio(Long examId,String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseTeacherCollegeDio(Long examId,String courseCode);
 
     /**
      * 构建分析试卷结构表 't_a_paper_struct'表
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
+    
      */
-    String buildAnalyzePaperStruct(Long examId, String courseCode);
+    void buildAnalyzePaperStruct(Long examId, String courseCode);
 
     /**
      * 构建't_a_exam_course_college_paper_struct'表记录各个考察学院下学生的各个题目的难度情况
      * @param examId 考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeCollegePaperStruct(Long examId,String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeCollegePaperStruct(Long examId,String courseCode);
 
     /**
      * 构建't_a_exam_course_teacher_paper_struct'表记录该教师下所教学生的各个题目的难度情况
      * @param examId 考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeTeacherPaperStruct(Long examId,String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeTeacherPaperStruct(Long examId,String courseCode);
 
     /**
      * 构建't_a_exam_course_teacher_college_paper_struct'表记录该教师在某学院下所教学生的各个题目的难度情况
      * @param examId 考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeTeacherCollegePaperStruct(Long examId,String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeTeacherCollegePaperStruct(Long examId,String courseCode);
 
     /**
      * 构建科目题目难度分类得分率表 - 学院与学校
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildExamPaperDifficult(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildExamPaperDifficult(Long examId, String courseCode);
 
     /**
      * 构建科目题目难度分类得分率表 - 教师与学校
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildExamPaperTeacherDifficult(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildExamPaperTeacherDifficult(Long examId, String courseCode);
 
     /**
      * 构建't_a_exam_course_teacher_college_difficult'表记录该教师在某学院的各难度题作答分析
      * @param examId 考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId,String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId,String courseCode);
 
     /**
      * 构建表 ‘t_a_exam_total’
      *
      * @param examId 考试id
-     * @return 结果
      */
-    String buildAnalyzeExamTotal(Long examId);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamTotal(Long examId);
 
     /**
      * 构建表 't_a_exam_course_college_teacher'
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseCollegeTeacher(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseCollegeTeacher(Long examId, String courseCode);
+
+    /**
+     * 构建表 't_a_exam_course_clazz_teacher'
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     */
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseClazzTeacher(Long examId, String courseCode);
 
     /**
      * 构建表 't_a_exam_course_teacher'
      *
      * @param examId     考试id
      * @param courseCode 课程编号
-     * @return 结果
      */
-    String buildAnalyzeExamCourseTeacher(Long examId, String courseCode);
+    @Async("analyzeThreadPool")
+    void buildAnalyzeExamCourseTeacher(Long examId, String courseCode);
 
     /**
      * 更新表 't_b_exam_course'表 状态
@@ -188,9 +194,9 @@ public interface AnalyzeForReportService {
      * @param examId            考试id
      * @param courseCode        课程编号
      * @param publishStatusEnum 发布状态
-     * @return 结果
      */
-    String updateCoursePublishStatus(Long examId, String courseCode, PublishStatusEnum publishStatusEnum);
+    @Async("analyzeThreadPool")
+    void updateCoursePublishStatus(Long examId, String courseCode, PublishStatusEnum publishStatusEnum);
 
     /**
      * 数据计算总控

+ 36 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/DataAnalyzeService.java

@@ -0,0 +1,36 @@
+package com.qmth.teachcloud.report.business.service;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * @Description: 数据分析计算线程服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-11
+ */
+public interface DataAnalyzeService {
+
+    /**
+     * 前置表计算任务
+     *
+     * @param examId     考试id
+     * @param courseCode 分析课程编号
+     */
+    void predecessorAnalyzeTask(Long examId, String courseCode) throws Exception;
+
+    /**
+     * 其他表多线程计算任务
+     *
+     * @param examId     考试id
+     * @param courseCode 分析课程编号
+     */
+    void asyncAnalyzeTask(Long examId, String courseCode) throws Exception;
+
+    /**
+     * 数据计算
+     *
+     * @param examId     考试id
+     * @param courseCode 分析课程编号
+     */
+    CompletableFuture<Boolean> dataCalculate(Long examId, String courseCode) throws Exception;
+
+}

+ 75 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseClazzTeacherService.java

@@ -0,0 +1,75 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.bean.result.TeacherRankForClazz;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseClazzTeacher;
+import com.qmth.teachcloud.report.business.enums.OrderEnum;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
+
+/**
+ * @Description: 参考课程班级下授课教师维度接口
+ * @Author: CaoZixuan
+ * @Date: 2022-06-24
+ */
+public interface TAExamCourseClazzTeacherService extends IService<TAExamCourseClazzTeacher> {
+
+    /**
+     * 开课院长看板 - 教师各课堂成绩排名
+     *
+     * @param semester         学期
+     * @param examId           考试id
+     * @param courseCode       课程编号
+     * @param inspectCollegeId 开课学院id
+     * @param pageNumber       分页页数
+     * @param pageSize         分页容量
+     * @param column           排序列
+     * @param order            排序方式
+     * @return 分页查询结果
+     */
+    IPage<TeacherRankForClazz> listClassRank(SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId, Integer pageNumber, Integer pageSize, String column, OrderEnum order);
+
+
+    /**
+     * 开课院长看板 - 开课课程考试总览-教师各课堂成绩排名接口
+     *
+     * @param schoolId   学校id
+     * @param semester   学期
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @param pageNumber 分页页数
+     * @param pageSize   分页容量
+     * @param column     排序列
+     * @param order      排序方式
+     * @return 分页结果
+     */
+    IPage<TeacherRankForClazz> surveyTeacherTeacherView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Integer pageNumber, Integer pageSize, String column, OrderEnum order);
+
+    /**
+     * 教务处看板 - 全校课程考试分析 - 教师各课堂成绩排名
+     * @param semester 学期
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @param pageNumber 分页页数
+     * @param pageSize 分页容量
+     * @param column 排序列
+     * @param order 排序方式
+     * @return 分页结果
+     */
+    IPage<TeacherRankForClazz> listTeacherClassRank(SemesterEnum semester, Long examId, String courseCode, Integer pageNumber, Integer pageSize, String column, OrderEnum order);
+
+    /**
+     * 教务处看板 - 全校教师各课堂成绩排名
+     * @param semester 学期
+     * @param examId 考试id
+     * @param inspectCollegeId 考察学院id
+     * @param courseCode 课程编号
+     * @param teacherId 教师id
+     * @param pageNumber 分页页数
+     * @param pageSize 分页容量
+     * @param column 排序列
+     * @param order 排序方式
+     * @return 分页结果
+     */
+    IPage<TeacherRankForClazz> listAllTeacherClassRank(SemesterEnum semester, Long examId, Long inspectCollegeId, String courseCode, Long teacherId, Integer pageNumber, Integer pageSize, String column, OrderEnum order);
+}

+ 292 - 79
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeForReportServiceImpl.java

@@ -1,9 +1,9 @@
 package com.qmth.teachcloud.report.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.SysOrgService;
@@ -19,6 +19,8 @@ import com.qmth.teachcloud.report.business.utils.AnalyzeScopeUtil;
 import com.qmth.teachcloud.report.business.utils.ConversionUtils;
 import com.qmth.teachcloud.report.business.utils.MathUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -30,6 +32,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @Description: 学生看板数据计算
@@ -108,11 +111,17 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
     private TAExamCourseTeacherPaperStructService taExamCourseTeacherPaperStructService;
     @Resource
     private TAExamCourseTeacherCollegePaperStructService taExamCourseTeacherCollegePaperStructService;
+    @Resource
+    private TAExamCourseClazzTeacherService taExamCourseClazzTeacherService;
+    @Resource
+    private TBSchoolClazzService tbSchoolClazzService;
+
+    private final Logger log = LoggerFactory.getLogger(AnalyzeForReportServiceImpl.class);
 
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourse(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourse(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
         // 考试下考生作答数据源
@@ -288,7 +297,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             taExamCourse.setExamId(examId);
             taExamCourse.setExamName(tbExam.getExamName());
             taExamCourse.setCourseCode(effectiveCourseCode);
-            taExamCourse.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+            taExamCourse.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
             taExamCourse.setSchoolId(tbExam.getSchoolId());
             taExamCourse.setTeachCollegeId(teachCollegeId);
             taExamCourse.setTeachCollegeName(teachCollegeName);
@@ -331,12 +340,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             taExamCourseList.add(taExamCourse);
         }
         taExamCourseService.saveBatch(taExamCourseList);
-        return " 't_a_exam_course' 表构建完毕 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseRecord(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseRecord(Long examId, String courseCode) {
         // 获取本次考试所有考试记录数据源
         List<TAExamCourseRecord> taExamCourseRecordDatasource = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
                 .eq(TAExamCourseRecord::getExamId, examId)
@@ -378,12 +386,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
             taExamCourseRecordService.saveOrUpdateBatch(dataSource);
         }
-        return " 't_a_exam_course_record' 表更新完成";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseCollegeInspect(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseCollegeInspect(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         List<TAExamCourseRecord> recordDatasource = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
                 .eq(TAExamCourseRecord::getExamId, examId));
@@ -449,7 +456,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                 taExamCourseCollegeInspect.setExamId(examId);
                 taExamCourseCollegeInspect.setSchoolId(tbExamService.getById(examId).getSchoolId());
                 taExamCourseCollegeInspect.setCourseCode(effectiveCourseCode);
-                taExamCourseCollegeInspect.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                taExamCourseCollegeInspect.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                 taExamCourseCollegeInspect.setCollegeId(collegeId);
                 taExamCourseCollegeInspect.setMaxScore(BigDecimal.valueOf(maxScore));
                 taExamCourseCollegeInspect.setMinScore(BigDecimal.valueOf(minScore));
@@ -467,12 +474,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
         }
         taExamCourseCollegeInspectService.saveBatch(inspectCollegeList);
-        return "t_a_exam_course_college_inspect";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseClazz(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseClazz(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
 
         List<TAExamCourseRecord> recordDatasource = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
@@ -530,7 +536,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                 taExamCourseClazz.setExamId(examId);
                 taExamCourseClazz.setSchoolId(tbExamService.getById(examId).getSchoolId());
                 taExamCourseClazz.setCourseCode(effectiveCourseCode);
-                taExamCourseClazz.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                taExamCourseClazz.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                 taExamCourseClazz.setClazzId(clazzId);
                 taExamCourseClazz.setMaxScore(BigDecimal.valueOf(maxScore));
                 taExamCourseClazz.setMinScore(BigDecimal.valueOf(minScore));
@@ -543,12 +549,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
         }
         taExamCourseClazzService.saveBatch(taExamCourseClazzList);
-        return " 't_a_exam_course_clazz'表构建成功 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzePointScoreRate(Long examId, String courseCode) throws Exception {
+    public void buildAnalyzePointScoreRate(Long examId, String courseCode) throws Exception {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -669,7 +674,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                         taExamCourseRecordDio.setStudentId(taExamCourseRecord.getStudentId());
                         taExamCourseRecordDio.setStudentCode(taExamCourseRecord.getStudentCode());
                         taExamCourseRecordDio.setCourseCode(effectiveCourseCode);
-                        taExamCourseRecordDio.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                        taExamCourseRecordDio.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                         String[] dimCodeArr = s.split("-");
                         if (dimCodeArr.length != 2) {
                             throw ExceptionResultEnum.ERROR.exception("获得的考查点标识不符合标准,标准为 type-dimensionCode,结果为:  " + s);
@@ -722,7 +727,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                         taExamCourseRecordMod.setExamId(taExamCourseRecord.getExamId());
                         taExamCourseRecordMod.setSchoolId(tbExamService.getById(examId).getSchoolId());
                         taExamCourseRecordMod.setCourseCode(effectiveCourseCode);
-                        taExamCourseRecordMod.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                        taExamCourseRecordMod.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                         taExamCourseRecordMod.setModuleType(s);
                         taExamCourseRecordMod.setTotalScore(BigDecimal.valueOf(studentScore));
                         taExamCourseRecordMod.setScoreRate(BigDecimal.valueOf(rate));
@@ -766,7 +771,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                     taExamCourseDio.setExamId(examId);
                     taExamCourseDio.setSchoolId(tbExamService.getById(examId).getSchoolId());
                     taExamCourseDio.setCourseCode(effectiveCourseCode);
-                    taExamCourseDio.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                    taExamCourseDio.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                     taExamCourseDio.setPaperId(paperId);
                     taExamCourseDio.setDimensionType(dimensionType);
                     taExamCourseDio.setDimensionCode(dimensionCode);
@@ -829,12 +834,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             taExamCourseRecordModService.updateBatchById(examCourseRecordModList);
 
         }
-        return "维度表构建完毕";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseCollegeInspectDio(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseCollegeInspectDio(Long examId, String courseCode) {
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
         for (String effectiveCourseCode : effectiveCourseCodeList) {
@@ -845,12 +849,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
 
             taExamCourseCollegeInspectDioService.insertByTAExamCourseRecordDio(examId, effectiveCourseCode);
         }
-        return "'t_a_exam_course_college_inspect_dio'表构建完成 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode) {
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
         for (String effectiveCourseCode : effectiveCourseCodeList) {
@@ -861,12 +864,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
 
             taExamCourseTeacherDioService.insertByTAExamCourseRecordDio(examId, effectiveCourseCode);
         }
-        return "'t_a_exam_course_teacher_dio'表构建完成 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseTeacherCollegeDio(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseTeacherCollegeDio(Long examId, String courseCode) {
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
         for (String effectiveCourseCode : effectiveCourseCodeList) {
@@ -877,12 +879,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
 
             taExamCourseTeacherCollegeDioService.insertByTAExamCourseRecordDio(examId, effectiveCourseCode);
         }
-        return "'t_a_exam_course_teacher_college_dio'表构建完成 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzePaperStruct(Long examId, String courseCode) {
+    public void buildAnalyzePaperStruct(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -944,7 +945,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                     taPaperStruct.setExamId(examId);
                     taPaperStruct.setSchoolId(tbExamService.getById(examId).getSchoolId());
                     taPaperStruct.setCourseCode(effectiveCourseCode);
-                    taPaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                    taPaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                     taPaperStruct.setPaperId(paperId);
                     taPaperStruct.setPaperType(paperType);
                     taPaperStruct.setQuestionName(paperStruct.getQuestionName());
@@ -968,12 +969,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
             taPaperStructService.saveBatch(taPaperStructList);
         }
-        return " 't_a_paper_struct'表构建成功 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeCollegePaperStruct(Long examId, String courseCode) {
+    public void buildAnalyzeCollegePaperStruct(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1043,7 +1043,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                         taExamCourseCollegePaperStruct.setExamId(examId);
                         taExamCourseCollegePaperStruct.setSchoolId(tbExamService.getById(examId).getSchoolId());
                         taExamCourseCollegePaperStruct.setCourseCode(effectiveCourseCode);
-                        taExamCourseCollegePaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                        taExamCourseCollegePaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                         taExamCourseCollegePaperStruct.setPaperId(paperId);
                         taExamCourseCollegePaperStruct.setInspectCollegeId(inspectCollegeId);
                         taExamCourseCollegePaperStruct.setInspectCollegeName(inspectCollegeName);
@@ -1070,12 +1070,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
             taExamCourseCollegePaperStructService.saveBatch(taExamCourseCollegePaperStructList);
         }
-        return "'t_a_exam_course_college_paper_struct'表构建成功 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeTeacherPaperStruct(Long examId, String courseCode) {
+    public void buildAnalyzeTeacherPaperStruct(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1145,7 +1144,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                         taExamCourseTeacherPaperStruct.setExamId(examId);
                         taExamCourseTeacherPaperStruct.setSchoolId(tbExamService.getById(examId).getSchoolId());
                         taExamCourseTeacherPaperStruct.setCourseCode(effectiveCourseCode);
-                        taExamCourseTeacherPaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                        taExamCourseTeacherPaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                         taExamCourseTeacherPaperStruct.setPaperId(paperId);
                         taExamCourseTeacherPaperStruct.setTeacherId(teacherId);
                         taExamCourseTeacherPaperStruct.setTeacherName(teacherName);
@@ -1172,12 +1171,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
             taExamCourseTeacherPaperStructService.saveBatch(taExamCourseTeacherPaperStructList);
         }
-        return "'t_a_exam_course_teacher_paper_struct'表构建成功 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeTeacherCollegePaperStruct(Long examId, String courseCode) {
+    public void buildAnalyzeTeacherCollegePaperStruct(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1263,7 +1261,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                             taExamCourseTeacherCollegePaperStruct.setExamId(examId);
                             taExamCourseTeacherCollegePaperStruct.setSchoolId(tbExamService.getById(examId).getSchoolId());
                             taExamCourseTeacherCollegePaperStruct.setCourseCode(effectiveCourseCode);
-                            taExamCourseTeacherCollegePaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                            taExamCourseTeacherCollegePaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                             taExamCourseTeacherCollegePaperStruct.setPaperId(paperId);
                             taExamCourseTeacherCollegePaperStruct.setTeacherId(teacherId);
                             taExamCourseTeacherCollegePaperStruct.setTeacherName(teacherName);
@@ -1294,12 +1292,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
             taExamCourseTeacherCollegePaperStructService.saveBatch(tAExamCourseTeacherCollegePaperStructList);
         }
-        return "'t_a_exam_course_teacher_college_paper_struct'表构建成功 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildExamPaperDifficult(Long examId, String courseCode) {
+    public void buildExamPaperDifficult(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1366,7 +1363,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                         taExamCourseDifficult.setId(SystemConstant.getDbUuid());
                         taExamCourseDifficult.setExamId(examId);
                         taExamCourseDifficult.setCourseCode(effectiveCourseCode);
-                        taExamCourseDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                        taExamCourseDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                         taExamCourseDifficult.setPaperId(paperId);
                         taExamCourseDifficult.setPaperType(tbPaperService.getById(paperId).getPaperType());
                         taExamCourseDifficult.setCollegeId(collegeId);
@@ -1384,13 +1381,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
 
             taExamCourseDifficultService.saveBatch(taExamCourseDifficultList);
         }
-
-        return "'t_a_exam_course_difficult' 表构建完成";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildExamPaperTeacherDifficult(Long examId, String courseCode) {
+    public void buildExamPaperTeacherDifficult(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1459,7 +1454,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                         taExamCourseTeacherDifficult.setPaperId(paperId);
                         taExamCourseTeacherDifficult.setPaperType(tbPaperService.getById(paperId).getPaperType());
                         taExamCourseTeacherDifficult.setCourseCode(effectiveCourseCode);
-                        taExamCourseTeacherDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                        taExamCourseTeacherDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                         taExamCourseTeacherDifficult.setTeacherId(teacherId);
                         taExamCourseTeacherDifficult.setTeacherName(sysUserService.getById(teacherId).getRealName());
                         taExamCourseTeacherDifficult.setSchoolId(tbExamService.getById(examId).getSchoolId());
@@ -1476,13 +1471,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
 
             taExamCourseTeacherDifficultService.saveBatch(taExamCourseTeacherDifficultList);
         }
-
-        return "'t_a_exam_course_teacher_difficult' 表构建完成";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1575,7 +1568,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                             taExamCourseTeacherCollegeDifficult.setPaperId(paperId);
                             taExamCourseTeacherCollegeDifficult.setPaperType(tbPaperService.getById(paperId).getPaperType());
                             taExamCourseTeacherCollegeDifficult.setCourseCode(effectiveCourseCode);
-                            taExamCourseTeacherCollegeDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                            taExamCourseTeacherCollegeDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                             taExamCourseTeacherCollegeDifficult.setTeacherId(teacherId);
                             taExamCourseTeacherCollegeDifficult.setTeacherName(sysUserService.getById(teacherId).getRealName());
                             taExamCourseTeacherCollegeDifficult.setInspectCollegeId(collegeId);
@@ -1597,13 +1590,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
 
             taExamCourseTeacherCollegeDifficultService.saveBatch(taExamCourseTeacherCollegeDifficultList);
         }
-
-        return "'t_a_exam_course_teacher_college_difficult' 表构建完成";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamTotal(Long examId) {
+    public void buildAnalyzeExamTotal(Long examId) {
         // 删除原数据
         taExamTotalService.remove(new QueryWrapper<TAExamTotal>().lambda()
                 .eq(TAExamTotal::getExamId, examId));
@@ -1671,12 +1662,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
         taExamTotal.setExamTime(examTime);
 
         taExamTotalService.save(taExamTotal);
-        return " 't_a_exam_total'表构建完毕 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseCollegeTeacher(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseCollegeTeacher(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1816,7 +1806,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                     taExamCourseCollegeTeacher.setExamId(examId);
                     taExamCourseCollegeTeacher.setSchoolId(tbExamService.getById(examId).getSchoolId());
                     taExamCourseCollegeTeacher.setCourseCode(effectiveCourseCode);
-                    taExamCourseCollegeTeacher.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                    taExamCourseCollegeTeacher.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                     taExamCourseCollegeTeacher.setTeacherId(teacherId);
                     taExamCourseCollegeTeacher.setTeacherName(sysUserService.getById(teacherId).getRealName());
                     taExamCourseCollegeTeacher.setMinScoreAssign(BigDecimal.valueOf(minScoreAssign));
@@ -1860,14 +1850,237 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                 }
             }
             taExamCourseCollegeTeacherService.saveBatch(taExamCourseCollegeTeacherList);
+        }
+    }
+
+    @Override
+    public void buildAnalyzeExamCourseClazzTeacher(Long examId, String courseCode) {
+        Long schoolId = tbExamService.findSchoolIdByExamId(examId);
+        // 可分析有效课程信息
+        List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
+        for (String effectiveCourseCode : effectiveCourseCodeList) {
+            // 删除该课程原有分析
+            taExamCourseClazzTeacherService.remove(new QueryWrapper<TAExamCourseClazzTeacher>().lambda()
+                    .eq(TAExamCourseClazzTeacher::getExamId, examId)
+                    .eq(TAExamCourseClazzTeacher::getCourseCode, effectiveCourseCode));
+
+            List<TAExamCourseClazzTeacher> taExamCourseClazzTeacherList = new ArrayList<>();
+            // 整体该课程下数据源
+            List<TAExamCourseRecord> dataSource = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
+                    .eq(TAExamCourseRecord::getExamId, examId)
+                    .eq(TAExamCourseRecord::getCourseCode, effectiveCourseCode));
+
+            // 授课班级
+            Set<Long> clazzIdSet = dataSource.stream().map(TAExamCourseRecord::getClazzId).collect(Collectors.toSet());
+
+
+            for (Long clazzId : clazzIdSet) {
+                // 该班级下授课教师
+                Set<Long> teacherIdSet = dataSource.stream()
+                        .filter(e -> clazzId.equals(e.getClazzId()) && e.getStudentCurrent() && !e.getAbsent())
+                        .map(TAExamCourseRecord::getTeacherId)
+                        .collect(Collectors.toSet());
+
+                // 教师人数
+                for (Long teacherId : teacherIdSet) {
+                    // 该教师数据
+                    // ----- 教师在本院学生数据 ------
+                    List<TAExamCourseRecord> teacherRecordList = dataSource.stream()
+                            .filter(e -> clazzId.equals(e.getClazzId()) && teacherId.equals(e.getTeacherId()) && e.getStudentCurrent())
+                            .collect(Collectors.toList());
+
+                    // 学生人数
+                    int totalCount = teacherRecordList.size();
+                    List<TAExamCourseRecord> teacherEffectiveList = teacherRecordList.stream().filter(e -> !e.getAbsent()).collect(Collectors.toList());
+                    int realityCount = teacherEffectiveList.size();
+                    if (realityCount == 0) {
+                        continue;
+                    }
+                    int absentCount = totalCount - realityCount;
+
+                    // 成绩统计
+                    DoubleSummaryStatistics describeStatistic = teacherEffectiveList.stream()
+                            .collect(Collectors.summarizingDouble(e -> e.getAssignedScore().doubleValue())); // 学生赋分的描述统计
+                    double minScoreAssign = describeStatistic.getMin();
+                    double maxScoreAssign = describeStatistic.getMax();
+                    double avgScoreAssign = describeStatistic.getAverage();
+                    double avgScore = teacherEffectiveList.stream()
+                            .collect(Collectors.summarizingDouble(e -> e.getTotalScore().doubleValue())).getAverage();
+                    double objAvgScore = teacherEffectiveList.stream()
+                            .collect(Collectors.summarizingDouble(e -> e.getObjectiveScore().doubleValue())).getAverage();
+                    double subAvgScore = teacherEffectiveList.stream()
+                            .collect(Collectors.summarizingDouble(e -> e.getSubjectiveScore().doubleValue())).getAverage();
+                    List<Double> assignedScore = teacherEffectiveList.stream().map(e -> e.getAssignedScore().doubleValue()).collect(Collectors.toList());
+                    // 计算上四分位数
+                    double upperQuartile = MathUtil.calculateQuantile(assignedScore, QuantileEnum.UPPER_QUARTILE.getValue());
+
+                    // 计算中位数
+                    double median = MathUtil.calculateQuantile(assignedScore, QuantileEnum.MEDIAN.getValue());
 
+                    // 计算下四分位数
+                    double lowerQuartile = MathUtil.calculateQuantile(assignedScore, QuantileEnum.LOWER_QUARTILE.getValue());
+
+                    // 极端情况下分位数值处理
+                    if (upperQuartile == 0) {
+                        upperQuartile = median;
+                    }
+                    if (lowerQuartile == 0) {
+                        lowerQuartile = median;
+                    }
+
+                    String mode = MathUtil.calculateMode(assignedScore); // 众数
+                    double standardDeviation = MathUtil.calculateStandardDeviation(assignedScore); // 标准差
+
+                    double relativePosition = teacherEffectiveList.stream()
+                            .collect(Collectors.summarizingDouble(e -> e.getStandardizedCoefficients().doubleValue())).getAverage(); // 相对位置
+
+
+                    // ----- 教师在其他班级数据 -----
+                    List<TAExamCourseRecord> teacherRecordOtherClazzList = dataSource.stream()
+                            .filter(e -> !clazzId.equals(e.getClazzId()) && teacherId.equals(e.getTeacherId()) && e.getStudentCurrent())
+                            .collect(Collectors.toList());
+
+                    // 学生人数
+                    int otherClazzTotalCount = teacherRecordOtherClazzList.size();
+                    List<TAExamCourseRecord> teacherEffectiveOtherClazzList = teacherRecordOtherClazzList.stream().filter(e -> !e.getAbsent()).collect(Collectors.toList());
+                    int otherClazzRealityCount = teacherEffectiveOtherClazzList.size();
+                    int otherClazzAbsentCount = otherClazzTotalCount - otherClazzRealityCount;
+
+                    // 成绩统计
+                    DoubleSummaryStatistics otherClazzDescribeStatistic = teacherEffectiveOtherClazzList.stream()
+                            .collect(Collectors.summarizingDouble(e -> e.getAssignedScore().doubleValue())); // 学生赋分的描述统计
+                    double otherClazzMinScoreAssign = otherClazzDescribeStatistic.getMin();
+                    double otherClazzMaxScoreAssign = otherClazzDescribeStatistic.getMax();
+                    if (otherClazzRealityCount == 0) {
+                        otherClazzMinScoreAssign = 0;
+                        otherClazzMaxScoreAssign = 0;
+                    }
+                    double otherClazzAvgScoreAssign = otherClazzDescribeStatistic.getAverage();
+                    double otherClazzAvgScore = teacherEffectiveOtherClazzList.stream()
+                            .collect(Collectors.summarizingDouble(e -> e.getTotalScore().doubleValue())).getAverage();
+                    List<Double> otherClazzAssignedScore = teacherEffectiveOtherClazzList.stream().map(e -> e.getAssignedScore().doubleValue()).collect(Collectors.toList());
+                    // 计算上四分位数
+                    double otherClazzUpperQuartile = MathUtil.calculateQuantile(otherClazzAssignedScore, QuantileEnum.UPPER_QUARTILE.getValue());
+
+                    // 计算中位数
+                    double otherClazzMedian = MathUtil.calculateQuantile(otherClazzAssignedScore, QuantileEnum.MEDIAN.getValue());
+
+                    // 计算下四分位数
+                    double otherClazzLowerQuartile = MathUtil.calculateQuantile(otherClazzAssignedScore, QuantileEnum.LOWER_QUARTILE.getValue());
+
+                    // 极端情况下分位数值处理
+                    if (otherClazzUpperQuartile == 0) {
+                        otherClazzUpperQuartile = otherClazzMedian;
+                    }
+                    if (otherClazzLowerQuartile == 0) {
+                        otherClazzLowerQuartile = otherClazzMedian;
+                    }
+
+                    String otherClazzMode = MathUtil.calculateMode(otherClazzAssignedScore); // 众数
+
+
+                    // 开课学院数据
+                    List<Long> teachCollegeIdList = teacherEffectiveList.stream().map(TAExamCourseRecord::getTeachCollegeId).distinct().collect(Collectors.toList());
+                    if (teachCollegeIdList.size() > 1) {
+                        throw ExceptionResultEnum.ERROR.exception("有多个开课学院");
+                    }
+                    Long teachCollegeId = teachCollegeIdList.get(0);
+                    String teachCollegeName = SystemConstant.DEFAULT_SIGN;
+                    if (teachCollegeId > 0) {
+                        teachCollegeName = sysOrgService.getById(teachCollegeId).getName();
+                    }
+                    // ↓主体考察学院数据(班级内绝大多数学生所在的学院为主体考察学院,排名也按照这个来)
+                    Map<Long, Integer> inspectCollegeMap = teacherEffectiveList.stream()
+                            .sorted(Comparator.comparing(TAExamCourseRecord::getInspectCollegeId))
+                            .collect(Collectors.toMap(TAExamCourseRecord::getInspectCollegeId, e -> 1, Integer::sum));
+                    // 主体学院id集合
+                    List<Long> mainCollegeIdList = new ArrayList<>();
+                    List<Integer> countList = inspectCollegeMap.keySet().stream().flatMap(k -> {
+                        Integer v = inspectCollegeMap.get(k);
+                        return Stream.of(v);
+                    }).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
+                    Integer max = countList.get(0);
+
+                    mainCollegeIdList = inspectCollegeMap.keySet()
+                            .stream()
+                            .filter(e -> Objects.equals(max,inspectCollegeMap.get(e)))
+                            .sorted()
+                            .collect(Collectors.toList());
+                    // 主体学院id 逗号隔开
+                    String mainCollegeIds = mainCollegeIdList.stream().map(String::valueOf).collect(Collectors.joining(","));
+                    // 主体学院名称 逗号隔开
+                    String mainCollegeNames = mainCollegeIdList.stream().flatMap(e -> {
+                        SysOrg sysOrg = sysOrgService.getById(e);
+                        if (Objects.isNull(sysOrg)) {
+                            throw ExceptionResultEnum.ERROR.exception("未找到机构信息");
+                        }
+                        return Stream.of(sysOrg.getName());
+                    }).collect(Collectors.joining(","));
+
+
+                    TAExamCourseClazzTeacher taExamCourseClazzTeacher = new TAExamCourseClazzTeacher();
+                    taExamCourseClazzTeacher.setId(SystemConstant.getDbUuid());
+                    taExamCourseClazzTeacher.setExamId(examId);
+                    taExamCourseClazzTeacher.setClazzId(clazzId);
+                    taExamCourseClazzTeacher.setClazzCode(tbSchoolClazzService.getById(clazzId).getClazzCode());
+                    taExamCourseClazzTeacher.setSchoolId(tbExamService.getById(examId).getSchoolId());
+                    taExamCourseClazzTeacher.setCourseCode(effectiveCourseCode);
+                    taExamCourseClazzTeacher.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
+                    taExamCourseClazzTeacher.setTeacherId(teacherId);
+                    SysUser teacher = sysUserService.getById(teacherId);
+                    if (Objects.nonNull(teacher)){
+                        taExamCourseClazzTeacher.setTeacherName(teacher.getRealName());
+                    }
+                    taExamCourseClazzTeacher.setObjAvgScore(BigDecimal.valueOf(objAvgScore));
+                    taExamCourseClazzTeacher.setSubAvgScore(BigDecimal.valueOf(subAvgScore));
+                    taExamCourseClazzTeacher.setMinScoreAssign(BigDecimal.valueOf(minScoreAssign));
+                    taExamCourseClazzTeacher.setMaxScoreAssign(BigDecimal.valueOf(maxScoreAssign));
+                    taExamCourseClazzTeacher.setAvgScoreAssign(BigDecimal.valueOf(avgScoreAssign));
+                    taExamCourseClazzTeacher.setAvgScore(BigDecimal.valueOf(avgScore));
+                    taExamCourseClazzTeacher.setUpperQuartile(BigDecimal.valueOf(upperQuartile));
+                    taExamCourseClazzTeacher.setMedian(BigDecimal.valueOf(median));
+                    taExamCourseClazzTeacher.setLowerQuartile(BigDecimal.valueOf(lowerQuartile));
+                    taExamCourseClazzTeacher.setMode(mode);
+                    taExamCourseClazzTeacher.setStandardDeviation(BigDecimal.valueOf(standardDeviation));
+                    taExamCourseClazzTeacher.setRelativePosition(BigDecimal.valueOf(relativePosition));
+                    taExamCourseClazzTeacher.setRealityCount(realityCount);
+                    taExamCourseClazzTeacher.setTotalCount(totalCount);
+                    taExamCourseClazzTeacher.setAbsentCount(absentCount);
+                    taExamCourseClazzTeacher.setMainCollegeIds(mainCollegeIds);
+                    taExamCourseClazzTeacher.setMainCollegeNames(mainCollegeNames);
+                    taExamCourseClazzTeacher.setTeachCollegeId(teachCollegeId);
+                    taExamCourseClazzTeacher.setTeachCollegeName(teachCollegeName);
+                    taExamCourseClazzTeacher.setOtherClazzMinScoreAssign(BigDecimal.valueOf(otherClazzMinScoreAssign));
+                    taExamCourseClazzTeacher.setOtherClazzMaxScoreAssign(BigDecimal.valueOf(otherClazzMaxScoreAssign));
+                    taExamCourseClazzTeacher.setOtherClazzAvgScoreAssign(BigDecimal.valueOf(otherClazzAvgScoreAssign));
+                    taExamCourseClazzTeacher.setOtherClazzUpperQuartile(BigDecimal.valueOf(otherClazzUpperQuartile));
+                    taExamCourseClazzTeacher.setOtherClazzMedian(BigDecimal.valueOf(otherClazzMedian));
+                    taExamCourseClazzTeacher.setOtherClazzLowerQuartile(BigDecimal.valueOf(otherClazzLowerQuartile));
+                    taExamCourseClazzTeacher.setOtherClazzMode(otherClazzMode);
+                    taExamCourseClazzTeacher.setOtherClazzRealityCount(otherClazzRealityCount);
+                    taExamCourseClazzTeacher.setOtherClazzAbsentCount(otherClazzAbsentCount);
+                    taExamCourseClazzTeacher.setOtherClazzTotalCount(otherClazzTotalCount);
+                    taExamCourseClazzTeacherList.add(taExamCourseClazzTeacher);
+                }
+                // 计算教师排名(按照主体学院排名)
+                for (TAExamCourseClazzTeacher taExamCourseClazzTeacher : taExamCourseClazzTeacherList) {
+                    // 主体学院
+                    String mainCollegeIds = taExamCourseClazzTeacher.getMainCollegeIds();
+                    List<TAExamCourseClazzTeacher> rankTempList = taExamCourseClazzTeacherList.stream().filter(e -> mainCollegeIds.equals(e.getMainCollegeIds())).collect(Collectors.toList());
+                    int teacherCount = rankTempList.size();
+                    BigDecimal thisAvgScoreAssign = taExamCourseClazzTeacher.getAvgScoreAssign();
+                    int rank = (int) (rankTempList.stream().filter(e -> (e.getAvgScoreAssign().setScale(SystemConstant.FINAL_SCALE, RoundingMode.HALF_UP)).compareTo(thisAvgScoreAssign.setScale(SystemConstant.FINAL_SCALE, RoundingMode.HALF_UP)) > 0).count() + 1);
+                    taExamCourseClazzTeacher.setTeacherRank(rank);
+                    taExamCourseClazzTeacher.setTeacherCount(teacherCount);
+                }
+            }
+            taExamCourseClazzTeacherService.saveBatch(taExamCourseClazzTeacherList);
         }
-        return " 't_a_exam_course_college_teacher' 表构建我那成";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String buildAnalyzeExamCourseTeacher(Long examId, String courseCode) {
+    public void buildAnalyzeExamCourseTeacher(Long examId, String courseCode) {
         Long schoolId = tbExamService.findSchoolIdByExamId(examId);
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
@@ -1929,7 +2142,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                 taExamCourseTeacher.setExamId(examId);
                 taExamCourseTeacher.setSchoolId(tbExamService.getById(examId).getSchoolId());
                 taExamCourseTeacher.setCourseCode(effectiveCourseCode);
-                taExamCourseTeacher.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode,schoolId).getName());
+                taExamCourseTeacher.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode, schoolId).getName());
                 taExamCourseTeacher.setTeacherId(teacherId);
                 taExamCourseTeacher.setTeacherName(sysUserService.getById(teacherId).getRealName());
                 taExamCourseTeacher.setMinScore(BigDecimal.valueOf(minScore));
@@ -1948,12 +2161,11 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             }
             taExamCourseTeacherService.saveBatch(taExamCourseTeacherList);
         }
-        return " 't_a_exam_course_teacher'表构建完毕 ";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public String updateCoursePublishStatus(Long examId, String courseCode, PublishStatusEnum publishStatusEnum) {
+    public void updateCoursePublishStatus(Long examId, String courseCode, PublishStatusEnum publishStatusEnum) {
         // 可分析有效课程信息
         List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
         List<TBExamCourse> tbExamCourseList = new ArrayList<>();
@@ -1965,31 +2177,30 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             tbExamCourseList.add(tbExamCourse);
         }
         tbExamCourseService.updateBatchById(tbExamCourseList);
-        return " 't_b_exam_course' 表状态更新完成";
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void dataCalculate(Long examId, String courseCode) throws Exception {
-        AnalyzeForReportService analyzeForReportService = SpringContextHolder.getBean(AnalyzeForReportService.class);
-        analyzeForReportService.buildAnalyzeExamCourse(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseRecord(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseCollegeInspect(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseClazz(examId, courseCode);
-        analyzeForReportService.buildAnalyzePointScoreRate(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseCollegeInspectDio(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseTeacherDio(examId, courseCode);
-        analyzeForReportService.buildAnalyzePaperStruct(examId, courseCode);
-        analyzeForReportService.buildExamPaperDifficult(examId, courseCode);
-        analyzeForReportService.buildExamPaperTeacherDifficult(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamTotal(examId);
-        analyzeForReportService.buildAnalyzeExamCourseCollegeTeacher(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseTeacher(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDio(examId, courseCode);
-        analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDifficult(examId, courseCode);
-        analyzeForReportService.buildAnalyzeCollegePaperStruct(examId, courseCode);
-        analyzeForReportService.buildAnalyzeTeacherPaperStruct(examId, courseCode);
-        analyzeForReportService.buildAnalyzeTeacherCollegePaperStruct(examId, courseCode);
+        this.buildAnalyzeExamCourse(examId, courseCode);
+        this.buildAnalyzeExamCourseRecord(examId, courseCode);
+        this.buildAnalyzeExamCourseCollegeInspect(examId, courseCode);
+        this.buildAnalyzeExamCourseClazz(examId, courseCode);
+        this.buildAnalyzePointScoreRate(examId, courseCode);
+        this.buildAnalyzeExamCourseCollegeInspectDio(examId, courseCode);
+        this.buildAnalyzeExamCourseTeacherDio(examId, courseCode);
+        this.buildAnalyzePaperStruct(examId, courseCode);
+        this.buildExamPaperDifficult(examId, courseCode);
+        this.buildExamPaperTeacherDifficult(examId, courseCode);
+        this.buildAnalyzeExamTotal(examId);
+        this.buildAnalyzeExamCourseCollegeTeacher(examId, courseCode);
+        this.buildAnalyzeExamCourseClazzTeacher(examId, courseCode);
+        this.buildAnalyzeExamCourseTeacher(examId, courseCode);
+        this.buildAnalyzeExamCourseTeacherCollegeDio(examId, courseCode);
+        this.buildAnalyzeExamCourseTeacherCollegeDifficult(examId, courseCode);
+        this.buildAnalyzeCollegePaperStruct(examId, courseCode);
+        this.buildAnalyzeTeacherPaperStruct(examId, courseCode);
+        this.buildAnalyzeTeacherCollegePaperStruct(examId, courseCode);
     }
 
     @Override
@@ -2032,7 +2243,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
         // 获取当前课程下所有学生考试成绩记录
         List<BasicExamRecordDto> basicExamRecordDtoDatasource = tbExamRecordService.findByExamIdAndCourseCodeS(examId, courseCodeList);
         for (String s : courseCodeList) {
-            if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, s, basicCourseService.findByCourseCode(s,schoolId).getName())) {
+            if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, s, basicCourseService.findByCourseCode(s, schoolId).getName())) {
                 throw ExceptionResultEnum.ERROR.exception("课程编号[" + s + "]的课程分析数据已测试或发布,不能变更基础数据");
             }
             List<BasicExamRecordDto> basicExamRecordDtoList = basicExamRecordDtoDatasource.stream()
@@ -2055,8 +2266,8 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                     BigDecimal myScore = basicExamRecordDto.getTotalScore();
                     BigDecimal coefficient = tbPaper.getCoefficient();
                     BigDecimal assignScore;
-                    // 当该试卷的赋分系数不为0时赋分
-                    if (coefficient != null && coefficient.compareTo(BigDecimal.ZERO) > 0 && !absent) {
+                    // 当该试卷的赋分系数不为0且,不缺考,原卷不为0分时赋分
+                    if (coefficient != null && coefficient.compareTo(BigDecimal.ZERO) > 0 && !absent && myScore.compareTo(BigDecimal.ZERO) > 0) {
                         assignScore = myScore.add((fullScore.subtract(myScore)).divide(coefficient, 4, RoundingMode.HALF_UP)).setScale(0, RoundingMode.HALF_UP);
                     } else {
                         assignScore = myScore;
@@ -2078,6 +2289,8 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                     taExamCourseRecord.setTeachCollegeId(basicExamRecordDto.getTeachCollegeId());
                     taExamCourseRecord.setInspectCollegeId(basicExamRecordDto.getInspectCollegeId());
                     taExamCourseRecord.setMajorId(basicExamRecordDto.getMajorId());
+                    taExamCourseRecord.setObjectiveScore(basicExamRecordDto.getObjectiveScore());
+                    taExamCourseRecord.setSubjectiveScore(basicExamRecordDto.getSubjectiveScore());
                     taExamCourseRecord.setTotalScore(myScore);
                     taExamCourseRecord.setAbsent(absent);
                     taExamCourseRecord.setStudentCurrent(basicExamRecordDto.getStudentCurrent());

+ 56 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/DataAnalyzeServiceImpl.java

@@ -0,0 +1,56 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.qmth.teachcloud.report.business.service.AnalyzeForReportService;
+import com.qmth.teachcloud.report.business.service.DataAnalyzeService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * @Description: 数据分析计算线程服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-11
+ */
+@Service
+public class DataAnalyzeServiceImpl implements DataAnalyzeService {
+    @Resource
+    private AnalyzeForReportService analyzeForReportService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void predecessorAnalyzeTask(Long examId, String courseCode) throws Exception {
+        analyzeForReportService.buildAnalyzeExamCourse(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseRecord(examId, courseCode);
+        analyzeForReportService.buildAnalyzePaperStruct(examId, courseCode);
+        analyzeForReportService.buildAnalyzePointScoreRate(examId, courseCode);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void asyncAnalyzeTask(Long examId, String courseCode) {
+        analyzeForReportService.buildAnalyzeExamCourseCollegeInspect(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseClazz(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseCollegeInspectDio(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseTeacherDio(examId, courseCode);
+        analyzeForReportService.buildExamPaperDifficult(examId, courseCode);
+        analyzeForReportService.buildExamPaperTeacherDifficult(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamTotal(examId);
+        analyzeForReportService.buildAnalyzeExamCourseCollegeTeacher(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseClazzTeacher(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseTeacher(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDio(examId, courseCode);
+        analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDifficult(examId, courseCode);
+        analyzeForReportService.buildAnalyzeCollegePaperStruct(examId, courseCode);
+        analyzeForReportService.buildAnalyzeTeacherPaperStruct(examId, courseCode);
+        analyzeForReportService.buildAnalyzeTeacherCollegePaperStruct(examId, courseCode);
+    }
+
+    @Override
+    public CompletableFuture<Boolean> dataCalculate(Long examId, String courseCode) throws Exception {
+        this.predecessorAnalyzeTask(examId,courseCode);
+        this.asyncAnalyzeTask(examId, courseCode);
+        return CompletableFuture.completedFuture(true);
+    }
+}

+ 73 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseClazzTeacherServiceImpl.java

@@ -0,0 +1,73 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.report.business.bean.result.TAExamCourseCollegeTeacherResult;
+import com.qmth.teachcloud.report.business.bean.result.TeacherClassRankResult;
+import com.qmth.teachcloud.report.business.bean.result.TeacherRankForClazz;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseClazzTeacher;
+import com.qmth.teachcloud.report.business.enums.OrderEnum;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
+import com.qmth.teachcloud.report.business.mapper.TAExamCourseClazzTeacherMapper;
+import com.qmth.teachcloud.report.business.service.TAExamCourseClazzTeacherService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: 参考课程班级下授课教师维度接口实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-06-24
+ */
+@Service
+public class TAExamCourseClazzTeacherServiceImpl extends ServiceImpl<TAExamCourseClazzTeacherMapper, TAExamCourseClazzTeacher> implements TAExamCourseClazzTeacherService {
+    @Resource
+    private SysOrgService sysOrgService;
+
+    @Override
+    public IPage<TeacherRankForClazz> listClassRank(SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId, Integer pageNumber, Integer pageSize, String column, OrderEnum order) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        Page<TeacherRankForClazz> page = new Page<>(pageNumber, pageSize);
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        List<Long> collegeIds = sysOrgService.findCollegeIds(sysUser.getOrgId());
+        if (Objects.nonNull(collegeIds) && collegeIds.size() > 0) {
+            return this.baseMapper.listClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, inspectCollegeId, collegeIds, column, Objects.nonNull(order) ? order.name() : null);
+        } else {
+            return this.baseMapper.listClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, inspectCollegeId, Objects.nonNull(sysUser.getOrgId()) ? Arrays.asList(sysUser.getOrgId()) : null, column, Objects.nonNull(order) ? order.name() : null);
+        }
+    }
+
+    @Override
+    public IPage<TeacherRankForClazz> surveyTeacherTeacherView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Integer pageNumber, Integer pageSize, String column, OrderEnum order) {
+        Page<TeacherRankForClazz> page = new Page<>(pageNumber, pageSize);
+        return this.baseMapper.surveyTeacherTeacherView(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, column, Objects.nonNull(order) ? order.name() : null);
+    }
+
+    @Override
+    public IPage<TeacherRankForClazz> listTeacherClassRank(SemesterEnum semester, Long examId, String courseCode, Integer pageNumber, Integer pageSize, String column, OrderEnum order) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        Page<TeacherRankForClazz> page = new Page<>(pageNumber, pageSize);
+        return this.baseMapper.listTeacherClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, column, Objects.nonNull(order) ? order.name() : null);
+    }
+
+    @Override
+    public IPage<TeacherRankForClazz> listAllTeacherClassRank(SemesterEnum semester, Long examId, Long inspectCollegeId, String courseCode, Long teacherId, Integer pageNumber, Integer pageSize, String column, OrderEnum order) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        Page<TeacherRankForClazz> page = new Page<>(pageNumber, pageSize);
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        List<Long> collegeIds = sysOrgService.findCollegeIds(sysUser.getOrgId());
+        if (Objects.nonNull(collegeIds) && collegeIds.size() > 0) {
+            return this.baseMapper.listAllTeacherClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, inspectCollegeId, courseCode, teacherId, collegeIds, column, Objects.nonNull(order) ? order.name() : null);
+        } else {
+            return this.baseMapper.listAllTeacherClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, inspectCollegeId, courseCode, teacherId, Objects.nonNull(sysUser.getOrgId()) ? Collections.singletonList(sysUser.getOrgId()) : null, column, Objects.nonNull(order) ? order.name() : null);
+        }
+    }
+}

+ 221 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseClazzTeacherMapper.xml

@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.teachcloud.report.business.mapper.TAExamCourseClazzTeacherMapper">
+    <select id="listClassRank"
+            resultType="com.qmth.teachcloud.report.business.bean.result.TeacherRankForClazz">
+        SELECT
+            *
+        FROM
+            (SELECT
+                 taecct.clazz_code AS clazzCode,
+                 taecct.teacher_name AS teacherName,
+                 taecct.main_college_names AS inspectCollegeName,
+                 taecct.course_code AS courseCode,
+                 taecct.course_name AS courseName,
+                 taecct.teach_college_name AS teachCollegeName,
+                 ROUND(taecct.obj_avg_score, 1) AS objAvgScore,
+                 ROUND(taecct.sub_avg_score, 1) AS subAvgScore,
+                 ROUND(taecct.avg_score, 1) AS avgScore,
+                 ROUND(taecct.avg_score_assign, 1) AS avgScoreAssign,
+                 taecct.teacher_rank AS `rank`
+             FROM
+                 t_a_exam_course_clazz_teacher taecct
+                     LEFT JOIN t_b_exam tbe ON taecct.exam_id = tbe.id
+        <where>
+            and tbe.school_id = #{schoolId}
+            <if test="semester != null and semester != ''">
+                and tbe.semester = #{semester}
+            </if>
+            <if test="examId != null">
+                and taecct.exam_id = #{examId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and taecct.course_code = #{courseCode}
+            </if>
+            <if test="inspectCollegeId != null">
+                and LOCATE(#{inspectCollegeId},taecct.main_college_ids) > 0
+            </if>
+            <if test="collegeIds != null and collegeIds != ''">
+                and taecct.teach_college_id in
+                <foreach collection="collegeIds" item="collegeId" index="index" open="(" separator="," close=")">
+                    #{collegeId}
+                </foreach>
+            </if>
+        </where> ) t
+        <choose>
+            <when test="column != null and column != '' and order != null and order != ''">
+                <choose>
+                    <when test="column != 'rank'">
+                        order by t.${column} ${order},t.rank
+                    </when>
+                    <otherwise>
+                        order by t.${column} ${order}
+                    </otherwise>
+                </choose>
+            </when>
+            <otherwise>
+                order by t.courseCode,t.inspectCollegeName,t.rank
+            </otherwise>
+        </choose>
+    </select>
+    <select id="surveyTeacherTeacherView"
+            resultType="com.qmth.teachcloud.report.business.bean.result.TeacherRankForClazz">
+        SELECT
+            *
+        FROM
+            (SELECT
+                taecct.clazz_code AS clazzCode,
+                taecct.teacher_name AS teacherName,
+                taecct.main_college_names AS inspectCollegeName,
+                taecct.course_code AS courseCode,
+                taecct.course_name AS courseName,
+                taecct.teach_college_name AS teachCollegeName,
+                ROUND(taecct.obj_avg_score, 1) AS objAvgScore,
+                ROUND(taecct.sub_avg_score, 1) AS subAvgScore,
+                ROUND(taecct.avg_score, 1) AS avgScore,
+                ROUND(taecct.avg_score_assign, 1) AS avgScoreAssign,
+                taecct.teacher_rank AS `rank`
+            FROM
+                t_a_exam_course_clazz_teacher taecct
+        <where>
+            <if test="schoolId != null and schoolId != ''">
+                and taecct.school_id = #{schoolId}
+            </if>
+            <if test="examId != null and examId != ''">
+                and taecct.exam_id = #{examId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and taecct.course_code = #{courseCode}
+            </if>
+        </where> ) t
+        <choose>
+            <when test="column != null and column != '' and order != null and order != ''">
+                <choose>
+                    <when test="column != 'rank'">
+                        order by t.${column} ${order},t.rank
+                    </when>
+                    <otherwise>
+                        order by t.${column} ${order}
+                    </otherwise>
+                </choose>
+            </when>
+            <otherwise>
+                order by t.courseCode,t.inspectCollegeName,t.rank
+            </otherwise>
+        </choose>
+    </select>
+    <select id="listTeacherClassRank"
+            resultType="com.qmth.teachcloud.report.business.bean.result.TeacherRankForClazz">
+        SELECT
+            *
+        FROM
+            (SELECT
+                 taecct.clazz_code AS clazzCode,
+                 taecct.teacher_name AS teacherName,
+                 taecct.main_college_names AS inspectCollegeName,
+                 taecct.course_code AS courseCode,
+                 taecct.course_name AS courseName,
+                 taecct.teach_college_name AS teachCollegeName,
+                 ROUND(taecct.obj_avg_score, 1) AS objAvgScore,
+                 ROUND(taecct.sub_avg_score, 1) AS subAvgScore,
+                 ROUND(taecct.avg_score, 1) AS avgScore,
+                 ROUND(taecct.avg_score_assign, 1) AS avgScoreAssign,
+                 taecct.teacher_rank AS `rank`
+             FROM
+                 t_a_exam_course_clazz_teacher taecct
+                     LEFT JOIN t_b_exam b ON taecct.exam_id = b.id
+                     JOIN t_b_exam_course tbec ON tbec.exam_id = taecct.exam_id
+                     AND tbec.course_code = taecct.course_code
+        <where>
+            and b.school_id = #{schoolId}
+            <if test="semester != null and semester != ''">
+                and b.semester = #{semester}
+            </if>
+            <if test="examId != null">
+                and taecct.exam_id = #{examId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and taecct.course_code = #{courseCode}
+            </if>
+            and tbec.publish_status = 'PUBLISH'
+        </where> ) t
+        <choose>
+            <when test="column != null and column != '' and order != null and order != ''">
+                <choose>
+                    <when test="column != 'rank'">
+                        order by t.${column} ${order},t.rank
+                    </when>
+                    <otherwise>
+                        order by t.${column} ${order}
+                    </otherwise>
+                </choose>
+            </when>
+            <otherwise>
+                order by t.courseCode,t.inspectCollegeName,t.rank
+            </otherwise>
+        </choose>
+    </select>
+    <select id="listAllTeacherClassRank"
+            resultType="com.qmth.teachcloud.report.business.bean.result.TeacherRankForClazz">
+        SELECT
+            *
+        FROM
+            (SELECT
+                 taecct.clazz_code AS clazzCode,
+                 taecct.teacher_name AS teacherName,
+                 taecct.main_college_names AS inspectCollegeName,
+                 taecct.course_code AS courseCode,
+                 taecct.course_name AS courseName,
+                 taecct.teach_college_name AS teachCollegeName,
+                 ROUND(taecct.obj_avg_score, 1) AS objAvgScore,
+                 ROUND(taecct.sub_avg_score, 1) AS subAvgScore,
+                 ROUND(taecct.avg_score, 1) AS avgScore,
+                 ROUND(taecct.avg_score_assign, 1) AS avgScoreAssign,
+                 taecct.teacher_rank AS `rank`
+             FROM
+                 t_a_exam_course_clazz_teacher taecct
+                     LEFT JOIN t_b_exam b ON taecct.exam_id = b.id
+                     JOIN t_b_exam_course tbec ON tbec.exam_id = taecct.exam_id
+                     AND tbec.course_code = taecct.course_code
+        <where>
+            and b.school_id = #{schoolId}
+            <if test="semester != null and semester != ''">
+                and b.semester = #{semester}
+            </if>
+            <if test="examId != null">
+                and taecct.exam_id = #{examId}
+            </if>
+            <if test="inspectCollegeId != null">
+                and LOCATE(#{inspectCollegeId},taecct.main_college_ids) > 0
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and taecct.course_code = #{courseCode}
+            </if>
+            <if test="teacherId != null">
+                and taecct.teacher_id = #{teacherId}
+            </if>
+            <if test="collegeIds != null and collegeIds != ''">
+                and taecct.teach_college_id in
+                <foreach collection="collegeIds" item="collegeId" index="index" open="(" separator="," close=")">
+                    #{collegeId}
+                </foreach>
+            </if>
+            and tbec.publish_status = 'PUBLISH'
+        </where> ) t
+        <choose>
+            <when test="column != null and column != '' and order != null and order != ''">
+                <choose>
+                    <when test="column != 'rank'">
+                        order by t.${column} ${order},t.rank
+                    </when>
+                    <otherwise>
+                        order by t.${column} ${order}
+                    </otherwise>
+                </choose>
+            </when>
+            <otherwise>
+                order by t.courseCode,t.inspectCollegeName,t.rank
+            </otherwise>
+        </choose>
+    </select>
+</mapper>

+ 2 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/BasicDatasourceController.java

@@ -884,6 +884,8 @@ public class BasicDatasourceController {
                     taExamCourseRecord.setTeachCollegeId(basicExamRecordDto.getTeachCollegeId());
                     taExamCourseRecord.setInspectCollegeId(basicExamRecordDto.getInspectCollegeId());
                     taExamCourseRecord.setMajorId(basicExamRecordDto.getMajorId());
+                    taExamCourseRecord.setObjectiveScore(basicExamRecordDto.getObjectiveScore());
+                    taExamCourseRecord.setSubjectiveScore(basicExamRecordDto.getSubjectiveScore());
                     taExamCourseRecord.setTotalScore(myScore);
                     taExamCourseRecord.setAbsent(basicExamRecordDto.getAbsent());
                     taExamCourseRecord.setStudentCurrent(basicExamRecordDto.getStudentCurrent());

+ 9 - 4
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/CourseController.java

@@ -61,6 +61,9 @@ public class CourseController {
     @Resource
     TBPaperService tbPaperService;
 
+    @Resource
+    TAExamCourseClazzTeacherService taExamCourseClazzTeacherService;
+
     @ApiOperation(value = "开课课程考试总览列表接口")
     @RequestMapping(value = "/survey_teacher/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = TAExamCourseResult.class)})
@@ -110,7 +113,9 @@ public class CourseController {
                                            @ApiParam(value = "分页数", required = true) @RequestParam int pageSize,
                                            @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                            @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
-        return ResultUtil.ok(taExamCourseService.surveyTeacherTeacherView(new Page<>(pageNumber, pageSize), Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, column, order));
+        // TODO: 2022/6/28 教师排名back 
+//        return ResultUtil.ok(taExamCourseService.surveyTeacherTeacherView(new Page<>(pageNumber, pageSize), Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, column, order));
+        return ResultUtil.ok(taExamCourseClazzTeacherService.surveyTeacherTeacherView(Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, pageNumber, pageSize, column, order));
     }
 
     @ApiOperation(value = "开课课程考试总览-试题难度得分情况分析接口")
@@ -229,9 +234,9 @@ public class CourseController {
             @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
             @ApiParam(value = "赋分系数", required = true) @RequestParam String coefficient) {
         List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda()
-                .eq(TBPaper::getExamId,examId)
-                .eq(TBPaper::getCourseCode,courseCode));
-        if (tbPaperList.size() != 1){
+                .eq(TBPaper::getExamId, examId)
+                .eq(TBPaper::getCourseCode, courseCode));
+        if (tbPaperList.size() != 1) {
             log.error("未找到考试id为 :" + examId + " 课程编号为 : " + courseCode + "的试卷结构");
             throw ExceptionResultEnum.ERROR.exception("未找到试卷结构");
         }

+ 7 - 2
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/DataAnalyzeController.java

@@ -6,6 +6,7 @@ import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
 import com.qmth.teachcloud.report.business.service.AnalyzeForReportService;
+import com.qmth.teachcloud.report.business.service.DataAnalyzeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
@@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.Collections;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * @Description: 数据计算控制类
@@ -30,14 +32,17 @@ import java.util.Collections;
 public class DataAnalyzeController {
     @Resource
     private AnalyzeForReportService analyzeForReportService;
+    @Resource
+    private DataAnalyzeService dataAnalyzeService;
 
     @ApiOperation(value = "数据计算")
     @RequestMapping(value = "/calculate", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result dataCalculate(@RequestParam Long schoolId, @RequestParam Long examId, @RequestParam(required = false) String courseCode) throws Exception {
-        analyzeForReportService.dataCalculate(examId,courseCode);
-        analyzeForReportService.updateCoursePublishStatus(examId,courseCode, PublishStatusEnum.WILL_COMPUTE);
+//        CompletableFuture<Boolean> result = dataAnalyzeService.dataCalculate(examId,courseCode);
+        analyzeForReportService.dataCalculate(examId, courseCode);
+        analyzeForReportService.updateCoursePublishStatus(examId, courseCode, PublishStatusEnum.WILL_COMPUTE);
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.SUCCESS, true));
     }
 }

+ 14 - 9
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/DataDriveController.java

@@ -10,10 +10,7 @@ import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacher;
 import com.qmth.teachcloud.report.business.entity.TAExamTotal;
 import com.qmth.teachcloud.report.business.enums.OrderEnum;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
-import com.qmth.teachcloud.report.business.service.TAExamCourseCollegeTeacherService;
-import com.qmth.teachcloud.report.business.service.TAExamCourseService;
-import com.qmth.teachcloud.report.business.service.TAExamCourseTeacherService;
-import com.qmth.teachcloud.report.business.service.TAExamTotalService;
+import com.qmth.teachcloud.report.business.service.*;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Map;
 import java.util.Objects;
@@ -30,15 +28,18 @@ import java.util.Objects;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.reportSchool}")
 public class DataDriveController {
 
-    @Autowired
+    @Resource
     private TAExamTotalService taExamTotalService;
 
-    @Autowired
+    @Resource
     private TAExamCourseService taExamCourseService;
 
-    @Autowired
+    @Resource
     private TAExamCourseCollegeTeacherService taExamCourseCollegeTeacherService;
 
+    @Resource
+    private TAExamCourseClazzTeacherService taExamCourseClazzTeacherService;
+
     @ApiOperation(value = "全校考试总览-全校考试概况")
     @RequestMapping(value = "/exam/get_overview", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "全校考试总览-全校考试概况", response = TAExamTotal.class)})
@@ -96,7 +97,9 @@ public class DataDriveController {
                                        @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
                                        @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                        @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
-        return ResultUtil.ok(taExamCourseCollegeTeacherService.listTeacherClassRank(semester, examId, courseCode, pageNumber, pageSize, column, order));
+        // TODO: 2022/6/28 教师排名back
+//        return ResultUtil.ok(taExamCourseCollegeTeacherService.listTeacherClassRank(semester, examId, courseCode, pageNumber, pageSize, column, order));
+        return ResultUtil.ok(taExamCourseClazzTeacherService.listTeacherClassRank(semester, examId, courseCode, pageNumber, pageSize, column, order));
     }
 
     @ApiOperation(value = "全校课程考试分析-考试概况-导出课程分析报表")
@@ -119,6 +122,8 @@ public class DataDriveController {
                                           @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
                                           @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                           @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
-        return ResultUtil.ok(taExamCourseCollegeTeacherService.listAllTeacherClassRank(semester, examId, inspectCollegeId, courseCode, teacherId, pageNumber, pageSize, column, order));
+        // TODO: 2022/6/28 教师排名back
+//        return ResultUtil.ok(taExamCourseCollegeTeacherService.listAllTeacherClassRank(semester, examId, inspectCollegeId, courseCode, teacherId, pageNumber, pageSize, column, order));
+        return ResultUtil.ok(taExamCourseClazzTeacherService.listAllTeacherClassRank(semester, examId, inspectCollegeId, courseCode, teacherId, pageNumber, pageSize, column, order));
     }
 }

+ 8 - 4
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TAExamCourseCollegeTeacherController.java

@@ -9,19 +9,19 @@ import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.report.business.bean.result.SurveyTeacherViewResult;
-import com.qmth.teachcloud.report.business.bean.result.TBExamStudentResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherClassRankResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherMyClassRankResult;
 import com.qmth.teachcloud.report.business.enums.OrderEnum;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
+import com.qmth.teachcloud.report.business.service.TAExamCourseClazzTeacherService;
 import com.qmth.teachcloud.report.business.service.TAExamCourseCollegeTeacherService;
 import io.swagger.annotations.*;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.Objects;
 
 /**
@@ -37,8 +37,10 @@ import java.util.Objects;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.reportSchool}/teacher")
 public class TAExamCourseCollegeTeacherController {
 
-    @Autowired
+    @Resource
     private TAExamCourseCollegeTeacherService taExamCourseCollegeTeacherService;
+    @Resource
+    private TAExamCourseClazzTeacherService taExamCourseClazzTeacherService;
 
     @ApiOperation(value = "教师各课堂成绩排名")
     @RequestMapping(value = "/list_class_rank", method = RequestMethod.POST)
@@ -52,7 +54,9 @@ public class TAExamCourseCollegeTeacherController {
             @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
             @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
             @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
-        return ResultUtil.ok(taExamCourseCollegeTeacherService.listClassRank(semester, examId, courseCode, inspectCollegeId, pageNumber, pageSize, column, order));
+        // TODO: 2022/6/28 教师排名back 
+//        return ResultUtil.ok(taExamCourseCollegeTeacherService.listClassRank(semester, examId, courseCode, inspectCollegeId, pageNumber, pageSize, column, order));
+        return ResultUtil.ok(taExamCourseClazzTeacherService.listClassRank(semester, examId, courseCode, inspectCollegeId, pageNumber, pageSize, column, order));
     }
 
     @ApiOperation(value = "我的课堂考成绩排名")

+ 31 - 23
teachcloud-report/src/test/java/com/qmth/teachcloud/report/AnalyzeForStudentServiceTest.java

@@ -39,7 +39,7 @@ public class AnalyzeForStudentServiceTest {
     public void buildAnalyzeExamCourse() {
         Long examId = 2L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourse(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourse(examId,courseCode);
 
     }
 
@@ -47,21 +47,22 @@ public class AnalyzeForStudentServiceTest {
     public void buildAnalyzeExamCourseRecord() {
         Long examId = 1L;
         String courseCode = "1013";
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseRecord(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourseRecord(examId,courseCode);
     }
 
     @Test
     public void buildAnalyzeExamCourseCollegeInspectByOther() {
-        Long examId = 1L;
-        String courseCode = "1013";
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseCollegeInspect(examId,courseCode));
+        Long examId = 4L;
+        String courseCode = "4016";
+        analyzeForReportService.buildAnalyzeExamCourseCollegeInspect(examId,courseCode);
+        System.out.println();
     }
 
     @Test
     public void buildAnalyzeExamCourseClazz() {
         Long examId = 1L;
         String courseCode = "1013";
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseClazz(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourseClazz(examId,courseCode);
     }
 
     @Test
@@ -75,46 +76,53 @@ public class AnalyzeForStudentServiceTest {
     public void buildAnalyzeExamCourseCollegeInspectDio() {
         Long examId = 1L;
         String courseCode = "1013";
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseCollegeInspectDio(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourseCollegeInspectDio(examId,courseCode);
     }
 
     @Test
     public void buildAnalyzePaperStruct() {
         Long examId = 1L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzePaperStruct(examId,courseCode));
+        analyzeForReportService.buildAnalyzePaperStruct(examId,courseCode);
     }
 
     @Test
     public void buildExamPaperDifficult(){
         Long examId = 1L;
-        System.out.println(analyzeForReportService.buildExamPaperDifficult(examId,null));
+        analyzeForReportService.buildExamPaperDifficult(examId,null);
     }
 
     @Test
     public void buildExamPaperTeacherDifficult(){
         Long examId = 1L;
-        System.out.println(analyzeForReportService.buildExamPaperTeacherDifficult(examId,null));
+        analyzeForReportService.buildExamPaperTeacherDifficult(examId,null);
     }
 
     @Test
     public void buildAnalyzeExamTotal() {
         Long examId = 1L;
-        System.out.println(analyzeForReportService.buildAnalyzeExamTotal(examId));
+        analyzeForReportService.buildAnalyzeExamTotal(examId);
     }
 
     @Test
     public void buildAnalyzeExamCourseCollegeTeacher() {
         Long examId = 2L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseCollegeTeacher(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourseCollegeTeacher(examId,courseCode);
+    }
+
+    @Test
+    public void buildAnalyzeExamCourseClazzTeacher() {
+        Long examId = 4L;
+        String courseCode = "4025";
+        analyzeForReportService.buildAnalyzeExamCourseClazzTeacher(examId,courseCode);
     }
 
     @Test
     public void buildAnalyzeExamCourseTeacher() {
         Long examId = 1L;
         String courseCode = "1013";
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseTeacher(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourseTeacher(examId,courseCode);
     }
 
     @Test
@@ -139,50 +147,50 @@ public class AnalyzeForStudentServiceTest {
     public void finishCalculate(){
         Long examId = 1L;
         String courseCode = "1013";
-        System.out.println(analyzeForReportService.updateCoursePublishStatus(examId,courseCode, PublishStatusEnum.WILL_COMPUTE));
+        analyzeForReportService.updateCoursePublishStatus(examId,courseCode, PublishStatusEnum.WILL_COMPUTE);
     }
 
     @Test
     public void buildAnalyzeExamCourseTeacherCollegeDio(){
         Long examId = 2L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDio(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDio(examId,courseCode);
     }
 
     @Test
     public void buildAnalyzeExamCourseTeacherCollegeDifficult(){
         Long examId = 2L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDifficult(examId,courseCode));
+        analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDifficult(examId,courseCode);
     }
 
     @Test
     public void buildAnalyzeCollegePaperStruct(){
         Long examId = 1L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzeCollegePaperStruct(examId,courseCode));
+        analyzeForReportService.buildAnalyzeCollegePaperStruct(examId,courseCode);
     }
 
     @Test
     public void buildAnalyzeTeacherPaperStruct(){
         Long examId = 2L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzeTeacherPaperStruct(examId,courseCode));
+        analyzeForReportService.buildAnalyzeTeacherPaperStruct(examId,courseCode);
     }
 
     @Test
     public void buildAnalyzeTeacherCollegePaperStruct(){
         Long examId = 2L;
         String courseCode = null;
-        System.out.println(analyzeForReportService.buildAnalyzeTeacherCollegePaperStruct(examId,courseCode));
+        analyzeForReportService.buildAnalyzeTeacherCollegePaperStruct(examId,courseCode);
     }
 
     @Test
     public void syncCloudExam() throws IOException {
         // 三个参数
-        Long examId = 263L;
-        String accessKey = "a8599fce46fd4e0192d2d13c7b258931";
-        String accessSecret = "Sl9xiXAphY04eE8ojuTqRgcv";
+        Long examId = 238L;
+        String accessKey = "3780ee7d0a2641bcbed26724252ba460";
+        String accessSecret = "PjXeqrNcDcZhLuB1QQreb5QH";
 
         String url = dictionaryConfig.yunMarkDomain().getUrl() + dictionaryConfig.yunMarkDomain().getStudentScoreApi();
         Map<String, Object> params = new HashMap<>();
@@ -217,6 +225,6 @@ public class AnalyzeForStudentServiceTest {
                 break;
             }
         }
-        System.out.println(JSON.toJSONString(students));
+        System.out.println(JSON.toJSONString(students.get(0)));
     }
 }

+ 69 - 3
teachcloud-report/src/test/java/com/qmth/teachcloud/report/report/CourseReportTest.java

@@ -1,10 +1,16 @@
 package com.qmth.teachcloud.report.report;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.teachcloud.report.TeachcloudReportApplication;
-import com.qmth.teachcloud.report.business.service.ChangNamesService;
-import com.qmth.teachcloud.report.business.service.CourseReportService;
-import com.qmth.teachcloud.report.business.service.TAExamCourseService;
+import com.qmth.teachcloud.report.business.bean.dto.gradeAnalyze.ModuleDefine;
+import com.qmth.teachcloud.report.business.bean.dto.gradeAnalyze.ModuleEvaluation;
+import com.qmth.teachcloud.report.business.bean.dto.gradeAnalyze.SecondaryDimensionLevelDefine;
+import com.qmth.teachcloud.report.business.entity.TBDimension;
+import com.qmth.teachcloud.report.business.entity.TBModuleProficiency;
+import com.qmth.teachcloud.report.business.entity.TBPaper;
+import com.qmth.teachcloud.report.business.entity.TBPaperStruct;
+import com.qmth.teachcloud.report.business.service.*;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -12,6 +18,8 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @Description:
@@ -27,6 +35,12 @@ public class CourseReportTest {
     private TAExamCourseService taExamCourseService;
     @Resource
     private ChangNamesService changNamesService;
+    @Resource
+    private TBDimensionService tbDimensionService;
+    @Resource
+    private TBPaperStructService tbPaperStructService;
+    @Resource
+    private TBPaperService tbPaperService;
 
     @Test
     public void inspectTotal(){
@@ -41,5 +55,57 @@ public class CourseReportTest {
         System.out.println(JSON.toJSONString(taExamCourseService.trialCalculate(examId,examCode,coefficient)));
     }
 
+    @Test
+    public void findDimension(){
+        String courseCode= "2016";
+        System.out.println(JSON.toJSONString(tbDimensionService.list(new QueryWrapper<TBDimension>().lambda().eq(TBDimension::getCourseCode,courseCode)).get(0)));
+    }
+
+    @Test
+    public void findPaperStructure(){
+        String courseCode = "2016";
+        Long paperId = 208613958230216704L;
+        System.out.println(JSON.toJSONString(tbPaperStructService.list(new QueryWrapper<TBPaperStruct>().lambda().eq(TBPaperStruct::getPaperId,paperId)).get(0)));
+    }
+
+    @Test
+    public void findBasicPaper(){
+        String courseCode = "2016";
+        System.out.println(JSON.toJSONString(tbPaperService.list(new QueryWrapper<TBPaper>().lambda().eq(TBPaper::getCourseCode,courseCode))));
+    }
+
+    @Test
+    public void findModuleDefine(){
+        List<ModuleDefine> moduleDefineList = new ArrayList<>();
+        ModuleDefine moduleDefine = new ModuleDefine();
+        moduleDefine.setModuleType("知识");
+        moduleDefine.setInterpret("课程标准规定的学科内容");
+        moduleDefine.setRemark("与以往传统考试单纯以部分对学生进行排序的评价方式不同,四维诊断评价能够综合分析你的学业发展长短板、优劣势,经由系统分析后出具详细的学业诊断评价报告。");
+
+        // -- 二级维度精熟度定义
+        List<SecondaryDimensionLevelDefine> secondaryDimensionLevelDefineList = new ArrayList<>();
+        SecondaryDimensionLevelDefine s1 = new SecondaryDimensionLevelDefine();
+        s1.setDefine("熟练掌握:个人得分率≥90%");
+        s1.setLevel("A");
+        s1.setMin("0.9");
+        s1.setMax("1");
+        s1.setScope("[0.9,1]");
+        secondaryDimensionLevelDefineList.add(s1);
+        moduleDefine.setSecondaryDimensionLevelDefineList(secondaryDimensionLevelDefineList);
+
+        // -- 评价
+        moduleDefine.setFormula("得分率");
+        List<ModuleEvaluation> moduleEvaluationList = new ArrayList<>();
+        ModuleEvaluation m1 = new ModuleEvaluation();
+        m1.setLevelCode("A");
+        m1.setLevelName("表现优秀水平");
+        m1.setScope("[0.9,1]");
+        m1.setResult("作答结果反映你在本次测试中表现优秀。你对本学期的知识点掌握的非常牢固,能够将所学的物理概念、规律和结论灵活用于解决相关的物理问题;具有将所学的物理知识,结合一定的数学手段解复杂的或综合性物理问题的能力。");
+        m1.setAdvice("希望你在后续课程的的学习中能够继续保持这种学习的态度和热情,戒骄戒躁,不忘初心,进一步拓宽知识面,进行个性化的深入学习,相信你一定会取得更优秀的成绩。");
+        moduleEvaluationList.add(m1);
+        moduleDefine.setModuleEvaluationList(moduleEvaluationList);
+        moduleDefineList.add(moduleDefine);
+        System.out.println(JSON.toJSONString(moduleDefineList));
+    }
 
 }