コード例 #1
0
        public void MoveToOneStepWithOpinion()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientTransferParams transferParams = new WfClientTransferParams("N2");

            transferParams.Assignees.Add(Consts.Users["CEO"]);

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.Opinion  = new WfClientOpinion()
            {
                Content = "我很高兴"
            };

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveTo(processInfo.ID, transferParams, runtimeContext);

            processInfo.Output();

            Assert.AreEqual("N2", processInfo.CurrentActivity.Descriptor.Key);
            Assert.IsTrue(processInfo.CurrentActivity.Assignees.Contains(Consts.Users["CEO"].ID));

            WfClientProcessInfo prevProcessInfo = WfClientProcessRuntimeServiceProxy.Instance.GetProcessInfoByActivityID(processInfo.PreviousActivity.ID, runtimeContext.Operator);

            prevProcessInfo.Output();

            Assert.IsNotNull(prevProcessInfo.CurrentOpinion);

            WfClientOpinionCollection opinions = WfClientProcessRuntimeServiceProxy.Instance.GetOpinionsByResourceID(prevProcessInfo.ResourceID);

            Assert.IsTrue(opinions.Count > 0);
        }
コード例 #2
0
        public WfClientProcessInfo MoveToNextDefaultActivity(string processID, WfClientRuntimeContext runtimeContext)
        {
            processID.CheckStringIsNullOrEmpty("processID");

            OperationContext.Current.FillContextToOguServiceContext();

            IWfProcess process = GetProcessByProcessID(processID, runtimeContext);

            MeregeRuntimeContext(process, runtimeContext);

            WfTransferParams transferParams = WfTransferParams.FromNextDefaultActivity(process);

            MergeTransferParams(transferParams, runtimeContext);

            IWfActivity originalActivity = process.CurrentActivity;

            ExecuteExecutor(process, runtimeContext, (p) =>
            {
                WfMoveToExecutor executor = new WfMoveToExecutor(p.CurrentActivity, p.CurrentActivity, transferParams);

                executor.SaveApplicationData += (dataContext) => SaveOpinion(runtimeContext.Opinion, originalActivity, transferParams);
                executor.PrepareMoveToTasks  += (dataContext, tasks) =>
                                                tasks.ForEach(task => task.Purpose = p.CurrentActivity.Descriptor.Name);

                return(executor);
            });

            return(process.ToClientProcessInfo(transferParams.Operator).FillCurrentOpinion(process.CurrentActivity, runtimeContext.Operator));
        }
コード例 #3
0
        public void SaveProcessWithOpinionTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 1000;
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.Opinion = new WfClientOpinion()
            {
                Content = "我很高兴"
            };

            runtimeContext.AutoCalculate = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.SaveProcess(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N2", processInfo.NextActivities[0].Activity.DescriptorKey);
            Assert.IsNotNull(processInfo.CurrentOpinion);

            WfClientOpinionCollection opinions = WfClientProcessRuntimeServiceProxy.Instance.GetOpinionsByProcessID(processInfo.ID);

            Assert.IsTrue(opinions.Count > 0);
        }
コード例 #4
0
        public void InvalidUpdateTagTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.GetProcessInfoByID(processInfo.ID, Consts.Users["Requestor"]);

            processInfo.Output();

            runtimeContext.UpdateTag = processInfo.UpdateTag + 1; //Invalid UpdateTag

            bool thrown = false;

            try
            {
                WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);
            }
            catch (System.Exception ex)
            {
                thrown = true;
                Assert.IsTrue(ex.Message.IndexOf("流程状态已经改变") >= 0);
            }

            Assert.IsTrue(thrown);
        }
コード例 #5
0
        private static void ExecuteExecutor(IWfProcess process, WfClientRuntimeContext runtimeContext, Func <IWfProcess, WfExecutorBase> getExecutor)
        {
            DoPrincipalAction(runtimeContext, () =>
            {
                WfExecutorBase executor = getExecutor(process);

                executor.PrepareMoveToTasks += (context, tasks) =>
                {
                    if (runtimeContext.TaskTitle.IsNotEmpty())
                    {
                        tasks.ForEach(task => task.TaskTitle = runtimeContext.TaskTitle);
                    }
                };

                executor.PrepareNotifyTasks += (context, tasks) =>
                {
                    if (runtimeContext.NotifyTitle.IsNotEmpty())
                    {
                        tasks.ForEach(task => task.TaskTitle = runtimeContext.TaskTitle);
                    }
                };

                if (runtimeContext.AutoPersist)
                {
                    executor.Execute();
                }
                else
                {
                    executor.ExecuteNotPersist();
                }
            });
        }
コード例 #6
0
        public WfClientProcessInfo Restore(string processID, WfClientRuntimeContext runtimeContext)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            return(ExecuteProcessActionByProcessID(processID, runtimeContext,
                                                   (process) => new WfRestoreProcessExecutor(process.CurrentActivity, process)));
        }
