delete 计算余额退款方法

This commit is contained in:
Guoqs
2025-12-16 14:47:57 +08:00
parent 88ca676264
commit ae74c73b11

View File

@@ -38,7 +38,6 @@ import org.springframework.beans.factory.annotation.Value;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -800,147 +799,6 @@ public abstract class AbstractProgramLogic implements InitializingBean {
return resultMap;
}
/**
* 余额支付 计算需要退回的金额
* 【公共方法】
*
* @param principalPay 本金支付金额
* @param giftPay 赠送金额支付的金额
* @param orderAmount 订单消费金额
* @param discountAmount 订单折扣金额
* @param insuranceAmount 保险金额
* @return
*/
protected static Map<String, BigDecimal> calculateReturnAmount(BigDecimal principalPay, BigDecimal giftPay, BigDecimal orderAmount, BigDecimal discountAmount, BigDecimal insuranceAmount) {
// 创建返回的Map
Map<String, BigDecimal> refundMap = new HashMap<>();
// 初始化所有返回值为0
refundMap.put("returnPrincipal", BigDecimal.ZERO);
refundMap.put("returnGift", BigDecimal.ZERO);
refundMap.put("returnPrincipalForInsurance", BigDecimal.ZERO);
refundMap.put("returnGiftForInsurance", BigDecimal.ZERO);
// 设置精度为2位小数
RoundingMode roundingMode = RoundingMode.HALF_UP;
int scale = 2;
// 1. 计算总支付金额和电费预付金额
BigDecimal totalPay = principalPay.add(giftPay).setScale(scale, roundingMode);
BigDecimal prepaidElectricity = totalPay.subtract(insuranceAmount).setScale(scale, roundingMode);
// 2. 计算实际电费消费金额(应用折扣)
BigDecimal actualConsume = orderAmount.subtract(discountAmount);
if (actualConsume.compareTo(BigDecimal.ZERO) < 0) {
actualConsume = BigDecimal.ZERO;
}
actualConsume = actualConsume.setScale(scale, roundingMode);
// 3. 计算电费应退款金额
BigDecimal electricityRefund = prepaidElectricity.subtract(actualConsume);
if (electricityRefund.compareTo(BigDecimal.ZERO) < 0) {
electricityRefund = BigDecimal.ZERO;
}
electricityRefund = electricityRefund.setScale(scale, roundingMode);
// 4. 判断保险是否退款(实际电费消费 < 1元时退还保险
BigDecimal insuranceRefund = BigDecimal.ZERO;
boolean isInsuranceRefund = actualConsume.compareTo(new BigDecimal("1.00")) < 0;
if (isInsuranceRefund) {
insuranceRefund = insuranceAmount.setScale(scale, roundingMode);
}
// 5. 计算电费退款中本金和赠金的部分(优先使用本金,退款时优先退回赠金)
BigDecimal remainingElectricityRefund = electricityRefund;
BigDecimal principalUsedForElectricity = BigDecimal.ZERO;
BigDecimal giftUsedForElectricity = BigDecimal.ZERO;
// 5.1 计算本金和赠金在电费预付中的使用情况
if (prepaidElectricity.compareTo(BigDecimal.ZERO) > 0) {
// 本金优先用于支付电费,最多不超过本金总额且不超过电费预付金额
principalUsedForElectricity = principalPay.min(prepaidElectricity);
principalUsedForElectricity = principalUsedForElectricity.setScale(scale, roundingMode);
// 剩余的电费预付由赠金支付
giftUsedForElectricity = prepaidElectricity.subtract(principalUsedForElectricity);
giftUsedForElectricity = giftUsedForElectricity.setScale(scale, roundingMode);
// 5.2 分配电费退款(优先退回赠金)
// 先退赠金支付的部分
if (giftUsedForElectricity.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal giftRefundForElectricity = remainingElectricityRefund.min(giftUsedForElectricity);
giftRefundForElectricity = giftRefundForElectricity.setScale(scale, roundingMode);
refundMap.put("returnGift", giftRefundForElectricity);
remainingElectricityRefund = remainingElectricityRefund.subtract(giftRefundForElectricity);
}
// 剩余的电费退款退回到本金
if (remainingElectricityRefund.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal principalRefundForElectricity = remainingElectricityRefund.min(principalUsedForElectricity);
principalRefundForElectricity = principalRefundForElectricity.setScale(scale, roundingMode);
refundMap.put("returnPrincipal", principalRefundForElectricity);
}
}
// 6. 计算保险退款中本金和赠金的部分
if (insuranceRefund.compareTo(BigDecimal.ZERO) > 0) {
// 计算支付电费后剩余的本金和赠金
BigDecimal remainingPrincipalAfterElectricity = principalPay.subtract(refundMap.get("returnPrincipal"));
BigDecimal remainingGiftAfterElectricity = giftPay.subtract(refundMap.get("returnGift"));
// 保险支付顺序:优先使用剩余本金,不足部分用赠金
BigDecimal principalUsedForInsurance = remainingPrincipalAfterElectricity.min(insuranceAmount);
BigDecimal giftUsedForInsurance = insuranceAmount.subtract(principalUsedForInsurance);
// 保险退款(优先退回赠金部分)
BigDecimal remainingInsuranceRefund = insuranceRefund;
// 先退赠金支付的保险部分
if (giftUsedForInsurance.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal giftRefundForInsurance = remainingInsuranceRefund.min(giftUsedForInsurance);
giftRefundForInsurance = giftRefundForInsurance.setScale(scale, roundingMode);
refundMap.put("returnGiftForInsurance", giftRefundForInsurance);
remainingInsuranceRefund = remainingInsuranceRefund.subtract(giftRefundForInsurance);
}
// 剩余的保险退款退回到本金
if (remainingInsuranceRefund.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal principalRefundForInsurance = remainingInsuranceRefund.min(principalUsedForInsurance);
principalRefundForInsurance = principalRefundForInsurance.setScale(scale, roundingMode);
refundMap.put("returnPrincipalForInsurance", principalRefundForInsurance);
}
}
return refundMap;
}
public static void main(String[] args) {
BigDecimal principalPay = new BigDecimal("30");
BigDecimal giftPay = new BigDecimal("20");
BigDecimal orderAmount = new BigDecimal("0.8");
BigDecimal discountAmount = new BigDecimal("0");
BigDecimal insuranceAmount = new BigDecimal("0.0");
Map<String, BigDecimal> stringBigDecimalMap = calculateReturnAmount(principalPay, giftPay, orderAmount, discountAmount, insuranceAmount);
// 获取各项退款金额
BigDecimal returnPrincipal = stringBigDecimalMap.get("returnPrincipal");
BigDecimal returnGift = stringBigDecimalMap.get("returnGift");
BigDecimal returnPrincipalForInsurance = stringBigDecimalMap.get("returnPrincipalForInsurance");
BigDecimal returnGiftForInsurance = stringBigDecimalMap.get("returnGiftForInsurance");
// 计算总计
BigDecimal electricityRefund = returnPrincipal.add(returnGift);
BigDecimal insuranceRefund = returnPrincipalForInsurance.add(returnGiftForInsurance);
BigDecimal totalRefund = electricityRefund.add(insuranceRefund);
BigDecimal totalPrincipalRefund = returnPrincipal.add(returnPrincipalForInsurance);
BigDecimal totalGiftRefund = returnGift.add(returnGiftForInsurance);
String input = String.format("输入:本金%s元赠金%s元消费%s元折扣%s元保险%s元", principalPay, giftPay, orderAmount, discountAmount, insuranceAmount);
System.out.println(input);
String output = String.format("输出:%s元赠金%s元保险%s元总退款%s元", returnPrincipal, returnGift, returnPrincipalForInsurance, returnGiftForInsurance, totalRefund);
System.out.println(output);
}
/**
* 计算解冻金额
*