瀏覽代碼

Merge remote-tracking branch 'origin/master'

hgw 3 年之前
父節點
當前提交
9a7ee92fcf
共有 34 個文件被更改,包括 309 次插入78 次删除
  1. 4 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-resource/pom.xml
  16. 1 2
      cooleshow-resource/src/main/java/com/yonge/cooleshow/resource/ResourceApplication.java
  17. 3 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java
  18. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  19. 27 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  20. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java
  21. 0 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  22. 11 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  23. 48 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  24. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  25. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  26. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/HomeMapper.xml
  27. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherStyleVideoMapper.xml
  28. 22 9
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  29. 2 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  30. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java
  31. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java
  32. 1 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java
  33. 1 0
      pom.xml
  34. 1 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

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

@@ -77,6 +77,9 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
     public int updateStatus(Long id, OmsUpdateStatusParam statusParam) {
         Integer status = statusParam.getStatus();
         OmsOrderReturnApply omsOrderReturnApply = returnApplyMapper.selectByPrimaryKey(id);
+        if (omsOrderReturnApply == null) {
+            throw new BizException("退货订单不存在或被撤销");
+        }
         if (omsOrderReturnApply.getProductPrice().compareTo(statusParam.getReturnAmount()) <0) {
             throw new BizException("退款金额不能大于商品金额");
         }
@@ -147,7 +150,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 != null && 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-resource/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>cooleshow-bbs</artifactId>
+    <artifactId>cooleshow-resource</artifactId>
     <version>1.0</version>
 
     <properties>

+ 1 - 2
cooleshow-resource/src/main/java/com/yonge/cooleshow/resource/ResourceApplication.java

@@ -1,10 +1,9 @@
-package com.yonge.cooleshow.bbs;
+package com.yonge.cooleshow.resource;
 
 import com.spring4all.swagger.EnableSwagger2Doc;
 import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.toolset.base.BaseApplication;
 import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;

+ 3 - 2
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;
@@ -80,6 +80,7 @@ public class UserOrderClient extends BaseController {
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
     ) {
+        //支付回调:openType is ORIGINAL ,paymentClient is STUDENT,payChannel is ali_app,payMethod is executePayment
         log.info("支付回调:openType is {} ,paymentClient is {},payChannel is {},payMethod is {}", openType, client, payChannel, payMethod);
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
                 OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
@@ -95,7 +96,7 @@ public class UserOrderClient extends BaseController {
             }
             try {
                 DistributedLock.of(redissonClient)
-                        .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(userOrderVo.getUserId())
+                        .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(userOrderVo.getOrderNo())
                                 , () -> {
                                     if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
                                         //支付交易

+ 9 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -56,7 +56,7 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
     HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user);
 
 	/**
-	 * 系統自動退款
+	 * 系統自動退款(退已完成的订单)
 	 * @param orderNo
 	 * @param reason
 	 * @return
@@ -64,6 +64,14 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	HttpResponseResult<UserOrderRefundBill> orderRefund(String orderNo, String reason);
 
 	/**
+	 * 交易失败退款(退已完成的订单)
+	 * @param data
+	 * @param reason
+	 * @return
+	 */
+	HttpResponseResult<UserOrderRefundBill> orderFailRefund(PaymentCallBack data, String orderNo, String reason);
+
+	/**
 	 * 退款回调
 	 * @param data
 	 */

+ 27 - 3
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.*;
@@ -805,6 +805,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
         //直播结束后,XX分钟关闭房间
         sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
+        //提前XX分钟创建/进入琴房课房间时间
+        sysConfig.put("pianoStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PIANO_ROOM_MINUTE));
+        //琴房课结束后,XX分钟关闭房间
+        sysConfig.put("pianoEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PIANO_ROOM_MINUTE));
 
         Map map = new HashMap();
         map.put("sysConfig", sysConfig);
@@ -848,6 +852,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
         //直播结束后,XX分钟关闭房间
         sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
+        //提前XX分钟创建/进入琴房课房间时间
+        sysConfig.put("pianoStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PIANO_ROOM_MINUTE));
+        //琴房课结束后,XX分钟关闭房间
+        sysConfig.put("pianoEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PIANO_ROOM_MINUTE));
 
         Map map = new HashMap();
         map.put("sysConfig", sysConfig);
@@ -1451,6 +1459,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
         //直播结束后,XX分钟关闭房间
         sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
+        //提前XX分钟创建/进入琴房课房间时间
+        sysConfig.put("pianoStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PIANO_ROOM_MINUTE));
+        //琴房课结束后,XX分钟关闭房间
+        sysConfig.put("pianoEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PIANO_ROOM_MINUTE));
         return sysConfig;
     }
 
@@ -1646,6 +1658,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                         .map(s -> {
                             Integer studentCount = s.getStudentCount();
                             Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentCount + 1));
+                            if (n == null) {
+                                throw new BizException("公式转换失败");
+                            }
                             s.setConsumTime(s.getSingleCourseTime() * n);
                             return s;
                         })
@@ -1699,7 +1714,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String day = DateUtil.getDayAgoOrAftString(-settlementDay);
 
         List<UserAccountRecordDto> list = baseMapper.selectWaitCourse(day);
-        if (CollectionUtils.isNotEmpty(list)){
+        if (CollectionUtils.isNotEmpty(list)) {
             for (UserAccountRecordDto dto : list) {
                 userAccountService.accountChange(dto);
             }
@@ -1708,7 +1723,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
                     .set(CourseScheduleTeacherSalary::getStatus, TeacherSalaryEnum.COMPLETE.getCode())
                     .set(CourseScheduleTeacherSalary::getSettlementTime, new Date())
-                    .in(CourseScheduleTeacherSalary::getCourseScheduleId,bizIds));
+                    .in(CourseScheduleTeacherSalary::getCourseScheduleId, bizIds));
         }
 
     }
@@ -1763,6 +1778,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
         Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//人数计算 公式n*(n-1) n包含老师
+        if (n == null) {
+            throw new BizException("公式转换失败");
+        }
         Integer consumTime = classNum * singleClssTime * n;//消耗时长 课程数*单课时长*人数
 
         List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
@@ -1994,6 +2012,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
         Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentPaymentList.size() + 1));//人数计算 公式n*(n-1) n包含老师
+        if (n == null) {
+            throw new BizException("公式转换失败");
+        }
         Integer time = schedule.getSingleCourseTime() * n;//消耗时长 课程数*单课时长*人数
 
         PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
@@ -2152,6 +2173,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
         Integer after = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//变更后
         Integer before = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(paymentList.size() + 1));//变更前
+        if (after == null || before == null) {
+            throw new BizException("公式转换失败");
+        }
         int diffTime = singleCourseTime * (after - before);//人数变更后单课耗时
         if (remainTime - diffTime < 0) {
             throw new BizException("剩余时长不足");

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

@@ -40,6 +40,7 @@ public class HomeServiceImpl implements HomeService {
         userToDoNum.setMusicianNum(null == userToDoNum.getMusicianNum() ? 0 : userToDoNum.getMusicianNum());
         userToDoNum.setMusicNum(null == userToDoNum.getMusicNum() ? 0 : userToDoNum.getMusicNum());
         userToDoNum.setVideoCourseNum(null == userToDoNum.getVideoCourseNum() ? 0 : userToDoNum.getVideoCourseNum());
+        userToDoNum.setStyleNum(null == userToDoNum.getStyleNum()? 0 : userToDoNum.getStyleNum());
         return userToDoNum;
     }
 

+ 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;

+ 11 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java

@@ -7,9 +7,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
-import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
-import com.yonge.cooleshow.biz.dal.service.SysUserService;
-import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
@@ -34,7 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderPaymentDao;
-import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -62,6 +59,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     private SysUserContractRecordService sysUserContractRecordService;
     @Autowired
     private SysUserService userService;
+    @Autowired
+    private UserOrderRefundService orderRefundService;
 
     @Override
     public UserOrderPayment detailByOrderNo(String orderNo, PayChannelEnum payChannel, TradeStatusEnum status) {
@@ -127,11 +126,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
             }
         }
         updateById(orderPayment);
-        if (TradeStatusEnum.succeeded.equals(orderPayment.getCloseStatus())) {
-            return true;
-        } else {
-            return false;
-        }
+        return true;
     }
 
 