コード例 #7
0
 private static void MergeTransferParams(WfTransferParamsBase transferParams, WfClientRuntimeContext runtimeContext)
 {
     if (runtimeContext != null)
     {
         if (transferParams.Operator == null)
         {
             transferParams.Operator = (IUser)runtimeContext.Operator.ToOguObject();
         }
     }
 }
コード例 #8
0
        private static IWfProcess GetProcessByProcessID(string processID, WfClientRuntimeContext runtimeContext)
        {
            IWfProcess process = WfRuntime.GetProcessByProcessID(processID);

            if (runtimeContext.UpdateTag >= 0)
            {
                ((WfProcess)process).UpdateTag = runtimeContext.UpdateTag;
            }

            return(process);
        }
コード例 #9
0
        private static WfClientProcessInfo ExecuteProcessAction(string processID, WfClientRuntimeContext runtimeContext, Action <IWfProcess> action)
        {
            processID.CheckStringIsNullOrEmpty("processID");
            action.NullCheck("action");

            IWfProcess process = GetProcessByProcessID(processID, runtimeContext);

            MeregeRuntimeContext(process, runtimeContext);

            DoPrincipalAction(runtimeContext, () => action(process));

            return(process.ToClientProcessInfo(runtimeContext.Operator));
        }
コード例 #10
0
        public WfClientProcessInfo Cancel(string processID, WfClientRuntimeContext runtimeContext)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            return(ExecuteProcessActionByProcessID(processID, runtimeContext,
                                                   (process) =>
            {
                WfCancelProcessExecutor executor = new WfCancelProcessExecutor(process.CurrentActivity, process);

                executor.SaveApplicationData += (dataContext) => SaveAbortOpinion(runtimeContext.Opinion);
                return executor;
            }));
        }
コード例 #11
0
        public void PauseProcess()
        {
            WfClientProcessInfo    processInfo    = OperationHelper.PreapreProcessWithConditionLinesInstance();
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.Pause(processInfo.ID, runtimeContext);

            processInfo.Output();

            Assert.AreEqual(WfClientProcessStatus.Paused, processInfo.Status);
        }
コード例 #12
0
        /// <summary>
        /// 将runtimeContext的数据合并到流程上下文中
        /// </summary>
        /// <param name="process"></param>
        /// <param name="runtimeContext"></param>
        private static void MeregeRuntimeContext(IWfProcess process, WfClientRuntimeContext runtimeContext)
        {
            if (runtimeContext != null)
            {
                WfClientDictionaryConverter.Instance.ClientToServer(runtimeContext.ApplicationRuntimeParameters, process.ApplicationRuntimeParameters);
                WfClientDictionaryConverter.Instance.ClientToServer(runtimeContext.ProcessContext, process.Context);
                WfClientProcessInfoBaseConverter.Instance.FillOpinionInfoByProcessByActivity(runtimeContext.Opinion, process.CurrentActivity, runtimeContext.Operator, runtimeContext.Operator);

                if (runtimeContext.AutoCalculate)
                {
                    process.GenerateCandidatesFromResources();
                }
            }
        }
コード例 #13
0
        public void WithdrawProcess()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.Withdraw(processInfo.ID, runtimeContext);

            processInfo.Output();

            Assert.AreEqual("Start", processInfo.CurrentActivity.Descriptor.Key);
        }
コード例 #14
0
        public void ReplaceAssignees()
        {
            WfClientProcessInfo    processInfo    = OperationHelper.PreapreProcessWithConditionLinesInstance();
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.ReplaceAssignees(
                processInfo.CurrentActivity.ID, null, new WfClientUser[] { Consts.Users["CEO"] }, runtimeContext);

            processInfo.Output();

            Assert.AreEqual(Consts.Users["CEO"].ID, processInfo.CurrentActivity.Assignees[0].User.ID);
        }
コード例 #15
0
        public void MoveToNextDefaultActivity()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 20000;
            runtimeContext.Operator = Consts.Users["Requestor"];

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N1", processInfo.CurrentActivity.Descriptor.Key);
            Assert.IsTrue(processInfo.CurrentActivity.Assignees.Contains(Consts.Users["CFO"].ID));
        }
コード例 #16
0
        public void SaveProcessTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 1000;
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.AutoCalculate             = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.SaveProcess(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N2", processInfo.NextActivities[0].Activity.DescriptorKey);
        }
