Переглянути джерело

Merge branch 'dev_v2.1.0' into release_v2.1.0
merge

wangliang 3 роки тому
батько
коміт
218c970036
59 змінених файлів з 3169 додано та 74 видалено
  1. 14 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  2. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  3. 33 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/query/ValidAnswerDetailDto.java
  4. 1 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/CellResult.java
  5. 18 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/SurveyTeacherViewResult.java
  6. 12 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TAExamCourseCollegeInspectResult.java
  7. 63 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeachCourseResult.java
  8. 14 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeacherMyClassRankResult.java
  9. 350 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseCollegePaperStruct.java
  10. 237 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegeDifficult.java
  11. 200 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegeDio.java
  12. 376 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegePaperStruct.java
  13. 350 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherPaperStruct.java
  14. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegeInspectMapper.java
  15. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegePaperStructMapper.java
  16. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegeTeacherMapper.java
  17. 17 5
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseRecordMapper.java
  18. 29 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegeDifficultMapper.java
  19. 25 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegeDioMapper.java
  20. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegePaperStructMapper.java
  21. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherPaperStructMapper.java
  22. 11 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBDimensionMapper.java
  23. 41 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeForReportService.java
  24. 11 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java
  25. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegeInspectService.java
  26. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegePaperStructService.java
  27. 38 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegeTeacherService.java
  28. 17 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseRecordService.java
  29. 28 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegeDifficultService.java
  30. 21 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegeDioService.java
  31. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegePaperStructService.java
  32. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherPaperStructService.java
  33. 10 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBDimensionService.java
  34. 477 6
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeForReportServiceImpl.java
  35. 57 19
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java
  36. 17 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegeInspectServiceImpl.java
  37. 20 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegePaperStructServiceImpl.java
  38. 89 5
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegeTeacherServiceImpl.java
  39. 23 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseRecordServiceImpl.java
  40. 1 28
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseServiceImpl.java
  41. 31 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegeDifficultServiceImpl.java
  42. 46 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegeDioServiceImpl.java
  43. 20 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegePaperStructServiceImpl.java
  44. 20 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherPaperStructServiceImpl.java
  45. 5 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBDimensionServiceImpl.java
  46. 33 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseCollegeInspectMapper.xml
  47. 5 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseCollegePaperStructMapper.xml
  48. 6 1
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseCollegeTeacherMapper.xml
  49. 38 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseRecordMapper.xml
  50. 29 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegeDifficultMapper.xml
  51. 32 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegeDioMapper.xml
  52. 5 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegePaperStructMapper.xml
  53. 5 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherPaperStructMapper.xml
  54. 2 0
      teachcloud-report-business/src/main/resources/mapper/TBAnswerMapper.xml
  55. 68 0
      teachcloud-report-business/src/main/resources/mapper/TBDimensionMapper.xml
  56. 1 0
      teachcloud-report-business/src/main/resources/mapper/TBPaperStructMapper.xml
  57. 50 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TAExamCourseCollegeTeacherController.java
  58. 1 0
      teachcloud-report/src/main/resources/application-dev.properties
  59. 35 0
      teachcloud-report/src/test/java/com/qmth/teachcloud/report/AnalyzeForStudentServiceTest.java

+ 14 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -247,7 +247,21 @@ public class SystemConstant {
         }
     }
 
+    /**
+     * String 类型的参数不为空
+     * @param str 参数
+     * @return true :不为空、false :为空
+     */
     public static boolean strNotNull(String str){
         return str != null && str.length() > 0 && !str.equals("null");
     }
+
+    /**
+     * Long 类型的参数不为空
+     * @param x 参数
+     * @return true:不为空、false:为空
+     */
+    public static boolean longNotNull(Long x){
+        return x != null && x > 0;
+    }
 }

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.boot.core.enums.Platform;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.teachcloud.common.SignatureEntityTest;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.auth.ExpireTimeBean;
 import com.qmth.teachcloud.common.bean.dto.OrgDto;

+ 33 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/query/ValidAnswerDetailDto.java

