Example #1
0
        /// <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);
        }
Example #2
0
        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);
        }
Example #3
0
        public WfStartWorkflowExecutor(IWfActivity operatorActivity, WfProcessStartupParams startupParams)
            : this(operatorActivity, startupParams, null, false)
        {
            startupParams.NullCheck("startupParams");

            this.StartupParams = startupParams;
        }
Example #4
0
        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;
        }
Example #5
0
 /// <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());
             }
         }
     }
 }
Example #6
0
        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;
        }
Example #7
0
        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);
            }
        }
Example #8
0
        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);
        }
Example #9
0
        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);
        }
Example #10
0
 public WfStartWorkflowExecutor(WfProcessStartupParams startupParams)
     : this(null, startupParams)
 {
 }