コード例 #17
0
        public override object Deserialize(IDictionary <string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            WfClientRuntimeContext context = new WfClientRuntimeContext();

            context.AutoCalculate = dictionary.GetValue("autoCalculate", false);
            context.TaskTitle     = dictionary.GetValue("taskTitle", string.Empty);
            context.NotifyTitle   = dictionary.GetValue("notifyTitle", string.Empty);
            context.Operator      = JSONSerializerExecute.Deserialize <WfClientUser>(dictionary.GetValue("operator", (object)null));
            context.Opinion       = JSONSerializerExecute.Deserialize <WfClientOpinion>(dictionary.GetValue("opinion", (object)null));
            context.AutoPersist   = dictionary.GetValue("autoPersist", true);
            context.UpdateTag     = dictionary.GetValue("updateTag", -1);

            JSONSerializerExecute.FillDeserializedDictionary(dictionary, "applicationRuntimeParameters", context.ApplicationRuntimeParameters);
            JSONSerializerExecute.FillDeserializedDictionary(dictionary, "processContext", context.ProcessContext);

            return(context);
        }
コード例 #18
0
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            WfClientRuntimeContext context = new WfClientRuntimeContext();

            context.AutoCalculate = dictionary.GetValue("autoCalculate", false);
            context.TaskTitle = dictionary.GetValue("taskTitle", string.Empty);
            context.NotifyTitle = dictionary.GetValue("notifyTitle", string.Empty);
            context.Operator = JSONSerializerExecute.Deserialize<WfClientUser>(dictionary.GetValue("operator", (object)null));
            context.Opinion = JSONSerializerExecute.Deserialize<WfClientOpinion>(dictionary.GetValue("opinion", (object)null));
            context.AutoPersist = dictionary.GetValue("autoPersist", true);
            context.UpdateTag = dictionary.GetValue("updateTag", -1);

            JSONSerializerExecute.FillDeserializedDictionary(dictionary, "applicationRuntimeParameters", context.ApplicationRuntimeParameters);
            JSONSerializerExecute.FillDeserializedDictionary(dictionary, "processContext", context.ProcessContext);

            return context;
        }
コード例 #19
0
        public static WfClientProcessInfo PrepareBranchProcesses()
        {
            WfClientProcessDescriptor processDesp = ProcessDescriptorHelper.CreateSimpleClientProcessWithoutLines();

            //增加子节点
            WfClientActivityDescriptor branchActDesp = new WfClientActivityDescriptor(WfClientActivityType.NormalActivity);

            branchActDesp.Key  = "N1";
            branchActDesp.Name = "CFO";

            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcesses", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchApprovalProcess", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcessExecuteSequence", 0);

            //增加审批人
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Requestor"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Approver1"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["CEO"]));

            processDesp.Activities.Add(branchActDesp);

            //线
            WfClientTransitionDescriptor transition = new WfClientTransitionDescriptor(processDesp.InitialActivity.Key, branchActDesp.Key);

            transition.Key = "L1";
            processDesp.InitialActivity.ToTransitions.Add(transition);

            WfClientTransitionDescriptor transition2 = new WfClientTransitionDescriptor(branchActDesp.Key, processDesp.CompletedActivity.Key);

            transition2.Key = "L2";
            branchActDesp.ToTransitions.Add(transition2);

            WfClientProcessDescriptorServiceProxy.Instance.SaveDescriptor(processDesp);

            //启动参数
            WfClientProcessStartupParams clientStartupParams = ProcessRuntimeHelper.PrepareClientProcessStartupParams(processDesp.Key);

            //流程实例
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();
            WfClientProcessInfo    process        = WfClientProcessRuntimeServiceProxy.Instance.StartWorkflow(clientStartupParams);

            return(WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(process.ID, runtimeContext));
        }
コード例 #20
0
        public void MoveToOneStep()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientTransferParams transferParams = new WfClientTransferParams("N2");

            transferParams.Assignees.Add(Consts.Users["CEO"]);

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.Operator = Consts.Users["Requestor"];

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveTo(processInfo.ID, transferParams, runtimeContext);

            processInfo.Output();

            Assert.AreEqual("N2", processInfo.CurrentActivity.Descriptor.Key);
            Assert.IsTrue(processInfo.CurrentActivity.Assignees.Contains(Consts.Users["CEO"].ID));
        }
コード例 #21
0
        public override IDictionary <string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            Dictionary <string, object> dictionary = new Dictionary <string, object>();

            WfClientRuntimeContext context = (WfClientRuntimeContext)obj;

            dictionary.AddNonDefaultValue("autoCalculate", context.AutoCalculate);
            dictionary["taskTitle"]   = context.TaskTitle;
            dictionary["notifyTitle"] = context.NotifyTitle;
            dictionary["operator"]    = context.Operator;
            dictionary["autoPersist"] = context.AutoPersist;
            dictionary["applicationRuntimeParameters"] = context.ApplicationRuntimeParameters;
            dictionary["processContext"] = context.ProcessContext;
            dictionary["updateTag"]      = context.UpdateTag;

            dictionary.AddNonDefaultValue("opinion", context.Opinion);

            return(dictionary);
        }
