update 计算解冻金额逻辑

This commit is contained in:
2023-08-31 18:35:16 +08:00
parent 083f078069
commit 02929edd8b
3 changed files with 107 additions and 48 deletions

View File

@@ -96,7 +96,22 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService
@Override
public void unfreezeAmount(String paymentId, BigDecimal unfreezeAmount) {
log.info("解冻金额, paymentId:{}, 解冻金额:{}", paymentId, unfreezeAmount);
commonUpdateAmountMethod(paymentId, null, null, unfreezeAmount.negate());
// commonUpdateAmountMethod(paymentId, null, null, unfreezeAmount.negate());
MemberAdapayRecord record = selectByPaymentId(paymentId);
if (record == null) {
log.info("更新交易记录的消费金额和退款金额paymentId:{}, 查询为空", paymentId);
return;
}
// 此时数据库中的值
BigDecimal spendAmt = record.getSpendAmt();
BigDecimal refundAmt = record.getRefundAmt();
BigDecimal freezeAmt = record.getFreezeAmt();
BigDecimal balanceAmt = record.getBalanceAmt();
// 更新解冻金额 = 目前冻结的金额 - 需要解冻的金额
record.setFreezeAmt(record.getFreezeAmt().subtract(unfreezeAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 - 累计冻结金额
balanceAmt = record.getPayAmt().subtract(refundAmt).subtract(spendAmt).subtract(freezeAmt);
record.setBalanceAmt(balanceAmt);
}
/**

View File

@@ -65,7 +65,6 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -1156,16 +1155,19 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 查支付记录
List<OrderPayRecord> payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
Map<String, OrderPayRecord> payRecordMap = payRecordList.stream()
.collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1));
// 取出本金支付金额
BigDecimal principalPay = null;
// Map<String, OrderPayRecord> payRecordMap = payRecordList.stream()
// .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1));
Map<String, List<OrderPayRecord>> payRecordMap = payRecordList.stream().collect(Collectors.groupingBy(OrderPayRecord::getPayMode));
// 获取本金支付的记录
OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE);
if (principalPayRecord != null) {
principalPay = principalPayRecord.getPayAmount();
}
List<OrderPayRecord> orderPayRecordList = payRecordMap.get(Constants.ONE);
BigDecimal principalPay = orderPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
// 取出本金支付金额
// BigDecimal principalPay = null;
// if (principalPayRecord != null) {
// principalPay = principalPayRecord.getPayAmount();
// }
// 计算需要退回的金额
Map<String, BigDecimal> returnAmountMap = calculateReturnAmount(principalPay, null, orderAmount);
@@ -1194,6 +1196,43 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
}
}
// public List<Map<String, Object>> calculateUnfreezeAmountOld(BigDecimal orderAmount, List<OrderPayRecord> payRecordList) {
// List<Map<String, Object>> resultList = Lists.newArrayList();
//
// BigDecimal tempAmount = new BigDecimal(orderAmount.toString()); // 临时金额
// for (OrderPayRecord record : payRecordList) {
// JSONObject jsonObject = JSON.parseObject(record.getDeductionRecord());
// String paymentId = jsonObject.getString("paymentId");
// // BigDecimal amount = jsonObject.getBigDecimal("amount");
// BigDecimal payAmount = record.getPayAmount(); // 此交易单支付的金额
// // 该笔支付扣除金额
// BigDecimal deductionAmount;
// // 该笔支付解冻金额
// BigDecimal unfreezeAmount = null;
// // 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额
// tempAmount = tempAmount.subtract(payAmount);
// if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
// // 计算以后大于等于0说明这笔支付剩余金额需要扣完还要继续扣下一笔
// deductionAmount = payAmount;
// unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额
// Map<String, Object> map = Maps.newHashMap();
// map.put("paymentId", paymentId);
// map.put("unfreezeAmount", unfreezeAmount);
// resultList.add(map);
// } else {
// // 如果小于0则说明该笔交易的剩余金额用不完扣除金额等于临时消费金额并结束循环
// deductionAmount = payAmount.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
// unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额
// Map<String, Object> map = Maps.newHashMap();
// map.put("paymentId", paymentId);
// map.put("unfreezeAmount", unfreezeAmount);
// resultList.add(map);
// // break;
// }
// }
// return resultList;
// }
/**
* 计算解冻金额
* @param orderAmount 订单消费金额
@@ -1202,36 +1241,41 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
@Override
public List<Map<String, Object>> calculateUnfreezeAmount(BigDecimal orderAmount, List<OrderPayRecord> payRecordList) {
List<Map<String, Object>> resultList = Lists.newArrayList();
BigDecimal tempAmount = new BigDecimal(orderAmount.toString()); // 临时金额
for (OrderPayRecord record : payRecordList) {
JSONObject jsonObject = JSON.parseObject(record.getDeductionRecord());
String paymentId = jsonObject.getString("paymentId");
// BigDecimal amount = jsonObject.getBigDecimal("amount");
String paymentId = jsonObject.getString("paymentId"); // 交易流水号
BigDecimal payAmount = record.getPayAmount(); // 此交易单支付的金额
// 该笔支付扣除金额
BigDecimal deductionAmount;
// 该笔支付解冻金额
BigDecimal unfreezeAmount = null;
// 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额
tempAmount = tempAmount.subtract(payAmount);
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
// 计算以后大于等于0说明这笔支付剩余金额需要扣完还要继续扣下一笔
deductionAmount = payAmount;
unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额
if (BigDecimal.ZERO.compareTo(tempAmount) >= 0) {
Map<String, Object> map = Maps.newHashMap();
map.put("paymentId", paymentId);
map.put("unfreezeAmount", unfreezeAmount);
map.put("unfreezeAmount", payAmount);
resultList.add(map);
} else {
// 如果小于0则说明该笔交易的剩余金额用不完扣除金额等于临时消费金额并结束循环
deductionAmount = payAmount.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额
Map<String, Object> map = Maps.newHashMap();
map.put("paymentId", paymentId);
map.put("unfreezeAmount", unfreezeAmount);
resultList.add(map);
break;
// 该笔支付扣除金额
BigDecimal deductionAmount;
// 该笔支付解冻金额
BigDecimal unfreezeAmount = null;
// 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额
tempAmount = tempAmount.subtract(payAmount);
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
// 计算以后大于等于0说明这笔支付剩余金额需要扣完还要继续扣下一笔
deductionAmount = payAmount;
unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额
Map<String, Object> map = Maps.newHashMap();
map.put("paymentId", paymentId);
map.put("unfreezeAmount", unfreezeAmount);
resultList.add(map);
} else {
// 如果小于0则说明该笔交易的剩余金额用不完扣除金额等于临时消费金额并结束循环
deductionAmount = payAmount.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额
Map<String, Object> map = Maps.newHashMap();
map.put("paymentId", paymentId);
map.put("unfreezeAmount", unfreezeAmount);
resultList.add(map);
}
}
}
return resultList;