package biz.target;
|
|
import java.math.BigDecimal;
|
|
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.persist.SQLRunner;
|
|
public class PositionSkuTarget {
|
private String targetId;
|
private String planningId;
|
private String positionId;
|
private String productId;
|
private String skuId;
|
private String parentPositionId;
|
private String planningPositionId;
|
private boolean modified;
|
private Entity target;
|
private BigDecimal finalQty;
|
private BigDecimal finalAmt;
|
private EntitySet detailSet;
|
private boolean skuSync;
|
private boolean detailSync;
|
private TargetType type = TargetType.Sku;
|
|
public PositionSkuTarget() {
|
activeLoad();
|
}
|
|
private void activeLoad() {
|
skuSync = false;
|
detailSync = false;
|
}
|
|
public String getProductId() {
|
return productId;
|
}
|
|
public String getSkuId() {
|
return skuId;
|
}
|
|
public static PositionSkuTarget createByChild(PositionTarget node, Entity skuEntity) {
|
PositionSkuTarget target = new PositionSkuTarget();
|
target.activeLoad();
|
|
DataObject dataObject = DataObject.getInstance(target.type.getTableName());
|
Entity targetEntity = null;
|
|
try {
|
targetEntity = dataObject.createTableEmptyEntity();
|
targetEntity.set("parent_position_id", node.getParentId());
|
targetEntity.set("position_id", node.getId());
|
targetEntity.set("planning_position_id", node.getTargetId());
|
targetEntity.set("planning_id", node.getPlanningId());
|
targetEntity.set("sku_id", skuEntity.getId());
|
targetEntity.set("spec_code", skuEntity.getString("sku_code"));
|
targetEntity.set("spec_name", skuEntity.getString("sku_name"));
|
targetEntity.set("product_id", skuEntity.getString("product_id"));
|
targetEntity.set("product_code", skuEntity.getString("product_code"));
|
targetEntity.set("product_name", skuEntity.getString("product_name"));
|
|
for (String valueField : TargetConstants.Value_Fields) {
|
targetEntity.set(valueField, BigDecimal.ZERO);
|
}
|
|
target.load(targetEntity);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return target;
|
}
|
|
public static PositionSkuTarget createByChild(PositionTarget node, PositionSkuTarget skuTarget) {
|
PositionSkuTarget target = new PositionSkuTarget();
|
target.activeLoad();
|
|
DataObject dataObject = DataObject.getInstance(target.type.getTableName());
|
Entity targetEntity = null;
|
Entity skuEntity = skuTarget.target;
|
|
try {
|
targetEntity = dataObject.createTableEmptyEntity();
|
targetEntity.set("parent_position_id", node.getParentId());
|
targetEntity.set("position_id", node.getId());
|
targetEntity.set("planning_position_id", node.getTargetId());
|
targetEntity.set("planning_id", node.getPlanningId());
|
targetEntity.set("sku_id", skuEntity.getString("sku_id"));
|
targetEntity.set("spec_code", skuEntity.getString("spec_code"));
|
targetEntity.set("spec_name", skuEntity.getString("spec_name"));
|
targetEntity.set("product_id", skuEntity.getString("product_id"));
|
targetEntity.set("product_code", skuEntity.getString("product_code"));
|
targetEntity.set("product_name", skuEntity.getString("product_name"));
|
targetEntity.set("state_code", skuEntity.getValue("state_code"));
|
targetEntity.set("state_name", skuEntity.getValue("state_name"));
|
|
for (String valueField : TargetConstants.Value_Fields) {
|
targetEntity.set(valueField, BigDecimal.ZERO);
|
}
|
|
target.load(targetEntity);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return target;
|
}
|
|
public void load(Entity entity) throws Exception {
|
target = entity;
|
targetId = entity.getId();
|
planningId = entity.getString("planning_id");
|
planningPositionId = entity.getString("planning_position_id");
|
|
positionId = entity.getString("position_id");
|
parentPositionId = entity.getString("parent_position_id");
|
|
productId = entity.getString("product_id");
|
skuId = entity.getString("sku_id");
|
|
finalQty = entity.getBigDecimal("final_qty", BigDecimal.ZERO);
|
finalAmt = entity.getBigDecimal("final_amt", BigDecimal.ZERO);
|
|
modified = entity.getBoolean("is_modified");
|
skuSync = true;
|
|
syncSku(SyncDirection.fromDB);
|
// syncDetail(SyncDirection.fromDB);
|
}
|
|
private void syncSku(SyncDirection direction) throws Exception {
|
if (skuSync) {
|
return ;
|
}
|
|
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();
|
}
|
|
skuSync = true;
|
}
|
|
public void loadOneDetail(Entity targetEntity) {
|
if (detailSet == null) {
|
detailSet = new EntitySet(targetEntity.getFieldsMeta());
|
}
|
|
detailSet.append(targetEntity);
|
}
|
|
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", planningPositionId);
|
filter.add("planning_sku_id", targetId);
|
EntitySet targetSet = dataObject.getBrowseEntitySet(filter);
|
|
if (direction == SyncDirection.fromDB) {
|
detailSet = targetSet;
|
}
|
else if (direction == SyncDirection.toDB) {
|
SQLRunner.beginTrans();
|
|
try {
|
dataObject.deleteEntitySet(filter);
|
dataObject.batchInsertEntitySet(detailSet);
|
}
|
catch (Exception e) {
|
SQLRunner.rollback();
|
}
|
|
SQLRunner.commit();
|
}
|
|
detailSync = true;
|
}
|
|
public void agg(PositionTargetEngine engine) throws Exception {
|
BigDecimal positionFinalQty = BigDecimal.ZERO;
|
BigDecimal positionFinalAmt = BigDecimal.ZERO;
|
BigDecimal positionRate = BigDecimal.ZERO;
|
|
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);
|
engine.actions.addOneActions(type.getTableName(), target);
|
}
|
}
|
|
public void aggChild(PositionSkuTarget child) {
|
detailSet = EntitySet.appendAll(detailSet, child.getDetailSet());
|
for (String valueField : TargetConstants.Value_Fields) {
|
BigDecimal value = target.getBigDecimal(valueField, BigDecimal.ZERO);
|
BigDecimal childValue = child.getValue(valueField);
|
value = value.add(childValue);
|
|
target.set(valueField, value);
|
}
|
|
target.set("price", child.getValue("price"));
|
finalQty = target.getBigDecimal("final_qty", BigDecimal.ZERO);
|
finalAmt = target.getBigDecimal("final_amt", BigDecimal.ZERO);
|
}
|
|
public BigDecimal getValue(String valueField) {
|
return target.getBigDecimal(valueField, BigDecimal.ZERO);
|
}
|
|
public EntitySet getDetailSet() {
|
return detailSet;
|
}
|
|
public void save() throws Exception {
|
DataObject dataObject = DataObject.getInstance(type.getTableName());
|
|
if (!skuSync) {
|
Entity productTarget = dataObject.getTableEntity(targetId);
|
EntitySaver saver = dataObject.createEntitySaver(productTarget);
|
saver.set(this.target);
|
saver.update();
|
}
|
|
if (!detailSync) {
|
Filter filter = new Filter();
|
filter.add("planning_sku_id", targetId);
|
dataObject = DataObject.getInstance(TargetType.Detail.getTableName());
|
dataObject.deleteEntitySet(filter);
|
dataObject.batchInsertEntitySet(detailSet);
|
}
|
}
|
|
public BigDecimal getFinalQty() {
|
return finalQty;
|
}
|
|
public BigDecimal getFinalAmt() {
|
return finalAmt;
|
}
|
|
public void writeJSON(IJSONWriter writer) {
|
if (target == null) {
|
return ;
|
}
|
target.writeJSON(writer);
|
}
|
}
|