コード例 #22
0
        public void GetSimpleApplicationRuntimeParameterTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"]           = 1000;
            runtimeContext.ApplicationRuntimeParameters["ProcessRequestor"] = Consts.Users["Requestor"];
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.AutoCalculate             = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.UpdateRuntimeParameters(processInfo.ID, runtimeContext);
            processInfo.Output();

            int data = WfClientProcessRuntimeServiceProxy.Instance.GetApplicationRuntimeParameters(processInfo.ID, "Amount", WfClientProbeApplicationRuntimeParameterMode.Auto, 0);

            Console.WriteLine(data);
        }
コード例 #23
0
        public void CancelProcessWithOpinion()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            runtimeContext.Opinion = new WfClientOpinion()
            {
                Content = "我很高兴"
            };

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.Cancel(processInfo.ID, runtimeContext);

            processInfo.Output();

            Assert.AreEqual(WfClientProcessStatus.Aborted, processInfo.Status);
            Assert.IsNotNull(processInfo.CurrentOpinion);
        }
コード例 #24
0
        public WfClientProcessInfo UpdateRuntimeParameters(string processID, WfClientRuntimeContext runtimeContext)
        {
            processID.CheckStringIsNullOrEmpty("processID");
            runtimeContext.NullCheck("clientTransferParams");

            OperationContext.Current.FillContextToOguServiceContext();

            IWfProcess process = GetProcessByProcessID(processID, runtimeContext);

            MeregeRuntimeContext(process, runtimeContext);

            if (runtimeContext.AutoPersist)
            {
                WfRuntime.ProcessContext.AffectedProcesses.AddOrReplace(process);

                ExecuteProcessAction(processID, runtimeContext, (p) => WfRuntime.PersistWorkflows());
            }

            return(process.ToClientProcessInfo(runtimeContext.Operator).FillCurrentOpinion(process.CurrentActivity, runtimeContext.Operator));
        }
コード例 #25
0
        public void UpdateRuntimeParametersTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 1000;
            runtimeContext.ApplicationRuntimeParameters["Users"]  = new WfClientUser[] { Consts.Users["Requestor"], Consts.Users["Approver1"] };
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.AutoCalculate             = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.UpdateRuntimeParameters(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N2", processInfo.NextActivities[0].Activity.DescriptorKey);

            IList usersInProcess = (IList)processInfo.ApplicationRuntimeParameters["Users"];

            Assert.IsTrue(usersInProcess.Count > 0);

            Assert.AreEqual(Consts.Users["Requestor"].ID, ((WfClientUser)usersInProcess[0]).ID);
            Assert.AreEqual(Consts.Users["Approver1"].ID, ((WfClientUser)usersInProcess[1]).ID);
        }
コード例 #26
0
        private static IWfProcess GetProcessByProcessID(string processID, WfClientRuntimeContext runtimeContext)
        {
            IWfProcess process = WfRuntime.GetProcessByProcessID(processID);

            if (runtimeContext.UpdateTag >= 0)
                ((WfProcess)process).UpdateTag = runtimeContext.UpdateTag;

            return process;
        }
コード例 #27
0
        private static void ExecuteExecutor(IWfProcess process, WfClientRuntimeContext runtimeContext, Func<IWfProcess, WfExecutorBase> getExecutor)
        {
            DoPrincipalAction(runtimeContext, () =>
            {
                WfExecutorBase executor = getExecutor(process);

                executor.PrepareMoveToTasks += (context, tasks) =>
                {
                    if (runtimeContext.TaskTitle.IsNotEmpty())
                        tasks.ForEach(task => task.TaskTitle = runtimeContext.TaskTitle);
                };

                executor.PrepareNotifyTasks += (context, tasks) =>
                {
                    if (runtimeContext.NotifyTitle.IsNotEmpty())
                        tasks.ForEach(task => task.TaskTitle = runtimeContext.TaskTitle);
                };

                if (runtimeContext.AutoPersist)
                    executor.Execute();
                else
                    executor.ExecuteNotPersist();
            });
        }
コード例 #28
0
        public void MoveToNextDefaultActivity()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 20000;
            runtimeContext.Operator = Consts.Users["Requestor"];

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N1", processInfo.CurrentActivity.Descriptor.Key);
            Assert.IsTrue(processInfo.CurrentActivity.Assignees.Contains(Consts.Users["CFO"].ID));
        }
コード例 #29
0
 private void SaveExpense(WfClientRuntimeContext runtimeContext, Expense expense)
 {
     runtimeContext.ApplicationRuntimeParameters["Amount"] = expense.Amount;
     runtimeContext.ProcessContext["Expense"] = JsonConvert.SerializeObject(expense);
 }
コード例 #30
0
        public WfClientProcessInfo Restore(string processID, WfClientRuntimeContext runtimeContext)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            return ExecuteProcessActionByProcessID(processID, runtimeContext,
                (process) => new WfRestoreProcessExecutor(process.CurrentActivity, process));
        }
コード例 #31
0
        public WfClientProcessInfo StartWorkflowAndMoveTo(WfClientProcessStartupParams clientStartupParams, WfClientTransferParams clientTransferParams, WfClientRuntimeContext runtimeContext)
        {
            if (clientStartupParams == null)
                throw new ApplicationException(Translator.Translate(Define.DefaultCulture, "流程的启动参数不能为空"));

            //设置标准参数,优先使用外部参数
            if (!clientStartupParams.ApplicationRuntimeParameters.ContainsKey("ProcessRequestor")) 
            clientStartupParams.ApplicationRuntimeParameters["ProcessRequestor"] = clientStartupParams.Creator;

            OperationContext.Current.FillContextToOguServiceContext();

            WfProcessStartupParams startupParams = null;

            WfClientProcessStartupParamsConverter.Instance.ClientToServer(clientStartupParams, ref startupParams);

            WfTransferParams transferParams = null;

            if (clientTransferParams != null)
            {
                WfClientTransferParamsConverter.Instance.ClientToServer(clientTransferParams, null, ref transferParams);

                MergeTransferParams(transferParams, runtimeContext);
            }

            IWfProcess process = null;

            DoPrincipalAction(startupParams.Creator, () =>
            {
                WfStartWorkflowExecutor executor = new WfStartWorkflowExecutor(null, startupParams, transferParams);

                executor.AfterModifyWorkflow += (dataContext =>
                {
                    dataContext.CurrentProcess.GenerateCandidatesFromResources();
                    clientStartupParams.ProcessContext.ForEach(kp => dataContext.CurrentProcess.Context[kp.Key] = kp.Value);

                    WfClientProcessInfoBaseConverter.Instance.FillOpinionInfoByProcessByActivity(
                        clientStartupParams.Opinion,
                        dataContext.CurrentProcess.InitialActivity,
                        clientStartupParams.Creator,
                        clientStartupParams.Creator);
                });

                WfClientOpinion opinion = clientStartupParams.Opinion;

                if (opinion == null)
                    opinion = runtimeContext.Opinion;

                executor.SaveApplicationData += (dataContext) => SaveOpinion(opinion, dataContext.CurrentProcess.InitialActivity, executor.TransferParams);

                if (clientStartupParams.AutoPersist)
                    process = executor.Execute();
                else
                    process = executor.ExecuteNotPersist();
            });

            return process.ToClientProcessInfo(clientStartupParams.Creator).FillCurrentOpinion(process.CurrentActivity, clientStartupParams.Creator);
        }
コード例 #32
0
 private static void MergeTransferParams(WfTransferParamsBase transferParams, WfClientRuntimeContext runtimeContext)
 {
     if (runtimeContext != null)
     {
         if (transferParams.Operator == null)
             transferParams.Operator = (IUser)runtimeContext.Operator.ToOguObject();
     }
 }
コード例 #33
0
        public void CancelProcessWithOpinion()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            runtimeContext.Opinion = new WfClientOpinion() { Content = "我很高兴" };

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.Cancel(processInfo.ID, runtimeContext);

            processInfo.Output();

            Assert.AreEqual(WfClientProcessStatus.Aborted, processInfo.Status);
            Assert.IsNotNull(processInfo.CurrentOpinion);
        }
コード例 #34
0
        public void InvalidUpdateTagTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.GetProcessInfoByID(processInfo.ID, Consts.Users["Requestor"]);

            processInfo.Output();

            runtimeContext.UpdateTag = processInfo.UpdateTag + 1; //Invalid UpdateTag

            bool thrown = false;

            try
            {
                WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);
            }
            catch (System.Exception ex)
            {
                thrown = true;
                Assert.IsTrue(ex.Message.IndexOf("流程状态已经改变") >= 0);
            }

            Assert.IsTrue(thrown);
        }
コード例 #35
0
        public void WithdrawAndCancelProcess()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.WithdrawAndCancel(processInfo.ID, runtimeContext);

            processInfo.Output();

            Assert.AreEqual("Start", processInfo.CurrentActivity.Descriptor.Key);
            Assert.AreEqual(WfClientProcessStatus.Aborted, processInfo.Status);
        }
コード例 #36
0
        public WfClientProcessInfo UpdateRuntimeParameters(string processID, WfClientRuntimeContext runtimeContext)
        {
            processID.CheckStringIsNullOrEmpty("processID");
            runtimeContext.NullCheck("clientTransferParams");

            OperationContext.Current.FillContextToOguServiceContext();

            IWfProcess process = GetProcessByProcessID(processID, runtimeContext);

            MeregeRuntimeContext(process, runtimeContext);

            if (runtimeContext.AutoPersist)
            {
                WfRuntime.ProcessContext.AffectedProcesses.AddOrReplace(process);

                ExecuteProcessAction(processID, runtimeContext, (p) => WfRuntime.PersistWorkflows());
            }

            return process.ToClientProcessInfo(runtimeContext.Operator).FillCurrentOpinion(process.CurrentActivity, runtimeContext.Operator);
        }
