Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }
Example #4
0
        /// <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"));
        }
Example #5
0
        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;
		}