Exemplo n.º 1
0
 public Activity(Engine engine, ActivityEntity entity, ProcessContext context = null)
 {
     this.Engine         = engine;
     this.FlowRepository = engine.ResolveFlowRepository(context);
     this.entity         = entity;
     this.id             = entity.Id;
 }
Exemplo n.º 2
0
 void Postdicate(ProcessContext processContext, ITransaction trans = null)
 {
     // 已处理,且状态有变化的才能执行结束检查
     if (this.Status != ActivityStates.Dealed || !this.statesChanged || results == null)
     {
         return;
     }
     if (!this.Action.Postdicate(this, processContext))
     {
         return;
     }
     this.Status          = ActivityStates.Done;
     this.Entity.DoneTime = DateTime.Now;
     if (this.Graph.Exports != null && this.Graph.Exports.Count > 0)
     {
         var parent       = this.Parent as Activity;
         var parentStates = parent.States as JObject;
         foreach (var pair in this.Graph.Exports)
         {
             var value = JSON.GetPathValue(this.states, pair.Key);
             JSON.SetPathValue(parentStates, pair.Value, value);
             parent.statesChanged = true;
         }
         parent.SaveChanges(trans);
         this.Todo(parent, null);
     }
     this.SaveChanges(trans);
 }
Exemplo n.º 3
0
        Activity ResolveNextActivity(IAssociation assoc, NavigateResults navResults, ProcessContext processContext)
        {
            var parent = this.FromActivity.Parent as Activity;

            if (parent.Graph.Nodes == null)
            {
                throw new InvalidGraphException("父级节点{0}的图形不正确,没有nodes", parent.Id.ToString());
            }
            var node = parent.Graph.Nodes.FirstOrDefault(node => node.Name == assoc.To);

            if (node == null)
            {
                throw new InvalidGraphException("未在父级节点{0}找到名称为{1}的节点", parent.Id.ToString(), assoc.To);
            }

            var nextActivity = parent.FindUndealedChild(node.Name);

            if (nextActivity != null)
            {
                return(nextActivity);
            }

            nextActivity = new Activity(this.FromActivity.Engine, parent, node, this.FromActivity.Version, navResults.NextInputs, processContext.Dealer, navResults.NextDealer, processContext);
            this.FromActivity.Todo(nextActivity, navResults.NextInputs);
            this.ToActivities.Add(nextActivity);
            this.ActivityEntities.Add(nextActivity.Entity);
            return(nextActivity);
        }
Exemplo n.º 4
0
        public ActivityStates Deal(object inputs, IUser dealer, object context)
        {
            //创建上下文
            var processContext = new ProcessContext(this, inputs, dealer, context);

            return(this.Deal(inputs, processContext));
        }
Exemplo n.º 5
0
        public virtual object Execute(IActivity activity, object inputs, ProcessContext processContext)
        {
            string[] starts = activity.Graph.Starts;
            if (starts == null || starts.Length == 0)
            {
                if (activity.Graph.Start != null)
                {
                    starts = new string[] { activity.Graph.Start }
                }
                ;
            }
            var nodes = activity.Graph.Nodes;

            if (starts == null || starts.Length == 0)
            {
                if (nodes != null && nodes.Count != 0)
                {
                    throw new InvalidGraphException("活动{0}未配置start/starts,却没有配置nodes", this.ToString());
                }
            }

            if (nodes == null && nodes.Count == 0)
            {
                throw new InvalidGraphException("活动{0}配置了start/starts,却没有配置nodes", this.ToString());
            }
            var nextEntities = new List <ActivityEntity>();

            foreach (var startName in starts)
            {
                var startNode = activity.Graph.Nodes.FirstOrDefault(p => p.Name == startName);
                if (startNode == null)
                {
                    throw new InvalidGraphException("活动{0}无法找到起始节点{1}", this.ToString(), startName);
                }
                IUser startOwner = null;
                if (processContext.StartOwners != null)
                {
                    processContext.StartOwners.TryGetValue(startName, out startOwner);
                }
                if (startOwner == null)
                {
                    startOwner = processContext.StartOwner;
                }
                if (startOwner == null)
                {
                    throw new ArgumentException("未指定开始节点的所有者,请给owner/owners参数赋值");
                }
                var startActivity = new Activity(processContext.Engine, activity as Activity, startNode, activity.Version, inputs, processContext.Dealer, startOwner, processContext);

                nextEntities.Add(startActivity.Entity);
                processContext.Todo(startActivity, inputs);
            }
            processContext.FlowRepository.InsertActivities(nextEntities, processContext.FlowTransaction);

            return(null);
        }
