private static IWfTransitionDescriptor CreateMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType)
        {
            bool useOriginal = true;
            IWfTransitionDescriptor resultTransition = null;

            if (activityToAppend.Process.MainStream != null)
            {
                IWfActivityDescriptor startActDesp = startActivity.GetMainStreamActivityDescriptor();
                IWfActivityDescriptor endActDesp = endActivity.GetMainStreamActivityDescriptor();

                if (startActDesp != null && endActDesp != null)
                {
                    WfCopyMainStreamContext context = new WfCopyMainStreamContext(startActDesp, endActivity.Descriptor, entryTransition, true);

                    FillCopyContext(context.StartActivityDescriptor, endActDesp, context, operationType);

                    resultTransition = context.StartActivityDescriptor.GenerateCopiedActivitiesDescriptors(activityToAppend.Process, activityToAppend.Descriptor, context, operationType);
                    useOriginal = false;
                }
            }

            if (useOriginal)
                OriginalCreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType);

            return resultTransition;
        }
        private static IWfTransitionDescriptor CreateMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType)
        {
            bool useOriginal = true;
            IWfTransitionDescriptor resultTransition = null;

            if (activityToAppend.Process.MainStream != null)
            {
                IWfActivityDescriptor startActDesp = startActivity.GetMainStreamActivityDescriptor();
                IWfActivityDescriptor endActDesp   = endActivity.GetMainStreamActivityDescriptor();

                if (startActDesp != null && endActDesp != null)
                {
                    WfCopyMainStreamContext context = new WfCopyMainStreamContext(startActDesp, endActivity.Descriptor, entryTransition, true);

                    FillCopyContext(context.StartActivityDescriptor, endActDesp, context, operationType);

                    resultTransition = context.StartActivityDescriptor.GenerateCopiedActivitiesDescriptors(activityToAppend.Process, activityToAppend.Descriptor, context, operationType);
                    useOriginal      = false;
                }
            }

            if (useOriginal)
            {
                OriginalCreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType);
            }

            return(resultTransition);
        }
예제 #3
0
        private static void SetToLineAndMSLineSelected(IWfActivity activity, string targetActDespKey, bool selected)
        {
            WfTransitionDescriptor transition = (WfTransitionDescriptor)activity.Descriptor.ToTransitions.Find(t => t.ToActivity.Key == targetActDespKey);

            Assert.IsNotNull(transition);

            transition.DefaultSelect = selected;

            WfTransitionDescriptor transitionMS = (WfTransitionDescriptor)activity.GetMainStreamActivityDescriptor().ToTransitions.Find(t => t.ToActivity.Key == targetActDespKey);

            Assert.IsNotNull(transitionMS);

            transitionMS.DefaultSelect = selected;
        }
        public void BasicAdminAddActivityWithMainStreamAndFromActivityExecutorTest()
        {
            IWfProcess process = WfProcessTestCommon.StartupSimpleProcess();

            const string targetName = "修改后的名称";

            IWfActivityDescriptor targetDesp = new WfActivityDescriptor(process.Descriptor.FindNotUsedActivityKey(), WfActivityType.NormalActivity);

            targetDesp.Properties.SetValue("Name", targetName);
            process.Descriptor.Activities.Add(targetDesp);

            WfActivityBase.CreateActivityInstance(targetDesp, process);

            IWfActivity fromActivity = process.Activities.FindActivityByDescriptorKey("NormalActivity");

            WfAdminAddActivityExecutor executor = new WfAdminAddActivityExecutor(process.CurrentActivity, process, fromActivity.Descriptor, targetDesp, true);

            executor.Execute();

            process = WfRuntime.GetProcessByProcessID(process.ID);

            targetDesp = process.Descriptor.Activities[targetDesp.Key];

            Assert.IsNotNull(targetDesp);
            Assert.AreEqual(targetName, targetDesp.Properties.GetValue("Name", string.Empty));
            fromActivity = process.Activities.FindActivityByDescriptorKey("NormalActivity");

            Assert.IsNotNull(fromActivity.Descriptor.ToTransitions.GetTransitionByToActivity(targetDesp));

            IWfActivityDescriptor msActDesp = targetDesp.Instance.GetMainStreamActivityDescriptor();

            Assert.IsNotNull(msActDesp);
            Assert.AreEqual(process.MainStream, msActDesp.Process);
            Assert.AreEqual(targetName, msActDesp.Properties.GetValue("Name", string.Empty));

            IWfActivityDescriptor msFromActDesp = fromActivity.GetMainStreamActivityDescriptor();

            Assert.IsNotNull(msFromActDesp);
            Assert.AreEqual(process.MainStream, msFromActDesp.Process);
            Assert.IsNotNull(msFromActDesp.ToTransitions.GetTransitionByToActivity(msActDesp));
        }
