public WfTransitionDescriptorCollection GetAllEnabledTransitions() { WfTransitionDescriptorCollection result = CreateNewCollection(); foreach (WfTransitionDescriptor transition in this) { if (transition.Enabled) { result.Add(transition); } } result.Sort((t1, t2) => { int compareResult; if (t1.DefaultSelect == t2.DefaultSelect) { compareResult = t1.Priority - t2.Priority; } else { compareResult = (t1.DefaultSelect) ? -1 : 1; } return(compareResult); } ); return(result); }
public static WfTransferParams FromNextActivity(IWfActivityDescriptor currentActDesp, Func <WfTransitionDescriptorCollection, IWfTransitionDescriptor> predicate) { currentActDesp.NullCheck("actDesp"); predicate.NullCheck("predicate"); WfTransferParams transferParams = null; WfTransitionDescriptorCollection toTransitions = currentActDesp.ToTransitions.GetAllCanTransitTransitions(); //找到匹配的线 IWfTransitionDescriptor transition = predicate(toTransitions); if (transition != null) { transferParams = new WfTransferParams(transition.ToActivity); transferParams.FromTransitionDescriptor = transition; if (transition.ToActivity.Instance != null) { transferParams.Assignees.CopyFrom(transition.ToActivity.Instance.Candidates); } if (DeluxePrincipal.IsAuthenticated) { transferParams.Operator = DeluxeIdentity.CurrentUser; } } (transferParams != null).FalseThrow(Translator.Translate(Define.DefaultCulture, "不能根据活动定义{0}找到符合条件的下一步环节", currentActDesp.Key)); return(transferParams); }
/// <summary> /// 当没有动态活动生成时,前后的活动直接串联到一起 /// </summary> /// <param name="fromTransitions"></param> /// <param name="toTransitions"></param> private static void JoinOriginalActivitiesAndSetProperties(WfTransitionDescriptorCollection fromTransitions, WfTransitionDescriptorCollection toTransitions) { foreach (IWfTransitionDescriptor fromTransition in fromTransitions) { foreach (IWfTransitionDescriptor toTransition in toTransitions) { IWfTransitionDescriptor dynTransition = fromTransition.FromActivity.ToTransitions.AddForwardTransition(toTransition.ToActivity); SetDynamicTransitionProperties(fromTransition, dynTransition, fromTransition.ToActivity, true); } } }
/// <summary> /// 得到不是动态活动入口线的集合 /// </summary> /// <returns></returns> public WfTransitionDescriptorCollection GetNotDynamicActivityTransitions() { WfTransitionDescriptorCollection result = CreateNewCollection(); foreach (IWfTransitionDescriptor transition in this) { if (transition.IsDynamicActivityTransition == false) { result.Add(transition); } } return(result); }
/// <summary> /// 返回所有的前进线 /// </summary> /// <param name="sortByDefaultSelect">是否按照默认选择属性排序</param> /// <returns></returns> public WfTransitionDescriptorCollection GetAllForwardTransitions(bool sortByDefaultSelect) { WfTransitionDescriptorCollection result = CreateNewCollection(); foreach (IWfTransitionDescriptor transition in this) { if (transition.Properties.GetValue("IsReturn", false) == false) { result.Add(transition); } } return(result); }
public WfControlNextStepCollection(WfTransitionDescriptorCollection transitions) { foreach (IWfTransitionDescriptor transition in transitions) { IWfActivity toActivity = transition.ToActivity.Process.ProcessInstance.Activities.FindActivityByDescriptorKey(transition.ToActivity.Key); if (toActivity != null) { WfControlNextStep nextStep = new WfControlNextStep(transition, toActivity); this.Add(nextStep); } } }
public static WfControlNextStepCollection GetControlNextStepsByProcessDescriptor( IWfActivityDescriptor originalActivityDescriptor, PrepareNextStepsEventHanlder prepareNextStepsHandler, AfterGetNextStepResourcesEventHanlder afterGetNextStepResourcesHandler) { WfTransitionDescriptorCollection transitions = originalActivityDescriptor.ToTransitions.GetAllCanTransitTransitions(); WfControlNextStepCollection nextSteps = new WfControlNextStepCollection(transitions); if (prepareNextStepsHandler != null) { prepareNextStepsHandler(nextSteps); } SetFirstStepProperties(nextSteps, afterGetNextStepResourcesHandler); return(nextSteps); }
/// <summary> /// 得到所有能够流转的前进线,不含退回 /// </summary> /// <param name="sortByDefaultSelect">是否按照默认选择属性排序</param> /// <returns></returns> public WfTransitionDescriptorCollection GetAllCanTransitForwardTransitions(bool sortByDefaultSelect) { WfTransitionDescriptorCollection result = CreateNewCollection(); foreach (IWfTransitionDescriptor transition in this) { try { if (transition.Properties.GetValue("IsReturn", false) == false && transition.CanTransit()) { result.Add(transition); } } catch (WfTransitionEvaluationException ex) { ex.WriteToLog(); } } return(result); }
/// <summary> /// 得到所有符合条件的线。无论是否Enabled /// </summary> /// <param name="sortByDefaultSelect">是否优先按照DefaultSelect排序</param> /// <returns></returns> public WfTransitionDescriptorCollection GetAllConditionMatchedTransitions(bool sortByDefaultSelect) { WfTransitionDescriptorCollection result = CreateNewCollection(); foreach (IWfTransitionDescriptor transition in this) { try { if (transition.ConditionMatched()) { result.Add(transition); } } catch (WfTransitionEvaluationException ex) { ex.WriteToLog(); } } result.Sort(sortByDefaultSelect); return(result); }
private void FillMainStreamForDisplayActivities(IWfActivityDescriptor actDesp, List <WfMainStreamActivityDescriptor> msActivities) { string actKey = string.Empty; if (!string.IsNullOrEmpty(actDesp.AssociatedActivityKey)) { actKey = actDesp.AssociatedActivityKey; } else { actKey = actDesp.Key; } List <WfMainStreamActivityDescriptor> cloneActivities = new List <WfMainStreamActivityDescriptor>(); foreach (var innerAct in msActivities) { if (innerAct.Activity.Key == actKey || (innerAct.Activity.AssociatedActivityKey != null && innerAct.Activity.AssociatedActivityKey == actKey)) { cloneActivities.Add(new WfMainStreamActivityDescriptor(actDesp)); break; } cloneActivities.Add(innerAct); } msActivities.Clear(); cloneActivities.ForEach(c => msActivities.Add(c)); if (msActivities.Find(act => act.Activity.Key == actKey || (act.Activity.AssociatedActivityKey != null && act.Activity.AssociatedActivityKey == actKey)) == null) { msActivities.Add(new WfMainStreamActivityDescriptor(actDesp)); } //查找经过的线 IWfTransitionDescriptor transition = actDesp.ToTransitions.FindElapsedTransition(); if (transition != null && transition.IsBackward == true) { transition = null; } if (transition == null) { //如果经过的线不存在,则查找缺省的线或优先级最高的线 WfTransitionDescriptorCollection transitions = actDesp.ToTransitions.GetAllCanTransitForwardTransitions(); transition = transitions.FindDefaultSelectTransition(); } if (transition == null) { transition = actDesp.ToTransitions.FindDefaultSelectTransition(); } if (transition != null && transition.IsBackward == true) { transition = null; transition = actDesp.ToTransitions.Find(t => t.IsBackward == false); } if (transition != null) { bool flag = msActivities.Find(a => a.Activity.Key == transition.ToActivity.Key) == null; if (flag) { FillMainStreamForDisplayActivities(transition.ToActivity, msActivities); } } }
private void InnerFillMainStreamActivities(IWfActivityDescriptor actDesp, List <WfMainStreamActivityDescriptor> msActivities, Dictionary <string, IWfActivityDescriptor> elapsedActivities) { if (elapsedActivities.ContainsKey(actDesp.Key)) { return; } elapsedActivities.Add(actDesp.Key, actDesp); string actKey = actDesp.GetAssociatedActivity() != null?actDesp.GetAssociatedActivity().Key : actDesp.Key; int position = -1; for (int i = msActivities.Count - 1; i >= 0; i--) { if (msActivities[i].Activity.Key == actKey || msActivities[i].Activity.AssociatedActivityKey == actKey) { position = i; break; } } if (position >= 0) //替换为最新的活动 { msActivities[position] = new WfMainStreamActivityDescriptor(actDesp); } else { msActivities.Add(new WfMainStreamActivityDescriptor(actDesp)); } //2012/5/2,也许需要调整一下次序,符合条件的优先,然后是经过的线 //查找经过的线 IWfTransitionDescriptor transition = null; //如果流程描述,不是实例中保存的主线流程描述,则从经过的线查找 if (this.Variables.GetValue("MainStream", false) == false) { transition = actDesp.ToTransitions.FindElapsedTransition(); } if (transition != null && transition.IsBackward == true) { transition = null; } if (transition == null) { //如果经过的线不存在,则查找缺省的线或优先级最高的线 WfTransitionDescriptorCollection transitions = actDesp.ToTransitions.GetAllCanTransitForwardTransitions(); transition = transitions.FindDefaultSelectTransition(); } if (transition == null) { transition = actDesp.ToTransitions.FindDefaultSelectTransition(); } if (transition != null && transition.IsBackward == true) { transition = null; transition = actDesp.ToTransitions.Find(t => t.IsBackward == false); } if (transition != null) { InnerFillMainStreamActivities(transition.ToActivity, msActivities, elapsedActivities); } }
/// <summary> /// 设置原来的出线和最后一个动态活动点之间的关系和属性 /// </summary> /// <param name="lastDynamicActivity"></param> /// <param name="toTransitions"></param> private static void SetExitTransitionsProperties(IWfActivityDescriptor lastDynamicActivity, WfTransitionDescriptorCollection toTransitions) { foreach (IWfTransitionDescriptor transition in toTransitions) { IWfTransitionDescriptor dynTransition = transition.ToActivity.FromTransitions.AddForwardTransition(lastDynamicActivity); SetDynamicTransitionProperties(transition, dynTransition, transition.FromActivity, false); } }
/// <summary> /// 设置原来的进线和第一个动态活动点之间的关系和属性 /// </summary> /// <param name="firstDynamicActivity"></param> /// <param name="fromTransitions"></param> private static void SetEntryTransitionsProperties(IWfActivityDescriptor firstDynamicActivity, WfTransitionDescriptorCollection fromTransitions) { foreach (IWfTransitionDescriptor transition in fromTransitions) { IWfTransitionDescriptor dynTransition = transition.FromActivity.ToTransitions.AddForwardTransition(firstDynamicActivity); SetDynamicTransitionProperties(transition, dynTransition, transition.ToActivity, true); } }
private WfActivityDescriptorCollection CreateActivities(WfTransitionDescriptorCollection fromTransitions, WfCreateActivityParamCollection capc, WfTransitionDescriptorCollection toTransitions) { WfActivityDescriptorCollection result = new WfActivityDescriptorCollection(this.Process); IWfActivityDescriptor firstDynamicActivity = null; IWfActivityDescriptor lastDynamicActivity = null; WfCreateActivityParam lastCreatedActivityParam = null; foreach (WfCreateActivityParam cap in capc) { WfActivityDescriptor actDesp = (WfActivityDescriptor)cap.Template.Clone(); actDesp.Process = this.Process; string newActKey = "ND" + cap.ActivitySN; if (this.Process.Activities.ContainsKey(newActKey)) { newActKey = this.Process.FindNotUsedActivityKey(); } actDesp.Key = newActKey; cap.CreatedDescriptor = actDesp; this.Process.Activities.Add(actDesp); if (lastCreatedActivityParam != null) { lastCreatedActivityParam.DefaultNextDescriptor = actDesp; } lastCreatedActivityParam = cap; if (this.IsMainStreamActivity == false && this.ProcessInstance != null) { WfActivityBase.CreateActivityInstance(actDesp, this.ProcessInstance); } if (firstDynamicActivity == null) { firstDynamicActivity = actDesp; } if (lastDynamicActivity != null) { WfTransitionDescriptor newTransition = (WfTransitionDescriptor)lastDynamicActivity.ToTransitions.AddForwardTransition(actDesp); //如果不是第一个生成的活动 if (firstDynamicActivity != actDesp) { newTransition.GeneratedByTemplate = true; newTransition.TemplateKey = this.Key; } } lastDynamicActivity = actDesp; result.Add(actDesp); } if (firstDynamicActivity != null && lastDynamicActivity != null) { SetEntryTransitionsProperties(firstDynamicActivity, fromTransitions); if (lastCreatedActivityParam != null) { IWfTransitionDescriptor defaultTransition = toTransitions.GetAllConditionMatchedTransitions().FindDefaultSelectTransition(true); if (defaultTransition != null) { lastCreatedActivityParam.DefaultNextDescriptor = defaultTransition.ToActivity; } } capc.AdjustTransitionsByTemplate(this.Key); //如果在活动模板参数的最后一个活动没有配置出线,则使用默认的出线;否则使用配置的出线 if (lastDynamicActivity.ToTransitions.Count == 0) { SetExitTransitionsProperties(lastDynamicActivity, toTransitions); } else { lastDynamicActivity.ToTransitions.ForEach(t => SetDynamicTransitionProperties(null, t, this, false)); } } else { //当没有动态活动生成时,前后的活动直接串联到一起 JoinOriginalActivitiesAndSetProperties(fromTransitions, toTransitions); } //将模版点的进出线的Enabled都设置为False fromTransitions.ForEach(t => ((WfTransitionDescriptor)t).Enabled = false); toTransitions.ForEach(t => ((WfTransitionDescriptor)t).Enabled = false); return(result); }