Exemplo n.º 6
0
        public virtual IAction LoadAction(string actionTypeName, ProcessContext context)
        {
            var actionType = LoadActionType(actionTypeName);

            if (actionType == null)
            {
                return(null);
            }
            return(Activator.CreateInstance(actionType) as IAction);
        }
Exemplo n.º 7
0
 void Todo(ProcessContext processContext)
 {
     while (this.todos != null)
     {
         var todos = this.todos;
         this.todos = null;
         foreach (var pair in todos)
         {
             pair.Key.Deal(pair.Value, processContext);
         }
     }
 }
Exemplo n.º 8
0
        internal ActivityStates Deal(object inputs, ProcessContext processContext)
        {
            //终态,直接返回
            if (this.IsFulfilled)
            {
                return(this.Status);
            }

            // 用户检查
            if (this.Status != ActivityStates.Created &&
                processContext.Dealer != null &&
                this.Owner != null &&
                this.owner.Id != processContext.Dealer.Id
                )
            {
                return(this.Status);
            }

            // 合并Inputs到状态中
            this.CombineInputsToStates(inputs);

            // 处理者
            this.Dealer = processContext.Dealer;

            // 加载活动
            this.Action = this.Engine.LoadAction(this.Graph.InstanceType, processContext) ?? new Action();
            if (this.Predicate(inputs, processContext))
            {
                var trans = this.FlowRepository.CreateTransaction(processContext.UserContext);
                try {
                    trans.TryBegin();
                    // 执行得到执行结果
                    var executeResult = this.Execute(inputs, processContext);
                    // 试图结束当前活动
                    this.Postdicate(processContext, trans);
                    // 根据执行结果看是否执行下一步
                    this.ResolveNexts(executeResult, processContext, trans);
                } catch (Exception ex) {
                    trans.TryRollback();
                    throw ex;
                }
                this.Todo(processContext);
            }
            return(this.Status);
        }
Exemplo n.º 9
0
        Navigations ResolveNexts(object executeResults, ProcessContext processConext, ITransaction trans)
        {
            // 已处理,且状态有变化的才能开始寻找下一步
            if (this.Status != ActivityStates.Dealed || !this.statesChanged || executeResults == null)
            {
                return(null);
            }
            if (this.Graph.Nexts == null || this.Graph.Nexts.Count == 0)
            {
                return(null);
            }
            var navs = new Navigations(this, executeResults);

            foreach (var assoc in this.Graph.Nexts)
            {
                navs.AddIfPass(assoc, processConext);
            }
            return(navs.Save(trans));
        }
Exemplo n.º 10
0
        public virtual bool Postdicate(IActivity activity, ProcessContext processContext)
        {
            var nodes = activity.Graph.Nodes;

            //如果是活动容器,要首先检查是否还有活着的子活动
            if (nodes != null &&
                nodes.Count != 0 &&
                activity.Children.Any(p => !p.IsFulfilled))
            {
                return(false);
            }

            if (!string.IsNullOrEmpty(activity.Graph.Key))
            {
                var value = activity.State <string>(activity.Graph.Key);
                return(value == activity.Graph.Value);
            }
            return(true);
        }
Exemplo n.º 11
0
        bool Predicate(object inputs, ProcessContext context)
        {
            // 已创建,但尚未开始的可以做执行检查
            if (this.Status != ActivityStates.Creating && this.Status != ActivityStates.Created)
            {
                return(true);
            }
            // 创建事务
            var trans = this.FlowRepository.CreateTransaction(context.UserContext);

            try {
                // 开始事务
                trans.TryBegin();
                // 执行Action的predicate获取到owner
                var owner = this.Action.Predicate(this, inputs, context);
                // 返回null,表示活动的进入检查不成功,返回false
                if (owner == null)
                {
                    // 活动状态变更为处理中
                    this.Status = ActivityStates.Created;
                    this.SaveChanges(trans);
                    trans.TryCommitAsync();
                    return(false);
                }
                // 指定了有效所有者才会赋值
                if (!string.IsNullOrEmpty(owner.Id))
                {
                    this.Owner = owner;
                }
                // 活动对象的状态变更为处理中
                this.Status = ActivityStates.Dealing;
                this.SaveChanges(trans);
                trans.TryCommit();
                return(true);
            } catch (Exception ex) {
                trans.TryRollback();
                throw ex;
            }
        }
