解决方案
使用预设配置和自定义挂接来实现用于添加新差异的逻辑。
必备知识
要执行此任务,必须了解以下内容:
基本 MPMLink 和 BOM 结构
涉及 Java 的基本开发
资源束文件自定义的管理
Windchill xconfmanager 和委派概念
解决方案元素
1. DiscrepancyType
DiscrepancyType 表示差异的类型。此类被标记为 supported 且包含预设差异。
这是一个标准 Windchill 枚举,具有其自己的 rbInfo 文件 DiscrepancyTypeRB.rbInfo,可使用预设 enumCustomize 工具进行自定义。
所有标记为可选择的枚举将显示在 MPMLink 的 BOM 变换器接口中。可以使用 enumCustomize 工具来更新现有差异类型列表,也可以添加或移除类型。
2. Discrepancy Interface
Discrepancy2 是用于定义实际差异值对象的基本接口。此类型会标记为受支持类型。 但是,建议扩展支持的抽象类 AbstractDiscrepancy2。此抽象类为接口中使用的方法提供默认实现。
Discrepancy2AbstractDiscrepancy2 的所有实现均应视为值对象,且不应包含业务逻辑。这些实现旨在保存与差异相关的数据。
用于检测和解析差异的实际逻辑将在下一点的差异委派中提供。
此模型可明确分离数据和业务逻辑。您可以根据需要定义一个差异和多个委派,也可以定义一个委派和多个差异。
3. Discrepancy Delegate
Discrepancy Delegate 是用于针对给定差异类型定义委派的基本接口。此类型会标记为受支持类型。 建议为任何自定义需求扩展支持的抽象类 AbstractDiscrepancyDelegate。此抽象类为接口中使用的方法提供默认实现。
委派的主要目的是提供数据和逻辑的分离。委派应负责逻辑。此外,还可将一个委派用于多个差异类型,具体取决于逻辑的复杂性和可重用性。
委派分为两个部分。第一部分可将给定的差异转换为 JSON 格式,耗用 JSON 并返回差异。当您希望报告并解析选定差异时,用户界面需要此功能。但是,如果仅用于服务器端,则可以跳过这些 API。委派的第二个部分是实现用于检测、验证和解析差异的逻辑。
下方给出一个预设配置的示例:
codebase\com\ptc\windchill\associativity\xconfs\associativity.service.properties.xconf
<Service context="default" name="com.ptc.windchill.associativity.reconciliation.DiscrepancyDelegate">
......<Option cardinality="singleton" selector="QUANTITY" requestor="null"
......serviceClass="com.ptc.windchill.associativity.reconciliation.part.QuantityDiscrepancyDelegate"/>
......<Option cardinality="singleton" selector="REMOVED_USAGE" requestor="null"
serviceClass="com.ptc.windchill.associativity.reconciliation.part.RemovedUsageDiscrepancyDelegate"/>

</Service>
* 
selector 为差异类型的内部名称。
4. Reconciliation Context
这是协调服务的主输入。负责的类为 ReconciliationContext。您可以使用 addAdditionalParam 方法提供任何自定义输入。
public void addAdditionalParam(String key, Object value);
可以用一个键或值填充此映射,该键或值可以在整个服务流以及 DiscrepancyDelegate 的大多数自定义挂接中进行读取。这允许根据不同输入进行自定义;例如,针对不同的客户端或服务器使用情况,执行的任务也会有所不同。此外,还允许服务或自定义来缓存性能密集型信息,这些信息可在不同的委派之间重复使用。
5. Reconciliation Criteria
CriteriaType 表示将上游结构的当前小版本与上一个小版本进行比较的条件。此类被标记为 supported 且包含预设条件类型。
这是一个标准 Windchill 枚举,具有其自己 rbInfo 文件 CriteriaTypeRB.rbInfo,可使用预设 enumCustomize 工具进行自定义。
AbstractCriteria 是一个基本类,用于在检测差异时查找要与当前项进行比较的先前项。服务使用先前项构建先前的路径或结构信息,以检测结构差异。
预设提供 TimeBasedCriteriaOutOfDateCriteriaBaselineCriteria。可使用 ReconciliationContext 输入将这些条件插入到服务中。如果未提供,服务将从配置中读取默认条件。
可自定义接口。该接口将接受项集合并返回当前项与先前项的映射。它期望结果针对每个输入提供一个条目。因此,如果未找到先前项,则希望在结果中添加与该值相同的项。接口如下所示:
public abstract Map<Associative, Associative> getCurrentToOldAssociative(ReconciliationContext context, Collection<Associative> associatives) throws WTException;
以下是文件 codebase\com\ptc\windchill\associativity\xconfs\associativity.service.properties.xconf 中给定的默认条件的配置。
<Service context="default" name="com.ptc.windchill.associativity.reconciliation.criteria.AbstractCriteria">
<Option cardinality="singleton" selector="OUTOFDATE" requestor="null"
serviceClass="com.ptc.windchill.associativity.reconciliation.criteria.OutOfDateCriteria" />
<Option cardinality="duplicate" selector="TIMEBASED" requestor="null"
serviceClass="com.ptc.windchill.associativity.reconciliation.criteria.TimeBasedCriteria"/>
<Option cardinality="duplicate" selector="BASELINE" requestor="null"
serviceClass="com.ptc.windchill.associativity.reconciliation.criteria.BaselineCriteria"/>
</Service>
6. Reconciliation Service
与差异模型进行交互的主服务接口为 ReconciliationService。服务提供用于根据输入和配置检测或解析差异的 API。以下是服务所需的最少输入:
a. 更改上下文:需要在其下检测所有更改或差异的根节点。这是所有更改的常用对等上下文,不一定是结构的绝对根。这有助于考虑性能。层次结构中的更改上下文越高,服务的性能影响就越大。假设为上游。
b. 更改项:在给定更改上下文下发生更改的项。假设这些为上游项。
c. 更改项路径:给定更改上下文下的更改项的路径。路径从提供结构信息的用户界面开始。这有助于降低性能影响。此输入是可选的。
d. 上游导航条件:用于遍历上游结构的导航条件。此为可选条件,但也应提供。如果未提供,则服务将接收更改上下文的默认导航条件。如果未正确配置默认导航条件,可能会导致问题。
e. 下游导航条件:用于遍历下游结构的导航条件。此为可选条件,但也应提供。如果未提供,则服务将接收下游更改上下文的默认导航条件。如果未正确配置默认导航条件,可能会导致问题。
f. 下游更改上下文:应在其下验证或解析差异的下游根。仅需要检测差异时,此为可选项。
上述输入可使用 ReconciliationContext bean 对象提供。
7. ReconciliationDelegate
这是一个基本接口,用于定义委派以在检测和解析差异后执行预操作和后操作。它具有对要解析的差异进行排序的逻辑。该委派被标记为 supported。
预设配置如下所示:
codebase\com\ptc\windchill\associativity\xconfs\associativity.service.properties.xconf
<Service context="default" name="com.ptc.windchill.associativity.reconciliation.ReconciliationDelegate">
<Option cardinality="singleton" requestor="wt.part.WTPart"
serviceClass="com.ptc.windchill.associativity.reconciliation.DefaultReconciliationDelegate"/>
</Service>
这对您有帮助吗?