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

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

 Conflicts:
	distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchController.java
xiaof 3 роки тому
батько
коміт
f542438298
37 змінених файлів з 964 додано та 158 видалено
  1. 16 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradeBatchParam.java
  2. 75 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/CalculateNotifyResult.java
  3. 14 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeBatchPaperResult.java
  4. 23 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeBatchResult.java
  5. 34 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/GradeBatch.java
  6. 16 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/GradeAnalyzePaperStatusEnum.java
  7. 3 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradeBatchPaperMapper.java
  8. 4 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeBatchPaperService.java
  9. 15 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchPaperServiceImpl.java
  10. 5 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchServiceImpl.java
  11. 11 4
      distributed-print-business/src/main/resources/mapper/GradeBatchMapper.xml
  12. 3 2
      distributed-print-business/src/main/resources/mapper/GradeBatchPaperMapper.xml
  13. 3 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchController.java
  14. 15 7
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchPaperController.java
  15. 3 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradeModuleEvaluationController.java
  16. 5 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperController.java
  17. 3 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperDimensionController.java
  18. 3 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java
  19. 30 16
      distributed-print/src/main/java/com/qmth/distributed/print/api/NotifyApiController.java
  20. 17 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java
  21. 272 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/UserSaveReportParams.java
  22. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  23. 61 6
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/domain/PrintOpenDomain.java
  24. 3 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java
  25. 4 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java
  26. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  27. 0 34
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/strategy/CalculateTaskTemplate.java
  28. 28 4
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/CalculateParams.java
  29. 26 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TBSyncTask.java
  30. 9 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeDataCheckService.java
  31. 13 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeDataGetService.java
  32. 12 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/CallPrintOpenApiService.java
  33. 179 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/strategy/CalculateTaskTemplate.java
  34. 40 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/strategy/CourseCodeSyncTaskService.java
  35. 7 42
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/OpenApiController.java
  36. 3 3
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysUserController.java
  37. 5 0
      teachcloud-report/src/main/resources/application-dev.properties

+ 16 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradeBatchParam.java

@@ -17,13 +17,19 @@ public class GradeBatchParam {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
+    @ApiModelProperty(value = "学期id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "请选择学期")
+    @Range(min = 1L, message = "请选择学期")
+    private Long semesterId;
+
     @ApiModelProperty(value = "批次名称")
     @NotNull(message = "请输入批次名称")
     private String batchName;
 
     @ApiModelProperty(value = "批次时刻")
-    @NotNull(message = "请选择批次时刻")
-    @Range(min = 1L, message = "请选择批次时刻")
+//    @NotNull(message = "请选择批次时刻")
+//    @Range(min = 1L, message = "请选择批次时刻")
     private Long batchTime;
 
     public Long getId() {
@@ -34,6 +40,14 @@ public class GradeBatchParam {
         this.id = id;
     }
 
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+
     public String getBatchName() {
         return batchName;
     }

+ 75 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/CalculateNotifyResult.java

@@ -0,0 +1,75 @@
+package com.qmth.distributed.print.business.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Description: 计算回调结果
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/6/7
+ */
+public class CalculateNotifyResult implements Serializable {
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "课程编码,一个分析试卷的唯一标识")
+    private List<String> courseCode;
+
+    @ApiModelProperty(value = "进度")
+    private BigDecimal progress;
+
+    @ApiModelProperty(value = "任务状态")
+    private String status;
+
+    @ApiModelProperty(value = "时间戳")
+    private Long time;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public List<String> getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(List<String> courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public BigDecimal getProgress() {
+        return progress;
+    }
+
+    public void setProgress(BigDecimal progress) {
+        this.progress = progress;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Long getTime() {
+        return time;
+    }
+
+    public void setTime(Long time) {
+        this.time = time;
+    }
+}

+ 14 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeBatchPaperResult.java

@@ -28,13 +28,14 @@ public class GradeBatchPaperResult {
     @ApiModelProperty(value = "课程名称")
     private String courseName;
 
+    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "教研室id")
     private Long teachingRoomId;
 
+    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "开课学院id")
     private Long teachCollegeId;
 
-    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "开课学院名称")
     private String teachCollegeName;
 
@@ -47,9 +48,13 @@ public class GradeBatchPaperResult {
     @ApiModelProperty(value = "试卷类型")
     private String paperType;
 
+    @ApiModelProperty(value = "试卷名称")
+    private String paperName;
+
     @ApiModelProperty(value = "分析批次状态")
     private GradeAnalyzePaperStatusEnum status;
 
+
     public Long getId() {
         return id;
     }
@@ -138,6 +143,14 @@ public class GradeBatchPaperResult {
         this.paperType = paperType;
     }
 
+    public String getPaperName() {
+        return paperName;
+    }
+
+    public void setPaperName(String paperName) {
+        this.paperName = paperName;
+    }
+
     public GradeAnalyzePaperStatusEnum getStatus() {
         return status;
     }

+ 23 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeBatchResult.java

@@ -22,6 +22,13 @@ public class GradeBatchResult {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long batchTime;
 
+    @ApiModelProperty(value = "学期id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long semesterId;
+
+    @ApiModelProperty(value = "学期名称")
+    private String semesterName;
+
     @ApiModelProperty(value = "批次状态")
     private GradeAnalyzePaperStatusEnum status;
 
@@ -49,6 +56,22 @@ public class GradeBatchResult {
         this.batchTime = batchTime;
     }
 
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
     public GradeAnalyzePaperStatusEnum getStatus() {
         return status;
     }

+ 34 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/GradeBatch.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * <p>
@@ -46,6 +47,39 @@ public class GradeBatch extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long thirdExamId;
 
+    @ApiModelProperty(value = "原始数据")
+    private String source;
+
+    @ApiModelProperty(value = "进度")
+    private BigDecimal progress;
+
+    @ApiModelProperty(value = "报告路径")
+    private String reportFilePath;
+
+    public BigDecimal getProgress() {
+        return progress;
+    }
+
+    public void setProgress(BigDecimal progress) {
+        this.progress = progress;
+    }
+
+    public String getReportFilePath() {
+        return reportFilePath;
+    }
+
+    public void setReportFilePath(String reportFilePath) {
+        this.reportFilePath = reportFilePath;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
     public Long getSchoolId() {
         return schoolId;
     }

+ 16 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/GradeAnalyzePaperStatusEnum.java

@@ -6,20 +6,29 @@ package com.qmth.distributed.print.business.enums;
  * @Date: 2022-05-24
  */
 public enum GradeAnalyzePaperStatusEnum {
-    SETTING_GRADE_PAPER("设置分析试卷"),
-    PUSH_GRADE_BATCH("推送教研分析批次数据"),
-    SETTING_GRADE_PAPER_PARAM("设置分析试卷参数"),
-    READY_TO_CALCULATE("待计算"),
-    CALCULATING("计算中"),
-    FINISH_CALCULATE("完成计算"),
+    SETTING_GRADE_PAPER("数据准备中","创建批次数据且无分析课程时的状态。(无科目数据)"),
+    PUSH_GRADE_BATCH("提交分析数据","批次下每创建分析课程且还没有重新提交分析批次时的状态"),
+    SETTING_GRADE_PAPER_PARAM("蓝图数据准备中","推送分析数据给教研分析并且返回成功则设置此状态,并给命题老师发待办提醒。(如果推送失败则在推送任务管理里重新发起推送)"),
+    READY_TO_CALCULATE("待计算","批次下的所有科目都已上传蓝图数据则设置此状态"),
+    CALCULATING("计算中","发起分析则设置此状态。(发起分析后针对批次返回任务状态和进度,科目只显示计算中状态不显示进度。如果计算失败则在批次界面可以重新开始分析[断点续传]和错误原因.txt)"),
+    FINISH_CALCULATE("已完成","分析完毕后则设置此状态"),
     ;
     private final String desc;
+    private final String interpret;
 
-    GradeAnalyzePaperStatusEnum(String desc) {
+
+    GradeAnalyzePaperStatusEnum(String desc, String interpret) {
         this.desc = desc;
+        this.interpret = interpret;
     }
 
+
+
     public String getDesc() {
         return desc;
     }
+
+    public String getInterpret() {
+        return interpret;
+    }
 }

+ 3 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradeBatchPaperMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.distributed.print.business.bean.result.analyze.GradeBatchPaperResult;
 import com.qmth.distributed.print.business.entity.GradeBatchPaper;
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -24,14 +25,14 @@ public interface GradeBatchPaperMapper extends BaseMapper<GradeBatchPaper> {
      * 查找分析批次下的试卷分页数据
      *
      * @param iPage      分页参数
-     * @param semesterId 学期id
+     * @param batchId    批次id
      * @param examId     考试id
      * @param courseCode 课程编号
      * @param schoolId   学校id
      * @return 结果
      */
     IPage<GradeBatchPaperResult> findGradeBatchPaperPage(@Param("iPage") Page<GradeBatchPaperResult> iPage,
-                                                         @Param("semesterId") Long semesterId,
+                                                         @Param("batchId") Long batchId,
                                                          @Param("examId") Long examId,
                                                          @Param("courseCode") String courseCode,
                                                          @Param("schoolId") Long schoolId);

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

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

+ 15 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchPaperServiceImpl.java

@@ -7,10 +7,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.bean.params.analyze.AbleAnalyzePaperParam;
 import com.qmth.distributed.print.business.bean.params.analyze.GradeBatchPaperParam;
 import com.qmth.distributed.print.business.bean.result.analyze.GradeBatchPaperResult;
+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.GradeBatchPaperMapper;
 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.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -41,11 +43,13 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
     SysOrgService sysOrgService;
     @Resource
     TeachcloudCommonService teachcloudCommonService;
+    @Resource
+    GradeBatchService gradeBatchService;
 
     @Override
-    public IPage<GradeBatchPaperResult> findGradeBatchPaperPage(Long semesterId, Long examId, String courseCode, int pageNumber, int pageSize, SysUser requestUser) {
+    public IPage<GradeBatchPaperResult> findGradeBatchPaperPage(Long batchId, 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, courseCode, schoolId);
+        IPage<GradeBatchPaperResult> datasource = this.baseMapper.findGradeBatchPaperPage(new Page<>(pageNumber, pageSize), batchId, examId, courseCode, schoolId);
         for (GradeBatchPaperResult record : datasource.getRecords()) {
             Long teachingRoomId = record.getTeachingRoomId();
             SysOrg teachCollege = this.findTeachCollegeByOrgId(teachingRoomId);
@@ -56,10 +60,14 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
     }
 
     @Override
-    public List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long semesterId, Long examId, Long collegeId, String courseCode, String teacherName, SysUser requestUser) {
+    public List<GradeBatchPaperResult> findAbleAnalyzePaperList(Long batchId, 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, courseCode, teacherName, orgIds, schoolId);
+        GradeBatch gradeBatch = gradeBatchService.getById(batchId);
+        if (Objects.isNull(gradeBatch)) {
+            throw ExceptionResultEnum.ERROR.exception("教研分析批次不存在");
+        }
+        List<GradeBatchPaperResult> datasource = this.baseMapper.findAbleAnalyzePaper(gradeBatch.getSemesterId(), examId, collegeId, courseCode, teacherName, orgIds, schoolId);
         List<GradeBatchPaperResult> needAddList = new ArrayList<>();
         for (GradeBatchPaperResult gradeBatchPaperResult : datasource) {
             // 额外处理开课学院
@@ -77,6 +85,7 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
                 GradeBatchPaperResult needAdd = new GradeBatchPaperResult();
                 BeanUtils.copyProperties(gradeBatchPaperResult, needAdd);
                 needAdd.setPaperType(paperTypeCell);
+                needAdd.setPaperName(needAdd.getCourseName() + "-" + paperType);
                 needAddList.add(needAdd);
             }
         }
@@ -129,6 +138,8 @@ public class GradeBatchPaperServiceImpl extends ServiceImpl<GradeBatchPaperMappe
                 if (!teachCollegeId.equals(dbBatchPaper.getTeachCollegeId()) || !teachCollegeName.equals(dbBatchPaper.getTeachCollegeName()) || !paperName.equals(dbBatchPaper.getPaperName())) {
                     gradeBatchPaper.setStatus(GradeAnalyzePaperStatusEnum.PUSH_GRADE_BATCH);
                 }
+                gradeBatchPaper.setId(dbBatchPaper.getId());
+                gradeBatchPaper.setStatus(dbBatchPaper.getStatus());
                 gradeBatchPaper.updateInfo(requestUser.getId());
             }
             return Stream.of(gradeBatchPaper);

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

@@ -72,9 +72,13 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
     @Override
     public Long editGradeBatch(GradeBatchParam gradeBatchParam, SysUser requestUser) {
         Long schoolId = requestUser.getSchoolId();
+        Long semesterId = gradeBatchParam.getSemesterId();
         Long id = gradeBatchParam.getId();
         String batchName = gradeBatchParam.getBatchName();
         Long batchTime = gradeBatchParam.getBatchTime();
+        if (!SystemConstant.longNotNull(batchTime)){
+            batchTime = System.currentTimeMillis();
+        }
 
         // 教研分析批次名称学校唯一
         GradeBatch check = this.getOne(new QueryWrapper<GradeBatch>().lambda().eq(GradeBatch::getSchoolId, schoolId).eq(GradeBatch::getBatchName, batchName));
@@ -88,6 +92,7 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
         gradeBatch.setBatchCode(DateFormatUtils.format(batchTime, "yyyyMMdd"));
         gradeBatch.setStatus(GradeAnalyzePaperStatusEnum.SETTING_GRADE_PAPER);
         gradeBatch.setSchoolId(schoolId);
+        gradeBatch.setSemesterId(semesterId);
         if (!SystemConstant.longNotNull(id)) {
             id = SystemConstant.getDbUuid();
         }

+ 11 - 4
distributed-print-business/src/main/resources/mapper/GradeBatchMapper.xml

@@ -5,15 +5,22 @@
     <select id="findGradeBatchPage"
             resultType="com.qmth.distributed.print.business.bean.result.analyze.GradeBatchResult">
         SELECT
-            id, batch_name AS batchName, batch_time AS batchTime, status
+            gb.id AS id,
+            gb.batch_name AS batchName,
+            gb.batch_time AS batchTime,
+            gb.status,
+            gb.semester_id AS semesterId,
+            bs.name AS semesterName
         FROM
-            grade_batch
+            grade_batch gb
+        LEFT JOIN
+            basic_semester bs ON gb.semester_id = bs.id
         <where>
             <if test="schoolId != null and schoolId != ''">
-                AND school_id = #{schoolId}
+                AND gb.school_id = #{schoolId}
             </if>
             <if test="batchName != null and batchName != ''">
-                AND batch_name LIKE CONCAT('%',#{batchName},'%')
+                AND gb.batch_name LIKE CONCAT('%',#{batchName},'%')
             </if>
         </where>
     </select>

+ 3 - 2
distributed-print-business/src/main/resources/mapper/GradeBatchPaperMapper.xml

@@ -32,6 +32,7 @@
         et.teaching_room_id AS teachingRoomId,
         gbp.paper_number AS paperNumber,
         gbp.paper_type AS paperType,
+        gbp.paper_name AS paperName,
         gbp.status AS status
         FROM
         grade_batch_paper gbp
@@ -48,8 +49,8 @@
             <if test="schoolId != null and schoolId != ''">
                 AND gbp.school_id = #{schoolId}
             </if>
-            <if test="semesterId != null and semesterId != ''">
-                AND bs.id = #{semesterId}
+            <if test="batchId != null and batchId != ''">
+                AND gbp.batch_id = #{batchId}
             </if>
             <if test="examId != null and examId != ''">
                 AND be.id = #{examId}

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

@@ -5,6 +5,7 @@ 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.bean.result.analyze.GradeBatchResult;
 import com.qmth.distributed.print.business.entity.GradeBatch;
 import com.qmth.distributed.print.business.service.GradeBatchService;
 import com.qmth.distributed.print.business.templete.execute.AsyncTeachCloudReportService;
@@ -40,7 +41,7 @@ import java.util.stream.Collectors;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/batch")
 @Validated
-@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradeBatchController {
     @Resource
     private GradeBatchService gradeBatchService;
@@ -50,7 +51,7 @@ public class GradeBatchController {
 
     @ApiOperation(value = "成绩分析批次-查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradeBatchResult.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) {

+ 15 - 7
distributed-print/src/main/java/com/qmth/distributed/print/api/GradeBatchPaperController.java

@@ -5,9 +5,11 @@ 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.bean.result.analyze.GradeBatchPaperResult;
 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.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -35,35 +37,41 @@ import java.util.stream.Collectors;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/batch/paper")
 @Validated
-@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+//@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,
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradeBatchPaperResult.class)})
+    public Result findGradeBatchPaperPage(@ApiParam(value = "批次id", required = true) @RequestParam String batchId,
                                           @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) {
 
+        if (SystemConstant.isOneNull(batchId)) {
+            throw ExceptionResultEnum.ERROR.exception("参数不完整");
+        }
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(gradeBatchPaperService.findGradeBatchPaperPage(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), courseCode, pageNumber, pageSize, requestUser));
+        return ResultUtil.ok(gradeBatchPaperService.findGradeBatchPaperPage(SystemConstant.convertIdToLong(batchId), 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,
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradeBatchPaperResult.class)})
+    public Result findAbleAnalyzePaperList(@ApiParam(value = "批次id", required = true) @RequestParam String batchId,
                                            @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) {
 
+        if (SystemConstant.isOneNull(batchId)) {
+            throw ExceptionResultEnum.ERROR.exception("参数不完整");
+        }
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(gradeBatchPaperService.findAbleAnalyzePaperList(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), SystemConstant.convertIdToLong(collegeId), courseCode, teacherName, requestUser));
+        return ResultUtil.ok(gradeBatchPaperService.findAbleAnalyzePaperList(SystemConstant.convertIdToLong(batchId), SystemConstant.convertIdToLong(examId), SystemConstant.convertIdToLong(collegeId), courseCode, teacherName, requestUser));
     }
 
     @ApiOperation(value = "成绩分析批次课程-新建")

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

@@ -4,6 +4,7 @@ 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.bean.result.analyze.GradeModuleEvaluationResult;
 import com.qmth.distributed.print.business.service.GradeModuleEvaluationService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -31,14 +32,14 @@ import javax.validation.Valid;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/module/evaluation")
 @Validated
-@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+//@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)})
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradeModuleEvaluationResult.class)})
     public Result findGradeModuleEvaluationList(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
                                                 @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
 

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

@@ -4,6 +4,8 @@ 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.bean.result.analyze.GradeInitResult;
+import com.qmth.distributed.print.business.bean.result.analyze.GradePaperDefineResult;
 import com.qmth.distributed.print.business.service.GradeInitializeService;
 import com.qmth.distributed.print.business.service.GradePaperService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -33,7 +35,7 @@ import javax.validation.constraints.Min;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/paper")
 @Validated
-@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradePaperController {
     @Resource
     private GradePaperService gradePaperService;
@@ -42,7 +44,7 @@ public class GradePaperController {
 
     @ApiOperation(value = "成绩分析课程数据初始化")
     @RequestMapping(value = "/initialize", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradeInitResult.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,
@@ -55,7 +57,7 @@ public class GradePaperController {
 
     @ApiOperation(value = "成绩分析课程-查询定义")
     @RequestMapping(value = "/paper_define", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradePaperDefineResult.class)})
     public Result findGradePaperDefine(@ApiParam(value = "课程编号", required = true) @RequestParam String paperNumber,
                                        @ApiParam(value = "课程编号", required = true) @RequestParam String paperType) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();

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

@@ -4,6 +4,7 @@ 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.bean.result.analyze.GradePaperDimensionResult;
 import com.qmth.distributed.print.business.enums.DimensionEnum;
 import com.qmth.distributed.print.business.service.GradePaperDimensionService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -36,14 +37,14 @@ import java.io.IOException;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/paper/dimension")
 @Validated
-@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+//@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)})
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradePaperDimensionResult.class)})
     public Result findGradePaperDimensionList(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
                                               @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
 

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

@@ -4,6 +4,7 @@ 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.bean.result.analyze.GradePaperStructResult;
 import com.qmth.distributed.print.business.service.GradePaperStructService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -33,14 +34,14 @@ import java.io.IOException;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.grade}/paper/struct")
 @Validated
-@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
+//@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)})
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradePaperStructResult.class)})
     public Result findGradePaperStructList(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
                                            @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
 

+ 30 - 16
distributed-print/src/main/java/com/qmth/distributed/print/api/NotifyApiController.java

@@ -1,9 +1,11 @@
 package com.qmth.distributed.print.api;
 
+import com.alibaba.fastjson.JSONObject;
 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.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.bean.result.CalculateNotifyResult;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
@@ -21,7 +23,6 @@ import javax.annotation.Resource;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
-import java.text.MessageFormat;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -44,27 +45,40 @@ public class NotifyApiController {
     DictionaryConfig dictionaryConfig;
 
     @ApiOperation(value = "教研分析进度回调")
-    @ApiResponses({@ApiResponse(code = 200, message = "教研分析进度回调", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "教研分析进度回调", response = CalculateNotifyResult.class)})
     @RequestMapping(value = "/analysis/progress", method = RequestMethod.POST)
     @Aac(auth = BOOL.FALSE)
     public Result analysisProgress(@ApiParam(value = "接收教研分析回调数据", required = true) @RequestBody String result) throws UnsupportedEncodingException {
-        log.info("analysis_progress,result:{}", result);
-        String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
-        log.info("analysis_progress decodeJson:{}", decodeJson);
+        try {
+            log.info("analysis_progress,result:{}", result);
+            String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
+            log.info("analysis_progress decodeJson:{}", decodeJson);
 
-        String callbackPwd = dictionaryConfig.printOpenDomain().getCallbackPwd();
-        Optional.ofNullable(callbackPwd).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("配置文件回调密码为空"));
+            String callbackPwd = dictionaryConfig.printOpenDomain().getCallbackPwd();
+            Optional.ofNullable(callbackPwd).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("配置文件回调密码为空"));
 
-        String sign = ServletUtil.getRequestAuthorization();
-        Optional.ofNullable(sign).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("签名为空"));
-        log.info("sign:{}", sign);
+            String sign = ServletUtil.getRequestAuthorization();
+            Optional.ofNullable(sign).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("签名为空"));
+            log.info("sign:{}", sign);
 
-        String pattern = "{0}{1}{2}";
-        String localSign = URLEncoder.encode(MessageFormat.format(pattern, Base64Util.encode(ShaUtils.sha1(callbackPwd)), SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(decodeJson)), SystemConstant.CHARSET_NAME);
-        log.info("localSign:{}", localSign);
+            String localSign = URLEncoder.encode(Base64Util.encode(ShaUtils.sha1(callbackPwd + decodeJson)), SystemConstant.CHARSET_NAME);
+            log.info("localSign:{}", localSign);
 
-        if (!Objects.equals(localSign, sign)) {
-            throw ExceptionResultEnum.ERROR.exception("签名不匹配");
+            if (!Objects.equals(localSign, sign)) {
+                throw ExceptionResultEnum.ERROR.exception("签名不匹配");
+            }
+            CalculateNotifyResult calculateNotifyResult = JSONObject.toJavaObject(JSONObject.parseObject(decodeJson), CalculateNotifyResult.class);
+            String source = Base64Util.encode(ShaUtils.sha1(calculateNotifyResult.getExamId() + calculateNotifyResult.getCourseCode().toString()));
+            log.info("source:{}", source);
+            //TODO 更新grade_batch(状态和进度)和grade_batch_paper(状态)
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            //todo 生成txt文件
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
         }
         return ResultUtil.ok(System.currentTimeMillis());
     }

+ 17 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java

@@ -1,6 +1,9 @@
 package com.qmth.distributed.print.api;
 
+import cn.hutool.http.HttpStatus;
+import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.boot.api.exception.ApiException;
 import com.qmth.boot.core.solar.crypto.AppLicenseUtil;
 import com.qmth.boot.tools.signature.SignatureEntity;
 import com.qmth.boot.tools.signature.SignatureType;
@@ -8,6 +11,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.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.*;
 import io.swagger.annotations.*;
@@ -160,15 +164,26 @@ public class TSAuthController {
                     2022052700001L + "E",
                     2022052700001L + "F",
                     2022052700001L + "G"));//试卷编号+卷型
