/// <summary> /// 得到可以抵达的线 /// </summary> /// <returns></returns> public WfTransitionDescriptorCollection GetAllCanTransitTransitions() { WfTransitionDescriptorCollection result = CreateNewCollection(); foreach (WfTransitionDescriptor transition in this) { if (transition.CanTransit()) { result.Add(transition); } } return(result); }
private static WfTransitionDescriptorCollection FindCanTransitTransitions(IWfProcess process, WfTransitionDescriptorCollection transitions) { WfTransitionDescriptorCollection result = null; if (WfContext.Current.AutoFindPassedTransitions) { IWfTransitionDescriptor transition = FindNearestPassedTransitionDescriptor(process, transitions); result = transitions.CreateNewCollection(); if (transition != null) { result = transitions.CreateNewCollection(); result.Add(transition); } else { result = transitions.GetAllCanTransitTransitions(); } } else { try { result = transitions.GetAllCanTransitTransitions(); } catch (WfTransitionEvaluationException ex) { IWfTransitionDescriptor transition = FindNearestPassedTransitionDescriptor(process, transitions); if (transition != null) { result = transitions.CreateNewCollection(); result.Add(transition); } else { throw ex; } } } return(result); }
private static void FindNextStepActivityDescriptor( IWfActivityDescriptor currentAct, bool autoCalcaulatePath, IWfProcess process, List <IWfActivityDescriptor> alreadyScanedActivities) { IWfActivityDescriptor act = null; int maxPriority = 255; WfTransitionDescriptorCollection transitions = null; if (autoCalcaulatePath == false) { transitions = currentAct.ToTransitions; } else { transitions = FindCanTransitTransitions(process, currentAct.ToTransitions); } IWfActivityDescriptor target = GetTransitionValidTarget(transitions.FindDefaultSelectTransition()); if (target != null) { if (alreadyScanedActivities.Exists(a => a.Key == target.Key) == false) { act = target; } } if (act == null) { foreach (IWfTransitionDescriptor transition in transitions) { target = GetTransitionValidTarget(transition); if (target != null) { if (alreadyScanedActivities.Exists(a => a.Key == target.Key) == false) { if (string.IsNullOrEmpty(target.LevelName) == false) { if (transition.Priority < maxPriority) { act = target; maxPriority = transition.Priority; } } } } } } if (act != null) { if (act is IWfCompletedActivityDescriptor == false) { alreadyScanedActivities.Add(act); FindNextStepActivityDescriptor(act, autoCalcaulatePath, process, alreadyScanedActivities); } } }
/// <summary> /// 在线中,查找最接近的经过的线 /// </summary> /// <param name="process"></param> /// <param name="transitionDesps"></param> /// <returns></returns> private static IWfTransitionDescriptor FindNearestPassedTransitionDescriptor(IWfProcess process, WfTransitionDescriptorCollection transitionDesps) { IWfTransitionDescriptor result = null; if (process != null) { IWfActivity currentActivity = process.LastActivity; while (currentActivity != null) { IWfTransitionDescriptor fromTransitionDescriptor = currentActivity.FromTransitionDescriptor; if (fromTransitionDescriptor != null) { if (transitionDesps.Exists(t => t.Key == fromTransitionDescriptor.Key)) { result = fromTransitionDescriptor; break; } } if (currentActivity.FromTransition != null) { currentActivity = currentActivity.FromTransition.FromActivity; } else { currentActivity = null; } } } return(result); }