update 更新支付的消费退款

This commit is contained in:
2023-08-26 15:46:12 +08:00
parent 4bad102219
commit 0f6b0958e4
5 changed files with 111 additions and 47 deletions

View File

@@ -201,7 +201,7 @@ public class TempController extends BaseController {
throw new BusinessException("", "查询信息为空");
}
String appId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId());
orderBasicInfoService.doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId);
orderBasicInfoService.doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId);
} catch (Exception e) {
logger.error("临时接口交易确认接口 error,", e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_WEIXIN_REFUND_ERROR);
@@ -230,7 +230,7 @@ public class TempController extends BaseController {
throw new BusinessException("", "查询信息为空");
}
String appId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId);
orderBasicInfoService.doBalancePayment(orderBasicInfo, adapayMemberAccount, appId);
orderBasicInfoService.doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, appId);
} catch (Exception e) {
logger.error("临时接口交易确认接口 error,", e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_WEIXIN_REFUND_ERROR);

View File

@@ -153,8 +153,6 @@ public interface IOrderBasicInfoService {
void tempOrderSplittingOperations(String merchantId, String tradeDate);
OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException;
List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount);
/**
@@ -164,7 +162,9 @@ public interface IOrderBasicInfoService {
* @return
* @throws BaseAdaPayException
*/
OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException;
OrderSettleResult doPaymentConfirmWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException;
OrderSettleResult doBalancePaymentWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException;
/**
* 批量查询订单

View File

@@ -2,6 +2,7 @@ package com.jsowell.pile.service;
import com.jsowell.pile.domain.MemberAdapayRecord;
import java.math.BigDecimal;
import java.util.List;
public interface MemberAdapayRecordService{
@@ -28,4 +29,8 @@ public interface MemberAdapayRecordService{
* @param memberId 会员id
*/
List<MemberAdapayRecord> selectAvailableBalance(String memberId);
void updateSpendAmount(String paymentId, BigDecimal amount);
void updateRefundAmount(String paymentId, BigDecimal amount);
}

View File

@@ -3,12 +3,16 @@ package com.jsowell.pile.service.impl;
import com.jsowell.pile.domain.MemberAdapayRecord;
import com.jsowell.pile.mapper.MemberAdapayRecordMapper;
import com.jsowell.pile.service.MemberAdapayRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
@Slf4j
@Service
public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{
public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService {
@Resource
private MemberAdapayRecordMapper memberAdapayRecordMapper;
@@ -50,7 +54,8 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{
/**
* 查询会员的支付记录,按照支付成功时间正序
* @param memberId 会员id
*
* @param memberId 会员id
* @param scenarioType 支付订单/充值余额
* @return 支付记录列表
*/
@@ -66,6 +71,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{
/**
* 查询会员可用余额充值记录
*
* @param memberId 会员id
* @return
*/
@@ -74,4 +80,50 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{
return memberAdapayRecordMapper.selectAvailableBalance(memberId);
}
/**
* 更新消费金额
*
* @param paymentId
* @param amount
*/
@Override
public void updateSpendAmount(String paymentId, BigDecimal amount) {
updateSpendAmountAndRefundAmount(paymentId, amount, null);
}
/**
* 更新剩余金额
*
* @param paymentId
* @param amount
*/
@Override
public void updateRefundAmount(String paymentId, BigDecimal amount) {
updateSpendAmountAndRefundAmount(paymentId, null, amount);
}
/**
* 更新交易记录的消费金额和退款金额
*
* @param paymentId 支付id
* @param SpendAmount 消费金额
* @param RefundAmount 退款金额
*/
private void updateSpendAmountAndRefundAmount(String paymentId, BigDecimal SpendAmount, BigDecimal RefundAmount) {
MemberAdapayRecord record = selectByPaymentId(paymentId);
if (record == null) {
log.info("更新交易记录的消费金额和退款金额paymentId:{}, 查询为空", paymentId);
return;
}
if (RefundAmount != null) {
record.setRefundAmt(record.getRefundAmt().add(RefundAmount));
}
if (SpendAmount != null) {
record.setSpendAmt(record.getSpendAmt().add(SpendAmount));
}
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
updateByPrimaryKeySelective(record);
}
}

View File

@@ -694,19 +694,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
dto.setOrderDetail(orderDetail);
transactionService.doUpdateOrder(dto);
// 订单支付结算
OrderSettleResult orderSettleResult = orderPaymentSettlement(orderBasicInfo);
// 订单支付结算and退款
OrderSettleResult orderSettleResult = orderPaymentSettlementAndRefund(orderBasicInfo);
// 退款逻辑/需要退款的情况
BigDecimal residue = orderBasicInfo.getRefundAmount();
if (residue.compareTo(BigDecimal.ZERO) > 0) {
// 执行退款逻辑
try {
refundOrder(orderBasicInfo, residue);
} catch (Exception e) {
logger.error("订单退款逻辑异常orderCode:{}", orderBasicInfo.getOrderCode(), e);
}
}
// 记账
doUpdateClearingBill(orderSettleResult);
// 将卡/vin状态解锁
if (!StringUtils.equals("0000000000000000", data.getLogicCard())) {
@@ -729,12 +721,19 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
logger.info("结算订单end:{} OrderTransactionDTO:{}", orderBasicInfo.getOrderCode(), JSONObject.toJSONString(dto));
}
/**
* 记账
*/
private void doUpdateClearingBill(OrderSettleResult orderSettleResult) {
logger.info("orderSettleResult:{}", JSON.toJSONString(orderSettleResult));
}
/**
* 订单分账逻辑
* 订单结算完成,就执行分账
* 订单结算完成,就执行清分and退款
* 清分账单生成逻辑改为当天第一笔结算后就新建,后面的产生的订单,追加更新
*/
private OrderSettleResult orderPaymentSettlement(OrderBasicInfo orderBasicInfo) {
private OrderSettleResult orderPaymentSettlementAndRefund(OrderBasicInfo orderBasicInfo) {
String merchantId = orderBasicInfo.getMerchantId();
String orderCode = orderBasicInfo.getOrderCode();
// 获取一级运营商信息
@@ -764,20 +763,42 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 延时分账的处理逻辑
if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) {
// 余额支付的订单
orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount, appId);
orderSettleResult = doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, appId);
} else {
// 在线支付,进行支付确认分账
orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId);
orderSettleResult = doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId);
}
} else {
// 不使用延时分账的汇付商户,钱已经到基本账户中了,只需要退款就可以
orderSettleResult = notDelayOrder(orderBasicInfo, adapayMemberAccount, appId);
}
// 退款逻辑/需要退款的情况
BigDecimal residue = orderBasicInfo.getRefundAmount();
if (residue.compareTo(BigDecimal.ZERO) > 0) {
// 执行退款逻辑
try {
refundOrder(orderBasicInfo, residue);
} catch (Exception e) {
logger.error("订单退款逻辑异常orderCode:{}", orderBasicInfo.getOrderCode(), e);
}
}
return orderSettleResult;
}
/**
*
* @param orderBasicInfo
* @param adapayMemberAccount
* @param wechatAppId
* @return
*/
private OrderSettleResult notDelayOrder(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
return null;
}
/**
* 返回更新后的OrderBasicInfo对象
* 专用方法,其他地方如果要用请仔细检查
@@ -1104,10 +1125,10 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
OrderSettleResult orderSettleResult;
if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) {
// 余额支付的订单
orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount, appId);
orderSettleResult = doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, appId);
} else {
// 在线支付,进行支付确认分账
orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId);
orderSettleResult = doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId);
}
if (orderSettleResult != null && AdapayStatusEnum.SUCCEEDED.getValue().equals(orderSettleResult.getStatus())) {
// 应收金额 = 订单结算金额汇总
@@ -1210,7 +1231,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount);
} else {
// 在线支付,进行支付确认分账
orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId);
orderSettleResult = doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId);
}
// if (orderSettleResult != null && AdapayStatusEnum.SUCCEEDED.getValue().equals(orderSettleResult.getStatus())) {
// JSONObject jsonObject = JSON.parseObject(orderSettleResult.getDescription());
@@ -1231,7 +1252,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
* @return
*/
@Override
public OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
public OrderSettleResult doBalancePaymentWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
BigDecimal settleAmount = orderBasicInfo.getSettleAmount();
String orderCode = orderBasicInfo.getOrderCode();
@@ -1253,14 +1274,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
status = paymentConfirmResponse.getStatus();
description = paymentConfirmResponse.getDescription();
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
memberAdapayRecordService.updateByPrimaryKeySelective(record);
memberAdapayRecordService.updateSpendAmount(paymentId, deductionAmount);
}
}
@@ -1332,8 +1346,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
* @param orderBasicInfo 订单
* @param adapayMemberAccount 结算账户
*/
@Override
public OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
public OrderSettleResult doPaymentConfirmWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
// 查询订单的交易id
String orderCode = orderBasicInfo.getOrderCode();
AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderCode);
@@ -2533,13 +2546,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
dto.getMemberId(), ScenarioEnum.BALANCE.getValue(), null);
if (paymentReverseRequest != null && paymentReverseRequest.isNotFailed()) {
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
// 更新此笔交易单的退款金额 = 历史退款金额 + 退款金额
record.setRefundAmt(record.getRefundAmt().add(deductionAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
memberAdapayRecordService.updateByPrimaryKeySelective(record);
memberAdapayRecordService.updateRefundAmount(paymentId, deductionAmount);
// 放缓存
redisCache.setCacheObject(redisKey, paymentReverseRequest, CacheConstants.cache_expire_time_30m);
@@ -3004,7 +3011,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 分账金额为0表示该订单没有执行过分账再次执行分账
if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) {
// 余额支付的订单
doBalancePayment(orderBasicInfo, adapayMemberAccount, wechatAppId);
doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, wechatAppId);
}
// 再次查询分账