@@ -1,24 +1,39 @@
 package com.qmth.teachcloud.report.business.bean.dto.query;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 
 import java.math.BigDecimal;
 import java.util.Objects;
 
 /**
- * @Description:
+ * @Description: 有效的作答记录
  * @Author: CaoZixuan
- * @Date:
+ * @Date: 2021-07-21改
  */
 public class ValidAnswerDetailDto {
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long answerId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long examRecordId;
     private String numberType;
     private String mainNumber;
     private String subNumber;
     private BigDecimal score;
+
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long taExamRecordId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long inspectCollegeId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long teacherId;
     private int percentGrade;
+
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long paperId;
     private String paperType;
     private int rank;
@@ -114,4 +129,20 @@ public class ValidAnswerDetailDto {
     public void setRank(int rank) {
         this.rank = rank;
     }
+
+    public Long getInspectCollegeId() {
+        return inspectCollegeId;
+    }
+
+    public void setInspectCollegeId(Long inspectCollegeId) {
+        this.inspectCollegeId = inspectCollegeId;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
 }

+ 1 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/CellResult.java

@@ -22,6 +22,7 @@ public class CellResult implements Serializable {
     @ApiModelProperty(value = "分数")
     private String scope;
 
+    // TODO: 2021/7/22 如果能把这个属性改为 referenceAvgScoreRate(参照指标) 比较好,因为有的地方显示的是学校平均得分率,有的是学院平均得分率,更改这个地方需要前端和三个mapper查询更改
     @ApiModelProperty(value = "学校平均分得分率")
     private Double schAvgScoreRate;
 

+ 18 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/SurveyTeacherViewResult.java

@@ -26,6 +26,9 @@ public class SurveyTeacherViewResult implements Serializable {
     @ApiModelProperty(value = "开课学院考试概况")
     private TeachCourseSurveyResult teachCourseSurveyResult;
 
+    @ApiModelProperty(value = "我的课堂考试概况")
+    private TeachCourseResult teachCourseResult;
+
     public SurveyTeacherViewResult() {
 
     }
@@ -37,6 +40,13 @@ public class SurveyTeacherViewResult implements Serializable {
         this.teachCourseSurveyResult = teachCourseSurveyResult;
     }
 
+    public SurveyTeacherViewResult(List<SurveyTeacherGradeDistributionResult> gradeDistribution, TeachCourseResult teachCourseResult, QuestionListResult questionInfo, SurveyTeacherExamCourseResult surveyTeacher) {
+        this.gradeDistribution = gradeDistribution;
+        this.teachCourseResult = teachCourseResult;
+        this.questionInfo = questionInfo;
+        this.surveyTeacher = surveyTeacher;
+    }
+
     public List<SurveyTeacherGradeDistributionResult> getGradeDistribution() {
         return gradeDistribution;
     }
@@ -68,4 +78,12 @@ public class SurveyTeacherViewResult implements Serializable {
     public void setTeachCourseSurveyResult(TeachCourseSurveyResult teachCourseSurveyResult) {
         this.teachCourseSurveyResult = teachCourseSurveyResult;
     }
+
+    public TeachCourseResult getTeachCourseResult() {
+        return teachCourseResult;
+    }
+
+    public void setTeachCourseResult(TeachCourseResult teachCourseResult) {
+        this.teachCourseResult = teachCourseResult;
+    }
 }

+ 12 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TAExamCourseCollegeInspectResult.java

@@ -7,6 +7,7 @@ import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegeInspect;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * @Description: 参考课程考查学院维度分析 result
@@ -31,6 +32,17 @@ public class TAExamCourseCollegeInspectResult extends TAExamCourseCollegeInspect
     @ApiModelProperty(value = "考试名称")
     private String examName;
 
+    @ApiModelProperty(value = "试卷分数")
+    private BigDecimal fullScore;
+
+    public BigDecimal getFullScore() {
+        return fullScore;
+    }
+
+    public void setFullScore(BigDecimal fullScore) {
+        this.fullScore = fullScore;
+    }
+
     public String getExamTime() {
         return examTime;
     }

+ 63 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeachCourseResult.java

@@ -0,0 +1,63 @@
+package com.qmth.teachcloud.report.business.bean.result;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: 我的考试课堂分析 - 图表查询接口
+ * @Author: CaoZixuan
+ * @Date: 2021-06-19
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class TeachCourseResult extends TeachCourseSurveyResult {
+
+    @ApiModelProperty(value = "课堂有效实考人数")
+    private int courseRealityCount = 0;
+
+    @ApiModelProperty(value = "课堂缺考人数")
+    private int courseAbsentCount = 0;
+
+    @ApiModelProperty(value = "是否缺考 1缺考 0正常")
+    private Boolean absent;
+
+    public TeachCourseResult() {
+
+    }
+
+    public TeachCourseResult(TAExamCourseCollegeInspectResult taExamCourseCollegeInspectResult) {
+        setExamTime(taExamCourseCollegeInspectResult.getExamTime());
+        setCourseCode(taExamCourseCollegeInspectResult.getCourseCode());
+        setCourseName(taExamCourseCollegeInspectResult.getCourseName());
+        setFullScore(taExamCourseCollegeInspectResult.getFullScore());
+        setRealityCount(taExamCourseCollegeInspectResult.getRealityCount());
+        setAbsentCount(taExamCourseCollegeInspectResult.getAbsentCount());
+    }
+
+    public Boolean getAbsent() {
+        return absent;
+    }
+
+    public void setAbsent(Boolean absent) {
+        this.absent = absent;
+    }
+
+    public int getCourseRealityCount() {
+        return courseRealityCount;
+    }
+
+    public void setCourseRealityCount(int courseRealityCount) {
+        this.courseRealityCount = courseRealityCount;
+    }
+
+    public int getCourseAbsentCount() {
+        return courseAbsentCount;
+    }
+
+    public void setCourseAbsentCount(int courseAbsentCount) {
+        this.courseAbsentCount = courseAbsentCount;
+    }
+}

+ 14 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeacherMyClassRankResult.java

@@ -1,5 +1,8 @@
 package com.qmth.teachcloud.report.business.bean.result;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
 /**
  * @Date: 2021/6/8.
  */
@@ -14,6 +17,17 @@ public class TeacherMyClassRankResult {
     private Integer teacherCount;
     private Integer rank;
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long inspectCollegeId;
+
+    public Long getInspectCollegeId() {
+        return inspectCollegeId;
+    }
+
+    public void setInspectCollegeId(Long inspectCollegeId) {
+        this.inspectCollegeId = inspectCollegeId;
+    }
+
     public String getTeacherName() {
         return teacherName;
     }

+ 350 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseCollegePaperStruct.java

@@ -0,0 +1,350 @@
+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 com.qmth.teachcloud.report.business.enums.PaperStructJudgeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@ApiModel(value = "TAExamCourseCollegePaperStruct对象", description = "教师考察学院下试卷结构维度分析表")
+public class TAExamCourseCollegePaperStruct 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 = "school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "试卷结构基础表id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "paper_struct_id")
+    private Long paperStructId;
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "exam_id")
+    private Long examId;
+
+    @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 = "paper_id")
+    private Long paperId;
+
+    @ApiModelProperty(value = "考察学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "inspect_college_id")
+    private Long inspectCollegeId;
+
+    @ApiModelProperty(value = "考察学院名称")
+    @TableField(value = "inspect_college_name")
+    private String inspectCollegeName;
+
+    @ApiModelProperty(value = "试卷类型")
+    @TableField(value = "paper_type")
+    private String paperType;
+
+    @ApiModelProperty(value = "大题名称")
+    @TableField(value = "question_name")
+    private String questionName;
+
+    @ApiModelProperty(value = "题号类型(客观题、主观题)")
+    @TableField(value = "number_type")
+    private String numberType;
+
+    @ApiModelProperty(value = "大题号")
+    @TableField(value = "big_question_number")
+    private String bigQuestionNumber;
+
+    @ApiModelProperty(value = "小题号(每一课程试卷的唯一标识)")
+    @TableField(value = "small_question_number")
+    private String smallQuestionNumber;
+
+    @ApiModelProperty(value = "题目类型")
+    @TableField(value = "question_type")
+    private String questionType;
+
+    @ApiModelProperty(value = "满分")
+    @TableField(value = "full_score")
+    private BigDecimal fullScore;
+
+    @ApiModelProperty(value = "计分规则")
+    @TableField(value = "score_rules")
+    private String scoreRules;
+
+    @ApiModelProperty(value = "规则说明")
+    @TableField(value = "rules_desc")
+    private String rulesDesc;
+
+    @ApiModelProperty(value = "知识维度")
+    @TableField(value = "knowledge_dimension")
+    private String knowledgeDimension;
+
+    @ApiModelProperty(value = "能力维度")
+    @TableField(value = "ability_dimension")
+    private String abilityDimension;
+
+    @ApiModelProperty(value = "素养维度")
+    @TableField(value = "literacy_dimension")
+    private String literacyDimension;
+
+    @ApiModelProperty(value = "标准难度系数(得分率)")
+    @TableField(value = "standard_score_rate")
+    private BigDecimal standardScoreRate;
+
+    @ApiModelProperty(value = "得分率")
+    @TableField(value = "score_rate")
+    private BigDecimal scoreRate;
+
+    @ApiModelProperty(value = "难度")
+    @TableField(value = "difficult")
+    private String difficult;
+
+    @ApiModelProperty(value = "试卷结构每道题目正确(全对),错误枚举\nALL_CORRECT('全对'), NOT_QUITE_RIGHT('不完全正确的'),")
+    @TableField(value = "paper_struct_judge")
+    private PaperStructJudgeEnum paperStructJudge;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getPaperStructId() {
+        return paperStructId;
+    }
+
+    public void setPaperStructId(Long paperStructId) {
+        this.paperStructId = paperStructId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    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 getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public Long getInspectCollegeId() {
+        return inspectCollegeId;
+    }
+
+    public void setInspectCollegeId(Long inspectCollegeId) {
+        this.inspectCollegeId = inspectCollegeId;
+    }
+
+    public String getInspectCollegeName() {
+        return inspectCollegeName;
+    }
+
+    public void setInspectCollegeName(String inspectCollegeName) {
+        this.inspectCollegeName = inspectCollegeName;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getQuestionName() {
+        return questionName;
+    }
+
+    public void setQuestionName(String questionName) {
+        this.questionName = questionName;
+    }
+
+    public String getNumberType() {
+        return numberType;
+    }
+
+    public void setNumberType(String numberType) {
+        this.numberType = numberType;
+    }
+
+    public String getBigQuestionNumber() {
+        return bigQuestionNumber;
+    }
+
+    public void setBigQuestionNumber(String bigQuestionNumber) {
+        this.bigQuestionNumber = bigQuestionNumber;
+    }
+
+    public String getSmallQuestionNumber() {
+        return smallQuestionNumber;
+    }
+
+    public void setSmallQuestionNumber(String smallQuestionNumber) {
+        this.smallQuestionNumber = smallQuestionNumber;
+    }
+
+    public String getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
+    }
+
+    public BigDecimal getFullScore() {
+        if (Objects.nonNull(fullScore)) {
+            return fullScore.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return fullScore;
+        }
+    }
+
+    public void setFullScore(BigDecimal fullScore) {
+        this.fullScore = fullScore;
+    }
+
+    public String getScoreRules() {
+        return scoreRules;
+    }
+
+    public void setScoreRules(String scoreRules) {
+        this.scoreRules = scoreRules;
+    }
+
+    public String getRulesDesc() {
+        return rulesDesc;
+    }
+
+    public void setRulesDesc(String rulesDesc) {
+        this.rulesDesc = rulesDesc;
+    }
+
+    public String getKnowledgeDimension() {
+        return knowledgeDimension;
+    }
+
+    public void setKnowledgeDimension(String knowledgeDimension) {
+        this.knowledgeDimension = knowledgeDimension;
+    }
+
+    public String getAbilityDimension() {
+        return abilityDimension;
+    }
+
+    public void setAbilityDimension(String abilityDimension) {
+        this.abilityDimension = abilityDimension;
+    }
+
+    public String getLiteracyDimension() {
+        return literacyDimension;
+    }
+
+    public void setLiteracyDimension(String literacyDimension) {
+        this.literacyDimension = literacyDimension;
+    }
+
+    public BigDecimal getStandardScoreRate() {
+        if (Objects.nonNull(standardScoreRate)) {
+            return standardScoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return standardScoreRate;
+        }
+    }
+
+    public void setStandardScoreRate(BigDecimal standardScoreRate) {
+        this.standardScoreRate = standardScoreRate;
+    }
+
+    public BigDecimal getScoreRate() {
+        if (Objects.nonNull(scoreRate)) {
+            return scoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return scoreRate;
+        }
+    }
+
+    public void setScoreRate(BigDecimal scoreRate) {
+        this.scoreRate = scoreRate;
+    }
+
+    public String getDifficult() {
+        return difficult;
+    }
+
+    public void setDifficult(String difficult) {
+        this.difficult = difficult;
+    }
+
+    public PaperStructJudgeEnum getPaperStructJudge() {
+        return paperStructJudge;
+    }
+
+    public void setPaperStructJudge(PaperStructJudgeEnum paperStructJudge) {
+        this.paperStructJudge = paperStructJudge;
+    }
+}

+ 237 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegeDifficult.java

@@ -0,0 +1,237 @@
+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.util.Objects;
+
+/**
+ * <p>
+ * 授课教师-本院难度分布和该教师在本院难度分布对比
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@ApiModel(value = "TAExamCourseTeacherCollegeDifficult对象", description = "授课教师-本院难度分布和该教师在本院难度分布对比")
+public class TAExamCourseTeacherCollegeDifficult 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 = "paper_id")
+    private Long paperId;
+
+    @ApiModelProperty(value = "试卷类型")
+    @TableField(value = "paper_type")
+    private String paperType;
+
+    @ApiModelProperty(value = "教师id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "teacher_id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "教师名称")
+    @TableField(value = "teacher_name")
+    private String teacherName;
+
+    @ApiModelProperty(value = "考察学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "inspect_college_id")
+    private Long inspectCollegeId;
+
+    @ApiModelProperty(value = "考察学院名称")
+    @TableField(value = "inspect_college_name")
+    private String inspectCollegeName;
+
+    @ApiModelProperty(value = "难度类型")
+    @TableField(value = "interpret")
+    private String interpret;
+
+    @ApiModelProperty(value = "该难度题目数量")
+    @TableField(value = "count")
+    private Integer count;
+
+    @ApiModelProperty(value = "难度范围")
+    @TableField(value = "scope")
+    private String scope;
+
+    @ApiModelProperty(value = "各难度题在考察学院集合的平均得分率")
+    @TableField(value = "col_avg_score_rate")
+    private BigDecimal colAvgScoreRate;
+
+    @ApiModelProperty(value = "各难度题在教师考察学院下集合的平均得分率")
+    @TableField(value = "tea_col_avg_score_rate")
+    private BigDecimal teaColAvgScoreRate;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    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 getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Long getInspectCollegeId() {
+        return inspectCollegeId;
+    }
+
+    public void setInspectCollegeId(Long inspectCollegeId) {
+        this.inspectCollegeId = inspectCollegeId;
+    }
+
+    public String getInspectCollegeName() {
+        return inspectCollegeName;
+    }
+
+    public void setInspectCollegeName(String inspectCollegeName) {
+        this.inspectCollegeName = inspectCollegeName;
+    }
+
+    public String getInterpret() {
+        return interpret;
+    }
+
+    public void setInterpret(String interpret) {
+        this.interpret = interpret;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public BigDecimal getColAvgScoreRate() {
+        if (Objects.nonNull(colAvgScoreRate)) {
+            return colAvgScoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return colAvgScoreRate;
+        }
+    }
+
+    public void setColAvgScoreRate(BigDecimal colAvgScoreRate) {
+        this.colAvgScoreRate = colAvgScoreRate;
+    }
+
+    public BigDecimal getTeaColAvgScoreRate() {
+        if (Objects.nonNull(teaColAvgScoreRate)) {
+            return teaColAvgScoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return teaColAvgScoreRate;
+        }
+    }
+
+    public void setTeaColAvgScoreRate(BigDecimal teaColAvgScoreRate) {
+        this.teaColAvgScoreRate = teaColAvgScoreRate;
+    }
+}

+ 200 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegeDio.java

@@ -0,0 +1,200 @@
+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.util.Objects;
+
+/**
+ * <p>
+ * 各个教师在考察学院下的各考察点得分情况表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@ApiModel(value = "TAExamCourseTeacherCollegeDio对象", description = "各个教师在考察学院下的各考察点得分情况表")
+public class TAExamCourseTeacherCollegeDio 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 = "teacher_id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "教师名称")
+    @TableField(value = "teacher_name")
+    private String teacherName;
+
+    @ApiModelProperty(value = "考察学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "inspect_college_id")
+    private Long inspectCollegeId;
+
+    @ApiModelProperty(value = "考察学院名称")
+    @TableField(value = "inspect_college_name")
+    private String inspectCollegeName;
+
+    @ApiModelProperty(value = "考察点类型")
+    @TableField(value = "dimension_type")
+    private String dimensionType;
+
+    @ApiModelProperty(value = "考察点编号")
+    @TableField(value = "dimension_code")
+    private String dimensionCode;
+
+    @ApiModelProperty(value = "考察点平均分")
+    @TableField(value = "avg_score")
+    private BigDecimal avgScore;
+
+    @ApiModelProperty(value = "考察点得分率")
+    @TableField(value = "score_rate")
+    private BigDecimal scoreRate;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    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 getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Long getInspectCollegeId() {
+        return inspectCollegeId;
+    }
+
+    public void setInspectCollegeId(Long inspectCollegeId) {
+        this.inspectCollegeId = inspectCollegeId;
+    }
+
+    public String getInspectCollegeName() {
+        return inspectCollegeName;
+    }
+
+    public void setInspectCollegeName(String inspectCollegeName) {
+        this.inspectCollegeName = inspectCollegeName;
+    }
+
+    public String getDimensionType() {
+        return dimensionType;
+    }
+
+    public void setDimensionType(String dimensionType) {
+        this.dimensionType = dimensionType;
+    }
+
+    public String getDimensionCode() {
+        return dimensionCode;
+    }
+
+    public void setDimensionCode(String dimensionCode) {
+        this.dimensionCode = dimensionCode;
+    }
+
+    public BigDecimal getAvgScore() {
+        if (Objects.nonNull(avgScore)) {
+            return avgScore.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return avgScore;
+        }
+    }
+
+    public void setAvgScore(BigDecimal avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public BigDecimal getScoreRate() {
+        if (Objects.nonNull(scoreRate)) {
+            return scoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return scoreRate;
+        }
+    }
+
+    public void setScoreRate(BigDecimal scoreRate) {
+        this.scoreRate = scoreRate;
+    }
+}

+ 376 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegePaperStruct.java

@@ -0,0 +1,376 @@
+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 com.qmth.teachcloud.report.business.enums.PaperStructJudgeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.awt.print.Paper;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@ApiModel(value = "TAExamCourseTeacherCollegePaperStruct对象", description = "教师考察学院下试卷结构维度分析表")
+public class TAExamCourseTeacherCollegePaperStruct implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "试卷结构基础表id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "paper_struct_id")
+    private Long paperStructId;
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "exam_id")
+    private Long examId;
+
+    @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 = "paper_id")
+    private Long paperId;
+
+    @ApiModelProperty(value = "教师id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "teacher_id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "教师名称")
+    @TableField(value = "teacher_name")
+    private String teacherName;
+
+    @ApiModelProperty(value = "考察学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "inspect_college_id")
+    private Long inspectCollegeId;
+
+    @ApiModelProperty(value = "考察学院名称")
+    @TableField(value = "inspect_college_name")
+    private String inspectCollegeName;
+
+    @ApiModelProperty(value = "试卷类型")
+    @TableField(value = "paper_type")
+    private String paperType;
+
+    @ApiModelProperty(value = "大题名称")
+    @TableField(value = "question_name")
+    private String questionName;
+
+    @ApiModelProperty(value = "题号类型(客观题、主观题)")
+    @TableField(value = "number_type")
+    private String numberType;
+
+    @ApiModelProperty(value = "大题号")
+    @TableField(value = "big_question_number")
+    private String bigQuestionNumber;
+
+    @ApiModelProperty(value = "小题号(每一课程试卷的唯一标识)")
+    @TableField(value = "small_question_number")
+    private String smallQuestionNumber;
+
+    @ApiModelProperty(value = "题目类型")
+    @TableField(value = "question_type")
+    private String questionType;
+
+    @ApiModelProperty(value = "满分")
+    @TableField(value = "full_score")
+    private BigDecimal fullScore;
+
+    @ApiModelProperty(value = "计分规则")
+    @TableField(value = "score_rules")
+    private String scoreRules;
+
+    @ApiModelProperty(value = "规则说明")
+    @TableField(value = "rules_desc")
+    private String rulesDesc;
+
+    @ApiModelProperty(value = "知识维度")
+    @TableField(value = "knowledge_dimension")
+    private String knowledgeDimension;
+
+    @ApiModelProperty(value = "能力维度")
+    @TableField(value = "ability_dimension")
+    private String abilityDimension;
+
+    @ApiModelProperty(value = "素养维度")
+    @TableField(value = "literacy_dimension")
+    private String literacyDimension;
+
+    @ApiModelProperty(value = "标准难度系数(得分率)")
+    @TableField(value = "standard_score_rate")
+    private BigDecimal standardScoreRate;
+
+    @ApiModelProperty(value = "得分率")
+    @TableField(value = "score_rate")
+    private BigDecimal scoreRate;
+
+    @ApiModelProperty(value = "难度")
+    @TableField(value = "difficult")
+    private String difficult;
+
+    @ApiModelProperty(value = "试卷结构每道题目正确(全对),错误枚举\nALL_CORRECT('全对'), NOT_QUITE_RIGHT('不完全正确的'),")
+    @TableField(value = "paper_struct_judge")
+    private PaperStructJudgeEnum paperStructJudge;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getPaperStructId() {
+        return paperStructId;
+    }
+
+    public void setPaperStructId(Long paperStructId) {
+        this.paperStructId = paperStructId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    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 getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Long getInspectCollegeId() {
+        return inspectCollegeId;
+    }
+
+    public void setInspectCollegeId(Long inspectCollegeId) {
+        this.inspectCollegeId = inspectCollegeId;
+    }
+
+    public String getInspectCollegeName() {
+        return inspectCollegeName;
+    }
+
+    public void setInspectCollegeName(String inspectCollegeName) {
+        this.inspectCollegeName = inspectCollegeName;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getQuestionName() {
+        return questionName;
+    }
+
+    public void setQuestionName(String questionName) {
+        this.questionName = questionName;
+    }
+
+    public String getNumberType() {
+        return numberType;
+    }
+
+    public void setNumberType(String numberType) {
+        this.numberType = numberType;
+    }
+
+    public String getBigQuestionNumber() {
+        return bigQuestionNumber;
+    }
+
+    public void setBigQuestionNumber(String bigQuestionNumber) {
+        this.bigQuestionNumber = bigQuestionNumber;
+    }
+
+    public String getSmallQuestionNumber() {
+        return smallQuestionNumber;
+    }
+
+    public void setSmallQuestionNumber(String smallQuestionNumber) {
+        this.smallQuestionNumber = smallQuestionNumber;
+    }
+
+    public String getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
+    }
+
+    public BigDecimal getFullScore() {
+        if (Objects.nonNull(fullScore)) {
+            return fullScore.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return fullScore;
+        }
+    }
+
+    public void setFullScore(BigDecimal fullScore) {
+        this.fullScore = fullScore;
+    }
+
+    public String getScoreRules() {
+        return scoreRules;
+    }
+
+    public void setScoreRules(String scoreRules) {
+        this.scoreRules = scoreRules;
+    }
+
+    public String getRulesDesc() {
+        return rulesDesc;
+    }
+
+    public void setRulesDesc(String rulesDesc) {
+        this.rulesDesc = rulesDesc;
+    }
+
+    public String getKnowledgeDimension() {
+        return knowledgeDimension;
+    }
+
+    public void setKnowledgeDimension(String knowledgeDimension) {
+        this.knowledgeDimension = knowledgeDimension;
+    }
+
+    public String getAbilityDimension() {
+        return abilityDimension;
+    }
+
+    public void setAbilityDimension(String abilityDimension) {
+        this.abilityDimension = abilityDimension;
+    }
+
+    public String getLiteracyDimension() {
+        return literacyDimension;
+    }
+
+    public void setLiteracyDimension(String literacyDimension) {
+        this.literacyDimension = literacyDimension;
+    }
+
+    public BigDecimal getStandardScoreRate() {
+        if (Objects.nonNull(standardScoreRate)) {
+            return standardScoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return standardScoreRate;
+        }
+    }
+
+    public void setStandardScoreRate(BigDecimal standardScoreRate) {
+        this.standardScoreRate = standardScoreRate;
+    }
+
+    public BigDecimal getScoreRate() {
+        if (Objects.nonNull(scoreRate)) {
+            return scoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return scoreRate;
+        }
+    }
+
+    public void setScoreRate(BigDecimal scoreRate) {
+        this.scoreRate = scoreRate;
+    }
+
+    public String getDifficult() {
+        return difficult;
+    }
+
+    public void setDifficult(String difficult) {
+        this.difficult = difficult;
+    }
+
+    public PaperStructJudgeEnum getPaperStructJudge() {
+        return paperStructJudge;
+    }
+
+    public void setPaperStructJudge(PaperStructJudgeEnum paperStructJudge) {
+        this.paperStructJudge = paperStructJudge;
+    }
+}

+ 350 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherPaperStruct.java

@@ -0,0 +1,350 @@
+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 com.qmth.teachcloud.report.business.enums.PaperStructJudgeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 教师下试卷结构维度分析表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@ApiModel(value = "TAExamCourseTeacherPaperStruct对象", description = "教师下试卷结构维度分析表")
+public class TAExamCourseTeacherPaperStruct implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "试卷结构基础表id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "paper_struct_id")
+    private Long paperStructId;
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "exam_id")
+    private Long examId;
+
+    @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 = "paper_id")
+    private Long paperId;
+
+    @ApiModelProperty(value = "教师id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "teacher_id")
+    private Long teacherId;
+
+    @ApiModelProperty(value = "教师名称")
+    @TableField(value = "teacher_name")
+    private String teacherName;
+
+    @ApiModelProperty(value = "试卷类型")
+    @TableField(value = "paper_type")
+    private String paperType;
+
+    @ApiModelProperty(value = "大题名称")
+    @TableField(value = "question_name")
+    private String questionName;
+
+    @ApiModelProperty(value = "题号类型(客观题、主观题)")
+    @TableField(value = "number_type")
+    private String numberType;
+
+    @ApiModelProperty(value = "大题号")
+    @TableField(value = "big_question_number")
+    private String bigQuestionNumber;
+
+    @ApiModelProperty(value = "小题号(每一课程试卷的唯一标识)")
+    @TableField(value = "small_question_number")
+    private String smallQuestionNumber;
+
+    @ApiModelProperty(value = "题目类型")
+    @TableField(value = "question_type")
+    private String questionType;
+
+    @ApiModelProperty(value = "满分")
+    @TableField(value = "full_score")
+    private BigDecimal fullScore;
+
+    @ApiModelProperty(value = "计分规则")
+    @TableField(value = "score_rules")
+    private String scoreRules;
+
+    @ApiModelProperty(value = "规则说明")
+    @TableField(value = "rules_desc")
+    private String rulesDesc;
+
+    @ApiModelProperty(value = "知识维度")
+    @TableField(value = "knowledge_dimension")
+    private String knowledgeDimension;
+
+    @ApiModelProperty(value = "能力维度")
+    @TableField(value = "ability_dimension")
+    private String abilityDimension;
+
+    @ApiModelProperty(value = "素养维度")
+    @TableField(value = "literacy_dimension")
+    private String literacyDimension;
+
+    @ApiModelProperty(value = "标准难度系数(得分率)")
+    @TableField(value = "standard_score_rate")
+    private BigDecimal standardScoreRate;
+
+    @ApiModelProperty(value = "得分率")
+    @TableField(value = "score_rate")
+    private BigDecimal scoreRate;
+
+    @ApiModelProperty(value = "难度")
+    @TableField(value = "difficult")
+    private String difficult;
+
+    @ApiModelProperty(value = "试卷结构每道题目正确(全对),错误枚举\nALL_CORRECT('全对'), NOT_QUITE_RIGHT('不完全正确的'),")
+    @TableField(value = "paper_struct_judge")
+    private PaperStructJudgeEnum paperStructJudge;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getPaperStructId() {
+        return paperStructId;
+    }
+
+    public void setPaperStructId(Long paperStructId) {
+        this.paperStructId = paperStructId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    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 getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getQuestionName() {
+        return questionName;
+    }
+
+    public void setQuestionName(String questionName) {
+        this.questionName = questionName;
+    }
+
+    public String getNumberType() {
+        return numberType;
+    }
+
+    public void setNumberType(String numberType) {
+        this.numberType = numberType;
+    }
+
+    public String getBigQuestionNumber() {
+        return bigQuestionNumber;
+    }
+
+    public void setBigQuestionNumber(String bigQuestionNumber) {
+        this.bigQuestionNumber = bigQuestionNumber;
+    }
+
+    public String getSmallQuestionNumber() {
+        return smallQuestionNumber;
+    }
+
+    public void setSmallQuestionNumber(String smallQuestionNumber) {
+        this.smallQuestionNumber = smallQuestionNumber;
+    }
+
+    public String getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
+    }
+
+    public BigDecimal getFullScore() {
+        if (Objects.nonNull(fullScore)) {
+            return fullScore.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return fullScore;
+        }
+    }
+
+    public void setFullScore(BigDecimal fullScore) {
+        this.fullScore = fullScore;
+    }
+
+    public String getScoreRules() {
+        return scoreRules;
+    }
+
+    public void setScoreRules(String scoreRules) {
+        this.scoreRules = scoreRules;
+    }
+
+    public String getRulesDesc() {
+        return rulesDesc;
+    }
+
+    public void setRulesDesc(String rulesDesc) {
+        this.rulesDesc = rulesDesc;
+    }
+
+    public String getKnowledgeDimension() {
+        return knowledgeDimension;
+    }
+
+    public void setKnowledgeDimension(String knowledgeDimension) {
+        this.knowledgeDimension = knowledgeDimension;
+    }
+
+    public String getAbilityDimension() {
+        return abilityDimension;
+    }
+
+    public void setAbilityDimension(String abilityDimension) {
+        this.abilityDimension = abilityDimension;
+    }
+
+    public String getLiteracyDimension() {
+        return literacyDimension;
+    }
+
+    public void setLiteracyDimension(String literacyDimension) {
+        this.literacyDimension = literacyDimension;
+    }
+
+    public BigDecimal getStandardScoreRate() {
+        if (Objects.nonNull(standardScoreRate)) {
+            return standardScoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return standardScoreRate;
+        }
+    }
+
+    public void setStandardScoreRate(BigDecimal standardScoreRate) {
+        this.standardScoreRate = standardScoreRate;
+    }
+
+    public BigDecimal getScoreRate() {
+        if (Objects.nonNull(scoreRate)) {
+            return scoreRate.setScale(SystemConstant.CALCULATE_SCALE, BigDecimal.ROUND_HALF_UP);
+        } else {
+            return scoreRate;
+        }
+    }
+
+    public void setScoreRate(BigDecimal scoreRate) {
+        this.scoreRate = scoreRate;
+    }
+
+    public String getDifficult() {
+        return difficult;
+    }
+
+    public void setDifficult(String difficult) {
+        this.difficult = difficult;
+    }
+
+    public PaperStructJudgeEnum getPaperStructJudge() {
+        return paperStructJudge;
+    }
+
+    public void setPaperStructJudge(PaperStructJudgeEnum paperStructJudge) {
+        this.paperStructJudge = paperStructJudge;
+    }
+}

+ 13 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegeInspectMapper.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.report.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qmth.teachcloud.report.business.bean.result.TAExamCourseCollegeInspectResult;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegeInspect;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -35,4 +36,16 @@ public interface TAExamCourseCollegeInspectMapper extends BaseMapper<TAExamCours
      * @return
      */
     List<TAExamCourseCollegeInspectResult> findCourseDescriptiveStatisticsForSchool(@Param("examId") Long examId, @Param("courseCode") String courseCode);
+
+    /**
+     * 我的课堂考试分析-考试概况,查找全校数据
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @return
+     */
+    TAExamCourseCollegeInspectResult findTeacherInspect(@Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("inspectCollegeId") Long inspectCollegeId);
 }

+ 16 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegePaperStructMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegePaperStruct;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseCollegePaperStructMapper extends BaseMapper<TAExamCourseCollegePaperStruct> {
+
+}

+ 13 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegeTeacherMapper.java

@@ -3,6 +3,7 @@ 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.SurveyTeacherViewResult;
 import com.qmth.teachcloud.report.business.bean.result.TAExamCourseTeacherResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherClassRankResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherMyClassRankResult;
@@ -39,4 +40,16 @@ public interface TAExamCourseCollegeTeacherMapper extends BaseMapper<TAExamCours
     List<TAExamCourseTeacherResult> findTeacherInfo(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("collegeId") Long collegeId);
 
     IPage<TeacherClassRankResult> listTeacherClassRank(@Param("page") Page<TeacherClassRankResult> 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 schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @return
+     */
+    SurveyTeacherViewResult teacherView(@Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("inspectCollegeId") Long inspectCollegeId);
 }

+ 17 - 5
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseRecordMapper.java

@@ -1,11 +1,9 @@
 package com.qmth.teachcloud.report.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.qmth.teachcloud.report.business.bean.result.ExamRecordResult;
-import com.qmth.teachcloud.report.business.bean.result.ExamStudentResult;
-import com.qmth.teachcloud.report.business.bean.result.SurveyTeacherDistributionResult;
-import com.qmth.teachcloud.report.business.bean.result.SynthesisResult;
+import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseRecord;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -41,7 +39,21 @@ public interface TAExamCourseRecordMapper extends BaseMapper<TAExamCourseRecord>
      * @param examId
      * @param courseCode
      * @param filter
+     * @param inspectCollegeId
      * @return
      */
-    List<SurveyTeacherDistributionResult> surveyTeacherDistribution(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("filter") boolean filter);
+    List<SurveyTeacherDistributionResult> surveyTeacherDistribution(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("filter") boolean filter, @Param("inspectCollegeId") Long inspectCollegeId);
+
+    /**
+     * 我的课堂考试分析-考试概况,查找我的课堂数据
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @param teacherId
+     * @return
+     */
+    List<TeachCourseResult> findTeacherInspect(@Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("inspectCollegeId") Long inspectCollegeId, @Param("teacherId") Long teacherId);
 }

+ 29 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegeDifficultMapper.java

@@ -0,0 +1,29 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.bean.result.CellResult;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegeDifficult;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 授课教师-本院难度分布和该教师在本院难度分布对比 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherCollegeDifficultMapper extends BaseMapper<TAExamCourseTeacherCollegeDifficult> {
+
+    /**
+     * 查找有效答案
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @param teacherId 教师id
+     * @param inspectCollegeId 考察学院id
+     * @return 结果
+     */
+    List<CellResult> findValidAnswerDetail(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("teacherId") Long teacherId,@Param("inspectCollegeId") Long inspectCollegeId);
+}

+ 25 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegeDioMapper.java

@@ -0,0 +1,25 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegeDio;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 各个教师在考察学院下的各考察点得分情况表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherCollegeDioMapper extends BaseMapper<TAExamCourseTeacherCollegeDio> {
+    /**
+     * 根据't_a_exam_course_record_dio'表归集't_a_exam_course_teacher_college_dio'的数据
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果集
+     */
+    List<TAExamCourseTeacherCollegeDio> findByTAExamCourseRecordDio(@Param("examId") Long examId,@Param("courseCode") String courseCode);
+}

+ 16 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegePaperStructMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegePaperStruct;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherCollegePaperStructMapper extends BaseMapper<TAExamCourseTeacherCollegePaperStruct> {
+
+}

+ 16 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherPaperStructMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherPaperStruct;
+
+/**
+ * <p>
+ * 教师下试卷结构维度分析表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherPaperStructMapper extends BaseMapper<TAExamCourseTeacherPaperStruct> {
+
+}

+ 11 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBDimensionMapper.java

@@ -36,4 +36,15 @@ public interface TBDimensionMapper extends BaseMapper<TBDimension> {
      * @return
      */
     List<CourseDimensionResult> findDimensionByTeacherInfo(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("teacherId") Long teacherId);
+
+    /**
+     * 查找某任课教师在某学院下所有考生在考察点得分情况统计
+     *
+     * @param examId           考试id
+     * @param courseCode       课程编号
+     * @param teacherId        教师id
+     * @param inspectCollegeId 考察学院id
+     * @return 考察点统计信息
+     */
+    List<CourseDimensionResult> findDimensionByTeacherCollegeInfo(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("teacherId") Long teacherId, @Param("inspectCollegeId") Long inspectCollegeId);
 }

