Browse Source

fix: 消费服务
1.上传消费记录改为异步处理

luoyb 11 months ago
parent
commit
07d526f0d4

+ 14 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ConsumeBusiness.java

@@ -22,11 +22,13 @@ import org.dromara.common.core.enums.ConsumeRecordTypeEnum;
 import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.enums.ResultCodeEnum;
 import org.dromara.common.core.enums.SystemUseTypeEnum;
+import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.consume.domain.vo.PtBagVo;
 import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -276,4 +278,16 @@ public class ConsumeBusiness {
         doMessage.forEach(System.out::println);
         return R.ok(MessageFormat.format("[同步消费完成]-[待处理:{0}条,成功:{1}条,失败:{2}条]", total, success.get(), fail.get()));
     }
+
+    @Async
+    public void postOrderAsync(ConsumptionBo bo, String mac, String xfPwd) {
+        R<ErrorInfo> result = SpringUtils.getAopProxy(this).postOrder(bo, mac, xfPwd);
+        if (R.isSuccess(result)) {
+            // 发送消息
+            if (ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {
+                ThreadUtil.execAsync(() -> baseBusiness.sendCloudConsume(bo));
+            }
+        }
+        log.info("[上传交易结果完成]");
+    }
 }

+ 7 - 3
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java

@@ -22,6 +22,7 @@ import org.dromara.server.consume.convert.strategy.RecordConvertStrategyContent;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -48,6 +49,7 @@ public class ConsumeController {
     private final ConsumeBusiness consumeBusiness;
     private final BaseBusiness baseBusiness;
     private final DefaultConfig defaultConfig;
+    private final ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
     /**
      * 请求消费(校园码)
@@ -68,7 +70,7 @@ public class ConsumeController {
         Object redisQrCode = RedisUtils.getCacheMapValue(CacheNames.SCHOOL_CODE, Long.toString(userNo));
         if (ObjectUtil.equals(qrcode, redisQrCode)) {
             ErrorResult result = ErrorResult.instance(HttpStatus.FORBIDDEN, "处理失败", 1, "PARAM_ERROR", "二维码失效",
-                                                      "请勿重复使用相同的二维码消费。");
+                "请勿重复使用相同的二维码消费。");
             return new ResponseEntity<Object>(result, null, HttpStatus.FORBIDDEN);
         }
         RedisUtils.setCacheMapValue(CacheNames.SCHOOL_CODE, Long.toString(userNo), qrcode);
@@ -169,7 +171,7 @@ public class ConsumeController {
     private Object doRecordData(Object record, String type, String mac, String xfPwd) {
         if (ObjectUtil.length(record) == 0) {
             ErrorResult result = ErrorResult.instance(HttpStatus.FORBIDDEN, "处理失败", 1, "PARAM_ERROR", "参数错误",
-                                                      "json字符串无法还原为对象,可能原因是格式不正确。");
+                "json字符串无法还原为对象,可能原因是格式不正确。");
             return new ResponseEntity<Object>(result, null, HttpStatus.FORBIDDEN);
         }
         ConsumptionBo bo = recordConvertStrategy.convert(record, "YC");
@@ -184,7 +186,9 @@ public class ConsumeController {
             //}
             errorInfo = consumeBusiness.createOrder(bo, mac, xfPwd);
         } else if (Objects.equals(type, "uploadRecord")) {
-            errorInfo = consumeBusiness.postOrder(bo, mac, xfPwd);
+            threadPoolTaskExecutor.submit(() -> consumeBusiness.postOrderAsync(bo, mac, xfPwd));
+            errorInfo = R.ok();
+            //errorInfo = consumeBusiness.postOrder(bo, mac, xfPwd);
         } else {
             errorInfo = consumeBusiness.fullOrder(bo, mac, xfPwd);
         }