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 DiscountQtyTotalQtyCheck extends RuleAction { public static String remark = "买赠数量在订单总数量中的占比不能高于 50%"; public DiscountQtyTotalQtyCheck() { super(); } @Override public void createBoard(OrderCalculator calculator, CheckResult result) { //1. 买赠数量 BigDecimal discountQty = calculator.getDiscountQty(); //2. 订单总数量 BigDecimal totalQty = calculator.getTotalQty(); //3. 计算结果 BigDecimal rate = OrderCalculator.divide(discountQty, totalQty); 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 discountQty = calculator.getDiscountQty(); //2. 订单总数量 BigDecimal totalQty = calculator.getTotalQty(); //3. 计算结果 BigDecimal rate = OrderCalculator.divide(discountQty, totalQty); 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("DiscountQtyTotalQtyCheck", "订单检查不通过:" + meta.getTitle() + value + meta.getUnit()); dataWriter.reportOneError("DiscountQtyTotalQtyCheck", " " + "买赠数量在订单总数量中的占比:" + formatRate(rate)); } if(CheckLevel.Info.equals(meta.getLevel())) { success = true; } return success; } }