自定义示例
本节中的示例仅关注为了使新添加的属性在 ESI RPC 响应中显示需要在 ESI 服务中执行的操作。这些示例不涵盖中间件业务逻辑中可能需要的任何变更或 SAP 中可能需要的配置设置。有关如何自定义中间件业务逻辑或配置目标 SAP 系统的信息,请参阅本指南中的相关小节,以说明可能通过 ESI 响应发送的其他属性。
发布具有附加属性的部件
附加属性可以是模型化属性或可变属性,也可以是 IBA。将该属性命名为 standardPrice。要通过 ESI 响应发送此属性,请执行以下步骤:
i. 将 standardPrice 添加到 WTPart 作为可变属性 (使用“类型和属性管理”用户界面) 或 IBA。或者,可以将其添加为 WTPart 可变类型扩展上的可变属性或模型化属性 (在此情况下,应编辑 Windchill ESI 首选项“部件类”以使其指向 WTPart 扩展类的完全限定名)。
ii. 创建 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>ObjectID</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 响应元信息文件的详细信息,请参阅 修改 ESI 响应元信息文件一节。
|
iii. 使用“管理分布”用户界面 (显示在“站点”->“实用程序”或“组织”->“实用程序”下),调出部件要发布到的分布目标的“编辑分布目标”用户界面。将“ESI 响应元信息文件路径”字段设置为指向在步骤 (ii) 中修改的文件。单击“确定”保存分布目标。将已编辑目标与正在发布的部件关联 (如果尚未关联)。
iii. 使用“管理分布”用户界面 (显示在“站点”->“实用程序”或“组织”->“实用程序”下),调出部件要发布到的分布目标的“编辑分布目标”用户界面。将“ESI 响应元信息文件路径”字段设置为指向在步骤 (ii) 中修改的文件。单击“确定”保存分布目标。将已编辑目标与正在发布的部件关联 (如果尚未关联)。
立即发布部件 (将属性 standardPrice 设置为所需值) 时,应该会导致在步骤 (iii) 中编辑的分布目标的新增属性 (即 StandardPrice) 随 ESI 响应一起发送。如果是首次发布部件,则子 XML 元素 <StandardPrice> 将显示在响应的 <AddedParts> 部分中的 <Part> 元素内。显然,上述用例仅需要修改响应元信息文件,且在这种情况下无需进行任何自定义。
|
• 响应的 <Part> 元素内 <StandardPrice> 元素的位置取决于 Map 元素 (属于响应元信息文件) 中新条目的添加位置。例如,如果将其作为最后一个条目添加到 Map 元素中 (如上述示例所示),则 <StandardPrice> 会显示为响应的 <Part> 元素内的最后一个子元素。
• 发布 WTPart 的可变类型 (或模型化) 扩展时,仅当需要发布与 WTPart 对象不同的扩展属性集时,ESI 响应元信息文件才需要变更 (如上述步骤 ii 所述)。有关详细信息,请参阅 修改 ESI 响应信息文件时需要注意的点一节。
|
发布包含额外信息的部件
有时,用户可能希望在 ESI 响应的 <Part> 元素中发送额外信息,该信息未作为属性包含在 WTPart 对象中 - 例如,名为 <IsAssembly> 的子 XML 元素,用于确定给定部件是否为装配。要使该子元素出现在 ESI 响应中,需要执行以下步骤:
i. 创建 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>ObjectID</esi:keyAttribute>
<esi:mapRef>ESINewPart</esi:mapRef>
</esi:MapInformation>
有关如何修改 ESI 响应元信息文件内容的详细信息,请参阅
修改 ESI 响应元信息文件一节。
ii. 创建类 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;
}
iii. 使用“管理分布”用户界面 (显示在“站点”->“实用程序”或“组织”->“实用程序”下),调出部件要发布到的分布目标的“编辑分布目标”用户界面。将“ESI 响应元信息文件路径”字段设置为指向在步骤 (i) 中修改的文件。单击“确定”保存分布目标。将已编辑目标与正在发布的部件关联 (如果尚未关联)。
iv. 打开文件 <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 属性的值为 ESIWTPartRenderer (在步骤 (ii) 中创建) 扩展的完全限定名。有关详细信息,请参阅小节 3.7.4.1。
v. 从 Windchill shell 运行命令 "xconfmanager –p",以相应地传播在步骤 (iv) 中所做的变更。重新启动 MethodServer。
立即发布部件会导致 <IsAssembly> 元素随 ESI 响应一起发送。请注意,此用例需要自定义部件呈现器,因为它需要发送未作为属性包含在 WTPart 对象上的信息,这意味着无法使用 Query-Objects Webject 提取该信息。
发布已在标头部分中添加属性的装配
此示例需要遵循与第 10.1.2.1 节中所述步骤相同的步骤集,唯一不同的是步骤 (ii) 中引用的响应元信息文件的 Map 和 MapInformation 元素用于 BOM 标头。换句话说,ID 属性值为 "BOMHeader" 的 Map 元素将具有新的 attributeMapping 元素;此外,Map 元素的 ID 属性将使用已修改的值 (例如 "NewBOMHeader"),并且相关 MapInformation 元素的 mapRef 元素将使用此已修改的值。此外,当首次发布装配时,新的子 XML 元素 (与已添加属性相对应) 将显示在响应的 <AddedBOMs> 部分内的 <BOMHeader> 元素中。
发布包含额外信息的装配
同样,此示例需要遵循与第 10.1.2.2 节中所述步骤相同的步骤集,唯一不同的是步骤 (i) 中引用的响应元信息文件的 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 响应发送此属性,请执行以下步骤:
i. 使用“类型和属性管理”用户界面以常用方式在 WTPartUsageLink 上添加 color 可变属性。
ii. 创建 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 属性的已修改值。
iii 使用“管理分布”用户界面 (显示在“站点”->“实用程序”或“组织”->“实用程序”下),调出装配要发布到的分布目标的“编辑分布目标”用户界面。将“ESI 响应元信息文件路径”字段设置为指向在步骤 (ii) 中修改的文件。单击“确定”保存分布目标。将已编辑目标与要发布的装配 (及其零部件) 关联 (如果尚未关联)。
立即发布装配 (将每个组件的属性 color 设置为所需值) 将导致新添加的属性 (即 Color) 随 ESI 响应一起发送。如果首次发布装配,则子 XML 元素 <Color> 将显示在响应的 <AddedBOMComponents> 部分的 <BOMComponent> 元素内。显然,上述用例仅需要修改响应元信息文件,且在这种情况下无需进行任何自定义。
|
ESI 响应的 <BOMComponent> 元素内 <Color> 元素的位置取决于响应元信息文件的 Map 元素中新条目的添加位置。
|
8.8.3.6 发布已在零部件中添加信息的装配
有时可能需要在 ESI 响应的 <BOMComponent> 元素中发送一些额外信息 - 例如,子元素 <IsEndItem> 用于确定给定零部件是否为成品。这可通过执行以下步骤实现:
i. 创建响应元信息文件的副本并修改其内容,如下所示:
<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>
ii. 创建 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.getPartMaster().isEndItem(); String endItemAsStr = String.valueOf(endItem);
att.setValue(endItemAsStr);
}
return elem;
}
iii. 使用“管理分布”用户界面 (显示在“站点”->“实用程序”或“组织”->“实用程序”下),调出装配要发布到的分布目标的“编辑分布目标”用户界面。将ESI 响应元信息文件路径 字段设置为指向在步骤 (i) 中修改的文件。单击“确定”保存分布目标。将已编辑目标与要发布的装配 (及其零部件) 关联 (如果尚未关联)。
iv. 打开文件 <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 属性的值为 ESIBOMComponentRenderer (在步骤 (ii) 中创建) 扩展的完全限定名。
v. 从 Windchill shell 运行命令 "xconfmanager –p",以相应地传播在步骤 (iv) 中所做的变更。重新启动 MethodServer。
立即发布装配会导致 <IsEndItem> 元素随 ESI 响应一起发送。请注意,此用例需要自定义组件呈现器,因为它需要发送未作为属性包含在 WTPartUsageLink 对象上的信息,这意味着无法使用 Query-Objects Webject 提取该信息。
8.8.3.7 发布使用与在装配部件小版本上设置的使用不同的装配
可在发布装配时改写使用 BOM 变换器在装配部件小版本上设置的使用关系值。这需要执行以下步骤:
i. 将 Windchill ESI 首选项“视图到分布目标映射”设置为将 Windchill 视图与装配发布到的分布目标相关的值。例如,如果装配在设计视图中创建,并且要发布到“编号”属性值为 00001 的分布目标,则该首选项可设置为 Design:00001。
ii. 将 Windchill ESI 首选项“视图到 BOM 类型映射”设置为将 Windchill 视图与所需 BOM 使用值相关的值。例如,如果要将装配发布为工程装配,则该首选项可设置为 Design:Engineering。
|
可以为站点或组织设置上述首选项,具体取决于装配是位于站点中还是组织内。
|
iii. 将编号为 00001 的分布目标关联到所讨论的装配,然后发布该装配。
|
如果分布目标的“上下文的默认值”属性值为“是”,则 (i) 中所述的设置将确保目标自动关联到装配部件。
|
上述情况将导致装配作为工程装配发送,这可以根据已发布装配的 ESI 响应中 Usage 元素的内容确定。切记,这样发送的值将改写可能已使用 BOM 变换器在装配部件小版本上设置的任何其他 BOM 使用关系值。
8.8.3.8 将装配的不同使用发布至 Oracle 中的同一工厂
用户可能想要将装配的不同使用 (例如,Engineering 和 Production) 发布至 Oracle 中的同一工厂。为此,需要执行以下步骤:
i. 使用“新建分布目标”用户界面创建 Oracle 分布目标,并将其“编号”属性设置为 00001,并将“工厂”属性设置为 1100 (其中,1100 是目标 Oracle 系统中的有效工厂名称)。根据需要设置分布目标的其他属性。
ii. 创建第二个 Oracle 分布目标,将其“编号”属性设置为 00002。将与 Oracle 系统相关的其他属性 (如工厂、系统 ID 和客户端) 设置为与在步骤 (i) 中创建的目标使用完全相同的属性值。
iii. 将 Windchill ESI 首选项“视图到分布目标映射”设置为 Design:00001,Manufacturing:00002。
iv. 将 Windchill ESI 首选项“视图到 BOM 类型映射”设置为 Design:Engineering,Manufacturing:Production。
v. 将分布目标 00001 和 00002 关联到装配 (及其零部件) 并发布装配。
上述操作将导致装配作为工程 BOM 发送至编号为 00001 的分布目标,以及作为生产 BOM 发送至编号为 00002 的分布目标。但是,由于两个目标都指向 Oracle 中的同一个工厂,中间件业务逻辑最终会将装配的两个使用发布到同一工厂。
|
此处依据的基本假设是,装配及其零部件在 Windchill 中的设计视图中创建,因此这两个分布目标 (00001 和 00002) 都可以与之关联。
|