在Windchill10.0 系统的默认变更流程中,ECO和ECA的状态同步,是通过同步机来完成,同步的触发是在ECA状态更改时会执行相应代码。这个代码用的非常普遍,但是里面有个细节很值得注意,所以专门写篇文章来记录这个问题。
在同步的代码中使用了这个函数来做同步。WorkflowProcessHelper.checkActivitiesFinished(ChangeOrder2 changeOrder) 传入的参数是ECO对象。这个方法从字面理解的意思是通过ECO来判断ECA是否完成。我们来看看代码。
public static String checkActivitiesFinished(ChangeOrder2 paramChangeOrder2)
throws WTException
{
String str = "NOT_FINISHED";
if ((ChangePlanningHelper.isPlanningSupported()) && (ChangePlanningHelper.getService().hasPlan(paramChangeOrder2))) {
if (ChangePlanningHelper.getService().evaluatePlan(paramChangeOrder2)) {
str = getLatestChangeActivityState(paramChangeOrder2);
}
}
else if (!changeActivitiesExecuting(paramChangeOrder2))
ChangeHelper2.service.emitChangeImplementationEvent(paramChangeOrder2);
else {
str = getLatestChangeActivityState(paramChangeOrder2);
}
return str;
}
这个方法执行后,因为变更流程大多数和项目计划没有关系,所以代码会运行到else if这里。这里通过ECO对象,来判断ECA流程是否在执行。那么ECA流程是否执行的标准是什么呢?继续 changeActivitiesExecuting()这个方法。
static boolean changeActivitiesExecuting(VersionableChangeItem paramVersionableChangeItem)
throws WTException
{
boolean bool = true;
QueryResult localQueryResult1 = ChangeHelper2.service.getLatestChangeActivity((ChangeOrderIfc)paramVersionableChangeItem);
State localState1 = State.toState("IMPLEMENTATION");
if (!localQueryResult1.hasMoreElements()) {
bool = true;
}
while (localQueryResult1.hasMoreElements()) {
int i = 0;
ChangeActivity2 localChangeActivity2 = (ChangeActivity2)localQueryResult1.nextElement();
QueryResult localQueryResult2 = lifeCycleService.getHistory(localChangeActivity2);
while (localQueryResult2.hasMoreElements()) {
State localState2 = ((LifeCycleHistory)localQueryResult2.nextElement()).getState();
if (localState2.equals(localState1)) {
i = 1;
if (!logger.isDebugEnabled()) break;
logger.debug("Implementation State found for the ChangeActivity" + localChangeActivity2); break;
}
}
if (i == 0) {
bool = false;
break;
}
}
if (logger.isDebugEnabled()) {
logger.debug("Are all Change activities executing? " + bool);
}
return bool;
}
通过这个代码我们看到,判断ECA是否在执行的标准是,ECA对象的历史状态中是否包含“实施状态”。如果没有包含,会直接返回ECA的状态是NOT_FINISHED。这样同步就会失败。如果包含了“实施状态”,则会返回当前ECA流程的真正状态。
所以,Windchill系统在判断ECA流程是否有执行的标准是通过状态来判断的。因此我们在做变更流程的时候,变更流程中的状态必须要包含“实施状态”。这样才能用系统提供的API来实现同步。至于ECR和ECO的同步,也是同样的道理。