基于WF4.0流程平台开发过程中的知识积累(二)多书签会签

        在WF4.0的自定义活动支持创建多个书签,通过多书签方式,我们可以实现会签审批的效果。

首先这里介绍一下会签与普通审批节点的区别:

        普通审批节点是抢占式的,即一个任务同时到达审批人一和审批人二那里,只要其中有一个人进行了审批操作,该审批节点就通过了。

        对应会签审批,不分先后,只有当所有人员都需签署了意见,该审批节点才会通过。

       下面我们将列创建一个工程,以模拟实现简单的会签功能,首先先创建一个名为BooklMark2的WF控制台工程。在工程内创建一个会签自定义流程节点,命名为ApproveNode,其代码如下:

public sealed class ApproveNode : NativeActivity
    {
        // 定义一个字符串类型的活动输入参数
        public InArgument Text { get; set; }
        /// 
        /// 重写这个方法,以便返回true值,true用来控制工作流闲置,可以挂起
        /// 默认的情况为false,表示工作流不会挂起执行,因此用户无法和工作流之间进///行交互
        /// 
        protected override bool CanInduceIdle
        {
            get
            { return true; }
        }
        // 如果活动返回值,则从 CodeActivity
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(NativeActivityContext context)
        {
            // 获取 Text 输入参数的运行时值
            string text = context.GetValue(this.Text);
            //创建书签
           context.CreateBookmark("审批人一", new BookmarkCallback(Continue));
          context.CreateBookmark("审批人二", new BookmarkCallback(Continue));
          context.CreateBookmark("审批人三", new BookmarkCallback(Continue));
        }
        //书签恢复后调用的函数
        void Continue(NativeActivityContext context, Bookmark bookmark, object obj)
        {
            
        }  
    }


大部分代码与上一篇的例子是一样的,只是这里我们一共创建了三个书签,分别命名为审批人一,审批人二,审批人三,这三个书签都已Continue作为回调函数。只有所有三个书签都被恢复,才能结束流程位于该节点的中断。

下图是案例的流程图:

基于WF4.0流程平台开发过程中的知识积累(二)多书签会签_第1张图片

为了更加直观地对流程进行操作,我们在工程在添加一个窗体来控制流程,命名为Form1。

同时将主函数的代码更改如下:

class Program
    {
        public static WorkflowApplication wa;
        static void Main(string[] args)
        {
            wa = new WorkflowApplication(new Workflow1());
            wa.Run();
            Form1 form = new Form1();
            form.ShowDialog();
            
        }
    }


上面创建了一个全局的WorkflowApplication,这样可以在其他地方,比如在窗体中操作WorkflowApplication,实现流程运行。主函数先发起流程,然后加载一个窗体。

窗体如下所示:

基于WF4.0流程平台开发过程中的知识积累(二)多书签会签_第2张图片

针对三个按钮,我们编写三个对应的按键响应函数,代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            Program.wa.ResumeBookmark("审批人一", null);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Program.wa.ResumeBookmark("审批人二", null);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Program.wa.ResumeBookmark("审批人三", null);
        }


可以看出,针对不同按钮,执行了释放不同的书签的操作。

运行程序,一开始流程处于待审批状态,如下图:

基于WF4.0流程平台开发过程中的知识积累(二)多书签会签_第3张图片

之后,在对话窗体中依次点击所有的按钮,模拟会签人依次审批的过程。只有所有按钮都被点击完毕后,流程才会进入下一状态,如下图:

基于WF4.0流程平台开发过程中的知识积累(二)多书签会签_第4张图片

 

代码下载

 

下一篇,我将继续介绍书签的应用,如何利用书签来实现WF的子流程效果。

你可能感兴趣的:(基于WF4.0流程平台开发过程中的知识积累(二)多书签会签)