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 RebateAmtTotalAmtRateCheck extends RuleAction { public static String remark = "积分池使用金额在订单总金额中的占比不能高于20%"; public RebateAmtTotalAmtRateCheck() { super(); } @Override public void createBoard(OrderCalculator calculator, CheckResult result) { //1. 折扣池(票折)金额 BigDecimal rebateAmt = calculator.getRebateAmt(); //2. 订单总金额(折扣前) BigDecimal afterDiscountAmt = calculator.getAfterOnsiteAmt(); //3. 计算结果 BigDecimal rate = OrderCalculator.divide(rebateAmt, afterDiscountAmt); 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 rebateAmt = calculator.getRebateAmt(); //2. 订单总金额(折扣前) BigDecimal afterDiscountAmt = calculator.getAfterOnsiteAmt(); //3. 计算结果 BigDecimal rate = OrderCalculator.divide(rebateAmt, afterDiscountAmt); 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("RebateAmtTotalAmtRateCheck", "订单检查不通过:" + meta.getTitle() + value + meta.getUnit()); dataWriter.reportOneError("RebateAmtTotalAmtRateCheck", "积分池使用金额在订单总金额中的占比:" + formatRate(rate)); } if(CheckLevel.Info.equals(meta.getLevel())) { success = true; } return success; } }