@@ -222,6 +217,9 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
             } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败
                 paymentCloseFailedHandle(data);
             }
+        }else if (!userOrderVo.getStatus().equals(OrderStatusEnum.PAID)) {
+            //原路退还
+            orderRefundService.orderFailRefund(data, userOrderVo.getOrderNo(), "订单已超时,金额原路退回");
         }
     }
 
@@ -273,6 +271,9 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         }
         if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY) || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
             userOrderService.orderSuccess(detail, data);
+        } else if (!detail.getStatus().equals(OrderStatusEnum.PAID)) {
+            //原路退还
+            orderRefundService.orderFailRefund(data, detail.getOrderNo(), "订单已超时,金额原路退回");
         }
 
         //处理支付完成签署协议
@@ -309,7 +310,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY) || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
             userOrderService.doOrderCancel(detail, OrderStatusEnum.FAIL, "支付回调失败:" + errMsg);
             //关闭付款单
-            onlyClosePayment(detail.getOrderNo(), "支付回调失败:" + errMsg);
+            closePaymentAndReqOpen(detail.getOrderNo(), "支付回调失败:" + errMsg);
         }
     }
 

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

@@ -290,6 +290,54 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         return doOrderRefund(orderRefunds);
     }
 
+    @Override
+    public HttpResponseResult<UserOrderRefundBill> orderFailRefund(PaymentCallBack data, String orderNo, String reason) {
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+        if (null == orderPayment) {
+            return HttpResponseResult.failed("未找到付款单");
+        }
+        //订单完成
+        UserOrderVo detail = orderService.detail(orderPayment.getOrderNo(), null);
+        if (null == detail) {
+            return HttpResponseResult.failed("未找到订单");
+        }
+        //退款的详情id
+        List<Long> detilIds = new ArrayList<>();
+
+        OrderRefundReq orderRefundReq = new OrderRefundReq();
+        orderRefundReq.setOrderId(detail.getId());
+        orderRefundReq.setUserId(detail.getUserId());
+        orderRefundReq.setReason(reason);
+        //退款金额
+        BigDecimal actualPrice = BigDecimal.ZERO;
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            detilIds.add(vo.getId());
+            actualPrice = actualPrice.add(vo.getActualPrice());
+        }
+        String join = StringUtil.join(detilIds, ",");
+
+        UserOrderRefund orderRefunds = new UserOrderRefund();
+        orderRefunds.setUserId(detail.getUserId());
+        orderRefunds.setOrderId(detail.getId());
+        orderRefunds.setOrderNo(detail.getOrderNo());
+        orderRefunds.setOredrDetilIds(join);
+        orderRefunds.setStatus(AuthStatusEnum.PASS);
+        orderRefunds.setApplyAmount(actualPrice);
+        orderRefunds.setReason(reason);
+        save(orderRefunds);
+
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            List<Long> collect = orderRefundReq.getOredrDetilIds().stream().filter(o -> o.equals(vo.getId())).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(collect)) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundAfter.get(vo.getGoodType());
+                if (!Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
+        }
+        return doOrderRefund(orderRefunds);
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)

