package biz.policy.rule.action;
|
|
import java.util.HashMap;
|
import java.util.Map.Entry;
|
|
import biz.policy.OrderEvent;
|
import biz.policy.price.PackageLine;
|
import biz.policy.price.PackagePolicy;
|
import biz.policy.price.PolicyBucket;
|
import biz.policy.rule.CheckLevel;
|
import biz.policy.rule.CheckResult;
|
import biz.policy.rule.OrderCalculator;
|
import biz.policy.rule.RuleAction;
|
import foundation.dao.DataWriter;
|
import foundation.util.ContentBuilder;
|
import foundation.util.MapList;
|
|
public class PackageLineQtyCheck extends RuleAction {
|
|
public static String remark = "套包倍数检查";
|
|
public PackageLineQtyCheck() {
|
super();
|
}
|
|
@Override
|
public void createBoard(OrderCalculator calculator, CheckResult result) {
|
String packageId;
|
boolean success = true;
|
ContentBuilder builder = new ContentBuilder(";\r\n");
|
|
//1. 获取订单各套包数量
|
HashMap<String, PackagePolicy> packageList = calculator.getPackages();
|
|
//2. 套包行数量检查
|
for (Entry<String, PackagePolicy> onePackage : packageList.entrySet()) {
|
packageId = onePackage.getKey();
|
ContentBuilder linesBuilder = new ContentBuilder(";\r\n");
|
|
// 获取套包政策,明细
|
PolicyBucket policyBucket = PolicyBucket.getInstance();
|
PackagePolicy packagePolicy = policyBucket.getPackagePolicy(packageId);
|
MapList<String, PackageLine> lines = packagePolicy.getLines();
|
|
// 获取订单套包, 明细
|
PackagePolicy orderPackage = onePackage.getValue();
|
int packageQty = orderPackage.getMaxQty();
|
MapList<String, PackageLine> orderPackageLines = orderPackage.getLines();
|
|
|
//2.1 检查行数量, 计算距离最大套包还差的数量
|
for (PackageLine packageLine : lines) {
|
String packageLineId = packageLine.getId();
|
PackageLine orderPackageLine = orderPackageLines.get(packageLineId);
|
|
int orderPackageLineQty = 0;
|
|
if (orderPackageLine != null) {
|
orderPackageLineQty = orderPackageLine.getQty();
|
}
|
|
int diff = packageQty * packageLine.getQty() - orderPackageLineQty;
|
|
if (diff > 0) {
|
success = false;
|
linesBuilder.append("【" + packageLine.getProductName() + "】数量为" + packageLine.getQty() + ", 购买数量为" + orderPackageLineQty);
|
}
|
}
|
|
if (!linesBuilder.isEmpty()) {
|
builder.append("套包【" + packagePolicy.getCode() + "】:" + linesBuilder.toString());
|
}
|
|
}
|
|
result.setSuccess(success);
|
|
if (!success) {
|
result.writeOneRemark("购买套包内的产品需是单套包内产品数量的倍数:" + builder.toString());
|
}
|
}
|
|
@Override
|
public boolean check(OrderCalculator calculator, OrderEvent event, DataWriter dataWriter) {
|
String packageId;
|
boolean success = true;
|
ContentBuilder builder = new ContentBuilder(";\r\n");
|
|
//1. 获取订单各套包数量
|
HashMap<String, PackagePolicy> packageList = calculator.getPackages();
|
|
//2. 套包行数量检查
|
for (Entry<String, PackagePolicy> onePackage : packageList.entrySet()) {
|
packageId = onePackage.getKey();
|
ContentBuilder linesBuilder = new ContentBuilder(";\r\n");
|
|
// 获取套包政策,明细
|
PolicyBucket policyBucket = PolicyBucket.getInstance();
|
PackagePolicy packagePolicy = policyBucket.getPackagePolicy(packageId);
|
MapList<String, PackageLine> lines = packagePolicy.getLines();
|
|
// 获取订单套包, 明细
|
PackagePolicy orderPackage = onePackage.getValue();
|
int packageQty = orderPackage.getPackageQty();
|
MapList<String, PackageLine> orderPackageLines = orderPackage.getLines();
|
|
|
//2.1 检查行数量, 计算距离最大套包还差的数量
|
for (PackageLine packageLine : lines) {
|
String packageLineId = packageLine.getId();
|
PackageLine orderPackageLine = orderPackageLines.get(packageLineId);
|
|
int orderPackageLineQty = 0;
|
|
if (orderPackageLine != null) {
|
orderPackageLineQty = orderPackageLine.getQty()*packageQty;
|
}
|
|
int diff = packageQty * packageLine.getQty() - orderPackageLineQty;
|
|
if (diff > 0) {
|
success = false;
|
linesBuilder.append(" 【" + packageLine.getProductName() + "】数量为 " + packageLine.getQty() + ",购买数量为" + orderPackageLineQty);
|
}
|
}
|
|
builder.append(" 套包【" + packagePolicy.getCode() + "】共" + packageQty + "套");
|
builder.append(linesBuilder.toString());
|
}
|
|
if (!success) {
|
if(CheckLevel.Info.equals(meta.getLevel())) {
|
dataWriter.reportOneAlert("PackageLineQtyCheck", "订单检查不通过:" + meta.getTitle());
|
dataWriter.reportOneAlert("PackageLineQtyCheck", builder.toString());
|
|
return true;
|
}
|
else {
|
dataWriter.reportOneError("PackageLineQtyCheck", "订单检查不通过:" + meta.getTitle());
|
dataWriter.reportOneError("PackageLineQtyCheck", builder.toString());
|
}
|
}
|
|
return success;
|
}
|
|
}
|