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); }