package com.ruoyi.order.service.impl;
|
|
import com.ruoyi.other.api.domain.TCoupon;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
|
final class ChargingCouponSupport {
|
private static final BigDecimal TEN = new BigDecimal("10");
|
|
private ChargingCouponSupport() {
|
}
|
|
static BigDecimal calculateUpfrontDiscount(TCoupon coupon, BigDecimal rechargeAmount) {
|
if (coupon == null || rechargeAmount == null || rechargeAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
|
}
|
if (!Integer.valueOf(1).equals(coupon.getType())) {
|
throw new IllegalArgumentException("请选择充电优惠券");
|
}
|
BigDecimal threshold = coupon.getMeetTheConditions() == null
|
? BigDecimal.ZERO : coupon.getMeetTheConditions();
|
if (rechargeAmount.compareTo(threshold) < 0) {
|
throw new IllegalArgumentException("预付金额未达到优惠券使用门槛");
|
}
|
|
BigDecimal discount;
|
if (Integer.valueOf(1).equals(coupon.getPreferentialMode())) {
|
discount = coupon.getDiscountAmount();
|
} else if (Integer.valueOf(2).equals(coupon.getPreferentialMode())) {
|
if (coupon.getDiscount() == null) {
|
throw new IllegalArgumentException("优惠券折扣配置无效");
|
}
|
discount = rechargeAmount.multiply(TEN.subtract(coupon.getDiscount()))
|
.divide(TEN, 2, RoundingMode.HALF_UP);
|
if (coupon.getMaximumDiscountAmount() != null) {
|
discount = discount.min(coupon.getMaximumDiscountAmount());
|
}
|
} else {
|
throw new IllegalArgumentException("优惠券优惠方式无效");
|
}
|
if (discount == null || discount.compareTo(BigDecimal.ZERO) <= 0) {
|
throw new IllegalArgumentException("优惠券优惠金额无效");
|
}
|
return discount.min(rechargeAmount).setScale(2, RoundingMode.HALF_UP);
|
}
|
}
|