+ 41 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeForReportService.java

@@ -35,8 +35,7 @@ public interface AnalyzeForReportService {
      * @return 结果
      */
     String buildAnalyzeExamCourseCollegeInspect(Long examId, String courseCode);
-
-    // TODO: 2021/6/7 专业
+    
 
     /**
      * 构建考试课程-班级维度的分析表 ’t_a_exam_course_clazz‘
@@ -90,6 +89,14 @@ public interface AnalyzeForReportService {
      */
     String buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode);
 
+    /**
+     * 构建表't_a_exam_course_teacher_college_dio'表来记录教师在每个授课学院各个考察点的得分率
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeExamCourseTeacherCollegeDio(Long examId,String courseCode);
+
     /**
      * 构建分析试卷结构表 't_a_paper_struct'表
      *
@@ -99,6 +106,30 @@ public interface AnalyzeForReportService {
      */
     String buildAnalyzePaperStruct(Long examId, String courseCode);
 
+    /**
+     * 构建't_a_exam_course_college_paper_struct'表记录各个考察学院下学生的各个题目的难度情况
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeCollegePaperStruct(Long examId,String courseCode);
+
+    /**
+     * 构建't_a_exam_course_teacher_paper_struct'表记录该教师下所教学生的各个题目的难度情况
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String 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);
+
     /**
      * 构建科目题目难度分类得分率表 - 学院与学校
      *
@@ -117,6 +148,14 @@ public interface AnalyzeForReportService {
      */
     String buildExamPaperTeacherDifficult(Long examId, String courseCode);
 
+    /**
+     * 构建't_a_exam_course_teacher_college_difficult'表记录该教师在某学院的各难度题作答分析
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId,String courseCode);
+
     /**
      * 构建表 ‘t_a_exam_total’
      *

+ 11 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.report.business.service;
 
 import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.entity.TAExamCourse;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -104,4 +105,14 @@ public interface ReportCommonService {
      * 武汉大学退出
      */
     public void whuLogout() throws IOException;
+
+    /**
+     * 获取开课课程考试课程总览
+     *
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @return
+     */
+    TeachCourseSurveyResult getTeachCourseSurveyInfo(SemesterEnum semester, Long examId, String courseCode);
 }

+ 13 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegeInspectService.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.report.business.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.report.business.bean.result.TAExamCourseCollegeInspectResult;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegeInspect;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 
 import java.util.List;
 
@@ -34,4 +35,16 @@ public interface TAExamCourseCollegeInspectService extends IService<TAExamCourse
      * @return
      */
     List<TAExamCourseCollegeInspectResult> findCourseDescriptiveStatisticsForSchool(Long examId, String courseCode);
+
+    /**
+     * 我的课堂考试分析-考试概况,查找全校数据
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @return
+     */
+    TAExamCourseCollegeInspectResult findTeacherInspect(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId);
 }

+ 16 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegePaperStructService.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegePaperStruct;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseCollegePaperStructService extends IService<TAExamCourseCollegePaperStruct> {
+
+}

+ 38 - 3
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegeTeacherService.java

@@ -2,9 +2,7 @@ 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.TAExamCourseTeacherResult;
-import com.qmth.teachcloud.report.business.bean.result.TeacherClassRankResult;
-import com.qmth.teachcloud.report.business.bean.result.TeacherMyClassRankResult;
+import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegeTeacher;
 import com.qmth.teachcloud.report.business.enums.OrderEnum;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
@@ -38,4 +36,41 @@ public interface TAExamCourseCollegeTeacherService extends IService<TAExamCourse
     List<TAExamCourseTeacherResult> findTeacherInfo(Long examId, String courseCode, Long collegeId);
 
     IPage<TeacherClassRankResult> listTeacherClassRank(SemesterEnum semester, Long examId, String courseCode, Integer pageNumber, Integer pageSize, String column, OrderEnum order);
+
+    /**
+     * 我的课堂考试分析-图表接口
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @return
+     */
+    SurveyTeacherViewResult teacherView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId);
+
+    /**
+     * 我的课堂考试分析-试题难度得分情况分析接口
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param collegeId
+     * @param teacherId
+     * @return
+     */
+    DimensionAnalyzeResult teacherQuestionView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long collegeId,Long teacherId);
+
+    /**
+     * 我的课堂考试分析-各难度水平题目上的作答分析接口
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param collegeId
+     * @return
+     */
+    QuestionInfoResult teacherQuestionAnswerView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long collegeId,Long teacher);
 }

+ 17 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseRecordService.java

@@ -3,7 +3,9 @@ package com.qmth.teachcloud.report.business.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.report.business.bean.result.ExamRecordResult;
 import com.qmth.teachcloud.report.business.bean.result.SurveyTeacherDistributionResult;
+import com.qmth.teachcloud.report.business.bean.result.TeachCourseResult;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseRecord;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 
 import java.util.List;
 
@@ -32,7 +34,21 @@ public interface TAExamCourseRecordService extends IService<TAExamCourseRecord>
      * @param examId
      * @param courseCode
      * @param filter
+     * @param inspectCollegeId
      * @return
      */
-    List<SurveyTeacherDistributionResult> surveyTeacherDistribution(Long examId, String courseCode, boolean filter);
+    List<SurveyTeacherDistributionResult> surveyTeacherDistribution(Long examId, String courseCode, boolean filter, Long inspectCollegeId);
+
+    /**
+     * 我的课堂考试分析-考试概况,查找我的课堂数据
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @param teacherId
+     * @return
+     */
+    List<TeachCourseResult> findTeacherInspect(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId, Long teacherId);
 }

+ 28 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegeDifficultService.java

