Esempio n. 1
0
        /// <summary>
        /// 创建并行节点
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="displayName"></param>
        /// <param name="completionScript"></param>
        /// <param name="branchs"></param>
        /// <returns></returns>
        public static CustomParallel CreateCustomParallel(ActivitySetting setting
                                                          , string displayName
                                                          , string completionScript
                                                          , params Custom[] branchs)
        {
            var first = setting.FlowNodeIndex == Default_FlowNodeIndex;
            var p     = first ? new CustomParallel() : new CustomParallel(setting.FlowNodeIndex);

            if (first)
            {
                p.OnFlowNodeIndex = o => setting.SetFlowNodeIndex(o);
            }

            p.DisplayName = displayName;
            if (branchs != null)
            {
                branchs.ToList().ForEach(o => p.Branches.Add(o));
            }
            //HACK:【重要】并行节点完成脚本执行设置CompletionCondition
            if (!string.IsNullOrEmpty(completionScript))
            {
                p.CompletionCondition = new LambdaValue <bool>(o =>
                                                               o.Resolve <IScriptParser>().EvaluateRule(completionScript, o.GetExtension <DataFieldExtension>()));
            }
            return(p);
        }
Esempio n. 2
0
        /// <summary>
        /// 创建SubProcess子流程节点
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="displayName"></param>
        /// <param name="serverScript">节点执行内容脚本</param>
        /// <param name="finishRule">节点完成规则</param>
        /// <param name="serverScriptResultTo">执行内容的结果输出到指定变量</param>
        /// <param name="serverResultTo">节点执行结果输出到变量</param>
        /// <param name="nexts"></param>
        /// <param name="defaultFlowNode"></param>
        /// <returns></returns>
        public static FlowStep CreateSubProcess(ActivitySetting setting
                                                , string displayName
                                                , IDictionary <string, string> finishRule
                                                , Variable <string> resultTo
                                                , IDictionary <string, FlowNode> nexts
                                                , FlowNode defaultFlowNode)
        {
            var server = CreateSubProcess(setting, displayName, finishRule, resultTo);
            var step   = new FlowStep();

            step.Action = server;

            if (nexts == null && defaultFlowNode == null)
            {
                return(step);
            }

            //设置finish cases
            var flowSwitch = new FlowSwitch <string>(o => resultTo.Get(o));

            if (defaultFlowNode != null)
            {
                flowSwitch.Default = defaultFlowNode;
            }
            if (nexts != null)
            {
                nexts.ToList().ForEach(o => flowSwitch.Cases.Add(o.Key, o.Value));
            }
            step.Next = flowSwitch;
            return(step);
        }
Esempio n. 3
0
        /// <summary>
        /// 创建人工节点
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="displayName"></param>
        /// <param name="actioner"></param>
        /// <param name="humanResultTo"></param>
        /// <param name="nexts"></param>
        /// <param name="defaultFlowNode"></param>
        /// <returns></returns>
        public static FlowStep CreateHuman(ActivitySetting setting
                                           , string displayName
                                           , IActionersHelper actioner//Activity<string[]> actioner
                                           , Variable <string> humanResultTo
                                           , IDictionary <string, FlowNode> nexts
                                           , FlowNode defaultFlowNode)
        {
            var human = CreateHuman(setting, displayName, actioner, humanResultTo);
            var step  = new FlowStep();

            step.Action = human;

            if (nexts == null && defaultFlowNode == null)
            {
                return(step);
            }

            //设置finish cases
            //HACK:在进入switch之前就已经计算出任务结果
            var flowSwitch = new FlowSwitch <string>(o => humanResultTo.Get(o));

            if (defaultFlowNode != null)
            {
                flowSwitch.Default = defaultFlowNode;
            }
            if (nexts != null)
            {
                nexts.ToList().ForEach(o => flowSwitch.Cases.Add(o.Key, o.Value));
            }
            step.Next = flowSwitch;
            return(step);
        }
Esempio n. 4
0
 /// <summary>
 /// 创建并行节点
 /// </summary>
 /// <param name="setting"></param>
 /// <param name="displayName"></param>
 /// <param name="completionScript"></param>
 /// <param name="next"></param>
 /// <param name="branchs"></param>
 /// <returns></returns>
 public static FlowStep CreateParallel(ActivitySetting setting
                                       , string displayName
                                       , string completionScript
                                       , FlowNode next
                                       , params Custom[] branchs)
 {
     return(new FlowStep()
     {
         Action = CreateCustomParallel(setting, displayName, completionScript, branchs), Next = next
     });
 }
