自定义示例
本节中的示例仅关注为了使新添加的属性在 ESI RPC 响应中显示需要在 ESI 服务中执行的操作。有关涵盖其他自定义选项的示例,请参阅“ERP Connector 自定义示例”一节。
发布具有附加属性的部件
附加属性可以是模型化属性或可变属性,也可以是 IBA。将该属性命名为 standardPrice。要通过 ESI 响应发送此属性,请执行以下步骤:
1. 将 standardPrice 添加为使用类型和属性管理用户界面的可变属性,或添加为 IBA。或者,可以将其添加为 WTPart 可变类型扩展上的可变属性或模型化属性 (在此情况下,应编辑 Windchill ESI 首选项“部件类”以使其指向 WTPart 扩展类的完全限定名称)。
2. 创建 ESI 响应元信息文件的副本并修改其内容,如下所述:
<esi:Map id="ESINewPart">
<esi:attributeMapping sourceAttribute="obid">ObjectID</esi:attributeMapping>
…
<esi:attributeMapping sourceAttribute="iterationInfo.identifier.iterationId">Iteration</esi:attributeMapping>
<esi:attributeMapping sourceAttribute="PreviousVersion">PreviousVersion</esi:attributeMapping>
…
<esi:attributeMapping sourceAttribute="standardPrice">StandardPrice</esi:attributeMapping>
</esi:Map>
<esi:MapInformation id="ESIPartInfo">
<esi:typedef>wt.part.WTPart</esi:typedef>
<esi:elementMetaName>Part</esi:elementMetaName>
<esi:keyAttribute>Number</esi:keyAttribute>
…
<esi:mapRef>ESINewPart</esi:mapRef>
</esi:MapInformation>
如上面突出显示的部分所示,需要变更 Map 和 MapInformation 元素 (将 "ESIPart" 和 "ESIPartInfo" 作为其 ID 属性值)。Map 元素的 ID 属性已设置为已修改值,并为属性 standardPrice 新增一个 attributeMapping 元素。此外,相关 MapInformation 元素的 mapRef 元素的值也设置为 Map 元素 ID 属性的已修改值。
|
只要对 Map 元素进行任何变更,也必须相应变更其 ID 属性值。此外,如果添加新属性 (如 standardPrice) 导致 WTPart 的新扩展,则应提供该类型的完全限定名称作为 MapInformation 元素的 typedef 元素值。有关详细信息,请参阅 修改 ESI 响应元信息文件。
|
3. 使用“管理分布”用户界面 (显示在 > 或 > 下),调出部件要发布到的分布目标的“编辑分布目标”用户界面。将 ESI Response Meta Information File Path 字段设置为指向已在步骤 2 中修改的文件。单击“确定”保存分布目标。将已编辑目标与正在发布的部件关联 (如果尚未关联)。
立即发布部件 (将属性 standardPrice 设置为所需值) 时,应该会导致在步骤 3 中编辑的分布目标的新增属性 (即 StandardPrice) 随 ESI 响应一起发送。如果是首次发布部件,则子 XML 元素 <StandardPrice> 将显示在响应的 <AddedParts> 部分中的 <Part> 元素内。显然,上述用例仅需要修改响应元信息文件,且在这种情况下无需进行任何自定义。
|
• 响应的 <Part> 元素内 <StandardPrice> 元素的位置取决于 Map 元素 (属于响应元信息文件) 中新条目的添加位置。例如,如果将其作为最后一个条目添加到 Map 元素中 (如上述示例所示),则 <StandardPrice> 会显示为响应的 <Part> 元素内的最后一个子元素。
• 发布 WTPart 的可变类型 (或模型化) 扩展时,仅当需要发布与 WTPart 对象不同的扩展属性集时,ESI 响应元信息文件才需要变更 (如上述步骤 ii 所述)。有关详细信息,请参阅 修改 ESI 响应信息文件时需要注意的点一节。
|
发布包含额外信息的部件
有时,用户可能希望在 ESI 响应的 <Part> 元素中发送额外信息,该信息未作为属性包含在 WTPart 对象中 - 例如,名为 <IsAssembly> 的子 XML 元素,用于确定给定部件是否为装配。要使该子元素出现在 ESI 响应中,需要执行以下步骤:
1. 创建 ESI 响应元信息文件的副本并修改其内容,如下所述:
<esi:Map id="ESINewPart">
<esi:attributeMapping sourceAttribute="obid">ObjectID</esi:attributeMapping>
…
<esi:attributeMapping sourceAttribute="isAssembly">IsAssembly</esi:attributeMapping>
</esi:Map>
<esi:MapInformation id="ESIPartInfo">
<esi:typedef>wt.part.WTPart</esi:typedef>
<esi:elementMetaName>Part</esi:elementMetaName>
<esi:keyAttribute>Number</esi:keyAttribute>
…
<esi:mapRef>ESINewPart</esi:mapRef>
</esi:MapInformation>
2. 创建类 com.ptc.windchill.esi.esipart.ESIWTPartRenderer 的扩展并改写 adjustPartElement() 方法,如下所示:
protected Element adjustPartElement( Element element, String group, WTPart part, Eff[] effs, Collection targets )
throws ESIRendererException { boolean isAssem;
try {
isAssem = new BOMUtility().isBom(part);
}
catch(WTException wte) {
ESILogger.debug("Exception while invoking isBom() for part: " + part.getNumber());
throw new ESIRendererException(wte);
}
Att att = element.getAtt(“IsAssembly”);
if(att != null && (att.getValue() == null || att.getValue().toString().trim().equals(“”)))
{
att.setValue(String.valueOf(isAssem));
}
return element;
}
3. 使用“管理分布”用户界面 (显示在 > 或 > 下),调出部件要发布到的分布目标的“编辑分布目标”用户界面。将 ESI Response Meta Information File Path 字段设置为指向已在步骤 1 中修改的文件。单击“确定”保存分布目标。将已编辑目标与正在发布的部件关联 (如果尚未关联)。
4. 打开文件 <Windchill>\codebase\com\ptc\windchill\esi\conf\esi.service.properties.xconf,然后查找以下条目:
<Option cardinality="duplicate" requestor="wt.part.WTPart" serviceClass="com.ptc.windchill.esi.esipart.ESIWTPartRenderer"/>
编辑上述条目,以使 serviceClass 属性的值为在步骤 2 中创建的 ESIWTPartRenderer 扩展的完全限定名称。有关详细信息,请参阅
自定义点。
5. 从 Windchill shell 运行命令 xconfmanager –p,以相应地传播在步骤 4 中所做的变更。重新启动 MethodServer。
立即发布部件会导致 <IsAssembly> 元素随 ESI 响应一起发送。请注意,此用例需要自定义部件呈现器,因为它需要发送未作为属性包含在 WTPart 对象上的信息,这意味着无法使用 Query-Objects Webject 提取该信息。
发布已在标头部分中添加属性的装配
此示例需要遵循与“发布具有附加属性的部件”一节中所述步骤相同的步骤集,唯一不同的是步骤 2 中引用的响应元信息文件的 Map 和 MapInformation 元素用于 BOM 标头。换句话说,ID 属性值为 BOMHeader 的 Map 元素将具有新的 attributeMapping 元素;此外,Map 元素的 ID 属性将使用已修改的值 (例如 NewBOMHeader),并且相关 MapInformation 元素的 mapRef 元素将使用此已修改的值。此外,当首次发布装配时,新的子 XML 元素 (与已添加属性相对应) 将显示在响应的 <AddedBOMs> 部分内的 <BOMHeader> 元素中。
发布包含额外信息的装配
同样,此示例需要遵循与“发布包含额外信息的部件”一节中所述步骤相同的步骤集,唯一不同的是步骤 1 中引用的响应元信息文件的 Map 和 MapInformation 元素值分别为 BOMHeader 和 BOMHeaderInfo。此外,要扩展的 Java 类为 com.ptc.windchill.esi.bom.ESIBOMHeaderRenderer,要改写的方法如下所示:
受保护的 Element adjustElement( Element element, String group, WTPart part, Eff[] effs, Collection targets) 抛出 ESIRendererException
此外,要编辑的 ESI 服务特性条目如下:
<Option cardinality="duplicate" requestor="wt.part.WTPart" selector="BOMHEADER" serviceClass="com.ptc.windchill.esi.bom.ESIBOMHeaderRenderer"/>
|
编辑上述条目,以使 serviceClass 属性的值为 ESIBOMHeaderRenderer 扩展的完全限定名称。以常用方式传播此特性,然后重新启动 MethodServer。
|
立即发布装配将导致所需的额外信息随 ESI 响应一起发送。这将作为新添加的子 XML 元素出现在 ESI 响应的 <BOMHeader> 元素中。
发布已在 WTPartUsageLink 上添加属性的装配
本示例考虑发布已添加到 WTPartUsageLink 对象的可变属性,用于将装配部件链接到特定部件主数据。将可变属性命名为 color。要通过 ESI 响应发送此属性,请执行以下步骤:
• 使用类型和属性管理用户界面以常用方式在 WTPartUsageLink 上添加 color 可变属性。
• 创建 ESI 响应元信息文件的副本并修改其内容,如下所述:
<esi:Map id="NewBOMComponent">
<esi:attributeMapping sourceAttribute="PartMasterID">ObjectID</esi:attributeMapping>
…
<esi:attributeMapping sourceAttribute="PartUsageLink.ComponentId">ComponentId</esi:attributeMapping>
<esi:attributeMapping sourceAttribute="xxxx">IsChildPhantom</esi:attributeMapping>
…
<esi:attributeMapping sourceAttribute="color">Color</esi:attributeMapping>
</esi:Map>
<esi:MapInformation id="BOMComponentInfo">
<esi:typedef>wt.part.WTPartUsageLink</esi:typedef>
...
<esi:mapRef>NewBOMComponent</esi:mapRef>
</esi:MapInformation>
如上面突出显示的部分所示,需要变更 Map 和 MapInformation 元素 (将 BOMComponent 和 BOMComponentInfo 作为其 ID 属性值)。Map 元素的 ID 属性设置为已修改值,并为属性 color 新增了一个 attributeMapping 元素。此外,相关 MapInformation 元素的 mapRef 元素的值也设置为 Map 元素 ID 属性的已修改值。
• 使用显示在 > 或 > 下的“管理分布”用户界面,调出装配要发布到的分布目标的“编辑分布目标”用户界面。将 ESI Response Meta Information File Path field 设置为指向已在步骤 2 中修改的文件。单击“确定”保存分布目标。将已编辑目标与要发布的装配 (及其零部件) 关联 (如果尚未关联)。
立即发布装配 (将每个组件的属性 color 设置为所需值) 将导致新添加的属性 (即 Color) 随 ESI 响应一起发送。如果首次发布装配,则子 XML 元素 <Color> 将显示在响应的 <AddedBOMComponents> 部分的 <BOMComponent> 元素内。显然,上述用例仅需要修改响应元信息文件,且在这种情况下无需进行任何自定义。
|
ESI 响应的 <BOMComponent> 元素内 <Color> 元素的位置取决于响应元信息文件的 Map 元素中新条目的添加位置。
|
发布已在零部件中添加信息的装配
有时可能需要在 ESI 响应的 <BOMComponent> 元素中发送一些额外信息 - 例如,用于确定给定零部件是否为成品的子元素 <IsEndItem>。这可通过执行以下步骤实现:
1. 创建响应元信息文件的副本并修改其内容,如下所示:
<esi:Map id="NewBOMComponent">
<esi:attributeMapping sourceAttribute="PartMasterID">ObjectID</esi:attributeMapping>
…
<esi:attributeMapping sourceAttribute="PartUsageLink.ComponentId">ComponentId</esi:attributeMapping>
<esi:attributeMapping sourceAttribute="xxxx">IsChildPhantom</esi:attributeMapping>
…
<esi:attributeMapping sourceAttribute="isEndItem">IsEndItem</esi:attributeMapping>
</esi:Map>
<esi:MapInformation id="BOMComponentInfo">
<esi:typedef>wt.part.WTPartUsageLink</esi:typedef>
...
<esi:mapRef>NewBOMComponent</esi:mapRef>
</esi:MapInformation>
2. 创建 ESIBOMComponentRenderer 类的扩展并改写方法 adjustElement(Element, String, PartUsageInfo, Collection),如下所示:
受保护的 Element adjustElement(Element elem, String group, PartUsageInfo pui, Collection targets )
throws ESIRendererException { Att att = elem.getAtt(“IsEndItem”);
if(att != null && (att.getValue() == null || att.getValue().toString().trim().equals(NULL_STRING)))
{
boolean endItem = pui.getUses().isEndItem();
String endItemAsStr = String.valueOf(endItem);
att.setValue(endItemAsStr);
}
return elem;
}
3. 使用显示在 > 或 > 下的“管理分布”用户界面,调出装配要发布到的分布目标的“编辑分布目标”用户界面。将 ESI Response Meta Information File Path 字段设置为指向已在步骤 1 中修改的文件。单击“确定”保存分布目标。将已编辑目标与要发布的装配 (及其零部件) 关联 (如果尚未关联)。
4. 打开文件 <Windchill>\codebase\com\ptc\windchill\esi\conf\esi.service.properties.xconf,然后查找以下条目:
<Option cardinality="duplicate" requestor="wt.part.WTPart" selector="BOMCOMPONENT" serviceClass="com.ptc.windchill.esi.bom.ESIBOMComponentRenderer"/>
编辑上述条目,以使 serviceClass 属性的值为在步骤 2 中创建的 ESIBOMComponentRenderer 扩展的完全限定名称。
5. 从 Windchill shell 运行命令 xconfmanager –p,以相应地传播在步骤 4 中所做的变更。重新启动 MethodServer。
立即发布装配会导致 <IsEndItem> 元素随 ESI 响应一起发送。请注意,此用例需要自定义组件呈现器,因为它需要发送未作为属性包含在 WTPartUsageLink 对象上的信息,这意味着无法使用 Query-Objects Webject 提取该信息。
发布使用关系与在装配部件小版本上设置的使用关系不同的装配
可在发布装配时改写使用 BOM 变换器在装配部件小版本上设置的使用关系值。这需要执行以下步骤:
1. 将 Windchill ESI 首选项“视图到分布目标映射”设置为将 Windchill 视图与装配发布到的分布目标相关的值。例如,如果装配在设计视图中创建,并且要发布到“编号”属性值为 00001 的分布目标,则该首选项可设置为 Design:00001。
2. 将 Windchill ESI 首选项“视图到 BOM 类型映射”设置为将 Windchill 视图与所需 BOM 使用关系值相关的值。例如,如果要将装配发布为工程装配,则该首选项可设置为 Design:Engineering。
|
可以为站点或组织设置上述首选项,具体取决于装配是位于站点中还是组织内。
|
3. 将编号为 00001 的分布目标关联到所讨论的装配,然后发布该装配。
|
如果分布目标的“上下文的默认值”属性值为“是”,则 (i) 中所述的设置将确保目标自动关联到装配部件。
|
上述情况将导致装配作为工程装配发送,这可以根据已发布装配的 ESI 响应中 Usage 元素的内容确定。切记,这样发送的值将改写可能已使用 BOM 变换器在装配部件小版本上设置的任何其他 BOM 使用关系值。
发布具有已删除 BOM 组件 (包含自定义属性) 的装配
本节概述了从数据库中删除 BOM 组件时保留自定义属性值的步骤。这些步骤适用于以下链接类型:
• wt.mpm.rawmaterial.RawMaterialLink
• wt.mpm.coproduce.CoProduceMemberLink
• wt.mpm.coproduce.CoProduceUsageLink
在 ESI 响应中发送原材料、联合生产成员或联合生产使用关系链接时,在已删除 BOM 组件元素中标识要发送的自定义 (可变) 属性及其原始值。
在 esi:Map id="BOMComponent" 元素或 ESIResponseMetaInfo.xml 文件内的对等自定义元素中添加此类属性。
XML 属性 storeInSnapshotForTypes 将会添加到同一元素中。storeInSnapshotForTypes 支持三种类型链接 (即,wt.mpm.rawmaterial.RawMaterialLink、wt.mpm.coproduce.CoProduceMemberLink 和 wt.mpm.coproduce.CoProduceUsageLink) 中的一种或多种。
例如,假定将字符串类型的 TestAttr IBA 添加到类型 wt.mpm.rawmaterial.RawMaterialLink,并将字符串类型的 SortAttr IBA 添加到类型 wt.mpm.coproduce.CoProduceMemberLink 和 wt.mpm.coproduce.CoProduceUsageLink。
要将 TestAttr 和 SortAttr 的原始值包括在 ESI 响应中,请在已删除 BOM 组件元素中发送这些值时,在 ESIResponseMetaInfo.xml 组元素下的 esi:Map id="BOMComponent" 文件中添加以下元素条目。
建议在更新 BOM 组件映射的内容时更新其 id 属性。
<esi:Map id="BOMComponent">
<esi:attributeMapping sourceAttribute="TestAttr" storeInSnapshotForTypes="wt.mpm.rawmaterial.RawMaterialLink">TestAttr</esi:attributeMapping>
<esi:attributeMapping sourceAttribute="SortAttr" storeInSnapshotForTypes="wt.mpm.coproduce.CoProduceMemberLink,wt.mpm.coproduce.CoProduceUsageLink">SortAttr</esi:attributeMapping>
</esi:Map>
|
XML 配置更改不适用于具有指定链接上的可变属性的已发布 BOM 结构。配置更改仅适用于未发布的 BOM 结构。
|