+            String source = Base64Util.encode(ShaUtils.sha1(map.get("examId") + map.get("courseCode").toString()));
+            log.info("source:{}", source);
+            //TODO 更新grade_batch source
             String accessToken = SignatureEntity.build(SignatureType.SECRET, SystemConstant.METHOD, dictionaryConfig.reportOpenDomain().getCalculateApi(), timestamp, basicSchool.getAccessKey(), basicSchool.getAccessSecret());
             String result = HttpUtil.postJson(dictionaryConfig.reportOpenDomain().getHostUrl() + dictionaryConfig.reportOpenDomain().getCalculateApi(), JacksonUtil.parseJson(map), accessToken, timestamp);
             if (Objects.nonNull(result)) {
                 log.info("result:{}", JacksonUtil.parseJson(result));
+                JSONObject jsonObject = JSONObject.parseObject(result);
+                if (Objects.nonNull(jsonObject.get("code")) && jsonObject.getIntValue("code") != HttpStatus.HTTP_OK) {
+                    throw ExceptionResultEnum.ERROR.exception(jsonObject.getString("error"));
+                }
             }
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
-        } finally {
-
+            //TODO 生成txt文件
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
         }
     }
 }

+ 272 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/UserSaveReportParams.java

@@ -0,0 +1,272 @@
+package com.qmth.teachcloud.common.bean.params;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.teachcloud.common.enums.userPush.SyncStatusEnum;
+import com.qmth.teachcloud.common.service.SysConfigService;
+import com.qmth.teachcloud.common.util.Base64Util;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 用户保存/编辑params
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/24
+ */
+public class UserSaveReportParams extends BaseEntity implements Serializable {
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("school_id")
+    private Long schoolId;
+    /**
+     * 用户名
+     */
+    @TableField("login_name")
+    @NotBlank(message = "请输入登录名")
+    @Length(message = "登录名不能超过{max}个字符", max = 50)
+    private String loginName;
+    /**
+     * 姓名
+     */
+    @TableField("real_name")
+    @NotBlank(message = "请输入姓名")
+    @Length(message = "姓名不能超过{max}个字符", max = 50)
+    private String realName;
+
+    /**
+     * 姓名
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 手机号
+     */
+    @TableField("mobile_number")
+//    @NotBlank(message = "请输入手机号码")
+    @Length(message = "手机号码不能超过{max}个字符", max = 25)
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    private Boolean enable = true;
+
+    /**
+     * 密码修改次数
+     */
+    @TableField("pwd_count")
+    private Integer pwdCount;
+
+    /**
+     * 密码修改时间
+     */
+    @TableField("pwd_update_time")
+    private Long pwdUpdateTime;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @TableField(exist = false)
+    private String oldPassword;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "前端传的修改手机号码时的验证码")
+    private String verifyCode;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(exist = false)
+    @NotNull(message = "请选择角色")
+    private Long[] roleIds;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(exist = false)
+    private Long[] courseIds;
+
+    @ApiModelProperty(value = "同步状态")
+    @TableField("sync_status")
+    private SyncStatusEnum syncStatus;
+
+    @ApiModelProperty("历史用户名")
+    private String historicName;
+
+    public String getHistoricName() {
+        return historicName;
+    }
+
+    public void setHistoricName(String historicName) {
+        this.historicName = historicName;
+    }
+
+    public UserSaveReportParams() {
+
+    }
+
+    public UserSaveReportParams(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);
+        SysConfigService sysConfigService = SpringContextHolder.getBean(SysConfigService.class);
+        SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
+        setPassword(Base64Util.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes()));
+    }
+
+    public SyncStatusEnum getSyncStatus() {
+        return syncStatus;
+    }
+
+    public void setSyncStatus(SyncStatusEnum syncStatus) {
+        this.syncStatus = syncStatus;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Integer getPwdCount() {
+        return pwdCount;
+    }
+
+    public void setPwdCount(Integer pwdCount) {
+        this.pwdCount = pwdCount;
+    }
+
+    public Long getPwdUpdateTime() {
+        return pwdUpdateTime;
+    }
+
+    public void setPwdUpdateTime(Long pwdUpdateTime) {
+        this.pwdUpdateTime = pwdUpdateTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Long[] getRoleIds() {
+        return roleIds;
+    }
+
+    public void setRoleIds(Long[] roleIds) {
+        this.roleIds = roleIds;
+    }
+
+    public Long[] getCourseIds() {
+        return courseIds;
+    }
+
+    public void setCourseIds(Long[] courseIds) {
+        this.courseIds = courseIds;
+    }
+
+    public String getOldPassword() {
+        return oldPassword;
+    }
+
+    public void setOldPassword(String oldPassword) {
+        this.oldPassword = oldPassword;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getVerifyCode() {
+        return verifyCode;
+    }
+
+    public void setVerifyCode(String verifyCode) {
+        this.verifyCode = verifyCode;
+    }
+}

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

@@ -251,6 +251,8 @@ public class SystemConstant {
     public static final long REDIS_LOCK_FLOW_TIME_OUT = 60L * 2;
     public static final String REDIS_LOCK_CUSTOM_FLOW_PREFIX = "redis:lock:custom:flow:";//自定义流程锁
     public static final long REDIS_LOCK_CUSTOM_FLOW_TIME_OUT = 60L * 2;
+    public static final String REDIS_LOCK_CALCULATE_PREFIX = "redis:lock:calculate:";//计算锁
+    public static final long REDIS_LOCK_CALCULATE_TIME_OUT = 60L * 60;
 
     /**
      * 机器心跳

+ 61 - 6
teachcloud-common/src/main/java/com/qmth/teachcloud/common/domain/PrintOpenDomain.java

@@ -1,11 +1,11 @@
 package com.qmth.teachcloud.common.domain;
 
+import io.swagger.annotations.ApiModelProperty;
+
 import java.io.Serializable;
 
 /**
  * @Description: 分布式印刷开放接口
- * @Param:
- * @return:
  * @Author: wangliang
  * @Date: 2020/4/10
  */
@@ -17,6 +17,21 @@ public class PrintOpenDomain implements Serializable {
 
     String callbackPwd;
 
+    @ApiModelProperty(value = "知学知考开放接口:试卷基础配置查询接口")
+    String paperConfig;
+
+    @ApiModelProperty(value = "知学知考开放接口:试卷考察点查询接口")
+    String paperDimension;
+
+    @ApiModelProperty(value = "知学知考开放接口:试卷蓝图查询接口")
+    String paperStructure;
+
+    @ApiModelProperty(value = "知学知考开放接口:试卷评价模型查询接口")
+    String paperEvaluation;
+
+    @ApiModelProperty(value = "知学知考开放接口:考生成绩查询接口")
+    String examStudentScore;
+
     public String getHostUrl() {
         return hostUrl;
     }
@@ -25,6 +40,14 @@ public class PrintOpenDomain implements Serializable {
         this.hostUrl = hostUrl;
     }
 
+    public String getCallbackUrlApi() {
+        return callbackUrlApi;
+    }
+
+    public void setCallbackUrlApi(String callbackUrlApi) {
+        this.callbackUrlApi = callbackUrlApi;
+    }
+
     public String getCallbackPwd() {
         return callbackPwd;
     }
@@ -33,11 +56,43 @@ public class PrintOpenDomain implements Serializable {
         this.callbackPwd = callbackPwd;
     }
 
-    public String getCallbackUrlApi() {
-        return callbackUrlApi;
+    public String getPaperConfig() {
+        return paperConfig;
     }
 
-    public void setCallbackUrlApi(String callbackUrlApi) {
-        this.callbackUrlApi = callbackUrlApi;
+    public void setPaperConfig(String paperConfig) {
+        this.paperConfig = paperConfig;
+    }
+
+    public String getPaperDimension() {
+        return paperDimension;
+    }
+
+    public void setPaperDimension(String paperDimension) {
+        this.paperDimension = paperDimension;
+    }
+
+    public String getPaperStructure() {
+        return paperStructure;
+    }
+
+    public void setPaperStructure(String paperStructure) {
+        this.paperStructure = paperStructure;
+    }
+
+    public String getPaperEvaluation() {
+        return paperEvaluation;
+    }
+
+    public void setPaperEvaluation(String paperEvaluation) {
+        this.paperEvaluation = paperEvaluation;
+    }
+
+    public String getExamStudentScore() {
+        return examStudentScore;
+    }
+
+    public void setExamStudentScore(String examStudentScore) {
+        this.examStudentScore = examStudentScore;
     }
 }

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

@@ -8,6 +8,7 @@ import com.qmth.teachcloud.common.bean.dto.UserDto;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
+import com.qmth.teachcloud.common.bean.params.UserSaveReportParams;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
 import com.qmth.teachcloud.common.bean.result.SyncCountResult;
 import com.qmth.teachcloud.common.bean.result.SysUserResult;
@@ -39,10 +40,10 @@ public interface SysUserService extends IService<SysUser> {
     /**
      * 保存用户
      *
-     * @param userSaveParams
+     * @param userSaveReportParams
      * @return
      */
-    boolean saveUserReport(UserSaveParams userSaveParams);
+    boolean saveUserReport(UserSaveReportParams userSaveReportParams);
 
     boolean enable(SysUser user) throws NoSuchAlgorithmException, IllegalAccessException;
 

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

@@ -19,6 +19,7 @@ import com.qmth.teachcloud.common.bean.dto.excel.SysUserImportDto;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.bean.params.UserPushParam;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
+import com.qmth.teachcloud.common.bean.params.UserSaveReportParams;
 import com.qmth.teachcloud.common.bean.result.*;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
@@ -161,7 +162,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      * @return
      */
     @Override
-    public boolean saveUserReport(UserSaveParams userSaveParams) {
+    public boolean saveUserReport(UserSaveReportParams userSaveReportParams) {
+        Gson gson = new Gson();
+        UserSaveParams userSaveParams = gson.fromJson(gson.toJson(userSaveReportParams), UserSaveParams.class);
         saveUserCommon(userSaveParams, null);
         return true;
     }

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

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
 import com.qmth.boot.core.enums.Platform;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.teachcloud.common.SignatureEntityTest;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.auth.ExpireTimeBean;
 import com.qmth.teachcloud.common.bean.dto.MenuDto;

+ 0 - 34
teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/strategy/CalculateTaskTemplate.java

@@ -1,34 +0,0 @@
-package com.qmth.teachcloud.common.sync.strategy;
-
-import com.qmth.teachcloud.common.bean.params.CalculateParams;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class CalculateTaskTemplate {
-    private final static Logger log = LoggerFactory.getLogger(CalculateTaskTemplate.class);
-//    private static RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
-
-    protected void createSyncTask() {
-        log.info("createSyncTask come in");
-    }
-
-    protected abstract void dataVaild();
-
-    protected abstract void calculate();
-
-    protected void finished() {
-        log.info("finished come in");
-    }
-
-    protected void exception() {
-        log.info("exception come in");
-    }
-
-    public void start(CalculateParams calculateParams) {
-        createSyncTask();
-        dataVaild();
-        calculate();
-        finished();
-    }
-}
-

+ 28 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/CalculateParams.java → teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/CalculateParams.java

@@ -1,8 +1,9 @@
-package com.qmth.teachcloud.common.bean.params;
+package com.qmth.teachcloud.report.business.bean.params;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.report.business.entity.TBSyncTask;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.util.CollectionUtils;
 
@@ -24,7 +25,14 @@ public class CalculateParams implements Serializable {
     private Long examId;
 
     @ApiModelProperty(value = "课程编码,一个分析试卷的唯一标识")
-    private List courseCode;
+    private List<String> courseCode;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "异步任务")
+    private TBSyncTask tbSyncTask;
 
     /**
      * 参数校验
@@ -36,6 +44,22 @@ public class CalculateParams implements Serializable {
         }
     }
 
+    public TBSyncTask getTbSyncTask() {
+        return tbSyncTask;
+    }
+
+    public void setTbSyncTask(TBSyncTask tbSyncTask) {
+        this.tbSyncTask = tbSyncTask;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
     public Long getExamId() {
         return examId;
     }
@@ -44,11 +68,11 @@ public class CalculateParams implements Serializable {
         this.examId = examId;
     }
 
-    public List getCourseCode() {
+    public List<String> getCourseCode() {
         return courseCode;
     }
 
-    public void setCourseCode(List courseCode) {
+    public void setCourseCode(List<String> courseCode) {
         this.courseCode = courseCode;
     }
 }

+ 26 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TBSyncTask.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.report.business.entity;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
@@ -20,7 +21,7 @@ import java.math.BigDecimal;
  * @author wangliang
  * @since 2022-06-06
  */
-@ApiModel(value="TBSyncTask对象", description="同步任务表")
+@ApiModel(value = "TBSyncTask对象", description = "同步任务表")
 public class TBSyncTask extends BaseEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -67,6 +68,30 @@ public class TBSyncTask extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "报告路径")
     private String reportFilePath;
 
+    @ApiModelProperty(value = "原始数据")
+    private String source;
+
+    public TBSyncTask() {
+
+    }
+
+    public TBSyncTask(Long schoolId, Long thirdRelateId, String source) {
+        setId(SystemConstant.getDbUuid());
+        this.schoolId = schoolId;
+        this.thirdRelateId = thirdRelateId;
+        this.type = PushTypeEnum.CALCULATE;
+        this.status = TaskStatusEnum.INIT;
+        this.source = source;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
     public Long getSchoolId() {
         return schoolId;
     }

+ 9 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeDataCheckService.java

@@ -0,0 +1,9 @@
+package com.qmth.teachcloud.report.business.service;
+
+/**
+ * @Description: 基础分析数据校验服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-06-07
+ */
+public interface AnalyzeDataCheckService {
+}

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

@@ -0,0 +1,13 @@
+package com.qmth.teachcloud.report.business.service;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: 基础分析数据获取服务类
+ * @Author: CaoZixuan
+ * @Date: 2022-06-07
+ */
+@Service
+public interface AnalyzeDataGetService {
+
+}

+ 12 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/CallPrintOpenApiService.java

@@ -0,0 +1,12 @@
+package com.qmth.teachcloud.report.business.service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 请求知学知考开放接口
+ * @Author: CaoZixuan
+ * @Date: 2022-06-07
+ */
+public interface CallPrintOpenApiService {
+}

+ 179 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/strategy/CalculateTaskTemplate.java

@@ -0,0 +1,179 @@
+package com.qmth.teachcloud.report.business.templete.strategy;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.util.*;
+import com.qmth.teachcloud.report.business.bean.params.CalculateParams;
+import com.qmth.teachcloud.report.business.entity.TBSyncTask;
+import com.qmth.teachcloud.report.business.service.TBSyncTaskService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Objects;
+
+/**
+ * @Description: 分析数据模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/6/7
+ */
+public abstract class CalculateTaskTemplate {
+    private final static Logger log = LoggerFactory.getLogger(CalculateTaskTemplate.class);
+
+    /**
+     * 创建异步任务
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    protected void createSyncTask(CalculateParams calculateParams) throws IOException {
+        log.info("createSyncTask come in");
+        TBSyncTaskService tbSyncTaskService = SpringContextHolder.getBean(TBSyncTaskService.class);
+        String source = Base64Util.encode(ShaUtils.sha1(calculateParams.getExamId() + calculateParams.getCourseCode().toString()));
+        QueryWrapper<TBSyncTask> tbSyncTaskQueryWrapper = new QueryWrapper<>();
+        tbSyncTaskQueryWrapper.lambda().eq(TBSyncTask::getThirdRelateId, calculateParams.getExamId())
+                .eq(TBSyncTask::getSource, source);
+        TBSyncTask tbSyncTask = tbSyncTaskService.getOne(tbSyncTaskQueryWrapper);
+        calculateParams.setTbSyncTask(tbSyncTask);
+        if (Objects.isNull(tbSyncTask)) {
+            tbSyncTask = new TBSyncTask(calculateParams.getSchoolId(), calculateParams.getExamId(), source);
+            tbSyncTaskService.save(tbSyncTask);
+        } else if (tbSyncTask.getStatus() == TaskStatusEnum.FINISH && tbSyncTask.getResult() == TaskResultEnum.SUCCESS) {
+            throw ExceptionResultEnum.ERROR.exception("该批次已完成计算");
+        }
+    }
+
+    /**
+     * 数据校验,由具体类实现
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    public abstract void dataVaild(CalculateParams calculateParams) throws IOException;
+
+    /**
+     * 数据计算,由具体类实现
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    public abstract void calculate(CalculateParams calculateParams) throws IOException;
+
+    /**
+     * 更新任务进度方法
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    protected void updateProgress(CalculateParams calculateParams) throws IOException {
+        log.info("updateProgress come in");
+        TBSyncTaskService tbSyncTaskService = SpringContextHolder.getBean(TBSyncTaskService.class);
+        TBSyncTask tbSyncTask = calculateParams.getTbSyncTask();
+        tbSyncTaskService.updateById(tbSyncTask);
+        callback(calculateParams);
+    }
+
+    /**
+     * 完成任务方法
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    protected void finished(CalculateParams calculateParams) throws IOException {
+        log.info("finished come in");
+        TBSyncTask tbSyncTask = calculateParams.getTbSyncTask();
+        tbSyncTask.setStatus(TaskStatusEnum.FINISH);
+        tbSyncTask.setResult(TaskResultEnum.SUCCESS);
+        updateProgress(calculateParams);
+    }
+
+    /**
+     * 任务异常方法
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    protected void exception(CalculateParams calculateParams) throws IOException {
+        log.info("exception come in");
+        TBSyncTask tbSyncTask = calculateParams.getTbSyncTask();
+        tbSyncTask.setStatus(TaskStatusEnum.FINISH);
+        tbSyncTask.setResult(TaskResultEnum.ERROR);
+        updateProgress(calculateParams);
+    }
+
+    /**
+     * 回调通知方法
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    protected void callback(CalculateParams calculateParams) throws IOException {
+        log.info("callback come in");
+        DictionaryConfig dictionaryConfig = SpringContextHolder.getBean(DictionaryConfig.class);
+        TBSyncTask tbSyncTask = calculateParams.getTbSyncTask();
+
+        Long time = System.currentTimeMillis();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("examId", tbSyncTask.getThirdRelateId());
+        jsonObject.put("courseCode", calculateParams.getCourseCode());
+        jsonObject.put("progress", tbSyncTask.getProgress());
+        jsonObject.put("status", tbSyncTask.getStatus());
+        jsonObject.put("time", time);
+
+        String sign = URLEncoder.encode(Base64Util.encode(ShaUtils.sha1(dictionaryConfig.printOpenDomain().getCallbackPwd() + jsonObject.toJSONString())), SystemConstant.CHARSET_NAME);
+        String callbackResult = HttpUtil.postJson(dictionaryConfig.printOpenDomain().getHostUrl() + dictionaryConfig.printOpenDomain().getCallbackUrlApi(), jsonObject.toJSONString(), sign, time);
+        if (Objects.nonNull(callbackResult)) {
+            log.info("callbackResult:{}", JacksonUtil.parseJson(callbackResult));
+        }
+    }
+
+    /**
+     * 开始计算
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
+    public void start(CalculateParams calculateParams) throws IOException {
+        RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+        String source = null;
+        if (Objects.nonNull(calculateParams.getTbSyncTask())) {
+            source = calculateParams.getTbSyncTask().getSource();
+        } else {
+            source = Base64Util.encode(ShaUtils.sha1(calculateParams.getExamId() + calculateParams.getCourseCode().toString()));
+        }
+        boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_CALCULATE_PREFIX + source, SystemConstant.REDIS_LOCK_CALCULATE_TIME_OUT);
+        if (!lock) {
+            throw ExceptionResultEnum.ERROR.exception("正在计算中,请稍候再试!");
+        }
+        try {
+            createSyncTask(calculateParams);
+            dataVaild(calculateParams);
+            calculate(calculateParams);
+            finished(calculateParams);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (Objects.nonNull(calculateParams.getTbSyncTask())) {
+                calculateParams.getTbSyncTask().setSummary(e.getMessage());
+                exception(calculateParams);
+            }
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            redisUtil.releaseLock(SystemConstant.REDIS_LOCK_CALCULATE_PREFIX + source);
+        }
+    }
+}
+

+ 40 - 3
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/strategy/CourseCodeSyncTaskService.java

@@ -1,21 +1,58 @@
 package com.qmth.teachcloud.report.business.templete.strategy;
 
-import com.qmth.teachcloud.common.sync.strategy.CalculateTaskTemplate;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.report.business.bean.params.CalculateParams;
+import com.qmth.teachcloud.report.business.entity.TBSyncTask;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+
+/**
+ * @Description: 科目(试卷)计算service
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/6/7
+ */
 @Service
 public class CourseCodeSyncTaskService extends CalculateTaskTemplate {
     private final static Logger log = LoggerFactory.getLogger(CourseCodeSyncTaskService.class);
 
+    /**
+     * 数据校验
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
     @Override
-    protected void dataVaild() {
+    public void dataVaild(CalculateParams calculateParams) throws IOException {
         log.info("CourseCodeSyncTaskService dataVaild come in");
+        TBSyncTask tbSyncTask = calculateParams.getTbSyncTask();
+        tbSyncTask.setStatus(TaskStatusEnum.DATA_VALID);
+        updateProgress(calculateParams);
+
+        //TODO 此处加校验数据具体逻辑方法,推荐service方法然后加@Transactional注解
+
     }
 
+    /**
+     * 数据计算
+     *
+     * @param calculateParams
+     * @throws IOException
+     */
     @Override
-    protected void calculate() {
+    public void calculate(CalculateParams calculateParams) throws IOException {
         log.info("CourseCodeSyncTaskService calculate come in");
+        TBSyncTask tbSyncTask = calculateParams.getTbSyncTask();
+        tbSyncTask.setStatus(TaskStatusEnum.RUNNING);
+        updateProgress(calculateParams);
+
+//        tbSyncTask.setObj(calculateParams.getCourseCode().get(0));//科目名称
+//        tbSyncTask.setRemark("tableName");//表名称
+
+        //TODO 此处加计算数据具体逻辑方法,推荐service方法然后加@Transactional注解
     }
 }

+ 7 - 42
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/OpenApiController.java

@@ -1,19 +1,20 @@
 package com.qmth.teachcloud.report.api;
 
-import com.alibaba.fastjson.JSONObject;
 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.params.BasicSemesterParams;
-import com.qmth.teachcloud.common.bean.params.CalculateParams;
 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.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.BasicSemesterService;
-import com.qmth.teachcloud.common.util.*;
+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.CalculateParams;
 import com.qmth.teachcloud.report.business.bean.params.CourseParam;
 import com.qmth.teachcloud.report.business.bean.params.TBExamParam;
 import com.qmth.teachcloud.report.business.service.TBExamCourseService;
@@ -31,11 +32,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.net.URLDecoder;
-import java.net.URLEncoder;
-import java.text.MessageFormat;
-import java.util.Objects;
 import java.util.Optional;
 
 /**
@@ -129,45 +126,13 @@ public class OpenApiController {
         log.info("calculate进来了,result:{}", decodeJson);
         CalculateParams calculateParams = JacksonUtil.readJson(decodeJson, CalculateParams.class);
         calculateParams.validParams();
-        AuthThirdUtil.hasPermission();
+        BasicSchool basicSchool = AuthThirdUtil.hasPermission();
+        calculateParams.setSchoolId(basicSchool.getId());
 
         String callbackPwd = dictionaryConfig.printOpenDomain().getCallbackPwd();
         Optional.ofNullable(callbackPwd).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("配置文件回调密码为空"));
 
         courseCodeSyncTaskService.start(calculateParams);
-
-        try {
-            //TODO 这里加入前置校验数据环节
-
-            BigDecimal progress = new BigDecimal(0);
-            BigDecimal finished = new BigDecimal(1);
-            for (int i = 0; i < calculateParams.getCourseCode().size(); i++) {
-                progress = new BigDecimal(i).divide(new BigDecimal(calculateParams.getCourseCode().size() - 1), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
-                Long time = System.currentTimeMillis();
-                JSONObject dataObjectJson = new JSONObject();
-                dataObjectJson.put("examId", calculateParams.getExamId());
-                dataObjectJson.put("courseCode", calculateParams.getCourseCode().get(i));
-                dataObjectJson.put("progress", progress);
-                if (progress.compareTo(finished) == 0) {
-                    dataObjectJson.put("status", "FINISHED");
-                } else {
-                    dataObjectJson.put("status", "RUNNING");
-                }
-                dataObjectJson.put("time", time);
-                String pattern = "{0}{1}{2}";
-                String sign = URLEncoder.encode(MessageFormat.format(pattern, Base64Util.encode(ShaUtils.sha1(callbackPwd)), SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(dataObjectJson.toJSONString())), SystemConstant.CHARSET_NAME);
-                String callbackResult = HttpUtil.postJson(dictionaryConfig.printOpenDomain().getHostUrl() + dictionaryConfig.printOpenDomain().getCallbackUrlApi(), dataObjectJson.toJSONString(), sign, time);
-                if (Objects.nonNull(callbackResult)) {
-                    log.info("callbackResult:{}", JacksonUtil.parseJson(callbackResult));
-                }
-                if (progress.compareTo(finished) == 0) {
-                    break;
-                }
-//                Thread.sleep(5000);
-            }
-        } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-        }
         return ResultUtil.ok(true);
     }
 }

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

@@ -3,7 +3,7 @@ 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.bean.params.UserSaveReportParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.service.SysUserService;
@@ -100,11 +100,11 @@ public class SysUserController {
      */
     @ApiOperation(value = "新增/修改")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public Result save(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody UserSaveParams userSaveParams, BindingResult bindingResult) throws IllegalAccessException {
+    public Result save(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody UserSaveReportParams userSaveReportParams, BindingResult bindingResult) throws IllegalAccessException {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        return ResultUtil.ok(sysUserService.saveUserReport(userSaveParams));
+        return ResultUtil.ok(sysUserService.saveUserReport(userSaveReportParams));
     }
 
     /**

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

@@ -140,6 +140,11 @@ yun.mark.studentScoreApi=/api/exam/student/score
 print.open.hostUrl=http://127.0.0.1:7001
 print.open.callbackUrlApi=/api/admin/print/notify/analysis/progress
 print.open.callbackPwd=123456
+print.open.paperConfig=/api/admin/open/paper_config
+print.open.paperDimension=/api/admin/open/paper_dimension
+print.open.paperStructure=/api/admin/open/paper_structure
+print.open.paperEvaluation=/api/admin/open/paper_evaluation
+print.open.examStudentScore=/api/admin/open/exam_student_score
 
 #============================================================================
 # \u914D\u7F6EJobStore