Esempio n. 1
0
        /// <summary>
        /// 节点内部业务逻辑执行
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            //执行前Action列表
            OnBeforeExecuteWorkItem();

            //设置流程完成
            ProcessInstanceManager pim = new ProcessInstanceManager();
            var processInstance        = pim.Complete(ActivityForwardContext.ProcessInstance.ID,
                                                      ActivityForwardContext.ActivityResource.AppRunner,
                                                      Session);

            //如果当前流程是子流程,则子流程完成,主流程流转到下一节点
            if (pim.IsSubProcess(processInstance) == true)
            {
                ContinueMainProcessRunning(processInstance, this.Session);
            }

            //执行后Action列表
            OnAfterExecuteWorkItem();

            //调用流程结束事件
            DelegateExecutor.InvokeExternalDelegate(Session,
                                                    EventFireTypeEnum.OnProcessCompleted,
                                                    ActivityForwardContext.ActivityResource.AppRunner.DelegateEventList,
                                                    ActivityForwardContext.ProcessInstance.ID);
        }
        internal DelegateExecuteContext(DelegateExecutor executor, Func<object> delagateWapper,
                                 IEnumerable<DelegateArgument> arguments)
            : this(executor, delagateWapper)
        {
            Check.MustNotNull("arguments", "arguments");

            _arguments = arguments.ToList();
        }
        internal DelegateExecuteContext(DelegateExecutor executor, Func<object> delagateWapper)
        {
            Check.MustNotNull("executor", "executor");
            Check.MustNotNull("delagateWapper", "delagateWapper");

            _executor = executor;
            _delagateWapper = delagateWapper;
        }
 /// <summary>
 /// 执行流程完成事件
 /// </summary>
 /// <param name="session">会话</param>
 private void OnProcessRunning(IDbSession session)
 {
     //调用流程结束事件
     DelegateExecutor.InvokeExternalDelegate(session,
                                             EventFireTypeEnum.OnProcessRunning,
                                             base.ActivityResource.AppRunner.DelegateEventList,
                                             RunningActivityInstance.ProcessInstanceID);
 }
        public async Task Delegates()
        {
            var called   = 0;
            var executor = new DelegateExecutor(async(_, __) => called++);

            await executor.ExecuteAsync(null, null);

            Assert.Equal(1, called);
        }
Esempio n. 6
0
        /// <summary>
        /// 触发后执行
        /// </summary>
        protected void OnAfterExecuteWorkItem()
        {
            var delegateService = GetDelegateService();
            var actionList      = this.EventActivity.ActionList;

            ActionExecutor.ExecteActionListAfter(actionList, delegateService as IDelegateService);

            //----> 节点流转完成后,调用活动完成执行的委托事件
            DelegateExecutor.InvokeExternalDelegate(this.Session,
                                                    EventFireTypeEnum.OnActivityExecuted,
                                                    this.EventActivity,
                                                    ActivityForwardContext);
        }
        /// <summary>
        /// 执行流程完成事件
        /// </summary>
        /// <param name="session">会话</param>
        private void OnProcessCompleted(IDbSession session)
        {
            var pim    = new ProcessInstanceManager();
            var entity = pim.GetById(session.Connection, RunningActivityInstance.ProcessInstanceID, session.Transaction);

            if (entity.ProcessState == (short)ProcessStateEnum.Completed)
            {
                //调用流程结束事件
                DelegateExecutor.InvokeExternalDelegate(session,
                                                        EventFireTypeEnum.OnProcessCompleted,
                                                        base.ActivityResource.AppRunner.DelegateEventList,
                                                        RunningActivityInstance.ProcessInstanceID);
            }
        }
