浏览代码

Merge branch 'dev_v3.1.0' of http://git.qmth.com.cn/wangliang/distributed-print-service into dev_v3.1.0

xiaof 3 年之前
父节点
当前提交
84acd63213
共有 48 个文件被更改,包括 1344 次插入321 次删除
  1. 6 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperStructDto.java
  2. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/marking/Question.java
  3. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDefineParam.java
  4. 65 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDimensionDatasource.java
  5. 17 51
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDimensionParam.java
  6. 10 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradeBatchPaperMapper.java
  7. 14 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeBatchPaperService.java
  8. 10 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeBatchService.java
  9. 11 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperDimensionService.java
  10. 7 9
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchPaperServiceImpl.java
  11. 35 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchServiceImpl.java
  12. 54 51
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperDimensionServiceImpl.java
  13. 5 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java
  14. 4 10
      distributed-print-business/src/main/resources/mapper/GradeBatchPaperMapper.xml
  15. 59 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchController.java
  16. 74 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchPaperController.java
  17. 47 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradeModuleEvaluationController.java
  18. 61 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperController.java
  19. 92 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperDimensionController.java
  20. 79 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java
  21. 25 8
      distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java
  22. 17 20
      distributed-print/src/main/java/com/qmth/distributed/print/aspect/ApiControllerAspect.java
  23. 5 4
      distributed-print/src/main/java/com/qmth/distributed/print/interceptor/AuthInterceptor.java
  24. 9 7
      distributed-print/src/main/resources/application-dev.properties
  25. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  26. 10 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/domain/ReportOpenDomain.java
  27. 15 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysUser.java
  28. 3 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/AppSourceEnum.java
  29. 15 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/QuestionType.java
  30. 11 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java
  31. 13 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java
  32. 3 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  33. 4 0
      teachcloud-report-business/pom.xml
  34. 105 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/LoginThirdParam.java
  35. 8 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/cache/RedisKeyHelper.java
  36. 43 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/cache/ThirdUserAuthCacheUtil.java
  37. 0 31
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/cache/WhuUserAuthCacheUtil.java
  38. 15 11
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java
  39. 22 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java
  40. 1 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/execute/AsyncDataCalculateTempleteService.java
  41. 140 11
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SsoApiController.java
  42. 1 1
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysController.java
  43. 158 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysUserController.java
  44. 5 6
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/WudaOpenApiController.java
  45. 19 21
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/aspect/ApiControllerAspect.java
  46. 37 3
      teachcloud-report/src/main/resources/application-dev.properties
  47. 4 4
      teachcloud-task/pom.xml
  48. 2 2
      teachcloud-task/src/main/resources/application-task.properties

+ 6 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperStructDto.java

