Ver código fonte

新增教研分析回调

wangliang 3 anos atrás
pai
commit
8c2230e0ad

+ 28 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/NotifyApiController.java

@@ -3,9 +3,13 @@ package com.qmth.distributed.print.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.SignatureEntityTest;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -15,8 +19,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+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;
 
 /**
  * <p>
@@ -30,17 +39,35 @@ import java.net.URLDecoder;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.notify}")
 @Validated
-@Aac(auth = BOOL.FALSE)
 public class NotifyApiController {
     private final static Logger log = LoggerFactory.getLogger(NotifyApiController.class);
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
     @ApiOperation(value = "教研分析进度回调")
     @ApiResponses({@ApiResponse(code = 200, message = "教研分析进度回调", response = Object.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);
+
+        String callbackPwd = dictionaryConfig.printOpenDomain().getCallbackPwd();
+        Optional.ofNullable(callbackPwd).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("配置文件回调密码为空"));
+
+        String sign = ServletUtil.getRequestSign();
+        Optional.ofNullable(sign).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("签名为空"));
+        log.info("sign:{}", sign);
+
+        String pattern = "{0}{1}{2}";
+        String localSign = URLEncoder.encode(MessageFormat.format(pattern, dictionaryConfig.printOpenDomain().getCallbackPwd(), SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(decodeJson)), SystemConstant.CHARSET_NAME);
+        log.info("localSign:{}", localSign);
+
+        if (!Objects.equals(localSign, sign)) {
+            throw ExceptionResultEnum.ERROR.exception("签名不匹配");
+        }
         return ResultUtil.ok(System.currentTimeMillis());
     }
 }

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

@@ -1,7 +1,5 @@
 package com.qmth.distributed.print.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.boot.core.solar.crypto.AppLicenseUtil;
 import com.qmth.boot.tools.signature.SignatureEntity;
@@ -18,14 +16,16 @@ import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.net.URLDecoder;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -166,14 +166,14 @@ public class TSAuthController {
 //    }
     }
 
-    @ApiOperation(value = "测试教研分析回调接口")
-    @ApiResponses({@ApiResponse(code = 200, message = "测试教研分析回调接口", response = Objects.class)})
-    @RequestMapping(value = "/test/callback", method = RequestMethod.POST)
-    @Aac(auth = BOOL.FALSE)
-    public Result testCallback(@ApiParam(value = "接收教研分析回调数据", required = true) @RequestBody String result) throws IOException {
-        log.info("testCallback,result:{}", result);
-        String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
-        log.info("testCallback decodeJson:{}", decodeJson);
-        return ResultUtil.ok(System.currentTimeMillis());
-    }
+//    @ApiOperation(value = "测试教研分析回调接口")
+//    @ApiResponses({@ApiResponse(code = 200, message = "测试教研分析回调接口", response = Objects.class)})
+//    @RequestMapping(value = "/test/callback", method = RequestMethod.POST)
+//    @Aac(auth = BOOL.FALSE)
+//    public Result testCallback(@ApiParam(value = "接收教研分析回调数据", required = true) @RequestBody String result) throws IOException {
+//        log.info("testCallback,result:{}", result);
+//        String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
+//        log.info("testCallback decodeJson:{}", decodeJson);
+//        return ResultUtil.ok(System.currentTimeMillis());
+//    }
 }

+ 3 - 1
distributed-print/src/main/resources/application-dev.properties

@@ -201,4 +201,6 @@ report.open.hostUrl=http://127.0.0.1:7004
 report.open.semesterApi=/api/report/open/semester_edit
 report.open.examApi=/api/report/open/exam_edit
 report.open.courseApi=/api/report/open/course_edit
-report.open.ssoLoginApi=/api/report/sso/login
+report.open.ssoLoginApi=/api/report/sso/login
+
+print.open.callbackPwd=123456

+ 20 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/domain/PrintOpenDomain.java

@@ -11,8 +11,28 @@ import java.io.Serializable;
  */
 public class PrintOpenDomain implements Serializable {
 
+    String hostUrl;
+
     String callbackUrlApi;
 
+    String callbackPwd;
+
+    public String getHostUrl() {
+        return hostUrl;
+    }
+
+    public void setHostUrl(String hostUrl) {
+        this.hostUrl = hostUrl;
+    }
+
+    public String getCallbackPwd() {
+        return callbackPwd;
+    }
+
+    public void setCallbackPwd(String callbackPwd) {
+        this.callbackPwd = callbackPwd;
+    }
+
     public String getCallbackUrlApi() {
         return callbackUrlApi;
     }

+ 8 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/CourseParam.java

@@ -33,6 +33,14 @@ public class CourseParam implements Serializable {
     @ApiModelProperty(value = "开课机构名称(命题机构)")
     private String teachCollegeName;
 
+    /**
+     * 参数校验
+     */
+    public void validParamsExamIdAndCourseCode() {
+        Optional.ofNullable(this.getExamId()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("考试id为空"));
+        Optional.ofNullable(this.getCourseCode()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("课程编码为空"));
+    }
+
     /**
      * 参数校验
      */

+ 73 - 4
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/OpenApiController.java

@@ -1,20 +1,23 @@
 package com.qmth.teachcloud.report.api;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.SignatureEntityTest;
 import com.qmth.teachcloud.common.bean.params.BasicSemesterParams;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicCourse;
 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.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.common.util.*;
 import com.qmth.teachcloud.report.business.bean.params.CourseParam;
 import com.qmth.teachcloud.report.business.bean.params.TBExamParam;
+import com.qmth.teachcloud.report.business.entity.TBExamCourse;
 import com.qmth.teachcloud.report.business.service.TBExamCourseService;
 import com.qmth.teachcloud.report.business.service.TBExamService;
 import io.swagger.annotations.*;
@@ -30,6 +33,9 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.text.MessageFormat;
+import java.util.Objects;
 import java.util.Optional;
 
 /**
@@ -59,6 +65,9 @@ public class OpenApiController {
     @Resource
     TBExamCourseService tbExamCourseService;
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
     @ApiOperation(value = "学期创建/更新接口")
     @ApiResponses({@ApiResponse(code = 200, message = "学期创建/更新接口", response = Object.class)})
     @RequestMapping(value = "/semester_edit", method = RequestMethod.POST)
@@ -107,6 +116,66 @@ public class OpenApiController {
         return ResultUtil.ok(true);
     }
 
+    @ApiOperation(value = "分析课程(试卷)删除接口")
+    @ApiResponses({@ApiResponse(code = 200, message = "分析课程(试卷)删除接口", response = Object.class)})
+    @RequestMapping(value = "/course_del", method = RequestMethod.POST)
+    @Aac(auth = BOOL.FALSE)
+    @Transactional
+    public Result courseDel(@ApiParam(value = "接收分析课程(试卷)数据信息", required = true) @RequestBody String result) throws IOException, InterruptedException {
+        Optional.ofNullable(result).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("数据为空"));
+        String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
+        log.info("courseDel进来了进来了,result:{}", decodeJson);
+        CourseParam courseParam = JacksonUtil.readJson(decodeJson, CourseParam.class);
+        courseParam.validParamsExamIdAndCourseCode();
+        BasicSchool basicSchool = AuthThirdUtil.hasPermission();
+        QueryWrapper<BasicCourse> basicCourseQueryWrapper = new QueryWrapper<>();
+        basicCourseQueryWrapper.lambda().eq(BasicCourse::getSchoolId, basicSchool.getId())
+                .eq(BasicCourse::getCode, courseParam.getCourseCode());
+        basicCourseService.remove(basicCourseQueryWrapper);
+
+        QueryWrapper<TBExamCourse> tbExamCourseQueryWrapper = new QueryWrapper<>();
+        tbExamCourseQueryWrapper.lambda().eq(TBExamCourse::getSchoolId, basicSchool.getId())
+                .eq(TBExamCourse::getCourseCode, courseParam.getCourseCode())
+                .eq(TBExamCourse::getExamId, courseParam.getExamId());
+        tbExamCourseService.remove(tbExamCourseQueryWrapper);
+        return ResultUtil.ok(true);
+    }
+
+    @ApiOperation(value = "生成课程(试卷)分析报告接口")
+    @ApiResponses({@ApiResponse(code = 200, message = "生成课程(试卷)分析报告接口", response = Object.class)})
+    @RequestMapping(value = "/calculate", method = RequestMethod.POST)
+    @Aac(auth = BOOL.FALSE)
+    public Result calculate(@ApiParam(value = "接收分析课程(试卷)数据信息", required = true) @RequestBody String result) throws IOException, InterruptedException {
+        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();
+        AuthThirdUtil.hasPermission();
+
+        String callbackPwd = dictionaryConfig.printOpenDomain().getCallbackPwd();
+        Optional.ofNullable(callbackPwd).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("配置文件回调密码为空"));
+
+        try {
+            Long time = System.currentTimeMillis();
+            JSONObject dataObjectJson = new JSONObject();
+            dataObjectJson.put("examId", courseParam.getExamId());
+            dataObjectJson.put("courseCode", courseParam.getCourseCode());
+            dataObjectJson.put("progress", 0d);
+            dataObjectJson.put("status", "RUNNING");
+            dataObjectJson.put("time", time);
+            String pattern = "{0}{1}{2}";
+            String sign = URLEncoder.encode(MessageFormat.format(pattern, 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));
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+        return ResultUtil.ok(true);
+    }
+
 //    @ApiOperation(value = "接收基础考务数据")
 //    @ApiResponses({@ApiResponse(code = 200, message = "推送基础考务数据", response = Object.class)})
 //    @RequestMapping(value = "/basic/examination/data", method = RequestMethod.POST)

+ 2 - 4
teachcloud-report/src/main/resources/application-dev.properties

@@ -137,11 +137,9 @@ sms.config.aliyunSMSAuditOverdueCode=SMS_217416271
 yun.mark.url=https://www.markingcloud.com
 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
-
-#com.qmth.solar.access-key=274f823e5f59410f8b3bb6edcd8e2b6e
-#com.qmth.solar.access-secret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
-#com.qmth.solar.license=/Users/king/Downloads/tc-dev-wl.lic
+print.open.callbackPwd=123456
 
 #============================================================================
 # \u914D\u7F6EJobStore