Bladeren bron

更新定时查询支付订单

Yangzw 6 maanden geleden
bovenliggende
commit
3dc04fe46d

+ 19 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/topupconsumptionpoints/TopUpConsumptionPointsConsumer.java

@@ -0,0 +1,19 @@
+package cn.newfeifan.mall.module.distri.mq.consumer.topupconsumptionpoints;
+
+import cn.newfeifan.mall.module.distri.service.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderService;
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
+import org.springframework.context.event.EventListener;
+
+import javax.annotation.Resource;
+
+public class TopUpConsumptionPointsConsumer {
+
+    @Resource
+    private UserTopUpConsumptionPointsOrderService userTopUpConsumptionPointsOrderService;
+
+    @EventListener
+    public void onMessage(PayOrderDO payOrderDO) {
+        //修改订单状态,并计算权益
+        userTopUpConsumptionPointsOrderService.topUpConsumptionPoints(payOrderDO);
+    }
+}

+ 22 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/mq/consumer/order/OrderConsumer.java

@@ -0,0 +1,22 @@
+package cn.newfeifan.mall.module.trade.mq.consumer.order;
+
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class OrderConsumer {
+
+    @Resource
+    private TradeOrderUpdateService tradeOrderUpdateService;
+
+    @EventListener
+    public void onMessage(Long payOrderId) {
+        //修改订单状态,并计算权益
+        tradeOrderUpdateService.updateOrderPaid(payOrderId);
+    }
+}

+ 1 - 2
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/job/order/PayOrderSyncJob.java

@@ -12,7 +12,6 @@ import java.time.LocalDateTime;
 
 /**
  * 支付订单的同步 Job
- *
  * 由于支付订单的状态,是由支付渠道异步通知进行同步,考虑到异步通知可能会失败(小概率),所以需要定时进行同步。
  *
  * @author 非繁源码
@@ -22,7 +21,6 @@ public class PayOrderSyncJob implements JobHandler {
 
     /**
      * 同步创建时间在 N 分钟之前的订单
-     *
      * 为什么同步 10 分钟之前的订单?
      *  因为一个订单发起支付,到支付成功,大多数在 10 分钟内,需要保证轮询到。
      *  如果设置为 30、60 或者更大时间范围,会导致轮询的订单太多,影响性能。当然,你也可以根据自己的业务情况来处理。
@@ -35,6 +33,7 @@ public class PayOrderSyncJob implements JobHandler {
     @Override
     @TenantJob
     public String execute(String param) {
+        System.out.println("==============================时间" + LocalDateTime.now());
         LocalDateTime minCreateTime = LocalDateTime.now().minus(CREATE_TIME_DURATION_BEFORE);
         int count = orderService.syncOrder(minCreateTime);
         return StrUtil.format("同步支付订单 {} 个", count);

+ 25 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/order/TradeOrderProducer.java

@@ -0,0 +1,25 @@
+package cn.newfeifan.mall.module.pay.order;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+public class TradeOrderProducer {
+    @Resource
+    private ApplicationContext applicationContext;
+
+
+    /**
+     * 发送订单消息
+     *
+     * @param payOrderId 支付订单id
+     */
+    public void sendTradeOrderMessage(Long payOrderId) {
+        applicationContext.publishEvent(payOrderId);
+    }
+
+}

+ 6 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/channel/PayChannelService.java

@@ -101,4 +101,10 @@ public interface PayChannelService {
      */
     PayClient getPayClient(Long id);
 
+    /**
+     * 判断支付渠道是否符合要求
+     * @param channelId 通道ID
+     * @return 是否符合
+     */
+    boolean getChannelById(Long channelId);
 }

+ 11 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/channel/PayChannelServiceImpl.java

@@ -13,6 +13,7 @@ import cn.newfeifan.mall.module.pay.controller.admin.channel.vo.PayChannelUpdate
 import cn.newfeifan.mall.module.pay.convert.channel.PayChannelConvert;
 import cn.newfeifan.mall.module.pay.dal.dataobject.channel.PayChannelDO;
 import cn.newfeifan.mall.module.pay.dal.mysql.channel.PayChannelMapper;
+import cn.newfeifan.mall.module.pay.enums.fuyouorder.FuYouPayOrderTypeEnum;
 import cn.newfeifan.mall.module.pay.framework.pay.core.WalletPayClient;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -205,4 +206,14 @@ public class PayChannelServiceImpl implements PayChannelService {
         return clientCache.getUnchecked(id);
     }
 
+    @Override
+    public boolean getChannelById(Long channelId) {
+        PayChannelDO payChannelDO = payChannelMapper.selectById(channelId);
+
+        if(payChannelDO == null) return false;
+
+        String code = FuYouPayOrderTypeEnum.getCode(payChannelDO.getCode());
+        return code != null;
+    }
+
 }

+ 2 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/fuyouorder/FiYouPayOrderServiceImpl.java