@@ -36,7 +36,7 @@ public class GradePaperStructDto {
     @ExcelNote(value = "题目类型")
     @ExcelProperty(name = "题目类型", width = 30, index = 5)
     @NotNull
-    private QuestionType numberType;
+    private String numberType;
 
     @ExcelNote(value = "大题名称")
     @ExcelProperty(name = "大题名称", width = 30, index = 6)
@@ -56,7 +56,7 @@ public class GradePaperStructDto {
     @ExcelNote(value = "题目满分")
     @ExcelProperty(name = "题目满分", width = 30, index = 9)
     @NotNull
-    private BigDecimal fullScore;
+    private String fullScore;
 
     @ExcelNote(value = "知识维度")
     @ExcelProperty(name = "知识维度", width = 30, index = 10)
@@ -100,11 +100,11 @@ public class GradePaperStructDto {
         this.paperType = paperType;
     }
 
-    public QuestionType getNumberType() {
+    public String getNumberType() {
         return numberType;
     }
 
-    public void setNumberType(QuestionType numberType) {
+    public void setNumberType(String numberType) {
         this.numberType = numberType;
     }
 
@@ -132,11 +132,11 @@ public class GradePaperStructDto {
         this.smallQuestionNumber = smallQuestionNumber;
     }
 
-    public BigDecimal getFullScore() {
+    public String getFullScore() {
         return fullScore;
     }
 
-    public void setFullScore(BigDecimal fullScore) {
+    public void setFullScore(String fullScore) {
         this.fullScore = fullScore;
     }
 

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/marking/Question.java

@@ -3,6 +3,7 @@ package com.qmth.distributed.print.business.bean.marking;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -87,7 +88,7 @@ public class Question {
         if (!a.getSubNumber().equals(b.getSubNumber())) {
             return false;
         }
-        if (!a.getTotalScore().equals(b.getTotalScore())) {
+        if (!a.getTotalScore().setScale(2, RoundingMode.HALF_UP).equals(b.getTotalScore().setScale(2, RoundingMode.HALF_UP))) {
             return false;
         }
         return a.getMainTitle().equals(b.getMainTitle());

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDefineParam.java

@@ -46,7 +46,7 @@ public class GradePaperDefineParam {
 
     @ApiModelProperty(value = "二级维度精熟度定义")
     @NotNull(message = "缺少二级维度精熟度定义")
-    @Range(min = 1L, message = "缺少二级维度精熟度定义")
+//    @Range(min = 1L, message = "缺少二级维度精熟度定义")
     private List<GradeModuleKnowledgeDefineParam> gradeModuleKnowledgeDefineParamList;
 
     public String getPaperNumber() {

+ 65 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDimensionDatasource.java

@@ -0,0 +1,65 @@
+package com.qmth.distributed.print.business.bean.params.analyze;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 成绩分析 - 维度数据源
+ * @Author: CaoZixuan
+ * @Date: 2022-05-20
+ */
+public class GradePaperDimensionDatasource {
+    @ApiModelProperty(value = "一级维度编号")
+    private String codePrimary;
+
+    @ApiModelProperty(value = "一级维度名称")
+    private String namePrimary;
+
+    @ApiModelProperty(value = "二级维度编号")
+    private String codeSecond;
+
+    @ApiModelProperty(value = "二级维度名称")
+    private String nameSecond;
+
+    @ApiModelProperty(value = "一级维度术语解释")
+    private String interpretation;
+
+    public String getCodePrimary() {
+        return codePrimary;
+    }
+
+    public void setCodePrimary(String codePrimary) {
+        this.codePrimary = codePrimary;
+    }
+
+    public String getNamePrimary() {
+        return namePrimary;
+    }
+
+    public void setNamePrimary(String namePrimary) {
+        this.namePrimary = namePrimary;
+    }
+
+    public String getCodeSecond() {
+        return codeSecond;
+    }
+
+    public void setCodeSecond(String codeSecond) {
+        this.codeSecond = codeSecond;
+    }
+
+    public String getNameSecond() {
+        return nameSecond;
+    }
+
+    public void setNameSecond(String nameSecond) {
+        this.nameSecond = nameSecond;
+    }
+
+    public String getInterpretation() {
+        return interpretation;
+    }
+
+    public void setInterpretation(String interpretation) {
+        this.interpretation = interpretation;
+    }
+}

+ 17 - 51
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDimensionParam.java

@@ -2,39 +2,37 @@ package com.qmth.distributed.print.business.bean.params.analyze;
 
 import com.qmth.distributed.print.business.enums.DimensionEnum;
 import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @Description: 成绩分析 - 维度参数
  * @Author: CaoZixuan
- * @Date: 2022-05-20
+ * @Date: 2022-06-02
  */
 public class GradePaperDimensionParam {
     @ApiModelProperty(value = "试卷编号")
+    @NotNull(message = "缺少试卷编号")
     private String paperNumber;
 
     @ApiModelProperty(value = "试卷类型")
+    @NotNull(message = "缺少试卷类型")
     private String paperType;
 
     @ApiModelProperty(value = "试卷名称")
+    @NotNull(message = "缺少试卷名称")
     private String paperName;
 
     @ApiModelProperty(value = "维度类型 - 知识,能力,素养")
+    @NotNull(message = "缺少维度类型")
     private DimensionEnum dimensionType;
 
-    @ApiModelProperty(value = "一级维度编号")
-    private String codePrimary;
-
-    @ApiModelProperty(value = "一级维度名称")
-    private String namePrimary;
-
-    @ApiModelProperty(value = "二级维度编号")
-    private String codeSecond;
-
-    @ApiModelProperty(value = "二级维度名称")
-    private String nameSecond;
-
-    @ApiModelProperty(value = "一级维度术语解释")
-    private String interpretation;
+    @ApiModelProperty(value = "成绩分析课程维度数据源")
+    @NotNull(message = "缺少试卷维度")
+    @Range(min = 1L, message = "缺少试卷维度")
+    private List<GradePaperDimensionDatasource> datasource;
 
     public String getPaperNumber() {
         return paperNumber;
@@ -68,43 +66,11 @@ public class GradePaperDimensionParam {
         this.dimensionType = dimensionType;
     }
 
-    public String getCodePrimary() {
-        return codePrimary;
-    }
-
-    public void setCodePrimary(String codePrimary) {
-        this.codePrimary = codePrimary;
-    }
-
-    public String getNamePrimary() {
-        return namePrimary;
-    }
-
-    public void setNamePrimary(String namePrimary) {
-        this.namePrimary = namePrimary;
-    }
-
-    public String getCodeSecond() {
-        return codeSecond;
-    }
-
-    public void setCodeSecond(String codeSecond) {
-        this.codeSecond = codeSecond;
-    }
-
-    public String getNameSecond() {
-        return nameSecond;
-    }
-
-    public void setNameSecond(String nameSecond) {
-        this.nameSecond = nameSecond;
-    }
-
-    public String getInterpretation() {
-        return interpretation;
+    public List<GradePaperDimensionDatasource> getDatasource() {
+        return datasource;
     }
 
-    public void setInterpretation(String interpretation) {
-        this.interpretation = interpretation;
+    public void setDatasource(List<GradePaperDimensionDatasource> datasource) {
+        this.datasource = datasource;
     }
 }

+ 10 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradeBatchPaperMapper.java

@@ -23,17 +23,17 @@ public interface GradeBatchPaperMapper extends BaseMapper<GradeBatchPaper> {
     /**
      * 查找分析批次下的试卷分页数据
      *
-     * @param iPage         分页参数
-     * @param semesterId    学期id
-     * @param examId        考试id
-     * @param basicCourseId 基础课程id
-     * @param schoolId      学校id
+     * @param iPage      分页参数
+     * @param semesterId 学期id
+     * @param examId     考试id
+     * @param courseCode 课程编号
+     * @param schoolId   学校id
      * @return 结果
      */
     IPage<GradeBatchPaperResult> findGradeBatchPaperPage(@Param("iPage") Page<GradeBatchPaperResult> iPage,
                                                          @Param("semesterId") Long semesterId,
                                                          @Param("examId") Long examId,
-                                                         @Param("basicCourseId") Long basicCourseId,
+                                                         @Param("courseCode") String courseCode,
                                                          @Param("schoolId") Long schoolId);
 
     /**
@@ -42,13 +42,16 @@ public interface GradeBatchPaperMapper extends BaseMapper<GradeBatchPaper> {
      * @param semesterId  学期id
      * @param examId      考试id
      * @param collegeId   开课学院id
+     * @param courseCode  课程编号
      * @param teacherName 命题教师名称
+     * @param orgIds      数据权限
+     * @param schoolId    学校id
      * @return 查询结果
      */
     List<GradeBatchPaperResult> findAbleAnalyzePaper(@Param("semesterId") Long semesterId,
                                                      @Param("examId") Long examId,
                                                      @Param("collegeId") Long collegeId,
-                                                     @Param("basicCourseId") Long basicCourseId,
+                                                     @Param("courseCode") String courseCode,
                                                      @Param("teacherName") String teacherName,
                                                      @Param("orgIds") Set<Long> orgIds,
                                                      @Param("schoolId") Long schoolId);

+ 14 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeBatchPaperService.java

@@ -21,28 +21,28 @@ public interface GradeBatchPaperService extends IService<GradeBatchPaper> {
     /**
      * 查询批次试卷分页数据
      *
-     * @param semesterId    学期id
-     * @param examId        考试id
-     * @param basicCourseId 基础课程id
-     * @param pageNumber    分页页数
-     * @param pageSize      分页容量
-     * @param requestUser   请求用户
+     * @param semesterId  学期id
+     * @param examId      考试id
+     * @param courseCode  课程编号
+     * @param pageNumber  分页页数
+     * @param pageSize    分页容量
+     * @param requestUser 请求用户
      * @return 分页结果
      */
-    IPage<GradeBatchPaperResult> findGradeBatchPaperPage(Long semesterId, Long examId, Long basicCourseId, int pageNumber, int pageSize, SysUser requestUser);
+    IPage<GradeBatchPaperResult> findGradeBatchPaperPage(Long semesterId, Long examId, String courseCode, int pageNumber, int pageSize, SysUser requestUser);
 
     /**
      * 查询可以作为分析样本的试卷
      *
-     * @param semesterId    学期id
-     * @param examId        考试id
-     * @param collegeId     学院id
-     * @param basicCourseId 基础课程id
-     * @param teacherName   命题教师
-     * @param requestUser   请求用户
+     * @param semesterId  学期id
+     * @param examId      考试id
+     * @param collegeId   学院id
+     * @param courseCode  课程编号
+     * @param teacherName 命题教师
+     * @param requestUser 请求用户
      * @return 试卷结果
      */
-    List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long semesterId, Long examId, Long collegeId, Long basicCourseId, String teacherName, SysUser requestUser);
+    List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long semesterId, Long examId, Long collegeId, String courseCode, String teacherName, SysUser requestUser);
 
     /**
      * 保存分析批次试卷

+ 10 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeBatchService.java

@@ -8,6 +8,8 @@ import com.qmth.distributed.print.business.bean.result.analyze.GradeBatchResult;
 import com.qmth.distributed.print.business.entity.GradeBatch;
 import com.qmth.teachcloud.common.entity.SysUser;
 
+import java.util.List;
+
 /**
  * <p>
  * 分析-批次表 服务类
@@ -37,4 +39,12 @@ public interface GradeBatchService extends IService<GradeBatch> {
      * @return 批次id
      */
     Long editGradeBatch(GradeBatchParam gradeBatchParam, SysUser requestUser);
+
+    /**
+     * 批量删除教研分析批次
+     *
+     * @param idList      教研分析批次id
+     * @param requestUser 请求的用户
+     */
+    void deleteGradeBatch(List<Long> idList, SysUser requestUser);
 }

+ 11 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperDimensionService.java

@@ -36,10 +36,10 @@ public interface GradePaperDimensionService extends IService<GradePaperDimension
     /**
      * 批量保存分析试卷维度数据
      *
-     * @param gradePaperDimensionParamList 维度数据参数集合
-     * @param requestUser                  请求的用户
+     * @param gradePaperDimensionParam 维度数据参数集合
+     * @param requestUser              请求的用户
      */
-    void saveGradePaperDimensionBatch(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser);
+    void saveGradePaperDimensionBatch(GradePaperDimensionParam gradePaperDimensionParam, SysUser requestUser);
 
     /**
      * 分析 - 试卷知识维度数据导入
@@ -47,9 +47,10 @@ public interface GradePaperDimensionService extends IService<GradePaperDimension
      * @param file        excel 文件
      * @param paperNumber 试卷编号
      * @param paperType   试卷类型
+     * @param paperName   试卷名称
      * @param requestUser 请求用户
      */
-    void importGradePaperKnowledgeDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException;
+    void importGradePaperKnowledgeDimension(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
      * 分析 - 试卷能力维度数据导入
@@ -57,9 +58,10 @@ public interface GradePaperDimensionService extends IService<GradePaperDimension
      * @param file        excel 文件
      * @param paperNumber 试卷编号
      * @param paperType   试卷类型
+     * @param paperName   试卷名称
      * @param requestUser 请求用户
      */
-    void importGradePaperAbilityDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException;
+    void importGradePaperAbilityDimension(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
      * 分析 - 试卷维度模板导出
@@ -72,10 +74,11 @@ public interface GradePaperDimensionService extends IService<GradePaperDimension
 
     /**
      * 分析 - 查询二级维度集合
-     * @param paperNumber 试卷编号
-     * @param paperType 试卷类型
+     *
+     * @param paperNumber   试卷编号
+     * @param paperType     试卷类型
      * @param dimensionType 维度类型
-     * @param requestUser 请求用户
+     * @param requestUser   请求用户
      * @return 结果
      */
     List<SecondDimensionResult> findSecondDimensionList(String paperNumber, String paperType, DimensionEnum dimensionType, SysUser requestUser);

+ 7 - 9
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchPaperServiceImpl.java

@@ -43,9 +43,9 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
     TeachcloudCommonService teachcloudCommonService;
 
     @Override
-    public IPage<GradeBatchPaperResult> findGradeBatchPaperPage(Long semesterId, Long examId, Long basicCourseId, int pageNumber, int pageSize, SysUser requestUser) {
+    public IPage<GradeBatchPaperResult> findGradeBatchPaperPage(Long semesterId, Long examId, String courseCode, int pageNumber, int pageSize, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
-        IPage<GradeBatchPaperResult> datasource = this.baseMapper.findGradeBatchPaperPage(new Page<>(pageNumber, pageSize), semesterId, examId, basicCourseId, schoolId);
+        IPage<GradeBatchPaperResult> datasource = this.baseMapper.findGradeBatchPaperPage(new Page<>(pageNumber, pageSize), semesterId, examId, courseCode, schoolId);
         for (GradeBatchPaperResult record : datasource.getRecords()) {
             Long teachingRoomId = record.getTeachingRoomId();
             SysOrg teachCollege = this.findTeachCollegeByOrgId(teachingRoomId);
@@ -56,17 +56,16 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
     }
 
     @Override
-    public List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long semesterId, Long examId, Long collegeId, Long basicCourseId, String teacherName, SysUser requestUser) {
+    public List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long semesterId, Long examId, Long collegeId, String courseCode, String teacherName, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
         Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
-        List<GradeBatchPaperResult> datasource = this.baseMapper.findAbleAnalyzePaper(semesterId, examId, collegeId, basicCourseId, teacherName, orgIds, schoolId);
+        List<GradeBatchPaperResult> datasource = this.baseMapper.findAbleAnalyzePaper(semesterId, examId, collegeId, courseCode, teacherName, orgIds, schoolId);
         List<GradeBatchPaperResult> needAddList = new ArrayList<>();
         for (GradeBatchPaperResult gradeBatchPaperResult : datasource) {
             // 额外处理开课学院
             Long teachingRoomId = gradeBatchPaperResult.getTeachingRoomId();
             SysOrg teachCollege = this.findTeachCollegeByOrgId(teachingRoomId);
             if (SystemConstant.longNotNull(collegeId) && !collegeId.equals(teachCollege.getId())) {
-                datasource.remove(gradeBatchPaperResult);
                 continue;
             }
             gradeBatchPaperResult.setTeachCollegeId(teachCollege.getId());
@@ -80,10 +79,8 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
                 needAdd.setPaperType(paperTypeCell);
                 needAddList.add(needAdd);
             }
-            datasource.remove(gradeBatchPaperResult);
         }
-        datasource.addAll(needAddList);
-        return datasource.stream().sorted(Comparator.comparing(GradeBatchPaperResult::getSemesterName)
+        return needAddList.stream().sorted(Comparator.comparing(GradeBatchPaperResult::getSemesterName)
                 .thenComparing(GradeBatchPaperResult::getExamName)
                 .thenComparing(GradeBatchPaperResult::getTeachCollegeId)
                 .thenComparing(GradeBatchPaperResult::getCourseCode)
@@ -110,6 +107,7 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
             gradeBatchPaper.setBatchId(batchId);
             gradeBatchPaper.setPaperNumber(paperNumber);
             gradeBatchPaper.setPaperType(paperType);
+            gradeBatchPaper.setPaperName(e.getPaperName());
             gradeBatchPaper.setTeachCollegeId(teachCollegeId);
             gradeBatchPaper.setTeachCollegeName(teachCollegeName);
 
@@ -163,7 +161,7 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
                 .eq(GradeBatchPaper::getSchoolId, schoolId)
                 .eq(GradeBatchPaper::getPaperNumber, paperNumber)
                 .eq(GradeBatchPaper::getPaperType, paperType));
-        if (gradeBatchPaperList.stream().anyMatch(e -> GradeAnalyzePaperStatusEnum.CALCULATING.equals(e.getStatus()))){
+        if (gradeBatchPaperList.stream().anyMatch(e -> GradeAnalyzePaperStatusEnum.CALCULATING.equals(e.getStatus()))) {
             throw ExceptionResultEnum.ERROR.exception("选择的试卷有正在计算的分析课程");
         }
     }

+ 35 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchServiceImpl.java

@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.bean.params.analyze.GradeBatchParam;
 import com.qmth.distributed.print.business.bean.result.analyze.GradeBatchResult;
 import com.qmth.distributed.print.business.entity.GradeBatch;
+import com.qmth.distributed.print.business.entity.GradeBatchPaper;
 import com.qmth.distributed.print.business.enums.GradeAnalyzePaperStatusEnum;
 import com.qmth.distributed.print.business.mapper.GradeBatchMapper;
+import com.qmth.distributed.print.business.service.GradeBatchPaperService;
 import com.qmth.distributed.print.business.service.GradeBatchService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -17,7 +19,11 @@ import org.apache.commons.lang3.time.DateFormatUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.util.List;
 import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -29,6 +35,8 @@ import java.util.Objects;
  */
 @Service
 public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBatch> implements GradeBatchService {
+    @Resource
+    GradeBatchPaperService gradeBatchPaperService;
 
     @Override
     public IPage<GradeBatchResult> gradeBatchPage(String batchName, int pageNumber, int pageSize, SysUser requestUser) {
@@ -55,6 +63,7 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
         gradeBatch.setBatchTime(batchTime);
         gradeBatch.setBatchCode(DateFormatUtils.format(batchTime, "yyyyMMdd"));
         gradeBatch.setStatus(GradeAnalyzePaperStatusEnum.SETTING_GRADE_PAPER);
+        gradeBatch.setSchoolId(schoolId);
         if (!SystemConstant.longNotNull(id)) {
             id = SystemConstant.getDbUuid();
         }
@@ -63,4 +72,30 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
         this.saveOrUpdate(gradeBatch);
         return id;
     }
+
+    @Override
+    public void deleteGradeBatch(List<Long> idList, SysUser requestUser) {
+        Long schoolId = requestUser.getSchoolId();
+        if (idList == null || idList.size() == 0) {
+            throw ExceptionResultEnum.ERROR.exception("请选择要删除的批次对象");
+        }
+        // 要删除的批次试卷集合
+        List<GradeBatchPaper> gradeBatchPaperList = gradeBatchPaperService.list(new QueryWrapper<GradeBatchPaper>()
+                .lambda()
+                .eq(GradeBatchPaper::getSchoolId, schoolId)
+                .in(GradeBatchPaper::getBatchId, idList));
+
+        if (gradeBatchPaperList != null && gradeBatchPaperList.size() > 0) {
+            Set<Long> batchIdSet = gradeBatchPaperList.stream().map(GradeBatchPaper::getBatchId).collect(Collectors.toSet());
+            List<String> cantDeleteBatchNameList = this.list(new QueryWrapper<GradeBatch>()
+                            .lambda()
+                            .in(GradeBatch::getId, batchIdSet))
+                    .stream()
+                    .map(GradeBatch::getBatchName)
+                    .distinct().collect(Collectors.toList());
+
+            throw ExceptionResultEnum.ERROR.exception("成绩分析批次【" + String.join(",", cantDeleteBatchNameList) + "】存在分析课程,不能删除");
+        }
+        this.removeByIds(idList);
+    }
 }

+ 54 - 51
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperDimensionServiceImpl.java

@@ -7,6 +7,7 @@ import com.google.common.collect.Lists;
 import com.qmth.distributed.print.business.bean.dto.excel.GradePaperDimensionAbilityDto;
 import com.qmth.distributed.print.business.bean.dto.excel.GradePaperDimensionKnowledgeDto;
 import com.qmth.distributed.print.business.bean.dto.open.PaperDimension;
+import com.qmth.distributed.print.business.bean.params.analyze.GradePaperDimensionDatasource;
 import com.qmth.distributed.print.business.bean.params.analyze.GradePaperDimensionParam;
 import com.qmth.distributed.print.business.bean.result.analyze.GradePaperDimensionResult;
 import com.qmth.distributed.print.business.bean.result.analyze.SecondDimensionResult;
@@ -50,29 +51,25 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
     }
 
     @Override
-    public void saveGradePaperDimensionBatch(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser) {
-        List<String> paperNumberList = gradePaperDimensionParamList.stream().map(GradePaperDimensionParam::getPaperNumber).distinct().collect(Collectors.toList());
-        if (paperNumberList.size() != 1) {
-            throw ExceptionResultEnum.ERROR.exception("一次只能提交同一个试卷编号下的试卷维度数据");
-        }
-        List<String> paperTypeList = gradePaperDimensionParamList.stream().map(GradePaperDimensionParam::getPaperType).distinct().collect(Collectors.toList());
-        if (paperTypeList.size() != 1) {
-            throw ExceptionResultEnum.ERROR.exception("一次只能提交同一个试卷类型下的试卷维度数据");
-        }
-        String paperNumber = paperNumberList.get(0);
-        String paperType = paperTypeList.get(0);
+    public void saveGradePaperDimensionBatch(GradePaperDimensionParam gradePaperDimensionParam, SysUser requestUser) {
+        String paperNumber = gradePaperDimensionParam.getPaperNumber();
+        String paperType = gradePaperDimensionParam.getPaperType();
+        String paperName = gradePaperDimensionParam.getPaperName();
+        DimensionEnum dimensionType = gradePaperDimensionParam.getDimensionType();
+        List<GradePaperDimensionDatasource> datasource = gradePaperDimensionParam.getDatasource();
         gradeBatchPaperService.checkOperateAuth(requestUser.getSchoolId(), paperNumber, paperType);
-        List<GradePaperDimension> gradePaperDimensionList = this.checkAndBuildGradePaperDimensionList(gradePaperDimensionParamList, requestUser);
+        List<GradePaperDimension> gradePaperDimensionList = this.checkAndBuildGradePaperDimensionList(datasource, paperNumber, paperType, paperName, dimensionType, requestUser);
         this.remove(new QueryWrapper<GradePaperDimension>().lambda()
                 .eq(GradePaperDimension::getSchoolId, requestUser.getSchoolId())
                 .eq(GradePaperDimension::getPaperNumber, paperNumber)
-                .eq(GradePaperDimension::getPaperType, paperType));
+                .eq(GradePaperDimension::getPaperType, paperType)
+                .eq(GradePaperDimension::getDimensionType, dimensionType));
         this.saveBatch(gradePaperDimensionList);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importGradePaperKnowledgeDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException {
+    public void importGradePaperKnowledgeDimension(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException {
         if (Objects.isNull(file)) {
             throw ExceptionResultEnum.ERROR.exception("找不到附件");
         }
@@ -83,7 +80,7 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
             }
             return finalExcelList;
         });
-        List<GradePaperDimensionParam> gradePaperDimensionParamList = new ArrayList<>();
+        List<GradePaperDimensionDatasource> gradePaperDimensionDatasourceList = new ArrayList<>();
 
         if (Objects.nonNull(finalList) && finalList.size() > 0) {
             for (int i = 0; i < finalList.size(); i++) {
@@ -94,25 +91,28 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
                     if (importList.get(y) instanceof GradePaperDimensionKnowledgeDto) {
                         GradePaperDimensionKnowledgeDto gradePaperDimensionKnowledgeDto = (GradePaperDimensionKnowledgeDto) importList.get(y);
 
-                        GradePaperDimensionParam gradePaperDimensionParam = new GradePaperDimensionParam();
-                        gradePaperDimensionParam.setPaperNumber(paperNumber);
-                        gradePaperDimensionParam.setPaperType(paperType);
-                        gradePaperDimensionParam.setDimensionType(DimensionEnum.KNOWLEDGE);
-                        gradePaperDimensionParam.setCodePrimary(gradePaperDimensionKnowledgeDto.getCodePrimary());
-                        gradePaperDimensionParam.setNamePrimary(gradePaperDimensionKnowledgeDto.getNamePrimary());
-                        gradePaperDimensionParam.setCodeSecond(gradePaperDimensionKnowledgeDto.getCodeSecond());
-                        gradePaperDimensionParam.setNameSecond(gradePaperDimensionKnowledgeDto.getNameSecond());
-                        gradePaperDimensionParamList.add(gradePaperDimensionParam);
+                        GradePaperDimensionDatasource gradePaperDimensionDatasource = new GradePaperDimensionDatasource();
+                        gradePaperDimensionDatasource.setCodePrimary(gradePaperDimensionKnowledgeDto.getCodePrimary());
+                        gradePaperDimensionDatasource.setNamePrimary(gradePaperDimensionKnowledgeDto.getNamePrimary());
+                        gradePaperDimensionDatasource.setCodeSecond(gradePaperDimensionKnowledgeDto.getCodeSecond());
+                        gradePaperDimensionDatasource.setNameSecond(gradePaperDimensionKnowledgeDto.getNameSecond());
+                        gradePaperDimensionDatasourceList.add(gradePaperDimensionDatasource);
                     }
                 }
             }
         }
-        this.saveGradePaperDimensionBatch(gradePaperDimensionParamList, requestUser);
+        GradePaperDimensionParam gradePaperDimensionParam = new GradePaperDimensionParam();
+        gradePaperDimensionParam.setDatasource(gradePaperDimensionDatasourceList);
+        gradePaperDimensionParam.setPaperNumber(paperNumber);
+        gradePaperDimensionParam.setPaperType(paperType);
+        gradePaperDimensionParam.setPaperName(paperName);
+        gradePaperDimensionParam.setDimensionType(DimensionEnum.KNOWLEDGE);
+        this.saveGradePaperDimensionBatch(gradePaperDimensionParam, requestUser);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importGradePaperAbilityDimension(MultipartFile file, String paperNumber, String paperType, SysUser requestUser) throws IOException, NoSuchFieldException {
+    public void importGradePaperAbilityDimension(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException {
         if (Objects.isNull(file)) {
             throw ExceptionResultEnum.ERROR.exception("找不到附件");
         }
@@ -123,7 +123,7 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
             }
             return finalExcelList;
         });
-        List<GradePaperDimensionParam> gradePaperDimensionParamList = new ArrayList<>();
+        List<GradePaperDimensionDatasource> gradePaperDimensionDatasourceList = new ArrayList<>();
 
         if (Objects.nonNull(finalList) && finalList.size() > 0) {
             for (int i = 0; i < finalList.size(); i++) {
@@ -131,22 +131,25 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
                 List<Object> importList = map.get(i);
 
                 for (int y = 0; y < Objects.requireNonNull(importList).size(); y++) {
-                    if (importList.get(y) instanceof GradePaperDimensionKnowledgeDto) {
+                    if (importList.get(y) instanceof GradePaperDimensionAbilityDto) {
                         GradePaperDimensionAbilityDto gradePaperDimensionAbilityDto = (GradePaperDimensionAbilityDto) importList.get(y);
 
-                        GradePaperDimensionParam gradePaperDimensionParam = new GradePaperDimensionParam();
-                        gradePaperDimensionParam.setPaperNumber(paperNumber);
-                        gradePaperDimensionParam.setPaperType(paperType);
-                        gradePaperDimensionParam.setDimensionType(DimensionEnum.KNOWLEDGE);
-                        gradePaperDimensionParam.setCodePrimary(gradePaperDimensionAbilityDto.getCodePrimary());
-                        gradePaperDimensionParam.setNamePrimary(gradePaperDimensionAbilityDto.getNamePrimary());
-                        gradePaperDimensionParam.setInterpretation(gradePaperDimensionAbilityDto.getInterpret());
-                        gradePaperDimensionParamList.add(gradePaperDimensionParam);
+                        GradePaperDimensionDatasource gradePaperDimensionDatasource = new GradePaperDimensionDatasource();
+                        gradePaperDimensionDatasource.setCodePrimary(gradePaperDimensionAbilityDto.getCodePrimary());
+                        gradePaperDimensionDatasource.setNamePrimary(gradePaperDimensionAbilityDto.getNamePrimary());
+                        gradePaperDimensionDatasource.setInterpretation(gradePaperDimensionAbilityDto.getInterpret());
+                        gradePaperDimensionDatasourceList.add(gradePaperDimensionDatasource);
                     }
                 }
             }
         }
-        this.saveGradePaperDimensionBatch(gradePaperDimensionParamList, requestUser);
+        GradePaperDimensionParam gradePaperDimensionParam = new GradePaperDimensionParam();
+        gradePaperDimensionParam.setDatasource(gradePaperDimensionDatasourceList);
+        gradePaperDimensionParam.setPaperNumber(paperNumber);
+        gradePaperDimensionParam.setPaperType(paperType);
+        gradePaperDimensionParam.setPaperName(paperName);
+        gradePaperDimensionParam.setDimensionType(DimensionEnum.ABILITY);
+        this.saveGradePaperDimensionBatch(gradePaperDimensionParam, requestUser);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -206,24 +209,24 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
      * 4.二级维度编号在数据集中唯一
      * </p>
      *
-     * @param gradePaperDimensionParamList 分析试卷维度集合
-     * @param requestUser                  用户
-     * @return 结果
+     * @param gradePaperDimensionDatasourceList 分析试卷维度集合
+     * @param paperNumber                       试卷编号
+     * @param paperType                         试卷类型
+     * @param paperName                         试卷名称
+     * @param dimensionType                     维度类型
+     * @param requestUser                       请求用户
+     * @return 构建好的维度预新增对象集合
      */
-    private List<GradePaperDimension> checkAndBuildGradePaperDimensionList(List<GradePaperDimensionParam> gradePaperDimensionParamList, SysUser requestUser) {
+    private List<GradePaperDimension> checkAndBuildGradePaperDimensionList(List<GradePaperDimensionDatasource> gradePaperDimensionDatasourceList, String paperNumber, String paperType, String paperName, DimensionEnum dimensionType, SysUser requestUser) {
         Map<String, String> checkPrimaryCodeNameMap = new HashMap<>();
         List<GradePaperDimension> gradePaperDimensionList = new ArrayList<>();
 
-        for (GradePaperDimensionParam gradePaperDimensionParam : gradePaperDimensionParamList) {
-            String paperNumber = gradePaperDimensionParam.getPaperNumber();
-            String paperType = gradePaperDimensionParam.getPaperType();
-            String paperName = gradePaperDimensionParam.getPaperName();
-            DimensionEnum dimensionType = gradePaperDimensionParam.getDimensionType();
-            String codePrimary = gradePaperDimensionParam.getCodePrimary();
-            String namePrimary = gradePaperDimensionParam.getNamePrimary();
-            String codeSecond = gradePaperDimensionParam.getCodeSecond();
-            String nameSecond = gradePaperDimensionParam.getNameSecond();
-            String interpretation = gradePaperDimensionParam.getInterpretation();
+        for (GradePaperDimensionDatasource gradePaperDimensionDatasource : gradePaperDimensionDatasourceList) {
+            String codePrimary = gradePaperDimensionDatasource.getCodePrimary();
+            String namePrimary = gradePaperDimensionDatasource.getNamePrimary();
+            String codeSecond = gradePaperDimensionDatasource.getCodeSecond();
+            String nameSecond = gradePaperDimensionDatasource.getNameSecond();
+            String interpretation = gradePaperDimensionDatasource.getInterpretation();
 
             if (SystemConstant.isOneNull(paperNumber, paperType, dimensionType, codePrimary, namePrimary)) {
                 throw ExceptionResultEnum.PARAMS_ERROR.exception();

+ 5 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java

@@ -32,6 +32,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
@@ -181,8 +182,8 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
                         gradePaperStructDatasource.setBigQuestionNumber(gradePaperStructDto.getBigQuestionNumber());
                         gradePaperStructDatasource.setSmallQuestionNumber(gradePaperStructDto.getSmallQuestionNumber());
                         gradePaperStructDatasource.setBigTopicName(gradePaperStructDto.getBigTopicName());
-                        gradePaperStructDatasource.setNumberType(gradePaperStructDto.getNumberType());
-                        gradePaperStructDatasource.setFullScore(gradePaperStructDto.getFullScore());
+                        gradePaperStructDatasource.setNumberType(QuestionType.convertToEnum(gradePaperStructDto.getNumberType()));
+                        gradePaperStructDatasource.setFullScore(BigDecimal.valueOf(Double.parseDouble(gradePaperStructDto.getFullScore())));
                         gradePaperStructDatasource.setKnowledgeDimension(gradePaperStructDto.getKnowledgeDimension());
                         gradePaperStructDatasource.setAbilityDimension(gradePaperStructDto.getAbilityDimension());
                         gradePaperStructDatasourceList.add(gradePaperStructDatasource);
@@ -213,11 +214,11 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
             cell.setCourseName(courseName);
             cell.setPaperNumber(e.getPaperNumber());
             cell.setPaperType(e.getPaperType());
-            cell.setNumberType(e.getNumberType());
+            cell.setNumberType(e.getNumberType().getDesc());
             cell.setBigTopicName(e.getBigTopicName());
             cell.setBigQuestionNumber(e.getBigQuestionNumber());
             cell.setSmallQuestionNumber(e.getSmallQuestionNumber());
-            cell.setFullScore(e.getFullScore());
+            cell.setFullScore(String.valueOf(e.getFullScore()));
             cell.setKnowledgeDimension(e.getKnowledgeDimension());
             cell.setAbilityDimension(e.getAbilityDimension());
             return Stream.of(cell);

+ 4 - 10
distributed-print-business/src/main/resources/mapper/GradeBatchPaperMapper.xml

@@ -44,9 +44,6 @@
         LEFT JOIN
         basic_semester bs ON be.school_id = bs.school_id
         AND be.semester_id = bs.id
-        LEFT JOIN
-        basic_course bc ON et.school_id = bc.school_id
-        AND et.course_code = bc.code
         <where>
             <if test="schoolId != null and schoolId != ''">
                 AND gbp.school_id = #{schoolId}
@@ -57,8 +54,8 @@
             <if test="examId != null and examId != ''">
                 AND be.id = #{examId}
             </if>
-            <if test="basicCourseId != null and basicCourseId != ''">
-                AND bc.id = #{basicCourseId}
+            <if test="courseCode != null and courseCode != ''">
+                AND et.course_code = #{courseCode}
             </if>
         </where>
     </select>
@@ -84,9 +81,6 @@
         LEFT JOIN
         basic_semester bs ON bs.school_id = et.school_id
         AND bs.id = be.semester_id
-        LEFT JOIN
-        basic_course bc ON bc.school_id = et.school_id
-        AND bc.code = et.course_code
         <where>
             AND etd.exposed_paper_type != ''
             <if test="schoolId != null and schoolId != ''">
@@ -98,8 +92,8 @@
             <if test="examId != null and examId != ''">
                 AND be.id = #{examId}
             </if>
-            <if test="basicCourseId != null and basicCourseId != ''">
-                AND bc.id = #{basicCourseId}
+            <if test="courseCode != null and courseCode != ''">
+                AND et.course_code = #{courseCode}
             </if>
             <if test="orgIds != null">
                 AND et.org_id IN

+ 59 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchController.java

@@ -1,8 +1,27 @@
 package com.qmth.distributed.print.api;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.analyze.GradeBatchParam;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.service.GradeBatchService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -12,8 +31,45 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2022-05-20
  */
+@Api(tags = "分析批次管理Controller")
 @RestController
-@RequestMapping("/grade-batch")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/batch")
+@Validated
+@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradeBatchController {
+    @Resource
+    private GradeBatchService gradeBatchService;
 
+    @ApiOperation(value = "成绩分析批次-查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findGradeBatchPage(@ApiParam(value = "分析批次名称") @RequestParam(required = false) String gradeBatchName,
+                                     @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) {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(gradeBatchService.gradeBatchPage(gradeBatchName, pageNumber, pageSize, requestUser));
+    }
+
+    @ApiOperation(value = "成绩分析批次-新建")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    public Result saveGradeBatch(@Valid @RequestBody GradeBatchParam gradeBatchParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(gradeBatchService.editGradeBatch(gradeBatchParam, requestUser));
+    }
+
+    @ApiOperation(value = "成绩分析批次-删除")
+    @RequestMapping(value = "/delete", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    public Result deleteGradeBatch(@ApiParam(value = "选择的要删除的成绩分析批次id集合", required = true) @RequestParam List<String> idList) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        gradeBatchService.deleteGradeBatch(idList.stream().map(SystemConstant::convertIdToLong).collect(Collectors.toList()), requestUser);
+        return ResultUtil.ok();
+    }
+
+    // TODO: 2022/6/2 成绩分析批次推送 
 }

+ 74 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchPaperController.java

@@ -1,8 +1,27 @@
 package com.qmth.distributed.print.api;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.analyze.GradeBatchPaperParam;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.service.GradeBatchPaperService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -12,8 +31,60 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2022-05-20
  */
+@Api(tags = "分析批次课程管理Controller")
 @RestController
-@RequestMapping("/grade-batch-paper")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/batch/paper")
+@Validated
+@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradeBatchPaperController {
+    @Resource
+    private GradeBatchPaperService gradeBatchPaperService;
 
+    @ApiOperation(value = "成绩分析批次课程-查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findGradeBatchPaperPage(@ApiParam(value = "学期id") @RequestParam(required = false) String semesterId,
+                                          @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
+                                          @ApiParam(value = "课程编号") @RequestParam(required = false) 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) {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(gradeBatchPaperService.findGradeBatchPaperPage(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), courseCode, pageNumber, pageSize, requestUser));
+    }
+
+    @ApiOperation(value = "成绩分析批次课程-查询可分析试卷")
+    @RequestMapping(value = "/able", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findAbleAnalyzePaperList(@ApiParam(value = "学期id") @RequestParam(required = false) String semesterId,
+                                           @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
+                                           @ApiParam(value = "学院id") @RequestParam(required = false) String collegeId,
+                                           @ApiParam(value = "课程编号") @RequestParam(required = false) String courseCode,
+                                           @ApiParam(value = "命题教师") @RequestParam(required = false) String teacherName) {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(gradeBatchPaperService.findAbleAnalyzePaperList(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), SystemConstant.convertIdToLong(collegeId), courseCode, teacherName, requestUser));
+    }
+
+    @ApiOperation(value = "成绩分析批次课程-新建")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    public Result saveGradeBatchPaper(@Valid @RequestBody GradeBatchPaperParam gradeBatchPaperParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        gradeBatchPaperService.saveGradeBatchPaper(gradeBatchPaperParam, requestUser);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "成绩分析批次课程-删除")
+    @RequestMapping(value = "/delete", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    public Result deleteGradeBatchPaper(@ApiParam(value = "选择的要删除的成绩分析课程id集合", required = true) @RequestParam List<String> idList) {
+        gradeBatchPaperService.deleteGradeBatchPaper(idList.stream().map(SystemConstant::convertIdToLong).collect(Collectors.toList()));
+        return ResultUtil.ok();
+    }
+
+    // TODO: 2022/6/2 成绩分析课程推送,计算
 }

+ 47 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/GradeModuleEvaluationController.java

@@ -1,8 +1,23 @@
 package com.qmth.distributed.print.api;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.analyze.GradeModuleEvaluationParam;
+import com.qmth.distributed.print.business.service.GradeModuleEvaluationService;
+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 io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
 
 /**
  * <p>
@@ -12,8 +27,37 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2022-05-20
  */
+@Api(tags = "分析课程维度模块评价管理Controller")
 @RestController
-@RequestMapping("/grade-module-evaluation")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/module/evaluation")
+@Validated
+@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradeModuleEvaluationController {
+    @Resource
+    private GradeModuleEvaluationService gradeModuleEvaluationService;
 
+    @ApiOperation(value = "成绩分析模块评价-查询")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findGradeModuleEvaluationList(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                                                @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (SystemConstant.isOneNull(paperNumber, paperType)) {
+            throw ExceptionResultEnum.ERROR.exception("试卷参数不完整");
+        }
+        return ResultUtil.ok(gradeModuleEvaluationService.findGradeModuleEvaluation(paperNumber, paperType, requestUser));
+    }
+
+    @ApiOperation(value = "成绩分析模块评价-新建模块评价")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    public Result saveGradeModuleEvaluationBatch(@Valid @RequestBody GradeModuleEvaluationParam gradeModuleEvaluationParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        gradeModuleEvaluationService.saveGradeModuleEvaluationBatch(gradeModuleEvaluationParam, requestUser);
+        return ResultUtil.ok();
+    }
 }

+ 61 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperController.java

@@ -1,8 +1,25 @@
 package com.qmth.distributed.print.api;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.analyze.GradePaperDefineParam;
+import com.qmth.distributed.print.business.service.GradeInitializeService;
+import com.qmth.distributed.print.business.service.GradePaperService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 
 /**
  * <p>
@@ -12,8 +29,49 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2022-05-20
  */
+@Api(tags = "分析课程(试卷)管理Controller")
 @RestController
-@RequestMapping("/grade-paper")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/paper")
+@Validated
+@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradePaperController {
+    @Resource
+    private GradePaperService gradePaperService;
+    @Resource
+    private GradeInitializeService gradeInitializeService;
 
+    @ApiOperation(value = "成绩分析课程数据初始化")
+    @RequestMapping(value = "/initialize", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findGradePaperInitialize(@ApiParam(value = "学期id") @RequestParam(required = false) String semesterId,
+                                           @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
+                                           @ApiParam(value = "课程编号") @RequestParam(required = false) 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) {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(gradeInitializeService.findNeedAnalyzedPaper(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), courseCode, requestUser, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "成绩分析课程-查询定义")
+    @RequestMapping(value = "/paper_define", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findGradePaperDefine(@ApiParam(value = "课程编号", required = true) @RequestParam String paperNumber,
+                                       @ApiParam(value = "课程编号", required = true) @RequestParam String paperType) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(gradePaperService.findGradePaperDefine(paperNumber, paperType, requestUser));
+    }
+
+
+    @ApiOperation(value = "成绩分析课程-新建定义")
+    @RequestMapping(value = "/save_define", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    public Result saveGradePaperDefine(@Valid @RequestBody GradePaperDefineParam gradePaperDefineParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        gradePaperService.saveGradePaperDefine(gradePaperDefineParam, requestUser);
+        return ResultUtil.ok();
+    }
 }

+ 92 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperDimensionController.java

@@ -1,8 +1,28 @@
 package com.qmth.distributed.print.api;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.analyze.GradePaperDimensionParam;
+import com.qmth.distributed.print.business.enums.DimensionEnum;
+import com.qmth.distributed.print.business.service.GradePaperDimensionService;
+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 io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.io.IOException;
 
 /**
  * <p>
@@ -12,8 +32,77 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2022-05-20
  */
+@Api(tags = "分析课程维度管理Controller")
 @RestController
-@RequestMapping("/grade-paper-dimension")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/paper/dimension")
+@Validated
+@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradePaperDimensionController {
+    @Resource
+    private GradePaperDimensionService gradePaperDimensionService;
 
+    @ApiOperation(value = "成绩分析维度-查询")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findGradePaperDimensionList(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                                              @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (SystemConstant.isOneNull(paperNumber, paperType)) {
+            throw ExceptionResultEnum.ERROR.exception("试卷参数不完整");
+        }
+        return ResultUtil.ok(gradePaperDimensionService.findGradePaperDimensionList(paperNumber, paperType, requestUser));
+    }
+
+    @ApiOperation(value = "成绩分析维度-新建维度")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    public Result saveGradePaperDimensionBatch(@Valid @RequestBody GradePaperDimensionParam gradePaperDimensionParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        gradePaperDimensionService.saveGradePaperDimensionBatch(gradePaperDimensionParam, requestUser);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "成绩分析维度-导入")
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    public Result gradePaperDimensionImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                                            @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                                            @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType,
+                                            @ApiParam(value = "试卷名称", required = true) @RequestParam String paperName,
+                                            @ApiParam(value = "维度类型", required = true) @RequestParam DimensionEnum dimensionType) throws IOException, NoSuchFieldException {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (SystemConstant.isOneNull(file, paperNumber, paperType, paperName, dimensionType)) {
+            throw ExceptionResultEnum.ERROR.exception("参数不完整");
+        }
+
+        switch (dimensionType) {
+            case KNOWLEDGE:
+                gradePaperDimensionService.importGradePaperKnowledgeDimension(file, paperNumber, paperType, paperName, requestUser);
+                break;
+            case ABILITY:
+                gradePaperDimensionService.importGradePaperAbilityDimension(file, paperNumber, paperType, paperName, requestUser);
+                break;
+        }
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "成绩分析维度-模板导出")
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    public Result gradePaperDimensionExport(@ApiParam(value = "课程编号", required = true) @RequestParam String courseCode,
+                                            @ApiParam(value = "课程名称", required = true) @RequestParam String courseName,
+                                            @ApiParam(value = "维度类型", required = true) @RequestParam DimensionEnum dimensionType) throws Exception {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (SystemConstant.isOneNull(courseCode,courseName, dimensionType)) {
+            throw ExceptionResultEnum.ERROR.exception("参数不完整");
+        }
+        gradePaperDimensionService.exportGradePaperDimensionTemplate(courseCode,courseName,dimensionType);
+        return ResultUtil.ok();
+    }
 }

+ 79 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java

@@ -1,8 +1,25 @@
 package com.qmth.distributed.print.api;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructParam;
+import com.qmth.distributed.print.business.service.GradePaperStructService;
+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 io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.io.IOException;
 
 /**
  * <p>
@@ -12,8 +29,67 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2022-05-20
  */
+@Api(tags = "分析课程试卷结构管理Controller")
 @RestController
-@RequestMapping("/grade-paper-struct")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/paper/struct")
+@Validated
+@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradePaperStructController {
+    @Resource
+    private GradePaperStructService gradePaperStructService;
 
+    @ApiOperation(value = "成绩分析试卷结构-查询")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findGradePaperStructList(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                                           @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (SystemConstant.isOneNull(paperNumber, paperType)) {
+            throw ExceptionResultEnum.ERROR.exception("试卷参数不完整");
+        }
+        return ResultUtil.ok(gradePaperStructService.findGradePaperStructureResultList(paperNumber, paperType, requestUser));
+    }
+
+    @ApiOperation(value = "成绩分析试卷结构-新建试卷结构")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    public Result saveGradePaperStructBatch(@Valid @RequestBody GradePaperStructParam gradePaperStructParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        gradePaperStructService.saveGradePaperStructBatch(gradePaperStructParam, requestUser);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "成绩分析试卷结构-导入")
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    public Result gradePaperStructImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                                         @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+                                         @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType,
+                                         @ApiParam(value = "试卷名称", required = true) @RequestParam String paperName) throws IOException, NoSuchFieldException {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (SystemConstant.isOneNull(file, paperNumber, paperType, paperName)) {
+            throw ExceptionResultEnum.ERROR.exception("参数不完整");
+        }
+        gradePaperStructService.importGradePaperStruct(file, paperNumber, paperType, paperName, requestUser);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "成绩分析试卷结构-模板导出")
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    public Result gradePaperStructExport(@ApiParam(value = "课程编号", required = true) @RequestParam String paperNumber,
+                                         @ApiParam(value = "课程名称", required = true) @RequestParam String paperType) throws Exception {
+
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        if (SystemConstant.isOneNull(paperNumber, paperType)) {
+            throw ExceptionResultEnum.ERROR.exception("参数不完整");
+        }
+        gradePaperStructService.exportGradePaperStructTemplate(paperNumber, paperType, requestUser);
+        return ResultUtil.ok();
+    }
 }

+ 25 - 8
distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java

@@ -10,6 +10,7 @@ import com.qmth.distributed.print.business.service.AuthInfoService;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicSchool;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.*;
 import io.swagger.annotations.*;
@@ -113,19 +114,35 @@ public class TSAuthController {
 //        String result = HttpUtil.postJson(dictionaryConfig.reportOpenDomain().getHostUrl() + dictionaryConfig.reportOpenDomain().getExamApi(), JacksonUtil.parseJson(map), accessToken, timestamp);
 //        if (Objects.nonNull(result)) {
 //            log.info("result:{}", JacksonUtil.parseJson(result));
+//        }
+
+//        /**
+//         * 测试推送分析课程(试卷)
+//         */
+//        Map<String, Object> map = new HashMap<>();
+//        map.computeIfAbsent("examId", v -> 262946761763454976L);
+//        map.computeIfAbsent("courseCode", v -> 2022052700001L + "A");//试卷编号+卷型
+//        map.computeIfAbsent("courseName", v -> "测试课程1");
+//        map.computeIfAbsent("paperType", v -> "A");
+//        map.computeIfAbsent("teachCollegeName", v -> "测试机构1");//机构名称
+//        String accessToken = SignatureEntity.build(SignatureType.SECRET, SystemConstant.METHOD, dictionaryConfig.reportOpenDomain().getCourseApi(), timestamp, basicSchool.getAccessKey(), basicSchool.getAccessSecret());
+//        String result = HttpUtil.postJson(dictionaryConfig.reportOpenDomain().getHostUrl() + dictionaryConfig.reportOpenDomain().getCourseApi(), JacksonUtil.parseJson(map), accessToken, timestamp);
+//        if (Objects.nonNull(result)) {
+//            log.info("result:{}", JacksonUtil.parseJson(result));
 //        }
 
         /**
-         * 测试推送分析课程(试卷)
+         * 测试单点登录
          */
         Map<String, Object> map = new HashMap<>();
-        map.computeIfAbsent("examId", v -> 262946761763454976L);
-        map.computeIfAbsent("courseCode", v -> 2022052700001L + "A");//试卷编号+卷型
-        map.computeIfAbsent("courseName", v -> "测试课程1");
-        map.computeIfAbsent("paperType", v -> "A");
-        map.computeIfAbsent("teachCollegeName", v -> "测试机构1");//机构名称
-        String accessToken = SignatureEntity.build(SignatureType.SECRET, SystemConstant.METHOD, dictionaryConfig.reportOpenDomain().getCourseApi(), timestamp, basicSchool.getAccessKey(), basicSchool.getAccessSecret());
-        String result = HttpUtil.postJson(dictionaryConfig.reportOpenDomain().getHostUrl() + dictionaryConfig.reportOpenDomain().getCourseApi(), JacksonUtil.parseJson(map), accessToken, timestamp);
+        map.computeIfAbsent("loginName", v -> "admin");
+        map.computeIfAbsent("role", v -> RoleTypeEnum.OFFICE_TEACHER);
+        map.computeIfAbsent("orgName", v -> "本科生院");
+        map.computeIfAbsent("realName", v -> "admin");
+        map.computeIfAbsent("mobileNumber", v -> "18008659001");
+        map.computeIfAbsent("returnUrl", v -> "https://www.baidu.com");
+        String accessToken = SignatureEntity.build(SignatureType.SECRET, SystemConstant.METHOD, dictionaryConfig.reportOpenDomain().getSsoLoginApi(), timestamp, basicSchool.getAccessKey(), basicSchool.getAccessSecret());
+        String result = HttpUtil.postJson(dictionaryConfig.reportOpenDomain().getHostUrl() + dictionaryConfig.reportOpenDomain().getSsoLoginApi(), JacksonUtil.parseJson(map), accessToken, timestamp);
         if (Objects.nonNull(result)) {
             log.info("result:{}", JacksonUtil.parseJson(result));
         }

+ 17 - 20
distributed-print/src/main/java/com/qmth/distributed/print/aspect/ApiControllerAspect.java

@@ -20,6 +20,7 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Objects;
+import java.util.StringJoiner;
 
 /**
  * @Description: api aspect
@@ -49,36 +50,28 @@ public class ApiControllerAspect {
      */
     @Around(value = "apiAspect()")
     public Object aroundApiPoint(ProceedingJoinPoint joinPoint) throws Throwable {
+        long start = System.currentTimeMillis();
+        StringJoiner stringJoiner = new StringJoiner("");
         try {
-            long start = System.currentTimeMillis();
             MethodSignature msig = (MethodSignature) joinPoint.getSignature();
             String className = msig.getDeclaringTypeName();
             String methodName = msig.getName();
             Object[] args = joinPoint.getArgs();
             String[] paramsName = msig.getParameterNames();
             HttpServletRequest request = ServletUtil.getRequest();
-            if (Objects.nonNull(request)) {
-                log.info("============请求地址========:{}", request.getServletPath());
-                log.info("============类=============:{}", className);
-                log.info("============方法===========:{}", methodName);
-                if (Objects.nonNull(args) && args.length > 0) {
-                    for (int i = 0; i < args.length; i++) {
-                        if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
-                            continue;
-                        } else {
-                            log.info("============参数key:{},参数value===========:{}", JacksonUtil.parseJson(paramsName[i]), JacksonUtil.parseJson(args[i]));
-                        }
+            stringJoiner.add("============请求地址============:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("============类============:").add(className).add("\r\n");
+            stringJoiner.add("============方法============:").add(methodName).add("\r\n");
+            if (Objects.nonNull(args) && args.length > 0) {
+                for (int i = 0; i < args.length; i++) {
+                    if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
+                        continue;
+                    } else {
+                        stringJoiner.add("参数key:").add(JacksonUtil.parseJson(paramsName[i])).add(",参数value:").add(JacksonUtil.parseJson(args[i])).add("\r\n");
                     }
                 }
-//            log.info("============platform===========:{}", ServletUtil.getRequestPlatform());
-//            log.info("============deviceId===========:{}", ServletUtil.getRequestDeviceId());
-//            log.info("============Authorization===========:{}", ServletUtil.getRequestAuthorizationForAspect());
-//            log.info("============time===========:{}", ServletUtil.getRequestTimeForTime());
             }
-            Object proceed = joinPoint.proceed();
-            long end = System.currentTimeMillis();
-            log.info("============耗时============:{}秒", (end - start) / 1000);
-            return proceed;
+            return joinPoint.proceed();
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ApiException) {
@@ -86,6 +79,10 @@ public class ApiControllerAspect {
             } else {
                 return ResultUtil.error(e.getMessage());
             }
+        } finally {
+            long end = System.currentTimeMillis();
+            stringJoiner.add("============耗时============:").add((end - start) / 1000 + "").add("秒");
+            log.info("{}", stringJoiner.toString());
         }
     }
 }

+ 5 - 4
distributed-print/src/main/java/com/qmth/distributed/print/interceptor/AuthInterceptor.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.interceptor;
 
 import com.qmth.boot.api.interceptor.ExtendInterceptor;
+import com.qmth.teachcloud.common.util.AuthUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
@@ -21,11 +22,11 @@ public class AuthInterceptor extends ExtendInterceptor {
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         log.info("preHandle is come in");
-//        if (request.getServletPath().contains(endpoint)) {
+        if (request.getServletPath().contains(endpoint)) {
         return true;
-//        } else {
-//            return AuthUtil.adminAuthInterceptor(request, response, handler);
-//        }
+        } else {
+            return AuthUtil.adminAuthInterceptor(request, response, handler);
+        }
     }
 
     @Override

+ 9 - 7
distributed-print/src/main/resources/application-dev.properties

@@ -12,9 +12,9 @@ spring.application.name=distributed-print
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=distributed-v3.1.0
+db.name=distributed-v3.0.2
 db.username=root
-db.password=123456789
+db.password=88888888
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
@@ -89,7 +89,7 @@ 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-auth=false
 #com.qmth.api.global-strict=false
 #com.qmth.api.global-rate-limit=1/5s
 
@@ -117,6 +117,7 @@ prefix.url.teach=admin/teach
 prefix.url.auth=admin/auth
 prefix.url.open=admin/print/open
 prefix.url.notify=admin/print/notify
+prefix.url.grade=admin/grade
 
 #\u65E5\u671F\u683C\u5F0F\u5316
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
@@ -157,9 +158,9 @@ sync.config.groupCountUrl=/api/exam/mark_group/count
 sync.config.groupDeleteUrl=/api/exam/mark_group/delete
 sync.config.markerSaveUrl=/api/exam/marker/save
 
-#com.qmth.solar.access-key=274f823e5f59410f8b3bb6edcd8e2b6e
-#com.qmth.solar.access-secret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
-com.qmth.solar.license=/Volumes/extend/\u542F\u660E/\u5206\u5E03\u5F0F\u5370\u5237/\u5206\u5E03\u5F0F\u5370\u5237&\u6559\u7814\u5206\u6790v3.1.0/tc-dev-wl.lic
+com.qmth.solar.access-key=274f823e5f59410f8b3bb6edcd8e2b6e
+com.qmth.solar.access-secret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+#com.qmth.solar.license=/Volumes/extend/\u542F\u660E/\u5206\u5E03\u5F0F\u5370\u5237/\u5206\u5E03\u5F0F\u5370\u5237&\u6559\u7814\u5206\u6790v3.1.0/tc-dev-wl.lic
 
 sms.config.smsNormalCode=qmth
 sms.config.codeExpiredTime=2
@@ -199,4 +200,5 @@ sms.config.aliyunSMSAuditCopyUserCode=SMS_237206065
 report.open.hostUrl=http://127.0.0.1:7004
 report.open.semesterApi=/api/report/open/semester_edit
 report.open.examApi=/api/report/open/exam_edit
-report.open.courseApi=/api/report/open/course_edit
+report.open.courseApi=/api/report/open/course_edit
+report.open.ssoLoginApi=/api/report/sso/login

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

@@ -158,7 +158,7 @@ public class SystemConstant {
     public static final int DEFAULT_SESSION_EXPIRE = 1;//过期时间1天
     public static final long REDIS_DEFAULT_EXPIRE_TIME = 24 * 60L * 60L;//过期时间24小时
     public static final long REDIS_CREATE_PDF_EXPIRE_TIME = 1 * 60L * 60L;//过期时间1小时
-    public static final long REDIS_WHU_USER_AUTH_EXPIRE_TIME = 2 * 60L;//过期时间2分钟
+    public static final long REDIS_THIRD_USER_AUTH_EXPIRE_TIME = 2 * 60L;//过期时间2分钟
 
     /**
      * redis mq

+ 10 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/domain/ReportOpenDomain.java

@@ -19,6 +19,16 @@ public class ReportOpenDomain implements Serializable {
 
     String courseApi;
 
+    String ssoLoginApi;
+
+    public String getSsoLoginApi() {
+        return ssoLoginApi;
+    }
+
+    public void setSsoLoginApi(String ssoLoginApi) {
+        this.ssoLoginApi = ssoLoginApi;
+    }
+
     public String getHostUrl() {
         return hostUrl;
     }

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysUser.java

@@ -124,6 +124,21 @@ public class SysUser extends BaseEntity implements Serializable {
         this.historicName = historicName;
     }
 
+    public SysUser() {
+
+    }
+
+    public SysUser(Long schoolId, String loginName, String realName, String mobileNumber) {
+        setId(SystemConstant.getDbUuid());
+        this.schoolId = schoolId;
+        this.loginName = loginName;
+        this.realName = realName;
+        this.mobileNumber = mobileNumber;
+        this.pwdCount = 1;
+        this.password = SystemConstant.DEFAULT_PASSWORD;
+        this.enable = true;
+    }
+
     @Override
     public void insertInfo(Long userId) {
         super.insertInfo(userId);

+ 3 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/AppSourceEnum.java

@@ -13,7 +13,9 @@ public enum AppSourceEnum {
 
     SYSTEM("自身应用系统"),
 
-    WHU_THIRD("武汉大学");
+    WHU_THIRD("武汉大学"),
+
+    PRINT_THIRD("知学知考-分布式印刷");
 
     private String title;
 

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/QuestionType.java

@@ -1,5 +1,7 @@
 package com.qmth.teachcloud.common.enums;
 
+import java.util.Objects;
+
 /**
  * @Description: 题目类型(主观题、客观题)
  * @Author: CaoZixuan
@@ -18,4 +20,17 @@ public enum QuestionType {
     public String getDesc() {
         return desc;
     }
+
+    public static QuestionType convertToEnum(String desc) {
+        QuestionType result = null;
+        for (QuestionType e : QuestionType.values()) {
+            if (Objects.equals(desc, e.getDesc())) {
+                result = e;
+            }
+        }
+        if (result == null){
+            throw ExceptionResultEnum.ERROR.exception("枚举类型不存在");
+        }
+        return result;
+    }
 }

+ 11 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java

@@ -36,6 +36,14 @@ public interface SysUserService extends IService<SysUser> {
 
     boolean saveUser(UserSaveParams userSaveParams) throws IllegalAccessException;
 
+    /**
+     * 保存用户
+     *
+     * @param userSaveParams
+     * @return
+     */
+    boolean saveUserReport(UserSaveParams userSaveParams);
+
     boolean enable(SysUser user) throws NoSuchAlgorithmException, IllegalAccessException;
 
     boolean resetPassword(Long id) throws NoSuchAlgorithmException;
@@ -72,12 +80,13 @@ public interface SysUserService extends IService<SysUser> {
 
     /**
      * 根据外键查找教师信息
-     * @param schoolId 学校id
+     *
+     * @param schoolId    学校id
      * @param teacherName 教师名称
      * @param teacherCode 教师编号
      * @return 学院数据
      */
-    SysUser findByForeignKey(Long schoolId, String teacherName,String teacherCode);
+    SysUser findByForeignKey(Long schoolId, String teacherName, String teacherCode);
 
     /**
      * 临时-不鉴权保存用户 (默认创建用户角色为该学校管理员)

+ 13 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -154,6 +154,18 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return result;
     }
 
+    /**
+     * 保存用户
+     *
+     * @param userSaveParams
+     * @return
+     */
+    @Override
+    public boolean saveUserReport(UserSaveParams userSaveParams) {
+        saveUserCommon(userSaveParams, null);
+        return true;
+    }
+
     @Transactional
     @Override
     public boolean enable(SysUser user) throws NoSuchAlgorithmException, IllegalAccessException {
@@ -456,7 +468,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         List<SysUser> tbSchoolTeacherList = this.list(new QueryWrapper<SysUser>().lambda()
                 .eq(SysUser::getSchoolId, schoolId)
                 .eq(SysUser::getRealName, teacherName)
-                .eq(SysUser::getLoginName,teacherCode));
+                .eq(SysUser::getLoginName, teacherCode));
         SysRole sysRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda().eq(SysRole::getType, RoleTypeEnum.TEACHER));
 //        tbSchoolTeacherList = tbSchoolTeacherList.stream().filter(e -> Arrays.asList(e.getRoleIds()).contains(sysRole.getId())).collect(Collectors.toList());
         if (tbSchoolTeacherList.size() != 1) {

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

@@ -925,7 +925,7 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         }
         String sessionId = SessionUtil.digest(sysUser.getId(), Math.abs(roleNames.toString().hashCode()), platform.name());
         //TODO 测试用
-//        String test = SignatureEntityTest.build(SignatureType.TOKEN, sessionId, token);
+        String test = SignatureEntityTest.build(SignatureType.TOKEN, sessionId, token);
         ExpireTimeBean expireTime = AuthUtil.getExpireTime(platform);
         TBSession tbSession = new TBSession(sysUser.getSchoolId(), sessionId, String.valueOf(sysUser.getId()), roleNames.toString(),
                 platform.name(), platform.name(), deviceId, ServletUtil.getRequest().getLocalAddr(), token,
@@ -933,8 +933,8 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         tbSessionService.saveOrUpdate(tbSession);
         redisUtil.setUserSession(sessionId, tbSession, expireTime.getExpireSeconds());
 
-//        LoginResult loginResult = new LoginResult(sysUser, sessionId, test, Objects.nonNull(roleTypes) && roleTypes.size() > 0 ? roleTypes : roleNames, appSource);
-        LoginResult loginResult = new LoginResult(sysUser, sessionId, token, Objects.nonNull(roleTypes) && roleTypes.size() > 0 ? roleTypes : roleNames, appSource);
+        LoginResult loginResult = new LoginResult(sysUser, sessionId, test, Objects.nonNull(roleTypes) && roleTypes.size() > 0 ? roleTypes : roleNames, appSource);
+//        LoginResult loginResult = new LoginResult(sysUser, sessionId, token, Objects.nonNull(roleTypes) && roleTypes.size() > 0 ? roleTypes : roleNames, appSource);
         loginResult.setSchoolInfo(Objects.nonNull(authBean.getSchool()) ? loginResult.new SchoolNativeBean(authBean.getSchool()) : null);
         loginResult.setOrgInfo(Objects.nonNull(authBean.getOrg()) ? loginResult.new OrgNativeBean(authBean.getOrg()) : null);
         loginResult.setTime(System.currentTimeMillis());

+ 4 - 0
teachcloud-report-business/pom.xml

@@ -98,6 +98,10 @@
 			<scope>system</scope>
 			<systemPath>${project.basedir}/src/main/resources/lib/cas-client-core-3.2.1.jar</systemPath>
 		</dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-quartz</artifactId>
+        </dependency>
 	</dependencies>
 
 </project>

+ 105 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/LoginThirdParam.java

@@ -0,0 +1,105 @@
+package com.qmth.teachcloud.report.business.bean.params;
+
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * @Description: 课程参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/27
+ */
+public class LoginThirdParam implements Serializable {
+
+    @ApiModelProperty(value = "登录名")
+    private String loginName;
+
+    @ApiModelProperty(value = "角色枚举")
+    private RoleTypeEnum role;
+
+    @ApiModelProperty(value = "真实名")
+    private String realName;
+
+    @ApiModelProperty(value = "手机号码")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "学院名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "启用/禁用,ture:启用,false:禁用")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "返回url")
+    private String returnUrl;
+
+    /**
+     * 参数校验
+     */
+    public void validParams() {
+        Optional.ofNullable(this.getLoginName()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("登录名为空"));
+        Optional.ofNullable(this.getRole()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("角色为空"));
+        Optional.ofNullable(this.getReturnUrl()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("返回url为空"));
+        Optional.ofNullable(this.getOrgName()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("学院名称为空"));
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public RoleTypeEnum getRole() {
+        return role;
+    }
+
+    public void setRole(RoleTypeEnum role) {
+        this.role = role;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public String getReturnUrl() {
+        return returnUrl;
+    }
+
+    public void setReturnUrl(String returnUrl) {
+        this.returnUrl = returnUrl;
+    }
+}

+ 8 - 3
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/cache/RedisKeyHelper.java

@@ -9,9 +9,14 @@ package com.qmth.teachcloud.report.business.cache;
  */
 public class RedisKeyHelper {
 
-    private static String whuUserAuthFix = "whu_user_auth:";
+    private static String thirdUserAuthFix = "third_user_auth:";
+    private static String thirdUserAuthReturnUrlFix = "third_user_auth_return_url:";
 
-    public static String whuUserAuth(String key) {
-        return whuUserAuthFix + key;
+    public static String thirdUserAuth(String key) {
+        return thirdUserAuthFix + key;
+    }
+
+    public static String thirdUserAuthReturnUrl(String key) {
+        return thirdUserAuthReturnUrlFix + key;
     }
 }

+ 43 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/cache/ThirdUserAuthCacheUtil.java

@@ -0,0 +1,43 @@
+package com.qmth.teachcloud.report.business.cache;
+
+import com.qmth.teachcloud.common.bean.dto.UserAuthenticationDto;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.util.RedisUtil;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Description: 武大开发鉴权用户临时授权cache
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/6/29
+ */
+public class ThirdUserAuthCacheUtil {
+    private static RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+
+    public static void setAuthCode(UserAuthenticationDto userAuthenticationDto) {
+        redisUtil.set(RedisKeyHelper.thirdUserAuth(userAuthenticationDto.getUid()), userAuthenticationDto.getCode(), SystemConstant.REDIS_THIRD_USER_AUTH_EXPIRE_TIME, TimeUnit.SECONDS);
+    }
+
+    public static String getAuthCode(String key) {
+        return (String) redisUtil.get(RedisKeyHelper.thirdUserAuth(key));
+    }
+
+    public static void deleteAuthCode(String key) {
+        redisUtil.delete(RedisKeyHelper.thirdUserAuth(key));
+    }
+
+    public static void setAuthReturnUrl(String key, String url) {
+        redisUtil.set(RedisKeyHelper.thirdUserAuthReturnUrl(key), url);
+    }
+
+    public static String getAuthReturnUrl(String key) {
+        return (String) redisUtil.get(RedisKeyHelper.thirdUserAuthReturnUrl(key));
+    }
+
+    public static void deleteAuthReturnUrl(String key) {
+        redisUtil.delete(RedisKeyHelper.thirdUserAuthReturnUrl(key));
+    }
+}

+ 0 - 31
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/cache/WhuUserAuthCacheUtil.java

@@ -1,31 +0,0 @@
-package com.qmth.teachcloud.report.business.cache;
-
-import com.qmth.teachcloud.common.bean.dto.UserAuthenticationDto;
-import com.qmth.teachcloud.common.contant.SpringContextHolder;
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.util.RedisUtil;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * @Description: 武大开发鉴权用户临时授权cache
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2021/6/29
- */
-public class WhuUserAuthCacheUtil {
-    private static RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
-
-    public static void setAuthCode(UserAuthenticationDto userAuthenticationDto) {
-        redisUtil.set(RedisKeyHelper.whuUserAuth(userAuthenticationDto.getUid()), userAuthenticationDto.getCode(), SystemConstant.REDIS_WHU_USER_AUTH_EXPIRE_TIME, TimeUnit.SECONDS);
-    }
-
-    public static String getAuthCode(String key) {
-        return (String) redisUtil.get(RedisKeyHelper.whuUserAuth(key));
-    }
-
-    public static void deleteAuthCode(String key) {
-        redisUtil.delete(RedisKeyHelper.whuUserAuth(key));
-    }
-}

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

@@ -3,12 +3,10 @@ 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 com.qmth.teachcloud.report.business.entity.TAExamCourse;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.util.List;
 
 /**
@@ -85,14 +83,15 @@ public interface ReportCommonService {
 
     /**
      * 根据参数查找题目信息
-     * @param examId 考试id
-     * @param courseCode 课程编号
-     * @param teachCollegeId 开课学院id
+     *
+     * @param examId           考试id
+     * @param courseCode       课程编号
+     * @param teachCollegeId   开课学院id
      * @param inspectCollegeId 考察学院id
-     * @param teacherId 授课教师id
+     * @param teacherId        授课教师id
      * @return 结果
      */
-    QuestionListResult findQuestionInfo(Long examId, String courseCode, Long teachCollegeId,Long inspectCollegeId,Long teacherId);
+    QuestionListResult findQuestionInfo(Long examId, String courseCode, Long teachCollegeId, Long inspectCollegeId, Long teacherId);
 
     /**
      * 取总体平均分
@@ -110,6 +109,11 @@ public interface ReportCommonService {
      */
     public void whuLogout() throws IOException;
 
+    /**
+     * 第三方退出
+     */
+    public void thirdLogout() throws IOException;
+
     /**
      * 获取开课课程考试课程总览
      *
@@ -124,7 +128,7 @@ public interface ReportCommonService {
      * 保存附件
      *
      * @param file file
-     * @param md5 md5
+     * @param md5  md5
      * @param type type
      * @return 返回
      */
@@ -133,9 +137,9 @@ public interface ReportCommonService {
     /**
      * 保存附件公用
      *
-     * @param file file
-     * @param md5 md5
-     * @param type type
+     * @param file  file
+     * @param md5   md5
+     * @param type  type
      * @param objId objId
      * @return 结果
      */

+ 22 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java

@@ -17,6 +17,7 @@ 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.cache.ThirdUserAuthCacheUtil;
 import com.qmth.teachcloud.report.business.entity.*;
 import com.qmth.teachcloud.report.business.enums.*;
 import com.qmth.teachcloud.report.business.service.*;
@@ -633,6 +634,27 @@ public class ReportCommonServiceImpl implements ReportCommonService {
         response.sendRedirect(redirectURL);
     }
 
+    /**
+     * 第三方退出
+     *
+     * @throws IOException
+     */
+    @Override
+    public void thirdLogout() throws IOException {
+        HttpServletRequest request = ServletUtil.getRequest();
+        HttpServletResponse response = ServletUtil.getResponse();
+        HttpSession session = request.getSession();
+        if (Objects.nonNull(session)) {
+            session.invalidate();
+            log.info("logout is come in,session:{}", JacksonUtil.parseJson(session));
+        }
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        String redirectURL = ThirdUserAuthCacheUtil.getAuthReturnUrl(String.valueOf(sysUser.getId()));
+        ThirdUserAuthCacheUtil.deleteAuthReturnUrl(String.valueOf(sysUser.getId()));
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        response.sendRedirect(redirectURL);
+    }
+
     /**
      * 获取开课课程考试课程总览
      *

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

@@ -62,7 +62,7 @@ public class AsyncDataCalculateTempleteService extends AsyncCalculateTaskTemplet
             tbExamCourse.setPublishStatus(PublishStatusEnum.UN_PUBLISH);
             tbTask.setResult(TaskResultEnum.SUCCESS);
         }catch (Exception e){
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             exception = e.getMessage();
             tbTask.setRemark(exception);
             tbTask.setResult(TaskResultEnum.ERROR);

+ 140 - 11
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SsoApiController.java

@@ -1,23 +1,43 @@
 package com.qmth.teachcloud.report.api;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.SignatureEntityTest;
+import com.qmth.teachcloud.common.bean.dto.UserAuthenticationDto;
+import com.qmth.teachcloud.common.bean.result.LoginResult;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.*;
+import com.qmth.teachcloud.common.enums.AppSourceEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.util.AuthThirdUtil;
+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.report.business.bean.params.LoginThirdParam;
+import com.qmth.teachcloud.report.business.cache.ThirdUserAuthCacheUtil;
+import com.qmth.teachcloud.report.business.service.ReportCommonService;
 import io.swagger.annotations.*;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.security.NoSuchAlgorithmException;
+import java.text.MessageFormat;
+import java.util.Objects;
 import java.util.Optional;
 
 /**
@@ -35,20 +55,129 @@ import java.util.Optional;
 public class SsoApiController {
     private final static Logger log = LoggerFactory.getLogger(SsoApiController.class);
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
+    @Resource
+    SysUserService sysUserService;
+
+    @Resource
+    SysUserRoleService sysUserRoleService;
+
+    @Resource
+    SysOrgService sysOrgService;
+
+    @Resource
+    SysRoleService sysRoleService;
+
+    @Resource
+    TeachcloudCommonService teachcloudCommonService;
+
+    @Resource
+    ReportCommonService reportCommonService;
+
     @ApiOperation(value = "单点登录接口")
     @ApiResponses({@ApiResponse(code = 200, message = "单点登录接口", response = Object.class)})
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @Aac(auth = BOOL.FALSE)
-    public Result login(@ApiParam(value = "接收登录数据信息", required = true) @RequestBody String result) throws IOException {
+    @Transactional
+    public void login(@ApiParam(value = "接收登录数据信息", required = true) @RequestBody String result, HttpServletRequest request, HttpServletResponse response) throws IOException {
         Optional.ofNullable(result).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("数据为空"));
         String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
         log.info("login进来了,result:{}", decodeJson);
-//        BasicSemesterParams basicSemesterParams = JacksonUtil.readJson(decodeJson, BasicSemesterParams.class);
-//        Optional.ofNullable(basicSemesterParams).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("转换后的数据为空"));
-//        basicSemesterParams.validParams();
-//        BasicSchool basicSchool = AuthThirdUtil.hasPermission();
-//        return ResultUtil.ok(basicSemesterService.saveBasicSemesterCommon(basicSemesterParams, basicSchool.getId(), null));
+        LoginThirdParam loginThirdParam = JacksonUtil.readJson(decodeJson, LoginThirdParam.class);
+        Optional.ofNullable(loginThirdParam).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("转换后的数据为空"));
+        loginThirdParam.validParams();
+        BasicSchool basicSchool = AuthThirdUtil.hasPermission();
+        //插入或者更新用户
+        //查询用户是否存在
+        QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId())
+                .eq(SysUser::getLoginName, loginThirdParam.getLoginName())
+                .eq(SysUser::getEnable, true);
+        SysUser sysUser = sysUserService.getOne(sysUserQueryWrapper);
+        if (Objects.isNull(sysUser)) {//新增
+            sysUser = new SysUser(basicSchool.getId(),
+                    loginThirdParam.getLoginName(),
+                    Objects.nonNull(loginThirdParam.getRealName()) ? loginThirdParam.getRealName() : loginThirdParam.getLoginName(),
+                    Objects.nonNull(loginThirdParam.getMobileNumber()) ? loginThirdParam.getMobileNumber() : null);
+        } else {
+            sysUser.setSchoolId(basicSchool.getId());
+            if (Objects.nonNull(loginThirdParam.getRealName())) {
+                sysUser.setRealName(loginThirdParam.getRealName());
+            }
+            if (Objects.nonNull(loginThirdParam.getMobileNumber())) {
+                sysUser.setMobileNumber(loginThirdParam.getMobileNumber());
+            }
+        }
+        if (Objects.nonNull(loginThirdParam.getEnable())) {
+            sysUser.setEnable(loginThirdParam.getEnable());
+        }
+
+        //查询学院id
+        QueryWrapper<SysOrg> sysOrgQueryWrapper = new QueryWrapper<>();
+        sysOrgQueryWrapper.lambda().eq(SysOrg::getSchoolId, basicSchool.getId())
+                .eq(SysOrg::getName, loginThirdParam.getOrgName())
+                .eq(SysOrg::getEnable, true);
+        SysOrg sysOrg = sysOrgService.getOne(sysOrgQueryWrapper);
+        Optional.ofNullable(sysOrg).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("学院数据为空"));
+        sysUser.setOrgId(sysOrg.getId());
+        sysUserService.saveOrUpdate(sysUser);
+
+        //新增用户和角色关系
+        QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
+        sysRoleQueryWrapper.lambda().eq(SysRole::getType, loginThirdParam.getRole())
+                .eq(SysRole::getEnable, true);
+        SysRole sysRole = sysRoleService.getOne(sysRoleQueryWrapper);
+        Optional.ofNullable(sysRole).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("角色数据为空"));
 
-        return ResultUtil.ok(true);
+        SysUserRole sysUserRole = new SysUserRole(sysUser.getId(), sysRole.getId());
+        sysUserRoleService.save(sysUserRole);
+
+        UserAuthenticationDto userAuthenticationDto = new UserAuthenticationDto(String.valueOf(sysUser.getId()), SystemConstant.getUuid());
+        ThirdUserAuthCacheUtil.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);
+
+        ThirdUserAuthCacheUtil.setAuthReturnUrl(String.valueOf(sysUser.getId()), loginThirdParam.getReturnUrl());
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        response.sendRedirect(dictionaryConfig.sysDomain().getLoginAuthenUrl() + code);
+    }
+
+    @ApiOperation(value = "用户临时授权登录接口")
+    @RequestMapping(value = "/user/authentication/login", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = LoginResult.class)})
+    @Aac(auth = BOOL.FALSE)
+    public Result login(@ApiParam(value = "授权码信息", required = true) @RequestParam String code) throws NoSuchAlgorithmException, UnsupportedEncodingException {
+        String[] values = StringUtils.split(URLDecoder.decode(code, SystemConstant.CHARSET_NAME), SignatureEntityTest.FIELD_JOINER);
+        if (Objects.isNull(values) || values.length != 2) {
+            throw ExceptionResultEnum.ERROR.exception("临时授权码出错,请重新获取");
+        }
+        log.info("values:{}", JacksonUtil.parseJson(values));
+        SysUser sysUser = sysUserService.getById(Long.parseLong(values[0]));
+        //用户不存在
+        if (Objects.isNull(sysUser)) {
+            throw ExceptionResultEnum.USER_NO_DATA.exception();
+        }
+        //停用
+        if (!sysUser.getEnable()) {
+            throw ExceptionResultEnum.USER_ENABLE.exception();
+        }
+
+        String userAuthCode = ThirdUserAuthCacheUtil.getAuthCode(values[0]);
+        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.PRINT_THIRD);
+        ThirdUserAuthCacheUtil.deleteAuthCode(values[0]);
+        return ResultUtil.ok(loginResult);
+    }
+
+    @ApiOperation(value = "用户鉴权退出接口")
+    @RequestMapping(value = "/user/authentication/logout", method = RequestMethod.GET)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = Result.class)})
+    @Aac(auth = BOOL.FALSE)
+    public void authenticationLogout() throws IOException {
+        reportCommonService.thirdLogout();
     }
 }

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

@@ -246,7 +246,7 @@ public class SysController {
                 throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
             }
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(basicAttachment)) {
                 basicAttachmentService.deleteAttachment(basicAttachment);
             }

+ 158 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysUserController.java

@@ -0,0 +1,158 @@
+package com.qmth.teachcloud.report.api;
+
+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;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * <p>
+ * 用户表 前端控制器
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+@Api(tags = "用户Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.sys}/user")
+@Validated
+//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+public class SysUserController {
+    private final static Logger log = LoggerFactory.getLogger(SysUserController.class);
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    /**
+     * 查询
+     *
+     * @param loginName
+     * @param roleId
+     * @param enable
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public Result list(@RequestParam(value = "loginName", required = false) String loginName,
+                       @RequestParam(value = "roleId", required = false) String roleId,
+                       @RequestParam(value = "enable", required = false) Boolean enable,
+                       @RequestParam(value = "realName", required = false) String realName,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(sysUserService.list(loginName, roleId, enable, realName, pageNumber, pageSize));
+    }
+
+    /**
+     * 查询
+     *
+     * @param realName
+     * @param enable
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @RequestMapping(value = "/list_customer", method = RequestMethod.POST)
+    public Result listCustomer(@RequestParam(value = "realName", required = false) String realName,
+                               @RequestParam(value = "enable", required = false) Boolean enable,
+                               @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                               @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(sysUserService.listCustomer(realName, enable, pageNumber, pageSize));
+    }
+
+    /**
+     * 根据科目查询命题老师
+     *
+     * @param courseCode
+     * @param param
+     * @return
+     */
+    @ApiOperation(value = "根据科目查询命题老师")
+    @RequestMapping(value = "/user_list", method = RequestMethod.POST)
+    public Result userQuery(@RequestParam(value = "courseCode", required = false) String courseCode,
+                            @RequestParam(value = "param", required = false) String param) {
+        return ResultUtil.ok(sysUserService.listUser(courseCode, param));
+    }
+
+    /**
+     * 新增/修改
+     *
+     * @param userSaveParams
+     * @return
+     */
+    @ApiOperation(value = "新增/修改")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public Result save(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody UserSaveParams userSaveParams, BindingResult bindingResult) throws IllegalAccessException {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(sysUserService.saveUserReport(userSaveParams));
+    }
+
+    /**
+     * 启用/禁用
+     *
+     * @param user
+     * @return
+     */
+    @ApiOperation(value = "启用/禁用")
+    @RequestMapping(value = "/enable", method = RequestMethod.POST)
+    public Result enable(@RequestBody SysUser user) throws NoSuchAlgorithmException, IllegalAccessException {
+        return ResultUtil.ok(sysUserService.enable(user));
+    }
+
+    /**
+     * 重置密码
+     *
+     * @param user
+     * @return
+     */
+    @ApiOperation(value = "重置密码")
+    @RequestMapping(value = "/reset_password", method = RequestMethod.POST)
+    public Result resetPassword(@RequestBody SysUser user) throws NoSuchAlgorithmException {
+        return ResultUtil.ok(sysUserService.resetPassword(user.getId()));
+    }
+
+    /**
+     * 修改密码
+     *
+     * @return
+     */
+    @ApiOperation(value = "修改密码")
+    @RequestMapping(value = "/update_password", method = RequestMethod.POST)
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+    public Result updatePassword(@RequestBody SysUser user) throws NoSuchAlgorithmException {
+        return ResultUtil.ok(sysUserService.updatePassword(user));
+    }
+
+    /**
+     * 绑定角色
+     *
+     * @param sysUser
+     * @return
+     */
+    @ApiOperation(value = "绑定角色")
+    @RequestMapping(value = "/bind_roles", method = RequestMethod.POST)
+    public Result bindRoles(@RequestBody SysUser sysUser) {
+        return ResultUtil.ok(sysUserService.bindRoles(sysUser));
+    }
+}
+

+ 5 - 6
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/WudaOpenApiController.java

@@ -20,7 +20,7 @@ import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 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.report.business.cache.WhuUserAuthCacheUtil;
+import com.qmth.teachcloud.report.business.cache.ThirdUserAuthCacheUtil;
 import com.qmth.teachcloud.report.business.service.ReportCommonService;
 import com.qmth.teachcloud.report.business.utils.EncrypAES;
 import io.swagger.annotations.*;
@@ -75,7 +75,6 @@ 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();
         }
         // 测试用代码 --- 开始 ---
@@ -102,7 +101,7 @@ public class WudaOpenApiController {
     @RequestMapping(value = "/user/authentication/logout", method = RequestMethod.GET)
     @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = Result.class)})
     @Aac(auth = BOOL.FALSE)
-    public void authenticationLogout(HttpServletRequest request, HttpServletResponse response) throws IOException {
+    public void authenticationLogout() throws IOException {
         reportCommonService.whuLogout();
     }
 
@@ -130,7 +129,7 @@ public class WudaOpenApiController {
         }
         // 测试结束
         UserAuthenticationDto userAuthenticationDto = new UserAuthenticationDto(uid, SystemConstant.getUuid());
-        WhuUserAuthCacheUtil.setAuthCode(userAuthenticationDto);
+        ThirdUserAuthCacheUtil.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);
         // 测试开始
@@ -181,12 +180,12 @@ public class WudaOpenApiController {
             throw ExceptionResultEnum.USER_ENABLE.exception();
         }
 
-        String userAuthCode = WhuUserAuthCacheUtil.getAuthCode(values[0]);
+        String userAuthCode = ThirdUserAuthCacheUtil.getAuthCode(values[0]);
         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);
-        WhuUserAuthCacheUtil.deleteAuthCode(values[0]);
+        ThirdUserAuthCacheUtil.deleteAuthCode(values[0]);
         return ResultUtil.ok(loginResult);
     }
 

+ 19 - 21
teachcloud-report/src/main/java/com/qmth/teachcloud/report/aspect/ApiControllerAspect.java

@@ -1,6 +1,7 @@
 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;
@@ -19,6 +20,7 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Objects;
+import java.util.StringJoiner;
 
 /**
  * @Description: api aspect
@@ -48,43 +50,39 @@ public class ApiControllerAspect {
      */
     @Around(value = "apiAspect()")
     public Object aroundApiPoint(ProceedingJoinPoint joinPoint) throws Throwable {
+        long start = System.currentTimeMillis();
+        StringJoiner stringJoiner = new StringJoiner("");
         try {
-            long start = System.currentTimeMillis();
             MethodSignature msig = (MethodSignature) joinPoint.getSignature();
             String className = msig.getDeclaringTypeName();
             String methodName = msig.getName();
             Object[] args = joinPoint.getArgs();
             String[] paramsName = msig.getParameterNames();
             HttpServletRequest request = ServletUtil.getRequest();
-            if (Objects.nonNull(request)) {
-                log.info("============请求地址========:{}", request.getServletPath());
-                log.info("============类=============:{}", className);
-                log.info("============方法===========:{}", methodName);
-                if (Objects.nonNull(args) && args.length > 0) {
-                    for (int i = 0; i < args.length; i++) {
-                        if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
-                            continue;
-                        } else {
-                            log.info("============参数key:{},参数value===========:{}", JacksonUtil.parseJson(paramsName[i]), JacksonUtil.parseJson(args[i]));
-                        }
+            stringJoiner.add("============请求地址============:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("============类============:").add(className).add("\r\n");
+            stringJoiner.add("============方法============:").add(methodName).add("\r\n");
+            if (Objects.nonNull(args) && args.length > 0) {
+                for (int i = 0; i < args.length; i++) {
+                    if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
+                        continue;
+                    } else {
+                        stringJoiner.add("参数key:").add(JacksonUtil.parseJson(paramsName[i])).add(",参数value:").add(JacksonUtil.parseJson(args[i])).add("\r\n");
                     }
                 }
-//            log.info("============platform===========:{}", ServletUtil.getRequestPlatform());
-//            log.info("============deviceId===========:{}", ServletUtil.getRequestDeviceId());
-//            log.info("============Authorization===========:{}", ServletUtil.getRequestAuthorizationForAspect());
-//            log.info("============time===========:{}", ServletUtil.getRequestTimeForTime());
             }
-            Object proceed = joinPoint.proceed();
-            long end = System.currentTimeMillis();
-            log.info("============耗时============:{}秒", (end - start) / 1000);
-            return proceed;
+            return joinPoint.proceed();
         } catch (Exception e) {
-            log.error("请求出错", e);
+            log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ApiException) {
                 return ResultUtil.error((ApiException) e, e.getMessage());
             } else {
                 return ResultUtil.error(e.getMessage());
             }
+        } finally {
+            long end = System.currentTimeMillis();
+            stringJoiner.add("============耗时============:").add((end - start) / 1000 + "").add("秒");
+            log.info("{}", stringJoiner.toString());
         }
     }
 }

+ 37 - 3
teachcloud-report/src/main/resources/application-dev.properties

@@ -104,9 +104,6 @@ prefix.url.sso=report/sso
 com.qmth.logging.root-level=info
 com.qmth.logging.file-path=/Users/king/Downloads/teachcloud-report.log
 
-#\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
-spring.profiles.include=task
-
 sms.config.smsNormalCode=qmth
 sms.config.codeExpiredTime=2
 sms.config.codeSendInterval=60
@@ -145,3 +142,40 @@ print.open.callbackUrlApi=/api/admin/print/notify/analysis/progress
 #com.qmth.solar.access-key=274f823e5f59410f8b3bb6edcd8e2b6e
 #com.qmth.solar.access-secret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
 #com.qmth.solar.license=/Users/king/Downloads/tc-dev-wl.lic
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5

+ 4 - 4
teachcloud-task/pom.xml

@@ -18,10 +18,10 @@
             <groupId>com.qmth.distributed.print.business</groupId>
             <artifactId>distributed-print-business</artifactId>
         </dependency>
-        <dependency>
-            <groupId>com.qmth.teachcloud.report.business</groupId>
-            <artifactId>teachcloud-report-business</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.qmth.teachcloud.report.business</groupId>-->
+<!--            <artifactId>teachcloud-report-business</artifactId>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-quartz</artifactId>

+ 2 - 2
teachcloud-task/src/main/resources/application-task.properties

@@ -13,9 +13,9 @@ spring.application.name=teachcloud-task
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=distributed-v3.0.2
+db.name=distributed-v3.1.0
 db.username=root
-db.password=88888888
+db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}