+ 4 - 4
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;
@@ -352,18 +352,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         for (UserOrderVo orderVo : waitPayOrderList) {
             //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
             boolean b = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getOrderNo())
                             , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
         }
 
         search.setStatus(OrderStatusEnum.PAYING.getCode());
         search.setEndTime(LocalDateTime.now().minusMinutes(120));
         //查询待支付中订单
-        List<UserOrderVo> payingOrderList = baseMapper.selectAllList(search);
+        List<UserOrderVo> payingOrderList = baseMapper.selectPendingList(search);
         for (UserOrderVo orderVo : payingOrderList) {
             //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
             boolean b = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getOrderNo())
                             , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
         }
     }

+ 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-biz/src/main/resources/config/mybatis/HomeMapper.xml

@@ -8,7 +8,7 @@
 			(select count(1) from teacher_auth_musician_record where teacher_auth_status_ = 'DOING') as musicianNum,
         	(select count(1) from music_sheet where del_flag_ = 0 and audit_status_ = 'DOING') as musicNum,
         	(select count(1) from video_lesson_auth_record where audit_status_ = 'DOING') as videoCourseNum,
-			(select count(1) from teacher_style_video where auth_status_ = 'DOING') as styleNum
+			(select count(1) from teacher_style_video where del_flag_ = 0 and auth_status_ = 'DOING') as styleNum
         from dual
 	</select>
 

