📄 itemconfigurationnode.java
字号:
/*
* ProductNode.java
*
* Created on 1 ottobre 2003, 16.10
*/
package org.ofbiz.manufacturing.bom;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.base.util.UtilMisc;
/** An ItemCoinfigurationNode represents a component in a bill of materials.
* @author <a href="mailto:tiz@sastau.it">Jacopo Cappellato</a>
*/
public class ItemConfigurationNode {
private ItemConfigurationNode parentNode; // the parent node (null if it's not present)
private ItemConfigurationNode substitutedNode; // The virtual node (if any) that this instance substitutes
private GenericValue ruleApplied; // The rule (if any) that that has been applied to configure the current node
private String productForRules;
private GenericValue part; // the current product (from Product entity)
private ArrayList children; // current node's children (ProductAssocs)
private ArrayList childrenNodes; // current node's children nodes (ItemConfigurationNode)
private float quantityMultiplier; // the necessary quantity as declared in the bom (from ProductAssocs or ProductManufacturingRule)
// Runtime fields
private int depth; // the depth of this node in the current tree
private float quantity; // the quantity of this node in the current tree
private String bomTypeId; // the type of the current tree
public ItemConfigurationNode(GenericValue part) {
this.part = part;
children = new ArrayList();
childrenNodes = new ArrayList();
parentNode = null;
productForRules = null;
bomTypeId = null;
quantityMultiplier = 1;
// Now we initialize the fields used in breakdowns
depth = 0;
quantity = 0;
}
public ItemConfigurationNode(String partId, GenericDelegator delegator) throws GenericEntityException {
this(delegator.findByPrimaryKey("Product", UtilMisc.toMap("productId", partId)));
}
protected void loadChildren(String partBomTypeId, Date inDate, List productFeatures) throws GenericEntityException {
if (part == null) {
throw new GenericEntityException("Part is null");
}
// If the date is null, set it to today.
if (inDate == null) inDate = new Date();
bomTypeId = partBomTypeId;
GenericDelegator delegator = part.getDelegator();
List rows = delegator.findByAnd("ProductAssoc",
UtilMisc.toMap("productId", part.get("productId"),
"productAssocTypeId", partBomTypeId),
UtilMisc.toList("sequenceNum"));
rows = EntityUtil.filterByDate(rows, inDate);
if ((rows == null || rows.size() == 0) && substitutedNode != null) {
// If no child is found and this is a substituted node
// we try to search for substituted node's children.
rows = delegator.findByAnd("ProductAssoc",
UtilMisc.toMap("productId", substitutedNode.getPart().get("productId"),
"productAssocTypeId", partBomTypeId),
UtilMisc.toList("sequenceNum"));
rows = EntityUtil.filterByDate(rows, inDate);
}
children = new ArrayList(rows);
childrenNodes = new ArrayList();
Iterator childrenIterator = children.iterator();
GenericValue oneChild = null;
ItemConfigurationNode oneChildNode = null;
while(childrenIterator.hasNext()) {
oneChild = (GenericValue)childrenIterator.next();
// Configurator
oneChildNode = configurator(oneChild, productFeatures, getRootNode().getProductForRules(), inDate, delegator);
// If the node is null this means that the node has been discarded by the rules.
if (oneChildNode != null) {
oneChildNode.setParentNode(this);
oneChildNode.loadChildren(partBomTypeId, inDate, productFeatures);
}
childrenNodes.add(oneChildNode);
}
}
private ItemConfigurationNode substituteNode(ItemConfigurationNode oneChildNode, List productFeatures, List productPartRules, GenericDelegator delegator) throws GenericEntityException {
if (productPartRules != null) {
GenericValue rule = null;
for (int i = 0; i < productPartRules.size(); i++) {
rule = (GenericValue)productPartRules.get(i);
String ruleCondition = (String)rule.get("productFeature");
String ruleOperator = (String)rule.get("ruleOperator");
String newPart = (String)rule.get("productIdInSubst");
float ruleQuantity = 0;
try {
ruleQuantity = rule.getDouble("quantity").floatValue();
} catch(Exception exc) {
ruleQuantity = 0;
}
GenericValue feature = null;
boolean ruleSatisfied = false;
if (ruleCondition == null || ruleCondition.equals("")) {
ruleSatisfied = true;
} else {
if (productFeatures != null) {
for (int j = 0; j < productFeatures.size(); j++) {
feature = (GenericValue)productFeatures.get(j);
if (ruleCondition.equals((String)feature.get("productFeatureId"))) {
ruleSatisfied = true;
break;
}
}
}
}
if (ruleSatisfied && ruleOperator.equals("OR")) {
ItemConfigurationNode tmpNode = oneChildNode;
if (newPart == null || newPart.equals("")) {
oneChildNode = null;
} else {
oneChildNode = new ItemConfigurationNode(newPart, delegator);
oneChildNode.setSubstitutedNode(tmpNode);
oneChildNode.setRuleApplied(rule);
if (ruleQuantity > 0) {
oneChildNode.setQuantityMultiplier(ruleQuantity);
}
}
break;
}
// FIXME: AND operator still not implemented
} // end of for
}
return oneChildNode;
}
private ItemConfigurationNode configurator(GenericValue node, List productFeatures, String productIdForRules, Date inDate, GenericDelegator delegator) throws GenericEntityException {
ItemConfigurationNode oneChildNode = new ItemConfigurationNode((String)node.get("productIdTo"), delegator);
try {
oneChildNode.setQuantityMultiplier(node.getDouble("quantity").floatValue());
} catch(NumberFormatException nfe) {
oneChildNode.setQuantityMultiplier(1);
}
ItemConfigurationNode newNode = oneChildNode;
// CONFIGURATOR
if (oneChildNode.isVirtual()) {
// If the part is VIRTUAL and
// productFeatures and productPartRules are not null
// we have to substitute the part with the right part's variant
List productPartRules = delegator.findByAnd("ProductManufacturingRule",
UtilMisc.toMap("productId", productIdForRules,
"productIdFor", node.get("productId"),
"productIdIn", node.get("productIdTo")));
if (substitutedNode != null) {
productPartRules.addAll(delegator.findByAnd("ProductManufacturingRule",
UtilMisc.toMap("productId", productIdForRules,
"productIdFor", substitutedNode.getPart().getString("productId"),
"productIdIn", node.get("productIdTo"))));
}
productPartRules = EntityUtil.filterByDate(productPartRules, inDate);
newNode = substituteNode(oneChildNode, productFeatures, productPartRules, delegator);
if (newNode == oneChildNode) {
// If no substitution has been done (no valid rule applied),
// we try to search for a generic link-rule
List genericLinkRules = delegator.findByAnd("ProductManufacturingRule",
UtilMisc.toMap("productIdFor", node.get("productId"),
"productIdIn", node.get("productIdTo")));
if (substitutedNode != null) {
genericLinkRules.addAll(delegator.findByAnd("ProductManufacturingRule",
UtilMisc.toMap("productIdFor", substitutedNode.getPart().getString("productId"),
"productIdIn", node.get("productIdTo"))));
}
genericLinkRules = EntityUtil.filterByDate(genericLinkRules, inDate);
newNode = null;
newNode = substituteNode(oneChildNode, productFeatures, genericLinkRules, delegator);
if (newNode == oneChildNode) {
// If no substitution has been done (no valid rule applied),
// we try to search for a generic node-rule
List genericNodeRules = delegator.findByAnd("ProductManufacturingRule",
UtilMisc.toMap("productIdIn", node.get("productIdTo")),
UtilMisc.toList("ruleSeqId"));
genericNodeRules = EntityUtil.filterByDate(genericNodeRules, inDate);
newNode = null;
newNode = substituteNode(oneChildNode, productFeatures, genericNodeRules, delegator);
if (newNode == oneChildNode) {
// If no substitution has been done (no valid rule applied),
// we try to set the default (first) node-substitution
if (genericNodeRules != null && genericNodeRules.size() > 0) {
// FIXME
//...
}
}
}
}
} // end of if (isVirtual())
return newNode;
}
protected void loadParents(String partBomTypeId, Date inDate, List productFeatures) throws GenericEntityException {
if (part == null) {
throw new GenericEntityException("Part is null");
}
// If the date is null, set it to today.
if (inDate == null) inDate = new Date();
bomTypeId = partBomTypeId;
GenericDelegator delegator = part.getDelegator();
List rows = delegator.findByAnd("ProductAssoc",
UtilMisc.toMap("productIdTo", part.get("productId"),
"productAssocTypeId", partBomTypeId),
UtilMisc.toList("sequenceNum"));
rows = EntityUtil.filterByDate(rows, inDate);
if ((rows == null || rows.size() == 0) && substitutedNode != null) {
// If no parent is found and this is a substituted node
// we try to search for substituted node's parents.
rows = delegator.findByAnd("ProductAssoc",
UtilMisc.toMap("productIdTo", substitutedNode.getPart().get("productId"),
"productAssocTypeId", partBomTypeId),
UtilMisc.toList("sequenceNum"));
rows = EntityUtil.filterByDate(rows, inDate);
}
children = new ArrayList(rows);
childrenNodes = new ArrayList();
Iterator childrenIterator = children.iterator();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -