Przeglądaj źródła

Merge remote-tracking branch 'origin/feature/1113-vipCourse' into feature/1113-vipCourse

zouxuan 7 miesięcy temu
rodzic
commit
f7da029568

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

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

@@ -1440,7 +1440,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 .eq(CourseSchedule::getId, courseId)
                 .eq(CourseSchedule::getLock, 0)
                 .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
-                .eq(CourseSchedule::getType, CourseScheduleEnum.PRACTICE));
+                .in(CourseSchedule::getType, CourseScheduleEnum.PRACTICE, CourseScheduleEnum.VIP));
         if (ObjectUtil.isEmpty(schedule)) {
             throw new BizException("无法调整该课程,课程不存在");
         }
@@ -1458,7 +1458,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //查询是否有人购买
         CourseScheduleStudentPayment studentPayment = paymentDao.selectOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
                 .eq(CourseScheduleStudentPayment::getCourseId, courseId)
-                .eq(CourseScheduleStudentPayment::getCourseType, CourseScheduleEnum.PRACTICE));
+                .in(CourseScheduleStudentPayment::getCourseType, CourseScheduleEnum.PRACTICE,CourseScheduleEnum.VIP));
         if (ObjectUtil.isEmpty(studentPayment)) {
             throw new BizException("课程无人购买");
         }

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

@@ -604,6 +604,9 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
                     if (activityPlanRewardDto.getActivityReward().getRewardType().getCode().equals(detail.getVipType().getCode())
                             && activityPlanRewardDto.getActivityReward().getUnit().getCode().equals(detail.getPeriod().getCode())) {
                         couponAmount = activityPlanRewardDto.getActivityReward().getDiscountPrice();
+                        if (couponAmount.compareTo(expectPrice) >= 0) {
+                            couponAmount = expectPrice;
+                        }
                         break;
                     }
                 }

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

@@ -1076,7 +1076,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         } else {
             accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
         }
-        AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().name());
+        AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getGoodType().name());
         BigDecimal amount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
         PostStatusEnum platformPostStatus = PostStatusEnum.RECORDED;
         SourceTypeEnum sourceType = SourceTypeEnum.ORDER;

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -14,10 +15,12 @@ import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.EPaymentVersion;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -151,6 +154,16 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
 
     @Override
     public List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo) {
+
+        String userAccountConfig = userOrderDetailVo.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
+        boolean tenantFlag =accountTenantTo.getIncomeTenant() !=null &&  accountTenantTo.getIncomeTenant() > 0;
+
         List<UserAccountRecord> records = new ArrayList<>();
         //订单类型: 学生端( VIP、开通会员  PRACTICE、趣纠课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长)
         //获取业务id
@@ -173,7 +186,7 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
             records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.MUSIC_SHARE, bizIds));
         }else if(GoodTypeEnum.PRACTICE.equals(userOrderDetailVo.getGoodType())){
             //查询课程组下所有课程id
-            if (userOrderDetailVo.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            if (userOrderDetailVo.getPaymentVersion().equals(EPaymentVersion.V1) || !tenantFlag) {
                 List<CourseSchedule> cancel = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
                         .eq(CourseSchedule::getCourseGroupId, userOrderDetailVo.getBizId())
                 );
@@ -187,7 +200,7 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
             List<Long> groupId = Arrays.asList(userOrderDetailVo.getBizId());
             records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(), AccountBizTypeEnum.LIVE_SHARE, groupId));
 
-            if (userOrderDetailVo.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            if (userOrderDetailVo.getPaymentVersion().equals(EPaymentVersion.V1)  || !tenantFlag) {
                 //查询课程组下所有课程id
                 List<CourseSchedule> cancel = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
                         .eq(CourseSchedule::getCourseGroupId, userOrderDetailVo.getBizId())

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

+ 42 - 16
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,15 +1688,27 @@ DISCOUNT("畅学卡")
         // 执行状态锁定
         String lockNameInner = redisCacheService.getPaymentCacheKey(orderRefundBill.getBillNo());
         DistributedLock.of(redissonClient).runIfLockCanGet(lockNameInner, () -> {
-            RefundResp refundResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor()).refund(refundOrder);
-            // 申请请求失败
-            if (PaymentStatus.FAILED == refundResp.getPaymentStatus()) {
-                orderRefundBill.setStatus(TradeStatusEnum.failed);
-                orderRefundBill.setPayFailMsg(refundResp.getMsg());
+            if (StringUtils.isEmpty(paymentOrder.getTransNo()) || reduce.compareTo(BigDecimal.ZERO) == 0) {
+                orderRefundBill.setStatus(TradeStatusEnum.succeeded);
+                userOrderRefundBillService.save(orderRefundBill);
             } else {
-                orderRefundBill.setTransNo(refundResp.getTransNo());
-                orderRefundBill.setStatus(TradeStatusEnum.pending);
+                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(e.getMessage());
+                    log.error("refundOnly orderNo={}", orderRefundBill.getBillNo(), e);
+                }
             }
+
             userOrderRefundBillService.save(orderRefundBill);
 
         }, 10L, TimeUnit.SECONDS);