Browse Source

新增教研分析回调

wangliang 3 năm trước cách đây
mục cha
commit
b93f68a872
15 tập tin đã thay đổi với 417 bổ sung18 xóa
  1. 20 7
      distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java
  2. 54 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/CalculateParams.java
  3. 6 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  4. 3 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/PushTypeEnum.java
  5. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskStatusEnum.java
  6. 34 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/strategy/CalculateTaskTemplate.java
  7. 7 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/HttpUtil.java
  8. 173 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TBSyncTask.java
  9. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/TBSyncTaskMapper.java
  10. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBSyncTaskService.java
  11. 20 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBSyncTaskServiceImpl.java
  12. 21 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/strategy/CourseCodeSyncTaskService.java
  13. 5 0
      teachcloud-report-business/src/main/resources/mapper/TBSyncTaskMapper.xml
  14. 21 10
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/OpenApiController.java
  15. 19 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TBSyncTaskController.java

+ 20 - 7
distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java

@@ -25,6 +25,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -149,13 +150,25 @@ public class TSAuthController {
         /**
          * 测试生成课程(试卷)分析报告接口
          */
-        Map<String, Object> map = new HashMap<>();
-        map.computeIfAbsent("examId", v -> 262946761763454976L);
-        map.computeIfAbsent("courseCode", v -> 2022052700001L + "A");//试卷编号+卷型
-        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));
+        try {
+            Map<String, Object> map = new HashMap<>();
+            map.computeIfAbsent("examId", v -> 262946761763454976L);
+            map.computeIfAbsent("courseCode", v -> Arrays.asList(2022052700001L + "A",
+                    2022052700001L + "B",
+                    2022052700001L + "C",
+                    2022052700001L + "D",
+                    2022052700001L + "E",
+                    2022052700001L + "F",
+                    2022052700001L + "G"));//试卷编号+卷型
+            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));
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        } finally {
+
         }
     }
 }

+ 54 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/CalculateParams.java

@@ -0,0 +1,54 @@
+package com.qmth.teachcloud.common.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 io.swagger.annotations.ApiModelProperty;
+import org.springframework.util.CollectionUtils;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @Description: 分析参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/5/27
+ */
+public class CalculateParams implements Serializable {
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "课程编码,一个分析试卷的唯一标识")
+    private List courseCode;
+
+    /**
+     * 参数校验
+     */
+    public void validParams() {
+        Optional.ofNullable(this.getExamId()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("考试id为空"));
+        if (CollectionUtils.isEmpty(courseCode)) {
+            throw ExceptionResultEnum.PARAMS_ERROR.exception("课程编码为空");
+        }
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public List getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(List courseCode) {
+        this.courseCode = courseCode;
+    }
+}

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