コード例 #37
0
 public WfClientProcessInfo StartWorkflowAndMoveTo(WfClientProcessStartupParams clientStartupParams, WfClientTransferParams clientTransferParams, WfClientRuntimeContext runtimeContext)
 {
     return(this.SingleCall(action => action.StartWorkflowAndMoveTo(clientStartupParams, clientTransferParams, runtimeContext)));
 }
コード例 #38
0
 public WfClientProcessInfo Resume(string processID, WfClientRuntimeContext runtimeContext)
 {
     return(this.SingleCall(action => action.Resume(processID, runtimeContext)));
 }
コード例 #39
0
 public WfClientProcessInfo MoveToNextDefaultActivity(string processID, WfClientRuntimeContext runtimeContext)
 {
     return(this.SingleCall(action => action.MoveToNextDefaultActivity(processID, runtimeContext)));
 }
コード例 #40
0
        private static WfClientProcessInfo ExecuteProcessActionByProcessID(string processID, WfClientRuntimeContext runtimeContext, Func<IWfProcess, WfExecutorBase> getExecutor)
        {
            processID.CheckStringIsNullOrEmpty("processID");
            getExecutor.NullCheck("getExecutor");

            IWfProcess process = GetProcessByProcessID(processID, runtimeContext);

            MeregeRuntimeContext(process, runtimeContext);

            ExecuteExecutor(process, runtimeContext, getExecutor);

            return process.ToClientProcessInfo(runtimeContext.Operator).FillCurrentOpinion(process.CurrentActivity, runtimeContext.Operator);
        }
コード例 #41
0
        public WfClientProcessInfo Cancel(string processID, WfClientRuntimeContext runtimeContext)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            return ExecuteProcessActionByProcessID(processID, runtimeContext,
                (process) =>
                {
                    WfCancelProcessExecutor executor = new WfCancelProcessExecutor(process.CurrentActivity, process);

                    executor.SaveApplicationData += (dataContext) => SaveAbortOpinion(runtimeContext.Opinion);
                    return executor;
                });
        }
コード例 #42
0
        public static WfClientProcessInfo PrepareBranchProcesses()
        {
            WfClientProcessDescriptor processDesp = ProcessDescriptorHelper.CreateSimpleClientProcessWithoutLines();

            //增加子节点
            WfClientActivityDescriptor branchActDesp = new WfClientActivityDescriptor(WfClientActivityType.NormalActivity);
            branchActDesp.Key = "N1";
            branchActDesp.Name = "CFO";

            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcesses", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchApprovalProcess", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcessExecuteSequence", 0);

            //增加审批人
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Requestor"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Approver1"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["CEO"]));

            processDesp.Activities.Add(branchActDesp);

            //线
            WfClientTransitionDescriptor transition = new WfClientTransitionDescriptor(processDesp.InitialActivity.Key, branchActDesp.Key);
            transition.Key = "L1";
            processDesp.InitialActivity.ToTransitions.Add(transition);

            WfClientTransitionDescriptor transition2 = new WfClientTransitionDescriptor(branchActDesp.Key, processDesp.CompletedActivity.Key);
            transition2.Key = "L2";
            branchActDesp.ToTransitions.Add(transition2);

            WfClientProcessDescriptorServiceProxy.Instance.SaveDescriptor(processDesp);

            //启动参数
            WfClientProcessStartupParams clientStartupParams = ProcessRuntimeHelper.PrepareClientProcessStartupParams(processDesp.Key);

            //流程实例
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();
            WfClientProcessInfo process = WfClientProcessRuntimeServiceProxy.Instance.StartWorkflow(clientStartupParams);

            return WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(process.ID, runtimeContext);
        }
コード例 #43
0
        /// <summary>
        /// 将runtimeContext的数据合并到流程上下文中
        /// </summary>
        /// <param name="process"></param>
        /// <param name="runtimeContext"></param>
        private static void MeregeRuntimeContext(IWfProcess process, WfClientRuntimeContext runtimeContext)
        {
            if (runtimeContext != null)
            {
                WfClientDictionaryConverter.Instance.ClientToServer(runtimeContext.ApplicationRuntimeParameters, process.ApplicationRuntimeParameters);
                WfClientDictionaryConverter.Instance.ClientToServer(runtimeContext.ProcessContext, process.Context);
                WfClientProcessInfoBaseConverter.Instance.FillOpinionInfoByProcessByActivity(runtimeContext.Opinion, process.CurrentActivity, runtimeContext.Operator, runtimeContext.Operator);

                if (runtimeContext.AutoCalculate)
                    process.GenerateCandidatesFromResources();
            }
        }
コード例 #44
0
 private static void DoPrincipalAction(WfClientRuntimeContext runtimeContext, Action action)
 {
     DoPrincipalAction((IUser)runtimeContext.Operator.ToOguObject(), action);
 }
