Browse Source

直播课退款不退畅学卡

刘俊驰 4 months ago
parent
commit
3ed07940cd

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

@@ -113,7 +113,7 @@ public class UserOrderRefundController extends BaseController {
         try {
             DistributedLock.of(redissonClient)
                     .runIfLockCanGet(redisCacheService.getPaymentCacheKey(refundReq.getOrderNo())
-                            , () -> userPaymentCoreService.refundPayment(refundReq.getOrderNo(),refundReq.getReason()),
+                            , () -> userPaymentCoreService.refundPayment(refundReq.getOrderNo(),refundReq.getReason(),refundReq.getOredrDetilIds()),
                             10L,TimeUnit.SECONDS);
             return HttpResponseResult.succeed();
         } catch (BizException e) {

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -10,9 +10,10 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.toolset.payment.base.model.RefundBill;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 
+import java.util.List;
+
 /**
  * 用户退款表 服务类
  * @author liweifan
@@ -85,5 +86,5 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 
 	void orderRefundSuccessBizHandle(Long refundId);
 
-    void orderRefundSuccessBizHandleByOrderNo(String orderNo);
+    void orderRefundSuccessBizHandleByOrderNo(String orderNo, List<Long> orderDetailIds);
 }

+ 12 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java

@@ -7,6 +7,8 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 /**
  * 用户支付订单服务
  * Created by Eric.Shang on 2022/12/22.
@@ -86,12 +88,17 @@ public interface UserPaymentCoreService {
      */
     void refundPaymentCallback(RefundResp refundResp);
 
-    void refundPayment(String orderNo,  String reason);
+    void refundPayment(String orderNo, String reason, List<Long> orderDetailIds);
 
     void refundOnly(String reason, String orderNo);
 
 
     /**
+     * 退款
+     */
+    void refundOnly(String reason, String orderNo, List<Long> oredrDetilIds);
+
+    /**
      * 关闭订单
      *
      * @param userInfo     JwtUserInfo
@@ -100,6 +107,9 @@ public interface UserPaymentCoreService {
      */
     PaymentResp closedPayment( UserPaymentOrderWrapper.UserPaymentOrder paymentOrder);
 
-    @Transactional
+    /**
+     * 刷新订单状态
+     * @param orderNo 订单编号
+     */
     void paymentStatus(String orderNo);
 }

+ 14 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -1488,14 +1488,26 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
         for (UserOrder order : userOrders) {
             try {
+
+                // 直播课成课失败退款,只退课程费用,不退畅学卡
+                UserOrderVo detail = userOrderService.detail(order.getId());
+
+                List<Long> orderDetailIds = new ArrayList<>();
+                if (CollectionUtils.isNotEmpty(detail.getOrderDetailList())) {
+                    detail.getOrderDetailList().stream().filter(orderDetail -> orderDetail.getGoodType() == GoodTypeEnum.LIVE)
+                            .filter(orderDetail -> orderDetail.getBizId().equals(courseGroup.getId()))
+                            .forEach(orderDetail -> orderDetailIds.add(orderDetail.getId()));
+                }
                 if (order.getPaymentVersion().equals(EPaymentVersion.V1)) {
                     userOrderRefundService.orderRefund(order.getOrderNo(), "直播课成课失败退款");
                 } else {
-                    userPaymentCoreService.refundPayment(order.getOrderNo(),"直播课成课失败退款");
+                    userPaymentCoreService.refundPayment(order.getOrderNo(),"直播课成课失败退款", orderDetailIds);
                 }
 
                 //退还优惠券
-                couponInfoService.updateUserOrderCouponInfo(CouponOrderWrapper.builder().orderNo(order.getOrderNo()).reset(true).build());
+                if (orderDetailIds.size() == detail.getOrderDetailList().size()) {
+                    couponInfoService.updateUserOrderCouponInfo(CouponOrderWrapper.builder().orderNo(order.getOrderNo()).reset(true).build());
+                }
             } catch (Exception e) {
                 log.warn("直播课成课失败退款 退款失败,退款订单号 {}", order);
                 log.error("直播课成课失败退款 退款失败", e);

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

@@ -641,14 +641,16 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     /**
      * 处理退款业务
      *
-     * @param orderNo 退款单id
+     * @param orderNo       退款单id
+     * @param orderDetailIds 退款单id
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void orderRefundSuccessBizHandleByOrderNo(String orderNo) {
+    public void orderRefundSuccessBizHandleByOrderNo(String orderNo, List<Long> orderDetailIds) {
         //处理业务
         OrderDetailSearch search = new OrderDetailSearch();
         search.setOrderNo(orderNo);
+        search.setIds(orderDetailIds);
         List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
         UserOrder order = userOrderService.getByOrderNo(orderNo);
 

+ 38 - 23
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -1580,7 +1580,10 @@ DISCOUNT("畅学卡")
      */
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void refundPayment(String orderNo, String reason) {
+    public void refundPayment(String orderNo, String reason, List<Long> orderDetailIds) {
+        if (CollectionUtils.isEmpty(orderDetailIds)) {
+            throw new BizException("退款订单明细不能为空");
+        }
 
         // 查询订单信息,支付状态
         UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService.getUserPaymentOrderByOrderNo(orderNo);
@@ -1608,7 +1611,7 @@ DISCOUNT("畅学卡")
                 List<PaymentDivMemberRecord> records = paymentDivMemberRecordService.getByOrderNo(paymentOrder.getOrderNo());
 
                 for (PaymentDivMemberRecord record : records) {
-                    if (record.getTenantEnterFlag()) {
+                    if (Boolean.TRUE.equals(record.getTenantEnterFlag())) {
 
                         refundFlag = saveDivBackRecord(paymentOrder, record);
 
@@ -1617,11 +1620,11 @@ DISCOUNT("畅学卡")
             }
 
             if (refundFlag) {
-                refundOnly(reason, paymentOrder.getOrderNo());
+                refundOnly(reason, paymentOrder.getOrderNo(),orderDetailIds);
             }
 
             //处理退款业务
-            userOrderRefundService.orderRefundSuccessBizHandleByOrderNo(paymentOrder.getOrderNo());
+            userOrderRefundService.orderRefundSuccessBizHandleByOrderNo(paymentOrder.getOrderNo(),orderDetailIds);
         }, 10L, TimeUnit.SECONDS);
 
     }
@@ -1632,6 +1635,16 @@ DISCOUNT("畅学卡")
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void refundOnly(String reason, String orderNo) {
+        refundOnly(reason, orderNo,null);
+
+    }
+
+    /**
+     * 退款
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void refundOnly(String reason, String orderNo, List<Long> orderDetailIds) {
 
         // 查询订单信息,支付状态
         UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService.getUserPaymentOrderByOrderNo(orderNo);
@@ -1643,15 +1656,17 @@ DISCOUNT("畅学卡")
             throw new BizException("订单信息不存在");
         }
 
+        List<UserOrderDetailVo> collect = detail.getOrderDetailList().stream().filter(o -> orderDetailIds.contains(o.getId())).collect(Collectors.toList());
+        BigDecimal reduce = collect.stream().map(o -> o.getActualPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
         // 提交退款申请记录
         UserOrderRefund userRefundOrder = new UserOrderRefund();
         userRefundOrder.setUserId(paymentOrder.getId());
         userRefundOrder.setOrderId(paymentOrder.getId());
         userRefundOrder.setOrderNo(paymentOrder.getOrderNo());
-        userRefundOrder.setOredrDetilIds(detail.getOrderDetailList().stream().map(o -> o.getId().toString()).collect(Collectors.joining(",")));
+        userRefundOrder.setOredrDetilIds(collect.stream().map(o -> o.getId().toString()).collect(Collectors.joining(",")));
         userRefundOrder.setStatus(AuthStatusEnum.PASS);
-        userRefundOrder.setApplyAmount(paymentOrder.getPaymentCashAmount());
-        userRefundOrder.setActualAmount(paymentOrder.getPaymentCashAmount());
+        userRefundOrder.setApplyAmount(reduce);
+        userRefundOrder.setActualAmount(reduce);
         userRefundOrder.setReason(reason);
         userOrderRefundService.save(userRefundOrder);
 
@@ -1661,12 +1676,11 @@ DISCOUNT("畅学卡")
         orderRefundBill.setBillNo(IdWorker.getIdStr());
         orderRefundBill.setRefundAmt(userRefundOrder.getActualAmount());
 
-
         RefundOrder refundOrder = new RefundOrder();
         refundOrder.setUserId(paymentOrder.getUserId().toString());
         refundOrder.setMerOrderNo(orderRefundBill.getBillNo());
         refundOrder.setRefundAmount(orderRefundBill.getRefundAmt());
-        refundOrder.setOrderAmount(paymentOrder.getPaymentCashAmount());
+        refundOrder.setOrderAmount(reduce);
         refundOrder.setReason(reason);
         refundOrder.setTransNo(paymentOrder.getTransNo());
         refundOrder.setPaymentOrderNo(paymentOrder.getOrderNo());
@@ -1674,24 +1688,25 @@ DISCOUNT("畅学卡")
         // 执行状态锁定
         String lockNameInner = redisCacheService.getPaymentCacheKey(orderRefundBill.getBillNo());
         DistributedLock.of(redissonClient).runIfLockCanGet(lockNameInner, () -> {
-            if (StringUtils.isEmpty(paymentOrder.getTransNo())) {
+            if (StringUtils.isEmpty(paymentOrder.getTransNo()) || reduce.compareTo(BigDecimal.ZERO) == 0) {
                 orderRefundBill.setStatus(TradeStatusEnum.succeeded);
                 userOrderRefundBillService.save(orderRefundBill);
-            }
-            try {
-                RefundResp refundResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor()).refund(refundOrder);
-                // 申请请求失败
-                if (PaymentStatus.FAILED == refundResp.getPaymentStatus()) {
+            } else {
+                try {
+                    RefundResp refundResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor()).refund(refundOrder);
+                    // 申请请求失败
+                    if (PaymentStatus.FAILED == refundResp.getPaymentStatus()) {
+                        orderRefundBill.setStatus(TradeStatusEnum.failed);
+                        orderRefundBill.setPayFailMsg(refundResp.getMsg());
+                    } else {
+                        orderRefundBill.setTransNo(refundResp.getTransNo());
+                        orderRefundBill.setStatus(TradeStatusEnum.pending);
+                    }
+                } catch (Exception e) {
                     orderRefundBill.setStatus(TradeStatusEnum.failed);
-                    orderRefundBill.setPayFailMsg(refundResp.getMsg());
-                } else {
-                    orderRefundBill.setTransNo(refundResp.getTransNo());
-                    orderRefundBill.setStatus(TradeStatusEnum.pending);
+                    orderRefundBill.setPayFailMsg(e.getMessage());
+                    log.error("refundOnly orderNo={}", orderRefundBill.getBillNo(), e);
                 }
-            } catch (Exception e) {
-                orderRefundBill.setStatus(TradeStatusEnum.failed);
-                orderRefundBill.setPayFailMsg(e.getMessage());
-                log.error("refundOnly orderNo={}", orderRefundBill.getBillNo(), e);
             }
 
             userOrderRefundBillService.save(orderRefundBill);