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);
        }
Exemple #2
0
        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);
        }
Exemple #6
0
        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);
                }
            }
        }
Exemple #7
0
        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);
        }