package biz.target;
|
|
import java.math.BigDecimal;
|
import java.util.Set;
|
import java.util.Map.Entry;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.dao.DataReader;
|
import foundation.dao.IDataLetter;
|
import foundation.dao.SyncDirection;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.entity.Filter;
|
import foundation.data.object.DataObject;
|
import foundation.data.object.EntitySaver;
|
import foundation.json.IJSONWriter;
|
import foundation.json.JObjectReader;
|
import foundation.json.JType;
|
import foundation.persist.SQLRunner;
|
import foundation.preload.Node;
|
import foundation.state.MachineBucket;
|
import foundation.state.State;
|
import foundation.state.StateMachine;
|
import foundation.token.IOnlineUser;
|
import foundation.util.ContentBuilder;
|
import foundation.util.MapList;
|
import foundation.util.Util;
|
|
public class PositionTarget extends Node {
|
private String targetId;
|
private String planningId;
|
private String positionId;
|
private String parentPositionId;
|
private Entity target;
|
private BigDecimal finalQty;
|
private BigDecimal finalAmt;
|
private BigDecimal gapQty;
|
private BigDecimal gapAmt;
|
private MapList<String, PositionCustomerTarget> customerSet;
|
private MapList<String, PositionProductTarget> productSet;
|
private MapList<String, PositionSkuTarget> skuSet;
|
private EntitySet detailSet;
|
private boolean positionSync;
|
private boolean customerSync;
|
private boolean productSync;
|
private boolean skuSync;
|
private boolean detailSync;
|
|
protected static Logger logger;
|
|
static {
|
logger = LogManager.getLogger(Entity.class);
|
}
|
|
public PositionTarget() {
|
activeLoad();
|
customerSet = new MapList<String, PositionCustomerTarget>();
|
productSet = new MapList<String, PositionProductTarget>();
|
skuSet = new MapList<String, PositionSkuTarget>();
|
}
|
|
public void activeLoad() {
|
this.positionSync = false;
|
this.customerSync = false;
|
this.productSync = false;
|
this.detailSync = false;
|
}
|
|
public void load(Entity entity) throws Exception {
|
target = entity;
|
targetId = entity.getId();
|
planningId = entity.getString("planning_id");
|
positionId = entity.getString("position_id");
|
parentPositionId = entity.getString("parent_position_id");
|
finalQty = entity.getBigDecimal("final_qty", BigDecimal.ZERO);
|
finalAmt = entity.getBigDecimal("final_amt", BigDecimal.ZERO);
|
gapQty = BigDecimal.ZERO;
|
gapAmt = BigDecimal.ZERO;
|
|
positionSync = true;
|
|
syncDetail(SyncDirection.fromDB);
|
|
for (String customerId : customerSet.getKeySet()) {
|
syncCustomer(SyncDirection.fromDB, customerId);
|
}
|
customerSync = true;
|
//
|
// for (String productId : productSet.getKeySet()) {
|
// syncProduct(SyncDirection.fromDB, productId);
|
// }
|
productSync = true;
|
|
for (String skuId : skuSet.getKeySet()) {
|
syncSku(SyncDirection.fromDB, skuId);
|
}
|
skuSync = true;
|
}
|
|
public void syncPosition(SyncDirection direction) throws Exception {
|
if (positionSync) {
|
return ;
|
}
|
|
TargetType type = TargetType.Position;
|
DataObject dataObject = DataObject.getInstance(type.getTableName());
|
Entity positionTarget = dataObject.getTableEntity(targetId);
|
|
if (direction == SyncDirection.fromDB) {
|
load(positionTarget);
|
}
|
else if (direction == SyncDirection.toDB) {
|
EntitySaver saver = dataObject.createEntitySaver(positionTarget);
|
saver.set(this.target);
|
saver.update();
|
}
|
|
positionSync = true;
|
}
|
|
private void syncCustomer(SyncDirection direction, String customerId) throws Exception {
|
if (customerSync) {
|
return ;
|
}
|
|
TargetType type = TargetType.Customer;
|
|
if (direction == SyncDirection.fromDB) {
|
DataObject dataObject = DataObject.getInstance(type.getTableName());
|
Filter filter = new Filter();
|
filter.add("planning_position_id", targetId);
|
filter.add("customer_id", customerId);
|
Entity customerTarget = dataObject.getBrowseEntity(filter);
|
PositionCustomerTarget target = customerSet.get(customerId);
|
target.load(customerTarget);
|
customerSet.add(customerId, target);
|
// for (Entity customer : customerTargetSet) {
|
// PositionCustomerTarget target = new PositionCustomerTarget();
|
// target.load(customer);
|
// customerSet.add(target.getCustomerId(), target);
|
// }
|
}
|
else if (direction == SyncDirection.toDB) {
|
SQLRunner.beginTrans();
|
|
try {
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
|
if (!Util.isEmpty(customerId)) {
|
PositionCustomerTarget customerTarget = target.getCustomerDetail(customerId);
|
|
if (customerTarget != null) {
|
customerTarget.save();
|
}
|
}
|
else {
|
for (PositionCustomerTarget customerTarget : customerSet) {
|
customerTarget.save();
|
}
|
}
|
}
|
}
|
catch (Exception e) {
|
SQLRunner.rollback();
|
}
|
|
SQLRunner.commit();
|
}
|
}
|
|
private void syncProduct(SyncDirection direction, String productId) throws Exception {
|
if (productSync) {
|
return ;
|
}
|
|
TargetType type = TargetType.Product;
|
|
if (direction == SyncDirection.fromDB) {
|
DataObject dataObject = DataObject.getInstance(type.getTableName());
|
Filter filter = new Filter();
|
filter.add("planning_position_id", targetId);
|
filter.add("product_id", productId);
|
Entity productTarget = dataObject.getBrowseEntity(filter);
|
|
PositionProductTarget target = productSet.get(productId);
|
target.load(productTarget);
|
productSet.add(productId, target);
|
// for (Entity product : productTargetSet) {
|
// String productId = product.getString("product_id");
|
// productSet.get(productId);
|
// PositionProductTarget target = new PositionProductTarget();
|
// target.load(product);
|
// productSet.add(target.getProductId(), target);
|
// }
|
}
|
else if (direction == SyncDirection.toDB) {
|
SQLRunner.beginTrans();
|
|
try {
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
|
if (!Util.isEmpty(productId)) {
|
PositionProductTarget productTarget = target.getProductDetail(productId);
|
|
if (productTarget != null) {
|
productTarget.save();
|
}
|
}
|
else {
|
for (PositionProductTarget productTarget : productSet) {
|
productTarget.save();
|
}
|
}
|
}
|
}
|
catch (Exception e) {
|
SQLRunner.rollback();
|
}
|
|
SQLRunner.commit();
|
}
|
}
|
|
private void syncSku(SyncDirection direction, String skuId) throws Exception {
|
if (skuSync) {
|
return ;
|
}
|
|
TargetType type = TargetType.Sku;
|
|
if (skuSet == null) {
|
skuSet = new MapList<String, PositionSkuTarget>();
|
}
|
|
if (direction == SyncDirection.fromDB) {
|
DataObject dataObject = DataObject.getInstance(type.getTableName());
|
Filter filter = new Filter();
|
filter.add("planning_position_id", targetId);
|
filter.add("sku_id", skuId);
|
Entity skuTarget = dataObject.getBrowseEntity(filter);
|
PositionSkuTarget target = skuSet.get(skuId);
|
target.load(skuTarget);
|
skuSet.add(skuId, target);
|
// for (Entity sku : skuTargetSet) {
|
// PositionSkuTarget target = new PositionSkuTarget();
|
// target.load(sku);
|
// skuSet.add(target.getSkuId(), target);
|
// }
|
}
|
else if (direction == SyncDirection.toDB) {
|
SQLRunner.beginTrans();
|
|
try {
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
|
if (!Util.isEmpty(skuId)) {
|
PositionSkuTarget skuTarget = target.getSkuDetail(skuId);
|
|
if (skuTarget != null) {
|
skuTarget.save();
|
}
|
}
|
else {
|
for (PositionSkuTarget skuTarget : skuSet) {
|
skuTarget.save();
|
}
|
}
|
}
|
}
|
catch (Exception e) {
|
SQLRunner.rollback();
|
}
|
|
SQLRunner.commit();
|
}
|
}
|
|
private void syncDetail(SyncDirection direction) throws Exception {
|
if (detailSync) {
|
return ;
|
}
|
|
TargetType type = TargetType.Detail;
|
DataObject dataObject = DataObject.getInstance(type.getTableName());
|
Filter filter = new Filter();
|
filter.add("planning_position_id", targetId);
|
EntitySet targetSet = dataObject.getTableEntitySet(filter);
|
|
if (direction == SyncDirection.fromDB) {
|
detailSet = targetSet;
|
|
for (Entity targetEntity : targetSet) {
|
String customerId = targetEntity.getString("customer_id");
|
PositionCustomerTarget customerTarget = customerSet.get(customerId);
|
if (customerTarget == null) {
|
customerTarget = new PositionCustomerTarget();
|
customerTarget.loadOneDetail(targetEntity);
|
customerSet.add(customerId, customerTarget);
|
}
|
|
String productId = targetEntity.getString("product_id");
|
PositionProductTarget productTarget = productSet.get(productId);
|
if (productTarget == null) {
|
productTarget = new PositionProductTarget();
|
productTarget.loadOneDetail(targetEntity);
|
productSet.add(productId, productTarget);
|
}
|
|
String skuId = targetEntity.getString("sku_id");
|
PositionSkuTarget skuTarget = skuSet.get(skuId);
|
if (skuTarget == null) {
|
skuTarget = new PositionSkuTarget();
|
skuTarget.loadOneDetail(targetEntity);
|
skuSet.add(skuId, skuTarget);
|
}
|
}
|
}
|
else if (direction == SyncDirection.toDB) {
|
SQLRunner.beginTrans();
|
|
try {
|
dataObject.deleteEntitySet(filter);
|
dataObject.batchInsertEntitySet(detailSet);
|
}
|
catch (Exception e) {
|
SQLRunner.rollback();
|
}
|
|
SQLRunner.commit();
|
}
|
|
detailSync = true;
|
}
|
|
private PositionCustomerTarget getCustomerDetail(String customerId) {
|
if (customerSet == null) {
|
return null;
|
}
|
|
return customerSet.get(customerId);
|
}
|
|
private PositionProductTarget getProductDetail(String productId) {
|
if (productSet == null) {
|
return null;
|
}
|
|
return productSet.get(productId);
|
}
|
|
private PositionSkuTarget getSkuDetail(String skuId) {
|
if (skuSet == null) {
|
return null;
|
}
|
|
return skuSet.get(skuId);
|
}
|
|
public String getPlanningId() {
|
return planningId;
|
}
|
|
public void reset(PositionTargetEngine engine) throws Exception {
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
EntitySet positionDetailSet = target.getDetailSet();
|
|
for (Entity detail : positionDetailSet) {
|
// 实际
|
// 数量
|
BigDecimal finalQty = detail.getBigDecimal("issue_qty", BigDecimal.ZERO);
|
detail.set("pre_qty", finalQty);
|
detail.set("final_qty", detail.getBigDecimal("issue_qty", BigDecimal.ZERO));
|
|
// 金额
|
detail.set("pre_amt", detail.getBigDecimal("final_amt", BigDecimal.ZERO));
|
detail.set("final_amt", detail.getBigDecimal("issue_amt", BigDecimal.ZERO));
|
|
BigDecimal detailRate = calculateActualRate(finalQty);
|
detail.set("actual_rate", detailRate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), detail);
|
}
|
}
|
|
detailSync = true;
|
}
|
|
public synchronized void positionAllocate(String key, PositionTargetEngine engine) throws Exception {
|
BigDecimal positionFinalSum = BigDecimal.ZERO;
|
Entity mostContribution = null;
|
BigDecimal mostContributionRate = BigDecimal.ZERO;
|
BigDecimal positionFinalQty = target.getBigDecimal("final_qty", BigDecimal.ZERO);
|
gapQty = positionFinalQty.subtract(positionFinalQty);
|
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
EntitySet positionDetailSet = target.getDetailSet();
|
|
for (Entity detail : positionDetailSet) {
|
// 实际
|
BigDecimal detailFinalQty = detail.getBigDecimal("final_qty", BigDecimal.ZERO);
|
BigDecimal detailRate = detailFinalQty.divide(positionFinalQty, 10, BigDecimal.ROUND_HALF_UP);
|
BigDecimal detailGapQty = detailRate.multiply(gapQty);
|
|
// 数量
|
detailFinalQty = detailGapQty.add(detailFinalQty);
|
detailFinalQty = detailFinalQty.setScale(0, BigDecimal.ROUND_HALF_UP);
|
positionFinalSum = positionFinalSum.add(detailFinalQty);
|
detail.set("final_qty", detailFinalQty);
|
|
// 金额
|
BigDecimal detailFinalAmt = detailFinalQty.multiply(detail.getBigDecimal("price"));
|
detail.set("final_amt", detailFinalAmt);
|
|
// 最大占比
|
if (mostContribution == null || detailRate.compareTo(mostContributionRate) >= 0) {
|
mostContribution = detail;
|
mostContributionRate = detailRate;
|
}
|
|
detailRate = calculateActualRate(detailFinalQty);
|
detail.set("actual_rate", detailRate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), detail);
|
}
|
}
|
|
BigDecimal diffQty = positionFinalQty.subtract(positionFinalSum);
|
BigDecimal detailFinalQty = mostContribution.getBigDecimal("final_qty");
|
detailFinalQty = detailFinalQty.add(diffQty);
|
mostContribution.set("final_qty", detailFinalQty);
|
|
BigDecimal finalTargetAmt = detailFinalQty.multiply(mostContribution.getBigDecimal("price"));
|
mostContribution.set("final_amt", finalTargetAmt);
|
|
BigDecimal rate = calculateActualRate(detailFinalQty);
|
mostContribution.set("actual_rate", rate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), mostContribution);
|
|
detailSync = true;
|
}
|
|
public synchronized void customerAllocate(String key, PositionTargetEngine engine) throws Exception {
|
PositionCustomerTarget customerTarget = customerSet.get(key);
|
BigDecimal positionFinalQty = customerTarget.getFinalQty();
|
BigDecimal positionFinalSum = BigDecimal.ZERO;
|
Entity mostContribution = null;
|
BigDecimal mostContributionRate = BigDecimal.ZERO;
|
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
EntitySet positionDetailSet = target.getDetailSet();
|
|
for (Entity detail : positionDetailSet) {
|
// 实际
|
BigDecimal detailFinalQty = detail.getBigDecimal("final_qty", BigDecimal.ZERO);
|
BigDecimal detailRate = detailFinalQty.divide(positionFinalQty, 10, BigDecimal.ROUND_HALF_UP);
|
BigDecimal detailGapQty = detailRate.multiply(gapQty);
|
|
// 数量
|
detailFinalQty = detailGapQty.add(detailFinalQty);
|
detailFinalQty = detailFinalQty.setScale(0, BigDecimal.ROUND_HALF_UP);
|
positionFinalSum = positionFinalSum.add(detailFinalQty);
|
detail.set("final_qty", detailFinalQty);
|
|
// 金额
|
BigDecimal detailFinalAmt = detailFinalQty.multiply(detail.getBigDecimal("price"));
|
detail.set("final_amt", detailFinalAmt);
|
|
// 最大占比
|
if (mostContribution == null || detailRate.compareTo(mostContributionRate) >= 0) {
|
mostContribution = detail;
|
mostContributionRate = detailRate;
|
}
|
|
detailRate = calculateActualRate(detailFinalQty);
|
detail.set("actual_rate", detailRate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), detail);
|
}
|
}
|
|
BigDecimal diffQty = positionFinalQty.subtract(positionFinalSum);
|
BigDecimal detailFinalQty = mostContribution.getBigDecimal("final_qty");
|
detailFinalQty = detailFinalQty.add(diffQty);
|
mostContribution.set("final_qty", detailFinalQty);
|
|
BigDecimal finalTargetAmt = detailFinalQty.multiply(mostContribution.getBigDecimal("price"));
|
mostContribution.set("final_amt", finalTargetAmt);
|
|
BigDecimal rate = calculateActualRate(detailFinalQty);
|
mostContribution.set("actual_rate", rate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), mostContribution);
|
|
detailSync = true;
|
}
|
|
public synchronized void productAllocate(String key, PositionTargetEngine engine) throws Exception {
|
BigDecimal positionFinalSum = BigDecimal.ZERO;
|
Entity mostContribution = null;
|
BigDecimal mostContributionRate = BigDecimal.ZERO;
|
|
PositionProductTarget productTarget = productSet.get(key);
|
BigDecimal positionFinalQty = productTarget.getFinalQty();
|
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
EntitySet positionDetailSet = target.getDetailSet();
|
|
for (Entity detail : positionDetailSet) {
|
// 实际
|
BigDecimal detailFinalQty = detail.getBigDecimal("final_qty", BigDecimal.ZERO);
|
BigDecimal detailRate = detailFinalQty.divide(positionFinalQty, 10, BigDecimal.ROUND_HALF_UP);
|
BigDecimal detailGapQty = detailRate.multiply(gapQty);
|
|
// 数量
|
detailFinalQty = detailGapQty.add(detailFinalQty);
|
detailFinalQty = detailFinalQty.setScale(0, BigDecimal.ROUND_HALF_UP);
|
positionFinalSum = positionFinalSum.add(detailFinalQty);
|
detail.set("final_qty", detailFinalQty);
|
|
// 金额
|
BigDecimal detailFinalAmt = detailFinalQty.multiply(detail.getBigDecimal("price"));
|
detail.set("final_amt", detailFinalAmt);
|
|
// 最大占比
|
if (mostContribution == null || detailRate.compareTo(mostContributionRate) >= 0) {
|
mostContribution = detail;
|
mostContributionRate = detailRate;
|
}
|
|
detailRate = calculateActualRate(detailFinalQty);
|
detail.set("actual_rate", detailRate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), detail);
|
}
|
}
|
|
BigDecimal diffQty = positionFinalQty.subtract(positionFinalSum);
|
BigDecimal detailFinalQty = mostContribution.getBigDecimal("final_qty");
|
detailFinalQty = detailFinalQty.add(diffQty);
|
mostContribution.set("final_qty", detailFinalQty);
|
|
BigDecimal finalTargetAmt = detailFinalQty.multiply(mostContribution.getBigDecimal("price"));
|
mostContribution.set("final_amt", finalTargetAmt);
|
|
BigDecimal rate = calculateActualRate(detailFinalQty);
|
mostContribution.set("actual_rate", rate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), mostContribution);
|
|
detailSync = true;
|
}
|
|
public synchronized void skuAllocate(String key, PositionTargetEngine engine) throws Exception {
|
BigDecimal positionFinalSum = BigDecimal.ZERO;
|
Entity mostContribution = null;
|
BigDecimal mostContributionRate = BigDecimal.ZERO;
|
|
MapList<String, Node> leafChildren = new MapList<String, Node>();
|
leafChildren = getLeafChildren(leafChildren);
|
|
PositionSkuTarget skuTarget = skuSet.get(key);
|
BigDecimal positionFinalQty = skuTarget.getFinalQty();
|
|
for (Node node : leafChildren) {
|
PositionTarget target = (PositionTarget)node;
|
EntitySet positionDetailSet = target.getDetailSet();
|
|
for (Entity detail : positionDetailSet) {
|
// 实际
|
BigDecimal detailFinalQty = detail.getBigDecimal("final_qty", BigDecimal.ZERO);
|
BigDecimal detailRate = detailFinalQty.divide(positionFinalQty, 10, BigDecimal.ROUND_HALF_UP);
|
BigDecimal detailGapQty = detailRate.multiply(gapQty);
|
|
// 数量
|
detailFinalQty = detailGapQty.add(detailFinalQty);
|
detailFinalQty = detailFinalQty.setScale(0, BigDecimal.ROUND_HALF_UP);
|
positionFinalSum = positionFinalSum.add(detailFinalQty);
|
detail.set("final_qty", detailFinalQty);
|
|
// 金额
|
BigDecimal detailFinalAmt = detailFinalQty.multiply(detail.getBigDecimal("price"));
|
detail.set("final_amt", detailFinalAmt);
|
|
// 最大占比
|
if (mostContribution == null || detailRate.compareTo(mostContributionRate) >= 0) {
|
mostContribution = detail;
|
mostContributionRate = detailRate;
|
}
|
|
detailRate = calculateActualRate(detailFinalQty);
|
detail.set("actual_rate", detailRate);
|
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), detail);
|
}
|
}
|
|
BigDecimal diffQty = positionFinalQty.subtract(positionFinalSum);
|
BigDecimal detailFinalQty = mostContribution.getBigDecimal("final_qty");
|
detailFinalQty = detailFinalQty.add(diffQty);
|
mostContribution.set("final_qty", detailFinalQty);
|
|
BigDecimal finalTargetAmt = detailFinalQty.multiply(mostContribution.getBigDecimal("price"));
|
mostContribution.set("final_amt", finalTargetAmt);
|
|
BigDecimal rate = calculateActualRate(detailFinalQty);
|
mostContribution.set("actual_rate", rate);
|
engine.actions.addOneActions(TargetType.Detail.getTableName(), mostContribution);
|
|
detailSync = true;
|
}
|
|
public BigDecimal[] aggPosition(PositionTargetEngine engine) throws Exception {
|
//1. 明细聚合 至 MR
|
BigDecimal[] targets = new BigDecimal[3];
|
BigDecimal positionFinalQty = BigDecimal.ZERO;
|
BigDecimal positionFinalAmt = BigDecimal.ZERO;
|
BigDecimal positionRate = BigDecimal.ZERO;
|
|
targets[0] = positionFinalQty; //final_qty
|
targets[1] = positionFinalAmt; //final_amt
|
targets[2] = positionRate; //actual_rate
|
|
if (detailSet != null) {
|
for (Entity detail : detailSet) {
|
positionFinalQty = positionFinalQty.add(detail.getBigDecimal("final_qty", BigDecimal.ZERO));
|
positionFinalAmt = positionFinalAmt.add(detail.getBigDecimal("final_amt", BigDecimal.ZERO));
|
positionRate = positionRate.add(detail.getBigDecimal("actual_rate", BigDecimal.ZERO));
|
}
|
|
finalQty = positionFinalQty;
|
target.set("final_qty", finalQty);
|
|
finalAmt = positionFinalAmt;
|
target.set("final_amt", finalAmt);
|
|
target.set("actual_rate", positionRate);
|
|
targets[0] = positionFinalQty;
|
targets[1] = positionFinalAmt;
|
targets[2] = positionRate;
|
|
engine.actions.addOneActions(TargetType.Position.getTableName(), target);
|
return targets;
|
}
|
|
//2. 向上逐级聚合
|
for (Node node : children) {
|
PositionTarget positionTargetNode = (PositionTarget)node;
|
BigDecimal[] childTargets = positionTargetNode.aggPosition(engine);
|
|
for (int i = 0 ; i < childTargets.length; i++) {
|
targets[i] = targets[i].add(childTargets[i]);
|
}
|
|
positionTargetNode.setTargets(targets);
|
}
|
|
return targets;
|
}
|
|
public void aggPositionCustomer(PositionTargetEngine engine) throws Exception {
|
if (customerSet != null) {
|
for (PositionCustomerTarget customerTarget : customerSet) {
|
customerTarget.agg(engine);
|
}
|
}
|
}
|
|
public void aggPositionProduct(PositionTargetEngine engine) throws Exception {
|
if (productSet != null) {
|
for (PositionProductTarget productTarget : productSet) {
|
productTarget.agg(engine);
|
}
|
}
|
}
|
|
public void aggPositionSku(PositionTargetEngine engine) throws Exception {
|
if (skuSet != null) {
|
for (PositionSkuTarget skuTarget : skuSet) {
|
skuTarget.agg(engine);
|
}
|
}
|
}
|
|
private void setTargets(BigDecimal[] targets) {
|
setFinalQty(targets[0]);
|
setFinalAmt(targets[1]);
|
setRate(targets[2]);
|
}
|
|
private void setFinalQty(BigDecimal finalQty) {
|
target.set("final_qty", finalQty);
|
this.finalQty = finalQty;
|
}
|
|
private void setFinalAmt(BigDecimal finalAmt) {
|
target.set("final_amt", finalAmt);
|
this.finalAmt = finalAmt;
|
}
|
|
private void setRate(BigDecimal rate) {
|
target.set("actual_rate", rate);
|
}
|
|
private BigDecimal calculateActualRate(BigDecimal detailFinalQty) {
|
TargetPlanning planning = TargetPlanningBucket.getCurrent();
|
BigDecimal totalFinalQty = planning.getFinalQty();
|
BigDecimal rate = detailFinalQty.divide(totalFinalQty, 8, BigDecimal.ROUND_HALF_UP);
|
return rate;
|
}
|
|
public void setGap(BigDecimal gapQty, BigDecimal gapAmt) {
|
this.gapQty = gapQty;
|
finalQty = finalQty.add(gapQty);
|
this.gapAmt = gapAmt;
|
finalAmt = finalAmt.add(gapAmt);
|
|
activeLoad();
|
}
|
|
@Override
|
public void addOneChild(Node item) {
|
children.add(item.getId(), item);
|
PositionTarget target = (PositionTarget)item;
|
|
//customerSet
|
if (customerSet == null) {
|
customerSet = new MapList<String, PositionCustomerTarget>();
|
}
|
|
MapList<String, PositionCustomerTarget> childrenCustomerSet = target.getCustomerSet();
|
for (PositionCustomerTarget childCustomer : childrenCustomerSet) {
|
String customerId = childCustomer.getCustomerId();
|
PositionCustomerTarget customerTarget = customerSet.get(customerId);
|
|
if (customerTarget == null) {
|
customerTarget = PositionCustomerTarget.createByChild(target, customerId);
|
}
|
|
customerTarget.aggChild(childCustomer);
|
customerSet.add(customerTarget.getCustomerId(), customerTarget);
|
}
|
|
//skuSet
|
if (skuSet == null) {
|
skuSet = new MapList<String, PositionSkuTarget>();
|
}
|
|
MapList<String, PositionSkuTarget> childrenSkuSet = target.getSkuSet();
|
for (PositionSkuTarget childSku : childrenSkuSet) {
|
String skuId = childSku.getSkuId();
|
PositionSkuTarget skuTarget = skuSet.get(skuId);
|
|
if (skuTarget == null) {
|
skuTarget = PositionSkuTarget.createByChild(target, childSku);
|
}
|
|
skuTarget.aggChild(childSku);
|
skuSet.add(skuTarget.getSkuId(), skuTarget);
|
}
|
|
//productSet
|
// if (productSet == null) {
|
// productSet = new MapList<String, PositionProductTarget>();
|
// }
|
//
|
// MapList<String, PositionProductTarget> childrenProductSet = target.getProductSet();
|
// for (PositionProductTarget childProduct : childrenProductSet) {
|
// String productId = childProduct.getProductId();
|
// logger.info("产品:{}", productId);
|
// PositionProductTarget productTarget = productSet.get(productId);
|
//
|
// if (productTarget == null) {
|
// productTarget = PositionProductTarget.createByChild(target, productId);
|
// }
|
//
|
// productTarget.aggChild(childProduct);
|
// productSet.add(productTarget.getProductId(), productTarget);
|
// }
|
|
//detailSet
|
if (detailSet == null) {
|
try {
|
DataObject dataObject = DataObject.getInstance(TargetType.Detail.getTableName());
|
detailSet = dataObject.createTableEntitySet();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
EntitySet entitySet = target.getDetailSet();
|
detailSet = EntitySet.appendAll(detailSet, entitySet);
|
}
|
|
public PositionTargetRuntime getRuntime(TargetType type, DataReader dataReader) throws Exception {
|
String positionId = dataReader.getString("position_id");
|
PositionTarget positionTarget = getChild(positionId);
|
if (positionTarget == null) {
|
return PositionTargetRuntime.create(type, this, dataReader);
|
}
|
|
PositionTargetRuntime runtimeTarget = PositionTargetRuntime.create(type, positionTarget, dataReader);
|
return runtimeTarget;
|
}
|
|
public PositionTargetRuntime getRuntime(TargetType type, String positionId, DataReader dataReader) throws Exception {
|
PositionTarget positionTarget = getChild(positionId);
|
if (positionTarget == null) {
|
return PositionTargetRuntime.create(type, this, dataReader);
|
}
|
|
PositionTargetRuntime runtimeTarget = PositionTargetRuntime.create(type, positionTarget, dataReader);
|
return runtimeTarget;
|
}
|
|
public PositionTargetRuntime create(TargetType type) throws Exception {
|
PositionTargetRuntime runtimeTarget = new PositionTargetRuntime(type);
|
runtimeTarget.copy(this);
|
|
return runtimeTarget;
|
}
|
|
public void setState(State state) throws Exception {
|
target.set("state_code", state.getCode());
|
target.set("state_name", state.getName());
|
}
|
|
public void setState(State state, PositionTargetEngine engine) throws Exception {
|
target.set("state_code", state.getCode());
|
target.set("state_name", state.getName());
|
|
engine.actions.addOneActions(TargetType.Position.getTableName(), target);
|
}
|
|
public void issue(State state, PositionTargetEngine engine) throws Exception {
|
IOnlineUser user = engine.getUser();
|
target.set("state_code", state.getCode());
|
target.set("state_name", state.getName());
|
target.set("issue_qty", target.getValue("final_qty"));
|
target.set("issue_amt", target.getValue("final_amt"));
|
target.set("updator_id", user.getId());
|
target.set("updator_name", user.getName());
|
|
engine.actions.addOneActions(TargetType.Position.getTableName(), target);
|
}
|
|
public PositionCustomerTarget getCustomerTarget(String customerId) {
|
return customerSet.get(customerId);
|
}
|
|
public MapList<String, PositionCustomerTarget> getCustomerSet() {
|
return customerSet;
|
}
|
|
public PositionProductTarget getProductTarget(String productId) {
|
return productSet.get(productId);
|
}
|
|
public MapList<String, PositionProductTarget> getProductSet() {
|
return productSet;
|
}
|
|
public PositionSkuTarget getSkuTarget(String skuId) {
|
return skuSet.get(skuId);
|
}
|
|
public MapList<String, PositionSkuTarget> getSkuSet() {
|
return skuSet;
|
}
|
|
public String getTargetId() {
|
return targetId;
|
}
|
|
public EntitySet getDetailSet() {
|
return detailSet;
|
}
|
|
public BigDecimal getGapAmt() {
|
return gapAmt;
|
}
|
|
public Entity getEntity() {
|
return target;
|
}
|
|
@Override
|
public String getId() {
|
return positionId;
|
}
|
|
@Override
|
public String getParentId() {
|
return parentPositionId;
|
}
|
|
@Override
|
public void writeJSON(IJSONWriter writer) {
|
|
}
|
|
@Override
|
public void writeJSONBody(IJSONWriter writer) {
|
}
|
}
|