Exemple #1
0
        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]);
        }
Exemple #2
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);
        }
Exemple #3
0
        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;
		}
Exemple #5
0
        /// <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="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;
		}
Exemple #8
0
        /// <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;
		}
Exemple #10
0
        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);
            }
        }
Exemple #11
0
        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);
        }
Exemple #12
0
        /// <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 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);
        }
Exemple #17
0
        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);
        }
Exemple #20
0
        /// <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;
        }
Exemple #26
0
        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);
            }
        }
Exemple #27
0
        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="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;
        }
Exemple #29
0
        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);
        }
Exemple #30
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);
        }
Exemple #31
0
        /// <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);
        }