public void ActivityToTransitionsSort() { IWfProcessDescriptor desp = WfProcessTestCommon.CreateProcessDescriptor(); AddActivitiesDespToSameActivityDesp(desp.Activities[1], 4); ToTransitionsDescriptorCollection transDespColl = desp.Activities[1].ToTransitions; Assert.AreEqual(4, transDespColl.Count); SetTransitionCondition(transDespColl[0], false, 4); SetTransitionCondition(transDespColl[1], true, 0); SetTransitionCondition(transDespColl[2], false, 2); SetTransitionCondition(transDespColl[3], true, 1); WfTransitionDescriptorCollection transitions = desp.Activities[1].ToTransitions.GetAllCanTransitTransitions(); Assert.IsTrue(transitions[0].DefaultSelect); Assert.AreEqual(transDespColl[1].DefaultSelect, transitions[0].DefaultSelect); Assert.IsTrue(transitions[1].DefaultSelect); Assert.AreEqual(transDespColl[3].DefaultSelect, transitions[1].DefaultSelect); Assert.IsFalse(transitions[2].DefaultSelect); Assert.AreEqual(transDespColl[2].Priority, transitions[2].Priority); Assert.IsFalse(transitions[3].DefaultSelect); Assert.AreEqual(transDespColl[0].Priority, transitions[3].Priority); }
private static IWfActivityDescriptor FindAssociatedActivityByKey(IWfActivityDescriptor actDesp, string key) { IWfActivityDescriptor result = null; if (actDesp.AssociatedActivityKey == key) { result = actDesp; } else { WfTransitionDescriptorCollection transitions = actDesp.ToTransitions.GetAllCanTransitForwardTransitions(); foreach (IWfTransitionDescriptor transition in transitions) { result = FindAssociatedActivityByKey(transition.ToActivity, key); if (result != null) { break; } } } return(result); }
private static void SaveOpinion(WfClientOpinion client, IWfActivity currentActivity, WfTransferParams transferParams) { if (client != null) { WfTransitionDescriptorCollection nextTransitions = currentActivity.Descriptor.ToTransitions.GetAllCanTransitTransitions(true); Dictionary <string, object> extraDataDict = new Dictionary <string, object>(); extraDataDict["NextSteps"] = PrepareNextStepsSelectorsString(nextTransitions, transferParams); client.FillExtraDataFromDictionary(extraDataDict); SaveOpinion(client); } }
/// <summary> /// 验证B的衍生点的出线是否是两根 /// </summary> public static void ValidateBRelativeActivityOutTransitions(IWfActivity currentActivity) { IWfActivity relativeBActivity = FindRelativeActivityByKey(currentActivity, "B"); Assert.IsNotNull(relativeBActivity, string.Format("不能在{0}后找到B的衍生活动", currentActivity.Descriptor.Key)); //衍生线也是两根 WfTransitionDescriptorCollection transitions = relativeBActivity.Descriptor.ToTransitions; Assert.AreEqual(2, transitions.Count); Assert.IsTrue(transitions.Exists(t => t.ToActivity.AssociatedActivityKey == "C")); Assert.IsTrue(transitions.Exists(t => t.ToActivity.AssociatedActivityKey == "E")); transitions = relativeBActivity.Descriptor.ToTransitions.GetAllCanTransitForwardTransitions(); Assert.AreEqual(1, transitions.Count); Assert.IsTrue(transitions.Exists(t => t.ToActivity.AssociatedActivityKey == "C")); }
public void TransitionConditionTest() { TestContext.Properties["Amount"] = 7500; WfRuntime.ProcessContext.EvaluateTransitionCondition += new Expression.CalculateUserFunction(ProcessContext_EvaluateTransition); IWfProcess process = WfProcessTestCommon.StartupSimpleProcessDescriptorWithTransitionCondition(); WfTransferParams transferParams = new WfTransferParams(process.Descriptor.InitialActivity.ToTransitions[0].ToActivity); process.MoveTo(transferParams); WfTransitionDescriptorCollection transitions = process.CurrentActivity.Descriptor.ToTransitions.GetAllCanTransitTransitions(); Assert.AreEqual(1, transitions.Count); Console.WriteLine(((IWfForwardTransitionDescriptor)transitions[0]).Condition.Expression); Assert.AreEqual("Amount >= 5000", ((IWfForwardTransitionDescriptor)transitions[0]).Condition.Expression); }
/// <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> /// <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; }
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; }
/// <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; }