コード例 #45
0
        public WfClientProcessInfo ReplaceAssignees(string activityID, WfClientUser originalUser, List<WfClientUser> targetUsers, WfClientRuntimeContext runtimeContext)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            IWfProcess process = WfRuntime.GetProcessByActivityID(activityID);
            IWfActivity targetActivity = process.Activities[activityID];

            ExecuteExecutor(process, runtimeContext,
                (p) => new WfReplaceAssigneesExecutor(targetActivity, targetActivity, (IUser)originalUser.ToOguObject(), targetUsers.ToOguObjects<WfClientUser, IUser>()));

            return process.ToClientProcessInfo(runtimeContext.Operator).FillCurrentOpinion(process.CurrentActivity, runtimeContext.Operator);
        }
コード例 #46
0
        private static WfClientProcessInfo ExecuteProcessAction(string processID, WfClientRuntimeContext runtimeContext, Action<IWfProcess> action)
        {
            processID.CheckStringIsNullOrEmpty("processID");
            action.NullCheck("action");

            IWfProcess process = GetProcessByProcessID(processID, runtimeContext);

            MeregeRuntimeContext(process, runtimeContext);

            DoPrincipalAction(runtimeContext, () => action(process));

            return process.ToClientProcessInfo(runtimeContext.Operator);
        }
コード例 #47
0
        public void ResumeProcess()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.Pause(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.Resume(processInfo.ID, runtimeContext);

            processInfo.Output();

            Assert.AreEqual(WfClientProcessStatus.Running, processInfo.Status);
            Assert.AreEqual(WfClientActivityStatus.Running, processInfo.CurrentActivity.Status);
        }
コード例 #48
0
        public void MoveToOneStep()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientTransferParams transferParams = new WfClientTransferParams("N2");

            transferParams.Assignees.Add(Consts.Users["CEO"]);

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();
            runtimeContext.Operator = Consts.Users["Requestor"];

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveTo(processInfo.ID, transferParams, runtimeContext);

            processInfo.Output();

            Assert.AreEqual("N2", processInfo.CurrentActivity.Descriptor.Key);
            Assert.IsTrue(processInfo.CurrentActivity.Assignees.Contains(Consts.Users["CEO"].ID));
        }
コード例 #49
0
        public void MoveToOneStepWithOpinionThenSaveOpinion()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientTransferParams transferParams = new WfClientTransferParams("N2");

            transferParams.Assignees.Add(Consts.Users["CEO"]);

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();
            runtimeContext.Operator = Consts.Users["Requestor"];

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveTo(processInfo.ID, transferParams, runtimeContext);

            processInfo.Output();

            Assert.AreEqual("N2", processInfo.CurrentActivity.Descriptor.Key);
            Assert.IsTrue(processInfo.CurrentActivity.Assignees.Contains(Consts.Users["CEO"].ID));

            runtimeContext.Opinion = new WfClientOpinion() { Content = "我很高兴" };

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.SaveProcess(processInfo.ID, runtimeContext);

            Assert.IsNotNull(processInfo.CurrentOpinion);
            Assert.IsTrue(processInfo.CurrentOpinion.ID.IsNotEmpty());

            runtimeContext.Opinion = processInfo.CurrentOpinion;
            runtimeContext.Opinion.Content = "我确实很高兴";

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.SaveProcess(processInfo.ID, runtimeContext);

            WfClientOpinionCollection opinions = WfClientProcessRuntimeServiceProxy.Instance.GetOpinionsByResourceID(processInfo.ResourceID);

            Assert.AreEqual(1, opinions.Count);
            Assert.AreEqual(runtimeContext.Opinion.ID, opinions.First().ID);
            Assert.AreEqual(runtimeContext.Opinion.Content, opinions.First().Content);
        }
コード例 #50
0
        public void ReplaceAssignees()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext(Consts.Users["Requestor"]);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(processInfo.ID, runtimeContext);

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.ReplaceAssignees(
                processInfo.CurrentActivity.ID, null, new WfClientUser[] { Consts.Users["CEO"] }, runtimeContext);

            processInfo.Output();

            Assert.AreEqual(Consts.Users["CEO"].ID, processInfo.CurrentActivity.Assignees[0].User.ID);
        }
コード例 #51
0
        public void UpdateRuntimeParametersTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 1000;
            runtimeContext.ApplicationRuntimeParameters["Users"] = new WfClientUser[] { Consts.Users["Requestor"], Consts.Users["Approver1"] };
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.AutoCalculate = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.UpdateRuntimeParameters(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N2", processInfo.NextActivities[0].Activity.DescriptorKey);

            IList usersInProcess = (IList)processInfo.ApplicationRuntimeParameters["Users"];

            Assert.IsTrue(usersInProcess.Count > 0);

            Assert.AreEqual(Consts.Users["Requestor"].ID, ((WfClientUser)usersInProcess[0]).ID);
            Assert.AreEqual(Consts.Users["Approver1"].ID, ((WfClientUser)usersInProcess[1]).ID);
        }
