/// <summary> /// 启动一个模版(组)下的一组分支流程,在服务模式下,可能返回多个流程。其它情况返回单个流程 /// </summary> /// <param name="branchTransferParams"></param> /// <param name="group"></param> /// <param name="index"></param> /// <returns></returns> private WfProcessCollection StartupBranchProcess(WfBranchProcessTransferParams branchTransferParams, IWfBranchProcessGroup group, int index) { WfProcessCollection processes = null; if (branchTransferParams.Template.OperationDefinition == null) { WfProcessStartupParams startupParams = PrepareOneBranchProcessStartupParams(branchTransferParams, group, index); startupParams.CheckStartProcessUserPermission = false; processes = new WfProcessCollection(); processes.Add(WfRuntime.StartWorkflow(startupParams)); } else { if (WfRuntime.ProcessContext.EnableServiceCall) { WfServiceStartupProcessParams startupParams = PrepareOneServiceStartupProcessParams(branchTransferParams, group, index); processes = InvokeBranchProcess(startupParams, branchTransferParams.Template); } else { processes = new WfProcessCollection(); } } return(processes); }
private static WfProcessStartupParams PrepareStartWorkflowParams(IWfProcessDescriptor processDesp, WfSimulationContext simulationContext) { WfProcessStartupParams startupParams = new WfProcessStartupParams(); startupParams.ProcessDescriptor = processDesp; startupParams.DefaultTaskTitle = startupParams.ProcessDescriptor.DefaultTaskTitle; if (OguUser.IsNotNullOrEmpty(simulationContext.SimulationParameters.Creator)) { startupParams.Creator = simulationContext.SimulationParameters.Creator; } else { if (DeluxePrincipal.IsAuthenticated) { startupParams.Creator = DeluxeIdentity.CurrentUser; } } startupParams.Assignees.Add(startupParams.Creator); startupParams.ResourceID = UuidHelper.NewUuidString(); MergeVariablesToApplicationRuntimeParameters(startupParams.ApplicationRuntimeParameters, simulationContext.SimulationParameters.Variables); return(startupParams); }
public WfStartWorkflowExecutor(IWfActivity operatorActivity, WfProcessStartupParams startupParams) : this(operatorActivity, startupParams, null, false) { startupParams.NullCheck("startupParams"); this.StartupParams = startupParams; }
public WfStartWorkflowExecutor(IWfActivity operatorActivity, WfProcessStartupParams startupParams, WfTransferParams transferParams, bool autoMoveTo = true) : base(operatorActivity, WfControlOperationType.Startup) { startupParams.NullCheck("startupParams"); this.StartupParams = startupParams; this.TransferParams = transferParams; this._AutoMoveTo = autoMoveTo; }
/// <summary> /// 根据WfProcessStartupParams中OverridableInitialActivityProperties的内容,填充起始活动的属性 /// </summary> /// <param name="startupParams"></param> /// <param name="actDesp"></param> private static void FillInitialActivityDescriptorProperties(WfProcessStartupParams startupParams, IWfActivityDescriptor actDesp) { if (actDesp != null) { foreach (KeyValuePair <string, object> kp in startupParams.OverridableInitialActivityProperties) { if (kp.Value != null) { actDesp.Properties.TrySetValue(kp.Key, kp.Value.ToString()); } } } }
private static void FillProcessInstanceProperties(WfProcessStartupParams startupParams, WfProcess process) { process.ResourceID = startupParams.ResourceID; process.RelativeParams.CopyFrom(startupParams.RelativeParams); process.RelativeID = startupParams.RelativeID; process.RelativeURL = startupParams.RelativeURL; process.BranchStartupParams = startupParams.BranchStartupParams; process.EntryInfo = startupParams.Group; process.OwnerActivityID = startupParams.OwnerActivityID; process.OwnerTemplateKey = startupParams.OwnerTemplateKey; process.Sequence = startupParams.Sequence; process.ApplicationRuntimeParameters.CopyFrom(startupParams.ApplicationRuntimeParameters); process.Committed = startupParams.AutoCommit; process.OwnerDepartment = startupParams.Department; process.Creator = startupParams.Creator; }
private static void FillProcessDescriptorProperties(WfProcessStartupParams startupParams, IWfProcessDescriptor processDesp) { if (startupParams.DefaultTaskTitle.IsNotEmpty()) { processDesp.DefaultTaskTitle = startupParams.DefaultTaskTitle; } if (startupParams.DefaultUrl.IsNotEmpty()) { processDesp.Url = startupParams.DefaultUrl; } if (startupParams.RuntimeProcessName.IsNotEmpty() && processDesp.Properties.ContainsKey("RuntimeProcessName")) { processDesp.Properties.SetValue("RuntimeProcessName", startupParams.RuntimeProcessName); } }
public static IWfProcess StartWorkflow(WfProcessStartupParams startupParams) { startupParams.NullCheck <WfRuntimeException>("startupParams"); WfProcess process = new WfProcess(startupParams.ProcessDescriptor); FillProcessDescriptorProperties(startupParams, process.Descriptor); FillProcessInstanceProperties(startupParams, process); WfProcessContextCache.Instance.Add(process.ID, process); if (process.Creator == null && DeluxePrincipal.IsAuthenticated) { process.Creator = DeluxeIdentity.CurrentUser; } if (process.InitialActivity != null) { if (process.InitialActivity.Descriptor.Properties.GetValue("AutoGenerateCadidates", true)) { process.InitialActivity.GenerateCandidatesFromResources(); WfMatrix matrix = process.GetMatrix(); if (matrix != null) { ((WfActivityBase)process.InitialActivity).GenerateCandidatesFromMatrix(matrix); } } if (startupParams.CheckStartProcessUserPermission) { CheckStartProcessUserPermission(process); } if (startupParams.Assignees.Count == 0) { startupParams.Assignees.CopyFrom(process.InitialActivity.Candidates); } if (process.InitialActivity.Descriptor.Resources.Count == 0) { startupParams.Assignees.ToUsers().ForEach(u => process.InitialActivity.Descriptor.Resources.Add(new WfUserResourceDescriptor(u))); } WfSimulator.WriteSimulationInfo(process, WfSimulationOperationType.Startup); //如果自动启动第一个活动且存在活动点,则流转到第一个点 if (startupParams.AutoStartInitialActivity) { WfAssigneeCollection assignees = startupParams.Assignees; process.InitialActivity.Candidates.Clear(); process.InitialActivity.Candidates.CopyFrom(startupParams.Assignees); IWfActivity originalInitial = process.InitialActivity; WfRuntime.DecorateProcess(process); //修饰流程后,如果起始点发生了变化... if (originalInitial != process.InitialActivity) { assignees = process.InitialActivity.Candidates; } WfTransferParams transferParams = new WfTransferParams(process.InitialActivity.Descriptor); //设置初始节点子流程参数 process.InitialActivity.Descriptor.BranchProcessTemplates.ForEach(branchTemplate => { transferParams.BranchTransferParams.Add(new WfBranchProcessTransferParams(branchTemplate)); }); transferParams.Operator = startupParams.Creator; transferParams.Assignees.CopyFrom(assignees); process.MoveTo(transferParams); WfRuntime.ProcessContext.NormalizeTaskTitles(); } } WfRuntime.ProcessContext.AffectedProcesses.AddOrReplace(process); return(process); }
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); }
public WfStartWorkflowExecutor(WfProcessStartupParams startupParams) : this(null, startupParams) { }