【工作流】——如何创建流程图工作流

来源:互联网 发布:网络文学社介绍 编辑:程序博客网 时间:2024/05/16 17:15

    上一篇博客介绍了顺序工作流的创建以及工作流的基本知识,这篇博客就来介绍一下流程图工作流,以及流程图工作流的创建实现。


什么是流程图工作流


    流程图工作流,顾名思义,是走一定流程的工作流,就像我们平常所见的流程图,它有一定的步骤,通过一定的条件又有一些分支,故叫做流程图工作流。


框架结构


    流程图工作流在.NET4.5中有三个基本组成结构,分别是Flowchart、FlowDecision和FlowSwitch。


    Flowchart活动是一种活动,该活动包含要执行的活动集合,可以认为是一个容器,Flowchart中可以放置控件元素。


    FlowDecision是一种流控件元素,用于做流程中的布尔条件的分支,类似于If...else...,所以FlowDecision总的来说只有两种判断情况,如果有多种条件进行分支,它就不再适合。


    FlowSwitch同样也是一种流控件元素,它正是解决了多种条件下分支的问题,类似于Switch<T>,也就是说一个流程遇到多个条件的分支,可以有多个不同的结果。


    一般来说,Flowchart通常用于非顺序工作流,但是如果未使用FlowDecision和FlowSwitch控件元素,也可以用于顺序工作流。


实例演示


    首先创建工作流项目,这里还是以工作流控制台为例,然后在工作流设计页面添加如下图的流程图,首先是If类型的流程图工作流。这个流程图执行的流程是,到了中午十二点的时候,如果手上的活还没干完,那就加会班干完,然后下班吃饭;如果手上的活已经做完了,那就直接下班吃饭。


                                          


    首先添加FLowchart活动,然后在活动中分别添加WriteLine基元和FlowDecision流控件元素,分别输入相应的显示内容。


    然后设置FlowDecision的Condition,FlowDecision是通过Condition来控制流程的左右流转的。如图,如果Condition是true,则流向左侧,反之则流向右侧。邮件点击Decision控件,选择属性,可以设置Condition属性。在这里我是直接设置Condition的值为true或false,同样也可以设置为参数,根据业务去传入相应的布尔值。


如果Condition设置为true,则执行效果为:

                                     


如果Condition设置为false,则执行效果为:


                                       

    

    接下来演示Switch类型的工作流,Switch类型的工作流就像switch...case...,可以根据不同的条件,走向不同的分支,去执行不同的结果。这个工作流执行的流程是中午吃饭时,根据自己带的钱的多少判断吃什么午饭,如果带的钱小于等于十块钱,那就吃面条;如果大于十块小于等于三十块钱,那就吃麻辣烫;如果大于三十块钱,就可以吃大餐。根据下图创建工作流流程:


                                


    这时就出现了一个问题,我怎么让FlowSwitch去判断我带了多少钱呢?也就是说我怎么把我带的钱数传给FlowSwitch呢?这时现成的控件就不太好用了,我可以自己写。一共需要两个,一个用来接收我输入的钱数,一个用来判断我带的钱多少。


    在自己的项目中,右击-->添加-->新建项-->选择左侧Workflow-->选择创建代码活动,创建两个代码活动,分别是JudgeMoney和InputMoney。




两个类中的代码分别如下,InputMoney中的代码为:

    public sealed class InputMoney : CodeActivity    {        // 定义一个字符串类型的活动输出参数        public OutArgument<int> Money { get; set; }        // 如果活动返回值,则从 CodeActivity<TResult>        // 派生并从 Execute 方法返回该值。        protected override void Execute(CodeActivityContext context)        {            //从控制台读取数据,并将数据传出咱们当前流程节点            int num = 0;            int.TryParse(Console.ReadLine(), out num);            context.SetValue(Money, num);        }    }


JudgeMoney类中的代码如下:

    public sealed class JudgeMoney : CodeActivity    {        // 定义一个字符串类型的活动输入参数        public InArgument<int> Money { get; set; }        // 定义一个字符串类型的活动输入参数        public OutArgument<int> Result { get; set; }        // 如果活动返回值,则从 CodeActivity<TResult>        // 派生并从 Execute 方法返回该值。        protected override void Execute(CodeActivityContext context)        {            //定义输入的钱的值            int count = context.GetValue<int>(Money);            if (count <= 10)            {                context.SetValue(Result, 0);            }            else if (count < 30)            {                context.SetValue(Result, 2);            }            else            {                context.SetValue(Result, 1);            }        }    }

    

    这样接收输入的钱的类和判断钱多少的类都有了,那么从工作流中如何获取值呢?这时就得在工作流中设置变量,用来接收传入工作流节点的值。在设计页面的最下面,有变量、参数、导入三个选项卡,选择变量选项卡,设置两个参数,分别为MyMoney和TempResult,MyMoney用来接收传入工作流的钱的值,TempResult用来接收JudgeMoney传出的判断分支的值。


                 

    设置完变量之后,要将TempResult变量和FlowSwitch绑定,毕竟FlowSwitch是根据TempResult的值判断流向的嘛。右击Switch,选择属性,在Expression属性那里填写TempResult,这样TempResult变量就和FlowSwitch绑定起来了。


    此时需要生成一下解决方案,生成成功后,在左侧的工具栏中会出现两个控件,分别是InputMoney和JudgeMoney,如下图:


                                                                                                    


    将这两个控件拖入工作流中,完成后如下图,然后分别设置属性,将Money和MyMoney绑定,将Result和TempResult绑定。


                             


这时流程图工作流就都做完了,快来执行一下试试吧。


执行的结果如下:

                                                                     

                                                                         

                                                                        


    上面说的是不是有些乱,下面简单梳理一下。该流程模拟中午吃饭前,根据自己带的钱多少,判断自己午饭可以吃什么。如果少于10块钱,只能吃刀削面;如果大于10小于30,可以吃麻辣烫;如果大于30,就可以吃大餐了。因为判断条件大于了两种,而且不能用true和false来判断,所以采用Switch的方法。拖入FLowSwitch后,设置三种条件然后分别设置结果。因为FlowSwitch要绑定一个变量,根据该变量判断走向哪一个分支,所以就有了TempResult。另外还需要一个变量,去接收我输入的钱的值,所以就有了MyMoney变量。变量有了之后,怎么接收运行和判断运行框中输入的值呢?这时候就需要InputMoney和JudgeMoney两个类。添加两个代码活动,在其中输入相应的代码。生成解决方案,从工具箱中将他们拖入设计页面,这时完整的工作流过程就设计完成了。


总结


    流程图工作流也是一种比较简单的工作流,它能够承受多种分支,并且是可以多人完成一个流程。一般情况下,公司中用的审批流程,都是流程图工作流。一个流程中可以有多个节点多个审批人,每个审批人都有同意或不同意的审批意见,这就符合If类型的流程图工作流。

0 0
原创粉丝点击