浏览代码

教研分析最新代码合并

wangliang 3 年之前
父节点
当前提交
3ff0d8d018
共有 49 个文件被更改,包括 4620 次插入0 次删除
  1. 72 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/AssignCheckDto.java
  2. 72 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/BasicCourseChangeDto.java
  3. 73 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/SysOrgChangeDto.java
  4. 73 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/SysUserChangeDto.java
  5. 62 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/TeacherDto.java
  6. 43 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/CollegeCombineParams.java
  7. 63 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeachCourseResult.java
  8. 350 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseCollegePaperStruct.java
  9. 237 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegeDifficult.java
  10. 200 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegeDio.java
  11. 376 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherCollegePaperStruct.java
  12. 350 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAExamCourseTeacherPaperStruct.java
  13. 100 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TBTeacher.java
  14. 22 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/enums/PaperStructJudgeEnum.java
  15. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegePaperStructMapper.java
  16. 29 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegeDifficultMapper.java
  17. 25 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegeDioMapper.java
  18. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherCollegePaperStructMapper.java
  19. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseTeacherPaperStructMapper.java
  20. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBTeacherMapper.java
  21. 131 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ChangNamesService.java
  22. 64 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/CourseUnitOperateService.java
  23. 145 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/InsteadOrgService.java
  24. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegePaperStructService.java
  25. 28 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegeDifficultService.java
  26. 21 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegeDioService.java
  27. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherCollegePaperStructService.java
  28. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseTeacherPaperStructService.java
  29. 43 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBTeacherService.java
  30. 554 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ChangNamesServiceImpl.java
  31. 318 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/CourseUnitOperateServiceImpl.java
  32. 325 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/InsteadOrgServiceImpl.java
  33. 20 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegePaperStructServiceImpl.java
  34. 31 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegeDifficultServiceImpl.java
  35. 46 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegeDioServiceImpl.java
  36. 20 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherCollegePaperStructServiceImpl.java
  37. 20 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseTeacherPaperStructServiceImpl.java
  38. 166 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBTeacherServiceImpl.java
  39. 21 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/service/ComplicatedCalculateAsyncService.java
  40. 27 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/service/impl/ComplicatedCalculateAsyncServiceImpl.java
  41. 125 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/utils/AesUtil.java
  42. 87 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/utils/EncrypAES.java
  43. 91 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/utils/RandomNameUtil.java
  44. 5 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseCollegePaperStructMapper.xml
  45. 29 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegeDifficultMapper.xml
  46. 32 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegeDioMapper.xml
  47. 5 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherCollegePaperStructMapper.xml
  48. 5 0
      teachcloud-report-business/src/main/resources/mapper/TAExamCourseTeacherPaperStructMapper.xml
  49. 5 0
      teachcloud-report-business/src/main/resources/mapper/TBTeacherMapper.xml

+ 72 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/AssignCheckDto.java

@@ -0,0 +1,72 @@
+package com.qmth.teachcloud.report.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 赋分表校验
+ * @Author: CaoZixuan
+ * @Date: 2022-01-03
+ */
+public class AssignCheckDto {
+    @ExcelNote(value = "考试id")
+    @NotNull
+    private String examId;
+
+    @ExcelNote(value = "科目编号")
+    @NotNull
+    private String paperCodeS;
+
+    @ExcelNote(value = "学号")
+    @NotNull
+    private String studentCode;
+
+    @ExcelNote(value = "姓名")
+    @NotNull
+    private String studentName;
+
+    @ExcelNote(value = "赋分")
+    @NotNull
+    private String assignScore;
+
+    public String getExamId() {
+        return examId;
+    }
+
+    public void setExamId(String examId) {
+        this.examId = examId;
+    }
+
+    public String getPaperCodeS() {
+        return paperCodeS;
+    }
+
+    public void setPaperCodeS(String paperCodeS) {
+        this.paperCodeS = paperCodeS;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getAssignScore() {
+        return assignScore;
+    }
+
+    public void setAssignScore(String assignScore) {
+        this.assignScore = assignScore;
+    }
+}

+ 72 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/BasicCourseChangeDto.java

@@ -0,0 +1,72 @@
+package com.qmth.teachcloud.report.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 基础课程变更导入类
+ * @Author: CaoZixuan
+ * @Date: 2022-02-25
+ */
+public class BasicCourseChangeDto implements Serializable {
+    @ExcelNote(value = "id")
+    @NotNull
+    private String id;
+
+    @ExcelNote(value = "学校id")
+    @NotNull
+    private String schoolId;
+
+    @ExcelNote(value = "课程编号")
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "课程名称")
+    @NotNull
+    private String historicName;
+
+    @ExcelNote(value = "变更后的名称")
+    private String newName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(String schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getHistoricName() {
+        return historicName;
+    }
+
+    public void setHistoricName(String historicName) {
+        this.historicName = historicName;
+    }
+
+    public String getNewName() {
+        return newName;
+    }
+
+    public void setNewName(String newName) {
+        this.newName = newName;
+    }
+}

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

@@ -0,0 +1,73 @@
+package com.qmth.teachcloud.report.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 系统机构改名类
+ * @Author: CaoZixuan
+ * @Date: 2022-02-25
+ */
+public class SysOrgChangeDto implements Serializable {
+    @ExcelNote(value = "id")
+    @NotNull
+    private String id;
+
+    @ExcelNote(value = "学校id")
+    @NotNull
+    private String schoolId;
+
+    @ExcelNote(value = "机构编号")
+    @NotNull
+    private String orgCode;
+
+    @ExcelNote(value = "机构名称")
+    @NotNull
+    private String historicName;
+
+    @ExcelNote(value = "变更后的名称")
+    @NotNull
+    private String newName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(String schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getOrgCode() {
+        return orgCode;
+    }
+
+    public void setOrgCode(String orgCode) {
+        this.orgCode = orgCode;
+    }
+
+    public String getHistoricName() {
+        return historicName;
+    }
+
+    public void setHistoricName(String historicName) {
+        this.historicName = historicName;
+    }
+
+    public String getNewName() {
+        return newName;
+    }
+
+    public void setNewName(String newName) {
+        this.newName = newName;
+    }
+}

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

@@ -0,0 +1,73 @@
+package com.qmth.teachcloud.report.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 基础用户变更导入类
+ * @Author: CaoZixuan
+ * @Date: 2022-02-25
+ */
+public class SysUserChangeDto implements Serializable {
+    @ExcelNote(value = "id")
+    @NotNull
+    private String id;
+
+    @ExcelNote(value = "学校id")
+    @NotNull
+    private String schoolId;
+
+    @ExcelNote(value = "真实姓名")
+    @NotNull
+    private String historicName;
+
+    @ExcelNote(value = "变更后的名称")
+    @NotNull
+    private String newName;
+
+    @ExcelNote(value = "角色")
+    @NotNull
+    private String roleName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(String schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getHistoricName() {
+        return historicName;
+    }
+
+    public void setHistoricName(String historicName) {
+        this.historicName = historicName;
+    }
+
+    public String getNewName() {
+        return newName;
+    }
+
+    public void setNewName(String newName) {
+        this.newName = newName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}

+ 62 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/TeacherDto.java

@@ -0,0 +1,62 @@
+package com.qmth.teachcloud.report.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 基础教师导入
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+public class TeacherDto implements Serializable {
+
+    @ExcelNote(value = "教师编号")
+    @NotNull
+    private String teacherCode;
+
+    @ExcelNote(value = "教师名称")
+    @NotNull
+    private String teacherName;
+
+    @ExcelNote(value = "机构名称")
+    @NotNull
+    private String orgName;
+
+    @ExcelNote(value = "角色名称")
+    @NotNull
+    private String roleName;
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}

+ 43 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/CollegeCombineParams.java

@@ -0,0 +1,43 @@
+package com.qmth.teachcloud.report.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 学院替换参数(用某个学院替换另一个学院 eg。用开课学院公共物理教学替换掉考察学院)
+ * @Author: CaoZixuan
+ * @Date: 2022-04-01
+ */
+public class CollegeCombineParams {
+    @ApiModelProperty("考察学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "请选择考察学院id")
+    @Range(min = 1L, message = "请选择考察学院id")
+    private Long inspectCollegeId;
+
+    @ApiModelProperty("开课学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "请选择开课学院id")
+    @Range(min = 1L, message = "请选择开课学院id")
+    private Long teachCollegeId;
+
+    public Long getInspectCollegeId() {
+        return inspectCollegeId;
+    }
+
+    public void setInspectCollegeId(Long inspectCollegeId) {
+        this.inspectCollegeId = inspectCollegeId;
+    }
+
+    public Long getTeachCollegeId() {
+        return teachCollegeId;
+    }
+
+    public void setTeachCollegeId(Long teachCollegeId) {
+        this.teachCollegeId = teachCollegeId;
+    }
+}

+ 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;
+    }
+}

+ 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;
+    }
+}

+ 100 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TBTeacher.java

@@ -0,0 +1,100 @@
+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.enums.RoleTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 教师映射表
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+@ApiModel(value = "TBTeacher对象", description = "基础教师表")
+public class TBTeacher 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 = "org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "教师名称")
+    @TableField(value = "teacher_name")
+    private String teacherName;
+
+    @ApiModelProperty(value = "教师编号(学校下唯一)")
+    @TableField(value = "teacher_code")
+    private String teacherCode;
+
+    @ApiModelProperty(value = "角色类别")
+    @TableField(value = "role_type")
+    private RoleTypeEnum roleType;
+
+    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 getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public RoleTypeEnum getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(RoleTypeEnum roleType) {
+        this.roleType = roleType;
+    }
+}

+ 22 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/enums/PaperStructJudgeEnum.java

@@ -0,0 +1,22 @@
+package com.qmth.teachcloud.report.business.enums;
+
+/**
+ * @Description: 试卷结构每道题目正确(全对),错误枚举
+ * @Author: CaoZixuan
+ * @Date: 2021-07-19
+ */
+public enum PaperStructJudgeEnum {
+    ALL_CORRECT("全对"),
+    NOT_QUITE_RIGHT("不完全正确的"),
+    ;
+
+    PaperStructJudgeEnum(String title) {
+        this.title = title;
+    }
+
+    private final String title;
+
+    public String getTitle() {
+        return title;
+    }
+}

+ 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> {
+
+}

+ 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> {
+
+}

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

@@ -0,0 +1,13 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.TBTeacher;
+
+/**
+ * @Description: 基础教师mapper
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+public interface TBTeacherMapper extends BaseMapper<TBTeacher> {
+
+}

+ 131 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ChangNamesService.java

@@ -0,0 +1,131 @@
+package com.qmth.teachcloud.report.business.service;
+
+import org.springframework.scheduling.annotation.Async;
+
+/**
+ * @Description: 变更名称服务类()
+ * @Author: CaoZixuan
+ * @Date: 2022-03-10
+ */
+public interface ChangNamesService {
+
+    /**
+     * 更新基础表数据
+     */
+    @Async("analyzeThreadPool")
+    void changeBasicTables();
+
+    /**
+     * 更新表't_a_exam_course'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourse() throws InterruptedException;
+
+    /**
+     * 更新表 't_a_exam_course_clazz'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseClazz();
+
+    /**
+     * 更新表 't_a_exam_course_college_inspect'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseCollegeInspect();
+
+    /**
+     * 更新表 't_a_exam_course_college_inspect_dio'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseCollegeInspectDio();
+
+    /**
+     * 更新表 't_a_exam_course_college_paper_struct'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseCollegePaperStruct();
+
+    /**
+     * 更新表 't_a_exam_course_college_teacher'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseCollegeTeacher();
+
+    /**
+     * 更新表 't_a_exam_course_difficult'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseDifficultService();
+
+    /**
+     * 更新表 't_a_exam_course_dio'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseDio();
+
+    /**
+     * 更新表 't_a_exam_course_record_dio'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseRecordDio();
+
+    /**
+     * 更新表 't_a_exam_course_record_mod'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseRecordMod();
+
+    /**
+     * 更新表 't_a_exam_course_teacher'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseTeacher();
+
+    /**
+     * 更新表 't_a_exam_course_teacher_college_difficult'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseTeacherCollegeDifficult();
+
+    /**
+     * 更新表 't_a_exam_course_teacher_college_dio'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseTeacherCollegeDio();
+
+    /**
+     * 更新表 't_a_exam_course_teacher_college_paper_struct'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseTeacherCollegePaperStruct();
+
+    /**
+     * 更新表 't_a_exam_course_teacher_difficult'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseTeacherDifficult();
+
+    /**
+     * 更新表 't_a_exam_course_teacher_dio'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseTeacherDio();
+
+    /**
+     * 更新表 't_a_exam_course_teacher_paper_struct'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamCourseTeacherPaperStruct();
+
+    /**
+     * 更新表 't_a_exam_total'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAExamTotal();
+
+    /**
+     * 更新表 't_a_paper_struct'
+     */
+    @Async("analyzeThreadPool")
+    void changeTableTAPaperStruct();
+}

+ 64 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/CourseUnitOperateService.java

@@ -0,0 +1,64 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.qmth.teachcloud.report.business.bean.params.CollegeCombineParams;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * @Description: 课程单元操作服务类(课程删除、以课程为单位的改名操作)
+ * @Author: CaoZixuan
+ * @Date: 2022-02-25
+ */
+public interface CourseUnitOperateService {
+
+    /**
+     * 演示用变更基础课程名
+     *
+     * @param file     文件
+     * @param schoolId 学校id(检测器)
+     * @return 结果
+     */
+    String changeBasicCourse(MultipartFile file, Long schoolId) throws IOException, NoSuchFieldException;
+
+    /**
+     * 演示用变更系统机构名
+     *
+     * @param file     文件
+     * @param schoolId 学校id(检测器)
+     * @return 结果
+     */
+    String changeSysOrg(MultipartFile file, Long schoolId) throws IOException, NoSuchFieldException;
+
+    /**
+     * 演示用变更用户
+     *
+     * @param file     文件
+     * @param schoolId 学校id(检测器)
+     * @return 结果
+     */
+    String changeSysUser(MultipartFile file, Long schoolId) throws IOException, NoSuchFieldException;
+
+    /**
+     * 演示用变更学生
+     *
+     * @param schoolId 学校id
+     */
+    void changeStudent(Long schoolId);
+
+    /**
+     * 制作真实数据
+     */
+    void createDemoData() throws ExecutionException, InterruptedException;
+
+
+    /**
+     * 将考察学院id合并到开课学院id
+     *
+     * @param schoolId                 学校id
+     * @param collegeCombineParamsList 学院合并参数集合
+     */
+    void combineCollegeInspectToTeach(Long schoolId, List<CollegeCombineParams> collegeCombineParamsList);
+}

+ 145 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/InsteadOrgService.java

@@ -0,0 +1,145 @@
+package com.qmth.teachcloud.report.business.service;
+
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.Map;
+
+/**
+ * @Description: 考察学院数据迁移到开课学院 -> 把一个开课学院作为(开课学院 + 考察学院)
+ * !** 必须保证机构名称在全校唯一
+ * @Author: CaoZixuan
+ * @Date: 2022-04-01
+ */
+@Async("analyzeThreadPool")
+public interface InsteadOrgService {
+    // -- 考察学院数据迁移到开课学院 -> 把一个开课学院作为(开课学院 + 考察学院)
+
+    /**
+     * 替换机构 更新基础表 't_b_'
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     */
+    void insteadOrgBasicTable(Long schoolId, Map<Long, Long> orgIdMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course' -> 考察机构名称长字符串中对应的考察机构名称替换为新的开课机构
+     *
+     * @param schoolId   学校主键
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourse(Long schoolId, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_clazz' -> 机构名称
+     *
+     * @param schoolId   学校主键
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseClazz(Long schoolId, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_college_inspect' -> (考察)机构id
+     *
+     * @param schoolId 学校主键
+     * @param orgIdMap 机构id键值对
+     */
+    void insteadOrgTAExamCourseCollegeInspect(Long schoolId, Map<Long, Long> orgIdMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_college_inspect_dio' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseCollegeInspectDio(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_college_paper_struct' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseCollegePaperStruct(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_college_teacher' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseCollegeTeacher(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_difficult' -> (考察)学院id
+     *
+     * @param schoolId 学校主键
+     * @param orgIdMap 机构id键值对
+     */
+    void insteadOrgTAExamCourseDifficult(Long schoolId, Map<Long, Long> orgIdMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_record' -> 考察学院id
+     *
+     * @param schoolId 学校主键
+     * @param orgIdMap 机构id键值对
+     */
+    void insteadOrgTAExamCourseRecord(Long schoolId, Map<Long, Long> orgIdMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_record_dio' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseRecordDio(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_record_mod' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseRecordMod(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_teacher_college_difficult' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseTeacherCollegeDifficult(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_teacher_college_dio' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseTeacherCollegeDio(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_course_teacher_college_paper_struct' -> 考察学院id和名称
+     *
+     * @param schoolId   学校主键
+     * @param orgIdMap   机构id键值对
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamCourseTeacherCollegePaperStruct(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap);
+
+    /**
+     * 替换机构 更新表 't_a_exam_total'
+     *
+     * @param schoolId   学校主键
+     * @param orgNameMap 机构名称键值对
+     */
+    void insteadOrgTAExamTotal(Long schoolId, Map<String, String> orgNameMap);
+}

+ 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> {
+
+}

+ 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> {
+
+}

+ 43 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBTeacherService.java

@@ -0,0 +1,43 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.entity.TBTeacher;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * @Description: 基础教师服务类
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+public interface TBTeacherService extends IService<TBTeacher> {
+
+
+    /**
+     * 根据idList批量删除多余的老师 - 用户级
+     *
+     * @param idSet
+     */
+    void deleteSysUserByIdSet(Set<Long> idSet);
+
+
+    /**
+     * excel导入基础老师表信息(先做全删全增)
+     *
+     * @param file     excel
+     * @param schoolId 学校id
+     * @return 导入情况
+     */
+    String importBasicTeacherInfo(MultipartFile file, Long schoolId) throws Exception;
+
+
+    /**
+     * 同步基础教师表数据到用户表
+     * 用户表中的用户和基础教师表比对,有的把用户登录名更新为基础教师表的教师编号,没有的为用户表新增教师表的新用户
+     *
+     * @param schoolId 学校id
+     */
+    void syncTeacherInfoToSysUser(Long schoolId);
+}

+ 554 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ChangNamesServiceImpl.java

@@ -0,0 +1,554 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicCourse;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.BasicCourseService;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.report.business.entity.TAExamCourse;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseRecordDio;
+import com.qmth.teachcloud.report.business.entity.TAExamTotal;
+import com.qmth.teachcloud.report.business.entity.TBStudent;
+import com.qmth.teachcloud.report.business.service.*;
+import com.qmth.teachcloud.report.business.templete.service.ComplicatedCalculateAsyncService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 更改名称服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-03-11
+ */
+@Service
+public class ChangNamesServiceImpl implements ChangNamesService {
+    @Resource
+    private BasicCourseService basicCourseService;
+    @Resource
+    private SysOrgService sysOrgService;
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private TBCommonLevelConfigService tbCommonLevelConfigService;
+    @Resource
+    private TBCommonRankLevelConfigService tbCommonRankLevelConfigService;
+    @Resource
+    private TBDimensionService tbDimensionService;
+    @Resource
+    private TBExamCourseService tbExamCourseService;
+    @Resource
+    private TBExamStudentService tbExamStudentService;
+    @Resource
+    private TBModuleConfigService tbModuleConfigService;
+    @Resource
+    private TBModuleProficiencyService tbModuleProficiencyService;
+    @Resource
+    private TBPaperService tbPaperService;
+    @Resource
+    private TBTeacherService tbTeacherService;
+    @Resource
+    private TAExamCourseService taExamCourseService;
+    @Resource
+    private TAExamCourseClazzService taExamCourseClazzService;
+    @Resource
+    private TAExamCourseCollegeInspectService taExamCourseCollegeInspectService;
+    @Resource
+    private TAExamCourseCollegeInspectDioService taExamCourseCollegeInspectDioService;
+    @Resource
+    private TAExamCourseCollegePaperStructService taExamCourseCollegePaperStructService;
+    @Resource
+    private TAExamCourseCollegeTeacherService taExamCourseCollegeTeacherService;
+    @Resource
+    private TAExamCourseDifficultService taExamCourseDifficultService;
+    @Resource
+    private TAExamCourseDioService taExamCourseDioService;
+    @Resource
+    private TAExamCourseRecordDioService taExamCourseRecordDioService;
+    @Resource
+    private TAExamCourseRecordModService taExamCourseRecordModService;
+    @Resource
+    private TAExamCourseTeacherService taExamCourseTeacherService;
+    @Resource
+    private TAExamCourseTeacherCollegeDifficultService taExamCourseTeacherCollegeDifficultService;
+    @Resource
+    private TAExamCourseTeacherCollegeDioService taExamCourseTeacherCollegeDioService;
+    @Resource
+    private TAExamCourseTeacherCollegePaperStructService taExamCourseTeacherCollegePaperStructService;
+    @Resource
+    private TAExamCourseTeacherDifficultService taExamCourseTeacherDifficultService;
+    @Resource
+    private TAExamCourseTeacherDioService taExamCourseTeacherDioService;
+    @Resource
+    private TAExamCourseTeacherPaperStructService taExamCourseTeacherPaperStructService;
+    @Resource
+    private TAExamTotalService taExamTotalService;
+    @Resource
+    private TAPaperStructService taPaperStructService;
+    @Resource
+    private TBStudentService tbStudentService;
+    @Resource
+    private ComplicatedCalculateAsyncService complicatedCalculateAsyncService;
+
+    private static final Logger log = LoggerFactory.getLogger(ChangNamesServiceImpl.class);
+
+
+    /**
+     * 查询 课程编号 - 课程名称 map
+     *
+     * @return map
+     */
+    private Map<String, String> findCourseMap() {
+        Map<String, String> map = new HashMap<>();
+        for (BasicCourse basicCourse : basicCourseService.list()) {
+            map.put(basicCourse.getCode(), basicCourse.getName());
+        }
+        return map;
+    }
+
+    /**
+     * 查询 机构id - 机构名称 map
+     *
+     * @return map
+     */
+    private Map<Long, String> findOrgMap() {
+        Map<Long, String> map = new HashMap<>();
+        for (SysOrg sysOrg : sysOrgService.list()) {
+            map.put(sysOrg.getId(), sysOrg.getName());
+        }
+        return map;
+    }
+
+    /**
+     * 查询 用户登录名(工号) - 用户真实名
+     *
+     * @return map
+     */
+    private Map<String, String> findUserCodeNameMap() {
+        Map<String, String> map = new HashMap<>();
+        for (SysUser sysUser : sysUserService.list()) {
+            map.put(sysUser.getLoginName(), sysUser.getRealName());
+        }
+        return map;
+    }
+
+    /**
+     * 查询 用户id - 用户真实名
+     *
+     * @return map
+     */
+    private Map<Long, String> findUserIdNameMap() {
+        Map<Long, String> map = new HashMap<>();
+        for (SysUser sysUser : sysUserService.list()) {
+            map.put(sysUser.getId(), sysUser.getRealName());
+        }
+        return map;
+    }
+
+    /**
+     * 查询 基础学生id - 基础学生名称
+     *
+     * @return map
+     */
+    private Map<Long, String> findStudentIdNameMap() {
+        Map<Long, String> map = new HashMap<>();
+        for (TBStudent tbStudent : tbStudentService.list()) {
+            map.put(tbStudent.getId(), tbStudent.getName());
+        }
+        return map;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeBasicTables() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        Map<String, String> userMap = this.findUserCodeNameMap();
+        Map<Long, String> studentMap = this.findStudentIdNameMap();
+        // t_b_common_level_config
+        tbCommonLevelConfigService.updateBatchById(tbCommonLevelConfigService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        // t_b_common_rank_level_config
+        tbCommonRankLevelConfigService.updateBatchById(tbCommonRankLevelConfigService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        // t_b_dimension
+        tbDimensionService.updateBatchById(tbDimensionService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        // t_b_exam_course
+        tbExamCourseService.updateBatchById(tbExamCourseService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getTeachCollegeId())) {
+                e.setTeachCollegeName(orgMap.get(e.getTeachCollegeId()));
+            }
+        }).collect(Collectors.toList()));
+        // t_b_exam_student
+        tbExamStudentService.updateBatchById(tbExamStudentService.list().stream()
+                .peek(e -> {
+                    e.setCourseName(courseMap.get(e.getCourseCode()));
+                    e.setName(studentMap.get(e.getStudentId()));
+                }).collect(Collectors.toList()));
+        // t_b_module_config
+        tbModuleConfigService.updateBatchById(tbModuleConfigService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        // t_b_module_proficiency
+        tbModuleProficiencyService.updateBatchById(tbModuleProficiencyService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        // t_b_paper
+        tbPaperService.updateBatchById(tbPaperService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        // t_b_teacher
+        tbTeacherService.updateBatchById(tbTeacherService.list().stream().filter(e -> userMap.containsKey(e.getTeacherCode())).peek(e -> e.setTeacherName(userMap.get(e.getTeacherCode()))).collect(Collectors.toList()));
+        log.info("基础表't_b'更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourse() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        List<SysOrg> sysOrgList = sysOrgService.list();
+
+        List<TAExamCourse> taExamCourseList = taExamCourseService.list();
+        for (TAExamCourse taExamCourse : taExamCourseList) {
+            Long schoolId = taExamCourse.getSchoolId();
+
+            if (courseMap.containsKey(taExamCourse.getCourseCode())) {
+                taExamCourse.setCourseName(courseMap.get(taExamCourse.getCourseCode()));
+            }
+            if (orgMap.containsKey(taExamCourse.getTeachCollegeId())) {
+                taExamCourse.setTeachCollegeName(orgMap.get(taExamCourse.getTeachCollegeId()));
+            }
+            String inspectCollegeNameStr = taExamCourse.getInspectCollegeNames();
+            List<String> newInspect = new ArrayList<>();
+            String[] inspectCollegeNameList = inspectCollegeNameStr.split("、");
+            for (String s : inspectCollegeNameList) {
+                List<SysOrg> cellList = sysOrgList.stream().filter(e -> e.getHistoricName().equals(s) && e.getSchoolId().equals(schoolId)).collect(Collectors.toList());
+                if (cellList.size() > 0) {
+                    if (cellList.size() > 1) {
+                        throw ExceptionResultEnum.ERROR.exception("数据异常");
+                    }
+                    SysOrg cell = cellList.get(0);
+                    newInspect.add(cell.getName());
+                } else {
+                    // 如果没有匹配到的话就按照原来的学院名称(因为演示方法可能多次执行,但执行完成一次后机构表的历史数据记录不会替换,下次执行就可能导致由于历史名称和机构名称组不匹配引发丢失机构)
+                    newInspect.add(s);
+                }
+            }
+            if (newInspect.size() > 0) {
+                taExamCourse.setInspectCollegeNames(String.join("、", newInspect));
+            }
+        }
+        taExamCourseService.updateBatchById(taExamCourseList);
+        log.info("复杂表 't_a_exam_course' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseClazz() {
+        Map<String, String> courseMap = this.findCourseMap();
+        List<SysOrg> sysOrgList = sysOrgService.list();
+        taExamCourseClazzService.updateBatchById(taExamCourseClazzService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            List<SysOrg> cellList = sysOrgList.stream().filter(o -> o.getHistoricName().equals(e.getCollegeName()) && o.getSchoolId().equals(e.getSchoolId())).collect(Collectors.toList());
+            if (cellList.size() > 1) {
+                throw ExceptionResultEnum.ERROR.exception("数据异常");
+            }
+            if (cellList.size() == 1) {
+                e.setCollegeName(cellList.get(0).getName());
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_clazz' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseCollegeInspect() {
+        Map<String, String> courseMap = this.findCourseMap();
+        taExamCourseCollegeInspectService.updateBatchById(taExamCourseCollegeInspectService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_college_inspect' 更新完成");
+    }
+
+    @Override
+    public void changeTableTAExamCourseCollegeInspectDio() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        taExamCourseCollegeInspectDioService.updateBatchById(taExamCourseCollegeInspectDioService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_college_inspect_dio' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseCollegePaperStruct() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        taExamCourseCollegePaperStructService.updateBatchById(taExamCourseCollegePaperStructService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_college_paper_struct' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseCollegeTeacher() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseCollegeTeacherService.updateBatchById(taExamCourseCollegeTeacherService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+            if (orgMap.containsKey(e.getTeachCollegeId())) {
+                e.setTeachCollegeName(orgMap.get(e.getTeachCollegeId()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_college_teacher' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseDifficultService() {
+        Map<String, String> courseMap = this.findCourseMap();
+        taExamCourseDifficultService.updateBatchById(taExamCourseDifficultService.list().stream()
+                .filter(e -> courseMap.containsKey(e.getCourseCode()))
+                .peek(e -> e.setCourseName(courseMap.get(e.getCourseCode())))
+                .collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_difficult' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseDio() {
+        Map<String, String> courseMap = this.findCourseMap();
+        taExamCourseDioService.updateBatchById(taExamCourseDioService.list().stream().filter(e -> courseMap.containsKey(e.getCourseCode())).peek(e -> e.setCourseName(courseMap.get(e.getCourseCode()))).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_dio' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseRecordDio() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        List<TAExamCourseRecordDio> taExamCourseRecordDioList = taExamCourseRecordDioService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList());
+        List<List<TAExamCourseRecordDio>> stepList = SystemConstant.getStepList(taExamCourseRecordDioList);
+        stepList.forEach(e -> complicatedCalculateAsyncService.updateTableTAExamCourseRecordDioBatchById(e));
+//        log.info("表 't_a_exam_course_record_dio' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseRecordMod() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        taExamCourseRecordModService.updateBatchById(taExamCourseRecordModService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_record_mod' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseTeacher() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseTeacherService.updateBatchById(taExamCourseTeacherService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_teacher' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseTeacherCollegeDifficult() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseTeacherCollegeDifficultService.updateBatchById(taExamCourseTeacherCollegeDifficultService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_teacher_college_difficult' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseTeacherCollegeDio() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseTeacherCollegeDioService.updateBatchById(taExamCourseTeacherCollegeDioService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_teacher_college_dio' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseTeacherCollegePaperStruct() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> orgMap = this.findOrgMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseTeacherCollegePaperStructService.updateBatchById(taExamCourseTeacherCollegePaperStructService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (orgMap.containsKey(e.getInspectCollegeId())) {
+                e.setInspectCollegeName(orgMap.get(e.getInspectCollegeId()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_teacher_college_paper_struct' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseTeacherDifficult() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseTeacherDifficultService.updateBatchById(taExamCourseTeacherDifficultService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_teacher_difficult' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseTeacherDio() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseTeacherDioService.updateBatchById(taExamCourseTeacherDioService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_teacher_dio' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamCourseTeacherPaperStruct() {
+        Map<String, String> courseMap = this.findCourseMap();
+        Map<Long, String> userMap = this.findUserIdNameMap();
+        taExamCourseTeacherPaperStructService.updateBatchById(taExamCourseTeacherPaperStructService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+            if (userMap.containsKey(e.getTeacherId())) {
+                e.setTeacherName(userMap.get(e.getTeacherId()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_exam_course_teacher_paper_struct' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAExamTotal() {
+        List<SysOrg> sysOrgList = sysOrgService.list();
+        List<TAExamTotal> taExamTotalList = taExamTotalService.list();
+        for (TAExamTotal taExamTotal : taExamTotalList) {
+            String collegeNameStr = taExamTotal.getCollegeNames();
+            List<String> newCollegeList = new ArrayList<>();
+            String[] collegeNameList = collegeNameStr.split("、");
+            for (String s : collegeNameList) {
+                List<SysOrg> cellList = sysOrgList.stream().filter(e -> e.getHistoricName().equals(s) && e.getSchoolId().equals(taExamTotal.getSchoolId())).collect(Collectors.toList());
+                if (cellList.size() > 0) {
+                    if (cellList.size() > 1) {
+                        throw ExceptionResultEnum.ERROR.exception("数据异常");
+                    }
+                    SysOrg cell = cellList.get(0);
+                    newCollegeList.add(cell.getName());
+                } else {
+                    // 如果没有匹配到的话就按照原来的学院名称(因为演示方法可能多次执行,但执行完成一次后机构表的历史数据记录不会替换,下次执行就可能导致由于历史名称和机构名称组不匹配引发丢失机构)
+                    newCollegeList.add(s);
+                }
+            }
+            if (newCollegeList.size() > 0) {
+                taExamTotal.setCollegeNames(String.join("、", newCollegeList));
+            }
+        }
+        log.info("表 't_a_exam_total' 更新完成");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeTableTAPaperStruct() {
+        Map<String, String> courseMap = this.findCourseMap();
+        taPaperStructService.updateBatchById(taPaperStructService.list().stream().peek(e -> {
+            if (courseMap.containsKey(e.getCourseCode())) {
+                e.setCourseName(courseMap.get(e.getCourseCode()));
+            }
+        }).collect(Collectors.toList()));
+        log.info("表 't_a_paper_struct' 更新完成");
+    }
+}

+ 318 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/CourseUnitOperateServiceImpl.java

@@ -0,0 +1,318 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.collect.Lists;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicCourse;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.BasicCourseService;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.report.business.bean.dto.excel.BasicCourseChangeDto;
+import com.qmth.teachcloud.report.business.bean.dto.excel.SysOrgChangeDto;
+import com.qmth.teachcloud.report.business.bean.dto.excel.SysUserChangeDto;
+import com.qmth.teachcloud.report.business.bean.params.CollegeCombineParams;
+import com.qmth.teachcloud.report.business.entity.TAExamCourseRecord;
+import com.qmth.teachcloud.report.business.entity.TBStudent;
+import com.qmth.teachcloud.report.business.service.*;
+import com.qmth.teachcloud.report.business.utils.RandomNameUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 课程单元操作服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-02-25
+ */
+@Service
+public class CourseUnitOperateServiceImpl implements CourseUnitOperateService {
+    @Resource
+    private BasicCourseService basicCourseService;
+    @Resource
+    private SysOrgService sysOrgService;
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private TBStudentService tbStudentService;
+    @Resource
+    private ChangNamesService changNamesService;
+    @Resource
+    private TAExamCourseRecordService taExamCourseRecordService;
+    @Resource
+    private InsteadOrgService insteadOrgService;
+
+    private static final Logger log = LoggerFactory.getLogger(CourseUnitOperateServiceImpl.class);
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String changeBasicCourse(MultipartFile file, Long schoolId) throws IOException, NoSuchFieldException {
+        // 基础课程数据源
+        List<BasicCourse> basicCourseDatasource = basicCourseService.list(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId));
+
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(BasicCourseChangeDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+        List<BasicCourse> updateData = new ArrayList<>();
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> dataSource = map.get(i);
+                for (int y = 0; y < Objects.requireNonNull(dataSource).size(); y++) {
+                    if (dataSource.get(y) instanceof BasicCourseChangeDto) {
+                        BasicCourseChangeDto basicCourseChangeDto = (BasicCourseChangeDto) dataSource.get(y);
+                        Long id = SystemConstant.convertIdToLong(basicCourseChangeDto.getId());
+
+
+                        List<BasicCourse> basicCourseVerifyList = basicCourseDatasource.stream().filter(e -> e.getId().equals(id)).collect(Collectors.toList());
+                        if (basicCourseVerifyList.size() > 0) {
+                            BasicCourse basicCourse = basicCourseVerifyList.get(0);
+                            Long excelSchoolId = SystemConstant.convertIdToLong(basicCourseChangeDto.getSchoolId());
+                            String courseCode = basicCourseChangeDto.getCourseCode();
+                            String historicName = basicCourseChangeDto.getHistoricName();
+                            String newName = basicCourseChangeDto.getNewName();
+                            if (!SystemConstant.strNotNull(newName)) {
+                                continue;
+                            }
+
+                            // 数据校验
+                            if (!basicCourse.getSchoolId().equals(excelSchoolId) || !basicCourse.getCode().equals(courseCode) || !basicCourse.getName().equals(historicName)) {
+                                throw ExceptionResultEnum.ERROR.exception("第【" + (y + 2) + "】行数据不对应");
+                            }
+                            // 基础数据替换
+                            basicCourse.setName(newName);
+                            basicCourse.setHistoricName(historicName);
+                            updateData.add(basicCourse);
+                        }
+                    }
+                }
+            }
+        }
+        basicCourseService.updateBatchById(updateData);
+        return "'basic_course' 基础课程表完成更新【" + updateData.size() + "】课次";
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String changeSysOrg(MultipartFile file, Long schoolId) throws IOException, NoSuchFieldException {
+        // 基础机构数据
+        List<SysOrg> sysOrgDatasource = sysOrgService.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId));
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(SysOrgChangeDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+        List<SysOrg> updateData = new ArrayList<>();
+        Map<String, Integer> nameCheck = new HashMap<>();
+
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> dataSource = map.get(i);
+                for (int y = 0; y < Objects.requireNonNull(dataSource).size(); y++) {
+                    if (dataSource.get(y) instanceof SysOrgChangeDto) {
+                        SysOrgChangeDto sysOrgChangeDto = (SysOrgChangeDto) dataSource.get(y);
+                        Long id = SystemConstant.convertIdToLong(sysOrgChangeDto.getId());
+
+
+                        List<SysOrg> sysOrgVerifyList = sysOrgDatasource.stream().filter(e -> e.getId().equals(id)).collect(Collectors.toList());
+                        if (sysOrgVerifyList.size() > 0) {
+                            SysOrg sysOrg = sysOrgVerifyList.get(0);
+                            Long excelSchoolId = SystemConstant.convertIdToLong(sysOrgChangeDto.getSchoolId());
+                            String orgCode = sysOrgChangeDto.getOrgCode();
+                            String historicName = sysOrgChangeDto.getHistoricName();
+                            String newName = sysOrgChangeDto.getNewName();
+                            if (!SystemConstant.strNotNull(newName)) {
+                                continue;
+                            }
+
+                            // 数据校验
+                            if (nameCheck.containsKey(newName)) {
+                                throw ExceptionResultEnum.ERROR.exception("第【" + (y + 2) + "】行变更的机构名称【" + newName + "】和第【" + nameCheck.get(newName) + "】行重复");
+                            } else {
+                                nameCheck.put(newName, (y + 2));
+                            }
+                            if (!sysOrg.getSchoolId().equals(excelSchoolId) || !sysOrg.getCode().equals(orgCode) || !sysOrg.getName().equals(historicName)) {
+                                throw ExceptionResultEnum.ERROR.exception("第【" + (y + 2) + "】行数据不对应");
+                            }
+                            // 基础数据替换
+                            sysOrg.setName(newName);
+                            sysOrg.setHistoricName(historicName);
+                            updateData.add(sysOrg);
+                        }
+                    }
+                }
+            }
+        }
+        sysOrgService.updateBatchById(updateData);
+        return "'sys_org' 系统机构表完成更新【" + updateData.size() + "】次";
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String changeSysUser(MultipartFile file, Long schoolId) throws IOException, NoSuchFieldException {
+        // 基础机构数据
+        List<SysOrg> sysOrgDatasource = sysOrgService.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId));
+        // 基础用户数据
+        List<SysUser> sysUserDatasource = sysUserService.list(new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId));
+
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(SysUserChangeDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+
+        List<SysUser> updateData = new ArrayList<>();
+
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> dataSource = map.get(i);
+                for (int y = 0; y < Objects.requireNonNull(dataSource).size(); y++) {
+                    if (dataSource.get(y) instanceof SysUserChangeDto) {
+                        SysUserChangeDto sysUserChangeDto = (SysUserChangeDto) dataSource.get(y);
+                        Long id = SystemConstant.convertIdToLong(sysUserChangeDto.getId());
+
+
+                        List<SysUser> sysUserVerifyList = sysUserDatasource.stream().filter(e -> e.getId().equals(id)).collect(Collectors.toList());
+                        if (sysUserDatasource.size() > 0) {
+                            SysUser sysUser = sysUserVerifyList.get(0);
+                            Long excelSchoolId = SystemConstant.convertIdToLong(sysUserChangeDto.getSchoolId());
+                            String historicName = sysUserChangeDto.getHistoricName();
+                            String newName = sysUserChangeDto.getNewName();
+                            if (!SystemConstant.strNotNull(newName)) {
+                                continue;
+                            }
+                            // 如果该用户是机构表中自动创建的考察学院院长用户,则同步更新用户名为机构表名称
+                            List<SysOrg> sysOrgList = sysOrgDatasource.stream().filter(e -> e.getHistoricName().equals(historicName)).collect(Collectors.toList());
+                            if (sysOrgList.size() == 1) {
+                                sysUser.setRealName(sysOrgList.get(0).getName());
+                                sysUser.setLoginName(sysOrgList.get(0).getName());
+                            } else {
+                                // 数据校验
+                                if (!sysUser.getSchoolId().equals(excelSchoolId) || !sysUser.getRealName().equals(historicName)) {
+                                    throw ExceptionResultEnum.ERROR.exception("第【" + (y + 2) + "】行数据不对应");
+                                }
+                                // 基础数据替换
+                                sysUser.setRealName(newName);
+                                sysUser.setLoginName(newName);
+                            }
+                            sysUser.setHistoricName(historicName);
+                            updateData.add(sysUser);
+                        }
+                    }
+                }
+            }
+        }
+        sysUserService.updateBatchById(updateData);
+        return "'sys_user' 系统用户表完成更新【" + updateData.size() + "】次";
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changeStudent(Long schoolId) {
+        List<TBStudent> historicData = tbStudentService.list(new QueryWrapper<TBStudent>().lambda().eq(TBStudent::getSchoolId,schoolId));
+        for (TBStudent historicDatum : historicData) {
+            historicDatum.setName(RandomNameUtil.getName());
+        }
+        tbStudentService.updateBatchById(historicData);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void createDemoData() throws InterruptedException {
+        log.info("该表线程开始执行");
+        changNamesService.changeBasicTables();
+        changNamesService.changeTableTAExamCourse();
+        changNamesService.changeTableTAExamCourseClazz();
+        changNamesService.changeTableTAExamCourseCollegeInspect();
+        changNamesService.changeTableTAExamCourseCollegeInspectDio();
+        changNamesService.changeTableTAExamCourseCollegePaperStruct();
+        changNamesService.changeTableTAExamCourseCollegeTeacher();
+        changNamesService.changeTableTAExamCourseDifficultService();
+        changNamesService.changeTableTAExamCourseDio();
+        changNamesService.changeTableTAExamCourseRecordDio();
+        changNamesService.changeTableTAExamCourseRecordMod();
+        changNamesService.changeTableTAExamCourseTeacher();
+        changNamesService.changeTableTAExamCourseTeacherCollegeDifficult();
+        changNamesService.changeTableTAExamCourseTeacherCollegeDio();
+        changNamesService.changeTableTAExamCourseTeacherCollegePaperStruct();
+        changNamesService.changeTableTAExamCourseTeacherDifficult();
+        changNamesService.changeTableTAExamCourseTeacherDio();
+        changNamesService.changeTableTAExamCourseTeacherPaperStruct();
+        changNamesService.changeTableTAExamTotal();
+        changNamesService.changeTableTAPaperStruct();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void combineCollegeInspectToTeach(Long schoolId, List<CollegeCombineParams> collegeCombineParamsList) {
+        // 构建被替换学院id - 替换学院id 键值对
+        Map<Long, Long> orgIdMap = new HashMap<>();
+        // 构建被替换学院名称 - 替换学院名称 键值对
+        Map<String, String> orgNameMap = new HashMap<>();
+
+        for (CollegeCombineParams collegeCombineParams : collegeCombineParamsList) {
+            Long inspectCollegeId = collegeCombineParams.getInspectCollegeId();
+            Long teachCollegeId = collegeCombineParams.getTeachCollegeId();
+
+            // 考察学院判断
+            SysOrg inspectCollege = sysOrgService.getById(inspectCollegeId);
+            if (Objects.isNull(inspectCollege)) {
+                throw ExceptionResultEnum.ERROR.exception("考察学院不存在 id = " + inspectCollegeId);
+            }
+            if (taExamCourseRecordService.count(new QueryWrapper<TAExamCourseRecord>().lambda().eq(TAExamCourseRecord::getSchoolId, schoolId).eq(TAExamCourseRecord::getInspectCollegeId, inspectCollegeId)) == 0) {
+                throw ExceptionResultEnum.ERROR.exception("考察学院【" + inspectCollege.getName() + "】不存在数据");
+            }
+
+            // 开课学院判断
+            SysOrg teachCollege = sysOrgService.getById(teachCollegeId);
+            if (Objects.isNull(teachCollege)) {
+                throw ExceptionResultEnum.ERROR.exception("开课学院不存在 id= " + teachCollegeId);
+            }
+            if (taExamCourseRecordService.count(new QueryWrapper<TAExamCourseRecord>().lambda().eq(TAExamCourseRecord::getSchoolId, schoolId).eq(TAExamCourseRecord::getTeachCollegeId, teachCollegeId)) == 0) {
+                throw ExceptionResultEnum.ERROR.exception("开课学院【" + teachCollege.getName() + "】不存在数据");
+            }
+
+            if (!Objects.equals(inspectCollege.getParentId(), teachCollege.getParentId())) {
+                throw ExceptionResultEnum.ERROR.exception("考察学院【" + inspectCollege.getName() + "】和开课学院【" + teachCollege.getName() + "】不在同一个父机构下");
+            }
+
+            orgIdMap.put(inspectCollegeId, teachCollegeId);
+            orgNameMap.put(inspectCollege.getName(), teachCollege.getName());
+        }
+        insteadOrgService.insteadOrgBasicTable(schoolId, orgIdMap);
+        insteadOrgService.insteadOrgTAExamCourse(schoolId, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseClazz(schoolId, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseCollegeInspect(schoolId, orgIdMap);
+        insteadOrgService.insteadOrgTAExamCourseCollegeInspectDio(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseCollegePaperStruct(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseCollegeTeacher(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseDifficult(schoolId, orgIdMap);
+        insteadOrgService.insteadOrgTAExamCourseRecord(schoolId, orgIdMap);
+        insteadOrgService.insteadOrgTAExamCourseRecordDio(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseRecordMod(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseTeacherCollegeDifficult(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseTeacherCollegeDio(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamCourseTeacherCollegePaperStruct(schoolId, orgIdMap, orgNameMap);
+        insteadOrgService.insteadOrgTAExamTotal(schoolId, orgNameMap);
+    }
+}

+ 325 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/InsteadOrgServiceImpl.java

@@ -0,0 +1,325 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.teachcloud.report.business.entity.*;
+import com.qmth.teachcloud.report.business.service.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 机构替换服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-04-01
+ */
+@Service
+public class InsteadOrgServiceImpl implements InsteadOrgService {
+    @Resource
+    private TBExamStudentService tbExamStudentService;
+    @Resource
+    private TBTeacherService tbTeacherService;
+    @Resource
+    private TAExamCourseService taExamCourseService;
+    @Resource
+    private TAExamCourseClazzService taExamCourseClazzService;
+    @Resource
+    private TAExamCourseCollegeInspectService taExamCourseCollegeInspectService;
+    @Resource
+    private TAExamCourseCollegeInspectDioService taExamCourseCollegeInspectDioService;
+    @Resource
+    private TAExamCourseCollegePaperStructService taExamCourseCollegePaperStructService;
+    @Resource
+    private TAExamCourseCollegeTeacherService taExamCourseCollegeTeacherService;
+    @Resource
+    private TAExamCourseDifficultService taExamCourseDifficultService;
+    @Resource
+    private TAExamCourseRecordDioService taExamCourseRecordDioService;
+    @Resource
+    private TAExamCourseRecordModService taExamCourseRecordModService;
+    @Resource
+    private TAExamCourseTeacherCollegeDifficultService taExamCourseTeacherCollegeDifficultService;
+    @Resource
+    private TAExamCourseTeacherCollegeDioService taExamCourseTeacherCollegeDioService;
+    @Resource
+    private TAExamCourseTeacherCollegePaperStructService taExamCourseTeacherCollegePaperStructService;
+    @Resource
+    private TAExamTotalService taExamTotalService;
+    @Resource
+    private TAExamCourseRecordService taExamCourseRecordService;
+
+    private static final Logger log = LoggerFactory.getLogger(InsteadOrgServiceImpl.class);
+
+    @Override
+    public void insteadOrgBasicTable(Long schoolId, Map<Long, Long> orgIdMap) {
+        Set<Long> orgIdSet = orgIdMap.keySet();
+        // 更新表 't_b_exam_student' 考察机构id
+        tbExamStudentService.updateBatchById(tbExamStudentService.list(new QueryWrapper<TBExamStudent>()
+                        .lambda()
+                        .eq(TBExamStudent::getSchoolId, schoolId)
+                        .in(TBExamStudent::getInspectCollegeId, orgIdSet))
+                .stream().peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_b_exam_student' 表更新成功");
+
+        // 更新表 't_b_teacher' 机构id 把原考察机构换成开课机构(大抵教师都帮在开课学院下的)
+        tbTeacherService.updateBatchById(tbTeacherService.list(new QueryWrapper<TBTeacher>()
+                        .lambda()
+                        .eq(TBTeacher::getSchoolId, schoolId)
+                        .in(TBTeacher::getOrgId, orgIdSet))
+                .stream().peek(e -> {
+                    if (orgIdMap.containsKey(e.getOrgId())) {
+                        e.setOrgId(orgIdMap.get(e.getOrgId()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_b_teacher' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourse(Long schoolId, Map<String, String> orgNameMap) {
+        List<TAExamCourse> taExamCourseList = taExamCourseService.list(new QueryWrapper<TAExamCourse>().lambda().eq(TAExamCourse::getSchoolId, schoolId));
+        taExamCourseService.updateBatchById(taExamCourseList.stream().peek(e -> {
+            final String separator = "、";
+            StringBuilder newStr = new StringBuilder();
+            String inspectCollegeStr = e.getInspectCollegeNames();
+            String[] inspectCollegeArr = inspectCollegeStr.split(separator);
+            for (String s : inspectCollegeArr) {
+                if (orgNameMap.containsKey(s)) {
+                    s = orgNameMap.get(s);
+                }
+                newStr.append(s).append(separator);
+            }
+            e.setInspectCollegeNames(newStr.substring(0, newStr.length() - separator.length()));
+        }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseClazz(Long schoolId, Map<String, String> orgNameMap) {
+        taExamCourseClazzService.updateBatchById(taExamCourseClazzService.list(new QueryWrapper<TAExamCourseClazz>()
+                        .lambda()
+                        .eq(TAExamCourseClazz::getSchoolId, schoolId))
+                .stream().peek(e -> {
+                    if (orgNameMap.containsKey(e.getCollegeName())) {
+                        e.setCollegeName(orgNameMap.get(e.getCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_clazz' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseCollegeInspect(Long schoolId, Map<Long, Long> orgIdMap) {
+        taExamCourseCollegeInspectService.updateBatchById(taExamCourseCollegeInspectService.list(new QueryWrapper<TAExamCourseCollegeInspect>()
+                        .lambda()
+                        .eq(TAExamCourseCollegeInspect::getSchoolId, schoolId)
+                        .in(TAExamCourseCollegeInspect::getCollegeId, orgIdMap.keySet()))
+                .stream().peek(e -> {
+                    if (orgIdMap.containsKey(e.getCollegeId())) {
+                        e.setCollegeId(orgIdMap.get(e.getCollegeId()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_college_inspect' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseCollegeInspectDio(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseCollegeInspectDioService.updateBatchById(taExamCourseCollegeInspectDioService.list(new QueryWrapper<TAExamCourseCollegeInspectDio>()
+                        .lambda()
+                        .eq(TAExamCourseCollegeInspectDio::getSchoolId, schoolId)
+                        .in(TAExamCourseCollegeInspectDio::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_college_inspect_dio' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseCollegePaperStruct(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseCollegePaperStructService.updateBatchById(taExamCourseCollegePaperStructService.list(new QueryWrapper<TAExamCourseCollegePaperStruct>()
+                        .lambda()
+                        .eq(TAExamCourseCollegePaperStruct::getSchoolId, schoolId)
+                        .in(TAExamCourseCollegePaperStruct::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_college_paper_struct' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseCollegeTeacher(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseCollegeTeacherService.updateBatchById(taExamCourseCollegeTeacherService.list(new QueryWrapper<TAExamCourseCollegeTeacher>()
+                        .lambda()
+                        .eq(TAExamCourseCollegeTeacher::getSchoolId, schoolId)
+                        .in(TAExamCourseCollegeTeacher::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_college_teacher' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseDifficult(Long schoolId, Map<Long, Long> orgIdMap) {
+        taExamCourseDifficultService.updateBatchById(taExamCourseDifficultService.list(new QueryWrapper<TAExamCourseDifficult>()
+                        .lambda()
+                        .eq(TAExamCourseDifficult::getSchoolId, schoolId)
+                        .in(TAExamCourseDifficult::getCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getCollegeId())) {
+                        e.setCollegeId(orgIdMap.get(e.getCollegeId()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_difficult' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseRecord(Long schoolId, Map<Long, Long> orgIdMap) {
+        taExamCourseRecordService.updateBatchById(taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>()
+                        .lambda()
+                        .eq(TAExamCourseRecord::getSchoolId, schoolId)
+                        .in(TAExamCourseRecord::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_record' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseRecordDio(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseRecordDioService.updateBatchById(taExamCourseRecordDioService.list(new QueryWrapper<TAExamCourseRecordDio>()
+                        .lambda()
+                        .eq(TAExamCourseRecordDio::getSchoolId, schoolId)
+                        .in(TAExamCourseRecordDio::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_record_dio' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseRecordMod(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseRecordModService.updateBatchById(taExamCourseRecordModService.list(new QueryWrapper<TAExamCourseRecordMod>()
+                        .lambda()
+                        .eq(TAExamCourseRecordMod::getSchoolId, schoolId)
+                        .in(TAExamCourseRecordMod::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_record_mod' 表更新成功");
+    }
+
+
+    @Override
+    public void insteadOrgTAExamCourseTeacherCollegeDifficult(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseTeacherCollegeDifficultService.updateBatchById(taExamCourseTeacherCollegeDifficultService.list(new QueryWrapper<TAExamCourseTeacherCollegeDifficult>()
+                        .lambda()
+                        .eq(TAExamCourseTeacherCollegeDifficult::getSchoolId, schoolId)
+                        .in(TAExamCourseTeacherCollegeDifficult::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_teacher_college_difficult' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseTeacherCollegeDio(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseTeacherCollegeDioService.updateBatchById(taExamCourseTeacherCollegeDioService.list(new QueryWrapper<TAExamCourseTeacherCollegeDio>()
+                        .lambda()
+                        .eq(TAExamCourseTeacherCollegeDio::getSchoolId, schoolId)
+                        .in(TAExamCourseTeacherCollegeDio::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_teacher_college_dio' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamCourseTeacherCollegePaperStruct(Long schoolId, Map<Long, Long> orgIdMap, Map<String, String> orgNameMap) {
+        taExamCourseTeacherCollegePaperStructService.updateBatchById(taExamCourseTeacherCollegePaperStructService.list(new QueryWrapper<TAExamCourseTeacherCollegePaperStruct>()
+                        .lambda()
+                        .eq(TAExamCourseTeacherCollegePaperStruct::getSchoolId, schoolId)
+                        .in(TAExamCourseTeacherCollegePaperStruct::getInspectCollegeId, orgIdMap.keySet()))
+                .stream()
+                .peek(e -> {
+                    if (orgIdMap.containsKey(e.getInspectCollegeId())) {
+                        e.setInspectCollegeId(orgIdMap.get(e.getInspectCollegeId()));
+                    }
+                    if (orgNameMap.containsKey(e.getInspectCollegeName())) {
+                        e.setInspectCollegeName(orgNameMap.get(e.getInspectCollegeName()));
+                    }
+                }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_course_teacher_college_paper_struct' 表更新成功");
+    }
+
+    @Override
+    public void insteadOrgTAExamTotal(Long schoolId, Map<String, String> orgNameMap) {
+        List<TAExamTotal> taExamTotalList = taExamTotalService.list(new QueryWrapper<TAExamTotal>().lambda().eq(TAExamTotal::getSchoolId, schoolId));
+        taExamTotalService.updateBatchById(taExamTotalList.stream().peek(e -> {
+            final String separator = "、";
+            StringBuilder newStr = new StringBuilder();
+            String inspectCollegeStr = e.getCollegeNames();
+            String[] inspectCollegeArr = inspectCollegeStr.split(separator);
+            for (String s : inspectCollegeArr) {
+                if (orgNameMap.containsKey(s)) {
+                    s = orgNameMap.get(s);
+                }
+                newStr.append(s).append(separator);
+            }
+            e.setCollegeNames(newStr.substring(0, newStr.length() - separator.length()));
+        }).collect(Collectors.toSet()));
+        log.info("'t_a_exam_total' 表更新成功");
+    }
+}

+ 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 {
+
+}

+ 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 {
+
+}

+ 166 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBTeacherServiceImpl.java

@@ -0,0 +1,166 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.qmth.teachcloud.common.bean.params.UserSaveParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysRole;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.SysUserRole;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.service.SysRoleService;
+import com.qmth.teachcloud.common.service.SysUserRoleService;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.report.business.bean.dto.excel.TeacherDto;
+import com.qmth.teachcloud.report.business.entity.TBTeacher;
+import com.qmth.teachcloud.report.business.mapper.TBTeacherMapper;
+import com.qmth.teachcloud.report.business.service.TBTeacherService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 基础教师服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2021-09-21
+ */
+@Service
+public class TBTeacherServiceImpl extends ServiceImpl<TBTeacherMapper, TBTeacher> implements TBTeacherService {
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private SysUserRoleService sysUserRoleService;
+    @Resource
+    private SysOrgService sysOrgService;
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void deleteSysUserByIdSet(Set<Long> idSet) {
+        if (CollectionUtils.isEmpty(idSet)){
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的用户id");
+        }
+        sysUserRoleService.remove(new QueryWrapper<SysUserRole>().lambda().in(SysUserRole::getUserId,idSet));
+        sysUserService.remove(new QueryWrapper<SysUser>().lambda().in(SysUser::getId,idSet));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String importBasicTeacherInfo(MultipartFile file, Long schoolId) throws Exception {
+        if (Objects.isNull(file)) {
+            throw ExceptionResultEnum.ERROR.exception("附件不存在");
+        }
+        if (Objects.isNull(schoolId) || schoolId == 0) {
+            throw ExceptionResultEnum.ERROR.exception("参数缺失");
+        }
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(TeacherDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+
+        Map<String,String> checkCode = new HashMap<>();
+        List<TBTeacher> tbTeacherList = new ArrayList<>();
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> teacherList = map.get(i);
+                for (int y = 0; y < Objects.requireNonNull(teacherList).size(); y++) {
+                    if (teacherList.get(y) instanceof TeacherDto) {
+                        // excel 数据解析
+                        TeacherDto teacherDto = (TeacherDto) teacherList.get(y);
+                        String teacherName = teacherDto.getTeacherName();
+                        String teacherCode = teacherDto.getTeacherCode();
+                        if (checkCode.containsKey(teacherCode)){
+                            throw ExceptionResultEnum.ERROR.exception("excel中存在重复的教师编号 : " + teacherCode);
+                        }
+                        checkCode.put(teacherCode,teacherName);
+
+                        String orgName = teacherDto.getOrgName();
+                        SysOrg sysOrg = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda()
+                                .eq(SysOrg::getSchoolId,schoolId)
+                                .eq(SysOrg::getName,orgName));
+                        if (Objects.isNull(sysOrg)){
+                            System.out.println(JSON.toJSONString(teacherDto));
+                            throw ExceptionResultEnum.ERROR.exception("机构不存在");
+                        }
+                        String roleName = teacherDto.getRoleName();
+                        RoleTypeEnum roleType = RoleTypeEnum.convertDescToEnum(roleName);
+                        if (roleType == null){
+                            throw ExceptionResultEnum.ERROR.exception("枚举类型不存在");
+                        }
+
+                        TBTeacher tbTeacher = new TBTeacher();
+                        tbTeacher.setId(SystemConstant.getDbUuid());
+                        tbTeacher.setSchoolId(schoolId);
+                        tbTeacher.setOrgId(sysOrg.getId());
+                        tbTeacher.setTeacherCode(teacherCode);
+                        tbTeacher.setTeacherName(teacherName);
+                        tbTeacher.setRoleType(roleType);
+                        tbTeacherList.add(tbTeacher);
+                    }
+                }
+            }
+        }
+        // 删除该学校原有数据
+        this.remove(new QueryWrapper<TBTeacher>().lambda().eq(TBTeacher::getSchoolId,schoolId));
+        // 添加数据
+        this.saveBatch(tbTeacherList);
+        return "处理数据 " + tbTeacherList.size() + "条";
+    }
+
+    @Override
+    public void syncTeacherInfoToSysUser(Long schoolId) {
+        // 基础教师表
+        List<TBTeacher> teacherList = this.list(new QueryWrapper<TBTeacher>().lambda().eq(TBTeacher::getSchoolId,schoolId));
+        List<SysUser> dbUserList = sysUserService.list(new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId,schoolId));
+        for (TBTeacher tbTeacher : teacherList) {
+            List<SysUser> dbFilter = dbUserList.stream().filter(e -> tbTeacher.getTeacherName().equals(e.getRealName())).collect(Collectors.toList());
+            SysRole teacherRole = sysRoleService.list(new QueryWrapper<SysRole>().lambda().eq(SysRole::getType, tbTeacher.getRoleType())).get(0);
+            List<Long> roleIds = new ArrayList<>();
+            roleIds.add(teacherRole.getId());
+            if (dbFilter.size() > 1){
+                throw ExceptionResultEnum.ERROR.exception("找到相同名称用户警告");
+            }else if (dbFilter.size() == 1){
+                // 更新教师账号
+                SysUser dbUser = dbFilter.get(0);
+                UserSaveParams userSaveParams = new UserSaveParams();
+                userSaveParams.setId(dbUser.getId());
+                userSaveParams.setSchoolId(tbTeacher.getSchoolId());
+                userSaveParams.setLoginName(tbTeacher.getTeacherCode());
+                userSaveParams.setRealName(tbTeacher.getTeacherName());
+                userSaveParams.setPassword(SystemConstant.DEFAULT_PASSWORD);
+                userSaveParams.setOrgId(tbTeacher.getOrgId());
+                userSaveParams.setEnable(true);
+                userSaveParams.setRoleIds(roleIds.toArray(new Long[0]));
+                sysUserService.saveUserNoAuth(userSaveParams);
+            }else {
+                // 新增教师
+                UserSaveParams userSaveParams = new UserSaveParams();
+                userSaveParams.setSchoolId(tbTeacher.getSchoolId());
+                userSaveParams.setLoginName(tbTeacher.getTeacherCode());
+                userSaveParams.setRealName(tbTeacher.getTeacherName());
+                userSaveParams.setPassword(SystemConstant.DEFAULT_PASSWORD);
+                userSaveParams.setOrgId(tbTeacher.getOrgId());
+                userSaveParams.setEnable(true);
+                userSaveParams.setRoleIds(roleIds.toArray(new Long[0]));
+                sysUserService.saveUserNoAuth(userSaveParams);
+            }
+        }
+    }
+}

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

@@ -0,0 +1,21 @@
+package com.qmth.teachcloud.report.business.templete.service;
+
+import com.qmth.teachcloud.report.business.entity.TAExamCourseRecordDio;
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.List;
+
+/**
+ * @Description: 复杂计算异步服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-03-15
+ */
+public interface ComplicatedCalculateAsyncService {
+
+    /**
+     * 多线程批量更新表't_a_exam_course_record_dio'
+     * @param taExamCourseRecordDioList taExamCourseRecordDioList
+     */
+    @Async("analyzeThreadPool")
+    void updateTableTAExamCourseRecordDioBatchById(List<TAExamCourseRecordDio> taExamCourseRecordDioList);
+}

+ 27 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/service/impl/ComplicatedCalculateAsyncServiceImpl.java

@@ -0,0 +1,27 @@
+package com.qmth.teachcloud.report.business.templete.service.impl;
+
+import com.qmth.teachcloud.report.business.entity.TAExamCourseRecordDio;
+import com.qmth.teachcloud.report.business.service.TAExamCourseRecordDioService;
+import com.qmth.teachcloud.report.business.templete.service.ComplicatedCalculateAsyncService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Description: 复杂计算异步服务类实现类
+ * @Author: CaoZixuan
+ * @Date: 2022-03-15
+ */
+@Service
+public class ComplicatedCalculateAsyncServiceImpl implements ComplicatedCalculateAsyncService {
+    @Resource
+    private TAExamCourseRecordDioService taExamCourseRecordDioService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateTableTAExamCourseRecordDioBatchById(List<TAExamCourseRecordDio> taExamCourseRecordDioList) {
+        taExamCourseRecordDioService.updateBatchById(taExamCourseRecordDioList);
+    }
+}

+ 125 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/utils/AesUtil.java

@@ -0,0 +1,125 @@
+package com.qmth.teachcloud.report.business.utils;
+
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+
+/**
+ * @Description: AES对称加密
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+public class AesUtil {
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(AesUtil.class);
+    private static final String AES_MODE = "AES/CBC/PKCS5Padding";
+    private static final String AES = "AES";
+
+
+    private static final String RULE = "123456790abcdefg";
+
+    /**
+     * 加密
+     *
+     * @param content
+     * @param strKey
+     * @param rule
+     * @return
+     * @throws Exception
+     */
+    private static byte[] encrypt(String content, String strKey, String rule) throws Exception {
+        SecretKeySpec skeySpec = getKey(strKey);
+        Cipher cipher = Cipher.getInstance(AES_MODE);
+        IvParameterSpec iv = new IvParameterSpec(rule.getBytes());//AES规则,可自定义,例如A-Z排序
+        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
+        return cipher.doFinal(content.getBytes());
+    }
+
+    /**
+     * 解密
+     *
+     * @param content
+     * @param strKey
+     * @param rule
+     * @return
+     * @throws Exception
+     */
+    private static String decrypt(byte[] content, String strKey, String rule) throws Exception {
+        SecretKeySpec skeySpec = getKey(strKey);
+        Cipher cipher = Cipher.getInstance(AES_MODE);
+        IvParameterSpec iv = new IvParameterSpec(rule.getBytes());//AES规则,可自定义,例如A-Z排序
+        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
+        byte[] original = cipher.doFinal(content);
+        return new String(original);
+    }
+
+    /**
+     * 公钥
+     *
+     * @param strKey
+     * @return
+     * @throws Exception
+     */
+    private static SecretKeySpec getKey(String strKey) throws Exception {
+        byte[] arrBTmp = strKey.getBytes();
+        byte[] arrB = new byte[16]; // 创建一个空的16位字节数组(默认值为0)
+        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
+            arrB[i] = arrBTmp[i];
+        }
+        return new SecretKeySpec(arrB, AES);
+    }
+
+    /**
+     * AES加密
+     *
+     * @param content
+     * @param encryptKey
+     * @return
+     * @throws Exception
+     */
+    public static String encoder(String content, String encryptKey, String rule) throws Exception {
+        if(StringUtils.isEmpty(rule)){
+            rule = RULE;
+        }
+//        LOGGER.info("AES加密前的内容:{},key:{}", content, encryptKey);
+        String encoderText = Base64.getEncoder().encodeToString(encrypt(content, encryptKey, RULE));
+//        LOGGER.info("AES加密后的文本:{}", encoderText);
+        return encoderText;
+    }
+
+    /**
+     * AES解密
+     *
+     * @param encryptStr
+     * @param decryptKey
+     * @return
+     * @throws Exception
+     */
+    public static String decoder(String encryptStr, String decryptKey, String rule) throws Exception {
+        if(StringUtils.isEmpty(rule)){
+            rule = RULE;
+        }
+//        LOGGER.info("AES解密前的内容:{},key:{}", encryptStr, decryptKey);
+        String decoderText = decrypt(Base64.getDecoder().decode(encryptStr), decryptKey, RULE);
+//        LOGGER.info("AES解密后的文本:{}", decoderText);
+        return decoderText;
+    }
+
+    public static void main(String[] args) throws Exception {
+//        String encoder = encoder("2019302130225", "1", null);
+//        System.out.println(encoder);
+//        String decoder = decoder(encoder, "1", null);
+//        System.out.println(decoder);
+
+
+        String encoder = Base64.getEncoder().encodeToString("".getBytes());
+        System.out.println(encoder);
+        String decoder = new String(Base64.getDecoder().decode(encoder));
+        System.out.println(decoder);
+    }
+}

+ 87 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/utils/EncrypAES.java

@@ -0,0 +1,87 @@
+package com.qmth.teachcloud.report.business.utils;
+
+import org.apache.commons.codec.binary.Hex;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author by xf
+ * @date 2019/11/25.
+ * DigestUtils.md5Hex进行md5加密
+ */
+public class EncrypAES {
+
+    private static final Logger logger = LoggerFactory.getLogger(EncrypAES.class);
+
+    private static final String KEY_ALGORITHM = "AES";
+    /**
+     * 加解密算法/工作模式/填充方式
+     */
+    private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
+
+
+    private static byte[] KEYBYTES = {0x31, 0x32, 0x33, 0x34, 0x35, 0x50, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};
+
+
+    /**
+     * 加密
+     * @param value
+     * @return
+     */
+    public static String encrypt(String value) {
+        String s = null;
+        int mode = Cipher.ENCRYPT_MODE;
+        try {
+            Cipher cipher = initCipher(mode);
+            byte[] outBytes = cipher.doFinal(value.getBytes());
+            s = String.valueOf(Hex.encodeHex(outBytes));
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+        return s;
+    }
+
+
+    /**
+     * 解密
+     * @param value
+     * @return
+     */
+    public static String decrypt(String value) {
+        String s = null;
+        int mode = Cipher.DECRYPT_MODE;
+        try {
+            Cipher cipher = initCipher(mode);
+            byte[] outBytes = cipher.doFinal(Hex.decodeHex(value.toCharArray()));
+            s = new String(outBytes);
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+        return s;
+    }
+
+    private static Cipher initCipher(int mode) throws NoSuchAlgorithmException,
+            NoSuchPaddingException, InvalidKeyException {
+        Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
+        Key key = new SecretKeySpec(KEYBYTES, KEY_ALGORITHM);
+        cipher.init(mode, key);
+        return cipher;
+    }
+
+    public static void main(String[] args) {
+        String content = "12019302130225";
+        String en = encrypt(content);
+        System.out.println("en:" + en);
+
+        String de = decrypt(en);
+        System.out.println("de:" + de);
+    }
+
+}

+ 91 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/utils/RandomNameUtil.java

@@ -0,0 +1,91 @@
+package com.qmth.teachcloud.report.business.utils;
+
+import java.util.Random;
+
+/**
+ * @Description: 随机名生成类
+ * @Author: CaoZixuan
+ * @Date: 2022-03-04
+ */
+public class RandomNameUtil {
+    private final static String delimiter = "-";
+
+    public static String getNameInfo() {
+        Random random = new Random();
+        String[] surname = {"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
+                "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
+                "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷",
+                "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和",
+                "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒",
+                "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季"};
+        String girl = "秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽";
+        String boy = "伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘";
+        int index = random.nextInt(surname.length - 1);
+        String name = surname[index]; //获得一个随机的姓氏
+
+        //设置男女比例为1:1
+        int i = random.nextInt(2);
+
+        //设置三字名和双字名比例为2:1
+        int j = random.nextInt(3);
+
+        if(i==1){
+            if (j == 1) {
+                name = "女" + delimiter + name + girl.charAt(random.nextInt(girl.length()));
+            } else {
+
+                name = "女" + delimiter + name + girl.charAt(random.nextInt(girl.length())) + girl.charAt(random.nextInt(girl.length()));
+            }
+
+        }
+        else{
+            if (j == 1) {
+                name = "男" + delimiter + name + boy.charAt(random.nextInt(boy.length()));
+            } else {
+                name = "男" + delimiter + name + boy.charAt(random.nextInt(boy.length())) + boy.charAt(random.nextInt(boy.length()));
+            }
+
+        }
+
+        return name;
+    }
+
+    /**
+     * 只获取名字
+     * @return 名字
+     */
+    public static String getName(){
+        return getNameInfo().split(delimiter)[1];
+    }
+
+    public static void main(String[] args) {
+        int man = 0;
+        int women = 0;
+
+        int three = 0;
+        int two = 0;
+        for (int i = 0; i < 100; i++) {
+            String x = getNameInfo();
+            System.out.println(x);
+            if (x.length() == 5){
+                three ++;
+            }else if (x.length() == 4){
+                two ++;
+            }
+
+            x = x.substring(0,1);
+            if (x.equals("男")){
+                man++;
+            }else {
+                women++;
+            }
+        }
+        System.out.println("男 : " + man);
+        System.out.println("女 : " + women);
+        System.out.println("男比例 :" + man / ((man + women) + 0.00));
+
+        System.out.println("三字名 : " + three);
+        System.out.println("双字名 : " + two);
+        System.out.println("三字名比例 :" + three / ((three + two) + 0.00));
+    }
+}

+ 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>

+ 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 colAvgScoreRate,
+            round(tik.tea_col_avg_score_rate * 100,2) as teaAvgScoreRate
+        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>

+ 5 - 0
teachcloud-report-business/src/main/resources/mapper/TBTeacherMapper.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.TBTeacherMapper">
+
+</mapper>