예제 #5
0
        private static void SetToLineAndMSLineSelected(IWfActivity activity, string targetActDespKey, bool selected)
        {
            WfTransitionDescriptor transition = (WfTransitionDescriptor)activity.Descriptor.ToTransitions.Find(t => t.ToActivity.Key == targetActDespKey);

            Assert.IsNotNull(transition);

            transition.DefaultSelect = selected;

            WfTransitionDescriptor transitionMS = (WfTransitionDescriptor)activity.GetMainStreamActivityDescriptor().ToTransitions.Find(t => t.ToActivity.Key == targetActDespKey);

            Assert.IsNotNull(transitionMS);

            transitionMS.DefaultSelect = selected;
        }
예제 #6
0
        protected override void OnModifyWorkflow(WfExecutorDataContext dataContext)
        {
            (this.Assignees.Count > 0).FalseThrow <WfRuntimeException>("加签的用户数必须大于零");

            IWfProcess process = this.TargetActivity.Process;

            WfRuntime.ProcessContext.BeginChangeActivityChangingContext();

            try
            {
                WfRuntime.ProcessContext.ActivityChangingContext.CreatorInstanceID = OperatorActivity.ID;
                string clonedKey = TargetActivity.Descriptor.AssociatedActivityKey.IsNotEmpty() ?
                                   TargetActivity.Descriptor.AssociatedActivityKey : TargetActivity.Descriptor.Key;

                IWfActivity templateAct = process.Activities.FindActivityByDescriptorKey(clonedKey);

                //不是仅添加审批人时
                if ((this.AddApproverMode & WfAddApproverMode.AreAssociatedActivities) != WfAddApproverMode.OnlyAddApprover)
                {
                    WfRuntime.ProcessContext.ActivityChangingContext.AssociatedActivityKey = clonedKey;
                }

                //生成加签的点
                WfActivityDescriptor addActDesp = CreateAddApproverActivityDescriptor(templateAct.Descriptor);

                IWfActivity addedActivity = this.TargetActivity.Append(addActDesp);

                //当仅添加审批人时
                if ((this.AddApproverMode & WfAddApproverMode.AreAssociatedActivities) == WfAddApproverMode.OnlyAddApprover)
                {
                    //将指派人直接赋值给办理人
                    addedActivity.Candidates.CopyFrom(this.Assignees);

                    IWfActivityDescriptor mainStreamActDesp = templateAct.GetMainStreamActivityDescriptor();

                    if (mainStreamActDesp != null)
                    {
                        WfActivityDescriptor newMSActDesp = CreateAddApproverActivityDescriptor(mainStreamActDesp);

                        newMSActDesp.Resources.Clear();

                        foreach (IUser user in this.Assignees.ToUsers())
                        {
                            newMSActDesp.Resources.Add(new WfUserResourceDescriptor(user));
                        }

                        mainStreamActDesp.Append(newMSActDesp);
                    }
                }

                //不是仅添加审批人时
                if ((this.AddApproverMode & WfAddApproverMode.AppendCurrentActivity) != WfAddApproverMode.OnlyAddApprover)
                {
                    //Clone当前的点,在加签点后生成再添加当前活动
                    IWfActivity          foundActivity        = process.Activities.FindActivityByDescriptorKey(clonedKey);
                    WfActivityDescriptor clonedCurrentActDesp = ((WfActivityDescriptor)foundActivity.Descriptor).Clone() as WfActivityDescriptor;

                    //加签按照加签活动模板进行属性设置
                    WfActivityBase.ResetPropertiesByDefinedName(addActDesp, "DefaultAddApproverActivityTemplate");

                    //if (foundActivity.Descriptor.ActivityType == WfActivityType.InitialActivity)
                    //	WfActivityBase.ResetPropertiesByDefinedName(clonedCurrentActDesp, "DefaultAddApproverActivityTemplate");

                    clonedCurrentActDesp.AssociatedActivityKey = WfRuntime.ProcessContext.ActivityChangingContext.AssociatedActivityKey;
                    clonedCurrentActDesp.ClonedKey             = this.TargetActivity.Descriptor.Key;
                    clonedCurrentActDesp.IsReturnSkipped       = true;

                    IWfActivity clonedActivity = addActDesp.Instance.Append(clonedCurrentActDesp);
                    clonedActivity.Candidates.CopyFrom(foundActivity.Candidates);
                }

                WfTransferParams tp = new WfTransferParams(addActDesp);

                tp.Assignees.CopyFrom(this.Assignees);

                process.MoveTo(tp);
            }
            finally
            {
                WfRuntime.ProcessContext.RestoreChangeActivityChangingContext();
            }
        }