@@ -0,0 +1,28 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.bean.result.CellResult;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegeDifficult;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 授课教师-本院难度分布和该教师在本院难度分布对比 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherCollegeDifficultService extends IService<TAExamCourseTeacherCollegeDifficult> {
+
+    /**
+     * 查找教师在各学院有效作答
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @param teacherId 教师id
+     * @param inspectCollegeId 考察学院id
+     * @return 结果
+     */
+    List<CellResult> findValidAnswerDetail(Long examId, String courseCode, Long teacherId,Long inspectCollegeId);
+}

+ 21 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegeDioService.java

@@ -0,0 +1,21 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegeDio;
+
+/**
+ * <p>
+ * 各个教师在考察学院下的各考察点得分情况表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherCollegeDioService extends IService<TAExamCourseTeacherCollegeDio> {
+    /**
+     * 根据考试编号和课程编号和‘t_a_exam_course_record_dio’表向‘t_a_exam_course_teacher_college_dio’表插入数据
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     */
+    void insertByTAExamCourseRecordDio(Long examId,String courseCode);
+}

+ 16 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegePaperStructService.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegePaperStruct;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherCollegePaperStructService extends IService<TAExamCourseTeacherCollegePaperStruct> {
+
+}

+ 16 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherPaperStructService.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherPaperStruct;
+
+/**
+ * <p>
+ * 教师下试卷结构维度分析表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+public interface TAExamCourseTeacherPaperStructService extends IService<TAExamCourseTeacherPaperStruct> {
+
+}

+ 10 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBDimensionService.java

@@ -35,4 +35,14 @@ public interface TBDimensionService extends IService<TBDimension> {
      * @return
      */
     List<CourseDimensionResult> findDimensionByTeacherInfo(Long examId, String courseCode, Long teacherId);
+
+    /**
+     * 查找某任课教师在某学院下所有考生在考察点得分情况统计
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @param teacherId 教师id
+     * @param inspectCollegeId 考察学院id
+     * @return 考察点统计信息
+     */
+    List<CourseDimensionResult> findDimensionByTeacherCollegeInfo(Long examId,String courseCode,Long teacherId,Long inspectCollegeId);
 }

+ 477 - 6
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeForReportServiceImpl.java

@@ -97,6 +97,16 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
     private TAExamCourseTeacherDioService taExamCourseTeacherDioService;
     @Resource
     private TBExamRecordService tbExamRecordService;
+    @Resource
+    private TAExamCourseTeacherCollegeDioService taExamCourseTeacherCollegeDioService;
+    @Resource
+    private TAExamCourseTeacherCollegeDifficultService taExamCourseTeacherCollegeDifficultService;
+    @Resource
+    private TAExamCourseCollegePaperStructService taExamCourseCollegePaperStructService;
+    @Resource
+    private TAExamCourseTeacherPaperStructService taExamCourseTeacherPaperStructService;
+    @Resource
+    private TAExamCourseTeacherCollegePaperStructService taExamCourseTeacherCollegePaperStructService;
 
 
     @Transactional(rollbackFor = Exception.class)
@@ -114,7 +124,6 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                     .eq(TAExamCourse::getExamId, examId)
                     .eq(TAExamCourse::getCourseCode, effectiveCourseCode));
 