Exemplo n.º 12
0
        object Execute(object inputs, ProcessContext protecssContext)
        {
            //正在处理/已处理还未完成的活动可以被执行
            if (this.Status != ActivityStates.Dealing && this.Status != ActivityStates.Dealed)
            {
                return(null);
            }

            var executeResults = this.results = this.Action.Execute(this, inputs, protecssContext);

            if (executeResults == null)
            {
                return(null);
            }
            var jobj = JObject.FromObject(executeResults);

            this.results = jobj;
            foreach (var pair in jobj)
            {
                this.State(pair.Key, pair.Value);
            }
            this.Status = ActivityStates.Dealed;
            return(executeResults);
        }
Exemplo n.º 13
0
        public bool AddIfPass(IAssociation assoc, ProcessContext processConext)
        {
            // 该连线已经有了
            if (this.FromActivity.Nexts.ContainsKey(assoc.Name))
            {
                return(false);
            }
            // 获取到导航器
            var navigator = this.FromActivity.Engine.ResolveNavigator(this.FromActivity, assoc, processConext);
            // 用导航器得到导航结果
            NavigateResults navResults = navigator.Navigate(this.FromActivity, assoc, this.ExecuteResults, processConext);

            //检查没通过,不会走该线路
            if (navResults == null)
            {
                return(false);
            }

            var nextActivity = this.ResolveNextActivity(assoc, navResults, processConext);

            this.CreateNavigation(nextActivity, assoc, navResults, processConext);

            return(true);
        }
Exemplo n.º 14
0
 public virtual Task <object> ExecuteAsync(IActivity activity, object inputs, ProcessContext processContext)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 15
0
 public virtual async Task <IUser> PredicateAsync(IActivity activity, object inputs, ProcessContext processContext)
 {
     return(activity.Owner ?? User.Anyone);
 }
Exemplo n.º 16
0
 public INavigator ResolveNavigator(Activity activity, IAssociation assoc, ProcessContext processContext)
 {
     return(activity.Action);
 }
Exemplo n.º 17
0
 public virtual Task <bool> PostdicateAsync(IActivity activity, ProcessContext processContext)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 18
0
 public virtual IUser Predicate(IActivity activity, object inputs, ProcessContext processContext)
 {
     return(activity.Owner ?? User.Anyone);
 }
Exemplo n.º 19
0
        public virtual NavigateResults Navigate(IActivity activity, IAssociation assoc, object executeResults, ProcessContext processContext)
        {
            //未指定Key,看是否已经完成
            if (string.IsNullOrEmpty(assoc.Key))
            {
                // 未完成,不能进行下一步
                if (activity.Status != ActivityStates.Done)
                {
                    return(null);
                }
            }
            // 看是状态是否满足
            else
            {
                if (activity.State <string>(assoc.Key) != assoc.Value)
                {
                    return(null);
                }
            }
            var nextDealerIdPath = assoc.NextDealerIdPath;

            if (string.IsNullOrEmpty(nextDealerIdPath))
            {
                nextDealerIdPath = processContext.Engine.DefaultNextDealerIdPath;
            }
            var nextDealerNamePath = assoc.NextDealerNamePath;

            if (string.IsNullOrEmpty(nextDealerNamePath))
            {
                nextDealerNamePath = processContext.Engine.DefaultNextDealerNamePath;
            }
            var nextDealerId = activity.State <string>(nextDealerIdPath);

            if (string.IsNullOrEmpty(nextDealerId))
            {
                throw new Exception(string.Format("活动对象{0}在执行导航{1}时,已经通过,但未能找到下一处理人", activity.Id, assoc.Name));
            }
            var nextDealer = new User(nextDealerId, activity.State <string>(nextDealerNamePath));

            object nextInputs;

            if (assoc.NextInputsMaps != null)
            {
                var jObj = new JObject();
                foreach (var pair in assoc.NextInputsMaps)
                {
                    var value = activity.State(pair.Key);
                    JSON.SetPathValue(jObj, pair.Value, value);
                }
                nextInputs = jObj;
            }
            else
            {
                nextInputs = executeResults;
            }
            return(new NavigateResults(nextDealer, nextInputs));
        }
