Pārlūkot izejas kodu

教研分析最新代码合并

wangliang 3 gadi atpakaļ
vecāks
revīzija
7b7792f519
60 mainītis faili ar 2345 papildinājumiem un 739 dzēšanām
  1. 0 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/excel/ExaminationDto.java
  2. 33 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/query/ValidAnswerDetailDto.java
  3. 21 7
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/CellResult.java
  4. 11 11
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/CourseDimensionResult.java
  5. 13 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/DimensionInfoResult.java
  6. 18 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/ExamInfo.java
  7. 18 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/SurveyTeacherViewResult.java
  8. 12 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TAExamCourseCollegeInspectResult.java
  9. 11 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TBStudentReportResult.java
  10. 12 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeachCollegeResult.java
  11. 14 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TeacherMyClassRankResult.java
  12. 41 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAPaperStruct.java
  13. 2 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/filter/MyWebApplicationInitializer.java
  14. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegeInspectMapper.java
  15. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseCollegeTeacherMapper.java
  16. 17 5
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TAExamCourseRecordMapper.java
  17. 11 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBDimensionMapper.java
  18. 2 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBExamStudentMapper.java
  19. 2 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBPaperStructMapper.java
  20. 44 5
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeForReportService.java
  21. 16 26
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java
  22. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegeInspectService.java
  23. 38 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseCollegeTeacherService.java
  24. 17 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TAExamCourseRecordService.java
  25. 10 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBDimensionService.java
  26. 2 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBExamStudentService.java
  27. 10 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBPaperStructService.java
  28. 550 65
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeForReportServiceImpl.java
  29. 2 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/NewCallApiServiceImpl.java
  30. 174 252
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java
  31. 17 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegeInspectServiceImpl.java
  32. 89 5
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseCollegeTeacherServiceImpl.java
  33. 23 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseRecordServiceImpl.java
  34. 5 32
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseServiceImpl.java
  35. 2 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamTotalServiceImpl.java
  36. 5 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBDimensionServiceImpl.java
  37. 10 5
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamCourseServiceImpl.java
  38. 60 16
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamStudentServiceImpl.java
  39. 5 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBPaperStructServiceImpl.java
  40. 7 7
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/execute/AsyncDataCalculateTempleteService.java
  41. 482 154
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/BasicDatasourceController.java
  42. 25 12
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/CourseController.java
  43. 6 10
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/DataDriveController.java
  44. 6 9
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/StudentReportController.java
  45. 24 22
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysController.java
  46. 1 2
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysOrgController.java
  47. 6 1
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysReportController.java
  48. 52 8
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TAExamCourseCollegeTeacherController.java
  49. 4 10
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TBExamStudentController.java
  50. 63 21
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/WudaOpenApiController.java
  51. 1 2
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/aspect/ApiControllerAspect.java
  52. 6 6
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/auth/TeachcloudReportAuthenticationService.java
  53. 12 12
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/SwaggerConfig.java
  54. 1 1
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/interceptor/AuthInterceptor.java
  55. 137 0
      teachcloud-report/src/main/resources/application-demo.properties
  56. 17 15
      teachcloud-report/src/main/resources/application-dev.properties
  57. 1 1
      teachcloud-report/src/main/resources/application-release.properties
  58. 136 0
      teachcloud-report/src/main/resources/application-sdsf.properties
  59. 2 1
      teachcloud-report/src/main/resources/application-test.properties
  60. 0 0
      teachcloud-report/src/main/resources/application.properties

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

