public void WfBranchProcessTransferParamsJsonTest() { WfConverterHelper.RegisterConverters(); IUser user = (IUser)OguObjectSettings.GetConfig().Objects[OguObject.requestor.ToString()].Object; IWfBranchProcessTemplateDescriptor template = WfProcessTestCommon.CreateTemplate("Consign", user); WfBranchProcessTransferParams data = new WfBranchProcessTransferParams(template); data.BranchParams.Clear(); WfBranchProcessStartupParams bpsp = new WfBranchProcessStartupParams(user); bpsp.Department = user.Parent; bpsp.RelativeParams["RP"] = UuidHelper.NewUuidString(); bpsp.ApplicationRuntimeParameters["context"] = UuidHelper.NewUuidString(); bpsp.ResourceID = UuidHelper.NewUuidString(); bpsp.DefaultTaskTitle = UuidHelper.NewUuidString(); bpsp.StartupContext = UuidHelper.NewUuidString(); data.BranchParams.Add(bpsp); string serilizedData = JSONSerializerExecute.Serialize(data); Console.WriteLine(serilizedData); WfBranchProcessTransferParams deserilizedData = JSONSerializerExecute.Deserialize <WfBranchProcessTransferParams>(serilizedData); Assert.AreEqual(data.Template.Key, deserilizedData.Template.Key); Assert.AreEqual(data.Template.BranchProcessKey, deserilizedData.Template.BranchProcessKey); AssertBranchProcessStartupParams(data.BranchParams[0], deserilizedData.BranchParams[0]); }
private static OguDataCollection <IUser> PrepareBranchTransferUsers(IWfBranchProcessTemplateDescriptor template) { OguDataCollection <IUser> users = null; bool fetchFirstSubInitUsers = false; //如果是串行流程或者Templete的Resource中没有人,则从第一个点取人 if (template.ExecuteSequence == WfBranchProcessExecuteSequence.SerialInSameProcess) { fetchFirstSubInitUsers = true; } else { users = template.Resources.ToUsers(); if (template.OperationDefinition == null && users.Count == 0) { fetchFirstSubInitUsers = true; } } if (fetchFirstSubInitUsers) { IWfProcessDescriptor processDesp = template.GetBranchProcessDescriptor(); users = processDesp.InitialActivity.Resources.ToUsers(); } return(users); }
public void ParallelBranchActivitySecretaryTest() { IWfProcessDescriptor processDesp = WfProcessTestCommon.CreateSimpleProcessDescriptorWithBranchTemplate(); IWfBranchProcessTemplateDescriptor template = processDesp.Activities["NormalActivity"].BranchProcessTemplates["Consign"]; template.Resources.Clear(); template.Resources.Add(new WfUserResourceDescriptor((IUser)OguObjectSettings.GetConfig().Objects["ceo"].Object)); IWfProcess process = WfProcessTestCommon.StartupProcess(processDesp); WfProcessTestCommon.MoveToNextDefaultActivity(process); IWfProcess consignBranchProcess = process.Activities.FindActivityByDescriptorKey("NormalActivity").BranchProcessGroups["Consign"].Branches.FirstOrDefault(); IWfProcess distributeBranchProcess = process.Activities.FindActivityByDescriptorKey("NormalActivity").BranchProcessGroups["Distribute"].Branches.FirstOrDefault(); Console.WriteLine("Consign Process"); OutputProcessCandidates(consignBranchProcess); ReturnExecutorTestHelper.OutputMainStream(consignBranchProcess); Console.WriteLine(""); Console.WriteLine("Distribute Process"); OutputProcessCandidates(distributeBranchProcess); ReturnExecutorTestHelper.OutputMainStream(distributeBranchProcess); Assert.AreEqual(4, consignBranchProcess.Activities.Count); Assert.AreEqual(2, distributeBranchProcess.Activities.Count); Assert.AreEqual(4, consignBranchProcess.MainStream.Activities.Count); Assert.AreEqual(2, distributeBranchProcess.MainStream.Activities.Count); }
/// <summary> /// 构造并且发送任务到任务列表中 /// </summary> /// <param name="ownerActivityID"></param> /// <param name="template"></param> /// <param name="autoAddExitMaintainingStatusTask"></param> /// <returns></returns> public static DispatchStartBranchProcessTask SendTask(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) { DispatchStartBranchProcessTask task = CreateTask(ownerActivityID, template, autoAddExitMaintainingStatusTask); InvokeServiceTaskAdapter.Instance.Update(task); return task; }
/// <summary> /// /// </summary> /// <param name="ownerActivityID">分支流程所挂接的活动</param> /// <param name="template">分支流程模板</param> /// <param name="autoAddExitMaintainingStatusTask">是否在最后补充一个退出维护模式的任务</param> public StartBranchProcessSysTaskProcessBuilder(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) { ownerActivityID.CheckStringIsNullOrEmpty("ownerActivityID"); template.NullCheck("template"); this.OwnerActivityID = ownerActivityID; this.Template = template; this.AutoAddExitMaintainingStatusTask = autoAddExitMaintainingStatusTask; }
public WfStartBranchProcessExecutor(IWfActivity operatorActivity, IWfActivity ownerActivity, IWfBranchProcessTemplateDescriptor template) : base(operatorActivity, WfControlOperationType.StartBranchProcess) { ownerActivity.NullCheck("ownerActivity"); template.NullCheck("template"); this.OwnerActivity = ownerActivity; this.BranchTransferParams = new WfBranchProcessTransferParams(template); }
/// <summary> /// 构造方法 /// </summary> /// <param name="owner"></param> /// <param name="template"></param> public WfBranchProcessGroup(IWfActivity owner, IWfBranchProcessTemplateDescriptor template) { owner.NullCheck("owner"); this.OwnerActivity = owner; this.ProcessTemplate = template; ////从内存中构造时,会走这个构造方法。 //this._BranchProcessStatistics = new WfBranchProcessStatistics(); }
public static DispatchStartBranchProcessTask CreateTask(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) { DispatchStartBranchProcessTask task = new DispatchStartBranchProcessTask(ownerActivityID, template, autoAddExitMaintainingStatusTask); task.TaskID = UuidHelper.NewUuidString(); task.ResourceID = ownerActivityID; task.TaskTitle = string.Format("分发活动点{0}的子流程", ownerActivityID); return task; }
public static void AssertBranchProcessTemplateCollection(this IEnumerable <WfClientBranchProcessTemplateDescriptor> cvc, IEnumerable <IWfBranchProcessTemplateDescriptor> svc) { Assert.AreEqual(cvc.Count(), svc.Count()); foreach (WfClientBranchProcessTemplateDescriptor c in cvc) { IWfBranchProcessTemplateDescriptor sv = svc.Where(s => s.Key == c.Key).First(); c.AreSame(sv); } }
public int DispatchStartBranchProcessTasks(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) { ownerActivityID.CheckStringIsNullOrEmpty("ownerActivityID"); template.NullCheck("template"); StartBranchProcessSysTaskProcessBuilder builder = new StartBranchProcessSysTaskProcessBuilder(ownerActivityID, template, autoAddExitMaintainingStatusTask); SysTaskProcess sysTaskProcess = builder.Build(); SysTaskProcessRuntime.StartProcess(sysTaskProcess); return(sysTaskProcess.Activities.Count); }
/// <summary> /// 构造方法。根据分支流程模板以及传递进来的人员初始化BranchParams /// </summary> /// <param name="template"></param> /// <param name="users"></param> public WfBranchProcessTransferParams(IWfBranchProcessTemplateDescriptor template, IEnumerable <IUser> users) { template.NullCheck("template"); users.NullCheck("users"); this._Template = template; this.BranchParams.Add(users); if (template.DefaultTaskTitle.IsNotEmpty()) { this.BranchParams.ForEach(b => b.DefaultTaskTitle = template.DefaultTaskTitle); } }
public int DispatchStartBranchProcessTasks(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) { ownerActivityID.CheckStringIsNullOrEmpty("ownerActivityID"); template.NullCheck("template"); StartBranchProcessSysTaskProcessBuilder builder = new StartBranchProcessSysTaskProcessBuilder(ownerActivityID, template, autoAddExitMaintainingStatusTask); SysTaskProcess sysTaskProcess = builder.Build(); SysTaskProcessRuntime.StartProcess(sysTaskProcess); return sysTaskProcess.Activities.Count; }
public DispatchStartBranchProcessTask(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) : base() { ownerActivityID.CheckStringIsNullOrEmpty("ownerActivityID"); template.NullCheck("template"); this.OwnerActivityID = ownerActivityID; this.Template = template; this.AutoAddExitMaintainingStatusTask = autoAddExitMaintainingStatusTask; this.InitServiceDefinitions(); this.Context["template"] = this.Template; }
public void DispatchStartBranchProcessTaskTest() { IWfProcessDescriptor processDesp = CreateProcessWithAutoMaintainProperty(); IWfProcess process = WfProcessTestCommon.StartupProcess(processDesp); MoveToExecutor(process); process = WfRuntime.GetProcessByProcessID(process.ID); IWfActivity ownerActivity = process.CurrentActivity; Console.WriteLine("OwnerActivityID: {0}", ownerActivity.ID); //在Template设置资源为一个组织,用于后续分发分支流程的测试 IWfBranchProcessTemplateDescriptor template = ownerActivity.Descriptor.BranchProcessTemplates[0]; IUser userInTemplate = template.Resources.ToUsers().FirstOrDefault(); WfDepartmentResourceDescriptor deptResourceDesp = new WfDepartmentResourceDescriptor(userInTemplate.Parent); template.Resources.Clear(); template.Resources.Add(deptResourceDesp); SysTaskAdapter.Instance.ClearAll(); SysTaskCommon.ExecuteAndAssertTask(DispatchStartBranchProcessTask.SendTask(ownerActivity.ID, template, true)); WfRuntime.ClearCache(); process = WfRuntime.GetProcessByProcessID(process.ID); int startedTaskCount = (int)WfServiceInvoker.InvokeContext["returnValue"]; Console.WriteLine("Started Branch Task Count: {0}", startedTaskCount); Assert.IsTrue(startedTaskCount > 0); int executedTaskCount = SysTaskCommon.ExecuteAllTasks(); Assert.AreEqual(startedTaskCount, executedTaskCount); WfRuntime.ClearCache(); process = WfRuntime.GetProcessByProcessID(process.ID); Assert.AreEqual(WfProcessStatus.Running, process.Status); Assert.IsTrue(process.CurrentActivity.BranchProcessGroups.Count > 0); Assert.AreEqual(startedTaskCount - 1, process.CurrentActivity.BranchProcessGroups[0].Branches.Count); }
private static bool CanStartBranchProcessFromTemplate(IWfBranchProcessTemplateDescriptor template) { bool result = false; try { result = template.CanStart(); } catch (WfConditionEvaluationException ex) { ex.WriteToLog(); } return(result); }
/// <summary> /// 带分支流程模板的简单流程。总共两个模板。分支流程模板加在第二个点上,是并行分支流程,且等待所有子流程结束。 /// </summary> /// <returns></returns> public static IWfProcessDescriptor CreateSimpleProcessDescriptorWithBranchTemplate() { IWfProcessDescriptor processDesp = CreateSimpleProcessDescriptor(); IWfActivityDescriptor normalActivity = processDesp.Activities["NormalActivity"]; IWfBranchProcessTemplateDescriptor template = CreateTemplate("Consign", (IUser)OguObjectSettings.GetConfig().Objects["approver1"].Object); normalActivity.BranchProcessTemplates.Add(template); template = CreateTemplate("Distribute", (IUser)OguObjectSettings.GetConfig().Objects["approver2"].Object); normalActivity.BranchProcessTemplates.Add(template); return(processDesp); }
public void BuildStartBranchProcessTaskProcessTest() { IWfProcessDescriptor processDesp = CreateProcessWithAutoMaintainProperty(); IWfProcess process = WfProcessTestCommon.StartupProcess(processDesp); MoveToExecutor(process); process = WfRuntime.GetProcessByProcessID(process.ID); IWfActivity ownerActivity = process.CurrentActivity; Console.WriteLine("OwnerActivityID: {0}", ownerActivity.ID); //在Template设置资源为一个组织,用于后续分发分支流程的测试 IWfBranchProcessTemplateDescriptor template = ownerActivity.Descriptor.BranchProcessTemplates[0]; IUser userInTemplate = template.Resources.ToUsers().FirstOrDefault(); WfDepartmentResourceDescriptor deptResourceDesp = new WfDepartmentResourceDescriptor(userInTemplate.Parent); template.Resources.Clear(); template.Resources.Add(deptResourceDesp); SysTaskAdapter.Instance.ClearAll(); StartBranchProcessSysTaskProcessBuilder builder = new StartBranchProcessSysTaskProcessBuilder(ownerActivity.ID, template, true); SysTaskProcess sysTaskProcess = builder.Build(); SysTaskProcessRuntime.ClearCache(); sysTaskProcess = SysTaskProcessRuntime.GetProcessByID(sysTaskProcess.ID); Console.WriteLine("SysTaskProcess ID: {0}", sysTaskProcess.ID); Console.WriteLine("SysTaskProcess Activities: {0}", sysTaskProcess.Activities.Count); Assert.AreEqual(template.Resources.ToUsers().Count + 1, sysTaskProcess.Activities.Count); }
/// <summary> /// 构造方法。根据分支流程模板以及其中的资源初始化BranchParams /// </summary> /// <param name="template"></param> public WfBranchProcessTransferParams(IWfBranchProcessTemplateDescriptor template) { template.NullCheck("template"); this._Template = template; OguDataCollection <IUser> users = PrepareBranchTransferUsers(template); if (template.ExecuteSequence == WfBranchProcessExecuteSequence.SerialInSameProcess) { //串行流程中,仅仅启动一个流程 this.BranchParams.Add(new WfBranchProcessStartupParams(users)); } else { this.BranchParams.Add(users); } if (template.DefaultTaskTitle.IsNotEmpty()) { this.BranchParams.ForEach(b => b.DefaultTaskTitle = template.DefaultTaskTitle); } }
public static void AreSame(this WfClientBranchProcessTemplateDescriptor expected, IWfBranchProcessTemplateDescriptor actual) { if (expected != null && actual != null) { Assert.AreEqual(expected.BlockingType, actual.BlockingType.ToClientBranchProcessBlockingType()); Assert.AreEqual(expected.SubProcessApprovalMode, actual.SubProcessApprovalMode.ToClientSubProcessApprovalMode()); Assert.AreEqual(expected.ExecuteSequence, actual.ExecuteSequence.ToClientBranchProcessExecuteSequence()); Assert.AreEqual(expected.BranchProcessKey, actual.BranchProcessKey); Assert.AreEqual(expected.DefaultProcessName, actual.DefaultProcessName); Assert.AreEqual(expected.DefaultTaskTitle, actual.DefaultTaskTitle); expected.Condition.AreSame(actual.Condition); expected.Resources.AssertResources(actual.Resources); expected.CancelSubProcessNotifier.AssertResources(actual.CancelSubProcessNotifier); expected.RelativeLinks.AssertRelativeLinks(actual.RelativeLinks); } else Assert.AreEqual(expected, actual); }
/// <summary> /// 构造并且发送任务到任务列表中 /// </summary> /// <param name="ownerActivityID"></param> /// <param name="template"></param> /// <param name="autoAddExitMaintainingStatusTask"></param> /// <returns></returns> public static DispatchStartBranchProcessTask SendTask(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) { DispatchStartBranchProcessTask task = CreateTask(ownerActivityID, template, autoAddExitMaintainingStatusTask); InvokeServiceTaskAdapter.Instance.Update(task); return(task); }
public static DispatchStartBranchProcessTask CreateTask(string ownerActivityID, IWfBranchProcessTemplateDescriptor template, bool autoAddExitMaintainingStatusTask) { DispatchStartBranchProcessTask task = new DispatchStartBranchProcessTask(ownerActivityID, template, autoAddExitMaintainingStatusTask); task.TaskID = UuidHelper.NewUuidString(); task.ResourceID = ownerActivityID; task.TaskTitle = string.Format("分发活动点{0}的子流程", ownerActivityID); return(task); }
private static bool CanStartBranchProcessFromTemplate(IWfBranchProcessTemplateDescriptor template) { bool result = false; try { result = template.CanStart(); } catch (WfConditionEvaluationException ex) { ex.WriteToLog(); } return result; }
/// <summary> /// 调用外部服务。对方会返回一个或一组流程ID。本函数返回这组ID对应的流程。 /// </summary> /// <param name="startupParams"></param> /// <param name="template"></param> /// <returns></returns> private WfProcessCollection InvokeBranchProcess(WfServiceStartupProcessParams startupParams, IWfBranchProcessTemplateDescriptor template) { this.Process.ApplicationRuntimeParameters["serviceOP_Paramas"] = startupParams; WfServiceInvoker svcInvoker = new WfServiceInvoker(template.OperationDefinition); object obj = svcInvoker.Invoke(); WfProcessCollection processes = new WfProcessCollection(); WfBranchProcessTemplateDescriptor temp = template as WfBranchProcessTemplateDescriptor; IList array = obj as IList; if (array != null) { IWfProcess process = null; foreach (string processID in array) { process = WfRuntime.GetProcessByProcessID(processID); processes.Add(process); } temp.BranchProcessKey = process.Descriptor.Key; } else { IWfProcess process = WfRuntime.GetProcessByProcessID(obj.ToString()); processes.Add(process); temp.BranchProcessKey = process.Descriptor.Key; } return processes; }
public static void AreSame(this WfClientBranchProcessTemplateDescriptor expected, IWfBranchProcessTemplateDescriptor actual) { if (expected != null && actual != null) { Assert.AreEqual(expected.BlockingType, actual.BlockingType.ToClientBranchProcessBlockingType()); Assert.AreEqual(expected.SubProcessApprovalMode, actual.SubProcessApprovalMode.ToClientSubProcessApprovalMode()); Assert.AreEqual(expected.ExecuteSequence, actual.ExecuteSequence.ToClientBranchProcessExecuteSequence()); Assert.AreEqual(expected.BranchProcessKey, actual.BranchProcessKey); Assert.AreEqual(expected.DefaultProcessName, actual.DefaultProcessName); Assert.AreEqual(expected.DefaultTaskTitle, actual.DefaultTaskTitle); expected.Condition.AreSame(actual.Condition); expected.Resources.AssertResources(actual.Resources); expected.CancelSubProcessNotifier.AssertResources(actual.CancelSubProcessNotifier); expected.RelativeLinks.AssertRelativeLinks(actual.RelativeLinks); } else { Assert.AreEqual(expected, actual); } }
/// <summary> /// 添加同意和不同意的出线 /// </summary> /// <param name="currentActDesp"></param> private static void AddAgreeAndDisagreeLine(IWfActivityDescriptor currentActDesp, IWfActivityDescriptor nextActDesp, IWfBranchProcessTemplateDescriptor template) { IWfActivityDescriptor completedActDesp = currentActDesp.Process.CompletedActivity; WfTransitionDescriptor agreeTransition = (WfTransitionDescriptor)currentActDesp.ToTransitions.AddForwardTransition(nextActDesp); agreeTransition.Name = template.Properties.GetValue("AgreeLineName", "同意"); agreeTransition.DefaultSelect = true; agreeTransition.AffectProcessReturnValue = true; agreeTransition.AffectedProcessReturnValue = true; agreeTransition.Priority = 0; WfTransitionDescriptor disagreeTransition = (WfTransitionDescriptor)currentActDesp.ToTransitions.AddForwardTransition(completedActDesp); disagreeTransition.Name = template.Properties.GetValue("DisagreeLineName", "不同意"); disagreeTransition.Priority = 1; disagreeTransition.AffectProcessReturnValue = true; disagreeTransition.AffectedProcessReturnValue = false; }
private WfServiceStartupProcessParams PrepareOneServiceStartupProcessParams(WfBranchProcessTransferParams branchParams, IWfBranchProcessGroup group, int index) { IWfBranchProcessTemplateDescriptor template = branchParams.Template; WfBranchProcessStartupParams branchStartupParams = branchParams.BranchParams[index]; WfServiceStartupProcessParams startupParams = new WfServiceStartupProcessParams(); startupParams.Creator = this.Process.Creator; if (branchStartupParams.Department == null) { startupParams.Department = this.Process.OwnerDepartment; } else { startupParams.Department = branchStartupParams.Department; } startupParams.Assignees = branchStartupParams.Assignees.ToUsers(); if (branchStartupParams.DefaultTaskTitle.IsNullOrEmpty()) { if (startupParams.DefaultTaskTitle.IsNullOrEmpty()) { startupParams.DefaultTaskTitle = this.Process.Descriptor.DefaultTaskTitle; } else { startupParams.DefaultTaskTitle = this.Descriptor.TaskTitle; } } else { startupParams.DefaultTaskTitle = branchStartupParams.DefaultTaskTitle; } if (branchStartupParams.ResourceID.IsNullOrEmpty()) { WfSubProcessResourceMode mode = template.Properties.GetValue("CreateResourceMode", WfSubProcessResourceMode.DependsOnProcess); switch (mode) { //这里的规则是什么? case WfSubProcessResourceMode.DependsOnProcess: startupParams.ResourceID = this.Process.ResourceID; break; case WfSubProcessResourceMode.SameWithRoot: startupParams.ResourceID = this.Process.ResourceID; break; case WfSubProcessResourceMode.NewCreate: startupParams.ResourceID = UuidHelper.NewUuidString(); break; } } else { startupParams.ResourceID = branchStartupParams.ResourceID; } startupParams.OwnerActivityID = this.ID; startupParams.OwnerTemplateKey = template.Key; startupParams.Sequence = index; startupParams.RelativeParams = new Dictionary <object, object>(); foreach (var strpar in branchStartupParams.RelativeParams.AllKeys) { startupParams.RelativeParams.Add(strpar, this.Process.ApplicationRuntimeParameters[branchStartupParams.RelativeParams[strpar]]); } if (!string.IsNullOrEmpty(template.DefaultUrl)) { startupParams.DefaultURL = template.DefaultUrl; } else if (!string.IsNullOrEmpty(this.Descriptor.Url)) { startupParams.DefaultURL = this.Descriptor.Url; } else { startupParams.DefaultURL = this.Process.Descriptor.Url; } //如果是串行执行,且不是第一个流程,则不启动第一个活动,子流程处于未启动状态 if (template.ExecuteSequence == WfBranchProcessExecuteSequence.Serial && index > 0) { startupParams.AutoStartInitialActivity = false; } return(startupParams); }
private WfProcessStartupParams PrepareOneBranchProcessStartupParams(WfBranchProcessTransferParams branchTransferParams, IWfBranchProcessGroup group, int index) { IWfBranchProcessTemplateDescriptor template = branchTransferParams.Template; WfBranchProcessStartupParams branchStartupParams = branchTransferParams.BranchParams[index]; //准备启动子流程的参数 //先检查有没有预定义好的分支流程 IWfProcessDescriptor subProcessDesp = null; using (WfApplicationParametersContext apContext = WfApplicationParametersContext.CreateContext(branchStartupParams.ApplicationRuntimeParameters)) { subProcessDesp = template.GetBranchProcessDescriptor(); } if (template.DefaultProcessName.IsNotEmpty()) { string runtimeProcessName = this.Process.ApplicationRuntimeParameters.GetMatchedString(template.DefaultProcessName); if (runtimeProcessName.IsNullOrEmpty()) { runtimeProcessName = template.DefaultProcessName; } if (runtimeProcessName.IsNullOrEmpty()) { ((WfProcessDescriptor)subProcessDesp).Name = runtimeProcessName; } if (subProcessDesp.InitialActivity != null && subProcessDesp.InitialActivity.Name.IsNullOrEmpty()) { ((WfActivityDescriptor)subProcessDesp.InitialActivity).Name = runtimeProcessName; } } if (template.DefaultTaskTitle.IsNotEmpty()) { subProcessDesp.DefaultTaskTitle = template.DefaultTaskTitle; } if (template.DefaultUrl.IsNotEmpty()) { subProcessDesp.Url = template.DefaultUrl; } if (subProcessDesp.Url.IsNullOrEmpty()) { subProcessDesp.Url = this.Descriptor.Url.IsNotEmpty() ? this.Descriptor.Url : this.Descriptor.Process.Url; } WfProcessStartupParams startupParams = new WfProcessStartupParams(); startupParams.Creator = this.Operator; if (branchStartupParams.Department == null) { startupParams.Department = this.Process.OwnerDepartment; } else { startupParams.Department = branchStartupParams.Department; } startupParams.Assignees.CopyFrom(branchStartupParams.Assignees); startupParams.ProcessDescriptor = subProcessDesp; if (branchStartupParams.DefaultTaskTitle.IsNullOrEmpty()) { if (startupParams.DefaultTaskTitle.IsNullOrEmpty()) { if (subProcessDesp.DefaultTaskTitle.IsNotEmpty()) { startupParams.DefaultTaskTitle = subProcessDesp.DefaultTaskTitle; } else { startupParams.DefaultTaskTitle = this.Process.Descriptor.DefaultTaskTitle; } } else { startupParams.DefaultTaskTitle = this.Descriptor.TaskTitle; } } else { startupParams.DefaultTaskTitle = branchStartupParams.DefaultTaskTitle; } if (branchStartupParams.ResourceID.IsNullOrEmpty()) { WfSubProcessResourceMode mode = template.Properties.GetValue("CreateResourceMode", WfSubProcessResourceMode.DependsOnProcess); switch (mode) { case WfSubProcessResourceMode.DependsOnProcess: if (subProcessDesp.Properties.GetValue("Independent", false)) { startupParams.ResourceID = UuidHelper.NewUuidString(); } else { startupParams.ResourceID = this.Process.ResourceID; } break; case WfSubProcessResourceMode.SameWithRoot: startupParams.ResourceID = this.Process.ResourceID; break; case WfSubProcessResourceMode.NewCreate: startupParams.ResourceID = UuidHelper.NewUuidString(); break; } } else { startupParams.ResourceID = branchStartupParams.ResourceID; } if (branchStartupParams.RelativeParams.Count == 0) { startupParams.RelativeParams.CopyFrom(this.Process.RelativeParams); } else { startupParams.RelativeParams.CopyFrom(branchStartupParams.RelativeParams); } startupParams.BranchStartupParams = branchStartupParams; startupParams.Group = group; startupParams.OwnerActivityID = this.ID; startupParams.OwnerTemplateKey = template.Key; startupParams.Sequence = index; startupParams.AutoCommit = this.Process.Committed; //子流程的提交属性默认等于主流程的 branchStartupParams.ApplicationRuntimeParameters.ForEach(kp => startupParams.ApplicationRuntimeParameters.Add(kp.Key, kp.Value)); //如果是串行执行,且不是第一个流程,则不启动第一个活动,子流程处于未启动状态 if (template.ExecuteSequence == WfBranchProcessExecuteSequence.Serial && index > 0) { startupParams.AutoStartInitialActivity = false; } return(startupParams); }
/// <summary> /// 调用外部服务。对方会返回一个或一组流程ID。本函数返回这组ID对应的流程。 /// </summary> /// <param name="startupParams"></param> /// <param name="template"></param> /// <returns></returns> private WfProcessCollection InvokeBranchProcess(WfServiceStartupProcessParams startupParams, IWfBranchProcessTemplateDescriptor template) { this.Process.ApplicationRuntimeParameters["serviceOP_Paramas"] = startupParams; WfServiceInvoker svcInvoker = new WfServiceInvoker(template.OperationDefinition); object obj = svcInvoker.Invoke(); WfProcessCollection processes = new WfProcessCollection(); WfBranchProcessTemplateDescriptor temp = template as WfBranchProcessTemplateDescriptor; IList array = obj as IList; if (array != null) { IWfProcess process = null; foreach (string processID in array) { process = WfRuntime.GetProcessByProcessID(processID); processes.Add(process); } temp.BranchProcessKey = process.Descriptor.Key; } else { IWfProcess process = WfRuntime.GetProcessByProcessID(obj.ToString()); processes.Add(process); temp.BranchProcessKey = process.Descriptor.Key; } return(processes); }