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



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