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;
|
}
|
}
|