-            // TODO: 2021/6/7 查询试卷信息AB卷的准确方式(目前AB卷规则视为一致)
             List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda()
                     .eq(TBPaper::getExamId, examId).eq(TBPaper::getCourseCode, effectiveCourseCode));
             if (tbPaperList.size() < 1) {
@@ -224,7 +233,6 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             // 计算标准差
             double currentStandardDeviation = MathUtil.calculateStandardDeviation(currentScoreList);
 
-            // TODO: 2021/6/7 难度系数使用标准分计算
             BigDecimal scoreRate;
             double standardAvgScore = currentDatasource.stream().collect(Collectors.summarizingDouble(e -> e.getTotalScore().doubleValue())).getAverage();
             if (standardAvgScore != 0 && totalScore.compareTo(BigDecimal.ZERO) > 0) {
@@ -245,7 +253,6 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
             /*
                 学院信息
              */
-            // TODO: 2021/6/7 考查学院数量算进去往届和缺考的吗
             List<TBExamStudent> tbExamStudentList = tbExamStudentService.list(new QueryWrapper<TBExamStudent>().lambda()
                     .eq(TBExamStudent::getExamId, examId).eq(TBExamStudent::getCourseCode, effectiveCourseCode));
 
@@ -413,7 +420,6 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                 double median = MathUtil.calculateQuantile(assignedScoreList, QuantileEnum.MEDIAN.getValue());
                 double lowerQuartile = MathUtil.calculateQuantile(assignedScoreList, QuantileEnum.LOWER_QUARTILE.getValue());
 
-                // TODO: 2021/6/7 缺考的学院信息处理
                 if (effectiveList.size() == 0) {
                     minScore = 0;
                     maxScore = 0;
@@ -606,7 +612,6 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                 // 计算每个模块在此次考试中所占分数
                 Map<String, Object> everyModuleTotalScore = this.handleEveryPointTotalScore(moduleToPaper);
 
-                // TODO: 2021/6/7 数据组装
                 // 7.计算每个考生各个考查点和考查模块得分率并更新't_a_exam_course_record_dio'表和't_a_exam_course_record_mod'表
                 List<TAExamCourseRecordDio> taExamCourseRecordDioList = new ArrayList<>();
                 List<TAExamCourseRecordMod> taExamCourseRecordModList = new ArrayList<>();
@@ -854,6 +859,22 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
         return "'t_a_exam_course_teacher_dio'表构建完成 ";
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String buildAnalyzeExamCourseTeacherCollegeDio(Long examId, String courseCode) {
+        // 可分析有效课程信息
+        List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
+        for (String effectiveCourseCode : effectiveCourseCodeList) {
+            // 删除原有数据
+            taExamCourseTeacherCollegeDioService.remove(new QueryWrapper<TAExamCourseTeacherCollegeDio>().lambda()
+                    .eq(TAExamCourseTeacherCollegeDio::getExamId,examId)
+                    .eq(TAExamCourseTeacherCollegeDio::getCourseCode,effectiveCourseCode));
+
+            taExamCourseTeacherCollegeDioService.insertByTAExamCourseRecordDio(examId, effectiveCourseCode);
+        }
+        return "'t_a_exam_course_teacher_college_dio'表构建完成 ";
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public String buildAnalyzePaperStruct(Long examId, String courseCode) {
@@ -944,6 +965,337 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
         return " 't_a_paper_struct'表构建成功 ";
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String buildAnalyzeCollegePaperStruct(Long examId, String courseCode) {
+        // 可分析有效课程信息
+        List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
+        for (String effectiveCourseCode : effectiveCourseCodeList) {
+            List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda()
+                    .eq(TBPaper::getExamId, examId).eq(TBPaper::getCourseCode, effectiveCourseCode));
+            if (tbPaperList.size() == 0) {
+                throw ExceptionResultEnum.ERROR.exception("基础试卷信息异常");
+            }
+            // 删除原有数据
+            taExamCourseCollegePaperStructService.remove(new QueryWrapper<TAExamCourseCollegePaperStruct>().lambda()
+                    .eq(TAExamCourseCollegePaperStruct::getExamId, examId)
+                    .eq(TAExamCourseCollegePaperStruct::getCourseCode, effectiveCourseCode));
+            List<TAExamCourseCollegePaperStruct> taExamCourseCollegePaperStructList = new ArrayList<>();
+            // 该课程有效试卷结构数据
+            List<ValidAnswerDetailDto> answerDetailDtoList = tbAnswerService.findValid(examId, effectiveCourseCode);
+            for (TBPaper tbPaper : tbPaperList) {
+                Long paperId = tbPaper.getId();
+                String paperType = tbPaper.getPaperType();
+
+                // 参考该试卷的考察学院id集合
+                Set<Long> inspectCollegeIdSet = answerDetailDtoList.stream()
+                        .filter(e -> paperId.equals(e.getPaperId()))
+                        .map(ValidAnswerDetailDto::getInspectCollegeId)
+                        .collect(Collectors.toSet());
+
+                List<TBPaperStruct> tbPaperStructList = tbPaperStructService.list(new QueryWrapper<TBPaperStruct>().lambda()
+                        .eq(TBPaperStruct::getPaperId, paperId));
+                if (tbPaperStructList.size() == 0) {
+                    throw ExceptionResultEnum.ERROR.exception("试卷结构数据异常");
+                }
+                for (Long inspectCollegeId : inspectCollegeIdSet) {
+                    String inspectCollegeName = sysOrgService.getById(inspectCollegeId).getName();
+                    for (TBPaperStruct paperStruct : tbPaperStructList) {
+                        String numberType = paperStruct.getNumberType();
+                        String mainNumber = paperStruct.getBigQuestionNumber();
+                        String subNumber = paperStruct.getSmallQuestionNumber();
+
+                        List<ValidAnswerDetailDto> oneQuestionAnswerDetailList = answerDetailDtoList
+                                .stream().filter(e -> paperType.equals(e.getPaperType()) &&
+                                        inspectCollegeId.equals(e.getInspectCollegeId()) &&
+                                        numberType.equals(e.getNumberType()) &&
+                                        mainNumber.equals(e.getMainNumber()) &&
+                                        subNumber.equals(e.getSubNumber())).collect(Collectors.toList()); //某学院某道小题的所有参考学生作答信息(并且按照该科目的参考学生百分等级从高到低排序了)
+                        if (oneQuestionAnswerDetailList.size() == 0){
+                            System.out.println("异常");
+                        }
+                        BigDecimal fullScore = paperStruct.getFullScore();
+                        PaperStructJudgeEnum paperStructJudgeEnum;
+                        if (oneQuestionAnswerDetailList.stream().anyMatch(e -> fullScore.compareTo(e.getScore()) != 0)){
+                            paperStructJudgeEnum = PaperStructJudgeEnum.NOT_QUITE_RIGHT;
+                        }else {
+                            paperStructJudgeEnum = PaperStructJudgeEnum.ALL_CORRECT;
+                        }
+
+                        DoubleSummaryStatistics descriptiveStatistics = oneQuestionAnswerDetailList.stream()
+                                .collect(Collectors.summarizingDouble(e -> e.getScore().doubleValue()));
+
+                        double scoreAvg = descriptiveStatistics.getAverage();
+                        BigDecimal standardScoreRate = BigDecimal.valueOf(scoreAvg).divide(fullScore, 4, BigDecimal.ROUND_HALF_UP);
+                        BigDecimal scoreRate = standardScoreRate.setScale(1, BigDecimal.ROUND_HALF_UP);
+                        String difficult = this.analyzeDifficult(examId, effectiveCourseCode, scoreRate.doubleValue());
+
+                        TAExamCourseCollegePaperStruct taExamCourseCollegePaperStruct = new TAExamCourseCollegePaperStruct();
+                        taExamCourseCollegePaperStruct.setId(SystemConstant.getDbUuid());
+                        taExamCourseCollegePaperStruct.setPaperStructId(paperStruct.getId());
+                        taExamCourseCollegePaperStruct.setExamId(examId);
+                        taExamCourseCollegePaperStruct.setSchoolId(tbExamService.getById(examId).getSchoolId());
+                        taExamCourseCollegePaperStruct.setCourseCode(effectiveCourseCode);
+                        taExamCourseCollegePaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode).getName());
+                        taExamCourseCollegePaperStruct.setPaperId(paperId);
+                        taExamCourseCollegePaperStruct.setInspectCollegeId(inspectCollegeId);
+                        taExamCourseCollegePaperStruct.setInspectCollegeName(inspectCollegeName);
+                        taExamCourseCollegePaperStruct.setPaperType(paperType);
+                        taExamCourseCollegePaperStruct.setQuestionName(paperStruct.getQuestionName());
+                        taExamCourseCollegePaperStruct.setNumberType(paperStruct.getNumberType());
+                        taExamCourseCollegePaperStruct.setBigQuestionNumber(paperStruct.getBigQuestionNumber());
+                        taExamCourseCollegePaperStruct.setSmallQuestionNumber(paperStruct.getSmallQuestionNumber());
+                        taExamCourseCollegePaperStruct.setQuestionType(paperStruct.getQuestionType());
+                        taExamCourseCollegePaperStruct.setFullScore(paperStruct.getFullScore());
+                        taExamCourseCollegePaperStruct.setScoreRules(paperStruct.getScoreRules());
+                        taExamCourseCollegePaperStruct.setRulesDesc(paperStruct.getRulesDesc());
+                        taExamCourseCollegePaperStruct.setKnowledgeDimension(paperStruct.getKnowledgeDimension());
+                        taExamCourseCollegePaperStruct.setAbilityDimension(paperStruct.getAbilityDimension());
+                        taExamCourseCollegePaperStruct.setLiteracyDimension(paperStruct.getLiteracyDimension());
+                        taExamCourseCollegePaperStruct.setStandardScoreRate(standardScoreRate);
+                        taExamCourseCollegePaperStruct.setScoreRate(scoreRate);
+                        taExamCourseCollegePaperStruct.setDifficult(difficult);
+                        taExamCourseCollegePaperStruct.setPaperStructJudge(paperStructJudgeEnum);
+                        taExamCourseCollegePaperStructList.add(taExamCourseCollegePaperStruct);
+                    }
+                }
+
+            }
+            taExamCourseCollegePaperStructService.saveBatch(taExamCourseCollegePaperStructList);
+        }
+        return "'t_a_exam_course_college_paper_struct'表构建成功 ";
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String buildAnalyzeTeacherPaperStruct(Long examId, String courseCode) {
+        // 可分析有效课程信息
+        List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
+        for (String effectiveCourseCode : effectiveCourseCodeList) {
+            List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda()
+                    .eq(TBPaper::getExamId, examId).eq(TBPaper::getCourseCode, effectiveCourseCode));
+            if (tbPaperList.size() == 0) {
+                throw ExceptionResultEnum.ERROR.exception("基础试卷信息异常");
+            }
+            // 删除原有数据
+            taExamCourseTeacherPaperStructService.remove(new QueryWrapper<TAExamCourseTeacherPaperStruct>().lambda()
+                    .eq(TAExamCourseTeacherPaperStruct::getExamId, examId)
+                    .eq(TAExamCourseTeacherPaperStruct::getCourseCode, effectiveCourseCode));
+            List<TAExamCourseTeacherPaperStruct> taExamCourseTeacherPaperStructList = new ArrayList<>();
+            // 该课程有效试卷结构数据
+            List<ValidAnswerDetailDto> answerDetailDtoList = tbAnswerService.findValid(examId, effectiveCourseCode);
+            for (TBPaper tbPaper : tbPaperList) {
+                Long paperId = tbPaper.getId();
+                String paperType = tbPaper.getPaperType();
+
+                // 参考该试卷的考察学院id集合
+                Set<Long> teacherIdSet = answerDetailDtoList.stream()
+                        .filter(e -> paperId.equals(e.getPaperId()))
+                        .map(ValidAnswerDetailDto::getTeacherId)
+                        .collect(Collectors.toSet());
+
+                List<TBPaperStruct> tbPaperStructList = tbPaperStructService.list(new QueryWrapper<TBPaperStruct>().lambda()
+                        .eq(TBPaperStruct::getPaperId, paperId));
+                if (tbPaperStructList.size() == 0) {
+                    throw ExceptionResultEnum.ERROR.exception("试卷结构数据异常");
+                }
+                for (Long teacherId : teacherIdSet) {
+                    String teacherName = sysUserService.getById(teacherId).getRealName();
+                    for (TBPaperStruct paperStruct : tbPaperStructList) {
+                        String numberType = paperStruct.getNumberType();
+                        String mainNumber = paperStruct.getBigQuestionNumber();
+                        String subNumber = paperStruct.getSmallQuestionNumber();
+
+                        List<ValidAnswerDetailDto> oneQuestionAnswerDetailList = answerDetailDtoList
+                                .stream().filter(e -> paperType.equals(e.getPaperType()) &&
+                                        teacherId.equals(e.getTeacherId()) &&
+                                        numberType.equals(e.getNumberType()) &&
+                                        mainNumber.equals(e.getMainNumber()) &&
+                                        subNumber.equals(e.getSubNumber())).collect(Collectors.toList()); //某教师某道小题的所有参考学生作答信息(并且按照该科目的参考学生百分等级从高到低排序了)
+                        if (oneQuestionAnswerDetailList.size() == 0){
+                            System.out.println("异常");
+                        }
+                        BigDecimal fullScore = paperStruct.getFullScore();
+                        PaperStructJudgeEnum paperStructJudgeEnum;
+                        if (oneQuestionAnswerDetailList.stream().anyMatch(e -> fullScore.compareTo(e.getScore()) != 0)){
+                            paperStructJudgeEnum = PaperStructJudgeEnum.NOT_QUITE_RIGHT;
+                        }else {
+                            paperStructJudgeEnum = PaperStructJudgeEnum.ALL_CORRECT;
+                        }
+
+                        DoubleSummaryStatistics descriptiveStatistics = oneQuestionAnswerDetailList.stream()
+                                .collect(Collectors.summarizingDouble(e -> e.getScore().doubleValue()));
+
+                        double scoreAvg = descriptiveStatistics.getAverage();
+                        BigDecimal standardScoreRate = BigDecimal.valueOf(scoreAvg).divide(fullScore, 4, BigDecimal.ROUND_HALF_UP);
+                        BigDecimal scoreRate = standardScoreRate.setScale(1, BigDecimal.ROUND_HALF_UP);
+                        String difficult = this.analyzeDifficult(examId, effectiveCourseCode, scoreRate.doubleValue());
+
+                        TAExamCourseTeacherPaperStruct taExamCourseTeacherPaperStruct = new TAExamCourseTeacherPaperStruct();
+                        taExamCourseTeacherPaperStruct.setId(SystemConstant.getDbUuid());
+                        taExamCourseTeacherPaperStruct.setPaperStructId(paperStruct.getId());
+                        taExamCourseTeacherPaperStruct.setExamId(examId);
+                        taExamCourseTeacherPaperStruct.setSchoolId(tbExamService.getById(examId).getSchoolId());
+                        taExamCourseTeacherPaperStruct.setCourseCode(effectiveCourseCode);
+                        taExamCourseTeacherPaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode).getName());
+                        taExamCourseTeacherPaperStruct.setPaperId(paperId);
+                        taExamCourseTeacherPaperStruct.setTeacherId(teacherId);
+                        taExamCourseTeacherPaperStruct.setTeacherName(teacherName);
+                        taExamCourseTeacherPaperStruct.setPaperType(paperType);
+                        taExamCourseTeacherPaperStruct.setQuestionName(paperStruct.getQuestionName());
+                        taExamCourseTeacherPaperStruct.setNumberType(paperStruct.getNumberType());
+                        taExamCourseTeacherPaperStruct.setBigQuestionNumber(paperStruct.getBigQuestionNumber());
+                        taExamCourseTeacherPaperStruct.setSmallQuestionNumber(paperStruct.getSmallQuestionNumber());
+                        taExamCourseTeacherPaperStruct.setQuestionType(paperStruct.getQuestionType());
+                        taExamCourseTeacherPaperStruct.setFullScore(paperStruct.getFullScore());
+                        taExamCourseTeacherPaperStruct.setScoreRules(paperStruct.getScoreRules());
+                        taExamCourseTeacherPaperStruct.setRulesDesc(paperStruct.getRulesDesc());
+                        taExamCourseTeacherPaperStruct.setKnowledgeDimension(paperStruct.getKnowledgeDimension());
+                        taExamCourseTeacherPaperStruct.setAbilityDimension(paperStruct.getAbilityDimension());
+                        taExamCourseTeacherPaperStruct.setLiteracyDimension(paperStruct.getLiteracyDimension());
+                        taExamCourseTeacherPaperStruct.setStandardScoreRate(standardScoreRate);
+                        taExamCourseTeacherPaperStruct.setScoreRate(scoreRate);
+                        taExamCourseTeacherPaperStruct.setDifficult(difficult);
+                        taExamCourseTeacherPaperStruct.setPaperStructJudge(paperStructJudgeEnum);
+                        taExamCourseTeacherPaperStructList.add(taExamCourseTeacherPaperStruct);
+                    }
+                }
+
+            }
+            taExamCourseTeacherPaperStructService.saveBatch(taExamCourseTeacherPaperStructList);
+        }
+        return "'t_a_exam_course_teacher_paper_struct'表构建成功 ";
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String buildAnalyzeTeacherCollegePaperStruct(Long examId, String courseCode) {
+        // 可分析有效课程信息
+        List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
+        for (String effectiveCourseCode : effectiveCourseCodeList) {
+            List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda()
+                    .eq(TBPaper::getExamId, examId).eq(TBPaper::getCourseCode, effectiveCourseCode));
+            if (tbPaperList.size() == 0) {
+                throw ExceptionResultEnum.ERROR.exception("基础试卷信息异常");
+            }
+            // 删除原有数据
+            taExamCourseTeacherCollegePaperStructService.remove(new QueryWrapper<TAExamCourseTeacherCollegePaperStruct>().lambda()
+                    .eq(TAExamCourseTeacherCollegePaperStruct::getExamId, examId)
+                    .eq(TAExamCourseTeacherCollegePaperStruct::getCourseCode, effectiveCourseCode));
+            List<TAExamCourseTeacherCollegePaperStruct> tAExamCourseTeacherCollegePaperStructList = new ArrayList<>();
+            // 该课程有效试卷结构数据
+            List<ValidAnswerDetailDto> answerDetailDtoList = tbAnswerService.findValid(examId, effectiveCourseCode);
+            for (TBPaper tbPaper : tbPaperList) {
+                Long paperId = tbPaper.getId();
+                String paperType = tbPaper.getPaperType();
+
+                // 参考该试卷的考察学院id集合
+                Set<Long> teacherIdSet = answerDetailDtoList.stream()
+                        .filter(e -> paperId.equals(e.getPaperId()))
+                        .map(ValidAnswerDetailDto::getTeacherId)
+                        .collect(Collectors.toSet());
+
+                List<TBPaperStruct> tbPaperStructList = tbPaperStructService.list(new QueryWrapper<TBPaperStruct>().lambda()
+                        .eq(TBPaperStruct::getPaperId, paperId));
+                if (tbPaperStructList.size() == 0) {
+                    throw ExceptionResultEnum.ERROR.exception("试卷结构数据异常");
+                }
+                /**
+                 * 试卷下
+                 */
+                for (Long teacherId : teacherIdSet) {
+                    /**
+                     * 教师下
+                     */
+                    String teacherName = sysUserService.getById(teacherId).getRealName();
+
+                    // 参考该试卷的考察学院id集合
+                    Set<Long> inspectCollegeIdSet = answerDetailDtoList.stream()
+                            .filter(e -> paperId.equals(e.getPaperId()))
+                            .filter(e -> teacherId.equals(e.getTeacherId()))
+                            .map(ValidAnswerDetailDto::getInspectCollegeId)
+                            .collect(Collectors.toSet());
+
+                    for (Long inspectCollegeId : inspectCollegeIdSet) {
+                        /**
+                         * 学院下
+                         */
+                        String inspectCollegeName = sysOrgService.getById(inspectCollegeId).getName();
+
+                        for (TBPaperStruct paperStruct : tbPaperStructList) {
+                            /**
+                             * 试题下
+                             */
+                            String numberType = paperStruct.getNumberType();
+                            String mainNumber = paperStruct.getBigQuestionNumber();
+                            String subNumber = paperStruct.getSmallQuestionNumber();
+
+                            List<ValidAnswerDetailDto> oneQuestionAnswerDetailList = answerDetailDtoList
+                                    .stream().filter(e -> paperType.equals(e.getPaperType()) &&
+                                            teacherId.equals(e.getTeacherId()) &&
+                                            inspectCollegeId.equals(e.getInspectCollegeId()) &&
+                                            numberType.equals(e.getNumberType()) &&
+                                            mainNumber.equals(e.getMainNumber()) &&
+                                            subNumber.equals(e.getSubNumber())).collect(Collectors.toList()); //某教师某道小题的所有参考学生作答信息(并且按照该科目的参考学生百分等级从高到低排序了)
+                            if (oneQuestionAnswerDetailList.size() == 0){
+                                System.out.println("异常");
+                            }
+                            BigDecimal fullScore = paperStruct.getFullScore();
+                            PaperStructJudgeEnum paperStructJudgeEnum;
+                            if (oneQuestionAnswerDetailList.stream().anyMatch(e -> fullScore.compareTo(e.getScore()) != 0)){
+                                paperStructJudgeEnum = PaperStructJudgeEnum.NOT_QUITE_RIGHT;
+                            }else {
+                                paperStructJudgeEnum = PaperStructJudgeEnum.ALL_CORRECT;
+                            }
+
+                            DoubleSummaryStatistics descriptiveStatistics = oneQuestionAnswerDetailList.stream()
+                                    .collect(Collectors.summarizingDouble(e -> e.getScore().doubleValue()));
+
+                            double scoreAvg = descriptiveStatistics.getAverage();
+                            BigDecimal standardScoreRate = BigDecimal.valueOf(scoreAvg).divide(fullScore, 4, BigDecimal.ROUND_HALF_UP);
+                            BigDecimal scoreRate = standardScoreRate.setScale(1, BigDecimal.ROUND_HALF_UP);
+                            String difficult = this.analyzeDifficult(examId, effectiveCourseCode, scoreRate.doubleValue());
+
+                            TAExamCourseTeacherCollegePaperStruct taExamCourseTeacherCollegePaperStruct = new TAExamCourseTeacherCollegePaperStruct();
+                            taExamCourseTeacherCollegePaperStruct.setId(SystemConstant.getDbUuid());
+                            taExamCourseTeacherCollegePaperStruct.setPaperStructId(paperStruct.getId());
+                            taExamCourseTeacherCollegePaperStruct.setExamId(examId);
+                            taExamCourseTeacherCollegePaperStruct.setSchoolId(tbExamService.getById(examId).getSchoolId());
+                            taExamCourseTeacherCollegePaperStruct.setCourseCode(effectiveCourseCode);
+                            taExamCourseTeacherCollegePaperStruct.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode).getName());
+                            taExamCourseTeacherCollegePaperStruct.setPaperId(paperId);
+                            taExamCourseTeacherCollegePaperStruct.setTeacherId(teacherId);
+                            taExamCourseTeacherCollegePaperStruct.setTeacherName(teacherName);
+                            taExamCourseTeacherCollegePaperStruct.setInspectCollegeId(inspectCollegeId);
+                            taExamCourseTeacherCollegePaperStruct.setInspectCollegeName(inspectCollegeName);
+                            taExamCourseTeacherCollegePaperStruct.setPaperType(paperType);
+                            taExamCourseTeacherCollegePaperStruct.setQuestionName(paperStruct.getQuestionName());
+                            taExamCourseTeacherCollegePaperStruct.setNumberType(paperStruct.getNumberType());
+                            taExamCourseTeacherCollegePaperStruct.setBigQuestionNumber(paperStruct.getBigQuestionNumber());
+                            taExamCourseTeacherCollegePaperStruct.setSmallQuestionNumber(paperStruct.getSmallQuestionNumber());
+                            taExamCourseTeacherCollegePaperStruct.setQuestionType(paperStruct.getQuestionType());
+                            taExamCourseTeacherCollegePaperStruct.setFullScore(paperStruct.getFullScore());
+                            taExamCourseTeacherCollegePaperStruct.setScoreRules(paperStruct.getScoreRules());
+                            taExamCourseTeacherCollegePaperStruct.setRulesDesc(paperStruct.getRulesDesc());
+                            taExamCourseTeacherCollegePaperStruct.setKnowledgeDimension(paperStruct.getKnowledgeDimension());
+                            taExamCourseTeacherCollegePaperStruct.setAbilityDimension(paperStruct.getAbilityDimension());
+                            taExamCourseTeacherCollegePaperStruct.setLiteracyDimension(paperStruct.getLiteracyDimension());
+                            taExamCourseTeacherCollegePaperStruct.setStandardScoreRate(standardScoreRate);
+                            taExamCourseTeacherCollegePaperStruct.setScoreRate(scoreRate);
+                            taExamCourseTeacherCollegePaperStruct.setDifficult(difficult);
+                            taExamCourseTeacherCollegePaperStruct.setPaperStructJudge(paperStructJudgeEnum);
+                            tAExamCourseTeacherCollegePaperStructList.add(taExamCourseTeacherCollegePaperStruct);
+                        }
+
+                    }
+                }
+
+            }
+            taExamCourseTeacherCollegePaperStructService.saveBatch(tAExamCourseTeacherCollegePaperStructList);
+        }
+        return "'t_a_exam_course_teacher_college_paper_struct'表构建成功 ";
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public String buildExamPaperDifficult(Long examId, String courseCode) {
@@ -1125,6 +1477,126 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
         return "'t_a_exam_course_teacher_difficult' 表构建完成";
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId, String courseCode) {
+        // 可分析有效课程信息
+        List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
+
+        for (String effectiveCourseCode : effectiveCourseCodeList) {
+            taExamCourseTeacherCollegeDifficultService.remove(new QueryWrapper<TAExamCourseTeacherCollegeDifficult>().lambda()
+                    .eq(TAExamCourseTeacherCollegeDifficult::getExamId, examId)
+                    .eq(TAExamCourseTeacherCollegeDifficult::getCourseCode, effectiveCourseCode));
+
+            List<TAExamCourseTeacherCollegeDifficult> taExamCourseTeacherCollegeDifficultList = new ArrayList<>();
+
+            List<TBCommonLevelConfig> configLevelDatasource = tbCommonLevelConfigService.list(new QueryWrapper<TBCommonLevelConfig>().lambda()
+                    .eq(TBCommonLevelConfig::getExamId, examId)
+                    .eq(TBCommonLevelConfig::getCourseCode, effectiveCourseCode)
+                    .eq(TBCommonLevelConfig::getLevelType, "难度等级"));// 该科目试题难度情况数据源
+
+            List<TAPaperStruct> questionDatasource = taPaperStructService.list(new QueryWrapper<TAPaperStruct>().lambda()
+                    .eq(TAPaperStruct::getExamId, examId).eq(TAPaperStruct::getCourseCode, effectiveCourseCode));// 该科目试题情况数据源
+
+            LinkedList<AnswerDetailBean> answerDetailDatasource = tbAnswerService.findValidAnswerDetailWithPap(examId, effectiveCourseCode);
+            Set<Long> paperTypeList = questionDatasource.stream().map(TAPaperStruct::getPaperId).collect(Collectors.toSet());
+
+            for (Long paperId : paperTypeList) {
+                for (TBCommonLevelConfig levelTemp : configLevelDatasource) {
+                    String interpret = levelTemp.getInterpret();
+                    String scope = levelTemp.getScope();
+
+                    List<TAPaperStruct> questionList = questionDatasource.stream()
+                            .filter(e -> paperId.equals(e.getPaperId()) && interpret.equals(e.getDifficult()))
+                            .collect(Collectors.toList()); // 题目信息
+
+                    // 学院id集合
+                    List<Long> collegeIdList = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
+                            .eq(TAExamCourseRecord::getExamId, examId)
+                            .eq(TAExamCourseRecord::getCourseCode, effectiveCourseCode)
+                            .eq(TAExamCourseRecord::getPaperId, paperId)
+                            .eq(TAExamCourseRecord::getAbsent, false)
+                            .eq(TAExamCourseRecord::getStudentCurrent, true))
+                            .stream()
+                            .map(TAExamCourseRecord::getInspectCollegeId).distinct()
+                            .collect(Collectors.toList());
+
+                    // 学校作答集合
+                    List<AnswerDetailBean> answerDetailForSch = answerDetailDatasource.stream()
+                            .filter(e -> paperId.equals(e.getPaperId()) && interpret.equals(e.getDifficult()))
+                            .collect(Collectors.toList());
+
+                    double schAvgScoreRate = 0;
+                    if (answerDetailForSch.size() > 0) {
+                        schAvgScoreRate = answerDetailForSch.stream().collect(Collectors.summarizingDouble(e -> e.getAnswerScore().doubleValue())).getSum() / answerDetailForSch.stream().collect(Collectors.summarizingDouble(e -> e.getFullScore().doubleValue())).getSum();
+                    }
+
+                    for (Long collegeId : collegeIdList) {
+                        String collegeName = sysOrgService.getById(collegeId).getName();
+                        // 考察学院作答集合
+                        List<AnswerDetailBean> answerDetailForCol = answerDetailForSch.stream()
+                                .filter(e -> collegeId.equals(e.getCollegeId())).collect(Collectors.toList());
+
+                        double colAvgScoreRate = 0;
+                        if (answerDetailForCol.size() > 0){
+                            colAvgScoreRate = answerDetailForCol.stream().collect(Collectors.summarizingDouble(e -> e.getAnswerScore().doubleValue())).getSum() / answerDetailForCol.stream().collect(Collectors.summarizingDouble(e -> e.getFullScore().doubleValue())).getSum();
+                        }
+
+                        // 教师id集合
+                        List<Long> teacherIdList = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
+                                .eq(TAExamCourseRecord::getExamId, examId)
+                                .eq(TAExamCourseRecord::getCourseCode, effectiveCourseCode)
+                                .eq(TAExamCourseRecord::getPaperId, paperId)
+                                .eq(TAExamCourseRecord::getInspectCollegeId,collegeId)
+                                .eq(TAExamCourseRecord::getAbsent, false)
+                                .eq(TAExamCourseRecord::getStudentCurrent, true))
+                                .stream()
+                                .map(TAExamCourseRecord::getTeacherId).distinct()
+                                .collect(Collectors.toList());
+
+                        for (Long teacherId : teacherIdList) {
+                            List<AnswerDetailBean> answerDetailForColTea = answerDetailForCol.stream()
+                                    .filter(e -> teacherId.equals(e.getTeacherId())).collect(Collectors.toList());
+
+                            double teaColAvgScoreRate = 0;
+                            if (answerDetailForColTea.size() > 0) {
+                                teaColAvgScoreRate = answerDetailForColTea.stream().collect(Collectors.summarizingDouble(e -> e.getAnswerScore().doubleValue())).getSum() / answerDetailForColTea.stream().collect(Collectors.summarizingDouble(e -> e.getFullScore().doubleValue())).getSum();
+                            }
+
+                            // 得分率保留2位小数处理
+                            Integer count = questionList.size();
+                            TAExamCourseTeacherCollegeDifficult taExamCourseTeacherCollegeDifficult = new TAExamCourseTeacherCollegeDifficult();
+                            taExamCourseTeacherCollegeDifficult.setId(SystemConstant.getDbUuid());
+                            taExamCourseTeacherCollegeDifficult.setExamId(examId);
+                            taExamCourseTeacherCollegeDifficult.setPaperId(paperId);
+                            taExamCourseTeacherCollegeDifficult.setPaperType(tbPaperService.getById(paperId).getPaperType());
+                            taExamCourseTeacherCollegeDifficult.setCourseCode(effectiveCourseCode);
+                            taExamCourseTeacherCollegeDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode).getName());
+                            taExamCourseTeacherCollegeDifficult.setTeacherId(teacherId);
+                            taExamCourseTeacherCollegeDifficult.setTeacherName(sysUserService.getById(teacherId).getRealName());
+                            taExamCourseTeacherCollegeDifficult.setInspectCollegeId(collegeId);
+                            taExamCourseTeacherCollegeDifficult.setInspectCollegeName(collegeName);
+                            taExamCourseTeacherCollegeDifficult.setSchoolId(tbExamService.getById(examId).getSchoolId());
+                            taExamCourseTeacherCollegeDifficult.setInterpret(interpret);
+                            taExamCourseTeacherCollegeDifficult.setCount(count);
+                            taExamCourseTeacherCollegeDifficult.setScope(scope);
+                            taExamCourseTeacherCollegeDifficult.setColAvgScoreRate(BigDecimal.valueOf(colAvgScoreRate));
+                            taExamCourseTeacherCollegeDifficult.setTeaColAvgScoreRate(BigDecimal.valueOf(teaColAvgScoreRate));
+
+                            taExamCourseTeacherCollegeDifficultList.add(taExamCourseTeacherCollegeDifficult);
+                        }
+                    }
+
+
+                }
+            }
+
+            taExamCourseTeacherCollegeDifficultService.saveBatch(taExamCourseTeacherCollegeDifficultList);
+        }
+
+        return "'t_a_exam_course_teacher_college_difficult' 表构建完成";
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public String buildAnalyzeExamTotal(Long examId) {
@@ -1137,7 +1609,6 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
                 .eq(TAExamCourseRecord::getExamId, examId));
 
         //考查学院
