Windchill 中默認EC流程的研究

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章