示例#1
0
        /// <summary>
        /// 得到可以抵达的线
        /// </summary>
        /// <returns></returns>
        public WfTransitionDescriptorCollection GetAllCanTransitTransitions()
        {
            WfTransitionDescriptorCollection result = CreateNewCollection();

            foreach (WfTransitionDescriptor transition in this)
            {
                if (transition.CanTransit())
                {
                    result.Add(transition);
                }
            }

            return(result);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
                }
            }
        }
示例#4
0
        /// <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);
        }