puzhibing
2026-08-19 305b30ac8e80e547562586a9f71df06245ec76fb
fix: whitelist refund split by benefit type 1/2/3, align realtime & compensation settlement
4个文件已修改
83 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingCouponSupport.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingCouponSupportTest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargingCouponSupport.java
@@ -5,8 +5,11 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
final class ChargingCouponSupport {
public final class ChargingCouponSupport {
    private static final BigDecimal TEN = new BigDecimal("10");
    private static final int WHITELIST_BENEFIT_ALL_FREE = 1;
    private static final int WHITELIST_BENEFIT_ELECTRIC_FREE = 2;
    private static final int WHITELIST_BENEFIT_SERVICE_FREE = 3;
    private ChargingCouponSupport() {
    }
@@ -64,15 +67,23 @@
        return discount.max(BigDecimal.ZERO).min(serviceCharge).setScale(4, RoundingMode.HALF_EVEN);
    }
    static BigDecimal[] calculateWhitelistRefundSplit(boolean whitelistOrder,
                                                       boolean whitelistAllFree,
                                                       BigDecimal electrovalence,
                                                       BigDecimal serviceCharge) {
    public static BigDecimal[] calculateWhitelistRefundSplitByBenefitType(boolean whitelistOrder,
                                                                          Integer whitelistBenefitType,
                                                             BigDecimal electrovalence,
                                                             BigDecimal serviceCharge) {
        BigDecimal electricDiscount = BigDecimal.ZERO;
        BigDecimal serviceDiscount = BigDecimal.ZERO;
        if (!whitelistOrder) {
            return new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO};
            return new BigDecimal[]{electricDiscount, serviceDiscount};
        }
        BigDecimal electricDiscount = whitelistAllFree ? money(electrovalence) : BigDecimal.ZERO;
        BigDecimal serviceDiscount = money(serviceCharge);
        if (Integer.valueOf(WHITELIST_BENEFIT_ALL_FREE).equals(whitelistBenefitType)) {
            electricDiscount = money(electrovalence);
            serviceDiscount = money(serviceCharge);
        } else if (Integer.valueOf(WHITELIST_BENEFIT_ELECTRIC_FREE).equals(whitelistBenefitType)) {
            electricDiscount = money(electrovalence);
        } else if (Integer.valueOf(WHITELIST_BENEFIT_SERVICE_FREE).equals(whitelistBenefitType)) {
            serviceDiscount = money(serviceCharge);
        }
        return new BigDecimal[]{electricDiscount, serviceDiscount};
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -136,8 +136,6 @@
    private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
    private static final int WHITELIST_BENEFIT_ALL_FREE = 1;
    private static final int WHITELIST_BENEFIT_ELECTRIC_FREE = 2;
    private static final int WHITELIST_BENEFIT_SERVICE_FREE = 3;
    private static final String SHARE_AFTER_COMMIT_RESOURCE_PREFIX = "chargingOrderShareAfterCommit:";
    private static final String SPECIAL_REFUND_TITLE = "特殊退款处理";
    private static final int RESERVATION_RECOMMENDATION_HISTORY_DAYS = 30;
@@ -774,9 +772,9 @@
     * @return 数组下标0=电费减免,下标1=服务费减免
     */
    private BigDecimal[] calculateWhitelistRefundSplit(TChargingOrder chargingOrder, BigDecimal electrovalence, BigDecimal serviceCharge) {
        return ChargingCouponSupport.calculateWhitelistRefundSplit(
        return ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType(
                isWhitelistOrder(chargingOrder),
                isWhitelistAllFreeOrder(chargingOrder),
                chargingOrder == null ? null : chargingOrder.getWhitelistBenefitType(),
                electrovalence,
                serviceCharge);
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -28,6 +28,7 @@
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
import com.ruoyi.order.service.*;
import com.ruoyi.order.service.impl.ChargingCouponSupport;
import com.ruoyi.order.util.mongodb.service.TransactionRecordService;
import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.other.api.domain.TCoupon;
@@ -82,8 +83,6 @@
@Component
public class TaskUtil implements ApplicationListener<WebServerInitializedEvent> {
    private static final int WHITELIST_BENEFIT_ALL_FREE = 1;
    private static final int WHITELIST_BENEFIT_ELECTRIC_FREE = 2;
    private static final int WHITELIST_BENEFIT_SERVICE_FREE = 3;
    @Resource
    private TChargingBillService chargingBillService;
@@ -238,20 +237,11 @@
     * @return 数组下标0=电费减免,下标1=服务费减免
     */
    private BigDecimal[] calculateWhitelistRefundSplit(TChargingOrder order, BigDecimal electrovalence, BigDecimal serviceCharge) {
        BigDecimal electricDiscount = BigDecimal.ZERO;
        BigDecimal serviceDiscount = BigDecimal.ZERO;
        if (!isWhitelistOrder(order)) {
            return new BigDecimal[]{electricDiscount, serviceDiscount};
        }
        if (Integer.valueOf(WHITELIST_BENEFIT_ALL_FREE).equals(order.getWhitelistBenefitType())) {
            electricDiscount = electrovalence == null ? BigDecimal.ZERO : electrovalence;
            serviceDiscount = serviceCharge == null ? BigDecimal.ZERO : serviceCharge;
        } else if (Integer.valueOf(WHITELIST_BENEFIT_ELECTRIC_FREE).equals(order.getWhitelistBenefitType())) {
            electricDiscount = electrovalence == null ? BigDecimal.ZERO : electrovalence;
        } else if (Integer.valueOf(WHITELIST_BENEFIT_SERVICE_FREE).equals(order.getWhitelistBenefitType())) {
            serviceDiscount = serviceCharge == null ? BigDecimal.ZERO : serviceCharge;
        }
        return new BigDecimal[]{electricDiscount, serviceDiscount};
        return ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType(
                isWhitelistOrder(order),
                order == null ? null : order.getWhitelistBenefitType(),
                electrovalence,
                serviceCharge);
    }
    /**
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/service/impl/ChargingCouponSupportTest.java
@@ -66,9 +66,18 @@
    }
    @Test
    void nonFullWhitelistOnlyWaivesServiceCharge() {
        BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplit(
                true, false, new BigDecimal("10"), new BigDecimal("5"));
    void electricFreeWhitelistOnlyWaivesElectricity() {
        BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType(
                true, 2, new BigDecimal("10"), new BigDecimal("5"));
        assertEquals(new BigDecimal("10"), split[0]);
        assertEquals(BigDecimal.ZERO, split[1]);
    }
    @Test
    void serviceFreeWhitelistOnlyWaivesServiceCharge() {
        BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType(
                true, 3, new BigDecimal("10"), new BigDecimal("5"));
        assertEquals(BigDecimal.ZERO, split[0]);
        assertEquals(new BigDecimal("5"), split[1]);
@@ -76,13 +85,22 @@
    @Test
    void fullWhitelistWaivesElectricityAndServiceCharge() {
        BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplit(
                true, true, new BigDecimal("10"), new BigDecimal("5"));
        BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType(
                true, 1, new BigDecimal("10"), new BigDecimal("5"));
        assertEquals(new BigDecimal("10"), split[0]);
        assertEquals(new BigDecimal("5"), split[1]);
    }
    @Test
    void nonWhitelistDoesNotReceiveWhitelistRefund() {
        BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType(
                false, 2, new BigDecimal("10"), new BigDecimal("5"));
        assertEquals(BigDecimal.ZERO, split[0]);
        assertEquals(BigDecimal.ZERO, split[1]);
    }
    private TCoupon chargingCoupon(int preferentialMode) {
        TCoupon coupon = new TCoupon();
        coupon.setType(1);