diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java index 4e7f31b9b..a31e7ea0b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java @@ -957,26 +957,17 @@ public abstract class AbstractProgramLogic implements InitializingBean { // 尖时段用电量 BigDecimal sharpUsedElectricity = orderDetail.getSharpUsedElectricity(); if (sharpUsedElectricity != null) { - // 计算该时段电费单价 - BigDecimal electricityPrice = billingTemplateVO.getSharpElectricityPrice(); + // 该时段电费单价与orderDetail中的电价比较取最小值 + // BigDecimal electricityPrice = billingTemplateVO.getSharpElectricityPrice(); + BigDecimal electricityPrice = getMinWithPositiveConstraint(billingTemplateVO.getSharpElectricityPrice(), orderDetail.getSharpElectricityPrice()); // 计算该时段电费 = 电费单价 x 用电量 - BigDecimal electricityAmount = BigDecimal.ZERO; - // 如果优惠模板电价低于orderDetail快照中的电价则计算优惠金额 - if (electricityPrice.compareTo(orderDetail.getSharpElectricityPrice()) < 0) { - // 计算该时段电费优惠金额 = 优惠前电费 - 优惠后电费 - electricityAmount = electricityPrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN); - } + BigDecimal electricityAmount = electricityPrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN); - - // 计算该时段服务费单价 - BigDecimal servicePrice = billingTemplateVO.getSharpServicePrice(); + // 该时段服务费单价与orderDetail中的服务费比较取最小值 + // BigDecimal servicePrice = billingTemplateVO.getSharpServicePrice(); + BigDecimal servicePrice = getMinWithPositiveConstraint(billingTemplateVO.getSharpServicePrice(), orderDetail.getSharpServicePrice()); // 计算该时段服务费 - BigDecimal serviceAmount = BigDecimal.ZERO; - // 如果优惠模板中服务费低于orderDetail快照中的服务费价则计算优惠金额 - if (servicePrice.compareTo(orderDetail.getSharpServicePrice()) < 0) { - // 计算该时段服务费优惠金额 = 优惠前服务费 - 优惠后服务费 - serviceAmount = servicePrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN); - } + BigDecimal serviceAmount = servicePrice.multiply(sharpUsedElectricity).setScale(2, RoundingMode.DOWN); // 汇总 afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(electricityAmount); @@ -988,24 +979,14 @@ public abstract class AbstractProgramLogic implements InitializingBean { BigDecimal peakUsedElectricity = orderDetail.getPeakUsedElectricity(); if (peakUsedElectricity != null) { // 计算该时段电费单价 - BigDecimal electricityPrice = billingTemplateVO.getPeakElectricityPrice(); + BigDecimal electricityPrice = getMinWithPositiveConstraint(billingTemplateVO.getPeakElectricityPrice(), orderDetail.getPeakElectricityPrice()); // 计算该时段电费 = 电费单价 x 用电量 - BigDecimal electricityAmount = BigDecimal.ZERO; - // 如果优惠模板电价低于orderDetail快照中的电价则计算优惠金额 - if (electricityPrice.compareTo(orderDetail.getPeakElectricityPrice()) < 0) { - // 计算该时段电费优惠金额 = 优惠前电费 - 优惠后电费 - electricityAmount = electricityPrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN); - } + BigDecimal electricityAmount = electricityPrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN); // 计算该时段服务费 - BigDecimal servicePrice = billingTemplateVO.getPeakServicePrice(); + BigDecimal servicePrice = getMinWithPositiveConstraint(billingTemplateVO.getPeakServicePrice(), orderDetail.getPeakServicePrice()); // 计算该时段服务费 = 服务费单价 x 用电量 - BigDecimal serviceAmount = BigDecimal.ZERO; - // 如果优惠模板中服务费低于orderDetail快照中的服务费价则计算优惠金额 - if (servicePrice.compareTo(orderDetail.getPeakServicePrice()) < 0) { - // 计算该时段服务费优惠金额 = 优惠前服务费 - 优惠后服务费 - serviceAmount = servicePrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN); - } + BigDecimal serviceAmount = servicePrice.multiply(peakUsedElectricity).setScale(2, RoundingMode.DOWN); // 汇总 afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(electricityAmount); @@ -1016,25 +997,14 @@ public abstract class AbstractProgramLogic implements InitializingBean { BigDecimal flatUsedElectricity = orderDetail.getFlatUsedElectricity(); if (flatUsedElectricity != null) { // 计算该时段电费单价 - BigDecimal electricityPrice = billingTemplateVO.getFlatElectricityPrice(); + BigDecimal electricityPrice = getMinWithPositiveConstraint(billingTemplateVO.getFlatElectricityPrice(), orderDetail.getFlatElectricityPrice()); // 计算该时段电费 = 电费单价 x 用电量 - BigDecimal electricityAmount = BigDecimal.ZERO; - // 如果优惠模板电价低于orderDetail快照中的电价则计算优惠金额 - if (electricityPrice.compareTo(orderDetail.getFlatElectricityPrice()) < 0) { - // 计算该时段电费优惠金额 = 优惠前电费 - 优惠后电费 - electricityAmount = electricityPrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN); - } - + BigDecimal electricityAmount = electricityPrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN); // 计算该时段服务费单价 - BigDecimal servicePrice = billingTemplateVO.getFlatServicePrice(); + BigDecimal servicePrice = getMinWithPositiveConstraint(billingTemplateVO.getFlatServicePrice(), orderDetail.getFlatServicePrice()); // 计算该时段服务费 - BigDecimal serviceAmount = BigDecimal.ZERO; - // 如果优惠模板中服务费低于orderDetail快照中的服务费价则计算优惠金额 - if (servicePrice.compareTo(orderDetail.getFlatServicePrice()) < 0) { - // 计算该时段服务费优惠金额 = 优惠前服务费 - 优惠后服务费 - serviceAmount = servicePrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN); - } + BigDecimal serviceAmount = servicePrice.multiply(flatUsedElectricity).setScale(2, RoundingMode.DOWN); // 汇总 afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(electricityAmount); @@ -1045,24 +1015,14 @@ public abstract class AbstractProgramLogic implements InitializingBean { BigDecimal valleyUsedElectricity = orderDetail.getValleyUsedElectricity(); if (valleyUsedElectricity != null) { // 计算该时段电费单价 - BigDecimal electricityPrice = billingTemplateVO.getValleyElectricityPrice(); + BigDecimal electricityPrice = getMinWithPositiveConstraint(billingTemplateVO.getValleyElectricityPrice(), orderDetail.getValleyElectricityPrice()); // 计算该时段电费 = 电费单价 x 用电量 - BigDecimal electricityAmount = BigDecimal.ZERO; - // 如果优惠模板电价低于orderDetail快照中的电价则计算优惠金额 - if (electricityPrice.compareTo(orderDetail.getValleyElectricityPrice()) < 0) { - // 计算该时段电费优惠金额 = 优惠前电费 - 优惠后电费 - electricityAmount = electricityPrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN); - } + BigDecimal electricityAmount = electricityPrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN); // 计算该时段服务费单价 - BigDecimal servicePrice = billingTemplateVO.getValleyServicePrice(); + BigDecimal servicePrice = getMinWithPositiveConstraint(billingTemplateVO.getValleyServicePrice(), orderDetail.getValleyServicePrice()); // 计算该时段服务费 - BigDecimal serviceAmount = BigDecimal.ZERO; - // 如果优惠模板中服务费低于orderDetail快照中的服务费价则计算优惠金额 - if (servicePrice.compareTo(orderDetail.getValleyServicePrice()) < 0) { - // 计算该时段服务费优惠金额 = 优惠前服务费 - 优惠后服务费 - serviceAmount = servicePrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN); - } + BigDecimal serviceAmount = servicePrice.multiply(valleyUsedElectricity).setScale(2, RoundingMode.DOWN); // 汇总 afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(electricityAmount); @@ -1108,6 +1068,26 @@ public abstract class AbstractProgramLogic implements InitializingBean { orderCode, memberId, discountAmount, electricityAmountDiscount, serviceAmountDiscount, totalConsumeAmount); } + /** + * 获取较小值,并且满足大于0的条件 + * @param num1 + * @param num2 + * @return + */ + private BigDecimal getMinWithPositiveConstraint(BigDecimal num1, BigDecimal num2) { + BigDecimal valid1 = num1.compareTo(BigDecimal.ZERO) > 0 ? num1 : null; + BigDecimal valid2 = num2.compareTo(BigDecimal.ZERO) > 0 ? num2 : null; + + if (valid1 == null && valid2 == null) { + throw new IllegalArgumentException("两个值均不满足大于0的条件"); + } + + if (valid1 == null) return valid2; + if (valid2 == null) return valid1; + + return valid1.compareTo(valid2) < 0 ? valid1 : valid2; + } + /** * 计算余额支付下发金额 * xixiao在用