mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-21 11:35:12 +08:00
交易分账 重构
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user