-        // TODO: 2021/6/8 是否计算只有缺考的学院 是否计算只有往届的学院
         List<Long> inspectCollegeInfo = taExamCourseRecordList.stream()
                 .map(TAExamCourseRecord::getInspectCollegeId).distinct().collect(Collectors.toList());
         // 考查学院数量

+ 57 - 19
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java

@@ -7,14 +7,8 @@ import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.util.JacksonUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.report.business.bean.result.*;
-import com.qmth.teachcloud.report.business.entity.TAExamCourse;
-import com.qmth.teachcloud.report.business.entity.TBDimension;
-import com.qmth.teachcloud.report.business.entity.TBExamCourse;
-import com.qmth.teachcloud.report.business.entity.TBPaper;
-import com.qmth.teachcloud.report.business.enums.GradeScopeEnum;
-import com.qmth.teachcloud.report.business.enums.PaperStructJudgeEnum;
-import com.qmth.teachcloud.report.business.enums.PiecewiseScopeEnum;
-import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
+import com.qmth.teachcloud.report.business.entity.*;
+import com.qmth.teachcloud.report.business.enums.*;
 import com.qmth.teachcloud.report.business.service.*;
 import com.qmth.teachcloud.report.business.utils.AnalyzeScopeUtil;
 import com.qmth.teachcloud.report.business.utils.MathUtil;
@@ -74,6 +68,12 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     @Resource
     TBExamCourseService tbExamCourseService;
 
+    @Resource
+    TBExamService tbExamService;
+
+    @Resource
+    TAExamCourseTeacherCollegeDifficultService taExamCourseTeacherCollegeDifficultService;
+
     /**
      * 学院学科报表查询科目信息
      *
@@ -243,7 +243,7 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     @Override
     public List<SurveyTeacherGradeDistributionResult> surveyTeacherDistribution(Long examId, String courseCode, Long collegeId, boolean filter) {
         List<SurveyTeacherGradeDistributionResult> surveyTeacherGradeDistributionResultList = new ArrayList<>();
-        List<SurveyTeacherDistributionResult> surveyTeacherDistributionResultList = taExamCourseRecordService.surveyTeacherDistribution(examId, courseCode, filter);
+        List<SurveyTeacherDistributionResult> surveyTeacherDistributionResultList = taExamCourseRecordService.surveyTeacherDistribution(examId, courseCode, filter, collegeId);
         if (Objects.isNull(surveyTeacherDistributionResultList) && surveyTeacherDistributionResultList.size() > 0) {
             return null;
         }
@@ -337,16 +337,21 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     public DimensionAnalyzeResult findDimensionInfo(Long examId, String courseCode, Long collegeId, Long teacherId) {
         //查找维度
         List<CourseDimensionResult> dimensionInfoDatasource = null;
-        if (Objects.isNull(teacherId) || Objects.equals(teacherId, "")) {
+        if (SystemConstant.longNotNull(collegeId) && !SystemConstant.longNotNull(teacherId)) {
+            // 有学院id无教师id -> 开课院长看各考察学院数据
             dimensionInfoDatasource = tbDimensionService.findDimensionInfo(examId, courseCode, collegeId);
-        } else {
+        } else if (SystemConstant.longNotNull(teacherId) && !SystemConstant.longNotNull(collegeId)) {
+            // 有教师id无学院id -> 开课院长看各授课教师数据
             dimensionInfoDatasource = tbDimensionService.findDimensionByTeacherInfo(examId, courseCode, teacherId);
+        } else if (SystemConstant.longNotNull(teacherId) && SystemConstant.longNotNull(collegeId)) {
+            // 既有教师id又有学院id -> 任课教师看某个学院下自己的数据
+            dimensionInfoDatasource = tbDimensionService.findDimensionByTeacherCollegeInfo(examId, courseCode, teacherId, collegeId);
         }
 //        if (dimensionInfoDatasource.size() < 1) {
 //            throw ExceptionResultEnum.DATA_ERROR.exception();
 //        }
         List<ModuleDimensionResult> dimensionAnalyzeList = new ArrayList<>();
-        Set<String> moduleSet = dimensionInfoDatasource.stream().map(e -> e.getModule()).collect(Collectors.toSet()); // 考查模块集合
+        Set<String> moduleSet = dimensionInfoDatasource.stream().map(CourseDimensionResult::getModule).collect(Collectors.toSet()); // 考查模块集合
         for (String module : moduleSet) {
             List<CourseDimensionResult> dimensionInfoList = dimensionInfoDatasource
                     .stream().filter(e -> module.equals(e.getModule())).collect(Collectors.toList());
@@ -384,10 +389,15 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     public QuestionInfoResult findSituationOfQuestions(Long examId, String courseCode, Long collegeId, Long teacherId) {
         //查找答题记录
         List<CellResult> answerDetailDatasource = null;
-        if (Objects.isNull(teacherId) || Objects.equals(teacherId, "")) {
+        if (SystemConstant.longNotNull(collegeId) && !SystemConstant.longNotNull(teacherId)) {
+            // 有学院id无教师id -> 开课院长看各考察学院数据
             answerDetailDatasource = taExamCourseDifficultService.findValidAnswerDetail(examId, courseCode, collegeId);
-        } else {
+        } else if (SystemConstant.longNotNull(teacherId) && !SystemConstant.longNotNull(collegeId)) {
+            // 有教师id无学院id -> 开课院长看各授课教师数据
             answerDetailDatasource = taExamCourseTeacherDifficultService.findValidAnswerDetail(examId, courseCode, teacherId);
+        } else if (SystemConstant.longNotNull(teacherId) && SystemConstant.longNotNull(collegeId)) {
+            // 既有教师id又有学院id -> 任课教师看某个学院下自己的数据
+            answerDetailDatasource = taExamCourseTeacherCollegeDifficultService.findValidAnswerDetail(examId, courseCode, teacherId, collegeId);
         }
         Set<String> paperTypeList = answerDetailDatasource.stream().map(e -> e.getPaperType()).collect(Collectors.toSet());
         List<PaperTypeResult> questionInfoList = new ArrayList<>();
@@ -436,14 +446,16 @@ public class ReportCommonServiceImpl implements ReportCommonService {
         Set<String> paperTypeSet = questionDatasource.stream().map(TBPaperStructResult::getPaperType).collect(Collectors.toSet());
         List<QuestionResult> questionList = new ArrayList<>();
         for (String paperType : paperTypeSet) {
-            List<TBPaperStructResult> errorCellList = questionDatasource.stream()
-                    .filter(e -> paperType.equals(e.getPaperType()) && PaperStructJudgeEnum.NOT_QUITE_RIGHT.equals(e.getPaperStructJudge())).collect(Collectors.toList());
+            // 考题
+            List<TBPaperStructResult> cellList = questionDatasource.stream()
+                    .filter(e -> paperType.equals(e.getPaperType())).collect(Collectors.toList());
 
-            for (TBPaperStructResult cell : errorCellList) {
+            for (TBPaperStructResult cell : cellList) {
                 cell.setPaperType(null);
             }
             Set<String> knowledgeDimensionSet = new HashSet<>(), abilityDimensionSet = new HashSet<>();
-
+            // 错题
+            List<TBPaperStructResult> errorCellList = cellList.stream().filter(e -> PaperStructJudgeEnum.NOT_QUITE_RIGHT.equals(e.getPaperStructJudge())).collect(Collectors.toList());
             // 获取考察点集合
             for (TBPaperStructResult cell : errorCellList) {
                 String knowledgeDimension = cell.getKnowledgeDimension();
@@ -498,7 +510,7 @@ public class ReportCommonServiceImpl implements ReportCommonService {
                 }
                 abilityDimensionList.add(new DimensionInfoResult(dimensionCode, dimensionName));
             }
-            questionList.add(new QuestionResult(paperType, errorCellList, dimensionList, abilityDimensionList));
+            questionList.add(new QuestionResult(paperType, cellList, dimensionList, abilityDimensionList));
         }
         return new QuestionListResult(questionList);
     }
@@ -566,4 +578,30 @@ public class ReportCommonServiceImpl implements ReportCommonService {
         response.setHeader("Access-Control-Allow-Origin", "*");
         response.sendRedirect(redirectURL);
     }
+
+    /**
+     * 获取开课课程考试课程总览
+     *
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @return
+     */
+    @Override
+    public TeachCourseSurveyResult getTeachCourseSurveyInfo(SemesterEnum semester, Long examId, String courseCode) {
+        TBExam tbExam = tbExamService.getById(examId);
+        TAExamCourse taExamCourse = taExamCourseService.getOne(new QueryWrapper<TAExamCourse>().lambda().eq(TAExamCourse::getExamId, examId).eq(TAExamCourse::getCourseCode, courseCode));
+        TeachCourseSurveyResult teachCourseSurveyResult = new TeachCourseSurveyResult();
+        teachCourseSurveyResult.setExamTime(tbExam.getExamTime());
+        teachCourseSurveyResult.setCourseCode(taExamCourse.getCourseCode());
+        teachCourseSurveyResult.setCourseName(taExamCourse.getCourseName());
+        teachCourseSurveyResult.setFullScore(taExamCourse.getTotalScore());
+        teachCourseSurveyResult.setRealityCount(taExamCourse.getRealityCount());
+        teachCourseSurveyResult.setInspectCollegeCount(taExamCourse.getInspectCollegeCount());
+        teachCourseSurveyResult.setAbsentCount(taExamCourse.getAbsentCount());
+        teachCourseSurveyResult.setCoefficient(taExamCourse.getCoefficient());
+        teachCourseSurveyResult.setTeachCollegeName(taExamCourse.getTeachCollegeName());
+        teachCourseSurveyResult.setInspectCollegeNames(taExamCourse.getInspectCollegeNames());
+        return teachCourseSurveyResult;
+    }
 }

+ 17 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegeInspectServiceImpl.java

@@ -3,12 +3,14 @@ package com.qmth.teachcloud.report.business.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.report.business.bean.result.TAExamCourseCollegeInspectResult;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegeInspect;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.mapper.TAExamCourseCollegeInspectMapper;
 import com.qmth.teachcloud.report.business.service.TAExamCourseCollegeInspectService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -48,4 +50,19 @@ public class TAExamCourseCollegeInspectServiceImpl extends ServiceImpl<TAExamCou
     public List<TAExamCourseCollegeInspectResult> findCourseDescriptiveStatisticsForSchool(Long examId, String courseCode) {
         return taExamCourseCollegeInspectMapper.findCourseDescriptiveStatisticsForSchool(examId, courseCode);
     }
