fix: whitelist refund split by benefit type 1/2/3, align realtime & compensation settlement
| | |
| | | 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() { |
| | | } |
| | |
| | | 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}; |
| | | } |
| | | |
| | |
| | | |
| | | 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; |
| | |
| | | * @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); |
| | | } |
| | |
| | | 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; |
| | |
| | | @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; |
| | |
| | | * @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); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | @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]); |
| | |
| | | |
| | | @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); |