+ 2 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherStyleVideoMapper.xml

@@ -53,7 +53,7 @@
 		FROM teacher_style_video t
 		left join sys_user u on t.user_id_ = u.id_
 		left join sys_user v on t.verify_user_id_ = v.id_
-		where (t.del_flag_ = 0 or t.auth_status_ != 'DOING')
+		where t.del_flag_ = 0
 		<if test="null != param.search and '' != param.search">
 			AND (
 			t.user_id_ LIKE CONCAT('%', #{param.search}, '%') or
@@ -105,7 +105,7 @@
 		LEFT JOIN teacher a on t.user_id_ = a.user_id_
 		LEFT JOIN sys_user u on t.user_id_ = u.id_
 		LEFT JOIN teacher_total ta on t.user_id_ = ta.user_id_
-		where t.del_flag_ = '0' and t.auth_status_ = 'PASS'
+		where t.del_flag_ = 0 and t.auth_status_ = 'PASS'
 		<if test="param.username != null and param.username != ''">
 			AND u.username_ LIKE CONCAT('%', #{param.username}, '%')
 		</if>

+ 22 - 9
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -237,21 +237,34 @@
     <select id="getUserOrderByPaymentNoOrTransNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
             <include refid="baseColumns"/>,
-            p1.open_type_ as openType,
-            p1.payment_client_ as paymentClient,
-            p1.pay_channel_ as payChannel,
-            p1.trans_no_ as transNo,
-            p1.payment_no_ as paymentNo
+            p.open_type_ as openType,
+            p.payment_client_ as paymentClient,
+            p.pay_channel_ as payChannel,
+            p.trans_no_ as transNo,
+            p.payment_no_ as paymentNo
         FROM user_order t
-        left join user_order_payment p on t.order_no_ = p.order_no_
-        left join user_order_payment p1 on t.order_no_ = p1.order_no_ and (p1.status_ = 'pending' or p1.status_ = 'succeeded')
+        left join user_order_payment p on t.order_no_ = p.order_no_ and (p.status_ = 'pending' or p.status_ = 'succeeded')
         <where>
             <choose>
                 <when test="paymentNo != null and paymentNo != ''">
-                    and p.payment_no_ = #{paymentNo}
+                    and (
+                        exists (select 1 from user_order_payment p1 where t.order_no_ = p1.order_no_ and  p1.payment_no_ = #{paymentNo}) or
+                        exists (
+                                select 1 from user_order_refund b1
+                                left join user_order_refund_bill b2 on b1.id_ = b2.refund_id_
+                                where t.order_no_ = b1.order_no_ and b2.bill_no_ = #{paymentNo}
+                        )
+                    )
                 </when>
                 <otherwise>
-                    and p.trans_no_ = #{transNo}
+                    and (
+                        exists (select 1 from user_order_payment p1 where p1.trans_no_ = #{transNo}) or
+                        exists (
+                                select 1 from user_order_refund b1
+                                left join user_order_refund_bill b2 on b1.id_ = b2.refund_id_
+                                where t.order_no_ = b1.order_no_ and b2.trans_no_ = #{transNo}
+                        )
+                    )
                 </otherwise>
             </choose>
         </where>

+ 2 - 2
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;
@@ -158,7 +158,7 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(payReq.getOrderNo())
                             , () -> userOrderService.orderCancel(payReq), 60L, TimeUnit.SECONDS);
             if(null != res){
                 return res;

+ 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 - 0
pom.xml

@@ -370,6 +370,7 @@
 		<module>toolset</module>
 	    <module>cooleshow-task</module>
 		<module>cooleshow-mall</module>
+		<module>cooleshow-resource</module>
         <module>cooleshow-websocket</module>
         <module>cooleshow-api</module>
     </modules>

+ 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;