Exemple #1
0
        /// <summary>
        /// 置开始节点为结束状态
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        /// <returns></returns>
        private GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance, ActivityEntity activity, WfAppRunner runner)
        {
            //开始节点没前驱信息
            var fromActivityInstance = base.CreateActivityInstanceObject(base.Linker.FromActivity, processInstance, runner);

            var activityIns = base.ActivityInstanceManager.Insert(fromActivityInstance);

            base.ActivityInstanceManager.Complete(fromActivityInstance.Fid, runner);

            fromActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
            base.Linker.FromActivityInstance   = fromActivityInstance;

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);

            return(result);
        }
Exemple #2
0
        internal static GatewayExecutedResult CreateGatewayExecutedResult(GatewayExecutedStatus status)
        {
            GatewayExecutedResult result = new GatewayExecutedResult(GatewayExecutedStatus.Unknown, "Gateway节点的执行状态未知!");

            switch (status)
            {
            case GatewayExecutedStatus.Successed:
                result = new GatewayExecutedResult(GatewayExecutedStatus.Successed, "Gateway节点成功执行!");
                break;

            case GatewayExecutedStatus.FallBehindOfXOrJoin:
                result = new GatewayExecutedResult(GatewayExecutedStatus.FallBehindOfXOrJoin, "第一个满足条件的节点已经执行,互斥合并节点不能再次被实例化!");
                break;

            default:
                break;
            }
            return(result);
        }
Exemple #3
0
        /// <summary>
        /// 递归执行节点
        /// 1)创建普通节点的任务
        /// 2)创建会签节点的任务
        /// </summary>
        /// <param name="fromActivity">起始活动</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="isJumpforward">是否跳跃</param>
        /// <param name="root">根节点</param>
        /// <param name="conditionKeyValuePair">条件key-value</param>
        protected void ContinueForwardCurrentNodeRecurisivly(ActivityEntity fromActivity,
                                                             WfActivityInstance fromActivityInstance,
                                                             NextActivityComponent root,
                                                             Boolean isJumpforward)
        {
            foreach (NextActivityComponent comp in root)
            {
                if (comp.HasChildren)
                {
                    //此节点类型为分支或合并节点类型:首先需要实例化当前节点(自动完成)
                    NodeMediatorGateway gatewayNodeMediator = NodeMediatorGatewayFactory.CreateGatewayNodeMediator(comp.Activity,
                                                                                                                   this.ActivityForwardContext.ProcessModel,
                                                                                                                   AppRunner, _dataAccessor, _loggerFactory);

                    ICompleteAutomaticlly autoGateway   = (ICompleteAutomaticlly)gatewayNodeMediator;
                    GatewayExecutedResult gatewayResult = autoGateway.CompleteAutomaticlly(
                        ActivityForwardContext.ProcessInstance,
                        comp.Transition.TransitionID,
                        fromActivityInstance);

                    if (gatewayResult.Status == GatewayExecutedStatus.Successed)
                    {
                        //遍历后续子节点
                        ContinueForwardCurrentNodeRecurisivly(fromActivity,
                                                              gatewayNodeMediator.GatewayActivityInstance,
                                                              comp,
                                                              isJumpforward);
                    }
                    else
                    {
                        WfRuntimeException e = new WfRuntimeException("第一个满足条件的节点已经被成功执行,此后的节点被阻止在XOrJoin节点!");
                        _logger.LogError($"第一个满足条件的节点已经被成功执行,此后的节点被阻止在XOrJoin节点!");
                    }
                }
                else if (comp.Activity.ActivityType == ActivityTypeEnum.TaskNode || comp.Activity.ActivityType == ActivityTypeEnum.TimerNode || comp.Activity.ActivityType == ActivityTypeEnum.SignNode)                   //普通任务节点
                {
                    //此节点类型为任务节点:根据fromActivityInstance的类型判断是否可以创建任务
                    if (fromActivityInstance.ActivityState == ActivityStateEnum.Completed.ToString())
                    {
                        //创建新任务节点
                        NodeMediator taskNodeMediator = new NodeMediatorTask(AppRunner, _dataAccessor, _loggerFactory);
                        taskNodeMediator.CreateActivityTaskTransitionInstance(comp.Activity,
                                                                              ActivityForwardContext.ProcessInstance,
                                                                              fromActivityInstance,
                                                                              comp.Transition.TransitionID,
                                                                              comp.Transition.DirectionType == TransitionDirectionTypeEnum.Loop ?
                                                                              TransitionTypeEnum.Loop : TransitionTypeEnum.Forward, //根据Direction方向确定是否是自身循环
                                                                              isJumpforward == true ?
                                                                              TransitionFlyingTypeEnum.ForwardFlying : TransitionFlyingTypeEnum.NotFlying);
                    }
                    else
                    {
                        //下一步的任务节点没有创建,需给出提示信息
                        if ((fromActivity.GatewayDirectionType | GatewayDirectionEnum.AllJoinType)
                            == GatewayDirectionEnum.AllJoinType)
                        {
                            WfRuntimeException e = new WfRuntimeException("等待其它需要合并的分支!");
                            _logger.LogWarning("等待其它需要合并的分支!");
                        }
                    }
                }
                else if (comp.Activity.ActivityType == ActivityTypeEnum.SubProcessNode)         //子流程节点
                {
                    //节点类型为subprocessnode
                    if (fromActivityInstance.ActivityState == ActivityStateEnum.Completed.ToString())
                    {
                        //实例化subprocess节点数据
                        NodeMediator subNodeMediator = new NodeMediatorSubProcess(AppRunner, _dataAccessor, _loggerFactory);
                        subNodeMediator.CreateActivityTaskTransitionInstance(comp.Activity,
                                                                             ActivityForwardContext.ProcessInstance,
                                                                             fromActivityInstance,
                                                                             comp.Transition.TransitionID,
                                                                             comp.Transition.DirectionType == TransitionDirectionTypeEnum.Loop ?
                                                                             TransitionTypeEnum.Loop : TransitionTypeEnum.Forward,
                                                                             TransitionFlyingTypeEnum.NotFlying);
                    }
                }
                else if (comp.Activity.ActivityType == ActivityTypeEnum.EndNode)        //结束节点
                {
                    //此节点为完成结束节点,结束流程
                    NodeMediator endMediator = new NodeMediatorEnd(ActivityForwardContext, AppRunner, _dataAccessor, _loggerFactory);
                    endMediator.Linker.ToActivity = comp.Activity;

                    //创建结束节点实例及转移数据
                    endMediator.CreateActivityTaskTransitionInstance(comp.Activity, ActivityForwardContext.ProcessInstance,
                                                                     fromActivityInstance, comp.Transition.TransitionID, TransitionTypeEnum.Forward,
                                                                     TransitionFlyingTypeEnum.NotFlying);

                    //执行结束节点中的业务逻辑
                    endMediator.ExecuteWorkItem();
                }
                else
                {
                    WfRuntimeException e = new WfRuntimeException(string.Format("XML文件定义了未知的节点类型,执行失败,节点类型信息:{0}",
                                                                                comp.Activity.ActivityType.ToString()));
                    _logger.LogError($"XML文件定义了未知的节点类型,执行失败,节点类型信息:{comp.Activity.ActivityType.ToString()}");
                }
            }
        }