コード例 #52
0
        public void SaveProcessTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 1000;
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.AutoCalculate = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.SaveProcess(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N2", processInfo.NextActivities[0].Activity.DescriptorKey);
        }
コード例 #53
0
 public WfClientProcessInfo UpdateRuntimeParameters(string processID, WfClientRuntimeContext runtimeContext)
 {
     return(this.SingleCall(action => action.UpdateRuntimeParameters(processID, runtimeContext)));
 }
コード例 #54
0
        public void SaveProcessWithOpinionTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 1000;
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.Opinion = new WfClientOpinion() { Content = "我很高兴" };

            runtimeContext.AutoCalculate = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.SaveProcess(processInfo.ID, runtimeContext);
            processInfo.Output();

            Assert.AreEqual("N2", processInfo.NextActivities[0].Activity.DescriptorKey);
            Assert.IsNotNull(processInfo.CurrentOpinion);

            WfClientOpinionCollection opinions = WfClientProcessRuntimeServiceProxy.Instance.GetOpinionsByProcessID(processInfo.ID);

            Assert.IsTrue(opinions.Count > 0);
        }
コード例 #55
0
        /// <summary>
        /// 替换某个活动中的办理人,无论该活动的状态。如果这个人有待办,待办也会被替换。
        /// </summary>
        /// <param name="activityID">需要替换的活动的ID</param>
        /// <param name="originalUser">被替换的人。如果这个属性为null,则替换掉这个活动中所有的指派人和候选人</param>
        /// <param name="targetUsers">替换成的人,如果为null,则不完成替换</param>
        /// <param name="runtimeContext">流转上下文信息</param>
        /// <returns></returns>
        public WfClientProcessInfo ReplaceAssignees(string activityID, WfClientUser originalUser, IEnumerable <WfClientUser> targetUsers, WfClientRuntimeContext runtimeContext)
        {
            List <WfClientUser> targetUsersList = _EmptyClientUserList;

            if (targetUsers != null)
            {
                targetUsersList = new List <WfClientUser>(targetUsers);
            }

            return(this.SingleCall(action => action.ReplaceAssignees(activityID, originalUser, targetUsersList, runtimeContext)));
        }
コード例 #56
0
        public void GetSimpleApplicationRuntimeParameterTest()
        {
            WfClientProcessInfo processInfo = OperationHelper.PreapreProcessWithConditionLinesInstance();

            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();

            runtimeContext.ApplicationRuntimeParameters["Amount"] = 1000;
            runtimeContext.ApplicationRuntimeParameters["ProcessRequestor"] = Consts.Users["Requestor"];
            runtimeContext.Operator = Consts.Users["Requestor"];
            runtimeContext.ProcessContext["Context"] = "This is process context";
            runtimeContext.AutoCalculate = true;

            processInfo = WfClientProcessRuntimeServiceProxy.Instance.UpdateRuntimeParameters(processInfo.ID, runtimeContext);
            processInfo.Output();

            int data = WfClientProcessRuntimeServiceProxy.Instance.GetApplicationRuntimeParameters(processInfo.ID, "Amount", WfClientProbeApplicationRuntimeParameterMode.Auto, 0);
            Console.WriteLine(data);
        }
コード例 #57
0
 public WfClientProcessInfo Withdraw(string processID, WfClientRuntimeContext runtimeContext)
 {
     return(this.SingleCall(action => action.Withdraw(processID, runtimeContext)));
 }
コード例 #58
0
        public WfClientProcessInfo MoveTo(string processID, WfClientTransferParams clientTransferParams, WfClientRuntimeContext runtimeContext)
        {
            processID.CheckStringIsNullOrEmpty("processID");
            clientTransferParams.NullCheck("clientTransferParams");

            OperationContext.Current.FillContextToOguServiceContext();

            IWfProcess process = GetProcessByProcessID(processID, runtimeContext);

            MeregeRuntimeContext(process, runtimeContext);

            WfTransferParams transferParams = null;

            WfClientTransferParamsConverter.Instance.ClientToServer(clientTransferParams, process, ref transferParams);

            MergeTransferParams(transferParams, runtimeContext);

            IWfActivity originalActivity = process.CurrentActivity;

            ExecuteExecutor(process, runtimeContext, (p) =>
            {
                WfMoveToExecutor executor = new WfMoveToExecutor(p.CurrentActivity, p.CurrentActivity, transferParams);

                executor.SaveApplicationData += (dataContext) => SaveOpinion(runtimeContext.Opinion, originalActivity, transferParams);
                executor.PrepareMoveToTasks += (dataContext, tasks) =>
                    tasks.ForEach(task => task.Purpose = p.CurrentActivity.Descriptor.Name);

                return executor;
            });

            return process.ToClientProcessInfo(transferParams.Operator).FillCurrentOpinion(process.CurrentActivity, runtimeContext.Operator);
        }