|
@@ -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;
|
|
|
}
|
|
|
|
|
|
}
|