交易分账 重构

This commit is contained in:
2023-08-28 16:49:48 +08:00
parent e4d3d481da
commit 2f1900e65b
7 changed files with 84 additions and 44 deletions

View File

@@ -38,9 +38,9 @@ public interface OrderPayRecordMapper {
int insertOrUpdateSelective(OrderPayRecord record);
int deleteByPrimaryKey(Integer id);
// int deleteByPrimaryKey(Integer id);
int updateByPrimaryKey(OrderPayRecord record);
// int updateByPrimaryKey(OrderPayRecord record);
List<OrderPayRecord> getOrderPayRecordList(@Param("orderCode") String orderCode);
}

View File

@@ -20,6 +20,12 @@ public interface MemberAdapayRecordService{
int insertOrUpdateSelective(MemberAdapayRecord record);
/**
* 查询会员的汇付支付记录
* @param memberId 会员id
* @param scenarioType 场景类型 订单/余额
* @return
*/
List<MemberAdapayRecord> selectAdapayRecordList(String memberId, String scenarioType);
MemberAdapayRecord selectByPaymentId(String paymentId);

View File

@@ -818,12 +818,22 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
private void freezeAmount(OrderBasicInfo orderBasicInfo) {
String orderCode = orderBasicInfo.getOrderCode();
// 查询这笔订单的支付id/查询该笔订单的支付交易回调
AdapayCallbackRecord adapayCallbackRecord = selectAdapayCallbackRecord(orderCode);
String paymentId = adapayCallbackRecord.getPaymentId();
memberAdapayRecordService.updateFreezeAmount(paymentId, orderBasicInfo.getSettleAmount());
// 根据订单编号查询订单支付记录一般在线支付只有1条余额支付可能有多条
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
// 需要根据订单消费的金额计算一下每个paymentId需要冻结多少钱
for (OrderPayRecord record : orderPayRecordList) {
// 支付的信息json字符串包含paymentId和支付金额
String deductionRecord = record.getDeductionRecord();
JSONObject jsonObject = JSON.parseObject(deductionRecord);
String paymentId = jsonObject.getString("paymentId");
// 更新member_adapay_record 中的冻结金额
memberAdapayRecordService.updateFreezeAmount(paymentId, orderBasicInfo.getSettleAmount());
}
// 订单支付记录,保存一下消费记录 deduction_record
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
if (CollectionUtils.isNotEmpty(orderPayRecordList)) {
//
}
@@ -1335,33 +1345,25 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt();
// 该笔支付扣除金额
BigDecimal deductionAmount;
// 获取延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法
AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByPaymentId(memberAdapayRecord.getPaymentId());
String payMode = null;
if (callbackRecord != null) {
JSONObject expendJsonObject = JSON.parseObject(callbackRecord.getExpend());
payMode = expendJsonObject.getString("payMode");
}
// 消费金额 - 剩余金额
// 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额
tempAmount = tempAmount.subtract(balanceAmt);
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
// 计算以后大于等于0说明这笔支付剩余金额需要扣完
// 计算以后大于等于0说明这笔支付剩余金额需要扣完,还要继续扣下一笔
deductionAmount = balanceAmt;
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.delayMode(payMode)
.build();
resultList.add(build);
} else {
// 如果小于0则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环
deductionAmount = balanceAmt.add(tempAmount);
// 如果小于0则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环
deductionAmount = balanceAmt.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.delayMode(payMode)
.build();
resultList.add(build);
break;
@@ -3036,6 +3038,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 查询余额充值有剩余的记录
List<BalanceDeductionAmountVO> list = calculateTheBalanceDeductionAmount(dto.getMemberId(), chargeAmount);
// 记录流水
if (principalPay != null) {
payRecordList.add(OrderPayRecord.builder()

View File

@@ -24,10 +24,4 @@ public class BalanceDeductionAmountVO {
* 扣除金额
*/
private BigDecimal deductionAmount;
/**
* 该笔支付单的分账方式
* delay表示延时分账其他情况表示实时分账
*/
private String delayMode;
}