高级自定义 > 业务逻辑自定义 > Windchill ProjectLink 自定义 > 编写自定义 Windchill ProjectLink 算法 > 状况和最后期限计算的自定义处理程序指引
  
状况和最后期限计算的自定义处理程序指引
* 
自定义处理程序应仅修改 HealthStatusDeadline,而不应修改任何其他活动属性。
应尽可能使用多对象 API (将集合作为自变量而非单独对象的 API)。这样有助于避免在循环中调用 API。
例如,要获取系统中所有正在运行的计划,应按如下所述编写 API:
public WTCollection getActivePlans(){
QuerySpec qs = new QuerySpec();
int idxPlan = qs.appendClassList(Rootable.class, true);
SearchCondition scForActivePlans = new SearchCondition (
Plan.class,
Plan.PLANNABLE_STATE,
SearchCondition.EQUAL,
PlannableState.INPROCESS);
qs.appendWhere(scForActivePlans, new int[] { idxPlan });
PlanResultProcessor resultProcessor = new PlanResultProcessor();
PersistenceServerHelper.manager.query((StatementSpec) qs, resultProcessor);
WTHashSet plans = new WTHashSet(PersistenceHelper.manager.find(qs));
return plans;
}
自定义处理程序应始终在使用以下 API 对该对象执行任何更新操作之前刷新活动集合:
WTCollection summaryActivities = new WTArrayList(activitiesCollection);
leafActivities = CollectionsHelper.manager.refresh(leafActivities);
自定义处理程序应始终在修改后保存活动。
应最好使用多对象 API:
PersistenceHelper.manager.save(activities)
如果仅保存单个活动,请使用以下 API:
PersistenceHelper.manager.save(leafAct)
要从自定义事件监听程序调用自定义算法,请从 LeafActivityHealthStatusHandlerFactory 调用以下 API:
void calculateDeadlineAndHealthStatus(WTCollection activities, Object event) throws WTException, WTPropertyVetoException
避免冗余对象处理
执行特定操作时,可能会触发多个事件。例如,如果用户在自动执行计划中针对活动完成“跟踪工时”操作时将“完工率”设置为 100,则会触发以下事件:
计划活动状态更改
EPP 百分比更改
EPP 完成更改
如果在所有事件中仅共享一个自定义算法 (例如,如果算法不是基于事件的),则这将三次调用同一数据的同一自定义算法。
为避免重复执行您的算法,可以合并 MethodContextProcessedEvent
MethodContext 提供有关所抛出事件以及抛出这些事件的对象的操作特定信息。此信息按如下格式提供:
HashMap(<Project Management Event Name>, <List of Objects>)
每当单个操作调度和监听多个事件时,HashMap 即会在处理每个事件后更新该事件和所处理对象的条目。
然后,可以使用 ProcessedEvent 键从 MethodContext 获取 HashMap 对象:
HashMap(String, WTArrayList) objMap = MethodContext.get(“ProcessedEvent”);
在此映射中,keyProjectManagementEvent 的事件名称,而 value 为作为该事件的一部分处理的对象列表。
您的自定义算法可遍历键集,并查找到目前为止已处理的对象。
例如,一个活动集合会抛出两个事件:EPP_PERCENT_CHANGE 和 EPP_FINISH_CHANGE:
1. 首先会抛出 EPP_PERCENT_CHANGE 事件。
2. 处理完成后,HashMap 即会更新如下:
HashMap("ProcessedEvent", HashMap(EPP_PERCENT_CHANGE, <List of Objects>));
3. 抛出 EPP_FINISH_CHANGE 事件。
现在,如果您的算法监听 EPP_FINISH_CHANGE 事件,则可以通过读取 HashMap 来检查已由 EPP_PERCENT_CHANGE 事件处理的对象集合。由此,您可以确定是否需要为 EPP_FINISH_CHANGE 事件处理相同的对象。如果不需要,则可以跳过此集合。