+
+    /**
+     * 我的课堂考试分析-考试概况,查找全校数据
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @return
+     */
+    @Override
+    public TAExamCourseCollegeInspectResult findTeacherInspect(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId) {
+        return taExamCourseCollegeInspectMapper.findTeacherInspect(schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, inspectCollegeId);
+    }
 }

+ 20 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegePaperStructServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegePaperStruct;
+import com.qmth.teachcloud.report.business.mapper.TAExamCourseCollegePaperStructMapper;
+import com.qmth.teachcloud.report.business.service.TAExamCourseCollegePaperStructService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@Service
+public class TAExamCourseCollegePaperStructServiceImpl extends ServiceImpl<TAExamCourseCollegePaperStructMapper, TAExamCourseCollegePaperStruct> implements TAExamCourseCollegePaperStructService {
+
+}

+ 89 - 5
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegeTeacherServiceImpl.java

@@ -3,17 +3,20 @@ 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.google.gson.Gson;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.SysOrgService;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import com.qmth.teachcloud.report.business.bean.result.TAExamCourseTeacherResult;
-import com.qmth.teachcloud.report.business.bean.result.TeacherClassRankResult;
-import com.qmth.teachcloud.report.business.bean.result.TeacherMyClassRankResult;
+import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseCollegeTeacher;
 import com.qmth.teachcloud.report.business.enums.OrderEnum;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.mapper.TAExamCourseCollegeTeacherMapper;
+import com.qmth.teachcloud.report.business.service.ReportCommonService;
+import com.qmth.teachcloud.report.business.service.TAExamCourseCollegeInspectService;
 import com.qmth.teachcloud.report.business.service.TAExamCourseCollegeTeacherService;
+import com.qmth.teachcloud.report.business.service.TAExamCourseRecordService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -38,6 +41,15 @@ public class TAExamCourseCollegeTeacherServiceImpl extends ServiceImpl<TAExamCou
     @Resource
     SysOrgService sysOrgService;
 
+    @Resource
+    ReportCommonService reportCommonService;
+
+    @Resource
+    TAExamCourseCollegeInspectService taExamCourseCollegeInspectService;
+
+    @Resource
+    TAExamCourseRecordService taExamCourseRecordService;
+
     @Override
     public IPage<TeacherClassRankResult> listClassRank(SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId, Integer pageNumber, Integer pageSize, String column, OrderEnum order) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -56,8 +68,7 @@ public class TAExamCourseCollegeTeacherServiceImpl extends ServiceImpl<TAExamCou
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Page<TeacherMyClassRankResult> page = new Page<>(pageNumber, pageSize);
-        IPage<TeacherMyClassRankResult> listPage = taExamCourseCollegeTeacherMapper.listMyClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, sysUser.getId(), courseCode, inspectCollegeId, column, Objects.nonNull(order) ? order.name() : null);
-        return listPage;
+        return taExamCourseCollegeTeacherMapper.listMyClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, sysUser.getId(), courseCode, inspectCollegeId, column, Objects.nonNull(order) ? order.name() : null);
     }
 
     @Override
@@ -92,4 +103,77 @@ public class TAExamCourseCollegeTeacherServiceImpl extends ServiceImpl<TAExamCou
         Page<TeacherClassRankResult> page = new Page<>(pageNumber, pageSize);
         return taExamCourseCollegeTeacherMapper.listTeacherClassRank(page, schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, column, Objects.nonNull(order) ? order.name() : null);
     }
+
+    /**
+     * 我的课堂考试分析-图表接口
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @return
+     */
+    @Override
+    public SurveyTeacherViewResult teacherView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        if (Objects.isNull(sysUser)) {
+            throw ExceptionResultEnum.NOT_LOGIN.exception();
+        }
+        // 考试概况
+        TAExamCourseCollegeInspectResult taExamCourseCollegeInspectResult = taExamCourseCollegeInspectService.findTeacherInspect(sysUser.getSchoolId(), semester, examId, courseCode, inspectCollegeId);
+        TeachCourseResult teachCourseResultFinal = null;
+        if (Objects.nonNull(taExamCourseCollegeInspectResult)) {
+            teachCourseResultFinal = new TeachCourseResult(taExamCourseCollegeInspectResult);
+        } else {
+            teachCourseResultFinal = new TeachCourseResult();
+        }
+        List<TeachCourseResult> teachCourseResultList = taExamCourseRecordService.findTeacherInspect(sysUser.getSchoolId(), semester, examId, courseCode, inspectCollegeId, sysUser.getId());
+        if (Objects.nonNull(teachCourseResultList) && teachCourseResultList.size() > 0) {
+            for (TeachCourseResult t : teachCourseResultList) {
+                if (t.getAbsent()) {
+                    teachCourseResultFinal.setCourseRealityCount(t.getAbsentCount());
+                } else if (!t.getAbsent()) {
+                    teachCourseResultFinal.setCourseAbsentCount(t.getAbsentCount());
+                }
+            }
+        }
+        //取总体和应届平均分
+        SurveyTeacherExamCourseResult surveyTeacherExamCourseResult = reportCommonService.findAvgScore(schoolId, courseCode, examId, false);
+        //学院学科报表科目描述
+        List<SurveyTeacherGradeDistributionResult> surveyTeacherGradeDistributionResultList = reportCommonService.surveyTeacherDistribution(examId, courseCode, inspectCollegeId, false);
+        //查找题目信息
+        QuestionListResult questionListResult = reportCommonService.findQuestionInfo(examId, courseCode, inspectCollegeId);
+        return new SurveyTeacherViewResult(surveyTeacherGradeDistributionResultList, teachCourseResultFinal, questionListResult, surveyTeacherExamCourseResult);
+    }
+
+    /**
+     * 我的课堂考试分析-试题难度得分情况分析接口
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param collegeId
+     * @return
+     */
+    @Override
+    public DimensionAnalyzeResult teacherQuestionView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long collegeId, Long teacherId) {
+        return reportCommonService.findDimensionInfo(examId, courseCode, collegeId, teacherId);
+    }
+
+    /**
+     * 我的课堂考试分析-各难度水平题目上的作答分析接口
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param collegeId
+     * @return
+     */
+    @Override
+    public QuestionInfoResult teacherQuestionAnswerView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long collegeId, Long teacherId) {
+        return reportCommonService.findSituationOfQuestions(examId, courseCode, collegeId, teacherId);
+    }
 }

+ 23 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseRecordServiceImpl.java

@@ -3,13 +3,16 @@ package com.qmth.teachcloud.report.business.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.report.business.bean.result.ExamRecordResult;
 import com.qmth.teachcloud.report.business.bean.result.SurveyTeacherDistributionResult;
+import com.qmth.teachcloud.report.business.bean.result.TeachCourseResult;
 import com.qmth.teachcloud.report.business.entity.TAExamCourseRecord;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.mapper.TAExamCourseRecordMapper;
 import com.qmth.teachcloud.report.business.service.TAExamCourseRecordService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -42,10 +45,28 @@ public class TAExamCourseRecordServiceImpl extends ServiceImpl<TAExamCourseRecor
      *
      * @param examId
      * @param courseCode
+     * @param filter
+     * @param inspectCollegeId
      * @return
      */
     @Override
-    public List<SurveyTeacherDistributionResult> surveyTeacherDistribution(Long examId, String courseCode, boolean filter) {
-        return taExamCourseRecordMapper.surveyTeacherDistribution(examId, courseCode, filter);
+    public List<SurveyTeacherDistributionResult> surveyTeacherDistribution(Long examId, String courseCode, boolean filter, Long inspectCollegeId) {
+        return taExamCourseRecordMapper.surveyTeacherDistribution(examId, courseCode, filter, inspectCollegeId);
+    }
+
+    /**
+     * 我的课堂考试分析-考试概况,查找我的课堂数据
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @param teacherId
+     * @return
+     */
+    @Override
+    public List<TeachCourseResult> findTeacherInspect(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long inspectCollegeId, Long teacherId) {
+        return taExamCourseRecordMapper.findTeacherInspect(schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, inspectCollegeId, teacherId);
     }
 }

+ 1 - 28
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseServiceImpl.java

@@ -181,7 +181,7 @@ public class TAExamCourseServiceImpl extends ServiceImpl<TAExamCourseMapper, TAE
     @Cacheable(value = SystemConstant.SURVEY_TEACHER_VIEW_REPORT, key = "#schoolId + '-' + #semester + '-' + #examId + '-' + #courseCode + '-' + #collegeId")
     public SurveyTeacherViewResult surveyTeacherView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long collegeId) {
         // 考试概况
-        TeachCourseSurveyResult teachCourseSurveyResult = this.getTeachCourseSurveyInfo(semester, examId, courseCode);
+        TeachCourseSurveyResult teachCourseSurveyResult = reportCommonService.getTeachCourseSurveyInfo(semester, examId, courseCode);
 
         //取总体和应届平均分
         SurveyTeacherExamCourseResult surveyTeacherExamCourseResult = reportCommonService.findAvgScore(schoolId, courseCode, examId, false);
@@ -373,31 +373,4 @@ public class TAExamCourseServiceImpl extends ServiceImpl<TAExamCourseMapper, TAE
         List<Collection<?>> collectionList = Arrays.asList(teachCollegeResultIPage.getRecords(), gradeDistributeFinalResult.getPaperGrades(), gradeDistributeFinalResult.getGrades(), gradeDistributeFinalResult.getCurrentAssignedGrades(), teacherClassRankResultIPage.getRecords());
         ExcelUtil.excelExportBatchSheet("课程分析", sheetList, classList, collectionList, ServletUtil.getResponse());
     }
-
-
-    /**
-     * 获取开课课程考试课程总览
-     *
-     * @param semester   学期
-     * @param examId     考试id
-     * @param courseCode 课程编号
-     * @return 结果
-     */
-    private TeachCourseSurveyResult getTeachCourseSurveyInfo(SemesterEnum semester, Long examId, String courseCode) {
-        TBExam tbExam = tbExamService.getById(examId);
-
-        TAExamCourse taExamCourse = this.getOne(new QueryWrapper<TAExamCourse>().lambda().eq(TAExamCourse::getExamId, examId).eq(TAExamCourse::getCourseCode, courseCode));
-        TeachCourseSurveyResult teachCourseSurveyResult = new TeachCourseSurveyResult();
-        teachCourseSurveyResult.setExamTime(tbExam.getExamTime());
-        teachCourseSurveyResult.setCourseCode(taExamCourse.getCourseCode());
-        teachCourseSurveyResult.setCourseName(taExamCourse.getCourseName());
-        teachCourseSurveyResult.setFullScore(taExamCourse.getTotalScore());
-        teachCourseSurveyResult.setRealityCount(taExamCourse.getRealityCount());
-        teachCourseSurveyResult.setInspectCollegeCount(taExamCourse.getInspectCollegeCount());
-        teachCourseSurveyResult.setAbsentCount(taExamCourse.getAbsentCount());
-        teachCourseSurveyResult.setCoefficient(taExamCourse.getCoefficient());
-        teachCourseSurveyResult.setTeachCollegeName(taExamCourse.getTeachCollegeName());
-        teachCourseSurveyResult.setInspectCollegeNames(taExamCourse.getInspectCollegeNames());
-        return teachCourseSurveyResult;
-    }
 }

+ 31 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegeDifficultServiceImpl.java

@@ -0,0 +1,31 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.report.business.bean.result.CellResult;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegeDifficult;
+import com.qmth.teachcloud.report.business.mapper.TAExamCourseTeacherCollegeDifficultMapper;
+import com.qmth.teachcloud.report.business.service.TAExamCourseTeacherCollegeDifficultService;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 授课教师-本院难度分布和该教师在本院难度分布对比 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@Service
+public class TAExamCourseTeacherCollegeDifficultServiceImpl extends ServiceImpl<TAExamCourseTeacherCollegeDifficultMapper, TAExamCourseTeacherCollegeDifficult> implements TAExamCourseTeacherCollegeDifficultService {
+    @Resource
+    private TAExamCourseTeacherCollegeDifficultMapper taExamCourseTeacherCollegeDifficultMapper;
+
+    @Override
+    public List<CellResult> findValidAnswerDetail(Long examId, String courseCode, Long teacherId, Long inspectCollegeId) {
+        return taExamCourseTeacherCollegeDifficultMapper.findValidAnswerDetail(examId, courseCode, teacherId, inspectCollegeId);
+    }
+}

+ 46 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegeDioServiceImpl.java

@@ -0,0 +1,46 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegeDio;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherDio;
+import com.qmth.teachcloud.report.business.mapper.TAExamCourseTeacherCollegeDioMapper;
+import com.qmth.teachcloud.report.business.mapper.TAExamCourseTeacherDioMapper;
+import com.qmth.teachcloud.report.business.service.TAExamCourseTeacherCollegeDioService;
+import com.qmth.teachcloud.report.business.service.TBExamService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 各个教师在考察学院下的各考察点得分情况表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@Service
+public class TAExamCourseTeacherCollegeDioServiceImpl extends ServiceImpl<TAExamCourseTeacherCollegeDioMapper, TAExamCourseTeacherCollegeDio> implements TAExamCourseTeacherCollegeDioService {
+    @Resource
+    private TAExamCourseTeacherCollegeDioMapper taExamCourseTeacherCollegeDioMapper;
+    @Resource
+    private TBExamService tbExamService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void insertByTAExamCourseRecordDio(Long examId, String courseCode) {
+        if (examId == 0 || courseCode == null || courseCode.length() == 0) {
+            throw ExceptionResultEnum.ERROR.exception("参数异常");
+        }
+        List<TAExamCourseTeacherCollegeDio> taExamCourseTeacherCollegeDioList = taExamCourseTeacherCollegeDioMapper.findByTAExamCourseRecordDio(examId, courseCode);
+        for (TAExamCourseTeacherCollegeDio taExamCourseTeacherCollegeDio : taExamCourseTeacherCollegeDioList) {
+            taExamCourseTeacherCollegeDio.setSchoolId(tbExamService.getById(taExamCourseTeacherCollegeDio.getExamId()).getSchoolId());
+            taExamCourseTeacherCollegeDio.setId(SystemConstant.getDbUuid());
+        }
+        this.saveBatch(taExamCourseTeacherCollegeDioList);
+    }
+}

+ 20 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegePaperStructServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegePaperStruct;
+import com.qmth.teachcloud.report.business.mapper.TAExamCourseTeacherCollegePaperStructMapper;
+import com.qmth.teachcloud.report.business.service.TAExamCourseTeacherCollegePaperStructService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 教师考察学院下试卷结构维度分析表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@Service
+public class TAExamCourseTeacherCollegePaperStructServiceImpl extends ServiceImpl<TAExamCourseTeacherCollegePaperStructMapper, TAExamCourseTeacherCollegePaperStruct> implements TAExamCourseTeacherCollegePaperStructService {
+
+}

+ 20 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherPaperStructServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherPaperStruct;
+import com.qmth.teachcloud.report.business.mapper.TAExamCourseTeacherPaperStructMapper;
+import com.qmth.teachcloud.report.business.service.TAExamCourseTeacherPaperStructService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 教师下试卷结构维度分析表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-07-20
+ */
+@Service
+public class TAExamCourseTeacherPaperStructServiceImpl extends ServiceImpl<TAExamCourseTeacherPaperStructMapper, TAExamCourseTeacherPaperStruct> implements TAExamCourseTeacherPaperStructService {
+
+}

