package biz.target;
|
|
import java.math.BigDecimal;
|
import java.util.Map.Entry;
|
import java.util.Set;
|
|
import foundation.dao.DataReader;
|
import foundation.dao.IDataLetter;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.entity.Filter;
|
import foundation.data.entity.OrderBy;
|
import foundation.data.entity.Page;
|
import foundation.data.object.DataObject;
|
import foundation.json.IJSONProvider;
|
import foundation.json.IJSONWriter;
|
import foundation.json.JObjectReader;
|
import foundation.json.JType;
|
import foundation.preload.Node;
|
import foundation.util.ContentBuilder;
|
import foundation.util.MapList;
|
import foundation.util.Util;
|
|
public class PositionTargetRuntime implements IJSONProvider{
|
private String targetId;
|
private String planningId;
|
private String positionId;
|
private String parentPositionId;
|
private Entity target;
|
private MapList<String, PositionSkuTarget> skuSet;
|
private EntitySet detailSet;
|
private MapList<String, PositionTargetRuntime> children;
|
private TargetType type;
|
private Page page;
|
|
public PositionTargetRuntime(TargetType type) {
|
skuSet = new MapList<String, PositionSkuTarget>();
|
children = new MapList<String, PositionTargetRuntime>();
|
this.type = type;
|
this.page = new Page();
|
}
|
|
public static PositionTargetRuntime create(TargetType type, PositionTarget positionTarget, DataReader dataReader) throws Exception{
|
PositionTargetRuntime runtime = new PositionTargetRuntime(type);
|
runtime.copy(positionTarget);
|
|
if (type == TargetType.Position) {
|
runtime.filterByPosition(positionTarget, dataReader);
|
}
|
else if (type == TargetType.Sku) {
|
runtime.filterBySku(positionTarget, dataReader);
|
}
|
else if (type == TargetType.Detail) {
|
runtime.filterByDetail(positionTarget, dataReader);
|
}
|
|
return runtime;
|
}
|
|
public void setTarget(Entity targetEntity) {
|
this.target = targetEntity;
|
}
|
|
public void setDetailSet(EntitySet detailSet) {
|
this.detailSet = detailSet;
|
}
|
|
public void copy(PositionTarget positionTarget) throws Exception {
|
this.targetId = positionTarget.getTargetId();
|
this.planningId = positionTarget.getPlanningId();
|
this.parentPositionId = positionTarget.getParentId();
|
this.positionId = positionTarget.getId();
|
Entity targetEntity = positionTarget.getEntity();
|
|
DataObject dataObject = DataObject.getInstance(TargetType.Position.getTableName());
|
target = dataObject.createTableEmptyEntity();
|
target.setId(targetId);
|
target.set("parent_position_id", parentPositionId);
|
target.set("position_id", positionId);
|
target.set("planning_id", planningId);
|
target.set("position_code", targetEntity.getString("position_code"));
|
target.set("position_name", targetEntity.getString("position_name"));
|
target.set("employee_id", targetEntity.getValue("employee_id"));
|
target.set("employee_code", targetEntity.getValue("employee_code"));
|
target.set("employee_name", targetEntity.getValue("employee_name"));
|
target.set("state_code", targetEntity.getValue("state_code"));
|
target.set("state_name", targetEntity.getValue("state_name"));
|
|
for (String valueField : TargetConstants.Value_Fields) {
|
target.set(valueField, BigDecimal.ZERO);
|
}
|
|
dataObject = DataObject.getInstance(TargetType.Detail.getTableName());
|
detailSet = dataObject.createTableEntitySet();
|
}
|
|
private void filterByPosition(PositionTarget positionTarget, DataReader dataReader) throws Exception {
|
String positionId = dataReader.getString("position_id");
|
|
if (Util.isEmpty(positionId)) {
|
this.target = positionTarget.getEntity();
|
return ;
|
}
|
|
JObjectReader filterJson = dataReader.getReader(IDataLetter.Filter, JType.Object);
|
|
DataObject detailObject = DataObject.getInstance("tgt_planning_detail");
|
Filter filter = new Filter(filterJson);
|
OrderBy orderBy = new OrderBy();
|
dataReader.loadPageOrderByFromJSON(detailObject, page, orderBy);
|
|
EntitySet idSet = detailObject.getBrowseEntitySet(filter, orderBy);
|
|
EntitySet positionDetailSet = positionTarget.getDetailSet();
|
|
// 2. 匹配内存明细
|
for(Entity targetId : idSet) {
|
Entity targetEntity = positionDetailSet.getEntity(targetId.getId());
|
|
for (String valueField : TargetConstants.Value_Fields) {
|
BigDecimal value = target.getBigDecimal(valueField, BigDecimal.ZERO);
|
BigDecimal detailValue = targetEntity.getBigDecimal(valueField, BigDecimal.ZERO);
|
value = value.add(detailValue);
|
|
target.set(valueField, value);
|
}
|
|
detailSet.append(targetEntity);
|
}
|
|
page.setRecordCount(detailSet.size());
|
}
|
|
public void filterBySku(PositionTarget positionTarget, DataReader dataReader) throws Exception {
|
JObjectReader filterJson = dataReader.getReader(IDataLetter.Filter, JType.Object);
|
MapList<String, Node> childrenTarget = positionTarget.getChildren();
|
|
//1. 获取skuId;
|
DataObject dataObject = DataObject.getInstance("md_product_sku");
|
Filter skuFilter = new Filter();
|
|
ContentBuilder filterBuilder = new ContentBuilder(",");
|
Set<String> products = filterJson.getStringSet("product_id");
|
|
if (products != null) {
|
for (String productId : products) {
|
filterBuilder.append(Util.quotedStr(productId));
|
}
|
skuFilter.add(" product_id in (" + filterBuilder.toString() + ")");
|
}
|
|
filterBuilder = new ContentBuilder(",");
|
Set<String> skus = filterJson.getStringSet("sku_id");
|
if (skus != null) {
|
for (String skuId : skus) {
|
filterBuilder.append(Util.quotedStr(skuId));
|
}
|
skuFilter.add(" sku_id in (" + filterBuilder.toString() + ")");
|
}
|
EntitySet skuEntitySet = dataObject.getTableEntitySet(skuFilter);
|
|
//2. 创建sku指标集合;
|
for (Entity skuEntity : skuEntitySet) {
|
String skuId = skuEntity.getString("sku_id");
|
PositionSkuTarget target = PositionSkuTarget.createByChild(positionTarget, skuEntity);
|
skuSet.add(skuId, target);
|
}
|
|
//3. 根据sku集合 获取子节点明细
|
for (Node child : childrenTarget) {
|
PositionTarget childTarget = (PositionTarget)child;
|
PositionTargetRuntime childRuntime = childTarget.create(type);
|
childRuntime.initSkuSet(skuEntitySet);
|
|
for (Entry<String, PositionSkuTarget> entry : skuSet.getItemMap().entrySet()) {
|
String skuId = entry.getKey();
|
PositionSkuTarget skuTarget = entry.getValue();
|
|
PositionSkuTarget childSkuTarget = childTarget.getSkuTarget(skuId);
|
|
if (childSkuTarget == null) {
|
continue;
|
}
|
|
//4. 汇总
|
skuTarget.aggChild(childSkuTarget);
|
childRuntime.addSku(childSkuTarget);
|
}
|
|
addOneChild(childTarget.getId(), childRuntime);
|
}
|
}
|
|
private void filterByDetail(PositionTarget positionTarget, DataReader dataReader) throws Exception {
|
// 1. 查询指标明细ID
|
JObjectReader filterJson = dataReader.getReader(IDataLetter.Filter, JType.Object);
|
|
DataObject detailObject = DataObject.getInstance("tgt_planning_detail");
|
Filter filter = new Filter(filterJson);
|
OrderBy orderBy = new OrderBy();
|
dataReader.loadPageOrderByFromJSON(detailObject, page, orderBy);
|
EntitySet idSet = detailObject.getBrowseEntitySet(filter, page, orderBy);
|
int cnt = detailObject.getCount(filter);
|
page.setRecordCount(cnt);
|
|
EntitySet positionDetailSet = positionTarget.getDetailSet();
|
|
// 2. 匹配内存明细
|
for(Entity targetId : idSet) {
|
Entity targetEntity = positionDetailSet.getEntity(targetId.getId());
|
|
for (String valueField : TargetConstants.Value_Fields) {
|
BigDecimal value = target.getBigDecimal(valueField, BigDecimal.ZERO);
|
BigDecimal detailValue = targetEntity.getBigDecimal(valueField, BigDecimal.ZERO);
|
value = value.add(detailValue);
|
|
target.set(valueField, value);
|
}
|
|
detailSet.append(targetEntity);
|
}
|
}
|
|
public void addOneChild(String id, PositionTargetRuntime childRuntime) throws Exception {
|
children.add(id, childRuntime);
|
|
for (String valueField : TargetConstants.Value_Fields) {
|
BigDecimal value = target.getBigDecimal(valueField, BigDecimal.ZERO);
|
BigDecimal childValue = childRuntime.getValue(valueField);
|
value = value.add(childValue);
|
|
target.set(valueField, value);
|
}
|
}
|
|
private BigDecimal getValue(String valueField) throws Exception {
|
return target.getBigDecimal(valueField, BigDecimal.ZERO);
|
}
|
|
private void addSku(PositionSkuTarget skuTarget) {
|
skuSet.add(skuTarget.getSkuId(), skuTarget);
|
|
for (String valueField : TargetConstants.Value_Fields) {
|
BigDecimal value = target.getBigDecimal(valueField, BigDecimal.ZERO);
|
BigDecimal detailValue = skuTarget.getValue(valueField);
|
value = value.add(detailValue);
|
|
target.set(valueField, value);
|
}
|
|
detailSet = EntitySet.appendAll(detailSet, skuTarget.getDetailSet());
|
}
|
|
public MapList<String, PositionSkuTarget> initSkuSet(EntitySet skuEntitySet) {
|
for (Entity skuEntity : skuEntitySet) {
|
String skuId = skuEntity.getString("sku_id");
|
PositionSkuTarget target = new PositionSkuTarget();
|
skuSet.add(skuId, target);
|
}
|
|
return skuSet;
|
}
|
|
public void setSkuSet(MapList<String, PositionSkuTarget> skuSet) {
|
this.skuSet = skuSet;
|
}
|
|
@Override
|
public void writeJSON(IJSONWriter writer) {
|
writer.beginObject();
|
// self sum
|
target.writeJSONBody(writer);
|
|
if (type == TargetType.Sku) {
|
//self skus
|
writer.beginArray("skus");
|
|
for (PositionSkuTarget skuTarget : skuSet) {
|
skuTarget.writeJSON(writer);
|
}
|
|
writer.endArray();
|
|
//children
|
writer.beginArray("children");
|
for (PositionTargetRuntime child : children) {
|
child.writeJSON(writer);
|
}
|
writer.endArray();
|
}
|
else if (type == TargetType.Detail){
|
writer.beginArray("details");
|
detailSet.writeJSONBody(writer);
|
writer.endArray();
|
}
|
|
if (type == TargetType.Position || type == TargetType.Detail){
|
if (page != null) {
|
writer.beginObject("page");
|
page.writeJSONBody(writer);
|
writer.endObject();
|
}
|
}
|
|
writer.endObject();
|
}
|
}
|