Ejemplo n.º 1
0
        protected override void OnModifyWorkflow(WfExecutorDataContext dataContext)
        {
            this.TargetActivity.Process.Committed = true;

            IWfProcess process = TargetActivity.Process;

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

                //string activityKey = process.Descriptor.FindNotUsedActivityKey();

                //WfActivityDescriptor actDesp = new WfActivityDescriptor(activityKey);

                //actDesp.Name = "会签";
                var toReturnTrans = process.CurrentActivity.Descriptor.ToTransitions.FindAll(t => t.IsBackward == true);

                WfActivityDescriptor actDesp = process.CurrentActivity.Descriptor.Clone() as WfActivityDescriptor;
                actDesp.ActivityType = WfActivityType.NormalActivity;
                actDesp.Properties.SetValue("AutoMoveAfterPending", false);
                actDesp.ClonedKey = process.CurrentActivity.Descriptor.Key;
                actDesp.BranchProcessTemplates.Clear();
                process.CurrentActivity.Append(actDesp);

                foreach (WfTransitionDescriptor t in toReturnTrans)
                {
                    WfTransitionDescriptor trans = t.Clone() as WfTransitionDescriptor;
                    if (t.FromActivityKey == t.ToActivityKey)
                    {
                        trans.JoinActivity(actDesp, actDesp);
                    }
                    else
                    {
                        trans.JoinActivity(actDesp, t.ToActivity);
                    }

                    actDesp.ToTransitions.Add(trans);
                }

                //添加子流程
                WfTransferParams tp = new WfTransferParams(actDesp);
                tp.Assignees.CopyFrom(Assignees);

                tp.BranchTransferParams.Add(new WfBranchProcessTransferParams(
                                                WfTemplateBuilder.CreateDefaultConsignTemplate(
                                                    "WfConsignProcessTemplateDescriptorKey",
                                                    this.Sequence,
                                                    this.BlockingType,
                                                    this.ConsignUsers)));

                if (this.CirculateUsers.Count <IUser>() > 0)
                {
                    tp.BranchTransferParams.Add(new WfBranchProcessTransferParams(
                                                    WfTemplateBuilder.CreateDefaultCirculationTemplate(
                                                        "WfCirculationProcessTemplateDescriptorKey",
                                                        this.CirculateUsers)));
                }

                WfRuntime.ProcessContext.AfterStartupBranchProcess += new WfAfterStartupBranchProcessHandler(WfActivityRelativeExecutorBase.AfterStartupBranchProcess);
                process.MoveTo(tp);
            }
            finally
            {
                WfRuntime.ProcessContext.RestoreChangeActivityChangingContext();
            }
        }
        protected override IWfActivityDescriptor PrepareActivityDescriptor(IWfActivityDescriptor targetActDesp)
        {
            IWfProcessDescriptor processDesp = targetActDesp.Process;

            string activityKey = processDesp.FindNotUsedActivityKey();

            WfActivityDescriptor newActDesp = new WfActivityDescriptor(activityKey);

            newActDesp.ActivityType = WfActivityType.NormalActivity;

            //主线活动不应该有关联Key
            newActDesp.AssociatedActivityKey = WfRuntime.ProcessContext.ActivityChangingContext.AssociatedActivityKey;
            newActDesp.FromTransitions.Clear();
            newActDesp.ToTransitions.Clear();

            processDesp.Activities.Add(newActDesp);
            newActDesp.Properties.SetValue("AutoMoveAfterPending", true);

            IWfTransitionDescriptor defaultSelectTran = targetActDesp.ToTransitions.FindDefaultSelectTransition();

            List <IWfTransitionDescriptor> movedTransitions = new List <IWfTransitionDescriptor>();

            foreach (WfTransitionDescriptor t in targetActDesp.ToTransitions)
            {
                WfTransitionDescriptor cloneTransition = (WfTransitionDescriptor)t.Clone();
                cloneTransition.Key = processDesp.FindNotUsedTransitionKey();

                if (t.IsBackward == false)
                {
                    cloneTransition.JoinActivity(newActDesp, t.ToActivity);
                    newActDesp.ToTransitions.Add(cloneTransition);

                    movedTransitions.Add(t);

                    t.ToActivity.FromTransitions.Remove(td => td.Key == t.Key);
                    t.ToActivity.FromTransitions.Add(cloneTransition);

                    if (t.Key == defaultSelectTran.Key)
                    {
                        t.Key = processDesp.FindNotUsedTransitionKey();
                        t.JoinActivity(targetActDesp, newActDesp);
                        newActDesp.FromTransitions.Add(t);
                    }
                }
                else
                {
                    cloneTransition.JoinActivity(newActDesp, t.ToActivity);
                    newActDesp.ToTransitions.Add(cloneTransition);

                    movedTransitions.Add(t);
                }
            }

            foreach (WfTransitionDescriptor t in movedTransitions)
            {
                targetActDesp.ToTransitions.Remove(t);
            }

            SetDynamicActivityProperties(targetActDesp, newActDesp);

            IWfTransitionDescriptor newTransition = targetActDesp.ToTransitions.AddForwardTransition(newActDesp);

            SetDynamicTransitionProperties(targetActDesp, newTransition);

            return(newActDesp);
        }