+ 5 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBDimensionServiceImpl.java

@@ -49,4 +49,9 @@ public class TBDimensionServiceImpl extends ServiceImpl<TBDimensionMapper, TBDim
     public List<CourseDimensionResult> findDimensionByTeacherInfo(Long examId, String courseCode, Long teacherId) {
         return tbDimensionMapper.findDimensionByTeacherInfo(examId, courseCode, teacherId);
     }
+
+    @Override
+    public List<CourseDimensionResult> findDimensionByTeacherCollegeInfo(Long examId, String courseCode, Long teacherId, Long inspectCollegeId) {
+        return tbDimensionMapper.findDimensionByTeacherCollegeInfo(examId, courseCode, teacherId, inspectCollegeId);
+    }
 }

+ 33 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseCollegeInspectMapper.xml

@@ -63,4 +63,37 @@
             </if>
         </where>
     </select>
+
+    <select id="findTeacherInspect" resultType="com.qmth.teachcloud.report.business.bean.result.TAExamCourseCollegeInspectResult">
+        select
+            tbe.exam_time as examTime,
+            taecci.course_code as courseCode,
+            taecci.course_name as courseName,
+            tbp.total_score as fullScore,
+            taecci.reality_count as realityCount,
+            taecci.absent_count as absentCount
+        from
+            t_a_exam_course_college_inspect taecci
+        join t_b_exam tbe
+            on tbe.id = taecci.exam_id
+        join t_b_paper tbp
+            on tbp.exam_id = tbe.id and tbp.course_code = taecci.course_code
+            <where>
+                <if test="examId != null and examId != ''">
+                    and taecci.exam_id = #{examId}
+                </if>
+                <if test="schoolId != null and schoolId != ''">
+                    and tbe.school_id = #{schoolId}
+                </if>
+                <if test="semester != null and semester != ''">
+                    and tbe.semester = #{semester}
+                </if>
+                <if test="courseCode != null and courseCode != ''">
+                    and taecci.course_code = #{courseCode}
+                </if>
+                <if test="inspectCollegeId != null and inspectCollegeId != ''">
+                    and taecci.college_id = #{inspectCollegeId}
+                </if>
+            </where>
+    </select>
 </mapper>

+ 5 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseCollegePaperStructMapper.xml

@@ -0,0 +1,5 @@
+<?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.TAExamCourseCollegePaperStructMapper">
+
+</mapper>

+ 6 - 1
teachcloud-report-business/src/main/resources/mapper/TAExamCourseCollegeTeacherMapper.xml

@@ -60,7 +60,8 @@
             a.teach_college_name teachCollegeName,
             round(a.avg_score_assign, 1) avgScore,
             a.teacher_count teacherCount,
-            a.teacher_rank `rank`
+            a.teacher_rank `rank`,
+            a.inspect_college_id as inspectCollegeId
         FROM
             t_a_exam_course_college_teacher a
                 LEFT JOIN
@@ -227,4 +228,8 @@
             </choose>
         </if>
     </select>
+
+    <select id="teacherView" resultType="com.qmth.teachcloud.report.business.bean.result.SurveyTeacherViewResult">
+
+    </select>
 </mapper>

+ 38 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseRecordMapper.xml

@@ -151,6 +151,44 @@
             <if test="filter != null and filter == true">
                 and tbec.publish_status = 'PUBLISH'
             </if>
+            <if test="inspectCollegeId != null and inspectCollegeId != ''">
+                AND taecr.inspect_college_id = #{inspectCollegeId}
+            </if>
+        </where>
+    </select>
+
+    <select id="findTeacherInspect" resultType="com.qmth.teachcloud.report.business.bean.result.TeachCourseResult">
+        select
+            count(taecr.absent) as absentCount,
+            taecr.absent
+        from
+            t_a_exam_course_record taecr
+        join t_b_exam tbe
+            on
+            tbe.id = taecr.exam_id
+        <where>
+            <if test="inspectCollegeId != null and inspectCollegeId != ''">
+                AND taecr.inspect_college_id = #{inspectCollegeId}
+            </if>
+            <if test="examId != null and examId != ''">
+                AND taecr.exam_id = #{examId}
+            </if>
+            <if test="semester != null and semester != ''">
+                AND tbe.semester = #{semester}
+            </if>
+            <if test="schoolId != null and schoolId != ''">
+                AND tbe.school_id = #{schoolId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                AND taecr.course_code = #{courseCode}
+            </if>
+            <if test="teacherId != null and teacherId != ''">
+                AND taecr.teacher_id = #{teacherId}
+            </if>
         </where>
+        group by
+            taecr.absent
+        order by
+            taecr.absent
     </select>
 </mapper>

+ 29 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegeDifficultMapper.xml

@@ -0,0 +1,29 @@
+<?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.TAExamCourseTeacherCollegeDifficultMapper">
+
+    <select id="findValidAnswerDetail" resultType="com.qmth.teachcloud.report.business.bean.result.CellResult">
+        SELECT
+            tik.paper_type AS paperType,
+            tik.`scope`,
+            tik.count,
+            tik.interpret,
+            round(tik.col_avg_score_rate * 100,2) as schAvgScoreRate,
+            round(tik.tea_col_avg_score_rate * 100,2) as myAvgScoreRate
+        from t_a_exam_course_teacher_college_difficult tik
+        <where>
+            <if test="teacherId != null and teacherId > 0">
+                and tik.teacher_id = #{teacherId}
+            </if>
+            <if test="inspectCollegeId != null and inspectCollegeId > 0">
+                and tik.inspect_college_id = #{inspectCollegeId}
+            </if>
+            <if test="examId != null and examId > 0">
+                and tik.exam_id = #{examId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and tik.course_code = #{courseCode}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 32 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegeDioMapper.xml

@@ -0,0 +1,32 @@
+<?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.TAExamCourseTeacherCollegeDioMapper">
+
+    <select id="findByTAExamCourseRecordDio"
+            resultType="com.qmth.teachcloud.report.business.entity.TAExamCourseTeacherCollegeDio">
+        SELECT
+            exam_id AS examId,
+            course_code AS courseCode,
+            MAX(course_name) AS courseName,
+            teacher_id AS teacherId,
+            MAX(teacher_name) AS teacherName,
+            inspect_college_id AS inspectCollegeId,
+            MAX(inspect_college_name) AS inspectCollegeName,
+            dimension_type AS dimensionType,
+            dimension_code AS dimensionCode,
+            AVG(student_score) AS avgScore,
+            AVG(score_rate) AS scoreRate
+        FROM
+            t_a_exam_course_record_dio
+        <where>
+            <if test="examId != null and examId > 0">
+                and exam_id = #{examId}
+            </if>
+            <if test="courseCode != null and courseCode.length > 0">
+                and course_code = #{courseCode}
+            </if>
+        </where>
+        GROUP BY exam_id , course_code , teacher_id , inspect_college_id , dimension_type , dimension_code
+        ORDER BY exam_id DESC , course_code , teacher_id , inspect_college_id , dimension_type , dimension_code;
+    </select>
+</mapper>

+ 5 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegePaperStructMapper.xml

@@ -0,0 +1,5 @@
+<?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.TAExamCourseTeacherCollegePaperStructMapper">
+
+</mapper>

+ 5 - 0
teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherPaperStructMapper.xml

@@ -0,0 +1,5 @@
+<?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.TAExamCourseTeacherPaperStructMapper">
+
+</mapper>

+ 2 - 0
teachcloud-report-business/src/main/resources/mapper/TBAnswerMapper.xml

@@ -38,6 +38,8 @@
             answer.sub_number AS subNumber,
             answer.score,
             record.id AS taExamRecordId,
+            record.inspect_college_id AS inspectCollegeId,
+            record.teacher_id AS teacherId,
             record.percent_grade AS percentGrade,
             record.paper_id AS paperId,
             record.paper_type AS paperType

+ 68 - 0
teachcloud-report-business/src/main/resources/mapper/TBDimensionMapper.xml

@@ -115,4 +115,72 @@
             </if>
         </where>
     </select>
+
+    <select id="findDimensionByTeacherCollegeInfo"
+            resultType="com.qmth.teachcloud.report.business.bean.result.CourseDimensionResult">
+        SELECT
+            tmp.exam_id AS examId,
+            (SELECT
+                 tbe.exam_code
+             FROM
+                 t_b_exam tbe
+             WHERE
+                 tbe.id = tmp.exam_id) AS examCode,
+            tmp.course_code AS courseCode,
+            tmp.dimension_type AS module,
+            code_primary AS dimensionCode,
+            name_primary AS dimensionName,
+            interpretation,
+            total_count AS totalCount,
+            ROUND(CONVERT( papDio.score_rate * 100 , DECIMAL (10 , 4 )),
+                  2) AS schScoreRate,
+            ROUND(CONVERT( myDio.score_rate * 100 , DECIMAL (10 , 4 )),
+                  2) AS colScoreRate,
+            myDio.teacher_name AS teacherName,
+            ROUND(myDio.score_rate, 1) AS degree
+        FROM
+            (SELECT
+                 exam_id,
+                 course_code,
+                 dimension_type,
+                 code_primary,
+                 name_primary,
+                 interpretation
+             FROM
+                 t_b_dimension
+             GROUP BY exam_id , course_code , dimension_type , code_primary , name_primary , interpretation) tmp
+                INNER JOIN
+            (SELECT
+                 exam_id,
+                 course_code,
+                 dimension_type,
+                 dimension_code,
+                 AVG(score_rate) AS score_rate,
+                 AVG(total_count) AS total_count
+             FROM
+                 t_a_exam_course_dio
+             GROUP BY exam_id , course_code , dimension_type , dimension_code) papDio ON tmp.code_primary = papDio.dimension_code
+                AND tmp.dimension_type = papDio.dimension_type
+                AND tmp.exam_id = papDio.exam_id
+                AND tmp.course_code = papDio.course_code
+                INNER JOIN
+            t_a_exam_course_teacher_college_dio myDio ON tmp.code_primary = myDio.dimension_code
+                AND tmp.dimension_type = myDio.dimension_type
+                AND papDio.exam_id = myDio.exam_id
+                AND papDio.course_code = myDio.course_code
+        <where>
+            <if test="examId != null and examId != ''">
+                and papDio.exam_id = #{examId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and papDio.course_code = #{courseCode}
+            </if>
+            <if test="teacherId != null and teacherId > 0">
+                and myDio.teacher_id = #{teacherId}
+            </if>
+            <if test="inspectCollegeId != null and inspectCollegeId > 0">
+                and myDio.inspect_college_id = #{inspectCollegeId}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 1 - 0
teachcloud-report-business/src/main/resources/mapper/TBPaperStructMapper.xml

@@ -5,6 +5,7 @@
     <select id="findQuestionInfo" resultType="com.qmth.teachcloud.report.business.bean.result.TBPaperStructResult">
         SELECT
             paper_type AS paperType,
+            question_name AS questionName,
             big_question_number AS mainNumber,
             small_question_number AS subNumber,
             full_score AS fullScore,

+ 50 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TAExamCourseCollegeTeacherController.java

@@ -2,8 +2,13 @@ package com.qmth.teachcloud.report.api;
 
 
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 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;
@@ -17,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Objects;
+
 /**
  * <p>
  * 参考课程学院下授课教师维度分析表 前端控制器
@@ -62,4 +69,47 @@ public class TAExamCourseCollegeTeacherController {
             @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseCollegeTeacherService.listMyClassRank(semester, examId, courseCode, inspectCollegeId, pageNumber, pageSize, column, order));
     }
+
+    @ApiOperation(value = "我的课堂考试分析-图表接口")
+    @RequestMapping(value = "/view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = SurveyTeacherViewResult.class)})
+    public Result teacherView(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+                              @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
+                              @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
+                              @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                              @ApiParam(value = "考查学院id", required = true) @RequestParam String inspectCollegeId) {
+        return ResultUtil.ok(taExamCourseCollegeTeacherService.teacherView(Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, Objects.nonNull(inspectCollegeId) ? SystemConstant.convertIdToLong(inspectCollegeId) : null));
+    }
+
+    @ApiOperation(value = "我的课堂考试分析-试题难度得分情况分析接口")
+    @RequestMapping(value = "/question_view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = SurveyTeacherViewResult.class)})
+    public Result teacherQuestionView(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+                                      @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
+                                      @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
+                                      @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                                      @ApiParam(value = "学院id", required = false) @RequestParam(required = false) String collegeId) {
+        // 道理上讲必须传学院id 但如果老师想看自己的整体情况,不传学院id得到的就是整体情况
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        if (Objects.isNull(sysUser)) {
+            throw ExceptionResultEnum.NOT_LOGIN.exception();
+        }
+        return ResultUtil.ok(taExamCourseCollegeTeacherService.teacherQuestionView(Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, SystemConstant.convertIdToLong(collegeId),sysUser.getId()));
+    }
+
+    @ApiOperation(value = "我的课堂考试分析-各难度水平题目上的作答分析接口")
+    @RequestMapping(value = "/question_answer_view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = SurveyTeacherViewResult.class)})
+    public Result teacherQuestionAnswerView(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+                                            @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
+                                            @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
+                                            @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                                            @ApiParam(value = "学院id", required = false) @RequestParam(required = false) String collegeId) {
+        // 道理上讲必须传学院id 但如果老师想看自己的整体情况,不传学院id得到的就是整体情况
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        if (Objects.isNull(sysUser)) {
+            throw ExceptionResultEnum.NOT_LOGIN.exception();
+        }
+        return ResultUtil.ok(taExamCourseCollegeTeacherService.teacherQuestionAnswerView(Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, SystemConstant.convertIdToLong(collegeId),sysUser.getId()));
+    }
 }

+ 1 - 0
teachcloud-report/src/main/resources/application-dev.properties

@@ -14,6 +14,7 @@ db.host=192.168.10.136
 #db.host=localhost
 db.port=3306
 db.name=teachcloud-report-617
+#db.name=teachcloud-report
 db.username=root
 db.password=Qmth87863577!
 #db.password=123456789

+ 35 - 0
teachcloud-report/src/test/java/com/qmth/teachcloud/report/AnalyzeForStudentServiceTest.java

@@ -125,4 +125,39 @@ public class AnalyzeForStudentServiceTest {
         String courseCode = "1013";
         System.out.println(analyzeForReportService.updateCoursePublishStatus(examId,courseCode, PublishStatusEnum.WILL_COMPUTE));
     }
+
+    @Test
+    public void buildAnalyzeExamCourseTeacherCollegeDio(){
+        Long examId = 2L;
+        String courseCode = null;
+        System.out.println(analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDio(examId,courseCode));
+    }
+
+    @Test
+    public void buildAnalyzeExamCourseTeacherCollegeDifficult(){
+        Long examId = 2L;
+        String courseCode = null;
+        System.out.println(analyzeForReportService.buildAnalyzeExamCourseTeacherCollegeDifficult(examId,courseCode));
+    }
+
+    @Test
+    public void buildAnalyzeCollegePaperStruct(){
+        Long examId = 1L;
+        String courseCode = null;
+        System.out.println(analyzeForReportService.buildAnalyzeCollegePaperStruct(examId,courseCode));
+    }
+
+    @Test
+    public void buildAnalyzeTeacherPaperStruct(){
+        Long examId = 2L;
+        String courseCode = null;
+        System.out.println(analyzeForReportService.buildAnalyzeTeacherPaperStruct(examId,courseCode));
+    }
+
+    @Test
+    public void buildAnalyzeTeacherCollegePaperStruct(){
+        Long examId = 2L;
+        String courseCode = null;
+        System.out.println(analyzeForReportService.buildAnalyzeTeacherCollegePaperStruct(examId,courseCode));
+    }
 }