Explorar o código

Merge remote-tracking branch 'origin/dev-定时处理超时订单' into dev-rht-pay

# Conflicts:
#	src/main/java/com/sqx/modules/order/dao/AppOrderDao.java
#	src/main/java/com/sqx/modules/order/service/AppOrderService.java
#	src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java
#	src/main/resources/mapper/order/OrderMapper.xml
codingliang hai 1 ano
pai
achega
b131d64071

+ 2 - 0
src/main/java/com/sqx/modules/order/dao/AppOrderDao.java

@@ -104,4 +104,6 @@ public interface AppOrderDao extends BaseMapper<TbOrder> {
     IPage<TbOrder> selectOrderPage(Page<TbOrder> pages,@Param("userId") Long userId,@Param("orderId") Integer orderId);
 
     BigDecimal selectAllOrderTotalPrice(@Param("query") OrderQueryDto queryDto);
+
+    List<TbOrder> changeTimeOutOrder(@Param("time") long time);
 }

+ 4 - 0
src/main/java/com/sqx/modules/order/entity/TbOrder.java

@@ -294,4 +294,8 @@ public class TbOrder implements Serializable {
     private String couponTypeRemark;
 
     public TbOrder() {}
+
+    @ApiModelProperty("pay_details 状态")
+    @TableField(exist = false)
+    private Integer state;
 }

+ 2 - 0
src/main/java/com/sqx/modules/order/service/AppOrderService.java

@@ -184,4 +184,6 @@ public interface AppOrderService extends IService<TbOrder> {
 
     Result selectAllOrderTotalPrice(OrderQueryDto queryDto);
 
+
+    List<TbOrder> changeTimeOutOrder(long time);
 }

+ 5 - 0
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -2697,6 +2697,11 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return Result.success().put("data", totalPrice);
     }
 
+    @Override
+    public List<TbOrder> changeTimeOutOrder(long time) {
+        return appOrderDao.changeTimeOutOrder(time);
+    }
+
     /**
      * 更新订单状态和支付顺序
      * @param order 订单信息

+ 61 - 17
src/main/java/com/sqx/scheduler/order/OrderScheduler.java

@@ -3,10 +3,17 @@ package com.sqx.scheduler.order;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.ekyong.www.pay.pay.qrcode.api.RhtQrcodePayApi;
+import com.ekyong.www.pay.pay.qrcode.bean.QrcodeQueryRequestBean;
+import com.ekyong.www.pay.pay.qrcode.bean.QrcodeQueryResponseBean;
+import com.github.wxpay.sdk.WXPay;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.service.AppOrderService;
+import com.sqx.modules.pay.config.WXConfig;
+import com.sqx.modules.pay.config.WechatPayConfig;
 import com.sqx.scheduler.config.SchedulerLock;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -18,10 +25,7 @@ import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -39,6 +43,8 @@ public class OrderScheduler {
     private final AppOrderService orderService;
     private final CommonInfoService commonInfoService;
 
+    private final static String RHT_PAY_BASE_URL = "https://api.ekbuyclub.com";
+
     /**
      * 预约订单自动接单
      * 5分钟运行一次
@@ -175,31 +181,69 @@ public class OrderScheduler {
         lock.lock();
         try {
             log.info("超时订单自动取消任务开始运行");
-            LambdaQueryWrapper<TbOrder> wrapper=new LambdaQueryWrapper<>();
-            wrapper.eq(TbOrder::getStatus,0);
-            wrapper.isNotNull(TbOrder::getTimeOut);
+            long time = new Date().getTime();
+            List<TbOrder> orderList = orderService.changeTimeOutOrder(time);
 
-            List<TbOrder> orderList = orderService.list(wrapper);
-            if (CollUtil.isEmpty(orderList)) {
+            if (orderList.size() == 0) {
                 log.info("没有符合条件的超时订单,超时订单自动取消任务运行....");
                 return;
             }
 
-            long time = new Date().getTime();
+            WXConfig config = new WXConfig();
+//            当前都是小程序支付
+            config.setAppId(commonInfoService.findOne(74).getValue());
+            //微信商户key
+            config.setKey(commonInfoService.findOne(250).getValue());
+            //微信商户号mchId
+            config.setMchId(commonInfoService.findOne(251).getValue());
+            WXPay wxpay = new WXPay(config);
+
+            WechatPayConfig wechatMchConfig = WechatPayConfig.builder()
+                    .appId(commonInfoService.findOne(45).getValue())
+                    .mchId(commonInfoService.findOne(434).getValue())
+                    .mchKey(commonInfoService.findOne(435).getValue())
+                    .h5Url(commonInfoService.findOne(19).getValue())
+                    .build();
+
+            RhtQrcodePayApi qrcodePay = new RhtQrcodePayApi(wechatMchConfig.getMchId(), wechatMchConfig.getMchKey(), RHT_PAY_BASE_URL);
+
+
             ArrayList<TbOrder> orders = new ArrayList<>();
             for (TbOrder tbOrder : orderList) {
-                Long timeOut = tbOrder.getTimeOut();
-                if (time > timeOut) {
+                Integer state = tbOrder.getState();
+                if (0 == state) {
+//                    状态为待支付需要调用支付系统订单查询接口判断支付系统对应的订单状态
+                    Map<String, String> data = new HashMap<>();
+                    String orderNumber = tbOrder.getOrderNumber();
+                    //商户订单号
+                    data.put("out_trade_no", orderNumber);
+                    Map<String, String> response = wxpay.orderQuery(data);
+                    String trade_state = response.get("trade_state");
+                    //SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(刷卡支付),USERPAYING--用户支付中,PAYERROR--支付失败(其他原因,如银行返回失败)
+                    if (ObjectUtils.isNotEmpty(trade_state)) {
+                        if ("NOTPAY".equals(trade_state)) {
+                            tbOrder.setStatus(5);
+                            orders.add(tbOrder);
+                        }
+                    }else {
+                        QrcodeQueryRequestBean qqrb = new QrcodeQueryRequestBean();
+                        qqrb.setTraceno(orderNumber);// 商户流水号
+                        QrcodeQueryResponseBean response2 = qrcodePay.query(qqrb);
+                        String respCode = response2.getRespCode();
+//                        0未支付,1支付成功,2支付失败,4退款中,5退款成功,6退款失败
+                        if ("0".equals(respCode)) {
+                            tbOrder.setStatus(5);
+                            orders.add(tbOrder);
+                        }
+
+                    }
+
+                } else {
                     tbOrder.setStatus(5);
                     orders.add(tbOrder);
                 }
             }
 
-            if (CollUtil.isEmpty(orders)) {
-                log.info("没有符合条件的超时订单,超时订单自动取消任务运行....");
-                return;
-            }
-
             orderService.updateBatchById(orders);
 
             log.info("超时订单自动取消运行成功");

+ 10 - 0
src/main/resources/mapper/order/OrderMapper.xml

@@ -692,5 +692,15 @@
         </if>
         order by tor.pay_time desc, tor.create_time desc
     </select>
+    <select id="changeTimeOutOrder" resultType="com.sqx.modules.order.entity.TbOrder">
+        SELECT o.*,
+               pd.state as state
+        FROM `tb_order` o
+                 LEFT JOIN pay_details pd ON o.order_number = pd.order_id
+        WHERE o.`status` = 0
+          AND o.time_out IS NOT NULL
+          AND #{time} >= o.time_out
+          AND pd.state in (0, 2)
+    </select>
 
 </mapper>