mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-21 11:35:12 +08:00
update 计算解冻金额逻辑
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user