交易分账 重构

This commit is contained in:
2023-08-28 11:53:50 +08:00
parent 01025fb40b
commit fc70b95587

View File

@@ -232,7 +232,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
return orderListVOS;
}
private void tempUpdateVirtualAmount(OrderListVO orderListVO) {
/*private void tempUpdateVirtualAmount(OrderListVO orderListVO) {
if (orderListVO.getVirtualAmount() != null) {
return;
}
@@ -252,10 +252,10 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
if (orderAmount.compareTo(BigDecimal.ZERO) > 0) {
if (StringUtils.equals(orderListVO.getPayMode(), OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) {
/*
*//*
余额支付 查询支付记录如全部用本金支付则虚拟金额为0结算金额为订单消费金额
如果使用了赠送金额,虚拟金额为赠送金额支付部分,结算金额=订单消费金额-虚拟金额消费部分
*/
*//*
// 查询支付记录
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderListVO.getOrderCode());
for (OrderPayRecord orderPayRecord : orderPayRecordList) {
@@ -275,9 +275,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
}
}
} else {
/*
*//*
微信支付 虚拟金额为0 结算金额等于订单消费金额
*/
*//*
settleAmount = orderAmount;
}
}
@@ -290,7 +290,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
.settleAmount(settleAmount)
.build();
updateOrderBasicInfo(build);
}
}*/
/**
* 通过订单状态和支付状态 转换订单状态描述
@@ -562,6 +562,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
return orderBasicInfoMapper.updateOrderDetail(orderDetail);
}
/**
* 清除订单缓存 订单编号或交易流水号 任意传一个
* @param orderCode 订单编号
* @param transactionCode 交易流水号
*/
@Override
public void cleanCacheByOrderCode(String orderCode, String transactionCode) {
logger.debug("清除订单缓存 orderCode:{}, transactionCode:{}", orderCode, transactionCode);
@@ -766,20 +771,23 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
}
OrderSettleResult orderSettleResult = null;
// if (StringUtils.equals(delayMode, Constants.ADAPAY_PAY_MODE_DELAY)) {
// // 延迟商家订单处理逻辑
// orderSettleResult = delayMerchantOrderProcessingLogic(orderBasicInfo, adapayMemberAccount, appId);
// } else {
// // 不延迟商家订单处理逻辑 不使用延时分账的汇付商户,钱已经到基本账户中了,只需要退款就可以
// orderSettleResult = notDelayMerchantOrderProcessingLogic(orderBasicInfo, adapayMemberAccount, appId);
// }
// 退款逻辑/需要退款的情况
BigDecimal residue = orderBasicInfo.getRefundAmount();
if (residue.compareTo(BigDecimal.ZERO) > 0) {
// 执行退款逻辑
try {
refundOrder(orderBasicInfo, residue);
String payMode = orderBasicInfo.getPayMode();
if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) {
// 余额支付
balancePaymentOrderRefund(orderBasicInfo);
} else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
// 微信支付
onlinePaymentOrderRefund(orderBasicInfo);
} else {
// 白名单支付
logger.info("订单:{}使用白名单支付,不进行退款处理", orderBasicInfo.getOrderCode());
}
} catch (Exception e) {
logger.error("订单退款逻辑异常orderCode:{}", orderBasicInfo.getOrderCode(), e);
}
@@ -817,7 +825,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 订单支付记录,保存一下消费记录 deduction_record
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
if (CollectionUtils.isNotEmpty(orderPayRecordList)) {
//
}
}
private AdapayCallbackRecord selectAdapayCallbackRecord(String orderCode) {
@@ -1021,12 +1031,54 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
}
/**
* 订单退款逻辑
*
* @param orderBasicInfo 订单信息
* @param residue 需退款金额
* 在线支付的订单退款
*/
private void refundOrder(OrderBasicInfo orderBasicInfo, BigDecimal residue) {
private void onlinePaymentOrderRefund(OrderBasicInfo orderBasicInfo) {
// 订单编号
String orderCode = orderBasicInfo.getOrderCode();
// 订单消费金额
BigDecimal orderAmount = orderBasicInfo.getOrderAmount();
// 查支付记录
List<OrderPayRecord> payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
// 需要退款的金额
BigDecimal refundAmount = orderBasicInfo.getRefundAmount();
// 微信退款逻辑
ApplyRefundDTO applyRefundDTO = new ApplyRefundDTO();
applyRefundDTO.setOrderCode(orderCode);
applyRefundDTO.setRefundType(Constants.ONE);
applyRefundDTO.setRefundAmount(refundAmount);
// 查到该笔订单付款金额到哪里了
MemberTransactionRecord transactionRecord = memberTransactionRecordService.selectByOrderCode(orderCode, ActionTypeEnum.FORWARD.getValue());
logger.info("查到该笔订单付款金额到哪里了:{}", JSON.toJSONString(transactionRecord));
if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.WECHAT_PAY.getValue())) {
this.weChatRefund(applyRefundDTO);
} else if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.ADAPAY.getValue())) {
// 汇付退款需要一级运营商的小程序appId, 否则会退款失败
String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId());
if (StringUtils.isNotBlank(wechatAppId)) {
applyRefundDTO.setWechatAppId(wechatAppId);
}
this.refundOrderWithAdapay(applyRefundDTO);
}
// 更新订单支付记录
List<OrderPayRecord> updatePayRecordList = Lists.newArrayList();
OrderPayRecord orderPayRecord = payRecordList.get(0);
orderPayRecord.setRefundAmount(refundAmount);
updatePayRecordList.add(orderPayRecord);
// 更新order_pay_record
if (CollectionUtils.isNotEmpty(updatePayRecordList)) {
orderPayRecordService.updateBatch(updatePayRecordList);
}
}
/**
* 余额支付的订单退款
*/
private void balancePaymentOrderRefund(OrderBasicInfo orderBasicInfo) {
// 订单编号
String orderCode = orderBasicInfo.getOrderCode();
// 订单消费金额
@@ -1035,84 +1087,52 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
List<OrderPayRecord> payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
// 更新订单支付记录
List<OrderPayRecord> updatePayRecordList = Lists.newArrayList();
// 根据支付方式不同,走不同渠道退款
String payMode = orderBasicInfo.getPayMode();
if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) { // 余额支付
Map<String, OrderPayRecord> payRecordMap = payRecordList.stream()
.collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1));
// 取出本金支付金额,赠送支付金额
BigDecimal principalPay = null;
BigDecimal giftPay = null;
OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE);
if (principalPayRecord != null) {
principalPay = principalPayRecord.getPayAmount();
}
Map<String, OrderPayRecord> payRecordMap = payRecordList.stream()
.collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1));
// 取出本金支付金额,赠送支付金额
BigDecimal principalPay = null;
BigDecimal giftPay = null;
OrderPayRecord giftPayRecord = payRecordMap.get(Constants.TWO);
if (giftPayRecord != null) {
giftPay = giftPayRecord.getPayAmount();
}
Map<String, BigDecimal> returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount);
logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}",
orderCode, orderAmount, principalPay, giftPay, JSONObject.toJSONString(returnAmountMap));
// 更新会员钱包
BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal");
if (returnPrincipal != null && principalPayRecord != null) {
principalPayRecord.setRefundAmount(returnPrincipal);
updatePayRecordList.add(principalPayRecord);
}
BigDecimal returnGift = returnAmountMap.get("returnGift");
if (returnGift != null && giftPayRecord != null) {
giftPayRecord.setRefundAmount(returnGift);
updatePayRecordList.add(giftPayRecord);
// 支付的赠送金额-退回的赠送金额 = 实际使用赠送金额消费的部分
// virtualAmount = giftPay.subtract(returnGift);
}
UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder()
.memberId(orderBasicInfo.getMemberId())
.type(MemberWalletEnum.TYPE_IN.getValue()) // 进账
.subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款
.updatePrincipalBalance(returnPrincipal)
.updateGiftBalance(returnGift)
.relatedOrderCode(orderCode)
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
} else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { // 微信支付
// 微信退款逻辑
ApplyRefundDTO applyRefundDTO = new ApplyRefundDTO();
applyRefundDTO.setOrderCode(orderCode);
applyRefundDTO.setRefundType(Constants.ONE);
applyRefundDTO.setRefundAmount(residue);
// 查到该笔订单付款金额到哪里了
MemberTransactionRecord transactionRecord = memberTransactionRecordService.selectByOrderCode(orderCode, ActionTypeEnum.FORWARD.getValue());
logger.info("查到该笔订单付款金额到哪里了:{}", JSON.toJSONString(transactionRecord));
if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.WECHAT_PAY.getValue())) {
this.weChatRefund(applyRefundDTO);
} else if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.ADAPAY.getValue())) {
// 汇付退款需要一级运营商的小程序appId, 否则会退款失败
String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId());
if (StringUtils.isNotBlank(wechatAppId)) {
applyRefundDTO.setWechatAppId(wechatAppId);
}
this.refundOrderWithAdapay(applyRefundDTO);
}
// 订单支付记录
OrderPayRecord orderPayRecord = payRecordList.get(0);
orderPayRecord.setRefundAmount(residue);
updatePayRecordList.add(orderPayRecord);
} else {
// 白名单支付
logger.info("订单:{}使用白名单支付,不进行退款处理", orderCode);
OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE);
if (principalPayRecord != null) {
principalPay = principalPayRecord.getPayAmount();
}
OrderPayRecord giftPayRecord = payRecordMap.get(Constants.TWO);
if (giftPayRecord != null) {
giftPay = giftPayRecord.getPayAmount();
}
Map<String, BigDecimal> returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount);
logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}",
orderCode, orderAmount, principalPay, giftPay, JSONObject.toJSONString(returnAmountMap));
// 更新会员钱包
BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal");
if (returnPrincipal != null && principalPayRecord != null) {
principalPayRecord.setRefundAmount(returnPrincipal);
updatePayRecordList.add(principalPayRecord);
}
BigDecimal returnGift = returnAmountMap.get("returnGift");
if (returnGift != null && giftPayRecord != null) {
giftPayRecord.setRefundAmount(returnGift);
updatePayRecordList.add(giftPayRecord);
// 支付的赠送金额-退回的赠送金额 = 实际使用赠送金额消费的部分
// virtualAmount = giftPay.subtract(returnGift);
}
UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder()
.memberId(orderBasicInfo.getMemberId())
.type(MemberWalletEnum.TYPE_IN.getValue()) // 进账
.subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款
.updatePrincipalBalance(returnPrincipal)
.updateGiftBalance(returnGift)
.relatedOrderCode(orderCode)
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 更新order_pay_record
if (CollectionUtils.isNotEmpty(updatePayRecordList)) {
for (OrderPayRecord orderPayRecord : updatePayRecordList) {
orderPayRecordService.updateByPrimaryKeySelective(orderPayRecord);
}
orderPayRecordService.updateBatch(updatePayRecordList);
}
}
@@ -1471,9 +1491,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 余额支付 计算需要退回的金额
*
* @param principalPay
* @param giftPay
* @param orderAmount
* @param principalPay 本金支付金额
* @param giftPay 赠送金额支付的金额
* @param orderAmount 订单消费金额
* @return
*/
private Map<String, BigDecimal> calculateReturnAmount(BigDecimal principalPay, BigDecimal giftPay, BigDecimal orderAmount) {