@@ -36,7 +36,6 @@ public class ExaminationDto implements Serializable {
     private String teachCollegeName;
 
     @ExcelNote(value = "学分")
-    @NotNull
     private String credit;
 
     @ExcelNote(value = "学号")

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

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

+ 21 - 7
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/CellResult.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.report.business.bean.result;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
@@ -11,6 +12,7 @@ import java.io.Serializable;
  * @Author: wangliang
  * @Date: 2021/6/11
  */
+@JsonInclude(JsonInclude.Include.NON_NULL)
 public class CellResult implements Serializable {
 
     @ApiModelProperty(value = "试卷类型")
@@ -25,8 +27,11 @@ public class CellResult implements Serializable {
     @ApiModelProperty(value = "学校平均分得分率")
     private Double schAvgScoreRate;
 
+    @ApiModelProperty(value = "学校平均分得分率")
+    private Double colAvgScoreRate;
+
     @ApiModelProperty(value = "我的(学院、教师)平均分得分率")
-    private Double myAvgScoreRate;
+    private Double teaAvgScoreRate;
 
     @ApiModelProperty(value = "计数")
     private Integer count;
@@ -35,12 +40,13 @@ public class CellResult implements Serializable {
 
     }
 
-    public CellResult(String paperType, String interpret, String scope, Double schAvgScoreRate, Double myAvgScoreRate, Integer count) {
+    public CellResult(String paperType, String interpret, String scope, Double schAvgScoreRate, Double colAvgScoreRate, Double teaAvgScoreRate, Integer count) {
         this.paperType = paperType;
         this.interpret = interpret;
         this.scope = scope;
         this.schAvgScoreRate = schAvgScoreRate;
-        this.myAvgScoreRate = myAvgScoreRate;
+        this.colAvgScoreRate = colAvgScoreRate;
+        this.teaAvgScoreRate = teaAvgScoreRate;
         this.count = count;
     }
 
@@ -76,12 +82,20 @@ public class CellResult implements Serializable {
         this.schAvgScoreRate = schAvgScoreRate;
     }
 
-    public Double getMyAvgScoreRate() {
-        return myAvgScoreRate;
+    public Double getColAvgScoreRate() {
+        return colAvgScoreRate;
+    }
+
+    public void setColAvgScoreRate(Double colAvgScoreRate) {
+        this.colAvgScoreRate = colAvgScoreRate;
+    }
+
+    public Double getTeaAvgScoreRate() {
+        return teaAvgScoreRate;
     }
 
-    public void setMyAvgScoreRate(Double myAvgScoreRate) {
-        this.myAvgScoreRate = myAvgScoreRate;
+    public void setTeaAvgScoreRate(Double teaAvgScoreRate) {
+        this.teaAvgScoreRate = teaAvgScoreRate;
     }
 
     public Integer getCount() {

+ 11 - 11
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/CourseDimensionResult.java

@@ -44,10 +44,10 @@ public class CourseDimensionResult implements Serializable {
     private Integer totalCount;
 
     @ApiModelProperty(value = "学校比率")
-    private Double schScoreRate;
+    private Double referenceScoreRate;
 
-    @ApiModelProperty(value = "学院比率")
-    private Double colScoreRate;
+    @ApiModelProperty(value = "我的比率")
+    private Double myScoreRate;
 
     @ApiModelProperty(value = "学院名称")
     private String collegeName;
@@ -138,20 +138,20 @@ public class CourseDimensionResult implements Serializable {
         this.totalCount = totalCount;
     }
 
-    public Double getSchScoreRate() {
-        return schScoreRate;
+    public Double getReferenceScoreRate() {
+        return referenceScoreRate;
     }
 
-    public void setSchScoreRate(Double schScoreRate) {
-        this.schScoreRate = schScoreRate;
+    public void setReferenceScoreRate(Double referenceScoreRate) {
+        this.referenceScoreRate = referenceScoreRate;
     }
 
-    public Double getColScoreRate() {
-        return colScoreRate;
+    public Double getMyScoreRate() {
+        return myScoreRate;
     }
 
-    public void setColScoreRate(Double colScoreRate) {
-        this.colScoreRate = colScoreRate;
+    public void setMyScoreRate(Double myScoreRate) {
+        this.myScoreRate = myScoreRate;
     }
 
     public String getCollegeName() {

+ 13 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/DimensionInfoResult.java

@@ -30,6 +30,9 @@ public class DimensionInfoResult implements Serializable {
     @ApiModelProperty(value = "学院得分率")
     private String colScoreRate;
 
+    @ApiModelProperty(value = "教师得分率")
+    private String teaScoreRate;
+
     @ApiModelProperty(value = "难度")
     private Double degree;
 
@@ -37,12 +40,13 @@ public class DimensionInfoResult implements Serializable {
 
     }
 
-    public DimensionInfoResult(String dimensionCode, String dimensionName, String totalCount, String schScoreRate, String colScoreRate, Double degree) {
+    public DimensionInfoResult(String dimensionCode, String dimensionName, String totalCount, String schScoreRate, String colScoreRate, String teaScoreRate, Double degree) {
         this.dimensionCode = dimensionCode;
         this.dimensionName = dimensionName;
         this.totalCount = totalCount;
         this.schScoreRate = schScoreRate;
         this.colScoreRate = colScoreRate;
+        this.teaScoreRate = teaScoreRate;
         this.degree = degree;
     }
 
@@ -106,4 +110,12 @@ public class DimensionInfoResult implements Serializable {
     public void setColScoreRate(String colScoreRate) {
         this.colScoreRate = colScoreRate;
     }
+
+    public String getTeaScoreRate() {
+        return teaScoreRate;
+    }
+
+    public void setTeaScoreRate(String teaScoreRate) {
+        this.teaScoreRate = teaScoreRate;
+    }
 }

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

@@ -1,10 +1,13 @@
 package com.qmth.teachcloud.report.business.bean.result;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @Date: 2021/6/9.
@@ -26,6 +29,9 @@ public class ExamInfo {
     @ApiModelProperty(value = "课程信息")
     private List<CourseInfo> courseInfo;
 
+    @ApiModelProperty(value = "学期(title)")
+    private String semester;
+
     public Long getExamId() {
         return examId;
     }
@@ -65,4 +71,16 @@ public class ExamInfo {
     public void setCourseInfo(List<CourseInfo> courseInfo) {
         this.courseInfo = courseInfo;
     }
+
+    public String getSemester() {
+        if (Objects.nonNull(semester)) {
+            return SemesterEnum.valueOf(semester).getTitle();
+        } else {
+            return null;
+        }
+    }
+
+    public void setSemester(String semester) {
+        this.semester = semester;
+    }
 }

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

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

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

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.report.business.bean.result;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.report.business.entity.TBPaperStruct;
+import com.qmth.teachcloud.report.business.enums.PaperStructJudgeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
@@ -37,6 +38,9 @@ public class TBPaperStructResult extends TBPaperStruct implements Serializable {
     @ApiModelProperty(value = "效度")
     private BigDecimal validity;
 
+    @ApiModelProperty(value = "试卷结构每道题目正确(全对),错误枚举")
+    private PaperStructJudgeEnum paperStructJudge;
+
     public String getMainNumber() {
         return mainNumber;
     }
@@ -92,4 +96,12 @@ public class TBPaperStructResult extends TBPaperStruct implements Serializable {
     public void setValidity(BigDecimal validity) {
         this.validity = validity;
     }
+
+    public PaperStructJudgeEnum getPaperStructJudge() {
+        return paperStructJudge;
+    }
+
+    public void setPaperStructJudge(PaperStructJudgeEnum paperStructJudge) {
+        this.paperStructJudge = paperStructJudge;
+    }
 }

+ 11 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/TBStudentReportResult.java

@@ -48,6 +48,9 @@ public class TBStudentReportResult implements Serializable {
     @ApiModelProperty(value = "是否缺考")
     private Boolean absent;
 
+    @ApiModelProperty(value = "学号(密文)")
+    private String studentCodeEncoder;
+
     public String getCollegeName() {
         return collegeName;
     }
@@ -127,4 +130,12 @@ public class TBStudentReportResult implements Serializable {
     public void setStudentCode(String studentCode) {
         this.studentCode = studentCode;
     }
+
+    public String getStudentCodeEncoder() {
+        return studentCodeEncoder;
+    }
+
+    public void setStudentCodeEncoder(String studentCodeEncoder) {
+        this.studentCodeEncoder = studentCodeEncoder;
+    }
 }

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

@@ -24,6 +24,10 @@ public class TeachCollegeResult {
 
     @ApiModelProperty(value = "科目名称")
     private String courseName;
+
+    @ApiModelProperty(value = "学号(密文)")
+    private String studentCodeEncoder;
+
     @ExcelProperty(name = "课程(代码)", width = 40, index = 3)
     private String courseNameCode;
 
@@ -229,4 +233,12 @@ public class TeachCollegeResult {
     public void setCurrentStr(String currentStr) {
         this.currentStr = currentStr;
     }
+
+    public String getStudentCodeEncoder() {
+        return studentCodeEncoder;
+    }
+
+    public void setStudentCodeEncoder(String studentCodeEncoder) {
+        this.studentCodeEncoder = studentCodeEncoder;
+    }
 }

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

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

+ 41 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TAPaperStruct.java

@@ -5,6 +5,7 @@ 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;
 
@@ -58,6 +59,10 @@ public class TAPaperStruct implements Serializable {
     @TableField(value = "paper_id")
     private Long paperId;
 
+    @ApiModelProperty(value = "试卷类型")
+    @TableField(value = "paper_type")
+    private String paperType;
+
     @ApiModelProperty(value = "大题名称")
     @TableField(value = "question_name")
     private String questionName;
@@ -102,6 +107,10 @@ public class TAPaperStruct implements Serializable {
     @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;
@@ -114,6 +123,10 @@ public class TAPaperStruct implements Serializable {
     @TableField(value = "validity")
     private BigDecimal validity;
 
+    @ApiModelProperty(value = "试卷结构每道题目正确(全对),错误枚举")
+    @TableField(value = "paper_struct_judge")
+    private PaperStructJudgeEnum paperStructJudge;
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -297,4 +310,32 @@ public class TAPaperStruct implements Serializable {
     public void setValidity(BigDecimal validity) {
         this.validity = validity;
     }
+
+    public PaperStructJudgeEnum getPaperStructJudge() {
+        return paperStructJudge;
+    }
+
+    public void setPaperStructJudge(PaperStructJudgeEnum paperStructJudge) {
+        this.paperStructJudge = paperStructJudge;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    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;
+    }
 }

+ 2 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/filter/MyWebApplicationInitializer.java

@@ -34,12 +34,12 @@ public class MyWebApplicationInitializer implements ServletContextInitializer {
 
         FilterRegistration.Dynamic CASFilter = sc.addFilter("CASFilter", AuthenticationFilter.class);
         CASFilter.setInitParameter("casServerLoginUrl", "http://cas.whu.edu.cn/authserver/login");
-        CASFilter.setInitParameter("serverName", "https://wdfx.qmth.com.cn");
+        CASFilter.setInitParameter("serverName", "https://ggjckcjfx.whu.edu.cn");
         CASFilter.addMappingForUrlPatterns(null, false, "/api/report/wuda/open/authentication/*", "/api/report/wuda/open/user/authentication/*");
 
         FilterRegistration.Dynamic CASValidationFilter = sc.addFilter("CAS Validation Filter", Cas20ProxyReceivingTicketValidationFilter.class);
         CASValidationFilter.setInitParameter("casServerUrlPrefix", "http://cas.whu.edu.cn/authserver");
-        CASValidationFilter.setInitParameter("serverName", "https://wdfx.qmth.com.cn");
+        CASValidationFilter.setInitParameter("serverName", "https://ggjckcjfx.whu.edu.cn");
         CASValidationFilter.setInitParameter("encoding", "UTF-8");
         CASValidationFilter.addMappingForUrlPatterns(null, false, "/api/report/wuda/open/authentication/*", "/api/report/wuda/open/user/authentication/*");
 

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

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

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

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.report.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.teachcloud.report.business.bean.result.SurveyTeacherViewResult;
 import com.qmth.teachcloud.report.business.bean.result.TAExamCourseTeacherResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherClassRankResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherMyClassRankResult;
@@ -39,4 +40,16 @@ public interface TAExamCourseCollegeTeacherMapper extends BaseMapper<TAExamCours
     List<TAExamCourseTeacherResult> findTeacherInfo(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("collegeId") Long collegeId);
 
     IPage<TeacherClassRankResult> listTeacherClassRank(@Param("page") Page<TeacherClassRankResult> page, @Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("column") String column, @Param("order") String order);
+
+    /**
+     * 我的课堂考试分析图表接口
+     *
+     * @param schoolId
+     * @param semester
+     * @param examId
+     * @param courseCode
+     * @param inspectCollegeId
+     * @return
+     */
+    SurveyTeacherViewResult teacherView(@Param("schoolId") Long schoolId, @Param("semester") String semester, @Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("inspectCollegeId") Long inspectCollegeId);
 }

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

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

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

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

+ 2 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBExamStudentMapper.java

@@ -82,14 +82,14 @@ public interface TBExamStudentMapper extends BaseMapper<TBExamStudent> {
      * @param schoolId
      * @param examId
      * @param courseCode
-     * @param inspectCollegeId
+     * @param inspectCollegeIdList
      * @param teacherId
      * @param absent
      * @param current
      * @param status
      * @return
      */
-    List<TBExamStudentResult> selectClassList(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("teacherId") Long teacherId, @Param("courseCode") String courseCode, @Param("inspectCollegeId") Long inspectCollegeId, @Param("absent") Boolean absent, @Param("current") Boolean current, @Param("status") String status);
+    List<TBExamStudentResult> selectClassList(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("teacherId") Long teacherId, @Param("courseCode") String courseCode, @Param("inspectCollegeIdList") List<Long> inspectCollegeIdList, @Param("absent") Boolean absent, @Param("current") Boolean current, @Param("status") String status);
 
     /**
      * 开课成绩查询

+ 2 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBPaperStructMapper.java

@@ -25,4 +25,6 @@ public interface TBPaperStructMapper extends BaseMapper<TBPaperStruct> {
      * @return
      */
     List<TBPaperStructResult> findQuestionInfo(@Param("examId") Long examId, @Param("courseCode") String courseCode);
+
+    List<TBPaperStructResult> findQuestionInfoByTeacherCollege(@Param("examId") Long examId,@Param("courseCode") String courseCode,@Param("inspectCollegeId") Long inspectCollegeId,@Param("teacherId") Long teacherId);
 }

+ 44 - 5
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeForReportService.java

@@ -35,8 +35,7 @@ public interface AnalyzeForReportService {
      * @return 结果
      */
     String buildAnalyzeExamCourseCollegeInspect(Long examId, String courseCode);
-
-    // TODO: 2021/6/7 专业
+    
 
     /**
      * 构建考试课程-班级维度的分析表 ’t_a_exam_course_clazz‘
@@ -70,7 +69,7 @@ public interface AnalyzeForReportService {
      * @param courseCode 课程编号
      * @return 结果
      */
-    String AnalyzePointScoreRate(Long examId, String courseCode) throws Exception;
+    String buildAnalyzePointScoreRate(Long examId, String courseCode) throws Exception;
 
     /**
      * 构建考试课程考查学院维度分析表
@@ -90,6 +89,14 @@ public interface AnalyzeForReportService {
      */
     String buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode);
 
+    /**
+     * 构建表't_a_exam_course_teacher_college_dio'表来记录教师在每个授课学院各个考察点的得分率
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeExamCourseTeacherCollegeDio(Long examId,String courseCode);
+
     /**
      * 构建分析试卷结构表 't_a_paper_struct'表
      *
@@ -99,6 +106,30 @@ public interface AnalyzeForReportService {
      */
     String buildAnalyzePaperStruct(Long examId, String courseCode);
 
+    /**
+     * 构建't_a_exam_course_college_paper_struct'表记录各个考察学院下学生的各个题目的难度情况
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeCollegePaperStruct(Long examId,String courseCode);
+
+    /**
+     * 构建't_a_exam_course_teacher_paper_struct'表记录该教师下所教学生的各个题目的难度情况
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeTeacherPaperStruct(Long examId,String courseCode);
+
+    /**
+     * 构建't_a_exam_course_teacher_college_paper_struct'表记录该教师在某学院下所教学生的各个题目的难度情况
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeTeacherCollegePaperStruct(Long examId,String courseCode);
+
     /**
      * 构建科目题目难度分类得分率表 - 学院与学校
      *
@@ -117,6 +148,14 @@ public interface AnalyzeForReportService {
      */
     String buildExamPaperTeacherDifficult(Long examId, String courseCode);
 
+    /**
+     * 构建't_a_exam_course_teacher_college_difficult'表记录该教师在某学院的各难度题作答分析
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @return 结果
+     */
+    String buildAnalyzeExamCourseTeacherCollegeDifficult(Long examId,String courseCode);
+
     /**
      * 构建表 ‘t_a_exam_total’
      *
@@ -164,8 +203,8 @@ public interface AnalyzeForReportService {
     /**
      * 计算前的准备工作 1.计算中状态报错 2.把其他状态改为计算中
      *
-     * @param examId
-     * @param courseCode
+     * @param examId 考试id
+     * @param courseCode 科目编号
      */
     void realityForCalculate(Long examId, String courseCode);
 

+ 16 - 26
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java

@@ -1,11 +1,11 @@
 package com.qmth.teachcloud.report.business.service;
 
-import com.qmth.teachcloud.common.entity.BasicAttachment;
-import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.report.business.bean.result.*;
-import org.springframework.web.multipart.MultipartFile;
+import com.qmth.teachcloud.report.business.entity.TAExamCourse;
+import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.util.List;
 
 /**
@@ -81,14 +81,15 @@ public interface ReportCommonService {
     TeacherInfoListResult findTeacherInfo(Long examId, String courseCode, Long collegeId);
 
     /**
-     * 查找题目信息
-     *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @return
+     * 根据参数查找题目信息
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @param teachCollegeId 开课学院id
+     * @param inspectCollegeId 考察学院id
+     * @param teacherId 授课教师id
+     * @return 结果
      */
-    QuestionListResult findQuestionInfo(Long examId, String courseCode, Long collegeId);
+    QuestionListResult findQuestionInfo(Long examId, String courseCode, Long teachCollegeId,Long inspectCollegeId,Long teacherId);
 
     /**
      * 取总体平均分
@@ -107,23 +108,12 @@ public interface ReportCommonService {
     public void whuLogout() throws IOException;
 
     /**
-     * 保存附件
-     *
-     * @param file
-     * @param md5
-     * @param type
-     * @return
-     */
-    public BasicAttachment saveAttachment(MultipartFile file, String md5, UploadFileEnum type);
-
-    /**
-     * 保存附件公用
+     * 获取开课课程考试课程总览
      *
-     * @param file
-     * @param md5
-     * @param type
-     * @param objId
+     * @param semester
+     * @param examId
+     * @param courseCode
      * @return
      */
-    public BasicAttachment saveAttachmentCommon(MultipartFile file, String md5, UploadFileEnum type, Long objId);
+    TeachCourseSurveyResult getTeachCourseSurveyInfo(SemesterEnum semester, Long examId, String courseCode);
 }

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

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

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

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

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

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

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

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

+ 2 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBExamStudentService.java

@@ -72,12 +72,13 @@ public interface TBExamStudentService extends IService<TBExamStudent> {
      * @param examId
      * @param teacherId
      * @param courseCode
+     * @param inspectCollegeId
      * @param absent
      * @param current
      * @param status
      * @return
      */
-    List<TBExamStudentResult> selectClassList(Long schoolId, Long examId, Long teacherId, String courseCode, Boolean absent, Boolean current, PublishStatusEnum status);
+    List<TBExamStudentResult> selectClassList(Long schoolId, Long examId, Long teacherId, String courseCode,Long inspectCollegeId, Boolean absent, Boolean current, PublishStatusEnum status);
 
     /**
      * 开课成绩查询

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

@@ -24,4 +24,14 @@ public interface TBPaperStructService extends IService<TBPaperStruct> {
      * @return
      */
     List<TBPaperStructResult> findQuestionInfo(Long examId, String courseCode);
+
+    /**
+     * 查找教师学院下试卷结果
+     * @param examId 考试id
+     * @param courseCode 课程编号
+     * @param inspectCollegeId 考察学院id
+     * @param teacherId 授课教师id
+     * @return 结果
+     */
+    List<TBPaperStructResult> findQuestionInfoByTeacherCollege(Long examId,String courseCode,Long inspectCollegeId,Long teacherId);
 }

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 550 - 65
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeForReportServiceImpl.java


+ 2 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/NewCallApiServiceImpl.java

@@ -10,6 +10,7 @@ import com.qmth.teachcloud.common.util.HttpUtil;
 import com.qmth.teachcloud.report.business.entity.TBCloudExam;
 import com.qmth.teachcloud.report.business.service.NewCallApiService;
 import com.qmth.teachcloud.report.business.service.TBCloudExamService;
+import org.apache.commons.lang3.StringEscapeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -64,6 +65,7 @@ public class NewCallApiServiceImpl implements NewCallApiService {
             Long timestamp = System.currentTimeMillis();
             String accessToken = SignatureEntity.build(SignatureType.SECRET, SystemConstant.METHOD, dictionaryConfig.yunMarkDomain().getStudentScoreApi(), timestamp, tbCloudExam.getAccessKey(), tbCloudExam.getAccessSecret());
             String result = HttpUtil.post(url, params, accessToken, timestamp);
+            result = StringEscapeUtils.unescapeHtml4(result);
             if (Objects.nonNull(result)) {
                 if (result.contains("HTTP")) {
                     throw ExceptionResultEnum.ERROR.exception("云阅卷鉴权失败");

+ 174 - 252
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java

@@ -1,50 +1,29 @@
 package com.qmth.teachcloud.report.business.service.impl;
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.Gson;
-import com.itextpdf.text.pdf.PdfReader;
-import com.qmth.boot.api.exception.ApiException;
-import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicAttachment;
-import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.UploadFileEnum;
-import com.qmth.teachcloud.common.service.BasicAttachmentService;
-import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.common.util.JacksonUtil;
-import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.report.business.bean.result.*;
-import com.qmth.teachcloud.report.business.entity.TAExamCourse;
-import com.qmth.teachcloud.report.business.entity.TBDimension;
-import com.qmth.teachcloud.report.business.entity.TBExamCourse;
-import com.qmth.teachcloud.report.business.entity.TBPaper;
-import com.qmth.teachcloud.report.business.enums.GradeScopeEnum;
-import com.qmth.teachcloud.report.business.enums.PiecewiseScopeEnum;
-import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
+import com.qmth.teachcloud.report.business.entity.*;
+import com.qmth.teachcloud.report.business.enums.*;
 import com.qmth.teachcloud.report.business.service.*;
 import com.qmth.teachcloud.report.business.utils.AnalyzeScopeUtil;
 import com.qmth.teachcloud.report.business.utils.MathUtil;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
-import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URLEncoder;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -89,22 +68,19 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     @Resource
     TBExamCourseService tbExamCourseService;
 
-    @Autowired
-    private DictionaryConfig dictionaryConfig;
-
     @Resource
-    BasicAttachmentService basicAttachmentService;
+    TBExamService tbExamService;
 
     @Resource
-    private FileStoreUtil fileStoreUtil;
+    TAExamCourseTeacherCollegeDifficultService taExamCourseTeacherCollegeDifficultService;
 
     /**
      * 学院学科报表查询科目信息
      *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @return
+     * @param examId examId
+     * @param courseCode courseCode
+     * @param collegeId collegeId
+     * @return return
      */
     @Override
     public CourseInfoResult findCourseInfo(Long examId, String courseCode, Long collegeId) {
@@ -123,7 +99,7 @@ public class ReportCommonServiceImpl implements ReportCommonService {
         if (tbPaperList.size() < 1) {
             throw ExceptionResultEnum.NO_DATA.exception();
         }
-        Set<String> paperTypeSet = tbPaperList.stream().map(e -> e.getPaperType()).collect(Collectors.toSet());
+        Set<String> paperTypeSet = tbPaperList.stream().map(TBPaper::getPaperType).collect(Collectors.toSet());
         String paperType = String.join(",", paperTypeSet); // 多种试卷类型的试卷类型合并','号隔开
         Gson gson = new Gson();
         TBPaperInfoResult TBPaperInfoResult = gson.fromJson(gson.toJson(tbPaperList.get(0)), TBPaperInfoResult.class);
@@ -153,10 +129,10 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 学院学科报表科目描述
      *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @return
+     * @param examId examId
+     * @param courseCode courseCode
+     * @param collegeId collegeId
+     * @return return
      */
     @Override
     public CollegeAndSchoolGradeDistributionResult findCourseDistribution(Long examId, String courseCode, Long collegeId) {
@@ -184,27 +160,27 @@ public class ReportCommonServiceImpl implements ReportCommonService {
             double maxValue = Double.parseDouble(String.valueOf(scopeMap.get("maxValue")));
             if ("(".equals(minSign) && ")".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue < e.getAssignedScore().doubleValue() && maxValue > e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue < e.getAssignedScore() && maxValue > e.getAssignedScore()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue < e.getAssignedScore().doubleValue() && maxValue > e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue < e.getAssignedScore() && maxValue > e.getAssignedScore()).count();
 
             } else if ("(".equals(minSign) && "]".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue < e.getAssignedScore().doubleValue() && maxValue >= e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue < e.getAssignedScore() && maxValue >= e.getAssignedScore()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue < e.getAssignedScore().doubleValue() && maxValue >= e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue < e.getAssignedScore() && maxValue >= e.getAssignedScore()).count();
 
             } else if ("[".equals(minSign) && ")".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue <= e.getAssignedScore().doubleValue() && maxValue > e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue <= e.getAssignedScore() && maxValue > e.getAssignedScore()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue <= e.getAssignedScore().doubleValue() && maxValue > e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue <= e.getAssignedScore() && maxValue > e.getAssignedScore()).count();
 
             } else if ("[".equals(minSign) && "]".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue <= e.getAssignedScore().doubleValue() && maxValue >= e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue <= e.getAssignedScore() && maxValue >= e.getAssignedScore()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue <= e.getAssignedScore().doubleValue() && maxValue >= e.getAssignedScore().doubleValue()).count();
+                        .filter(e -> minValue <= e.getAssignedScore() && maxValue >= e.getAssignedScore()).count();
             }
 
             gradeDistributionList.add(new GradeDistributionResult(colCount, schCount, describe));
@@ -225,27 +201,27 @@ public class ReportCommonServiceImpl implements ReportCommonService {
             double maxValue = Double.parseDouble(String.valueOf(scopeMap.get("maxValue")));
             if ("(".equals(minSign) && ")".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue < e.getPercentGrade().doubleValue() && maxValue > e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue < e.getPercentGrade() && maxValue > e.getPercentGrade()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue < e.getPercentGrade().doubleValue() && maxValue > e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue < e.getPercentGrade() && maxValue > e.getPercentGrade()).count();
 
             } else if ("(".equals(minSign) && "]".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue < e.getPercentGrade().doubleValue() && maxValue >= e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue < e.getPercentGrade() && maxValue >= e.getPercentGrade()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue < e.getPercentGrade().doubleValue() && maxValue >= e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue < e.getPercentGrade() && maxValue >= e.getPercentGrade()).count();
 
             } else if ("[".equals(minSign) && ")".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue <= e.getPercentGrade().doubleValue() && maxValue > e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue <= e.getPercentGrade() && maxValue > e.getPercentGrade()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue <= e.getPercentGrade().doubleValue() && maxValue > e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue <= e.getPercentGrade() && maxValue > e.getPercentGrade()).count();
 
             } else if ("[".equals(minSign) && "]".equals(maxSign)) {
                 colCount = (int) examPaperTikForCollege.stream()
-                        .filter(e -> minValue <= e.getPercentGrade().doubleValue() && maxValue >= e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue <= e.getPercentGrade() && maxValue >= e.getPercentGrade()).count();
                 schCount = (int) examPaperTikForSchool.stream()
-                        .filter(e -> minValue <= e.getPercentGrade().doubleValue() && maxValue >= e.getPercentGrade().doubleValue()).count();
+                        .filter(e -> minValue <= e.getPercentGrade() && maxValue >= e.getPercentGrade()).count();
             }
             double colCountRate = MathUtil.formatDouble2(colCount / colTotalCount * 100); //本院比率 保留2位小数
             double schCountRate = MathUtil.formatDouble2(schCount / schTotalCount * 100); //全校比率 保留2位小数
@@ -258,22 +234,22 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 开课学院分数段
      *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @param filter
-     * @return
+     * @param examId examId
+     * @param courseCode courseCode
+     * @param collegeId collegeId
+     * @param filter filter
+     * @return return
      */
     @Override
     public List<SurveyTeacherGradeDistributionResult> surveyTeacherDistribution(Long examId, String courseCode, Long collegeId, boolean filter) {
         List<SurveyTeacherGradeDistributionResult> surveyTeacherGradeDistributionResultList = new ArrayList<>();
-        List<SurveyTeacherDistributionResult> surveyTeacherDistributionResultList = taExamCourseRecordService.surveyTeacherDistribution(examId, courseCode, filter);
+        List<SurveyTeacherDistributionResult> surveyTeacherDistributionResultList = taExamCourseRecordService.surveyTeacherDistribution(examId, courseCode, filter, collegeId);
         if (Objects.isNull(surveyTeacherDistributionResultList) && surveyTeacherDistributionResultList.size() > 0) {
             return null;
         }
         surveyTeacherDistributionResultList = surveyTeacherDistributionResultList.stream().filter(e -> !e.getAbsent()).collect(Collectors.toList());
         //过滤应届
-        List<SurveyTeacherDistributionResult> currentDistributionResultList = surveyTeacherDistributionResultList.stream().filter(e -> e.getStudentCurrent() == true && !e.getAbsent()).collect(Collectors.toList());
+        List<SurveyTeacherDistributionResult> currentDistributionResultList = surveyTeacherDistributionResultList.stream().filter(e -> e.getStudentCurrent() && !e.getAbsent()).collect(Collectors.toList());
         double allTotalCount = surveyTeacherDistributionResultList.size(); // 总体人数
         double currentTotalCount = currentDistributionResultList.size(); // 应届人数
 
@@ -281,7 +257,7 @@ public class ReportCommonServiceImpl implements ReportCommonService {
         for (GradeScopeEnum value : GradeScopeEnum.values()) {
             String describe = value.getDescribe();
             double allCountBefore = 0, allCountAfter = 0, currentCountBefore = 0, currentCountAfter = 0,
-                    allCountRateBefore = 0, allCountRateAfter = 0, currentCountRateBefore = 0, currentCountRateAfter = 0;
+                    allCountRateBefore, allCountRateAfter, currentCountRateBefore, currentCountRateAfter;
 
             Map<String, Object> scopeMap = AnalyzeScopeUtil.analyzeScope(value.getScope());
             String minSign = String.valueOf(scopeMap.get("minSign"));
@@ -337,10 +313,10 @@ public class ReportCommonServiceImpl implements ReportCommonService {
                         .filter(e -> minValue <= e.getAssignedScore().doubleValue() && maxValue >= e.getAssignedScore().doubleValue()).count();
             }
             BigDecimal hundredBig = new BigDecimal("100");
-            allCountRateBefore = allTotalCount > 0 ? new BigDecimal(allCountBefore).multiply(hundredBig).divide(new BigDecimal(allTotalCount), SystemConstant.FINAL_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue() : 0;
-            allCountRateAfter = allTotalCount > 0 ? new BigDecimal(allCountAfter).multiply(hundredBig).divide(new BigDecimal(allTotalCount), SystemConstant.FINAL_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue() : 0;
-            currentCountRateBefore = currentTotalCount > 0 ? new BigDecimal(currentCountBefore).multiply(hundredBig).divide(new BigDecimal(currentTotalCount), SystemConstant.FINAL_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue() : 0;
-            currentCountRateAfter = currentTotalCount > 0 ? new BigDecimal(currentCountAfter).multiply(hundredBig).divide(new BigDecimal(currentTotalCount), SystemConstant.FINAL_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue() : 0;
+            allCountRateBefore = allTotalCount > 0 ? new BigDecimal(allCountBefore).multiply(hundredBig).divide(new BigDecimal(allTotalCount), SystemConstant.FINAL_SCALE, RoundingMode.HALF_UP).doubleValue() : 0;
+            allCountRateAfter = allTotalCount > 0 ? new BigDecimal(allCountAfter).multiply(hundredBig).divide(new BigDecimal(allTotalCount), SystemConstant.FINAL_SCALE, RoundingMode.HALF_UP).doubleValue() : 0;
+            currentCountRateBefore = currentTotalCount > 0 ? new BigDecimal(currentCountBefore).multiply(hundredBig).divide(new BigDecimal(currentTotalCount), SystemConstant.FINAL_SCALE, RoundingMode.HALF_UP).doubleValue() : 0;
+            currentCountRateAfter = currentTotalCount > 0 ? new BigDecimal(currentCountAfter).multiply(hundredBig).divide(new BigDecimal(currentTotalCount), SystemConstant.FINAL_SCALE, RoundingMode.HALF_UP).doubleValue() : 0;
 
             surveyTeacherGradeDistributionResultList.add(new SurveyTeacherGradeDistributionResult((int) Math.abs(allCountBefore), (int) Math.abs(allCountAfter), (int) Math.abs(currentCountBefore), (int) Math.abs(currentCountAfter),
                     allCountRateBefore, allCountRateAfter, currentCountRateBefore, currentCountRateAfter, describe));
@@ -351,46 +327,73 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 学院学科报表查询维度
      *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @param teacherId
-     * @return
+     * @param examId examId
+     * @param courseCode courseCode
+     * @param collegeId collegeId
+     * @param teacherId teacherId
+     * @return return
      */
     @Override
     public DimensionAnalyzeResult findDimensionInfo(Long examId, String courseCode, Long collegeId, Long teacherId) {
+        boolean deanLookCollege = false;
+        boolean deanLookTeacher = false;
+        boolean teacherLookSelf = false;
         //查找维度
         List<CourseDimensionResult> dimensionInfoDatasource = null;
-        if (Objects.isNull(teacherId) || Objects.equals(teacherId, "")) {
+        if (SystemConstant.longNotNull(collegeId) && !SystemConstant.longNotNull(teacherId)) {
+            // 有学院id无教师id -> 开课院长看各考察学院数据
             dimensionInfoDatasource = tbDimensionService.findDimensionInfo(examId, courseCode, collegeId);
-        } else {
+            deanLookCollege = true;
+        } else if (SystemConstant.longNotNull(teacherId) && !SystemConstant.longNotNull(collegeId)) {
+            // 有教师id无学院id -> 开课院长看各授课教师数据
             dimensionInfoDatasource = tbDimensionService.findDimensionByTeacherInfo(examId, courseCode, teacherId);
+            deanLookTeacher = true;
+        } else if (SystemConstant.longNotNull(teacherId) && SystemConstant.longNotNull(collegeId)) {
+            // 既有教师id又有学院id -> 任课教师看某个学院下自己的数据
+            dimensionInfoDatasource = tbDimensionService.findDimensionByTeacherCollegeInfo(examId, courseCode, teacherId, collegeId);
+            teacherLookSelf = true;
         }
 //        if (dimensionInfoDatasource.size() < 1) {
 //            throw ExceptionResultEnum.DATA_ERROR.exception();
 //        }
         List<ModuleDimensionResult> dimensionAnalyzeList = new ArrayList<>();
-        Set<String> moduleSet = dimensionInfoDatasource.stream().map(e -> e.getModule()).collect(Collectors.toSet()); // 考查模块集合
-        for (String module : moduleSet) {
-            List<CourseDimensionResult> dimensionInfoList = dimensionInfoDatasource
-                    .stream().filter(e -> module.equals(e.getModule())).collect(Collectors.toList());
-
-            List<DimensionInfoResult> dioList = new ArrayList<>();
-            List<DimensionInfoResult> batterThanAll = new ArrayList<>(); // 掌握较好
-            List<DimensionInfoResult> worseThanAll = new ArrayList<>(); // 掌握较差
-            for (CourseDimensionResult courseDimensionResult : dimensionInfoList) {
-                String dimensionCode = String.valueOf(courseDimensionResult.getDimensionCode());
-                String dimensionName = String.valueOf(courseDimensionResult.getDimensionName());
-                double schScoreRate = courseDimensionResult.getSchScoreRate();
-                double colScoreRate = courseDimensionResult.getColScoreRate();
-                if (colScoreRate >= schScoreRate) {
-                    batterThanAll.add(new DimensionInfoResult(dimensionCode, dimensionName));
-                } else {
-                    worseThanAll.add(new DimensionInfoResult(dimensionCode, dimensionName));
+        if (dimensionInfoDatasource != null && dimensionInfoDatasource.size() > 0){
+            Set<String> moduleSet = dimensionInfoDatasource.stream().map(CourseDimensionResult::getModule).collect(Collectors.toSet()); // 考查模块集合
+            for (String module : moduleSet) {
+                List<CourseDimensionResult> dimensionInfoList = dimensionInfoDatasource
+                        .stream().filter(e -> module.equals(e.getModule())).collect(Collectors.toList());
+
+                List<DimensionInfoResult> dioList = new ArrayList<>();
+                List<DimensionInfoResult> batterThanAll = new ArrayList<>(); // 掌握较好
+                List<DimensionInfoResult> worseThanAll = new ArrayList<>(); // 掌握较差
+                for (CourseDimensionResult courseDimensionResult : dimensionInfoList) {
+                    String dimensionCode = String.valueOf(courseDimensionResult.getDimensionCode());
+                    String dimensionName = String.valueOf(courseDimensionResult.getDimensionName());
+                    double referenceScoreRate = courseDimensionResult.getReferenceScoreRate();
+                    double myScoreRate = courseDimensionResult.getMyScoreRate();
+                    if (myScoreRate >= referenceScoreRate) {
+                        batterThanAll.add(new DimensionInfoResult(dimensionCode, dimensionName));
+                    } else {
+                        worseThanAll.add(new DimensionInfoResult(dimensionCode, dimensionName));
+                    }
+
+                    String schScoreRate = null;
+                    String colScoreRate = null;
+                    String teaScoreRate = null;
+                    if (deanLookCollege){
+                        schScoreRate = String.valueOf(referenceScoreRate);
+                        colScoreRate = String.valueOf(myScoreRate);
+                    }else if (deanLookTeacher){
+                        schScoreRate = String.valueOf(referenceScoreRate);
+                        teaScoreRate = String.valueOf(myScoreRate);
+                    }else if (teacherLookSelf){
+                        colScoreRate = String.valueOf(referenceScoreRate);
+                        teaScoreRate = String.valueOf(myScoreRate);
+                    }
+                    dioList.add(new DimensionInfoResult(dimensionCode, dimensionName, String.valueOf(courseDimensionResult.getTotalCount()), schScoreRate, colScoreRate, teaScoreRate, courseDimensionResult.getDegree()));
                 }
-                dioList.add(new DimensionInfoResult(dimensionCode, dimensionName, String.valueOf(courseDimensionResult.getTotalCount()), String.valueOf(schScoreRate), String.valueOf(colScoreRate), courseDimensionResult.getDegree()));
+                dimensionAnalyzeList.add(new ModuleDimensionResult(module, dioList, batterThanAll, worseThanAll));
             }
-            dimensionAnalyzeList.add(new ModuleDimensionResult(module, dioList, batterThanAll, worseThanAll));
         }
         return new DimensionAnalyzeResult(dimensionAnalyzeList);
     }
@@ -398,25 +401,32 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 查找题目相关
      *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @param teacherId
-     * @return
+     * @param examId examId
+     * @param courseCode courseCode
+     * @param collegeId collegeId
+     * @param teacherId teacherId
+     * @return return
      */
     @Override
     public QuestionInfoResult findSituationOfQuestions(Long examId, String courseCode, Long collegeId, Long teacherId) {
         //查找答题记录
         List<CellResult> answerDetailDatasource = null;
-        if (Objects.isNull(teacherId) || Objects.equals(teacherId, "")) {
+        if (SystemConstant.longNotNull(collegeId) && !SystemConstant.longNotNull(teacherId)) {
+            // 有学院id无教师id -> 开课院长看各考察学院数据
             answerDetailDatasource = taExamCourseDifficultService.findValidAnswerDetail(examId, courseCode, collegeId);
-        } else {
+        } else if (SystemConstant.longNotNull(teacherId) && !SystemConstant.longNotNull(collegeId)) {
+            // 有教师id无学院id -> 开课院长看各授课教师数据
             answerDetailDatasource = taExamCourseTeacherDifficultService.findValidAnswerDetail(examId, courseCode, teacherId);
+        } else if (SystemConstant.longNotNull(teacherId) && SystemConstant.longNotNull(collegeId)) {
+            // 既有教师id又有学院id -> 任课教师看某个学院下自己的数据
+            answerDetailDatasource = taExamCourseTeacherCollegeDifficultService.findValidAnswerDetail(examId, courseCode, teacherId, collegeId);
         }
-        Set<String> paperTypeList = answerDetailDatasource.stream().map(e -> e.getPaperType()).collect(Collectors.toSet());
         List<PaperTypeResult> questionInfoList = new ArrayList<>();
-        for (String paperType : paperTypeList) {
-            questionInfoList.add(new PaperTypeResult(paperType, answerDetailDatasource.stream().filter(e -> Objects.equals(paperType, e.getPaperType())).collect(Collectors.toList())));
+        if (answerDetailDatasource != null && answerDetailDatasource.size() > 0){
+            Set<String> paperTypeList = answerDetailDatasource.stream().map(CellResult::getPaperType).collect(Collectors.toSet());
+            for (String paperType : paperTypeList) {
+                questionInfoList.add(new PaperTypeResult(paperType, answerDetailDatasource.stream().filter(e -> Objects.equals(paperType, e.getPaperType())).collect(Collectors.toList())));
+            }
         }
         return new QuestionInfoResult(questionInfoList);
     }
@@ -424,10 +434,10 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 查找老师信息
      *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @return
+     * @param examId examId
+     * @param courseCode courseCode
+     * @param collegeId collegeId
+     * @return return
      */
     @Override
     public TeacherInfoListResult findTeacherInfo(Long examId, String courseCode, Long collegeId) {
@@ -442,37 +452,50 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 查找题目信息
      *
-     * @param examId
-     * @param courseCode
-     * @param collegeId
-     * @return
+     * @param examId           考试id
+     * @param courseCode       课程编号
+     * @param teachCollegeId   开课学院id
+     * @param inspectCollegeId 考察学院id
+     * @param teacherId        授课教师id
+     * @return 结果
      */
     @Override
-    public QuestionListResult findQuestionInfo(Long examId, String courseCode, Long collegeId) {
+    public QuestionListResult findQuestionInfo(Long examId, String courseCode, Long teachCollegeId, Long inspectCollegeId, Long teacherId) {
         //查找试卷结构
-        List<TBPaperStructResult> questionDatasource = tbPaperStructService.findQuestionInfo(examId, courseCode);
+        List<TBPaperStructResult> questionDatasource;
+        if (SystemConstant.longNotNull(inspectCollegeId) && SystemConstant.longNotNull(teacherId)) {
+            // 教师课堂查询 -> 教师在某课程学院下学生数据集
+            questionDatasource = tbPaperStructService.findQuestionInfoByTeacherCollege(examId, courseCode, inspectCollegeId, teacherId);
+        } else {
+            // 开课学院和考察学院查询 -> 全校学生某课程数据集
+            questionDatasource = tbPaperStructService.findQuestionInfo(examId, courseCode);
+        }
         //查找维度
         QueryWrapper<TBDimension> tbDimensionQueryWrapper = new QueryWrapper<>();
         tbDimensionQueryWrapper.lambda().eq(TBDimension::getExamId, examId)
                 .eq(TBDimension::getCourseCode, courseCode);
         List<TBDimension> dimensionDataSource = tbDimensionService.list(tbDimensionQueryWrapper);
 
-        Set<String> paperTypeSet = questionDatasource.stream().map(e -> e.getPaperType()).collect(Collectors.toSet());
+        Set<String> paperTypeSet = questionDatasource.stream().map(TBPaperStructResult::getPaperType).collect(Collectors.toSet());
         List<QuestionResult> questionList = new ArrayList<>();
         for (String paperType : paperTypeSet) {
+            // 考题
             List<TBPaperStructResult> cellList = questionDatasource.stream()
                     .filter(e -> paperType.equals(e.getPaperType())).collect(Collectors.toList());
 
             for (TBPaperStructResult cell : cellList) {
                 cell.setPaperType(null);
             }
-
             Set<String> knowledgeDimensionSet = new HashSet<>(), abilityDimensionSet = new HashSet<>();
-            for (TBPaperStructResult cell : cellList) {
-                String knowledgeDimension = cell.getKnowledgeDimension();
-                String[] arr = knowledgeDimension.split(",");
-                knowledgeDimensionSet.addAll(Arrays.asList(arr));
-
+            // 错题
+            List<TBPaperStructResult> errorCellList = cellList.stream().filter(e -> PaperStructJudgeEnum.NOT_QUITE_RIGHT.equals(e.getPaperStructJudge())).collect(Collectors.toList());
+            // 获取考察点集合
+            for (TBPaperStructResult cell : errorCellList) {
+                if (Objects.nonNull(cell.getKnowledgeDimension())) {
+                    String knowledgeDimension = cell.getKnowledgeDimension();
+                    String[] arr = knowledgeDimension.split(",");
+                    knowledgeDimensionSet.addAll(Arrays.asList(arr));
+                }
                 if (Objects.nonNull(cell.getAbilityDimension())) {
                     String abilityDimension = cell.getAbilityDimension();
                     String[] arrAbilityDimension = abilityDimension.split(",");
@@ -484,14 +507,14 @@ public class ReportCommonServiceImpl implements ReportCommonService {
 
             List<DimensionInfoResult> dimensionList = new ArrayList<>();
             for (String dimensionCode : knowledgeDimensionSort) {
-                String dimensionName = "";
+                String dimensionName;
                 List<String> nameTwoList = dimensionDataSource.stream()
                         .filter(e -> dimensionCode.equals(e.getCodeSecond()))
-                        .map(e -> e.getNameSecond()).collect(Collectors.toList());
+                        .map(TBDimension::getNameSecond).collect(Collectors.toList());
                 if (nameTwoList.size() < 1) {
                     List<String> tmpList = dimensionDataSource.stream()
                             .filter(e -> dimensionCode.equals(e.getCodePrimary()))
-                            .map(e -> e.getNamePrimary()).collect(Collectors.toList());
+                            .map(TBDimension::getNamePrimary).collect(Collectors.toList());
                     if (tmpList.size() == 0) {
                         continue;
                     }
@@ -504,14 +527,14 @@ public class ReportCommonServiceImpl implements ReportCommonService {
 
             List<DimensionInfoResult> abilityDimensionList = new ArrayList<>();
             for (String dimensionCode : abilityDimensionSort) {
-                String dimensionName = "";
+                String dimensionName;
                 List<String> nameTwoList = dimensionDataSource.stream()
                         .filter(e -> dimensionCode.equals(e.getCodeSecond()))
-                        .map(e -> e.getNameSecond()).collect(Collectors.toList());
+                        .map(TBDimension::getNameSecond).collect(Collectors.toList());
                 if (nameTwoList.size() < 1) {
                     List<String> tmpList = dimensionDataSource.stream()
                             .filter(e -> dimensionCode.equals(e.getCodePrimary()))
-                            .map(e -> e.getNamePrimary()).collect(Collectors.toList());
+                            .map(TBDimension::getNamePrimary).collect(Collectors.toList());
                     if (tmpList.size() == 0) {
                         continue;
                     }
@@ -529,11 +552,11 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 取总体平均分
      *
-     * @param schoolId
-     * @param courseCode
-     * @param examId
-     * @param filter
-     * @return
+     * @param schoolId schoolId
+     * @param courseCode courseCode
+     * @param examId examId
+     * @param filter filter
+     * @return 结果
      */
     @Override
     public SurveyTeacherExamCourseResult findAvgScore(Long schoolId, String courseCode, Long examId, boolean filter) {
@@ -585,135 +608,34 @@ public class ReportCommonServiceImpl implements ReportCommonService {
         }
         String casLogoutURL = "http://cas.whu.edu.cn/authserver/logout";
         // service后面带的参数为应用的访问地址,需要使用URLEncoder进行编码
-        String redirectURL = casLogoutURL + "?service=" + URLEncoder.encode("http://cas.whu.edu.cn/authserver/login", SystemConstant.CHARSET_NAME);
+        String redirectURL = casLogoutURL + "?service=" + URLEncoder.encode("https://ggjckcjfx.whu.edu.cn/api/report/wuda/open/user/authentication", SystemConstant.CHARSET_NAME);
         response.setHeader("Access-Control-Allow-Origin", "*");
         response.sendRedirect(redirectURL);
     }
 
     /**
-     * 保存附件
+     * 获取开课课程考试课程总览
      *
-     * @param file
-     * @param md5
-     * @param type
-     * @return
+     * @param semester semester
+     * @param examId examId
+     * @param courseCode courseCode
+     * @return return
      */
     @Override
-    @Transactional
-    public BasicAttachment saveAttachment(MultipartFile file, String md5, UploadFileEnum type) {
-        return saveAttachmentCommon(file, md5, type, null);
-    }
-
-    /**
-     * 保存附件公用
-     *
-     * @param file
-     * @param md5
-     * @param type
-     * @param objId
-     * @return
-     */
-    @Override
-    public BasicAttachment saveAttachmentCommon(MultipartFile file, String md5, UploadFileEnum type, Long objId) {
-        if (Objects.isNull(type)) {
-            throw ExceptionResultEnum.ATTACHMENT_TYPE_EMPTY.exception();
-        }
-        BasicAttachment basicAttachment = null;
-        try {
-            // TODO: 2022/4/14 临时测试生成user
-//            SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-            SysUser requestUser = new SysUser();
-            requestUser.setId(1L);
-
-
-            int temp = file.getOriginalFilename().lastIndexOf(".");
-            String fileName = file.getOriginalFilename().substring(0, temp);
-            String format = file.getOriginalFilename().substring(temp, file.getOriginalFilename().length());
-            List<String> attachmentTypeList = dictionaryConfig.sysDomain().getAttachmentType();
-            if (Objects.nonNull(format)) {
-                long count = attachmentTypeList.stream().filter(s -> format.equalsIgnoreCase(s)).count();
-                if (count == 0) {
-                    throw ExceptionResultEnum.ERROR.exception("文件格式只能为" + attachmentTypeList.toString());
-                }
-            }
-            int attachmentLength = dictionaryConfig.sysDomain().getAttachmentLength().intValue();
-            if (Objects.nonNull(fileName) && fileName.length() > attachmentLength) {
-                throw ExceptionResultEnum.ERROR.exception("文件名长度不能超过" + attachmentLength + "个字符");
-            }
-            long size = file.getSize();
-            BigDecimal b = new BigDecimal(size);
-            BigDecimal num = new BigDecimal(1024);
-            b = b.divide(num, 2, BigDecimal.ROUND_HALF_UP).divide(num, 2, BigDecimal.ROUND_HALF_UP)
-                    .setScale(2, BigDecimal.ROUND_HALF_UP);
-            double attachmentSize = dictionaryConfig.sysDomain().getAttachmentSize().doubleValue();
-            if (b.doubleValue() > attachmentSize) {
-                throw ExceptionResultEnum.ERROR.exception("文件大小不能超过" + attachmentSize + "MB");
-            }
-            log.info("fileName:{}", fileName);
-            log.info("format:{}", format);
-            log.info("size:{}", b);
-            log.info("getOriginalFilename:{}", file.getOriginalFilename());
-            String fileMd5 = DigestUtils.md5Hex(file.getBytes());
-            log.info("fileMd5:{}", fileMd5);
-            log.info("md5:{}", md5);
-            if (!Objects.equals(fileMd5, md5)) {
-                throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
-            }
-            boolean oss = dictionaryConfig.sysDomain().isOss();
-            LocalDateTime nowTime = LocalDateTime.now();
-            StringJoiner stringJoiner = new StringJoiner("");
-            if (!oss) {
-                stringJoiner.add(SystemConstant.TEMP_FILES_DIR).add(File.separator);
-            }
-            stringJoiner.add(type.getTitle()).add(File.separator);
-//            else if (type == UploadFileEnum.PAPER) {//试卷需要单独
-//                stringJoiner.add(type.getTitle()).add(File.separator);
-//            } else if (type == UploadFileEnum.UPLOAD) {
-//                stringJoiner.add(type.getTitle()).add(File.separator);
-//            }
-            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
-                    .add(String.format("%02d", nowTime.getDayOfMonth()));
-
-            JSONObject jsonObject = new JSONObject();
-            stringJoiner.add(File.separator).add(SystemConstant.getUuid()).add(format);
-            if (oss) {//上传至oss\
-                String dirName = stringJoiner.toString().replaceAll("\\\\", "/");
-                fileStoreUtil.ossUpload(dirName, file.getInputStream(), md5, type.getFssType());
-
-                jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
-                jsonObject.put(SystemConstant.PATH, dirName);
-            } else {//上传至服务器
-                File finalFile = new File(stringJoiner.toString());
-                if (!finalFile.exists()) {
-                    finalFile.getParentFile().mkdirs();
-                    finalFile.createNewFile();
-                }
-                FileUtils.copyInputStreamToFile(file.getInputStream(), finalFile);
-                jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
-                jsonObject.put(SystemConstant.PATH, stringJoiner.toString());
-            }
-            jsonObject.put(SystemConstant.UPLOAD_TYPE, type);
-
-            basicAttachment = new BasicAttachment(jsonObject.toJSONString(), fileName, format, b, fileMd5, requestUser.getId(), objId);
-            basicAttachmentService.save(basicAttachment);
-
-            // pdf需要读取总页数
-            Integer pages = 0;
-            if (".pdf".equals(format)) {
-                PdfReader pdfReader = new PdfReader(file.getBytes());
-                pages = pdfReader.getNumberOfPages();
-            }
-            basicAttachment.setPages(pages);
-        } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-            basicAttachmentService.deleteAttachment(basicAttachment);
-            if (e instanceof ApiException) {
-                ResultUtil.error((ApiException) e, e.getMessage());
-            } else {
-                ResultUtil.error(e.getMessage());
-            }
-        }
-        return basicAttachment;
+    public TeachCourseSurveyResult getTeachCourseSurveyInfo(SemesterEnum semester, Long examId, String courseCode) {
+        TBExam tbExam = tbExamService.getById(examId);
+        TAExamCourse taExamCourse = taExamCourseService.getOne(new QueryWrapper<TAExamCourse>().lambda().eq(TAExamCourse::getExamId, examId).eq(TAExamCourse::getCourseCode, courseCode));
+        TeachCourseSurveyResult teachCourseSurveyResult = new TeachCourseSurveyResult();
+        teachCourseSurveyResult.setExamTime(tbExam.getExamTime());
+        teachCourseSurveyResult.setCourseCode(taExamCourse.getCourseCode());
+        teachCourseSurveyResult.setCourseName(taExamCourse.getCourseName());
+        teachCourseSurveyResult.setFullScore(taExamCourse.getTotalScore());
+        teachCourseSurveyResult.setRealityCount(taExamCourse.getRealityCount());
+        teachCourseSurveyResult.setInspectCollegeCount(taExamCourse.getInspectCollegeCount());
+        teachCourseSurveyResult.setAbsentCount(taExamCourse.getAbsentCount());
+        teachCourseSurveyResult.setCoefficient(taExamCourse.getCoefficient());
+        teachCourseSurveyResult.setTeachCollegeName(taExamCourse.getTeachCollegeName());
+        teachCourseSurveyResult.setInspectCollegeNames(taExamCourse.getInspectCollegeNames());
+        return teachCourseSurveyResult;
     }
 }

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

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

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

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

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

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

+ 5 - 32
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamCourseServiceImpl.java

@@ -125,7 +125,7 @@ public class TAExamCourseServiceImpl extends ServiceImpl<TAExamCourseMapper, TAE
         List<GradeDistributeResult> gradeDistributeResultList = new ArrayList<>();//全体卷面成绩
         List<GradeDistributePaperResult> gradeDistributePaperResultList = new ArrayList<>();//全体赋分成绩
         List<GradeDistributeCurrentAssignedResult> gradeDistributeCurrentAssignedResultList = new ArrayList<>();//应届赋分成绩
-        List<SurveyTeacherGradeDistributionResult> surveyTeacherGradeDistributionResultList = reportCommonService.surveyTeacherDistribution(examId, courseCode, sysUser.getOrgId(), true);
+        List<SurveyTeacherGradeDistributionResult> surveyTeacherGradeDistributionResultList = reportCommonService.surveyTeacherDistribution(examId, courseCode, null, true);
         if (Objects.nonNull(surveyTeacherGradeDistributionResultList) && surveyTeacherGradeDistributionResultList.size() > 0) {
             for (SurveyTeacherGradeDistributionResult s : surveyTeacherGradeDistributionResultList) {
                 String describe = String.join(",", s.getDescribe());
@@ -161,7 +161,7 @@ public class TAExamCourseServiceImpl extends ServiceImpl<TAExamCourseMapper, TAE
         //查找老师得分
         TeacherInfoListResult teacherInfoListResult = reportCommonService.findTeacherInfo(examId, courseCode, collegeId);
         //查找题目信息
-        QuestionListResult questionListResult = reportCommonService.findQuestionInfo(examId, courseCode, collegeId);
+        QuestionListResult questionListResult = reportCommonService.findQuestionInfo(examId, courseCode, null,null,null);
 
         return new CollegeAndCourseResult(courseInfoResult, collegeAndSchoolGradeDistributionResult, dimensionAnalyzeResult,
                 questionInfoResult, teacherInfoListResult, questionListResult);
@@ -181,15 +181,15 @@ public class TAExamCourseServiceImpl extends ServiceImpl<TAExamCourseMapper, TAE
     @Cacheable(value = SystemConstant.SURVEY_TEACHER_VIEW_REPORT, key = "#schoolId + '-' + #semester + '-' + #examId + '-' + #courseCode + '-' + #collegeId")
     public SurveyTeacherViewResult surveyTeacherView(Long schoolId, SemesterEnum semester, Long examId, String courseCode, Long collegeId) {
         // 考试概况
-        TeachCourseSurveyResult teachCourseSurveyResult = this.getTeachCourseSurveyInfo(semester, examId, courseCode);
+        TeachCourseSurveyResult teachCourseSurveyResult = reportCommonService.getTeachCourseSurveyInfo(semester, examId, courseCode);
 
         //取总体和应届平均分
         SurveyTeacherExamCourseResult surveyTeacherExamCourseResult = reportCommonService.findAvgScore(schoolId, courseCode, examId, false);
 
         //学院学科报表科目描述
-        List<SurveyTeacherGradeDistributionResult> surveyTeacherGradeDistributionResultList = reportCommonService.surveyTeacherDistribution(examId, courseCode, collegeId, false);
+        List<SurveyTeacherGradeDistributionResult> surveyTeacherGradeDistributionResultList = reportCommonService.surveyTeacherDistribution(examId, courseCode, null, false);
         //查找题目信息
-        QuestionListResult questionListResult = reportCommonService.findQuestionInfo(examId, courseCode, collegeId);
+        QuestionListResult questionListResult = reportCommonService.findQuestionInfo(examId, courseCode, null,null,null);
         return new SurveyTeacherViewResult(surveyTeacherGradeDistributionResultList, questionListResult, surveyTeacherExamCourseResult, teachCourseSurveyResult);
     }
 
@@ -373,31 +373,4 @@ public class TAExamCourseServiceImpl extends ServiceImpl<TAExamCourseMapper, TAE
         List<Collection<?>> collectionList = Arrays.asList(teachCollegeResultIPage.getRecords(), gradeDistributeFinalResult.getPaperGrades(), gradeDistributeFinalResult.getGrades(), gradeDistributeFinalResult.getCurrentAssignedGrades(), teacherClassRankResultIPage.getRecords());
         ExcelUtil.excelExportBatchSheet("课程分析", sheetList, classList, collectionList, ServletUtil.getResponse());
     }
-
-
-    /**
-     * 获取开课课程考试课程总览
-     *
-     * @param semester   学期
-     * @param examId     考试id
-     * @param courseCode 课程编号
-     * @return 结果
-     */
-    private TeachCourseSurveyResult getTeachCourseSurveyInfo(SemesterEnum semester, Long examId, String courseCode) {
-        TBExam tbExam = tbExamService.getById(examId);
-
-        TAExamCourse taExamCourse = this.getOne(new QueryWrapper<TAExamCourse>().lambda().eq(TAExamCourse::getExamId, examId).eq(TAExamCourse::getCourseCode, courseCode));
-        TeachCourseSurveyResult teachCourseSurveyResult = new TeachCourseSurveyResult();
-        teachCourseSurveyResult.setExamTime(tbExam.getExamTime());
-        teachCourseSurveyResult.setCourseCode(taExamCourse.getCourseCode());
-        teachCourseSurveyResult.setCourseName(taExamCourse.getCourseName());
-        teachCourseSurveyResult.setFullScore(taExamCourse.getTotalScore());
-        teachCourseSurveyResult.setRealityCount(taExamCourse.getRealityCount());
-        teachCourseSurveyResult.setInspectCollegeCount(taExamCourse.getInspectCollegeCount());
-        teachCourseSurveyResult.setAbsentCount(taExamCourse.getAbsentCount());
-        teachCourseSurveyResult.setCoefficient(taExamCourse.getCoefficient());
-        teachCourseSurveyResult.setTeachCollegeName(taExamCourse.getTeachCollegeName());
-        teachCourseSurveyResult.setInspectCollegeNames(taExamCourse.getInspectCollegeNames());
-        return teachCourseSurveyResult;
-    }
 }

+ 2 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TAExamTotalServiceImpl.java

@@ -69,7 +69,8 @@ public class TAExamTotalServiceImpl extends ServiceImpl<TAExamTotalMapper, TAExa
     @Override
     public void exportCourseSummary(SemesterEnum semester, Long examId, String column, OrderEnum order) throws Exception {
         IPage<TAExamCourse> taExamCourseIPage = this.getCourseSummary(semester, examId, SystemConstant.PAGE_NUMBER, SystemConstant.PAGE_SIZE, column, order);
-        List<TAExamCourseDto> examStudentCourseDtoList = new Gson().fromJson(JacksonUtil.parseJson(taExamCourseIPage.getRecords()), new TypeToken<List<TAExamCourseDto>>() {
+        Gson gson = new Gson();
+        List<TAExamCourseDto> examStudentCourseDtoList = gson.fromJson(JacksonUtil.parseJson(taExamCourseIPage.getRecords()), new TypeToken<List<TAExamCourseDto>>() {
         }.getType());
         ExcelUtil.excelExport("课程分析", TAExamCourseDto.class, examStudentCourseDtoList, ServletUtil.getResponse());
     }

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

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

+ 10 - 5
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamCourseServiceImpl.java

@@ -9,7 +9,7 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
-import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.service.CacheService;
 import com.qmth.teachcloud.common.service.SysOrgService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.report.business.bean.result.TBExamCourseResult;
@@ -24,7 +24,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -51,7 +54,7 @@ public class TBExamCourseServiceImpl extends ServiceImpl<TBExamCourseMapper, TBE
     TBExaminationRelationService tbExaminationRelationService;
 
     @Resource
-    CommonCacheService commonCacheService;
+    CacheService cacheService;
 
     @Override
     public boolean verifyExamCourseCantRun(Long examId, Long schoolId, String courseCode, String courseName) {
@@ -124,7 +127,7 @@ public class TBExamCourseServiceImpl extends ServiceImpl<TBExamCourseMapper, TBE
     public List<TBExamCourseResult> findCourseList(Long schoolId, Long examId, boolean inspect, Boolean absent, Boolean current, PublishStatusEnum status) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         List<Long> collegeIds = sysOrgService.findCollegeIds(sysUser.getOrgId());
-        AuthBean authBean = commonCacheService.userAuthCache(sysUser.getId());
+        AuthBean authBean = cacheService.userAuthCache(sysUser.getId());
         //院长开课学院不过滤,学校管理员不过滤,(院长考查学院过滤,教务老师过滤)
         boolean filter = true;
         if (Objects.nonNull(authBean) && Objects.nonNull(authBean.getRoleList()) && authBean.getRoleList().get(0).getType() == RoleTypeEnum.SCHOOL_ADMIN) {
@@ -135,6 +138,9 @@ public class TBExamCourseServiceImpl extends ServiceImpl<TBExamCourseMapper, TBE
         if (Objects.nonNull(collegeIds) && collegeIds.size() > 0) {
             return tbExamCourseMapper.findCourseList(schoolId, examId, inspect, collegeIds, filter, absent, current, Objects.nonNull(status) ? status.name() : null);
         } else {
+            // TODO: 2022/1/8 临时针对考察学院的考察课程考试分析的更改要之后要前端配合改
+            absent = false;
+            current = true;
             return tbExamCourseMapper.findCourseList(schoolId, examId, inspect, Objects.nonNull(sysUser.getOrgId()) ? Arrays.asList(sysUser.getOrgId()) : null, filter, absent, current, Objects.nonNull(status) ? status.name() : null);
         }
     }
@@ -159,7 +165,6 @@ public class TBExamCourseServiceImpl extends ServiceImpl<TBExamCourseMapper, TBE
                 .eq(TBExamCourse::getExamId, examId)
                 .eq(TBExamCourse::getSchoolId, schoolId)
                 .eq(TBExamCourse::getCourseCode, courseCode)
-                .eq(TBExamCourse::getCourseName, courseName)
                 .eq(TBExamCourse::getExaminationCourseCode, examinationCourseCode));
         if (tbExamCourseList.size() > 0) {
             throw ExceptionResultEnum.ERROR.exception("考试课程已存在");

+ 60 - 16
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBExamStudentServiceImpl.java

@@ -10,12 +10,14 @@ import com.google.common.collect.Lists;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
+import com.qmth.teachcloud.common.entity.SysRole;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
-import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.service.CacheService;
 import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.service.SysRoleService;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
@@ -27,8 +29,13 @@ import com.qmth.teachcloud.report.business.enums.OrderEnum;
 import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.mapper.*;
+import com.qmth.teachcloud.report.business.service.TAExamCourseRecordDioService;
 import com.qmth.teachcloud.report.business.service.TBExamStudentService;
+import com.qmth.teachcloud.report.business.utils.EncrypAES;
 import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
@@ -87,7 +94,12 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
     SysOrgService sysOrgService;
 
     @Resource
-    CommonCacheService commonCacheService;
+    CacheService cacheService;
+
+    @Resource
+    TAExamCourseRecordDioService taExamCourseRecordDioService;
+
+    private final static Logger log = LoggerFactory.getLogger(TBExamStudentServiceImpl.class);
 
     /**
      * 查询开课学院列表
@@ -119,7 +131,7 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
     @Override
     public List<TBExamStudentResult> selectInspectCollegeList(Long schoolId, Long examId, String courseCode, Boolean absent, Boolean current, PublishStatusEnum status) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        AuthBean authBean = commonCacheService.userAuthCache(sysUser.getId());
+        AuthBean authBean = cacheService.userAuthCache(sysUser.getId());
         if (Objects.nonNull(authBean) && Objects.nonNull(authBean.getRoleList()) && authBean.getRoleList().get(0).getType() == RoleTypeEnum.TEACHER) {
             List<Long> collegeIds = sysOrgService.findCollegeIds(sysUser.getOrgId());
             if (Objects.nonNull(collegeIds) && collegeIds.size() > 0) {
@@ -162,9 +174,15 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
      * @return
      */
     @Override
-    public List<TBExamStudentResult> selectClassList(Long schoolId, Long examId, Long teacherId, String courseCode, Boolean absent, Boolean current, PublishStatusEnum status) {
+    public List<TBExamStudentResult> selectClassList(Long schoolId, Long examId, Long teacherId, String courseCode,Long inspectCollegeId, Boolean absent, Boolean current, PublishStatusEnum status) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        return tbExamStudentMapper.selectClassList(schoolId, examId, teacherId, courseCode, sysUser.getOrgId(), absent, current, Objects.nonNull(status) ? status.name() : null);
+        List<Long> orgIdList = new ArrayList<>();
+        if (inspectCollegeId != null && inspectCollegeId > 0){
+            orgIdList.add(inspectCollegeId);
+        }else {
+            orgIdList = sysOrgService.findCollegeIds(sysUser.getOrgId());
+        }
+        return tbExamStudentMapper.selectClassList(schoolId, examId, teacherId, courseCode, orgIdList, absent, current, Objects.nonNull(status) ? status.name() : null);
     }
 
     @Override
@@ -179,6 +197,11 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
         } else {
             listPage = tbExamStudentMapper.listTeachCollegeResult(new Page<>(pageNumber, pageSize), schoolId, Objects.nonNull(semester) ? semester.name() : null, examId, courseCode, current, inspectCollegeId, orgId, teacherId, studentParam, Objects.nonNull(sysUser.getOrgId()) ? Arrays.asList(sysUser.getOrgId()) : null, column, Objects.nonNull(order) ? order.name() : null);
         }
+        List<TeachCollegeResult> teachCollegeResultList = listPage.getRecords();
+        for (TeachCollegeResult teachCollegeResult : teachCollegeResultList) {
+            String code = teachCollegeResult.getStudentCode();
+            teachCollegeResult.setStudentCodeEncoder(EncrypAES.encrypt(code));
+        }
         return listPage;
     }
 
@@ -285,7 +308,13 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
         if (schoolId == null) {
             schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         }
-        return tbExamStudentMapper.reportList(iPage, schoolId, examId, collegeId, courseCode, clazzId, absent, studentCode);
+        IPage<TBStudentReportResult> page = tbExamStudentMapper.reportList(iPage, schoolId, examId, collegeId, courseCode, clazzId, absent, studentCode);
+        List<TBStudentReportResult> tbStudentReportResultList = page.getRecords();
+        for (TBStudentReportResult tbStudentReportResult : tbStudentReportResultList) {
+            String code = tbStudentReportResult.getStudentCode();
+            tbStudentReportResult.setStudentCodeEncoder(EncrypAES.encrypt(code));
+        }
+        return page;
     }
 
     /**
@@ -304,18 +333,19 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
         // 考生信息
         StudentInfo studentInfo = tbStudentMapper.getStudentBySchoolIdAndStudentCode(schoolId, studentCode);
         if (Objects.isNull(studentInfo)) {
-            throw ExceptionResultEnum.ERROR.exception("未找到此考生信息");
+            studentInfo = new StudentInfo();
         }
         reportResult.setStudentInfo(studentInfo);
 
         //考试信息
         List<ExamInfo> examInfo = tbExamStudentMapper.listExamBySchoolIdAndStudentCode(schoolId, studentCode);
         if (Objects.isNull(examInfo) || examInfo.size() == 0) {
-            throw ExceptionResultEnum.ERROR.exception("未找到此考生的考试信息");
-        }
-        for (ExamInfo info : examInfo) {
-            List<CourseInfo> courseInfos = tbExamStudentMapper.listCourseByExamIdAndStudentCode(schoolId, info.getExamId(), studentCode);
-            info.setCourseInfo(courseInfos);
+            examInfo = new ArrayList<>();
+        }else {
+            for (ExamInfo info : examInfo) {
+                List<CourseInfo> courseInfos = tbExamStudentMapper.listCourseByExamIdAndStudentCode(schoolId, info.getExamId(), studentCode);
+                info.setCourseInfo(courseInfos);
+            }
         }
         reportResult.setExamInfo(examInfo);
         return reportResult;
@@ -336,10 +366,12 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
         personalReportResult.setStudent(examStudentResult);
 
         // 学院信息
+        long s = System.currentTimeMillis();
         CollegeResult collegeResult = buildCollegeResult(schoolId, examId, studentCode, courseCode);
         if (Objects.isNull(collegeResult)) {
             throw ExceptionResultEnum.ERROR.exception("未找到考生的学院信息");
         }
+        log.info("学院信息耗时 : {}",System.currentTimeMillis() - s);
         personalReportResult.setCollege(collegeResult);
         return personalReportResult;
     }
@@ -355,11 +387,16 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
 
         QueryWrapper<TAExamCourseRecord> examCourseRecordQueryWrapper = new QueryWrapper<>();
         examCourseRecordQueryWrapper.lambda().eq(TAExamCourseRecord::getSchoolId, schoolId).eq(TAExamCourseRecord::getExamId, examId).eq(TAExamCourseRecord::getStudentCode, studentCode).eq(TAExamCourseRecord::getCourseCode, courseCode);
+        long s1 = System.currentTimeMillis();
         List<TAExamCourseRecord> examCourseRecords = taExamCourseRecordMapper.selectList(examCourseRecordQueryWrapper);
+        log.info("s1 查询耗时{}",System.currentTimeMillis() - s1);
+
 
         QueryWrapper<TBPaper> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(TBPaper::getExamId, examId).eq(TBPaper::getCourseCode, courseCode);
+        long s2 = System.currentTimeMillis();
         List<TBPaper> papers = tbPaperMapper.selectList(queryWrapper);
+        log.info("s2 查询耗时{}",System.currentTimeMillis() - s2);
 
         if (examCourseRecords.size() != 1) {
             throw ExceptionResultEnum.ERROR.exception("获取数据异常,应该有且仅有一条数据");
@@ -376,10 +413,12 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
         diagnosisResult.setResult(result);
 
         // 模块
-        QueryWrapper<TAExamCourseRecordDio> examCourseRecordDioQueryWrapper = new QueryWrapper<>();
-        examCourseRecordDioQueryWrapper.lambda().eq(TAExamCourseRecordDio::getSchoolId, schoolId).eq(TAExamCourseRecordDio::getExamId, examId).eq(TAExamCourseRecordDio::getCourseCode, courseCode);
-        List<TAExamCourseRecordDio> examCourseRecordDios = taExamCourseRecordDioMapper.selectList(examCourseRecordDioQueryWrapper);
-        Set<String> moduleNames = examCourseRecordDios.stream().map(m -> m.getDimensionType()).collect(Collectors.toSet());
+
+        long s3 = System.currentTimeMillis();
+        Set<String> moduleNames = taExamCourseRecordDioService.findDimensionTypesByCourseCode(schoolId,SystemConstant.convertIdToLong(examId),courseCode);
+        log.info("s3查询耗时{}",System.currentTimeMillis() - s3);
+
+
         List<DiagnosisDetailResult> diagnosisDetailResults = new ArrayList<>();
         for (String moduleName : moduleNames) {
             DiagnosisDetailResult diagnosisDetailResult = new DiagnosisDetailResult();
@@ -422,7 +461,10 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
             String info = tbModuleProficiency.get("moduleType").concat(":").concat(tbModuleProficiency.get("interpret"));
             moduleResult.setInfo(info);
 
+            long s4 = System.currentTimeMillis();
             List<ModuleDetailResult> dios = taExamCourseRecordDioMapper.listDiosBySchoolIdAndExamIdAndCourseCodeAndModuleName(schoolId, examId, courseCode, moduleName, studentCode);
+            log.info("s4耗时{}",System.currentTimeMillis() - s4);
+
             moduleResult.setDios(dios);
             diagnosisDetailResult.setModules(moduleResult);
 
@@ -431,7 +473,9 @@ public class TBExamStudentServiceImpl extends ServiceImpl<TBExamStudentMapper, T
             dimensionResult.setMasteryRate(taExamCourseRecordMod.getScoreRate().multiply(new BigDecimal("100")).setScale(1, BigDecimal.ROUND_HALF_UP));
             dimensionResult.setDioFullScore(taExamCourseRecordMod.getFullScore().setScale(1, BigDecimal.ROUND_HALF_UP));
 
+            long s5 = System.currentTimeMillis();
             List<DimensionDetailResult> subDios = taExamCourseRecordDioMapper.listSubDiosBySchoolIdAndExamIdAndStudentCodeAndCourseCodeAndModuleName(schoolId, examId, studentCode, courseCode, moduleName);
+            log.info("s5耗时{}",System.currentTimeMillis() - s5);
             // 按二级维度code排序
             Collections.sort(subDios, new Comparator<DimensionDetailResult>() {
                 @Override

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

@@ -35,4 +35,9 @@ public class TBPaperStructServiceImpl extends ServiceImpl<TBPaperStructMapper, T
     public List<TBPaperStructResult> findQuestionInfo(Long examId, String courseCode) {
         return tbPaperStructMapper.findQuestionInfo(examId, courseCode);
     }
+
+    @Override
+    public List<TBPaperStructResult> findQuestionInfoByTeacherCollege(Long examId, String courseCode, Long inspectCollegeId, Long teacherId) {
+        return tbPaperStructMapper.findQuestionInfoByTeacherCollege(examId, courseCode,inspectCollegeId,teacherId);
+    }
 }

+ 7 - 7
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/execute/AsyncDataCalculateTempleteService.java

@@ -5,7 +5,7 @@ import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
-import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.service.CacheService;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
@@ -36,7 +36,7 @@ public class AsyncDataCalculateTempleteService extends AsyncCalculateTaskTemplet
     @Resource
     private AnalyzeForReportService analyzeForReportService;
     @Resource
-    private CommonCacheService commonCacheService;
+    private CacheService cacheService;
     @Resource
     private TBExamCourseService tbExamCourseService;
 
@@ -62,7 +62,7 @@ public class AsyncDataCalculateTempleteService extends AsyncCalculateTaskTemplet
             tbExamCourse.setPublishStatus(PublishStatusEnum.UN_PUBLISH);
             tbTask.setResult(TaskResultEnum.SUCCESS);
         }catch (Exception e){
-            log.error(SystemConstant.LOG_ERROR, e);
+            log.error("请求出错", e);
             exception = e.getMessage();
             tbTask.setRemark(exception);
             tbTask.setResult(TaskResultEnum.ERROR);
@@ -72,10 +72,10 @@ public class AsyncDataCalculateTempleteService extends AsyncCalculateTaskTemplet
             tbTask.setStatus(TaskStatusEnum.FINISH);
             tbTaskService.updateById(tbTask);
             if (Objects.isNull(exception)){
-                commonCacheService.removeExamStudentReportCache();
-                commonCacheService.removeCollegeDeanCache();
-                commonCacheService.removeCollegeCourseCache();
-                commonCacheService.removeSurveyTeacherViewCache();
+                cacheService.removeExamStudentReportCache();
+                cacheService.removeCollegeDeanCache();
+                cacheService.removeCollegeCourseCache();
+                cacheService.removeSurveyTeacherViewCache();
             }
         }
         return ResultUtil.ok(map);

+ 482 - 154
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/BasicDatasourceController.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.common.collect.Lists;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -17,28 +19,32 @@ import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.SysOrgService;
 import com.qmth.teachcloud.common.service.SysRoleService;
 import com.qmth.teachcloud.common.service.SysUserService;
-import com.qmth.teachcloud.common.util.ExcelUtil;
-import com.qmth.teachcloud.common.util.JacksonUtil;
-import com.qmth.teachcloud.common.util.Result;
-import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.report.business.bean.dto.CombineDto;
 import com.qmth.teachcloud.report.business.bean.dto.excel.*;
 import com.qmth.teachcloud.report.business.bean.dto.query.*;
+import com.qmth.teachcloud.report.business.bean.params.CollegeCombineParams;
 import com.qmth.teachcloud.report.business.entity.*;
 import com.qmth.teachcloud.report.business.enums.AssignEnum;
 import com.qmth.teachcloud.report.business.enums.ExamCloudDataEnum;
 import com.qmth.teachcloud.report.business.enums.NumberTypeEnum;
+import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
 import com.qmth.teachcloud.report.business.service.*;
 import io.swagger.annotations.*;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -50,6 +56,7 @@ import java.util.stream.Stream;
 @Api(tags = "数据源处理controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.datasource}")
+//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class BasicDatasourceController {
     @Resource
     private TBPaperService tbPaperService;
@@ -99,6 +106,10 @@ public class BasicDatasourceController {
     private TBExaminationService tbExaminationService;
     @Resource
     private TBExaminationRelationService tbExaminationRelationService;
+    @Resource
+    private TBTeacherService tbTeacherService;
+    @Resource
+    private CourseUnitOperateService courseUnitOperateService;
 
     @ApiOperation(value = "试卷数据导入")
     @RequestMapping(value = "/paper/import", method = RequestMethod.POST)
@@ -177,8 +188,21 @@ public class BasicDatasourceController {
 
                         String paperType = paperStructDto.getPaperCode();
                         Long paperId = paperMap.get(paperType);
+
+                        // 考察点去空格
+                        String knowledgeDimension = paperStructDto.getKnowledgeDimension();
+                        if (SystemConstant.strNotNull(knowledgeDimension)) {
+                            knowledgeDimension = knowledgeDimension.trim().replaceAll(SystemConstant.COMMA_OF_CHINESE, SystemConstant.COMMA_OF_ENGLISH).replaceAll(SystemConstant.PAUSE_SIGN, SystemConstant.COMMA_OF_ENGLISH);
+                        }
+                        String abilityDimension = paperStructDto.getAbilityDimension();
+                        if (SystemConstant.strNotNull(abilityDimension)) {
+                            abilityDimension = abilityDimension.trim().replaceAll(SystemConstant.COMMA_OF_CHINESE, SystemConstant.COMMA_OF_ENGLISH).replaceAll(SystemConstant.PAUSE_SIGN, SystemConstant.COMMA_OF_ENGLISH);
+                        }
+
+                        // 题号组合与匹配
                         String mainNumber = paperStructDto.getMainNumber();
                         String subNumber = paperStructDto.getSubNumber();
+
                         String questionType = paperStructDto.getQuestionType();
                         if (questionType == null) {
                             questionType = "";
@@ -197,8 +221,8 @@ public class BasicDatasourceController {
                         tbPaperStruct.setFullScore(BigDecimal.valueOf(Double.parseDouble(paperStructDto.getFullScore())));
                         tbPaperStruct.setScoreRules(paperStructDto.getScoreRules());
                         tbPaperStruct.setRulesDesc(paperStructDto.getRulesDesc());
-                        tbPaperStruct.setKnowledgeDimension(paperStructDto.getKnowledgeDimension());
-                        tbPaperStruct.setAbilityDimension(paperStructDto.getAbilityDimension());
+                        tbPaperStruct.setKnowledgeDimension(knowledgeDimension);
+                        tbPaperStruct.setAbilityDimension(abilityDimension);
                         tbPaperStructList.add(tbPaperStruct);
                     }
                 }
@@ -319,7 +343,7 @@ public class BasicDatasourceController {
 
                         String courseCode = moduleConfigDto.getCourseCode();
                         String courseName = basicCourseService.getOne(new QueryWrapper<BasicCourse>().lambda()
-                                .eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode))
+                                        .eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode))
                                 .getName();
 
 
@@ -404,7 +428,7 @@ public class BasicDatasourceController {
 
                         String courseCode = dimensionDto.getCourseCode();
                         String courseName = basicCourseService.getOne(new QueryWrapper<BasicCourse>().lambda()
-                                .eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode))
+                                        .eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, courseCode))
                                 .getName();
 
                         if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, courseCode, courseName)) {
@@ -442,15 +466,15 @@ public class BasicDatasourceController {
     @RequestMapping(value = "/examAnswer/import", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
-    public Result examAnswerImport(@ApiParam(value = "云阅卷考试id", required = true) @RequestParam Long id, @ApiParam(value = "云阅卷考试编号", required = false)
-    @RequestParam(required = false) String cloudExamCode,
-                                   @ApiParam(value = "教研分析将AB卷分开分析时自定义科目和卷形的连接符(连接符必须和’t_e_course‘表中的科目名称中连接符对应)")
-                                   @RequestParam(required = false) String linkSign, @RequestParam Long pSchoolId) throws IOException {
+    public Result examAnswerImport(@ApiParam(value = "云阅卷考试id", required = true) @RequestParam Long id,
+                                   @ApiParam(value = "云阅卷考试编号") @RequestParam(required = false) String cloudExamCode,
+                                   @ApiParam(value = "教研分析将AB卷分开分析时自定义科目和卷形的连接符(连接符必须和’t_e_course‘表中的科目名称中连接符对应)") @RequestParam(required = false) String linkSign,
+                                   @ApiParam(value = "学校id") @RequestParam Long pSchoolId) throws IOException {
         TBExam tbExam = tbExamService.findByCloudExamId(id);
         Long examId = tbExam.getId();
         Long schoolId = tbExamService.getById(examId).getSchoolId();
 
-        if (!schoolId.equals(pSchoolId)){
+        if (!schoolId.equals(pSchoolId)) {
             throw ExceptionResultEnum.ERROR.exception("学校id不匹配");
         }
 
@@ -490,34 +514,78 @@ public class BasicDatasourceController {
         // TODO: 2021/6/2 筛选并创建学校教师表
         // 查询考务关系
         List<TBExaminationRelation> tbExaminationRelationList = tbExaminationRelationService.list(new QueryWrapper<TBExaminationRelation>().lambda()
-                .eq(TBExaminationRelation::getExamId,examId));
+                .eq(TBExaminationRelation::getExamId, examId));
 
         List<TBSchoolTeacherDto> tbSchoolTeacherDtoList = new ArrayList<>();
-        List<String> teacherList = finalList.stream()
-                .map(e -> String.valueOf(e.get(ExamCloudDataEnum.TEACHER.getName())))
-                .distinct().collect(Collectors.toList());
-        for (String teacherInfo : teacherList) {
+
+        List<Map<String, String>> teacherList = finalList.stream()
+                .flatMap(e -> {
+                    Map<String, String> map = new HashMap<>();
+                    map.put("subjectName", String.valueOf(e.get(ExamCloudDataEnum.SUBJECT_NAME.getName())));
+                    map.put("teacherInfo", String.valueOf(e.get(ExamCloudDataEnum.TEACHER.getName())));
+                    return Stream.of(map);
+                }).distinct().collect(Collectors.toList());
+
+        for (Map<String, String> teacherPackage : teacherList) {
+
+            String teacherInfo = teacherPackage.get("teacherInfo");
+            String subjectName = teacherPackage.get("subjectName");
+
+            Long teacherCollegeId = null;
+            // 如果存在A、B卷
+            for (TBExamCourse tbExamCourse : tbExamCourseList) {
+                String courseName = tbExamCourse.getCourseName();
+                if (SystemConstant.strNotNull(linkSign) && courseName.contains(linkSign)) {
+                    String[] cellArr = courseName.split(linkSign);
+                    if (cellArr.length != 2) {
+                        throw ExceptionResultEnum.ERROR.exception("无法解析存在分隔符为 【" + linkSign + "】的课程 【" + courseName + "】");
+                    }
+                    if (cellArr[0].equals(subjectName)) {
+                        teacherCollegeId = tbExamCourse.getTeachCollegeId();
+                        break;
+                    }
+                } else {
+                    if (courseName.equals(subjectName)) {
+                        teacherCollegeId = tbExamCourse.getTeachCollegeId();
+                        break;
+                    }
+                }
+            }
+
+            // 教师信息统一化处理逻辑
+            Map<String, String> map = this.disposeTeacherInfo(teacherInfo);
+            String teacherName = map.get("teacherName");
+            String teacherCode = map.get("teacherCode");
+
             List<TBExaminationRelation> tbExaminationRelations = tbExaminationRelationList.stream()
-                    .filter(e -> teacherInfo.equals(e.getTeacherName()))
+                    .filter(e -> teacherName.equals(e.getTeacherName()))
                     .distinct().collect(Collectors.toList());
 
-            String teacherCode;
+            // TODO: 2021/7/26 研究下面臃肿且被考务数据限制死的的教师机构获取方式是否可以使用上面的替代 
             Long orgId = null;
-            if (tbExaminationRelations.size() == 0){
-                teacherCode = teacherInfo;
-            }else {
+            if (tbExaminationRelations.size() == 0) {
+                if (!SystemConstant.strNotNull(teacherCode)) {
+                    List<TBTeacher> tbTeacherList = tbTeacherService.list(new QueryWrapper<TBTeacher>().lambda().eq(TBTeacher::getSchoolId, schoolId).eq(TBTeacher::getTeacherName, teacherName));
+                    if (tbTeacherList.size() == 1) {
+                        teacherCode = tbTeacherList.get(0).getTeacherCode();
+                    } else {
+                        teacherCode = teacherInfo;
+                    }
+                }
+                orgId = teacherCollegeId;
+            } else {
                 List<String> teacherCodeList = tbExaminationRelations.stream().map(TBExaminationRelation::getTeacherCode).distinct().collect(Collectors.toList());
-                if (teacherCodeList.size() != 1){
+                if (teacherCodeList.size() != 1) {
                     throw ExceptionResultEnum.ERROR.exception("考务数据-教师对应的教师编号有误");
                 }
                 List<String> teachCollegeNameList = tbExaminationRelations.stream().map(TBExaminationRelation::getTeachCollegeName).distinct().collect(Collectors.toList());
-                if (teachCollegeNameList.size() != 1){
+                if (teachCollegeNameList.size() != 1) {
                     throw ExceptionResultEnum.ERROR.exception("考务数据-教师对应的开课学院有误");
                 }
                 teacherCode = teacherCodeList.get(0);
                 String teachCollegeName = teachCollegeNameList.get(0);
-                List<SysOrg> sysOrgList = sysOrgService.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getName,teachCollegeName).eq(SysOrg::getSchoolId,schoolId));
-                if (sysOrgList.size() != 1){
+                List<SysOrg> sysOrgList = sysOrgService.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getName, teachCollegeName).eq(SysOrg::getSchoolId, schoolId));
+                if (sysOrgList.size() != 1) {
                     throw ExceptionResultEnum.ERROR.exception("未能找到考务数据中学院名称的学院");
                 }
                 orgId = sysOrgList.get(0).getId();
@@ -526,7 +594,7 @@ public class BasicDatasourceController {
             TBSchoolTeacherDto tbSchoolTeacherDto = new TBSchoolTeacherDto();
             tbSchoolTeacherDto.setSchoolId(schoolId);
             tbSchoolTeacherDto.setTeacherCode(teacherCode);
-            tbSchoolTeacherDto.setTeacherName(teacherInfo);
+            tbSchoolTeacherDto.setTeacherName(teacherName);
             tbSchoolTeacherDto.setOrgId(orgId);
             tbSchoolTeacherDtoList.add(tbSchoolTeacherDto);
         }
@@ -544,13 +612,15 @@ public class BasicDatasourceController {
         int count = paperTypeList.size();
         int i = 0;
 
+        Map<String, TBStudent> checkMap = new HashMap<>();
         for (Map map : finalList) {
-            String subjectCode = (String) map.get(ExamCloudDataEnum.SUBJECT_CODE.getName()); //科目代码
-            String subjectName = (String) map.get(ExamCloudDataEnum.SUBJECT_NAME.getName()); //科目名称
-            String examNumber = (String) map.get(ExamCloudDataEnum.EXAM_NUMBER.getName()); //准考证号
-            String studentCode = (String) map.get(ExamCloudDataEnum.STUDENT_CODE.getName()); //学号
-            String name = (String) map.get(ExamCloudDataEnum.NAME.getName()); //名称
-            String paperType = (String) map.get(ExamCloudDataEnum.PAPER_TYPE.getName()); //试卷类型
+            String subjectCode = String.valueOf(map.get(ExamCloudDataEnum.SUBJECT_CODE.getName())); //科目代码
+            String subjectName = String.valueOf(map.get(ExamCloudDataEnum.SUBJECT_NAME.getName())); //科目名称
+            String examNumber = String.valueOf(map.get(ExamCloudDataEnum.EXAM_NUMBER.getName())); //准考证号
+            String studentCode = String.valueOf(map.get(ExamCloudDataEnum.STUDENT_CODE.getName())); //学号
+            String name = String.valueOf(map.get(ExamCloudDataEnum.NAME.getName())); //名称
+            String paperType = String.valueOf(map.get(ExamCloudDataEnum.PAPER_TYPE.getName())); //试卷类型
+            // 循环依次为#生成(分配)试卷编号为A、B、C......A、B、C......
             if (count > 0 && paperType.equals(specialPaperType)) {
                 paperType = paperTypeList.get(i);
                 i++;
@@ -559,37 +629,46 @@ public class BasicDatasourceController {
                 }
             }
 
-            String college = (String) map.get(ExamCloudDataEnum.COLLEGE.getName()); //学院
-            String className = (String) map.get(ExamCloudDataEnum.CLASS_NAME.getName()); //班级名称
-            String teacher = (String) map.get(ExamCloudDataEnum.TEACHER.getName()); //教师
+            String college = String.valueOf(map.get(ExamCloudDataEnum.COLLEGE.getName())); //学院
+            String className = String.valueOf(map.get(ExamCloudDataEnum.CLASS_NAME.getName())); //班级名称
+            String teacher = String.valueOf(map.get(ExamCloudDataEnum.TEACHER.getName())); //教师
+            Map<String, String> teacherMap = this.disposeTeacherInfo(teacher);
+            String teacherName = teacherMap.get("teacherName");
+            String teacherCode = teacherMap.get("teacherCode");
+            // 缺考状态 2 -> 缺考 ; 3 -> 违纪
             int status = (int) map.get(ExamCloudDataEnum.STATUS.getName()); //学生考试状态
-            String totalScore = (String) map.get(ExamCloudDataEnum.TOTAL_SCORE.getName()); //考生总分
-            String objectiveScore = (String) map.get(ExamCloudDataEnum.OBJECTIVE_SCORE.getName()); //客观题总分
-            String subjectiveScore = (String) map.get(ExamCloudDataEnum.SUBJECTIVE_SCORE.getName()); //主观题总分
+            String totalScore = String.valueOf(map.get(ExamCloudDataEnum.TOTAL_SCORE.getName())); //考生总分
+            String objectiveScore = String.valueOf(map.get(ExamCloudDataEnum.OBJECTIVE_SCORE.getName())); //客观题总分
+            String subjectiveScore = String.valueOf(map.get(ExamCloudDataEnum.SUBJECTIVE_SCORE.getName())); //主观题总分
             List<Map<Object, Object>> objectiveScoreDetailList = (List<Map<Object, Object>>) map.get(ExamCloudDataEnum.OBJECTIVE_SCORE_DETAIL.getName()); //客观题明细
             List<Map<Object, Object>> subjectiveScoreDetailList = (List<Map<Object, Object>>) map.get(ExamCloudDataEnum.SUBJECTIVE_SCORE_DETAIL.getName()); //主观题答题明细
 
-
-
             /*
                 组建学生基础信息 student
              */
-            TBStudent studentTemp = tbStudentService.getOne(new QueryWrapper<TBStudent>().lambda()
-                    .eq(TBStudent::getSchoolId, schoolId)
-                    .eq(TBStudent::getName, name)
-                    .eq(TBStudent::getStudentCode, studentCode));
-            Long studentId;
-            if (Objects.nonNull(studentTemp)) {
-                studentId = studentTemp.getId();
+            if (checkMap.containsKey(studentCode)) {
+                if (!checkMap.get(studentCode).getName().equals(name)) {
+                    throw ExceptionResultEnum.ERROR.exception("有学号【" + studentCode + "】的学生名称不统一");
+                }
             } else {
-                studentId = SystemConstant.getDbUuid();
+                TBStudent studentTemp = tbStudentService.getOne(new QueryWrapper<TBStudent>().lambda()
+                        .eq(TBStudent::getSchoolId, schoolId)
+                        .eq(TBStudent::getStudentCode, studentCode));
+                Long studentId;
+                if (Objects.nonNull(studentTemp)) {
+                    studentId = studentTemp.getId();
+                } else {
+                    studentId = SystemConstant.getDbUuid();
+                }
+                TBStudent tbStudent = new TBStudent();
+                tbStudent.setId(studentId);
+                tbStudent.setSchoolId(schoolId);
+                tbStudent.setName(name);
+                tbStudent.setStudentCode(studentCode);
+                checkMap.put(studentCode, tbStudent);
+                tbStudentList.add(tbStudent);
             }
-            TBStudent tbStudent = new TBStudent();
-            tbStudent.setId(studentId);
-            tbStudent.setSchoolId(schoolId);
-            tbStudent.setName(name);
-            tbStudent.setStudentCode(studentCode);
-            tbStudentList.add(tbStudent);
+
 
             /*
                 组建考生考试信息 exm_pap_tik
@@ -616,7 +695,7 @@ public class BasicDatasourceController {
                 // 获取关联的基础表主键
                 SysOrg tbSchoolCollege = sysOrgService.findByForeignKey(schoolId, college, college);
                 TBSchoolClazz tbSchoolClazz = tbSchoolClazzService.findByForeignKey(schoolId, className, className);
-                SysUser tbSchoolTeacher = sysUserService.findByForeignKey(schoolId, teacher);
+                SysUser tbSchoolTeacher = sysUserService.findByForeignKey(schoolId, teacherName);
 
                 TBExamStudent tbExamStudent = new TBExamStudent();
                 Long examStudentId = SystemConstant.getDbUuid();
@@ -624,7 +703,7 @@ public class BasicDatasourceController {
                 tbExamStudent.setSchoolId(tbExamService.getById(examId).getSchoolId());
                 tbExamStudent.setExamId(examId);
                 tbExamStudent.setName(name);
-                tbExamStudent.setStudentId(studentId);
+                tbExamStudent.setStudentId(checkMap.get(studentCode).getId());
                 tbExamStudent.setStudentCode(studentCode);
                 tbExamStudent.setCourseCode(courseCode);
                 tbExamStudent.setCourseName(courseName);
@@ -632,13 +711,13 @@ public class BasicDatasourceController {
                 tbExamStudent.setInspectCollegeId(tbSchoolCollege.getId());
                 tbExamStudent.setClazzId(tbSchoolClazz.getId());
                 tbExamStudent.setMajorId(0L);
-                if (Objects.nonNull(tbSchoolTeacher)){
+                if (Objects.nonNull(tbSchoolTeacher)) {
                     tbExamStudent.setTeacherId(tbSchoolTeacher.getId());
-                }else {
+                } else {
                     tbExamStudent.setTeacherId(0L);
                 }
                 tbExamStudent.setTicketNumber(examNumber);
-                tbExamStudent.setAbsent(status == 2);
+                tbExamStudent.setAbsent(status == 2 || status == 3);
                 // 全部设置为本届
                 tbExamStudent.setStudentCurrent(true);
                 tbExamStudentList.add(tbExamStudent);
@@ -658,36 +737,38 @@ public class BasicDatasourceController {
                 tbExamRecordList.add(tbExamRecord);
 
                 // TODO: 2021/6/4 构建考生-详细作答记录表(全批次删除并新增)
-                // 构建考生作答明细表(t_b_answer)
+                // 构建考生作答明细表(t_b_answer)正常考生才记录
                 // 客观题(选择)
-                for (Map<Object, Object> objectObjectMap : objectiveScoreDetailList) {
-                    Long answerId = SystemConstant.getDbUuid();
-                    TBAnswer tbAnswer = new TBAnswer();
-                    tbAnswer.setId(answerId);
-                    tbAnswer.setExamRecordId(examRecordId);
-                    tbAnswer.setNumberType(NumberTypeEnum.OBJECTIVE.getValue());
-                    String cloudMainNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.MAIN_NUMBER.getName()));
-                    String cloudSubNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SUB_NUMBER.getName()));
-                    tbAnswer.setMainNumber(cloudMainNumber);
-                    tbAnswer.setSubNumber(cloudSubNumber);
-                    tbAnswer.setScore(BigDecimal.valueOf(Double.parseDouble(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SCORE.getName())))));
-                    tbAnswer.setAnswer(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.ANSWER.getName())));
-                    tbAnswerList.add(tbAnswer);
-                }
-                // 主观题
-                for (Map<Object, Object> objectObjectMap : subjectiveScoreDetailList) {
-                    Long answerId = SystemConstant.getDbUuid();
-                    TBAnswer tbAnswer = new TBAnswer();
-                    tbAnswer.setId(answerId);
-                    tbAnswer.setExamRecordId(examRecordId);
-                    tbAnswer.setNumberType(NumberTypeEnum.SUBJECTIVE.getValue());
-                    String cloudMainNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.MAIN_NUMBER.getName()));
-                    String cloudSubNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SUB_NUMBER.getName()));
-                    tbAnswer.setMainNumber(cloudMainNumber);
-                    tbAnswer.setSubNumber(cloudSubNumber);
-                    tbAnswer.setScore(BigDecimal.valueOf(Double.parseDouble(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SCORE.getName())))));
-                    tbAnswer.setAnswer(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.ANSWER.getName())));
-                    tbAnswerList.add(tbAnswer);
+                if (status == 1) {
+                    for (Map<Object, Object> objectObjectMap : objectiveScoreDetailList) {
+                        Long answerId = SystemConstant.getDbUuid();
+                        TBAnswer tbAnswer = new TBAnswer();
+                        tbAnswer.setId(answerId);
+                        tbAnswer.setExamRecordId(examRecordId);
+                        tbAnswer.setNumberType(NumberTypeEnum.OBJECTIVE.getValue());
+                        String cloudMainNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.MAIN_NUMBER.getName()));
+                        String cloudSubNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SUB_NUMBER.getName()));
+                        tbAnswer.setMainNumber(cloudMainNumber);
+                        tbAnswer.setSubNumber(cloudSubNumber);
+                        tbAnswer.setScore(BigDecimal.valueOf(Double.parseDouble(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SCORE.getName())))));
+                        tbAnswer.setAnswer(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.ANSWER.getName())));
+                        tbAnswerList.add(tbAnswer);
+                    }
+                    // 主观题
+                    for (Map<Object, Object> objectObjectMap : subjectiveScoreDetailList) {
+                        Long answerId = SystemConstant.getDbUuid();
+                        TBAnswer tbAnswer = new TBAnswer();
+                        tbAnswer.setId(answerId);
+                        tbAnswer.setExamRecordId(examRecordId);
+                        tbAnswer.setNumberType(NumberTypeEnum.SUBJECTIVE.getValue());
+                        String cloudMainNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.MAIN_NUMBER.getName()));
+                        String cloudSubNumber = String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SUB_NUMBER.getName()));
+                        tbAnswer.setMainNumber(cloudMainNumber);
+                        tbAnswer.setSubNumber(cloudSubNumber);
+                        tbAnswer.setScore(BigDecimal.valueOf(Double.parseDouble(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.SCORE.getName())))));
+                        tbAnswer.setAnswer(String.valueOf(objectObjectMap.get(ExamCloudDataEnum.ANSWER.getName())));
+                        tbAnswerList.add(tbAnswer);
+                    }
                 }
             }
         }
@@ -700,7 +781,7 @@ public class BasicDatasourceController {
         Set<Long> examStudentRemoveIdSet = new HashSet<>();
         for (String s : courseInfoList) {
             Set<Long> ids = tbExamStudentService.list(new QueryWrapper<TBExamStudent>().lambda()
-                    .eq(TBExamStudent::getCourseCode, s))
+                            .eq(TBExamStudent::getCourseCode, s))
                     .stream().map(TBExamStudent::getId).collect(Collectors.toSet());
             examStudentRemoveIdSet.addAll(ids);
         }
@@ -730,7 +811,7 @@ public class BasicDatasourceController {
     @RequestMapping(value = "/normal/assignScore", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
-    public Result normalAssignScore(@RequestParam Long examId, @RequestParam Long schoolId, @RequestParam String courseCode) throws IOException, NoSuchFieldException {
+    public Result normalAssignScore(@RequestParam Long examId, @RequestParam Long schoolId, @RequestParam String courseCode) {
         analyzeForReportService.normalAssignScore(examId, schoolId, courseCode);
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.SUCCESS, true));
     }
@@ -748,7 +829,7 @@ public class BasicDatasourceController {
         List<BasicExamRecordDto> basicExamRecordDtoDatasource = tbExamRecordService.findByExamIdAndCourseCodeS(examId, courseCodeList);
         Set<TAExamCourseRecord> taExamCourseRecordDatasource = new HashSet<>();
         for (String s : courseCodeList) {
-            if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, s, basicCourseService.findByCourseCode(s).getName())) {
+            if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, s, basicCourseService.findByCourseCode(s, schoolId).getName())) {
                 throw ExceptionResultEnum.ERROR.exception("课程编号[" + s + "]的课程分析数据已测试或发布,不能变更基础数据");
             }
             List<BasicExamRecordDto> basicExamRecordDtoList = basicExamRecordDtoDatasource.stream()
@@ -760,7 +841,7 @@ public class BasicDatasourceController {
                 // 迁移数据至't_a_exam_course_record'
                 List<TAExamCourseRecord> taExamCourseRecordList = new ArrayList<>();
                 for (BasicExamRecordDto basicExamRecordDto : basicExamRecordDtoList) {
-                    if (basicExamRecordDto.getStudentCode().equals("2020303041027")){
+                    if (basicExamRecordDto.getStudentCode().equals("2020303041027")) {
                         System.out.println("进入");
                     }
                     // 正常公式赋分操作
@@ -774,7 +855,7 @@ public class BasicDatasourceController {
                     BigDecimal coefficient = tbPaper.getCoefficient();
                     BigDecimal assignScore;
                     if (coefficient != null && coefficient.compareTo(BigDecimal.ZERO) > 0 && !basicExamRecordDto.getAbsent()) {
-                        assignScore = myScore.add(fullScore.subtract(myScore).divide(coefficient, 4, BigDecimal.ROUND_HALF_UP)).setScale(0,BigDecimal.ROUND_HALF_UP);
+                        assignScore = myScore.add(fullScore.subtract(myScore).divide(coefficient, 4, RoundingMode.HALF_UP)).setScale(0, RoundingMode.HALF_UP);
                     } else {
                         assignScore = myScore;
                     }
@@ -834,7 +915,7 @@ public class BasicDatasourceController {
                                     .filter(e -> assExamId.equals(e.getExamId()) && s.equals(e.getCourseCode()) && assStudentCode.equals(e.getStudentCode()))
                                     .collect(Collectors.toList());
                             if (taExamCourseRecordList.size() != 1) {
-                                if (taExamCourseRecordList.size() < 1){
+                                if (taExamCourseRecordList.size() < 1) {
                                     continue;
                                 }
                                 System.out.println("-----------------------");
@@ -858,7 +939,7 @@ public class BasicDatasourceController {
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result configImport(@RequestParam Long schoolId, @RequestParam Long examId, @RequestParam String courseCode) {
-        String courseName = basicCourseService.findByCourseCode(courseCode).getName();
+        String courseName = basicCourseService.findByCourseCode(courseCode, schoolId).getName();
         if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, courseCode, courseName)) {
             throw ExceptionResultEnum.ERROR.exception("课程编号[" + courseCode + "]的课程分析数据已测试或发布,不能变更基础数据");
         }
@@ -871,12 +952,12 @@ public class BasicDatasourceController {
     @RequestMapping(value = "/course/create", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
-    public Result courseCreate(@RequestParam Long schoolId, @RequestParam String examId, @RequestParam String courseCode,@RequestParam String courseName,@RequestParam(required = false) String examinationCourseCode,@RequestParam(required = false) String teachCollegeName) {
-        if ((!SystemConstant.strNotNull(examinationCourseCode) && !SystemConstant.strNotNull(teachCollegeName)) || (SystemConstant.strNotNull(examinationCourseCode) && SystemConstant.strNotNull(teachCollegeName))){
+    public Result courseCreate(@RequestParam Long schoolId, @RequestParam String examId, @RequestParam String courseCode, @RequestParam String courseName, @RequestParam(required = false) String examinationCourseCode, @RequestParam(required = false) String teachCollegeName) {
+        if ((!SystemConstant.strNotNull(examinationCourseCode) && !SystemConstant.strNotNull(teachCollegeName)) || (SystemConstant.strNotNull(examinationCourseCode) && SystemConstant.strNotNull(teachCollegeName))) {
             throw ExceptionResultEnum.ERROR.exception("参数异常 : 考务课程编号和课程授课学院不能全不传或全传");
         }
-        basicCourseService.createCourse(schoolId,courseCode,courseName);
-        tbExamCourseService.createCourse(schoolId,SystemConstant.convertIdToLong(examId),courseCode,courseName,examinationCourseCode,teachCollegeName);
+        basicCourseService.createCourse(schoolId, courseCode, courseName);
+        tbExamCourseService.createCourse(schoolId, SystemConstant.convertIdToLong(examId), courseCode, courseName, examinationCourseCode, teachCollegeName);
 
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.SUCCESS, true));
     }
@@ -885,7 +966,7 @@ public class BasicDatasourceController {
     @RequestMapping(value = "/examination/sync", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
-    public Result examinationSync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,@RequestParam Long schoolId, @RequestParam String examId) throws IOException, NoSuchFieldException {
+    public Result examinationSync(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file, @RequestParam Long schoolId, @RequestParam String examId) throws IOException, NoSuchFieldException {
         if (Objects.isNull(file)) {
             throw ExceptionResultEnum.ERROR.exception("附件不存在");
         }
@@ -932,7 +1013,9 @@ public class BasicDatasourceController {
                         tbExamination.setTeacherCode(teacherCode);
                         tbExamination.setTeacherName(teacherName);
                         tbExamination.setTeachCollegeName(teachCollegeName);
-                        tbExamination.setCredit(credit);
+                        if (SystemConstant.strNotNull(credit)) {
+                            tbExamination.setCredit(credit);
+                        }
                         tbExamination.setStudentCode(studentCode);
                         tbExamination.setStudentName(studentName);
                         tbExamination.setInspectCollegeName(inspectCollegeName);
@@ -944,15 +1027,15 @@ public class BasicDatasourceController {
                 }
             }
         }
-        List<Map<String,Object>> tbExaminationRelationMapList = tbExaminationList.stream().flatMap(e -> {
+        List<Map<String, Object>> tbExaminationRelationMapList = tbExaminationList.stream().flatMap(e -> {
             Map<String, Object> map = new HashMap<>();
-            map.put("schoolId",e.getSchoolId());
-            map.put("examId",e.getExamId());
-            map.put("examinationCourseCode",e.getExaminationCourseCode());
-            map.put("courseName",e.getCourseName());
-            map.put("teachCollegeName",e.getTeachCollegeName());
-            map.put("teacherCode",e.getTeacherCode());
-            map.put("teacherName",e.getTeacherName());
+            map.put("schoolId", e.getSchoolId());
+            map.put("examId", e.getExamId());
+            map.put("examinationCourseCode", e.getExaminationCourseCode());
+            map.put("courseName", e.getCourseName());
+            map.put("teachCollegeName", e.getTeachCollegeName());
+            map.put("teacherCode", e.getTeacherCode());
+            map.put("teacherName", e.getTeacherName());
             return Stream.of(map);
         }).distinct().collect(Collectors.toList());
 
@@ -970,8 +1053,8 @@ public class BasicDatasourceController {
             tbExaminationRelationList.add(tbExaminationRelation);
         }
 
-        tbExaminationService.remove(new QueryWrapper<TBExamination>().lambda().eq(TBExamination::getExamId,examId));
-        tbExaminationRelationService.remove(new QueryWrapper<TBExaminationRelation>().lambda().eq(TBExaminationRelation::getExamId,examId));
+        tbExaminationService.remove(new QueryWrapper<TBExamination>().lambda().eq(TBExamination::getExamId, examId));
+        tbExaminationRelationService.remove(new QueryWrapper<TBExaminationRelation>().lambda().eq(TBExaminationRelation::getExamId, examId));
 
         tbExaminationService.saveBatch(tbExaminationList);
         tbExaminationRelationService.saveBatch(tbExaminationRelationList);
@@ -983,20 +1066,20 @@ public class BasicDatasourceController {
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result exceptionStudentBatchDispose(@RequestParam String schoolId, @RequestParam String examId, @RequestParam(required = false) String courseCode) {
-        String courseName = basicCourseService.findByCourseCode(courseCode).getName();
+        String courseName = basicCourseService.findByCourseCode(courseCode, SystemConstant.convertIdToLong(schoolId)).getName();
         if (tbExamCourseService.verifyExamCourseCantRun(SystemConstant.convertIdToLong(examId), SystemConstant.convertIdToLong(schoolId), courseCode, courseName)) {
             throw ExceptionResultEnum.ERROR.exception("课程编号[" + courseCode + "]的课程分析数据已测试或发布,不能变更基础数据");
         }
         List<TBExamination> tbExaminationList = tbExaminationService.list(new QueryWrapper<TBExamination>().lambda()
-                .eq(TBExamination::getExamId,SystemConstant.convertIdToLong(examId))
-                .eq(TBExamination::getSchoolId,SystemConstant.convertIdToLong(schoolId))
-                .eq(TBExamination::getExaminationCourseCode,tbExamCourseService.getOne(new QueryWrapper<TBExamCourse>().lambda()
-                        .eq(TBExamCourse::getExamId,examId)
-                        .eq(TBExamCourse::getCourseCode,courseCode)
-                        .eq(TBExamCourse::getSchoolId,schoolId))
+                .eq(TBExamination::getExamId, SystemConstant.convertIdToLong(examId))
+                .eq(TBExamination::getSchoolId, SystemConstant.convertIdToLong(schoolId))
+                .eq(TBExamination::getExaminationCourseCode, tbExamCourseService.getOne(new QueryWrapper<TBExamCourse>().lambda()
+                                .eq(TBExamCourse::getExamId, examId)
+                                .eq(TBExamCourse::getCourseCode, courseCode)
+                                .eq(TBExamCourse::getSchoolId, schoolId))
                         .getExaminationCourseCode())
-                .eq(TBExamination::getCourseName,courseName)
-                .ne(TBExamination::getStudyType,"普通"));
+                .eq(TBExamination::getCourseName, courseName)
+                .ne(TBExamination::getStudyType, "普通"));
         int count = tbExaminationList.size();
         if (count > 0) {
             List<TBExamStudent> tbExamStudentList = tbExamStudentService.list(new QueryWrapper<TBExamStudent>().lambda()
@@ -1017,7 +1100,68 @@ public class BasicDatasourceController {
             }
             tbExamStudentService.saveOrUpdateBatch(willUpdate);
         }
-        return ResultUtil.ok("有【" + count + "】条缺考学生数据被更新");
+        return ResultUtil.ok("有【" + count + "】条非应届学生数据被更新");
+    }
+
+    @ApiOperation(value = "异常考生-按学号处理")
+    @RequestMapping(value = "/exception_student/dispose_by_student_code", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    public Result exceptionStudentDisposeByStudentCode(@RequestParam String schoolId, @RequestParam String examId, @RequestParam List<String> courseCodeList, @RequestParam String year) {
+        for (String courseCode : courseCodeList) {
+            TBExamCourse tbExamCourse = tbExamCourseService.getOne(new QueryWrapper<TBExamCourse>().lambda()
+                    .eq(TBExamCourse::getExamId, examId)
+                    .eq(TBExamCourse::getSchoolId, schoolId)
+                    .eq(TBExamCourse::getCourseCode, courseCode));
+            if (tbExamCourse.getPublishStatus().equals(PublishStatusEnum.PUBLISH)) {
+                throw ExceptionResultEnum.ERROR.exception("已经发布的课程【" + tbExamCourse.getCourseName() + "】不能进行特殊处理");
+            }
+        }
+        // 更改 ‘t_b_exam_student’表考生应届状态
+        List<TBExamStudent> tbExamStudentList = tbExamStudentService.list(new QueryWrapper<TBExamStudent>().lambda()
+                .eq(TBExamStudent::getSchoolId, schoolId)
+                .eq(TBExamStudent::getExamId, examId)
+                .in(TBExamStudent::getCourseCode, courseCodeList));
+        // 全部改为应届
+        for (TBExamStudent tbExamStudent : tbExamStudentList) {
+            tbExamStudent.setStudentCurrent(true);
+        }
+        tbExamStudentService.updateBatchById(tbExamStudentList);
+        // 非应届考生
+        tbExamStudentList = tbExamStudentList.stream()
+                .filter(e -> !e.getStudentCode().substring(0, 4).equals(year))
+                .collect(Collectors.toList());
+
+        // 更改 ‘t_a_exam_course_record’表考生应届状态
+        List<TAExamCourseRecord> taExamCourseRecordList = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
+                .eq(TAExamCourseRecord::getSchoolId, schoolId)
+                .eq(TAExamCourseRecord::getExamId, examId)
+                .in(TAExamCourseRecord::getCourseCode, courseCodeList));
+        // 全部改为应届
+        for (TAExamCourseRecord taExamCourseRecord : taExamCourseRecordList) {
+            taExamCourseRecord.setStudentCurrent(true);
+        }
+        taExamCourseRecordService.updateBatchById(taExamCourseRecordList);
+
+        // 非应届考生记录
+        taExamCourseRecordList = taExamCourseRecordList.stream()
+                .filter(e -> !e.getStudentCode().substring(0, 4).equals(year))
+                .collect(Collectors.toList());
+
+        if (tbExamStudentList.size() > 0) {
+            for (TBExamStudent tbExamStudent : tbExamStudentList) {
+                tbExamStudent.setStudentCurrent(false);
+            }
+            tbExamStudentService.updateBatchById(tbExamStudentList);
+
+            if (tbExamStudentList.size() == taExamCourseRecordList.size()) {
+                for (TAExamCourseRecord taExamCourseRecord : taExamCourseRecordList) {
+                    taExamCourseRecord.setStudentCurrent(false);
+                }
+                taExamCourseRecordService.updateBatchById(taExamCourseRecordList);
+            }
+        }
+        return ResultUtil.ok("有【" + tbExamStudentList.size() + "】条非应届学生数据被更新");
     }
 
     @ApiOperation(value = "特殊科目合并题目处理")
@@ -1035,18 +1179,18 @@ public class BasicDatasourceController {
         String comMain = combineDto.getComMain();
         String comSub = combineDto.getComSub();
         // TODO: 2021/6/25 合题的检验
-        TBPaper tbPaper = tbPaperService.getOne(new QueryWrapper<TBPaper>().lambda().eq(TBPaper::getExamId,examId).eq(TBPaper::getCourseCode,courseCode));
+        TBPaper tbPaper = tbPaperService.getOne(new QueryWrapper<TBPaper>().lambda().eq(TBPaper::getExamId, examId).eq(TBPaper::getCourseCode, courseCode));
         Long paperId = tbPaper.getId();
-        List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getExamId,examId).eq(TBExamRecord::getPaperId,paperId));
+        List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getExamId, examId).eq(TBExamRecord::getPaperId, paperId));
         List<Long> examRecordIdList = tbExamRecordList.stream().map(TBExamRecord::getId).distinct().collect(Collectors.toList());
 
-        List<TBAnswer> tbAnswerList = tbAnswerService.list(new QueryWrapper<TBAnswer>().lambda().in(TBAnswer::getExamRecordId,examRecordIdList));
+        List<TBAnswer> tbAnswerList = tbAnswerService.list(new QueryWrapper<TBAnswer>().lambda().in(TBAnswer::getExamRecordId, examRecordIdList));
 
         List<Long> willDeleteList = new ArrayList<>();
         List<TBAnswer> willInsertList = new ArrayList<>();
         for (Long examRecordId : examRecordIdList) {
             List<TBAnswer> oneStudentAnswerList = tbAnswerList.stream().filter(e -> e.getExamRecordId().equals(examRecordId)).collect(Collectors.toList());
-            if (oneStudentAnswerList.size() == 0){
+            if (oneStudentAnswerList.size() == 0) {
                 continue;
             }
             // 原始1题
@@ -1063,7 +1207,7 @@ public class BasicDatasourceController {
 
             Long org2Id = org2.getId();
             BigDecimal org2Score = org2.getScore();
-            if (!org1.getNumberType().equals(org2.getNumberType())){
+            if (!org1.getNumberType().equals(org2.getNumberType())) {
                 throw ExceptionResultEnum.ERROR.exception("题目类型不一致 合题失败");
             }
 
@@ -1090,20 +1234,20 @@ public class BasicDatasourceController {
     @RequestMapping(value = "/exception_answer/score_dispose", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
-    public Result exceptionAnswerScoreDispose(@RequestParam Long schoolId, @RequestParam String examId, @RequestParam String courseCode,@RequestParam String numberType,@RequestParam String mainNumber,@RequestParam String subNumber,@RequestParam String answer,@RequestParam BigDecimal score) {
+    public Result exceptionAnswerScoreDispose(@RequestParam Long schoolId, @RequestParam String examId, @RequestParam String courseCode, @RequestParam String numberType, @RequestParam String mainNumber, @RequestParam String subNumber, @RequestParam String answer, @RequestParam BigDecimal score) {
 
-        TBPaper tbPaper = tbPaperService.getOne(new QueryWrapper<TBPaper>().lambda().eq(TBPaper::getCourseCode,courseCode).eq(TBPaper::getExamId,examId));
+        TBPaper tbPaper = tbPaperService.getOne(new QueryWrapper<TBPaper>().lambda().eq(TBPaper::getCourseCode, courseCode).eq(TBPaper::getExamId, examId));
         Long paperId = tbPaper.getId();
-        List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getExamId,examId).eq(TBExamRecord::getPaperId,paperId));
+        List<TBExamRecord> tbExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getExamId, examId).eq(TBExamRecord::getPaperId, paperId));
         List<Long> examRecordIdList = tbExamRecordList.stream().map(TBExamRecord::getId).distinct().collect(Collectors.toList());
 
         // 要改分的作答记录
         List<TBAnswer> tbAnswerList = tbAnswerService.list(new QueryWrapper<TBAnswer>().lambda()
-                .in(TBAnswer::getExamRecordId,examRecordIdList)
-                .eq(TBAnswer::getNumberType,numberType)
-                .eq(TBAnswer::getMainNumber,mainNumber)
-                .eq(TBAnswer::getSubNumber,subNumber)
-                .eq(TBAnswer::getAnswer,answer));
+                .in(TBAnswer::getExamRecordId, examRecordIdList)
+                .eq(TBAnswer::getNumberType, numberType)
+                .eq(TBAnswer::getMainNumber, mainNumber)
+                .eq(TBAnswer::getSubNumber, subNumber)
+                .eq(TBAnswer::getAnswer, answer));
 
         List<TBExamRecord> willUpdateRecordList = new ArrayList<>();
         for (TBAnswer tbAnswer : tbAnswerList) {
@@ -1115,15 +1259,15 @@ public class BasicDatasourceController {
             // 对该考生 总体考试成绩的得分修改
             TBExamRecord tbExamRecord = tbExamRecordList.stream().filter(e -> e.getId().equals(tbAnswer.getExamRecordId())).collect(Collectors.toList()).get(0);
             BigDecimal totalScore = tbExamRecord.getTotalScore();
-            if (numberType.equals("客观题")){
+            if (numberType.equals("客观题")) {
                 BigDecimal objectiveScore = tbExamRecord.getObjectiveScore();
                 objectiveScore = objectiveScore.add(scoreGap);
                 tbExamRecord.setObjectiveScore(objectiveScore);
-            }else if (numberType.equals("主观题")){
+            } else if (numberType.equals("主观题")) {
                 BigDecimal subjectiveScore = tbExamRecord.getSubjectiveScore();
                 subjectiveScore = subjectiveScore.add(scoreGap);
                 tbExamRecord.setSubjectiveScore(subjectiveScore);
-            }else {
+            } else {
                 throw ExceptionResultEnum.ERROR.exception("题目类型有误");
             }
             totalScore = totalScore.add(scoreGap);
@@ -1135,16 +1279,16 @@ public class BasicDatasourceController {
         tbExamRecordService.updateBatchById(willUpdateRecordList);
 
         // 成绩核对
-        List<TBExamRecord> verifyExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getExamId,examId).eq(TBExamRecord::getPaperId,paperId));
+        List<TBExamRecord> verifyExamRecordList = tbExamRecordService.list(new QueryWrapper<TBExamRecord>().lambda().eq(TBExamRecord::getExamId, examId).eq(TBExamRecord::getPaperId, paperId));
         for (TBExamRecord verifyRecord : verifyExamRecordList) {
             BigDecimal totalScore = verifyRecord.getTotalScore();
             Long examRecordId = verifyRecord.getId();
-            List<TBAnswer> oneStudentAnswer = tbAnswerService.list(new QueryWrapper<TBAnswer>().lambda().eq(TBAnswer::getExamRecordId,examRecordId));
-            if (oneStudentAnswer.size() == 0 && totalScore.compareTo(BigDecimal.ZERO) != 0){
+            List<TBAnswer> oneStudentAnswer = tbAnswerService.list(new QueryWrapper<TBAnswer>().lambda().eq(TBAnswer::getExamRecordId, examRecordId));
+            if (oneStudentAnswer.size() == 0 && totalScore.compareTo(BigDecimal.ZERO) != 0) {
                 throw ExceptionResultEnum.ERROR.exception("计算数据异常");
             } else {
                 double scoreSum = oneStudentAnswer.stream().collect(Collectors.summarizingDouble(e -> e.getScore().doubleValue())).getSum();
-                if (totalScore.compareTo(BigDecimal.valueOf(scoreSum)) != 0){
+                if (totalScore.compareTo(BigDecimal.valueOf(scoreSum)) != 0) {
                     System.out.println("考试总分 : " + totalScore + ",作答总分 : " + scoreSum);
                     throw ExceptionResultEnum.ERROR.exception("考试总分和作答总分不一致");
                 }
@@ -1160,17 +1304,17 @@ public class BasicDatasourceController {
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result exceptionStudentDispose(@RequestParam String schoolId, @RequestParam String examId, @RequestParam String courseCode) {
 
-        String courseName = basicCourseService.findByCourseCode(courseCode).getName();
+        String courseName = basicCourseService.findByCourseCode(courseCode, SystemConstant.convertIdToLong(schoolId)).getName();
         if (tbExamCourseService.verifyExamCourseCantRun(SystemConstant.convertIdToLong(examId), SystemConstant.convertIdToLong(schoolId), courseCode, courseName)) {
             throw ExceptionResultEnum.ERROR.exception("课程编号[" + courseCode + "]的课程分析数据已测试或发布,不能变更基础数据");
         }
         // 查找留学生
         List<TAExamCourseRecord> taExamCourseRecordList = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
-                .eq(TAExamCourseRecord::getCourseCode,courseCode)
-                .eq(TAExamCourseRecord::getExamId,examId)
-                .eq(TAExamCourseRecord::getTotalScore,0)
-                .gt(TAExamCourseRecord::getAssignedScore,0));
-        if (taExamCourseRecordList.size() > 0){
+                .eq(TAExamCourseRecord::getCourseCode, courseCode)
+                .eq(TAExamCourseRecord::getExamId, examId)
+                .eq(TAExamCourseRecord::getTotalScore, 0)
+                .gt(TAExamCourseRecord::getAssignedScore, 0));
+        if (taExamCourseRecordList.size() > 0) {
             List<Long> willDeleteTAExamCourseRecordIds = taExamCourseRecordList.stream().map(TAExamCourseRecord::getId).distinct().collect(Collectors.toList());
             List<String> willDeleteStudentCodeList = taExamCourseRecordList.stream().map(TAExamCourseRecord::getStudentCode).distinct().collect(Collectors.toList());
             List<Long> willDeleteExamRecordIdList = taExamCourseRecordList.stream().map(TAExamCourseRecord::getExamRecordId).distinct().collect(Collectors.toList());
@@ -1179,16 +1323,16 @@ public class BasicDatasourceController {
             taExamCourseRecordService.removeByIds(willDeleteTAExamCourseRecordIds);
 
             // 删除‘t_b_exam_student’
-            if (willDeleteStudentCodeList.size() > 0){
-                tbExamStudentService.remove(new QueryWrapper<TBExamStudent>().lambda().eq(TBExamStudent::getExamId,examId).eq(TBExamStudent::getCourseCode,courseCode).in(TBExamStudent::getStudentCode,willDeleteStudentCodeList).gt(TBExamStudent::getId,0));
+            if (willDeleteStudentCodeList.size() > 0) {
+                tbExamStudentService.remove(new QueryWrapper<TBExamStudent>().lambda().eq(TBExamStudent::getExamId, examId).eq(TBExamStudent::getCourseCode, courseCode).in(TBExamStudent::getStudentCode, willDeleteStudentCodeList).gt(TBExamStudent::getId, 0));
             }
 
-            if (willDeleteExamRecordIdList.size() > 0){
+            if (willDeleteExamRecordIdList.size() > 0) {
                 // 删除't_b_exam_record'
                 tbExamRecordService.removeByIds(willDeleteExamRecordIdList);
 
                 // 删除‘t_b_answer’
-                tbAnswerService.remove(new QueryWrapper<TBAnswer>().lambda().in(TBAnswer::getExamRecordId,willDeleteExamRecordIdList).gt(TBAnswer::getId,0));
+                tbAnswerService.remove(new QueryWrapper<TBAnswer>().lambda().in(TBAnswer::getExamRecordId, willDeleteExamRecordIdList).gt(TBAnswer::getId, 0));
             }
 
         }
@@ -1196,7 +1340,137 @@ public class BasicDatasourceController {
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.SUCCESS, true));
     }
 
+    @ApiOperation(value = "教师用户删除")
+    @RequestMapping(value = "/user_teacher/delete", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result userTeacherDelete(@ApiParam(value = "用户id", required = true) @RequestParam List<String> idList) {
+        if (CollectionUtils.isEmpty(idList)) {
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的用户");
+        }
+        Set<Long> idSet = idList.stream().map(SystemConstant::convertIdToLong).collect(Collectors.toSet());
+        tbTeacherService.deleteSysUserByIdSet(idSet);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "基础教师导入")
+    @RequestMapping(value = "/basic_teacher/import", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result basicTeacherImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                                     @ApiParam(value = "学校id", required = true) @RequestParam String schoolId) throws Exception {
+        return ResultUtil.ok(tbTeacherService.importBasicTeacherInfo(file, SystemConstant.convertIdToLong(schoolId)));
+    }
+
+    @ApiOperation(value = "同步基础教师表数据到用户表")
+    @RequestMapping(value = "/sync/teacher", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result syncTeacherInfo(@ApiParam(value = "学校id", required = true) @RequestParam String schoolId) {
+        tbTeacherService.syncTeacherInfoToSysUser(SystemConstant.convertIdToLong(schoolId));
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "特殊科目赋分检查")
+    @RequestMapping(value = "/special/assignCheck", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result assignCheck(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file, @RequestParam Long examId, @RequestParam Long schoolId,
+                              @ApiParam(value = "该Excel中包含多科目赋分时,各科目编号用','隔开", required = true) @RequestParam String courseCodeS) throws IOException, NoSuchFieldException {
+
+        int count = 0;
+        List<AssignCheckDto> result = new ArrayList<>();
+        List<String> courseCodeList = Arrays.asList(courseCodeS.split(","));
+        // 数据同步操作
+        // 获取当前课程下所有学生考试成绩记录
+        List<BasicExamRecordDto> basicExamRecordDtoDatasource = tbExamRecordService.findByExamIdAndCourseCodeS(examId, courseCodeList);
+        Set<TAExamCourseRecord> taExamCourseRecordDatasource = new HashSet<>();
+        for (String s : courseCodeList) {
+            taExamCourseRecordDatasource.addAll(taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>()
+                    .lambda().eq(TAExamCourseRecord::getExamId, examId).eq(TAExamCourseRecord::getCourseCode, s)));
+        }
+
+
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(AssignCheckDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            return finalExcelList;
+        });
+
+        //保存到数据库
+        if (Objects.nonNull(finalList) && finalList.size() > 0) {
+            for (int i = 0; i < finalList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> map = finalList.get(i);
+                List<Object> assignCheckList = map.get(i);
+                for (int y = 0; y < Objects.requireNonNull(assignCheckList).size(); y++) {
+                    if (assignCheckList.get(y) instanceof AssignCheckDto) {
+                        AssignCheckDto assignCheckDto = (AssignCheckDto) assignCheckList.get(y);
+                        Long assExamId = Long.parseLong(assignCheckDto.getExamId());
+                        if (!examId.equals(assExamId)) {
+                            throw ExceptionResultEnum.ERROR.exception("excel考试数据异常");
+                        }
+                        String assCourseCodeS = assignCheckDto.getPaperCodeS();
+                        String assStudentCode = assignCheckDto.getStudentCode();
+                        String assAssignScore = assignCheckDto.getAssignScore();
+                        String assStudentName = assignCheckDto.getStudentName();
+                        String[] courseCodeArr = assCourseCodeS.split(",");
+                        for (String s : courseCodeArr) {
+                            List<TAExamCourseRecord> taExamCourseRecordList = taExamCourseRecordDatasource.stream()
+                                    .filter(e -> assExamId.equals(e.getExamId()) && s.equals(e.getCourseCode()) && assStudentCode.equals(e.getStudentCode()))
+                                    .collect(Collectors.toList());
+                            if (taExamCourseRecordList.size() != 1) {
+                                if (taExamCourseRecordList.size() < 1) {
+                                    continue;
+                                }
+                                System.out.println("-----------------------");
+                                System.out.println(JSON.toJSONString(taExamCourseRecordList));
+                                throw ExceptionResultEnum.ERROR.exception("赋分异常,考生记录分析表数据异常");
+                            }
+                            TAExamCourseRecord taExamCourseRecord = taExamCourseRecordList.get(0);
+                            TBStudent tbStudent = tbStudentService.getById(taExamCourseRecord.getStudentId());
+                            if (!assStudentName.equals(tbStudent.getName())) {
+                                result.add(assignCheckDto);
+                            } else {
+                                count++;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        System.out.println(JSON.toJSONString(result));
+
+        return ResultUtil.ok(result.size() == 0 ? count : result);
+    }
+
+    @ApiOperation(value = "制作演示数据表")
+    @RequestMapping(value = "/build/demo_table", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result buildDemoTable() throws ExecutionException, InterruptedException {
+        courseUnitOperateService.createDemoData();
+        return ResultUtil.ok();
+    }
 
+    @ApiOperation(value = "将考察学院数据迁移至开课学院")
+    @RequestMapping(value = "/build/migrate_org", method = RequestMethod.POST)
+    @Transactional(rollbackFor = Exception.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result migrateOrg(@Valid @RequestBody List<CollegeCombineParams> collegeCombineParamsListList, BindingResult bindingResult){
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        Long schoolId = SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId()));
+        courseUnitOperateService.combineCollegeInspectToTeach(schoolId,collegeCombineParamsListList);
+        return ResultUtil.ok();
+    }
 
     /**
      * 更新或新增专业信息
@@ -1269,7 +1543,7 @@ public class BasicDatasourceController {
      */
     private void saveCollegeInfo(List<TBSchoolCollegeDto> tbSchoolCollegeDtoList) {
         for (TBSchoolCollegeDto tbSchoolCollegeDto : tbSchoolCollegeDtoList) {
-            sysOrgService.searchOrInsert(tbSchoolCollegeDto.getSchoolId(),tbSchoolCollegeDto.getCollegeName());
+            sysOrgService.searchOrInsert(tbSchoolCollegeDto.getSchoolId(), tbSchoolCollegeDto.getCollegeName());
         }
     }
 
@@ -1279,15 +1553,21 @@ public class BasicDatasourceController {
      * @param tbSchoolTeacherDtoList 基础教师数据源
      */
     private void saveTeacherInfo(List<TBSchoolTeacherDto> tbSchoolTeacherDtoList) {
+        Map<String, String> checkMap = new HashMap<>();
         for (TBSchoolTeacherDto tbSchoolTeacherDto : tbSchoolTeacherDtoList) {
+            if (checkMap.containsKey(tbSchoolTeacherDto.getTeacherCode())) {
+                continue;
+            }
             SysUser old = sysUserService.getOne(new QueryWrapper<SysUser>().lambda()
                     .eq(SysUser::getSchoolId, tbSchoolTeacherDto.getSchoolId())
                     .eq(SysUser::getLoginName, tbSchoolTeacherDto.getTeacherCode())
                     .eq(SysUser::getRealName, tbSchoolTeacherDto.getTeacherName()));
+            checkMap.put(tbSchoolTeacherDto.getTeacherCode(), tbSchoolTeacherDto.getTeacherName());
             Long id = 0L;
             if (Objects.nonNull(old)) {
                 id = old.getId();
             }
+
             SysRole teacherRole = sysRoleService.list(new QueryWrapper<SysRole>().lambda().eq(SysRole::getType, RoleTypeEnum.TEACHER)).get(0);
             List<Long> roleIds = new ArrayList<>();
             roleIds.add(teacherRole.getId());
@@ -1308,4 +1588,52 @@ public class BasicDatasourceController {
             sysUserService.saveUserNoAuth(userSaveParams);
         }
     }
+
+    /**
+     * 由于不同大学的教师数据在云阅卷中出现了不同的储存样式,为了解决这种问题进行统一处理
+     * 1.武汉大学:教师名称A
+     * 2.山东师范大学:教师编号A/教师名称A;教师编号B/教师名称B......
+     * 将教师信息统一处理成如下格式:
+     * teacherCode(教师编号):教师编号A;教师编号B......
+     * teacherName(教师名称):教师名称A:教师名称B......
+     *
+     * @param teacherInfo 教师信息
+     * @return 键值对
+     */
+    private Map<String, String> disposeTeacherInfo(String teacherInfo) {
+        StringBuilder teacherName = new StringBuilder();
+        StringBuilder teacherCode = new StringBuilder();
+        teacherInfo = teacherInfo.trim().replaceAll(";", ";").replaceAll("\\\\", "/");
+        String[] teacherInfoArr = teacherInfo.split(";");
+        for (String teacher : teacherInfoArr) {
+            String cellName = "";
+            String cellCode = "";
+            String[] cellArr = teacher.split("/");
+            if (cellArr.length == 1) {
+                cellName = cellArr[0];
+            } else if (cellArr.length == 2) {
+                cellCode = cellArr[0];
+                cellName = cellArr[1];
+            } else {
+                System.out.println("error");
+            }
+            if (SystemConstant.strNotNull(cellName)) {
+                teacherName.append(cellName).append(";");
+            }
+            if (SystemConstant.strNotNull(cellCode)) {
+                teacherCode.append(cellCode).append(";");
+            }
+        }
+        if (SystemConstant.strNotNull(teacherName.toString())) {
+            teacherName = new StringBuilder(teacherName.substring(0, teacherName.length() - 1));
+        }
+        if (SystemConstant.strNotNull(teacherCode.toString())) {
+            teacherCode = new StringBuilder(teacherCode.substring(0, teacherCode.length() - 1));
+        }
+
+        Map<String, String> map = new HashMap<>();
+        map.put("teacherName", teacherName.toString());
+        map.put("teacherCode", teacherCode.toString());
+        return map;
+    }
 }

+ 25 - 12
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/CourseController.java

@@ -17,21 +17,22 @@ import com.qmth.teachcloud.report.business.bean.dto.excel.TAExamCourseExportDto;
 import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.bean.result.inspectCourseExamTotal.InspectCourseTotalReportResult;
 import com.qmth.teachcloud.report.business.entity.TBExamCourse;
+import com.qmth.teachcloud.report.business.entity.TBPaper;
+import com.qmth.teachcloud.report.business.enums.AssignEnum;
 import com.qmth.teachcloud.report.business.enums.OrderEnum;
 import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.service.*;
 import com.qmth.teachcloud.report.business.templete.execute.AsyncDataCalculateTempleteService;
 import io.swagger.annotations.*;
-import org.springframework.validation.annotation.Validated;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -39,8 +40,8 @@ import java.util.Objects;
 @Api(tags = "课程Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.reportCourse}")
-@Validated
 public class CourseController {
+    private final static Logger log = LoggerFactory.getLogger(CourseController.class);
 
     @Resource
     TAExamCourseService taExamCourseService;
@@ -57,14 +58,17 @@ public class CourseController {
     @Resource
     AsyncDataCalculateTempleteService asyncDataCalculateTempleteService;
 
+    @Resource
+    TBPaperService tbPaperService;
+
     @ApiOperation(value = "开课课程考试总览列表接口")
     @RequestMapping(value = "/survey_teacher/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = TAExamCourseResult.class)})
     public Result surveyTeacherList(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
                                     @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
                                     @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
-                                    @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                    @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+                                    @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                    @ApiParam(value = "分页数", required = true) @RequestParam int pageSize,
                                     @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                     @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseService.surveyTeacherList(new Page<>(pageNumber, pageSize), SystemConstant.convertIdToLong(examId), semester, Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), column, order));
@@ -79,7 +83,8 @@ public class CourseController {
                        @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                        @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) throws Exception {
         IPage<TAExamCourseResult> taExamCourseResultIPage = taExamCourseService.surveyTeacherList(new Page<>(SystemConstant.PAGE_NUMBER, SystemConstant.PAGE_SIZE), SystemConstant.convertIdToLong(examId), semester, Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), column, order);
-        List<TAExamCourseExportDto> taExamCourseExportDtoList = new Gson().fromJson(JacksonUtil.parseJson(taExamCourseResultIPage.getRecords()), new TypeToken<List<TAExamCourseExportDto>>() {
+        Gson gson = new Gson();
+        List<TAExamCourseExportDto> taExamCourseExportDtoList = gson.fromJson(JacksonUtil.parseJson(taExamCourseResultIPage.getRecords()), new TypeToken<List<TAExamCourseExportDto>>() {
         }.getType());
         ExcelUtil.excelExport("开课课程考试总览", TAExamCourseExportDto.class, taExamCourseExportDtoList, ServletUtil.getResponse());
     }
@@ -101,8 +106,8 @@ public class CourseController {
                                            @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
                                            @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
                                            @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
-                                           @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                           @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+                                           @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                           @ApiParam(value = "分页数", required = true) @RequestParam int pageSize,
                                            @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                            @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseService.surveyTeacherTeacherView(new Page<>(pageNumber, pageSize), Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, column, order));
@@ -187,8 +192,8 @@ public class CourseController {
                                      @ApiParam(value = "考试id", required = true) @RequestParam String examId,
                                      @ApiParam(value = "科目编码", required = false) @RequestParam(required = false) String courseCode,
                                      @ApiParam(value = "发布状态", required = false) @RequestParam(required = false) PublishStatusEnum publishStatus,
-                                     @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                     @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+                                     @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                                     @ApiParam(value = "分页数", required = true) @RequestParam int pageSize,
                                      @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                      @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseService.surveyAspointsList(new Page<>(pageNumber, pageSize), Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), SystemConstant.convertIdToLong(examId), courseCode, publishStatus, semester, column, order));
@@ -223,8 +228,16 @@ public class CourseController {
             @ApiParam(value = "考试id", required = true) @RequestParam String examId,
             @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
             @ApiParam(value = "赋分系数", required = true) @RequestParam String coefficient) {
+        List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda()
+                .eq(TBPaper::getExamId,examId)
+                .eq(TBPaper::getCourseCode,courseCode));
+        if (tbPaperList.size() != 1){
+            log.error("未找到考试id为 :" + examId + " 课程编号为 : " + courseCode + "的试卷结构");
+            throw ExceptionResultEnum.ERROR.exception("未找到试卷结构");
+        }
 
-        if (!coefficient.equals(SystemConstant.DEFAULT_SIGN)) {
+        // 赋分系数不为#且试卷结构不为特殊赋分的科目才执行赋分操作
+        if (!coefficient.equals(SystemConstant.DEFAULT_SIGN) && !AssignEnum.SPECIAL_ASSIGN_SCORE.equals(tbPaperList.get(0).getScoreType())) {
             Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.DATA_CALCULATE);
             map.put("examId", examId);
             map.put("courseCode", courseCode);

+ 6 - 10
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/DataDriveController.java

@@ -16,22 +16,18 @@ import com.qmth.teachcloud.report.business.service.TAExamCourseTeacherService;
 import com.qmth.teachcloud.report.business.service.TAExamTotalService;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
 import java.util.Map;
 import java.util.Objects;
 
 @Api(tags = "数据驾驶舱Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.reportSchool}")
-@Validated
 public class DataDriveController {
 
     @Autowired
@@ -56,8 +52,8 @@ public class DataDriveController {
     @ApiResponses({@ApiResponse(code = 200, message = "全校考试总览-全校考试概况", response = TAExamCourse.class)})
     public Result getCourseSummary(@ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
                                    @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                                   @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                   @ApiParam(value = "分页数量", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+                                   @ApiParam(value = "分页页码", required = true) @RequestParam Integer pageNumber,
+                                   @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
                                    @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                    @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamTotalService.getCourseSummary(semester, examId, pageNumber, pageSize, column, order));
@@ -96,8 +92,8 @@ public class DataDriveController {
     public Result listTeacherClassRank(@ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
                                        @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
                                        @ApiParam(value = "课程代码", required = true) @RequestParam String courseCode,
-                                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                       @ApiParam(value = "分页数量", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+                                       @ApiParam(value = "分页页码", required = true) @RequestParam Integer pageNumber,
+                                       @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
                                        @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                        @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseCollegeTeacherService.listTeacherClassRank(semester, examId, courseCode, pageNumber, pageSize, column, order));
@@ -119,8 +115,8 @@ public class DataDriveController {
                                           @ApiParam(value = "考查学院ID", required = true) @RequestParam(required = false) Long inspectCollegeId,
                                           @ApiParam(value = "课程代码", required = true) @RequestParam(required = false) String courseCode,
                                           @ApiParam(value = "教师ID", required = true) @RequestParam(required = false) Long teacherId,
-                                          @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                          @ApiParam(value = "分页数量", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+                                          @ApiParam(value = "分页页码", required = true) @RequestParam Integer pageNumber,
+                                          @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
                                           @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
                                           @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseCollegeTeacherService.listAllTeacherClassRank(semester, examId, inspectCollegeId, courseCode, teacherId, pageNumber, pageSize, column, order));

+ 6 - 9
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/StudentReportController.java

@@ -8,23 +8,19 @@ import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.report.business.bean.result.TBExamStudentResult;
-import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.service.TBExamStudentService;
+import com.qmth.teachcloud.report.business.utils.EncrypAES;
 import io.swagger.annotations.*;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
 
 @Api(tags = "学生报告Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.reportExamStudent}")
-@Validated
 public class StudentReportController {
 
     @Resource
@@ -35,16 +31,16 @@ public class StudentReportController {
     @ApiResponses({@ApiResponse(code = 200, message = "考生信息", response = TBExamStudentResult.class)})
     public Result reportList(@ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
                              @ApiParam(value = "考试id", required = true) @RequestParam(required = false) String examId,
-                             @ApiParam(value = "学院id", required = true) @RequestParam(required = false) String collegeId,
+                             @ApiParam(value = "考察学院id", required = true) @RequestParam(required = false) String inspectCollegeId,
                              @ApiParam(value = "科目编码", required = true) @RequestParam(required = false) String courseCode,
                              @ApiParam(value = "班级id", required = true) @RequestParam(required = false) String clazzId,
                              @ApiParam(value = "是否缺考", required = true) @RequestParam(required = false) Boolean isAbsent,
                              @ApiParam(value = "学号", required = true) @RequestParam(required = false) String studentCode,
-                             @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                             @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+                             @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
+                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
         return ResultUtil.ok(tbExamStudentService.reportList(new Page<>(pageNumber, pageSize), SystemConstant.convertIdToLong(schoolId),
                 SystemConstant.convertIdToLong(examId),
-                SystemConstant.convertIdToLong(collegeId),
+                SystemConstant.convertIdToLong(inspectCollegeId),
                 courseCode,
                 SystemConstant.convertIdToLong(clazzId),
                 isAbsent, studentCode));
@@ -56,6 +52,7 @@ public class StudentReportController {
     @Aac(auth = BOOL.FALSE)
     public Result reportResult(@ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
                                @ApiParam(value = "学号", required = true) @RequestParam String studentCode) {
+        studentCode = EncrypAES.decrypt(studentCode);
         return ResultUtil.ok(tbExamStudentService.reportResult(SystemConstant.convertIdToLong(schoolId), studentCode));
     }
 

+ 24 - 22
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysController.java

@@ -5,7 +5,13 @@ import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.bean.params.LoginParam;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.entity.BasicVerifyCode;
+import com.qmth.distributed.print.business.service.BasicVerifyCodeService;
+import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
+import com.qmth.teachcloud.common.bean.dto.MenuDto;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -16,9 +22,6 @@ import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import com.qmth.teachcloud.report.business.bean.params.LoginParam;
-import com.qmth.teachcloud.report.business.bean.result.EditResult;
-import com.qmth.teachcloud.report.business.service.ReportCommonService;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -54,7 +57,7 @@ public class SysController {
     private DictionaryConfig dictionaryConfig;
 
     @Resource
-    CommonCacheService commonCacheService;
+    CacheService cacheService;
 
     @Resource
     TBSessionService tbSessionService;
@@ -63,7 +66,7 @@ public class SysController {
     RedisUtil redisUtil;
 
     @Resource
-    ReportCommonService reportCommonService;
+    PrintCommonService printCommonService;
 
     @Resource
     TBTaskService tbTaskService;
@@ -96,8 +99,8 @@ public class SysController {
         }
 
         BasicSchool basicSchool = null;
-        if (!login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
-            basicSchool = commonCacheService.schoolCache(login.getSchoolCode());
+        if (!Objects.equals(login.getSchoolCode().toUpperCase(), RoleTypeEnum.ADMIN.name())) {
+            basicSchool = cacheService.schoolCache(login.getSchoolCode());
             if (Objects.isNull(basicSchool)) {
                 throw ExceptionResultEnum.SCHOOL_NO_DATA.exception();
             }
@@ -107,7 +110,7 @@ public class SysController {
         }
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
         wrapper.lambda().eq(SysUser::getLoginName, login.getLoginName());
-        if (!login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
+        if (!Objects.equals(login.getSchoolCode().toUpperCase(), RoleTypeEnum.ADMIN.name())) {
             wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId());
         }
         List<SysUser> userList = sysUserService.list(wrapper);
@@ -115,12 +118,12 @@ public class SysController {
         if (Objects.isNull(userList) || userList.size() == 0) {
             throw ExceptionResultEnum.USER_NO_DATA.exception();
         }
-        if (login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
+        if (Objects.equals(login.getSchoolCode().toUpperCase(), RoleTypeEnum.ADMIN.name())) {
             userList.forEach(o -> {
                 AuthBean authBean = teachcloudCommonService.getUserAuth(o.getId());
                 if (Objects.nonNull(authBean) && Objects.nonNull(authBean.getRoleList()) && authBean.getRoleList().size() > 0) {
-                    Set<String> roleNames = authBean.getRoleList().stream().map(s -> s.getName()).collect(Collectors.toSet());
-                    if (!roleNames.contains(RoleTypeEnum.ADMIN.getDesc())) {
+                    Set<RoleTypeEnum> roleType = authBean.getRoleList().stream().map(s -> s.getType()).collect(Collectors.toSet());
+                    if (!roleType.contains(RoleTypeEnum.ADMIN) && !roleType.contains(RoleTypeEnum.CUSTOMER)) {
                         throw ExceptionResultEnum.ERROR.exception("学校代码为admin只允许超级管理员登录");
                     }
                 }
@@ -167,14 +170,14 @@ public class SysController {
     public Result logout() {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         TBSession tbSession = (TBSession) ServletUtil.getRequestSession();
-        AuthBean authBean = commonCacheService.userAuthCache(sysUser.getId());
+        AuthBean authBean = cacheService.userAuthCache(sysUser.getId());
         if (Objects.isNull(authBean)) {
             throw ExceptionResultEnum.NOT_LOGIN.exception();
         }
         tbSessionService.removeById(tbSession.getId());
         redisUtil.deleteUserSession(tbSession.getId());
-        commonCacheService.removeUserCache(sysUser.getId());
-        commonCacheService.removeUserAuthCache(sysUser.getId());
+        cacheService.removeUserCache(sysUser.getId());
+        cacheService.removeUserAuthCache(sysUser.getId());
         return ResultUtil.ok(new EditResult(sysUser.getId()));
     }
 
@@ -192,7 +195,7 @@ public class SysController {
         String password = loginParam.getPassword();
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
         if (StringUtils.isNotBlank(loginParam.getSchoolCode())) {
-            BasicSchool basicSchool = commonCacheService.schoolCache(loginParam.getSchoolCode());
+            BasicSchool basicSchool = cacheService.schoolCache(loginParam.getSchoolCode());
             wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId());
         }
         wrapper.lambda().eq(SysUser::getLoginName, loginName);
@@ -206,11 +209,9 @@ public class SysController {
         }
         String mobileNumber = user.getMobileNumber();
         if (Objects.isNull(mobileNumber)) {
-            // 手机号不存在
-
             throw ExceptionResultEnum.ERROR.exception("用户未绑定手机号码");
         }
-        basicVerifyCodeService.sendVeirfyCode(mobileNumber, user);
+        basicVerifyCodeService.sendVeirfyCode(mobileNumber, user.getId());
         return ResultUtil.ok(mobileNumber, "");
     }
 
@@ -219,8 +220,8 @@ public class SysController {
     @ApiResponses({@ApiResponse(code = 200, message = "学校信息", response = EditResult.class)})
     @Aac(auth = BOOL.FALSE)
     public Result queryBySchoolCode(@ApiParam(value = "机构code", required = true) @RequestParam String code) {
-        if (!code.equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
-            BasicSchool basicSchool = commonCacheService.schoolCache(code);
+        if (!Objects.equals(code.toUpperCase(), RoleTypeEnum.ADMIN.name())) {
+            BasicSchool basicSchool = cacheService.schoolCache(code);
             if (Objects.isNull(basicSchool)) {
                 throw ExceptionResultEnum.SCHOOL_NO_DATA.exception();
             }
@@ -244,7 +245,7 @@ public class SysController {
                              @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) {
         BasicAttachment basicAttachment = null;
         try {
-            basicAttachment = reportCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
+            basicAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
             if (Objects.isNull(basicAttachment)) {
                 throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
             }
@@ -305,7 +306,8 @@ public class SysController {
     @ApiOperation(value = "查询用户权限")
     @RequestMapping(value = "/get_menu", method = RequestMethod.POST)
     public Result getMenu() {
-        return ResultUtil.ok(sysUserRoleService.listByUserId());
+        List<MenuDto> list = sysUserRoleService.listByUserId();
+        return ResultUtil.ok(list);
     }
 
     @ApiOperation(value = "获取服务器时间")

+ 1 - 2
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysOrgController.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.bean.dto.OrgDto;
 import com.qmth.teachcloud.common.entity.SysOrg;
-import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.SysOrgService;
 import com.qmth.teachcloud.common.util.Result;
@@ -46,7 +45,7 @@ public class SysOrgController {
     @ApiOperation(value = "查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list() {
-        List<OrgDto> orgDtoList = sysOrgService.listOrgTree(null);
+        List<OrgDto> orgDtoList = sysOrgService.listOrgTree();
         return ResultUtil.ok(orgDtoList);
     }
 

+ 6 - 1
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysReportController.java

@@ -85,6 +85,7 @@ public class SysReportController {
                              @ApiParam(value = "是否缺考,false:没缺考,true:缺考", required = false) @RequestParam(required = false) Boolean absent,
                              @ApiParam(value = "是否本届,false:非本届,true:本届", required = false) @RequestParam(required = false) Boolean current,
                              @ApiParam(value = "发布状态(UN_COMPUTE:未计算、COMPUTING:计算中、 UN_PUBLISH:未发布、PUBLISH:已发布)", required = false) @RequestParam(required = false) PublishStatusEnum status) {
+
         return ResultUtil.ok(tbExamCourseService.findCourseList(SystemConstant.convertIdToLong(schoolId), SystemConstant.convertIdToLong(examId), inspect, absent, current, status));
     }
 
@@ -96,6 +97,9 @@ public class SysReportController {
                                   @ApiParam(value = "是否缺考,false:没缺考,true:缺考", required = false) @RequestParam(required = false) Boolean absent,
                                   @ApiParam(value = "是否本届,false:非本届,true:本届", required = false) @RequestParam(required = false) Boolean current,
                                   @ApiParam(value = "发布状态(UN_COMPUTE:未计算、COMPUTING:计算中、 UN_PUBLISH:未发布、PUBLISH:已发布)", required = false) @RequestParam(required = false) PublishStatusEnum status) {
+        if (Objects.isNull(status)){
+            status = PublishStatusEnum.PUBLISH;
+        }
         return ResultUtil.ok(tbExamCourseService.findCourseList(SystemConstant.convertIdToLong(schoolId), SystemConstant.convertIdToLong(examId), absent, current, status));
     }
 
@@ -144,9 +148,10 @@ public class SysReportController {
                             @ApiParam(value = "考试id", required = true) @RequestParam String examId,
                             @ApiParam(value = "考试id", required = false) @RequestParam(required = false) String teacherId,
                             @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                            @ApiParam(value = "考察学院", required = false) @RequestParam(required = false) String inspectCollegeId,
                             @ApiParam(value = "是否缺考,false:没缺考,true:缺考", required = false) @RequestParam(required = false) Boolean absent,
                             @ApiParam(value = "是否本届,false:非本届,true:本届", required = false) @RequestParam(required = false) Boolean current,
                             @ApiParam(value = "发布状态(UN_COMPUTE:未计算、COMPUTING:计算中、 UN_PUBLISH:未发布、PUBLISH:已发布)", required = false) @RequestParam(required = false) PublishStatusEnum status) {
-        return ResultUtil.ok(tbExamStudentService.selectClassList(SystemConstant.convertIdToLong(schoolId), SystemConstant.convertIdToLong(examId), SystemConstant.convertIdToLong(teacherId), courseCode, absent, current, status));
+        return ResultUtil.ok(tbExamStudentService.selectClassList(SystemConstant.convertIdToLong(schoolId), SystemConstant.convertIdToLong(examId), SystemConstant.convertIdToLong(teacherId), courseCode, SystemConstant.convertIdToLong(inspectCollegeId), absent, current, status));
     }
 }

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

@@ -3,8 +3,12 @@ package com.qmth.teachcloud.report.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.report.business.bean.result.SurveyTeacherViewResult;
 import com.qmth.teachcloud.report.business.bean.result.TBExamStudentResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherClassRankResult;
 import com.qmth.teachcloud.report.business.bean.result.TeacherMyClassRankResult;
@@ -13,14 +17,12 @@ import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.service.TAExamCourseCollegeTeacherService;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
+import java.util.Objects;
 
 /**
  * <p>
@@ -33,7 +35,6 @@ import javax.validation.constraints.Min;
 @Api(tags = "教研分析教师模板Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.reportSchool}/teacher")
-@Validated
 public class TAExamCourseCollegeTeacherController {
 
     @Autowired
@@ -47,8 +48,8 @@ public class TAExamCourseCollegeTeacherController {
             @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
             @ApiParam(value = "课程代码", required = false) @RequestParam(required = false) String courseCode,
             @ApiParam(value = "考查学院ID", required = false) @RequestParam(required = false) Long inspectCollegeId,
-            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-            @ApiParam(value = "分页数量", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+            @ApiParam(value = "分页页码", required = true) @RequestParam Integer pageNumber,
+            @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
             @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
             @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseCollegeTeacherService.listClassRank(semester, examId, courseCode, inspectCollegeId, pageNumber, pageSize, column, order));
@@ -62,10 +63,53 @@ public class TAExamCourseCollegeTeacherController {
             @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
             @ApiParam(value = "课程代码", required = false) @RequestParam(required = false) String courseCode,
             @ApiParam(value = "考查学院ID", required = false) @RequestParam(required = false) Long inspectCollegeId,
-            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-            @ApiParam(value = "分页数量", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+            @ApiParam(value = "分页页码", required = true) @RequestParam Integer pageNumber,
+            @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
             @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
             @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(taExamCourseCollegeTeacherService.listMyClassRank(semester, examId, courseCode, inspectCollegeId, pageNumber, pageSize, column, order));
     }
+
+    @ApiOperation(value = "我的课堂考试分析-图表接口")
+    @RequestMapping(value = "/view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = SurveyTeacherViewResult.class)})
+    public Result teacherView(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+                              @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
+                              @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
+                              @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                              @ApiParam(value = "考查学院id", required = true) @RequestParam String inspectCollegeId) {
+        return ResultUtil.ok(taExamCourseCollegeTeacherService.teacherView(Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, Objects.nonNull(inspectCollegeId) ? SystemConstant.convertIdToLong(inspectCollegeId) : null));
+    }
+
+    @ApiOperation(value = "我的课堂考试分析-试题难度得分情况分析接口")
+    @RequestMapping(value = "/question_view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = SurveyTeacherViewResult.class)})
+    public Result teacherQuestionView(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+                                      @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
+                                      @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
+                                      @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                                      @ApiParam(value = "学院id", required = false) @RequestParam(required = false) String collegeId) {
+        // 道理上讲必须传学院id 但如果老师想看自己的整体情况,不传学院id得到的就是整体情况
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        if (Objects.isNull(sysUser)) {
+            throw ExceptionResultEnum.NOT_LOGIN.exception();
+        }
+        return ResultUtil.ok(taExamCourseCollegeTeacherService.teacherQuestionView(Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, SystemConstant.convertIdToLong(collegeId),sysUser.getId()));
+    }
+
+    @ApiOperation(value = "我的课堂考试分析-各难度水平题目上的作答分析接口")
+    @RequestMapping(value = "/question_answer_view", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = SurveyTeacherViewResult.class)})
+    public Result teacherQuestionAnswerView(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+                                            @ApiParam(value = "学期", required = true) @RequestParam SemesterEnum semester,
+                                            @ApiParam(value = "学校id", required = false) @RequestParam(required = false) String schoolId,
+                                            @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                                            @ApiParam(value = "学院id", required = false) @RequestParam(required = false) String collegeId) {
+        // 道理上讲必须传学院id 但如果老师想看自己的整体情况,不传学院id得到的就是整体情况
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        if (Objects.isNull(sysUser)) {
+            throw ExceptionResultEnum.NOT_LOGIN.exception();
+        }
+        return ResultUtil.ok(taExamCourseCollegeTeacherService.teacherQuestionAnswerView(Objects.isNull(schoolId) ? SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())) : SystemConstant.convertIdToLong(schoolId), semester, SystemConstant.convertIdToLong(examId), courseCode, SystemConstant.convertIdToLong(collegeId),sysUser.getId()));
+    }
 }

+ 4 - 10
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TBExamStudentController.java

@@ -3,7 +3,6 @@ package com.qmth.teachcloud.report.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
-import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
@@ -18,16 +17,12 @@ import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import com.qmth.teachcloud.report.business.service.TBExamStudentService;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
 import java.util.Objects;
 
 /**
@@ -41,7 +36,6 @@ import java.util.Objects;
 @Api(tags = "教研分析学生模块Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.reportSchool}/student")
-@Validated
 public class TBExamStudentController {
 
     @Autowired
@@ -61,8 +55,8 @@ public class TBExamStudentController {
             @ApiParam(value = "考查学院ID", required = true) @RequestParam(required = false) Long inspectCollegeId,
             @ApiParam(value = "教师ID", required = true) @RequestParam(required = false) Long teacherId,
             @ApiParam(value = "模糊查询", required = true) @RequestParam(required = false) String studentParam,
-            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-            @ApiParam(value = "分页数量", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+            @ApiParam(value = "分页页码", required = true) @RequestParam Integer pageNumber,
+            @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
             @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
             @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         return ResultUtil.ok(tbExamStudentService.listTeachCollegeResult(semester, examId, courseCode, current, inspectCollegeId, teacherId, studentParam, pageNumber, pageSize, column, order));
@@ -122,8 +116,8 @@ public class TBExamStudentController {
             @ApiParam(value = "教师ID", required = true) @RequestParam(required = false) Long teacherId,
             @ApiParam(value = "班级ID", required = true) @RequestParam(required = false) Long clazzId,
             @ApiParam(value = "模糊查询", required = true) @RequestParam(required = false) String studentParam,
-            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-            @ApiParam(value = "分页数量", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize,
+            @ApiParam(value = "分页页码", required = true) @RequestParam Integer pageNumber,
+            @ApiParam(value = "分页数量", required = true) @RequestParam Integer pageSize,
             @ApiParam(value = "排序列", required = false) @RequestParam(required = false) String column,
             @ApiParam(value = "排序规则", required = false) @RequestParam(required = false) OrderEnum order) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();

+ 63 - 21
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/WudaOpenApiController.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.report.api;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
@@ -13,7 +14,7 @@ import com.qmth.teachcloud.common.entity.BasicSchool;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.AppSourceEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.service.CacheService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.JacksonUtil;
@@ -21,8 +22,11 @@ import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.report.business.cache.WhuUserAuthCacheUtil;
 import com.qmth.teachcloud.report.business.service.ReportCommonService;
+import com.qmth.teachcloud.report.business.utils.AesUtil;
+import com.qmth.teachcloud.report.business.utils.EncrypAES;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
+import org.jasig.cas.client.authentication.AttributePrincipal;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -38,7 +42,10 @@ import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
 import java.text.MessageFormat;
+import java.util.Base64;
+import java.util.Map;
 import java.util.Objects;
 
 @Api(tags = "武大开放接口层apiController")
@@ -51,7 +58,7 @@ public class WudaOpenApiController {
     DictionaryConfig dictionaryConfig;
 
     @Resource
-    CommonCacheService commonCacheService;
+    CacheService cacheService;
 
     @Resource
     SysUserService sysUserService;
@@ -70,11 +77,27 @@ public class WudaOpenApiController {
         log.info("student request.getRemoteUser():{}", JacksonUtil.parseJson(request.getRemoteUser()));
         String uid = request.getRemoteUser();
         if (Objects.isNull(uid)) {
+
             throw ExceptionResultEnum.NOT_LOGIN.exception();
         }
-        BasicSchool basicSchool = commonCacheService.schoolCache(SystemConstant.SCHOOL_CODE);
-        response.setHeader("Access-Control-Allow-Origin", "*");
-        response.sendRedirect(dictionaryConfig.sysDomain().getReportUrl() + basicSchool.getId() + "/" + uid);
+        // 测试用代码 --- 开始 ---
+        Principal principal = request.getUserPrincipal();
+        String cn = "";
+        if (principal != null && principal instanceof AttributePrincipal) {
+            AttributePrincipal aPrincipal = (AttributePrincipal) principal;
+            //获取用户信息中公开的Attributes部分
+            Map<String, Object> map = aPrincipal.getAttributes();
+            // 获取姓名,可以根据属性名称获取其他属性
+            cn = (String) map.get("cn");
+            log.info("test-stu-map:{}", JSON.toJSONString(map));
+            log.info("test-stu-cn:{}", cn);
+        }
+        BasicSchool basicSchool = cacheService.schoolCache(SystemConstant.SCHOOL_CODE);
+        String testUrl = dictionaryConfig.sysDomain().getReportUrl() + basicSchool.getId() + "/" + uid + "/" + cn;
+        log.info("test-stu-testUrl:{}", testUrl);
+        String encoderUid = EncrypAES.encrypt(uid);
+        log.info("test-encoderUid:{}", encoderUid);
+        response.sendRedirect(dictionaryConfig.sysDomain().getReportUrl() + basicSchool.getId() + "/" + encoderUid);
     }
 
     @ApiOperation(value = "cas用户鉴权退出接口")
@@ -95,30 +118,49 @@ public class WudaOpenApiController {
         if (Objects.isNull(uid)) {
             throw ExceptionResultEnum.NOT_LOGIN.exception();
         }
+        // 测试用代码 --- 开始 ---
+        Principal principal = request.getUserPrincipal();
+        String cn = "";
+        if (principal != null && principal instanceof AttributePrincipal) {
+            AttributePrincipal aPrincipal = (AttributePrincipal) principal;
+            //获取用户信息中公开的Attributes部分
+            Map<String, Object> map = aPrincipal.getAttributes();
+            // 获取姓名,可以根据属性名称获取其他属性
+            cn = (String) map.get("cn");
+            log.info("test-tea-map:{}", JSON.toJSONString(map));
+            log.info("test-tea-cn:{}", cn);
+        }
+        // 测试结束
         UserAuthenticationDto userAuthenticationDto = new UserAuthenticationDto(uid, SystemConstant.getUuid());
         WhuUserAuthCacheUtil.setAuthCode(userAuthenticationDto);
         String pattern = "{0}{1}{2}";
         String code = URLEncoder.encode(MessageFormat.format(pattern, userAuthenticationDto.getUid(), SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(userAuthenticationDto.getCode())), SystemConstant.CHARSET_NAME);
-        log.info("code:{}", code);
-        response.setHeader("Access-Control-Allow-Origin", "*");
-        response.sendRedirect(dictionaryConfig.sysDomain().getLoginAuthenUrl() + "/" + code);
-    }
-
-    @ApiOperation(value = "cas用户鉴权测试接口")
-    @RequestMapping(value = "/user/authentication/test", method = RequestMethod.GET)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = Result.class)})
-    @Aac(auth = BOOL.FALSE)
-    public void userAuthenticationTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        String uid = "yz1";
-        UserAuthenticationDto userAuthenticationDto = new UserAuthenticationDto(uid, SystemConstant.getUuid());
-        WhuUserAuthCacheUtil.setAuthCode(userAuthenticationDto);
-        String pattern = "{0}{1}{2}";
-        String code = URLEncoder.encode(MessageFormat.format(pattern, userAuthenticationDto.getUid(), SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(userAuthenticationDto.getCode())), SystemConstant.CHARSET_NAME);
+        // 测试开始
+        String testPattern = "{0}{1}{2}{3}";
+        String testCode = URLEncoder.encode(MessageFormat.format(testPattern, userAuthenticationDto.getUid() + "/" + cn, SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(userAuthenticationDto.getCode())), SystemConstant.CHARSET_NAME);
+        log.info("test-tea-code:{}",testCode);
+        log.info("test-tea-url:{}",dictionaryConfig.sysDomain().getLoginAuthenUrl() + testCode);
+        // 测试结束
         log.info("code:{}", code);
         response.setHeader("Access-Control-Allow-Origin", "*");
         response.sendRedirect(dictionaryConfig.sysDomain().getLoginAuthenUrl() + code);
     }
 
+//    @ApiOperation(value = "cas用户鉴权测试接口")
+//    @RequestMapping(value = "/user/authentication/test", method = RequestMethod.GET)
+//    @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = Result.class)})
+//    @Aac(auth = BOOL.FALSE)
+//    public void userAuthenticationTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
+//        String uid = "yz1";
+//        UserAuthenticationDto userAuthenticationDto = new UserAuthenticationDto(uid, SystemConstant.getUuid());
+//        WhuUserAuthCacheUtil.setAuthCode(userAuthenticationDto);
+//        String pattern = "{0}{1}{2}";
+//        String code = URLEncoder.encode(MessageFormat.format(pattern, userAuthenticationDto.getUid(), SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(userAuthenticationDto.getCode())), SystemConstant.CHARSET_NAME);
+//        log.info("code:{}", code);
+//        response.setHeader("Access-Control-Allow-Origin", "*");
+//        response.sendRedirect(dictionaryConfig.sysDomain().getLoginAuthenUrl() + code);
+//    }
+
     @ApiOperation(value = "cas用户临时授权登录接口")
     @RequestMapping(value = "/user/authentication/login", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = LoginResult.class)})
@@ -142,7 +184,7 @@ public class WudaOpenApiController {
         }
 
         String userAuthCode = WhuUserAuthCacheUtil.getAuthCode(values[0]);
-        if (Objects.isNull(userAuthCode) || !Objects.equals(values[1], SignatureEntityTest.encrypt(userAuthCode))) {
+        if (Objects.isNull(userAuthCode) || !Objects.equals(values[1], URLDecoder.decode(SignatureEntityTest.encrypt(userAuthCode), SystemConstant.CHARSET_NAME))) {
             throw ExceptionResultEnum.ERROR.exception("临时授权码已过期");
         }
         LoginResult loginResult = teachcloudCommonService.login(sysUser.getPassword(), sysUser, AppSourceEnum.WHU_THIRD);

+ 1 - 2
teachcloud-report/src/main/java/com/qmth/teachcloud/report/aspect/ApiControllerAspect.java

@@ -1,7 +1,6 @@
 package com.qmth.teachcloud.report.aspect;
 
 import com.qmth.boot.api.exception.ApiException;
-import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.util.JacksonUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -80,7 +79,7 @@ public class ApiControllerAspect {
             log.info("============耗时============:{}秒", (end - start) / 1000);
             return proceed;
         } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
+            log.error("请求出错", e);
             if (e instanceof ApiException) {
                 return ResultUtil.error((ApiException) e, e.getMessage());
             } else {

+ 6 - 6
teachcloud-report/src/main/java/com/qmth/teachcloud/report/auth/TeachcloudReportAuthenticationService.java

@@ -12,7 +12,7 @@ import com.qmth.teachcloud.common.entity.TBSession;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PrivilegePropertyEnum;
 import com.qmth.teachcloud.common.enums.RoleTypeEnum;
-import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.service.CacheService;
 import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.slf4j.Logger;
@@ -31,7 +31,7 @@ public class TeachcloudReportAuthenticationService implements AuthorizationServi
     private final static Logger log = LoggerFactory.getLogger(TeachcloudReportAuthenticationService.class);
 
     @Resource
-    CommonCacheService commonCacheService;
+    CacheService cacheService;
 
     @Resource
     RedisUtil redisUtil;
@@ -67,7 +67,7 @@ public class TeachcloudReportAuthenticationService implements AuthorizationServi
                 throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
             }
             Long userId = Long.parseLong(tbSession.getIdentity());
-            SysUser sysUser = commonCacheService.userCache(userId);
+            SysUser sysUser = cacheService.userCache(userId);
             HttpServletRequest request = ServletUtil.getRequest();
             HttpServletResponse response = ServletUtil.getResponse();
             request.setAttribute(SystemConstant.SESSION, tbSession);
@@ -105,7 +105,7 @@ public class TeachcloudReportAuthenticationService implements AuthorizationServi
                                   HttpServletRequest request,
                                   HttpServletResponse response) {
         //验证权限
-        AuthBean authBean = type.contains(SystemConstant.USER_OAUTH_CACHE) ? authBean = commonCacheService.userAuthCache(userId) : null;
+        AuthBean authBean = type.contains(SystemConstant.USER_OAUTH_CACHE) ? authBean = cacheService.userAuthCache(userId) : null;
         if (Objects.isNull(authBean)) {
             throw ExceptionResultEnum.ROLE_ENABLE_AUTHORIZATION.exception();
         }
@@ -113,12 +113,12 @@ public class TeachcloudReportAuthenticationService implements AuthorizationServi
         request.setAttribute(SystemConstant.ORG, authBean.getOrg());
 
         //超级系统管理员拥有所有权限
-        int count = Objects.nonNull(authBean) ? (int) authBean.getRoleList().stream().filter(s -> Objects.equals(s.getName(), RoleTypeEnum.ADMIN.getDesc())).count() : 0;
+        int count = Objects.nonNull(authBean) ? (int) authBean.getRoleList().stream().filter(s -> s.getType() == RoleTypeEnum.ADMIN).count() : 0;
         if (count > 0) {
             return true;
         }
         //系统公用接口不拦截
-        Set<String> sysUrls = commonCacheService.privilegeUrlCache(PrivilegePropertyEnum.SYS, SystemConstant.getHeadOrUserSchoolId());
+        List<String> sysUrls = cacheService.privilegeUrlCache(PrivilegePropertyEnum.SYS);
         int sysCount = Objects.nonNull(sysUrls) ? (int) sysUrls.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
         if (sysCount > 0) {
             return true;

+ 12 - 12
teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/SwaggerConfig.java

@@ -30,19 +30,19 @@ public class SwaggerConfig {
 
     @Bean
     public Docket createRestApi() {
-//        ParameterBuilder tokenPar = new ParameterBuilder();
-//        ParameterBuilder tokenPar1 = new ParameterBuilder();
-//        ParameterBuilder tokenPar2 = new ParameterBuilder();
-//        ParameterBuilder tokenPar3 = new ParameterBuilder();
+        ParameterBuilder tokenPar = new ParameterBuilder();
+        ParameterBuilder tokenPar1 = new ParameterBuilder();
+        ParameterBuilder tokenPar2 = new ParameterBuilder();
+        ParameterBuilder tokenPar3 = new ParameterBuilder();
         List<Parameter> pars = new ArrayList<>();
-//        tokenPar.name(SystemConstant.HEADER_PLATFORM).description("平台").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
-//        tokenPar1.name(SystemConstant.HEADER_DEVICE_ID).description("设备id").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
-//        tokenPar2.name(SystemConstant.HEADER_AUTHORIZATION).description("鉴权token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
-//        tokenPar3.name(SystemConstant.HEADER_TIME).description("时间戳").modelRef(new ModelRef("long")).parameterType("header").required(false).build();
-//        pars.add(tokenPar.build());
-//        pars.add(tokenPar1.build());
-//        pars.add(tokenPar2.build());
-//        pars.add(tokenPar3.build());
+        tokenPar.name(SystemConstant.HEADER_PLATFORM).description("平台").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar1.name(SystemConstant.HEADER_DEVICE_ID).description("设备id").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar2.name(SystemConstant.HEADER_AUTHORIZATION).description("鉴权token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar3.name(SystemConstant.HEADER_TIME).description("时间戳").modelRef(new ModelRef("long")).parameterType("header").required(false).build();
+        pars.add(tokenPar.build());
+        pars.add(tokenPar1.build());
+        pars.add(tokenPar2.build());
+        pars.add(tokenPar3.build());
 
         return new Docket(DocumentationType.SWAGGER_2)
                 .groupName("teachcloud-report")

+ 1 - 1
teachcloud-report/src/main/java/com/qmth/teachcloud/report/interceptor/AuthInterceptor.java

@@ -23,7 +23,7 @@ public class AuthInterceptor extends ExtendInterceptor {
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         log.info("preHandle is come in");
 //        if (request.getServletPath().contains(endpoint)) {
-        return true;
+            return true;
 //        } else {
 //            return AuthUtil.adminAuthInterceptor(request, response);
 //        }

+ 137 - 0
teachcloud-report/src/main/resources/application-demo.properties

@@ -0,0 +1,137 @@
+server.port=8810
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-report-demo
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=192.168.10.83
+db.port=3307
+db.name=teachcloud_report_demo
+db.username=teachcloud_report_test
+db.password=teachcloud_report_test
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.db=14
+com.qmth.redis.port=6379
+com.qmth.redis.password=123456
+
+#mysql\u914D\u7F6E
+com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.mysql.username=${db.username}
+com.qmth.mysql.password=${db.password}
+com.qmth.mysql.min-idle=40
+com.qmth.mysql.max-pool-size=200
+com.qmth.mysql.log-level=debug
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=192.168.10.136:8005
+sys.config.serverHost=192.168.10.136:8005
+#sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+#sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.accessKey=
+sys.config.accessSecret=
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+#sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.analyzeThreadPoolCoreSize=false
+sys.config.sessionActive=1h
+sys.config.reportUrl=http://192.168.10.136:7005/#/student-report/
+sys.config.loginAuthenUrl=http://192.168.10.136:7005/#/login-authen/
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+org.center.url=https://solar.qmth.com.cn
+org.center.orgQueryApi=/api/open/org/query
+
+#com.qmth.api.uri-prefix=/aaa
+#\u7EDF\u8BA1\u9875\u9762\u914D\u7F6E
+com.qmth.api.metrics-endpoint=/metrics-count
+com.qmth.api.global-auth=true
+#com.qmth.api.global-strict=false
+#com.qmth.api.global-rate-limit=1/5s
+
+#token\u8D85\u65F6\u914D\u7F6E
+com.qmth.auth.time-max-ahead=1m
+com.qmth.auth.time-max-delay=5m
+
+#\u7F13\u5B58\u65F6\u95F4
+com.qmth.cache.expire-after-write=8h
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#api\u524D\u7F00
+prefix.url.common=admin/common
+prefix.url.sys=admin/sys
+prefix.url.basic=admin/basic
+prefix.url.exam=admin/exam
+prefix.url.data=admin/data
+prefix.url.reportWuda=report/wuda/open
+prefix.url.reportSchool=report/school
+prefix.url.reportCourse=report/course
+prefix.url.reportExamStudent=report/exam_student
+prefix.url.datasource=report/datasource
+prefix.url.analyze=report/analyze
+
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=./logs/teachcloud-report.log
+
+#\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
+spring.profiles.include=task
+
+sms.config.smsNormalCode=52jy
+sms.config.codeExpiredTime=2
+sms.config.codeSendInterval=60
+#aliyun SMS key
+sms.config.aliyunSMSKey=LTAI4Fi8jVRYT49QBXU9x5QX
+#aliyun SMS secret
+sms.config.aliyunSMSSecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+sms.config.aliyunSMSSignName=\u9038\u6559\u4E91
+sms.config.aliyunSMSTplCode=SMS_147416565
+sms.config.aliyunSMSAuditPassCode=SMS_216425141
+sms.config.aliyunSMSAuditNotPassCode=SMS_216275156
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSExamTaskCreatedCode=SMS_217436292
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uCD7D\uFFFD\uFFFD\u0524\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSExamTaskWillExpireCode=SMS_217436295
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSExamTaskOverdueCode=SMS_217426313
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uCD7D\uFFFD\uFFFD\u0524\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAllocationWillExpireCode=SMS_217406305
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAllocationOverdueCode=SMS_217406308
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditCreatedCode=SMS_217436298
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uFFFD\uFFFD\u07B8\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditReviewCode=SMS_217416269
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uCD7D\uFFFD\uFFFD\u0524\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditWillExpireCode=SMS_217436302
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditOverdueCode=SMS_217416271
+
+yun.mark.url=https://www.markingcloud.com
+yun.mark.studentScoreApi=/api/exam/student/score

+ 17 - 15
teachcloud-report/src/main/resources/application-dev.properties

@@ -10,25 +10,28 @@ server.tomcat.uri-encoding=UTF-8
 spring.application.name=teachcloud-report
 
 #\u6570\u636E\u6E90\u914D\u7F6E
-#db.host=192.168.10.136
-db.host=localhost
+db.host=192.168.10.136
+#db.host=localhost
 db.port=3306
-db.name=teachcloud-report
+db.name=teachcloud-report-617
+#db.name=teachcloud-report
 db.username=root
-#db.password=Qmth87863577!
-db.password=123456789
+db.password=Qmth87863577!
+#db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
 com.qmth.redis.port=6379
 com.qmth.redis.db=1
-#com.qmth.redis.password=123456
+com.qmth.redis.password=123456
 
 #mysql\u914D\u7F6E
-com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
-com.qmth.datasource.username=${db.username}
-com.qmth.datasource.password=${db.password}
-com.qmth.mybatis.log-level=debug
+com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.mysql.username=${db.username}
+com.qmth.mysql.password=${db.password}
+com.qmth.mysql.min-idle=40
+com.qmth.mysql.max-pool-size=200
+com.qmth.mysql.log-level=debug
 
 #\u963F\u91CC\u4E91OSS\u914D\u7F6E
 aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
@@ -39,7 +42,7 @@ aliyun.oss.bucket=teachcloud-test
 aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
 
 #\u7CFB\u7EDF\u914D\u7F6E
-sys.config.oss=true
+sys.config.oss=false
 sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl
 sys.config.attachmentLength=100
 sys.config.attachmentSize=200
@@ -94,14 +97,13 @@ prefix.url.reportCourse=report/course
 prefix.url.reportExamStudent=report/exam_student
 prefix.url.datasource=report/datasource
 prefix.url.analyze=report/analyze
-prefix.url.open=report/open
 
 #\u65E5\u5FD7\u914D\u7F6E
 com.qmth.logging.root-level=info
-com.qmth.logging.file-path=/Users/king/Downloads/teachcloud-report.log
+com.qmth.logging.file-path=/ONLINE_EXAM/teachcloud-report/tomcat/logs/teachcloud-report.log
 
 #\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
-#spring.profiles.include=task
+spring.profiles.include=task
 
 sms.config.smsNormalCode=qmth
 sms.config.codeExpiredTime=2
@@ -134,4 +136,4 @@ sms.config.aliyunSMSAuditWillExpireCode=SMS_217436302
 sms.config.aliyunSMSAuditOverdueCode=SMS_217416271
 
 yun.mark.url=https://www.markingcloud.com
-yun.mark.studentScoreApi=/api/exam/student/score
+yun.mark.studentScoreApi=/api/exam/student/score

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

@@ -102,7 +102,7 @@ com.qmth.logging.file-path=./logs/teachcloud-report.log
 #\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
 spring.profiles.include=task
 
-sms.config.smsNormalCode=qmth
+sms.config.smsNormalCode=52jy
 sms.config.codeExpiredTime=2
 sms.config.codeSendInterval=60
 #aliyun SMS key

+ 136 - 0
teachcloud-report/src/main/resources/application-sdsf.properties

@@ -0,0 +1,136 @@
+server.port=8105
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-report
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=192.168.10.136
+db.port=3307
+db.name=teachcloud_report_sdsf
+db.username=teachcloud_report_test
+db.password=teachcloud_report_test
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.db=12
+com.qmth.redis.port=6379
+com.qmth.redis.password=123456
+
+#mysql\u914D\u7F6E
+com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.mysql.username=${db.username}
+com.qmth.mysql.password=${db.password}
+com.qmth.mysql.min-idle=40
+com.qmth.mysql.max-pool-size=200
+com.qmth.mysql.log-level=debug
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=192.168.10.136:8005
+sys.config.serverHost=192.168.10.136:8005
+#sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+#sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.accessKey=0bf05ef4857b4fb58b6cd480b7f0dcd0
+sys.config.accessSecret=28yvjWPtLqIQPgxS2UWZPAF8McwMteaZ
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+#sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=1h
+sys.config.reportUrl=http://192.168.10.136:7005/#/student-report/
+sys.config.loginAuthenUrl=http://192.168.10.136:7005/#/login-authen/
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+org.center.url=https://solar.qmth.com.cn
+org.center.orgQueryApi=/api/open/org/query
+
+#com.qmth.api.uri-prefix=/aaa
+#\u7EDF\u8BA1\u9875\u9762\u914D\u7F6E
+com.qmth.api.metrics-endpoint=/metrics-count
+com.qmth.api.global-auth=true
+#com.qmth.api.global-strict=false
+#com.qmth.api.global-rate-limit=1/5s
+
+#token\u8D85\u65F6\u914D\u7F6E
+com.qmth.auth.time-max-ahead=1m
+com.qmth.auth.time-max-delay=5m
+
+#\u7F13\u5B58\u65F6\u95F4
+com.qmth.cache.expire-after-write=8h
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#api\u524D\u7F00
+prefix.url.common=admin/common
+prefix.url.sys=admin/sys
+prefix.url.basic=admin/basic
+prefix.url.exam=admin/exam
+prefix.url.data=admin/data
+prefix.url.reportWuda=report/wuda/open
+prefix.url.reportSchool=report/school
+prefix.url.reportCourse=report/course
+prefix.url.reportExamStudent=report/exam_student
+prefix.url.datasource=report/datasource
+prefix.url.analyze=report/analyze
+
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=./logs/teachcloud-report.log
+
+#\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
+spring.profiles.include=task
+
+sms.config.smsNormalCode=52jy
+sms.config.codeExpiredTime=2
+sms.config.codeSendInterval=60
+#aliyun SMS key
+sms.config.aliyunSMSKey=LTAI4Fi8jVRYT49QBXU9x5QX
+#aliyun SMS secret
+sms.config.aliyunSMSSecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+sms.config.aliyunSMSSignName=\u9038\u6559\u4E91
+sms.config.aliyunSMSTplCode=SMS_147416565
+sms.config.aliyunSMSAuditPassCode=SMS_216425141
+sms.config.aliyunSMSAuditNotPassCode=SMS_216275156
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSExamTaskCreatedCode=SMS_217436292
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uCD7D\uFFFD\uFFFD\u0524\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSExamTaskWillExpireCode=SMS_217436295
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSExamTaskOverdueCode=SMS_217426313
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uCD7D\uFFFD\uFFFD\u0524\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAllocationWillExpireCode=SMS_217406305
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAllocationOverdueCode=SMS_217406308
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditCreatedCode=SMS_217436298
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uFFFD\uFFFD\u07B8\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditReviewCode=SMS_217416269
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uCD7D\uFFFD\uFFFD\u0524\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditWillExpireCode=SMS_217436302
+#\uFFFD\uFFFD\u02F4\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0368\u05AA
+sms.config.aliyunSMSAuditOverdueCode=SMS_217416271
+
+yun.mark.url=https://www.markingcloud.com
+yun.mark.studentScoreApi=/api/exam/student/score

+ 2 - 1
teachcloud-report/src/main/resources/application-test.properties

@@ -56,6 +56,7 @@ sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/w
 #sys.config.autoCreatePdfResetMaxCount=5
 sys.config.threadPoolCoreSize=1
 sys.config.customThreadPoolCoreSize=true
+sys.config.analyzeThreadPoolCoreSize=false
 sys.config.sessionActive=1h
 sys.config.reportUrl=http://192.168.10.136:7005/#/student-report/
 sys.config.loginAuthenUrl=http://192.168.10.136:7005/#/login-authen/
@@ -102,7 +103,7 @@ com.qmth.logging.file-path=./logs/teachcloud-report.log
 #\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
 spring.profiles.include=task
 
-sms.config.smsNormalCode=qmth
+sms.config.smsNormalCode=52jy
 sms.config.codeExpiredTime=2
 sms.config.codeSendInterval=60
 #aliyun SMS key

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


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels