package policy.rule.action; import java.math.BigDecimal; import foundation.dao.DataWriter; import policy.OrderEvent; import policy.rule.CheckLevel; import policy.rule.CheckResult; import policy.rule.OrderCalculator; import policy.rule.RuleAction; public class OnsiteAmtTotalAmtRateCheck extends RuleAction { public static String remark = "即时价格折扣金额在订单总金额中的占比不能高于50%"; public OnsiteAmtTotalAmtRateCheck() { super(); } @Override public void createBoard(OrderCalculator calculator, CheckResult result) { //1. 即时价格折扣金额 BigDecimal discountAmt = calculator.getOnsiteAmt(); //2. 订单总金额(折扣前) BigDecimal listAmt = calculator.getListAmt(); //3. 计算结果 BigDecimal rate = OrderCalculator.divide(discountAmt, listAmt); boolean success = rate.compareTo(meta.getRateValue()) <= 0; result.setSuccess(success); if (!success) { result.writeOneRemark("即时价格折扣金额在订单总金额中的占比:" + formatRate(rate)); } } @Override public boolean check(OrderCalculator calculator, OrderEvent event, DataWriter dataWriter) { //1. 即时价格折扣金额 BigDecimal discountAmt = calculator.getOnsiteAmt(); //2. 订单总金额(折扣前) BigDecimal listAmt = calculator.getListAmt(); //3. 计算结果 BigDecimal rate = OrderCalculator.divide(discountAmt, listAmt); boolean success = rate.compareTo(meta.getRateValue()) <= 0; BigDecimal value = meta.getValue(); if(value == null ) { value = BigDecimal.ZERO; } value = value.setScale(2, BigDecimal.ROUND_HALF_UP); if (!success) { dataWriter.reportOneError("OnsiteAmtTotalAmtRateCheck", "订单检查不通过:" + meta.getTitle() + value + meta.getUnit()); dataWriter.reportOneError("OnsiteAmtTotalAmtRateCheck", " " + "即时价格折扣金额在总金额中的占比:" + formatRate(rate)); } if(CheckLevel.Info.equals(meta.getLevel())) { success = true; } return success; } }