Esempio n. 8
0
        /// <summary>
        /// 运行执行方法
        /// </summary>
        /// <param name="session">会话</param>
        internal override void ExecuteInstanceImp(IDbSession session)
        {
            var result = base.WfExecutedResult;

            result.ProcessInstanceIDStarted = RunningActivityInstance.ProcessInstanceID;

            try
            {
                //创建运行时上下文
                var runningExecutionContext = ActivityForwardContext.CreateRunningContext(base.TaskView,
                                                                                          base.ProcessModel,
                                                                                          base.ActivityResource,
                                                                                          false,
                                                                                          session);

                //----> 节点开始流转,调用活动开始执行的委托事件
                DelegateExecutor.InvokeExternalDelegate(session,
                                                        EventFireTypeEnum.OnActivityExecuting,
                                                        runningExecutionContext);

                //执行节点流转过程
                NodeMediator mediator = NodeMediatorFactory.CreateNodeMediator(runningExecutionContext, session);
                mediator.Linker.FromActivityInstance = RunningActivityInstance;
                mediator.ExecuteWorkItem();

                //----> 节点流转完成后,调用活动完成执行的委托事件
                DelegateExecutor.InvokeExternalDelegate(session,
                                                        EventFireTypeEnum.OnActivityExecuted,
                                                        runningExecutionContext);

                //构造回调函数需要的数据
                result.Status  = WfExecutedStatus.Success;
                result.Message = mediator.GetNodeMediatedMessage();
            }
            catch (WfRuntimeException rx)
            {
                result.Status        = WfExecutedStatus.Failed;
                result.ExceptionType = WfExceptionType.RunApp_RuntimeError;
                result.Message       = rx.Message;
                throw rx;
            }
            catch (System.Exception ex)
            {
                result.Status        = WfExecutedStatus.Failed;
                result.ExceptionType = WfExceptionType.RunApp_RuntimeError;
                result.Message       = ex.Message;
                throw ex;
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 触发后执行
        /// </summary>
        protected void OnAfterExecuteWorkItem()
        {
            var delegateService = GetDelegateService();
            var actionList      = (this is NodeMediatorEnd) ? Linker.ToActivity.ActionList : Linker.FromActivity.ActionList;

            ActionExecutor.ExecteActionListAfter(actionList, delegateService as IDelegateService);

            //----> 节点流转完成后,调用活动完成执行的委托事件
            var currentActivity = Linker.ToActivity != null ? Linker.ToActivity : Linker.FromActivity;

            DelegateExecutor.InvokeExternalDelegate(this.Session,
                                                    EventFireTypeEnum.OnActivityExecuted,
                                                    currentActivity,
                                                    ActivityForwardContext);
        }
Esempio n. 10
0
        /// <summary>
        /// 触发前执行
        /// </summary>
        protected void OnBeforeExecuteWorkItem()
        {
            var delegateService = GetDelegateService();
            var actionList      = Linker.FromActivity.ActionList;

            ActionExecutor.ExecteActionListBefore(actionList, delegateService as IDelegateService);

            //----> 节点流转前,调用活动执行的委托事件
            var currentActivity = Linker.ToActivity != null ? Linker.ToActivity : Linker.FromActivity;

            DelegateExecutor.InvokeExternalDelegate(this.Session,
                                                    EventFireTypeEnum.OnActivityExecuting,
                                                    currentActivity,
                                                    ActivityForwardContext);
        }
        public async Task KeepsParameters()
        {
            var expectedMessage  = new Message();
            var expectedHandlers = new MessageHandler[]
            {
                msg => Task.CompletedTask
            };

            object actualMessage = null;
            IReadOnlyCollection <MessageHandler> actualHandlers = null;

            var executor = new DelegateExecutor(async(msg, h) =>
            {
                actualMessage  = msg;
                actualHandlers = h;
            });
            await executor.ExecuteAsync(expectedMessage, expectedHandlers);

            Assert.Same(expectedMessage, actualMessage);
            Assert.Same(expectedHandlers, actualHandlers);
        }
Esempio n. 12
0
        /// <summary>
        /// 创建活动任务转移实例数据
        /// </summary>
        /// <param name="toActivity">活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">开始活动实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    ProcessInstanceEntity processInstance,
                                                                    ActivityInstanceEntity fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType,
                                                                    ActivityResource activityResource,
                                                                    IDbSession session)
        {
            int     newActivityInstanceID = 0;
            Boolean isParallel            = false;

            if (fromActivityInstance.ActivityType == (short)ActivityTypeEnum.GatewayNode)
            {
                //并发多实例分支判断(AndSplit Multiple)
                var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version);
                var activityNode = processModel.GetActivity(fromActivityInstance.ActivityGUID);
                isParallel = processModel.IsAndSplitMI(activityNode);
            }

            if (isParallel)
            {
                //并行多实例容器
                var entity = new ActivityInstanceEntity();
                var plist  = activityResource.NextActivityPerformers[toActivity.ActivityGUID];

                //创建并行多实例分支
                for (var i = 0; i < plist.Count; i++)
                {
                    entity = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);
                    entity.AssignedToUserIDs   = plist[i].UserID;
                    entity.AssignedToUserNames = plist[i].UserName;
                    entity.ActivityState       = (short)ActivityStateEnum.Ready;
                    //插入活动实例数据
                    entity.ID = base.ActivityInstanceManager.Insert(entity, session);
                    //插入任务
                    base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session);
                    //插入转移数据
                    InsertTransitionInstance(processInstance,
                                             transitionGUID,
                                             fromActivityInstance,
                                             entity,
                                             transitionType,
                                             flyingType,
                                             activityResource.AppRunner,
                                             session);
                }
            }
            else
            {
                //普通任务节点
                var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

                //进入运行状态
                toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
                toActivityInstance = GenerateActivityAssignedUserInfo(toActivityInstance, activityResource);

                //插入活动实例数据
                newActivityInstanceID = base.ActivityInstanceManager.Insert(toActivityInstance, session);

                //插入任务数据
                base.CreateNewTask(toActivityInstance, activityResource, session);

                //插入转移数据
                InsertTransitionInstance(processInstance,
                                         transitionGUID,
                                         fromActivityInstance,
                                         toActivityInstance,
                                         transitionType,
                                         flyingType,
                                         activityResource.AppRunner,
                                         session);

                //调用外部事件的注册方法
                var delegateContext = new DelegateContext
                {
                    AppInstanceID     = processInstance.AppInstanceID,
                    ProcessGUID       = processInstance.ProcessGUID,
                    ProcessInstanceID = processInstance.ID,
                    ActivityGUID      = toActivity.ActivityGUID,
                    ActivityCode      = toActivity.ActivityCode,
                    ActivityResource  = activityResource
                };
                DelegateExecutor.InvokeExternalDelegate(session,
                                                        EventFireTypeEnum.OnActivityCreated,
                                                        activityResource.AppRunner.DelegateEventList,
                                                        delegateContext);
            }
        }