Esempio n. 5
0
 /// <summary>
 /// 创建人工节点
 /// </summary>
 /// <param name="setting"></param>
 /// <param name="displayName"></param>
 /// <param name="actioner"></param>
 /// <param name="humanResultTo"></param>
 /// <param name="nexts"></param>
 /// <returns></returns>
 public static FlowStep CreateHuman(ActivitySetting setting
                                    , string displayName
                                    , Expression <Func <ActivityContext, string[]> > actioner
                                    , Variable <string> humanResultTo
                                    , IDictionary <string, FlowNode> nexts
                                    , FlowNode defaultFlowNode)
 {
     return(null);
     //return CreateHuman(setting
     //    , displayName
     //    , new Taobao.Activities.Expressions.LambdaValue<string[]>(actioner)
     //    , humanResultTo
     //    , nexts
     //    , defaultFlowNode);
 }
Esempio n. 6
0
        /// <summary>
        /// 创建人工节点
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="displayName"></param>
        /// <param name="actioner"></param>
        /// <param name="humanResultTo"></param>
        /// <returns></returns>
        public static Human CreateHuman(ActivitySetting setting
                                        , string displayName
                                        , IActionersHelper actioner//Activity<string[]> actioner
                                        , Variable <string> humanResultTo)
        {
            //HACK:实现类似于K2的client event
            var first = setting.FlowNodeIndex == Default_FlowNodeIndex;
            var human = first
                ? new Human(actioner)
                : new Human(setting.FlowNodeIndex, actioner);

            if (first)
            {
                human.OnFlowNodeIndex = o => setting.SetFlowNodeIndex(o);
            }

            human.DisplayName = displayName;
            if (humanResultTo != null)
            {
                human.Result = new OutArgument <string>(humanResultTo);
            }
            return(human);
        }
Esempio n. 7
0
        /// <summary>
        /// 创建SubProcess子流程节点
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="displayName"></param>
        /// <param name="finishRule">节点完成规则</param>
        /// <param name="resultTo">节点执行结果输出到变量</param>
        /// <returns></returns>
        public static SubProcess CreateSubProcess(ActivitySetting setting
                                                  , string displayName
                                                  , IDictionary <string, string> finishRule
                                                  , Variable <string> resultTo)
        {
            var first = setting.FlowNodeIndex == Default_FlowNodeIndex;
            var sub   = first ? new SubProcess() : new SubProcess(setting.FlowNodeIndex);

            if (first)
            {
                sub.OnFlowNodeIndex = o => setting.SetFlowNodeIndex(o);
            }

            sub.DisplayName = displayName;
            sub.FinishRule  = finishRule;

            //设置节点执行结果输出到变量
            if (resultTo != null)
            {
                sub.Result = new OutArgument <string>(resultTo);
            }

            return(sub);
        }
Esempio n. 8
0
        /// <summary>
        /// 创建Server节点
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="displayName"></param>
        /// <param name="serverScript"></param>
        /// <param name="finishRule"></param>
        /// <param name="serverScriptResultTo"></param>
        /// <param name="serverResultTo"></param>
        /// <returns></returns>
        public static Server CreateServer(ActivitySetting setting
                                          , string displayName
                                          , string serverScript
                                          , IDictionary <string, string> finishRule
                                          , Variable <string> serverScriptResultTo
                                          , Variable <string> serverResultTo)
        {
            //HACK:实现类似于K2的server event
            var first  = setting.FlowNodeIndex == Default_FlowNodeIndex;
            var server = first ? new Server() : new Server(setting.FlowNodeIndex);

            if (first)
            {
                server.OnFlowNodeIndex = o => setting.SetFlowNodeIndex(o);
            }

            server.DisplayName = displayName;
            server.Script      = new InArgument <string>(serverScript);
            server.FinishRule  = finishRule;
            //设置脚本执行结果输出到变量
            if (serverScriptResultTo != null)
            {
                server.SetScriptResultTo(serverScriptResultTo);
            }
            if (serverScriptResultTo != null && string.IsNullOrEmpty(serverScriptResultTo.Name))
            {
                throw new InvalidOperationException("serverScriptResultTo必须是命名变量");
            }
            //设置节点执行结果输出到变量
            if (serverResultTo != null)
            {
                server.Result = new OutArgument <string>(serverResultTo);
            }

            return(server);
        }