|  | @@ -12,6 +12,7 @@ import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.middleware.payment.common.api.entity.*;
 | 
	
		
			
				|  |  | +import com.microsvc.toolkit.middleware.payment.common.api.enums.DivideBackStatus;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.entity.*;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.enums.*;
 | 
	
	
		
			
				|  | @@ -131,6 +132,11 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 | 
	
		
			
				|  |  |      private UserOrderRefundBillService userOrderRefundBillService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private TenantMemberService tenantMemberService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private DivBackRecordService divBackRecordService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // 订单商品参数校验,获取订单支付金额
 | 
	
	
		
			
				|  | @@ -1261,55 +1267,153 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 | 
	
		
			
				|  |  |          // 执行状态锁定
 | 
	
		
			
				|  |  |          String lockName = redisCacheService.getPaymentCacheKey(paymentOrder.getOrderNo());
 | 
	
		
			
				|  |  |          DistributedLock.of(redissonClient).runIfLockCanGet(lockName, () -> {
 | 
	
		
			
				|  |  | -            // 提交退款申请记录
 | 
	
		
			
				|  |  | -            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.setStatus(AuthStatusEnum.PASS);
 | 
	
		
			
				|  |  | -            userRefundOrder.setApplyAmount(paymentOrder.getPaymentCashAmount());
 | 
	
		
			
				|  |  | -            userRefundOrder.setActualAmount(paymentOrder.getPaymentCashAmount());
 | 
	
		
			
				|  |  | -            userRefundOrder.setReason(reason);
 | 
	
		
			
				|  |  | -            userOrderRefundService.save(userRefundOrder);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //入退款单表
 | 
	
		
			
				|  |  | -            UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
 | 
	
		
			
				|  |  | -            orderRefundBill.setRefundId(userRefundOrder.getId());
 | 
	
		
			
				|  |  | -            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.setReason(reason);
 | 
	
		
			
				|  |  | -            refundOrder.setTransNo(paymentOrder.getTransNo());
 | 
	
		
			
				|  |  | -            refundOrder.setPaymentOrderNo(paymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // 执行状态锁定
 | 
	
		
			
				|  |  | -            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());
 | 
	
		
			
				|  |  | -                } else {
 | 
	
		
			
				|  |  | -                    orderRefundBill.setTransNo(refundResp.getTransNo());
 | 
	
		
			
				|  |  | -                    orderRefundBill.setStatus(TradeStatusEnum.pending);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 如果是易宝的订单,查询分账是否给到子账户,没有给子账户的直接退款
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 分账给子账户的 先 分账归还,如果归还成功,再退款,归还失败,不退款,退款后的逻辑还是继续走
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            boolean refundFlag = true;
 | 
	
		
			
				|  |  | +            if (paymentOrder.getPaymentVendor().equals(EPayerType.YEEPAY.getDesc())) {
 | 
	
		
			
				|  |  | +                List<PaymentDivMemberRecord> records = paymentDivMemberRecordService.getByOrderNo(paymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                for (PaymentDivMemberRecord record : records) {
 | 
	
		
			
				|  |  | +                    if (record.getTenantEnterFlag()) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        refundFlag = saveDivBackRecord(paymentOrder, record);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                userOrderRefundBillService.save(orderRefundBill);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (refundFlag) {
 | 
	
		
			
				|  |  | +                refundOnly(reason, paymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //处理退款业务
 | 
	
		
			
				|  |  | +            userOrderRefundService.orderRefundSuccessBizHandleByOrderNo(paymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | +        }, 10L, TimeUnit.SECONDS);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                //处理退款业务
 | 
	
		
			
				|  |  | -               userOrderRefundService.orderRefundSuccessBizHandle(userRefundOrder.getId());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            }, 10L, TimeUnit.SECONDS);
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 退款
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void refundOnly(String reason, String orderNo) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 查询订单信息,支付状态
 | 
	
		
			
				|  |  | +        UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService.getUserPaymentOrderByOrderNo(orderNo);
 | 
	
		
			
				|  |  | +        if (Objects.isNull(paymentOrder)) {
 | 
	
		
			
				|  |  | +            throw new BizException("订单信息不存在");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!OrderStatusEnum.PAID.getCode().equals(paymentOrder.getStatus().getCode())) {
 | 
	
		
			
				|  |  | +            throw  new BizException("订单状态异常");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        UserOrderVo detail = userOrderService.detail(paymentOrder.getId());
 | 
	
		
			
				|  |  | +        if (Objects.isNull(detail)) {
 | 
	
		
			
				|  |  | +            throw new BizException("订单信息不存在");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 提交退款申请记录
 | 
	
		
			
				|  |  | +        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.setStatus(AuthStatusEnum.PASS);
 | 
	
		
			
				|  |  | +        userRefundOrder.setApplyAmount(paymentOrder.getPaymentCashAmount());
 | 
	
		
			
				|  |  | +        userRefundOrder.setActualAmount(paymentOrder.getPaymentCashAmount());
 | 
	
		
			
				|  |  | +        userRefundOrder.setReason(reason);
 | 
	
		
			
				|  |  | +        userOrderRefundService.save(userRefundOrder);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //入退款单表
 | 
	
		
			
				|  |  | +        UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
 | 
	
		
			
				|  |  | +        orderRefundBill.setRefundId(userRefundOrder.getId());
 | 
	
		
			
				|  |  | +        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.setReason(reason);
 | 
	
		
			
				|  |  | +        refundOrder.setTransNo(paymentOrder.getTransNo());
 | 
	
		
			
				|  |  | +        refundOrder.setPaymentOrderNo(paymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 执行状态锁定
 | 
	
		
			
				|  |  | +        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());
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                orderRefundBill.setTransNo(refundResp.getTransNo());
 | 
	
		
			
				|  |  | +                orderRefundBill.setStatus(TradeStatusEnum.pending);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            userOrderRefundBillService.save(orderRefundBill);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          }, 10L, TimeUnit.SECONDS);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private boolean saveDivBackRecord(UserPaymentOrderWrapper.UserPaymentOrder paymentOrder, PaymentDivMemberRecord record) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        BasePaymentService paymentService = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        boolean refundFlag = true;
 | 
	
		
			
				|  |  | +        DivBackRecord divBackRecord = new DivBackRecord();
 | 
	
		
			
				|  |  | +        divBackRecord.setPaymentDivMemberRecordId(record.getId());
 | 
	
		
			
				|  |  | +        divBackRecord.setDivideBackOrderNo(IdWorker.getIdStr());
 | 
	
		
			
				|  |  | +        divBackRecord.setTimes(1);
 | 
	
		
			
				|  |  | +        divBackRecord.setPaymentVendor(paymentOrder.getPaymentVendor());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 分账数据
 | 
	
		
			
				|  |  | +        DivideReq.DivideBackDetail divideBackDetail = DivideReq.DivideBackDetail.builder()
 | 
	
		
			
				|  |  | +            .amount(record.getAmount())
 | 
	
		
			
				|  |  | +            .divideDetailNo(record.getTransNo())
 | 
	
		
			
				|  |  | +            .divideBackReason("订单退款")
 | 
	
		
			
				|  |  | +            .build();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<DivideResp.DivMember> divMembers = JSON.parseArray(record.getDivMemberJson(), DivideResp.DivMember.class);
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isNotEmpty(divMembers)) {
 | 
	
		
			
				|  |  | +            divideBackDetail.setDivideDetailNo(divMembers.get(0).getDetailNo());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        DivideReq.MemberDivideBack memberDivideBack = DivideReq.MemberDivideBack.builder()
 | 
	
		
			
				|  |  | +            .payerName(EPayerType.YEEPAY.getDesc())
 | 
	
		
			
				|  |  | +            .memberId(record.getMemberId())
 | 
	
		
			
				|  |  | +            .devOrderNo(record.getDivOrderNo())
 | 
	
		
			
				|  |  | +            .platformPayeeMemberId(paymentService.getPaymentConfig().getMerchantId())
 | 
	
		
			
				|  |  | +            .divideBackOrderNo(divBackRecord.getDivideBackOrderNo())
 | 
	
		
			
				|  |  | +            .payOrderNo(paymentOrder.getOrderNo())
 | 
	
		
			
				|  |  | +            .transNo(paymentOrder.getTransNo())
 | 
	
		
			
				|  |  | +            .divideBackDetail(Lists.newArrayList(divideBackDetail))
 | 
	
		
			
				|  |  | +            .build();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            DivideResp.DivideBack divideBack = paymentService.divideBack(tenantMemberService
 | 
	
		
			
				|  |  | +                .getMerchantConfig(paymentOrder.getPaymentVendor()), memberDivideBack);
 | 
	
		
			
				|  |  | +            if (divideBack.getStatus() != DivideBackStatus.SUCCESS) {
 | 
	
		
			
				|  |  | +                refundFlag = false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            divBackRecord.setReason(divideBack.getReason());
 | 
	
		
			
				|  |  | +            divBackRecord.setDivideBackTransNo(divideBack.getDivideBackTransNo());
 | 
	
		
			
				|  |  | +            divBackRecord.setStatus(divideBack.getStatus().name());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }catch (Exception e) {
 | 
	
		
			
				|  |  | +            log.error("分账回归失败orderNo={}", memberDivideBack.getDivideBackOrderNo(), e);
 | 
	
		
			
				|  |  | +            refundFlag = false;
 | 
	
		
			
				|  |  | +            divBackRecord.setReason(e.getMessage());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        divBackRecordService.save(divBackRecord);
 | 
	
		
			
				|  |  | +        return refundFlag;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |