在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的同步,也是同樣的道理。