Exemplo n.º 20
0
 public Activity(Activity parent, INode node, ProcessContext context = null)
 {
 }
Exemplo n.º 21
0
 /// <summary>
 /// 根据id创建活动对象
 /// </summary>
 /// <param name="id"></param>
 /// <param name="engine"></param>
 public Activity(Engine engine, Guid id, ProcessContext context = null)
 {
     this.Engine         = engine;
     this.FlowRepository = engine.ResolveFlowRepository(context);
     this.id             = id;
 }
Exemplo n.º 22
0
        NavigationEntity CreateNavigation(Activity toActivity, IAssociation assoc, NavigateResults navResults, ProcessContext processContext)
        {
            var entity = new NavigationEntity()
            {
                FromActivityId   = this.FromActivity.Id,
                ToActivityId     = toActivity.Id,
                ParentActivityId = this.FromActivity.ParentId.Value,
                FlowId           = toActivity.FlowId,
                NavigatorType    = assoc.InstanceType,
                NextDealerId     = navResults.NextDealer?.Id,
                NextDealerName   = navResults.NextDealer?.Name,
                NextInputs       = JSON.Stringify(navResults.NextInputs),
                CreateTime       = DateTime.Now,
                CreatorId        = processContext.Dealer.Id,
                CreatorName      = processContext.Dealer.Name
            };

            this.NavigationEntities.Add(entity);
            this.FromActivity.AddNexts(assoc.Name, toActivity.Id);
            return(entity);
        }
Exemplo n.º 23
0
 public virtual Task <NavigateResults> NavigateAsync(IActivity activity, IAssociation assoc, object executeResults, ProcessContext processContext)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 24
0
        public Activity(Engine engine, Activity parent, INode node, string version, object inputs, IUser creator, IUser owner, ProcessContext processContext)
        {
            this.Engine = engine;
            this.graph  = node;
            this.parent = parent;


            #region init entity
            var entity = new ActivityEntity()
            {
                Id          = Guid.NewGuid(),
                NodeName    = node.Name,
                NodePath    = parent == null ? node.Name : parent.NodePath + "/" + node.Name,
                Status      = ActivityStates.Creating,
                Version     = version ?? parent?.Version,
                Domain      = engine.Name,
                ActionType  = node.InstanceType ?? engine.DefaultActionType,
                Graph       = JSON.Stringify(node),
                HasChildren = node.Nodes != null && node.Nodes.Count > 0,
                Inputs      = JSON.Stringify(inputs),
                CreateTime  = DateTime.Now,
                CreatorId   = creator.Id,
                CreatorName = creator.Name
            };

            this.entity = entity;
            this.Owner  = owner;
            #endregion

            if (parent != null)
            {
                this.FlowRepository = parent.FlowRepository;
                this.AddChild(this);
            }
            else
            {
                this.FlowRepository = engine.ResolveFlowRepository(processContext);
            }

            #region init states
            var states = new JObject();
            var metas  = (node as Node).Metas;
            if (metas != null)
            {
                foreach (var pair in metas)
                {
                    states.Add(pair.Key, pair.Value.DeepClone());
                }
            }
            if (parent != null && node.Imports != null)
            {
                var pStates = parent.States as JObject;
                foreach (var pair in node.Imports)
                {
                    var value = JSON.GetPathValue(pStates, pair.Value);
                    JSON.SetPathValue(states, pair.Key, value);
                }
            }

            this.entity.States = states.ToString();
            this.states        = states;
            #endregion
        }
Exemplo n.º 25
0
 public virtual IFlowRepository ResolveFlowRepository(ProcessContext processContext)
 {
     return(this.FlowRepository);
 }