@@ -261,6 +261,12 @@ public class SystemConstant {
 
     public static final String LOG_ERROR = "请求出错:";
 
+    /**
+     * http设置
+     */
+    public static final int CONNECT_TIME_OUT = 1000 * 60 * 2;//请求超时
+    public static final int SOCKET_CONNECT_TIME_OUT = 1000 * 60 * 30;//读取数据超时
+
     /**
      * 初始化附件文件路径
      */

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

@@ -20,7 +20,9 @@ public enum PushTypeEnum {
 
     OBJECTIVE_ANSWER_PUSH("客观题答案推送"),
 
-    SCORE_PUSH("成绩推送");
+    SCORE_PUSH("成绩推送"),
+
+    CALCULATE("分析计算");
 
     PushTypeEnum(String title) {
         this.title = title;

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskStatusEnum.java

@@ -15,6 +15,8 @@ public enum TaskStatusEnum {
 
     INIT("未开始"),
 
+    DATA_VALID("数据校验中"),
+
     RUNNING("进行中"),
 
     FINISH("已完成");

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

@@ -0,0 +1,34 @@
+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();
+    }
+}
+

+ 7 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/HttpUtil.java

@@ -7,6 +7,7 @@ import org.apache.http.Consts;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
@@ -47,8 +48,14 @@ public class HttpUtil {
      * @throws IOException
      */
     public static String postJson(String url, String json, String secret, Long timestamp) throws IOException {
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(SystemConstant.CONNECT_TIME_OUT)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(SystemConstant.CONNECT_TIME_OUT)// 请求超时时间
+                .setSocketTimeout(SystemConstant.SOCKET_CONNECT_TIME_OUT)// 数据读取超时时间
+                .build();
+
         // 构建post请求
         HttpPost post = new HttpPost(url);
+        post.setConfig(requestConfig);
         post.setHeader(SystemConstant.HEADER_AUTHORIZATION, secret);
         post.setHeader(SystemConstant.HEADER_TIME, String.valueOf(timestamp));
         post.setHeader(HTTP.CONTENT_TYPE, "application/json; charset=utf-8");

+ 173 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/TBSyncTask.java

@@ -0,0 +1,173 @@
+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.enums.PushTypeEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 同步任务表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-06-06
+ */
+@ApiModel(value="TBSyncTask对象", description="同步任务表")
+public class TBSyncTask extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "任务类型,CALCULATE:分析计算")
+    private PushTypeEnum type;
+
+    @ApiModelProperty(value = "第三方关联ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long thirdRelateId;
+
+    @ApiModelProperty(value = "实体信息")
+    private String obj;
+
+    @ApiModelProperty(value = "进度")
+    private BigDecimal progress;
+
+    @ApiModelProperty(value = "任务状态,INIT:未开始,DATA_VALID:数据校验中,RUNNING:进行中,FINISH:已完成")
+    private TaskStatusEnum status;
+
+    @ApiModelProperty(value = "实时摘要信息")
+    private String summary;
+
+    @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
+    private TaskResultEnum result;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "重试次数")
+    private Integer resetCount;
+
+    @ApiModelProperty(value = "人工错误原因")
+    private String errorMessage;
+
+    @ApiModelProperty(value = "报告路径")
+    private String reportFilePath;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public PushTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(PushTypeEnum type) {
+        this.type = type;
+    }
+
+    public Long getThirdRelateId() {
+        return thirdRelateId;
+    }
+
+    public void setThirdRelateId(Long thirdRelateId) {
+        this.thirdRelateId = thirdRelateId;
+    }
+
+    public String getObj() {
+        return obj;
+    }
+
+    public void setObj(String obj) {
+        this.obj = obj;
+    }
+
+    public BigDecimal getProgress() {
+        return progress;
+    }
+
+    public void setProgress(BigDecimal progress) {
+        this.progress = progress;
+    }
+
+    public TaskStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(TaskStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getSummary() {
+        return summary;
+    }
+
+    public void setSummary(String summary) {
+        this.summary = summary;
+    }
+
+    public TaskResultEnum getResult() {
+        return result;
+    }
+
+    public void setResult(TaskResultEnum result) {
+        this.result = result;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getResetCount() {
+        return resetCount;
+    }
+
+    public void setResetCount(Integer resetCount) {
+        this.resetCount = resetCount;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    public String getReportFilePath() {
+        return reportFilePath;
+    }
+
+    public void setReportFilePath(String reportFilePath) {
+        this.reportFilePath = reportFilePath;
+    }
+}

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

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.TBSyncTask;
+
+/**
+ * <p>
+ * 同步任务表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-06-06
+ */
+public interface TBSyncTaskMapper extends BaseMapper<TBSyncTask> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.entity.TBSyncTask;
+
+/**
+ * <p>
+ * 同步任务表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-06-06
+ */
+public interface TBSyncTaskService extends IService<TBSyncTask> {
+
+}

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

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.report.business.entity.TBSyncTask;
+import com.qmth.teachcloud.report.business.mapper.TBSyncTaskMapper;
+import com.qmth.teachcloud.report.business.service.TBSyncTaskService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 同步任务表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-06-06
+ */
+@Service
+public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncTask> implements TBSyncTaskService {
+
+}

+ 21 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/templete/strategy/CourseCodeSyncTaskService.java

@@ -0,0 +1,21 @@
+package com.qmth.teachcloud.report.business.templete.strategy;
+
+import com.qmth.teachcloud.common.sync.strategy.CalculateTaskTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CourseCodeSyncTaskService extends CalculateTaskTemplate {
+    private final static Logger log = LoggerFactory.getLogger(CourseCodeSyncTaskService.class);
+
+    @Override
+    protected void dataVaild() {
+        log.info("CourseCodeSyncTaskService dataVaild come in");
+    }
+
+    @Override
+    protected void calculate() {
+        log.info("CourseCodeSyncTaskService calculate come in");
+    }
+}

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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.teachcloud.report.business.mapper.TBSyncTaskMapper">
+
+</mapper>

+ 21 - 10
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/OpenApiController.java

@@ -6,6 +6,7 @@ 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;
@@ -17,6 +18,7 @@ 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;
 import com.qmth.teachcloud.report.business.service.TBExamService;
+import com.qmth.teachcloud.report.business.templete.strategy.CourseCodeSyncTaskService;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,6 +31,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;
@@ -65,6 +68,9 @@ public class OpenApiController {
     @Resource
     DictionaryConfig dictionaryConfig;
 
+    @Resource
+    CourseCodeSyncTaskService courseCodeSyncTaskService;
+
     @ApiOperation(value = "学期创建/更新接口")
     @ApiResponses({@ApiResponse(code = 200, message = "学期创建/更新接口", response = Object.class)})
     @RequestMapping(value = "/semester_edit", method = RequestMethod.POST)
@@ -121,23 +127,28 @@ public class OpenApiController {
         Optional.ofNullable(result).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("数据为空"));
         String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
         log.info("calculate进来了,result:{}", decodeJson);
-        CourseParam courseParam = JacksonUtil.readJson(decodeJson, CourseParam.class);
-        courseParam.validParamsExamIdAndCourseCode();
+        CalculateParams calculateParams = JacksonUtil.readJson(decodeJson, CalculateParams.class);
+        calculateParams.validParams();
         AuthThirdUtil.hasPermission();
 
         String callbackPwd = dictionaryConfig.printOpenDomain().getCallbackPwd();
         Optional.ofNullable(callbackPwd).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("配置文件回调密码为空"));
 
+        courseCodeSyncTaskService.start(calculateParams);
+
         try {
-            Double progress = 0D;
-            for (int i = 0; i < 11; i++) {
-                progress += 10D;
+            //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", courseParam.getExamId());
-                dataObjectJson.put("courseCode", courseParam.getCourseCode());
+                dataObjectJson.put("examId", calculateParams.getExamId());
+                dataObjectJson.put("courseCode", calculateParams.getCourseCode().get(i));
                 dataObjectJson.put("progress", progress);
-                if (progress == 100D) {
+                if (progress.compareTo(finished) == 0) {
                     dataObjectJson.put("status", "FINISHED");
                 } else {
                     dataObjectJson.put("status", "RUNNING");
@@ -149,10 +160,10 @@ public class OpenApiController {
                 if (Objects.nonNull(callbackResult)) {
                     log.info("callbackResult:{}", JacksonUtil.parseJson(callbackResult));
                 }
-                if (progress == 100D) {
+                if (progress.compareTo(finished) == 0) {
                     break;
                 }
-                Thread.sleep(5000);
+//                Thread.sleep(5000);
             }
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);

+ 19 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/TBSyncTaskController.java

@@ -0,0 +1,19 @@
+package com.qmth.teachcloud.report.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 同步任务表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-06-06
+ */
+@RestController
+@RequestMapping("/t-bsync-task")
+public class TBSyncTaskController {
+
+}