@@ -30,6 +30,7 @@ import cn.newfeifan.mall.module.pay.fuiou.util.MD5;
 import com.alibaba.fastjson.JSON;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -56,6 +57,7 @@ public class FiYouPayOrderServiceImpl implements FuYouPayOrderService {
     private String appid;
 
     @Resource
+    @Lazy
     private PayOrderService payOrderService;
     @Resource
     StringRedisTemplate stringRedisTemplate;

+ 51 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java

@@ -28,11 +28,15 @@ import cn.newfeifan.mall.module.pay.enums.fuyouorder.OrderTypeEnum;
 import cn.newfeifan.mall.module.pay.enums.notify.PayNotifyTypeEnum;
 import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
 import cn.newfeifan.mall.module.pay.framework.pay.config.PayProperties;
+import cn.newfeifan.mall.module.pay.order.TradeOrderProducer;
 import cn.newfeifan.mall.module.pay.service.app.PayAppService;
 import cn.newfeifan.mall.module.pay.service.channel.PayChannelService;
+import cn.newfeifan.mall.module.pay.service.fuyouorder.FuYouPayOrderService;
 import cn.newfeifan.mall.module.pay.service.notify.PayNotifyService;
+import cn.newfeifan.mall.module.pay.topupconsumptionpoints.TopUpConsumptionPointsProducer;
 import com.google.common.annotations.VisibleForTesting;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -64,6 +68,13 @@ public class PayOrderServiceImpl implements PayOrderService {
     @Resource
     private PayOrderMapper orderMapper;
     @Resource
+    @Lazy
+    private FuYouPayOrderService fuYouPayOrderService;
+    @Resource
+    private TradeOrderProducer tradeOrderProducer;
+    @Resource
+    private TopUpConsumptionPointsProducer topUpConsumptionPointsProducer;
+    @Resource
     private PayOrderExtensionMapper orderExtensionMapper;
     @Resource
     private PayNoRedisDAO noRedisDAO;
@@ -421,6 +432,19 @@ public class PayOrderServiceImpl implements PayOrderService {
         if (updateCounts == 0) { // 校验状态,必须是待支付
             throw exception(PAY_ORDER_STATUS_IS_NOT_WAITING);
         }
+
+        PayOrderDO payOrderDO = orderMapper.selectById(order.getId());
+        System.out.println(payOrderDO.getStatus());
+
+        // 判断是商品订单还是充值订单
+        if (payOrderDO.getNo().contains(DictTypeConstants.TUP_UP_NO)) {
+            // 充值消费分订单
+            topUpConsumptionPointsProducer.sendTradeOrderMessage(payOrderDO);
+        } else {
+            //如果确实是漏了订单未支付成功,那就补充回来
+            tradeOrderProducer.sendTradeOrderMessage(order.getId());
+        }
+
         log.info("[updateOrderExtensionSuccess][order({}) 更新为已支付]", order.getId());
         return false;
     }
@@ -533,6 +557,28 @@ public class PayOrderServiceImpl implements PayOrderService {
      */
     public boolean syncOrder(PayOrderExtensionDO orderExtension) {
         try {
+
+            // 如果是对接富友的支付单,则查询富友的订单状态
+            if (channelService.getChannelById(orderExtension.getChannelId())) {
+                PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId());
+
+                // 查询状态,修改支付订单状态
+                PayOrderDO payOrder = fuYouPayOrderService.getPayOrderByStatus(order);
+
+                // 支付单状态发生变化才更新
+                if (payOrder != null && !payOrder.getStatus().equals(order.getStatus()) && payOrder.getStatus().equals(PayOrderStatusEnum.SUCCESS.getStatus())) {
+                    // 判断是商品订单还是充值订单
+                    if (payOrder.getPayOrderNo().contains(DictTypeConstants.TUP_UP_NO)) {
+                        // 充值消费分订单
+                        topUpConsumptionPointsProducer.sendTradeOrderMessage(payOrder);
+                    } else {
+                        // 修改订单状态
+                        tradeOrderProducer.sendTradeOrderMessage(order.getId());
+                    }
+                }
+                return true;
+            }
+
             // 1.1 查询支付订单信息
             PayClient payClient = channelService.getPayClient(orderExtension.getChannelId());
             if (payClient == null) {
@@ -589,6 +635,11 @@ public class PayOrderServiceImpl implements PayOrderService {
                 if (PayOrderStatusEnum.isClosed(orderExtension.getStatus())) {
                     continue;
                 }
+
+                if (channelService.getChannelById(orderExtension.getChannelId())) {
+                    return false;
+                }
+
                 // 情况一:校验数据库中的 orderExtension 是不是已支付
                 if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) {
                     log.error("[expireOrder][order({}) 的 extension({}) 已支付,可能是数据不一致]",

+ 25 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/topupconsumptionpoints/TopUpConsumptionPointsProducer.java

@@ -0,0 +1,25 @@
+package cn.newfeifan.mall.module.pay.topupconsumptionpoints;
+
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+public class TopUpConsumptionPointsProducer {
+
+    @Resource
+    private ApplicationContext applicationContext;
+
+    /**
+     * 发送订单消息
+     *
+     * @param payOrder 支付订单
+     */
+    public void sendTradeOrderMessage(PayOrderDO payOrder) {
+        applicationContext.publishEvent(payOrder);
+    }
+}