Explorar el Código

fix:订单锁

liujunchi hace 3 años
padre
commit
722eaf9d39
Se han modificado 24 ficheros con 177 adiciones y 45 borrados
  1. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  2. 1 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java
  3. 1 1
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java
  4. 2 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java
  5. 11 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefund.java
  6. 1 1
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  7. 25 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml
  8. 17 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java
  9. 18 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  10. 28 9
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  11. 2 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  12. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/HomeServiceImpl.java
  13. 58 9
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  14. 2 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  15. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java
  16. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  17. 0 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  18. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  19. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  20. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  21. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java
  22. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java
  23. 1 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java
  24. 1 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

+ 1 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -147,7 +147,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             userOrderRefund.setPayTransNo(userOrderPayment.getTransNo());
             userOrderRefund.setRefundAmt(refundBill.getRefundAmt());
             userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
-
+            userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
             userOrderRefundMapper.insert(userOrderRefund);
         } else {
             throw new BizException(refundBillBaseResult.getMsg());

+ 1 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java

@@ -16,6 +16,7 @@ public enum OrderCacheEnum {
     LOCK_PAY_ORDER("用户付款锁"),
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
     LOCK_REFUND_ORDER_MALL("商城退款锁"),
+    LOCK_ORDER_NO_MALL("订单号锁"),
 
     ;
     /***

+ 1 - 1
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java

@@ -11,7 +11,7 @@ public interface UserOrderPaymentMapper {
     int insert(UserOrderPayment record);
 
 
-    UserOrderPayment selectByTranNo(String orderNo);
+    UserOrderPayment selectByTranNo(String transNo);
 
     int updateByPrimaryKeySelective(UserOrderPayment userOrderPayment);
 

+ 2 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java

@@ -40,4 +40,6 @@ public interface UserOrderRefundMapper {
     UserOrderRefund selectByTransNo(@Param("transNo") String transNo);
 
     UserOrderRefund selectByRefundNo(@Param("refundOrderNo") String refundOrderNo);
+
+    UserOrderRefund selectByPayOrderNo( @Param("payOrderNo") String payOrderNo);
 }

+ 11 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefund.java

@@ -40,6 +40,9 @@ public class UserOrderRefund {
     @ApiModelProperty(value = "支付流水号")
     private String payTransNo;
 
+    @ApiModelProperty("支付订单号")
+    private String payOrderNo;
+
     /**
      * 交易金额,必须大于0,保留两位小数点,如0.10、100.05等
      */
@@ -76,6 +79,14 @@ public class UserOrderRefund {
     @ApiModelProperty(value = "")
     private Date updateTime;
 
+    public String getPayOrderNo() {
+        return payOrderNo;
+    }
+
+    public void setPayOrderNo(String payOrderNo) {
+        this.payOrderNo = payOrderNo;
+    }
+
     public Long getReturnId() {
         return returnId;
     }

+ 1 - 1
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -246,7 +246,7 @@
     <select id="selectByTranNo" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
-      from user_order_payment where trans_no_ = #{orderNo} order by id_ desc limit 1
+      from user_order_payment where trans_no_ = #{transNo} order by id_ desc limit 1
     </select>
 
     <select id="selectByOrderNo" resultMap="BaseResultMap">

+ 25 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -9,6 +9,7 @@
     <result column="order_no_" jdbcType="VARCHAR" property="orderNo" />
     <result column="trans_no_" jdbcType="VARCHAR" property="transNo" />
     <result column="pay_trans_no_" jdbcType="VARCHAR" property="payTransNo" />
+    <result column="pay_order_no_" jdbcType="VARCHAR" property="payOrderNo" />
     <result column="refund_amt_" jdbcType="DECIMAL" property="refundAmt" />
     <result column="fee_amt_" jdbcType="DECIMAL" property="feeAmt" />
     <result column="status_" jdbcType="VARCHAR" property="status" />
@@ -80,7 +81,7 @@
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id_, order_no_, trans_no_, pay_trans_no_, refund_amt_, fee_amt_, status_, pay_fail_msg_, 
-    arrival_time_, create_time_, update_time_,return_id_
+    arrival_time_, create_time_, update_time_,return_id_,pay_order_no_
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefundExample" resultMap="BaseResultMap">
     <!--@mbg.generated-->
@@ -121,11 +122,11 @@
     insert into user_order_refund (order_no_, trans_no_, pay_trans_no_, 
       refund_amt_, fee_amt_, status_, 
       pay_fail_msg_, arrival_time_, create_time_, 
-      update_time_,return_id_)
+      update_time_,return_id_,pay_order_no_)
     values (#{orderNo,jdbcType=VARCHAR}, #{transNo,jdbcType=VARCHAR}, #{payTransNo,jdbcType=VARCHAR}, 
       #{refundAmt,jdbcType=DECIMAL}, #{feeAmt,jdbcType=DECIMAL}, #{status,jdbcType=VARCHAR}, 
       #{payFailMsg,jdbcType=VARCHAR}, #{arrivalTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP}, 
-      #{updateTime,jdbcType=TIMESTAMP},#{returnId})
+      #{updateTime,jdbcType=TIMESTAMP},#{returnId},#{payOrderNo})
   </insert>
   <insert id="insertSelective" keyColumn="id_" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefund" useGeneratedKeys="true">
     <!--@mbg.generated-->
@@ -164,6 +165,9 @@
       <if test="returnId != null">
         return_id_,
       </if>
+      <if test="payOrderNo != null">
+        pay_order_no_,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="orderNo != null">
@@ -199,6 +203,9 @@
       <if test="returnId != null">
         #{returnId},
       </if>
+      <if test="payOrderNo != null">
+        #{payOrderNo},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefundExample" resultType="java.lang.Long">
@@ -248,6 +255,9 @@
       <if test="record.returnId != null">
         return_id_ = #{record.returnId,jdbcType=BIGINT},
       </if>
+      <if test="record.payOrderNo != null">
+        pay_order_no_ = #{record.payOrderNo,jdbcType=BIGINT},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -267,6 +277,7 @@
       arrival_time_ = #{record.arrivalTime,jdbcType=TIMESTAMP},
       create_time_ = #{record.createTime,jdbcType=TIMESTAMP},
       return_id_ = #{record.returnId,jdbcType=BIGINT},
+      pay_order_no_ = #{record.payOrderNo},
       update_time_ = #{record.updateTime,jdbcType=TIMESTAMP}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -309,6 +320,9 @@
       <if test="returnId != null">
         return_id_ = #{returnId,jdbcType=BIGINT},
       </if>
+      <if test="payOrderNo != null">
+        pay_order_no_ = #{payOrderNo},
+      </if>
     </set>
     where id_ = #{id,jdbcType=BIGINT}
   </update>
@@ -325,6 +339,7 @@
       arrival_time_ = #{arrivalTime,jdbcType=TIMESTAMP},
       create_time_ = #{createTime,jdbcType=TIMESTAMP},
       return_id_ = #{returnId,jdbcType=BIGINT},
+      pay_order_no_ = #{payOrderNo},
       update_time_ = #{updateTime,jdbcType=TIMESTAMP}
     where id_ = #{id,jdbcType=BIGINT}
   </update>
@@ -342,4 +357,11 @@
     from user_order_refund
     where #{refundOrderNo} = order_no_ limit 1
     </select>
+
+  <select id="selectByPayOrderNo" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    where #{payOrderNo} = pay_order_no_   and status_ = 'succeeded'
+  </select>
 </mapper>

+ 17 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.portal.component;
 
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.amqp.rabbit.annotation.RabbitHandler;
@@ -9,6 +13,8 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.concurrent.TimeUnit;
+
 /**
  * 取消订单消息的消费者
  * Created by macro on 2018/9/14.
@@ -19,10 +25,20 @@ public class CancelOrderReceiver {
     private static Logger logger =LoggerFactory.getLogger(CancelOrderReceiver.class);
     @Autowired
     private OmsPortalOrderService portalOrderService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
     @RabbitHandler
     public void handle(Long orderId){
         try {
-            portalOrderService.cancelOrder(orderId, "超时取消", null);
+            OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                                   , () -> {
+                                       portalOrderService.cancelOrder(orderId, "超时取消", null);
+                                   }, 60L, TimeUnit.SECONDS);
 
         } catch (BizException e) {
             e.printStackTrace();

+ 18 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -2,15 +2,18 @@ package com.yonge.cooleshow.portal.controller;
 
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.util.CollectionUtils;
@@ -18,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 订单管理Controller
@@ -30,6 +34,10 @@ public class OmsPortalOrderController {
     @Autowired
     private OmsPortalOrderService portalOrderService;
 
+
+    @Autowired
+    private RedissonClient redissonClient;
+
     @ApiOperation("根据购物车信息生成确认单")
     @RequestMapping(value = "/generateConfirmOrder", method = RequestMethod.POST)
     @ResponseBody
@@ -118,7 +126,16 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/cancelUserOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult cancelUserOrder(Long orderId) {
-        portalOrderService.cancelOrder(orderId, "用户取消订单", null);
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> {
+                                   portalOrderService.cancelOrder(orderId, "用户取消订单", null);
+                               }, 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
 

+ 28 - 9
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -78,7 +78,7 @@ public class PaymentController extends BaseController {
         payReq.setUserId(user.getId());
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 
-        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_PAY_ORDER.getRedisKey(user.getId()));
+        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(payReq.getOrderNo()));
         try {
             boolean b = lock.tryLock(60, TimeUnit.SECONDS);
             if (b) {
@@ -112,7 +112,7 @@ public class PaymentController extends BaseController {
         Payment param = new Payment(OpenEnum.valueOf(userOrderPayment.getOpenType()),
                 PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
         param.setId(userOrderPayment.getTransNo());
-        param.setPaymentNo(userOrderPayment.getTransNo());
+        param.setPaymentNo(userOrderPayment.getAdapayNo());
         BaseResult<Payment> paymentBaseResult = paymentClient.queryPayment(param);
         return HttpResponseResult.status(paymentBaseResult);
     }
@@ -151,13 +151,32 @@ public class PaymentController extends BaseController {
         if (res.getStatus()) {
             PaymentCallBack data = res.getData();
 
-            if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
-                //支付交易
-                orderService.executePaymentCallBack(data);
-            } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
-                //关闭订单
-                orderService.closePaymentCallBack(data);
-            } else if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
+            UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
+            if (userOrderPayment != null) {
+                RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(userOrderPayment.getOrderNo()));
+                try {
+                    boolean b = lock.tryLock(60, TimeUnit.SECONDS);
+                    if (b) {
+                        if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
+                            //支付交易
+                            orderService.executePaymentCallBack(data);
+                        } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
+                            //关闭订单
+                            orderService.closePaymentCallBack(data);
+                        }
+                    } else {
+                        return failed("请求超时");
+                    }
+                }catch (Exception e) {
+                    e.printStackTrace();
+                    return HttpResponseResult.failed("付款失败");
+                } finally {
+                    if (lock.getHoldCount()>0) {
+                        lock.unlock();
+                    }
+                }
+            }
+            if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
                 //退款
                 portalOrderReturnApplyService.refundPaymentCallBack(data);
             }

+ 2 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java

@@ -19,10 +19,10 @@ public interface UserOrderPaymentService {
     /**
      *  根据订单查询
      *
-     * @param orderNo 订单id
+     * @param paymentId 交易流水号
      * @return
      */
-    UserOrderPayment getByTranNo(String orderNo);
+    UserOrderPayment getByTranNo(String paymentId);
 
     /**
      * 保存订单记录

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/HomeServiceImpl.java

@@ -96,7 +96,7 @@ public class HomeServiceImpl implements HomeService {
         if (currentMember == null) {
             throw new BizException("请重新登录");
         }
-        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(currentMember.getId());
+        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(currentMember.getId()).andHiddenEqualTo(0);
         return cartItemMapper.countByExample(example);
     }
 

+ 58 - 9
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mall.common.exception.Asserts;
 import com.yonge.cooleshow.mall.common.service.RedisService;
 import com.yonge.cooleshow.mbg.mapper.*;
@@ -24,13 +25,12 @@ import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
-import com.yonge.toolset.payment.base.model.DeviceInfo;
-import com.yonge.toolset.payment.base.model.DivMember;
-import com.yonge.toolset.payment.base.model.OrderDetil;
-import com.yonge.toolset.payment.base.model.Payment;
+import com.yonge.toolset.payment.base.model.*;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,6 +42,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -96,6 +97,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Autowired
     private PmsProductMapper pmsProductMapper;
 
+    @Autowired
+    private UserOrderRefundMapper userOrderRefundMapper;
+
+    @Autowired
+    private RedissonClient redissonClient;
 
     @Autowired
     private PortalProductDao productDao;
@@ -347,11 +353,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         for (OmsOrderDetail timeOutOrder : timeOutOrders) {
 
-            if (timeOutOrder.getStatus() == 0) {
-                payingOrderHandle(timeOutOrder);
-            } else if (timeOutOrder.getStatus() == 6) {
-                cancelOrder(timeOutOrder.getId(), "超时取消", null);
-            }
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(timeOutOrder.getOrderSn())
+                                   , () -> {
+                                       if (timeOutOrder.getStatus() == 0) {
+                                           payingOrderHandle(timeOutOrder);
+                                       } else if (timeOutOrder.getStatus() == 6) {
+                                           cancelOrder(timeOutOrder.getId(), "超时取消", null);
+                                       }
+                                   }, 60L, TimeUnit.SECONDS);
+
         }
         return timeOutOrders.size();
     }
@@ -687,9 +698,47 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderSuccess(detail, data, data.getId());
         } else {
             LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
+            LOG.warn("支付金额原路退回 {}", detail.getOrderSn());
+            orderRefund(userOrderPayment,data,detail);
         }
     }
 
+    /**
+     * 支付成功,业务退款
+     */
+    private void orderRefund(UserOrderPayment userOrderPayment,PaymentCallBack data,OmsOrder order) {
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getOrderNo());
+        if (userOrderRefund.getStatus().equals("succeeded")) {
+            LOG.warn("支付金额已退回退回");
+            return;
+        }
+
+        String orderSn = generateOrderSn(order);
+
+        RefundBill refundReq = new RefundBill(OpenEnum.valueOf(userOrderPayment.getOpenType()), PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
+        refundReq.setRefundNo(orderSn);
+        refundReq.setRefundAmt(new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
+
+        refundReq.setReason("支付超时,全额退回");
+        refundReq.setPaymentNo(userOrderPayment.getAdapayNo());
+        refundReq.setTradeNo(userOrderPayment.getTransNo());
+        refundReq.setOrderAmt(userOrderPayment.getPayAmt());
+        BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundReq);
+        userOrderRefund = new UserOrderRefund();
+        userOrderRefund.setOrderNo(orderSn);
+        userOrderRefund.setPayTransNo(userOrderPayment.getTransNo());
+        userOrderRefund.setRefundAmt(userOrderPayment.getPayAmt());
+        userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
+        if (refundBillBaseResult.getStatus()) {
+            RefundBill refundBill = refundBillBaseResult.getData();
+            userOrderRefund.setRefundAmt(refundBill.getRefundAmt());
+            userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
+        } else {
+            userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+            userOrderRefund.setPayFailMsg("退款失败:" + refundBillBaseResult.getMsg());
+        }
+        userOrderRefundMapper.insert(userOrderRefund);
+    }
     /***
      * 处理回调-支付失败
      * @author liweifan

+ 2 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java

@@ -34,8 +34,8 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
     private PaymentClient paymentClient;
 
     @Override
-    public UserOrderPayment getByTranNo(String orderNo) {
-        return userOrderPaymentMapper.selectByTranNo(orderNo);
+    public UserOrderPayment getByTranNo(String transNo) {
+        return userOrderPaymentMapper.selectByTranNo(transNo);
     }
 
     @Override

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java

@@ -8,7 +8,7 @@ import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -22,7 +22,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;

+ 0 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -4,22 +4,18 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.util.StringUtil;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.enums.*;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java

@@ -11,7 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -10,7 +10,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java

@@ -7,7 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.controller.BaseController;

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java

@@ -9,7 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;

+ 1 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

@@ -5,9 +5,8 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
-import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/DistributedLock.java → toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

@@ -1,4 +1,4 @@
-package com.yonge.cooleshow.biz.dal.support;
+package com.yonge.toolset.payment.util;
 
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;