Winform开发框架之简易工作流设计(转自 伍华聪博客)

Winform开发框架之简易工作流设计

一讲到工作流,很多人第一反应就是这个东西很深奥,有时候又觉得离我们较为遥远,确实完善的工作流设计很多方面,而正是由于需要兼顾很多方面,一般通用的工作流都难做到尽善尽美。微软也提供了几个版本的WF框架支持,也有一些厂家是基于这个框架基础上开发的工作流应用。

以前由于项目的需要,参与过一些工作流的项目开发,其中有些是基于我简易工作流的原理上进行拓展的,包括一个广州市各区县使用的行业审批业务平台,由于基于自己的流程处理,界面设计、流程流转等方面可以很好符合客户需求,定制的弹性较好,缺点是不够通用,也需要编写表单部分代码。

后面由于业务的需要,工作流方面的业务逐渐显得迫切,公司是想采用一个较为通用工作流框架来组织目前的业务,因此找了广州一家做工作流的公司,购买了他们的产品,虽然号称完全通过后台配置,零代码实现工作流业务表单的处理,但是由于客户对表单的设计要求比较多,有时候需要结合一些外部的数据接口,流程处理方面也有着进一步的需要,这样可能就打破了他们原来的格局,导致无论在表单设计、流程配置等方面,都需要购买他们工程师的现场服务,来进一步完善整个项目的内容,导致整个项目进展缓慢,遭遇水土不服的处境。

因此感觉,一个工作流模块,号称再强大,如果不能很好结合项目应用,即使零代码的功能配置,也可能使你处于尴尬的境况之中,因为通过配置,可能在代码里面平常很容易实现的表单功能,要通过零代码配置,花费的时间更多更难掌握,因为零代码是有代价的,需要您很好利用他们的API,他们的业务对象,有时候还需要很曲折的摸索参数,而这一切可能就是非常致命的弱点。

1、简易工作流的设计模型

在没有第三方工作流模块的情况下,简易工作流就是利用数据库和业务对象之间的协作关系,构建的一个半模块化的流程引擎,它能通过整合到项目代码中进行更好的融合以便实现工作流的相关功能。

首先我们知道,我们在Office里面创建任何文档,都有一个模板的概念,这样我们方便利用一些现成的数据和布局,工作流也一样,有一个流程模板的概念,如下所示。

然后每个流程模板,本身会预定义了一系列的处理流程,以便在流程实例里面进行不同的处理,因此流程模板还包含了多个流程步骤对象,他们的关系构成如下。

每个流程实例,除了他们自己的流程数据和字段信息外,它本身还有一个表单设计的问题,如费用审批,可能包含填写的费用清单数据等,所以流程实例还应该包含了流程的业务表单对象。

这样他们构成了一个完整的流程业务对象关系,如下所示。

2、流程审批的操作

对于一个流程处理操作,我们知道一般有审批通过、拒绝、退回到某步骤、转发到内部阅读、阅读,以及包括起草者能撤销表单呢等操作,当然如果还有一些具体的业务,可能还会有一些流程的处理才操作,不过基本上也可以归结为上面几种,只是他们每步处理的数据内容不同而已。因此审批的操作步骤分类如下所示。

这些操作我们都可以通过一些界面操作的封装实现,因为他们基本上都是通用的,我们传入一些流程ID等相关标识后,就能交给这些标准的操作界面完成了。

如审批界面如下所示,里面包含了通过、拒绝,跳回到某步骤,增加步骤等功能集合。

上面的界面是审批过程中,对于某一个流程处理人员实现的操作,而有时候,我们可能需要针对多个人进行某个步骤的处理,如传递给内部人员进行分阅操作,那么就应该选定多个人员进行处理,大概的处理界面效果如下所示。

当然,若申请人的申请单填写错误,需要撤销的话,那么也应该有这个操作,撤销表单后,就可以重新填写表单,然后再次提交进行流程。

3、流程审批的表单处理

在表单的动态设计和显示方面,一直没有好的思路,因此我觉得把流程模块作为半模块化即可,把部分界面通过代码编写方式进行整合,因此把表单的填写,表单查看做到用户控件里面,然后在界面里面引用即可。

如下面的表单填写操作界面如下所示,对不同的流程表单,在项目中增加一个表单的填写界面和保存操作即可。

查看并处理的表单操作,我们可以先做一个查看表单信息的界面,然后整合流程的处理工具栏,组合成一个查看、处理操作一体化的流程操作。

当然,如果是能够有动态设计表单,然后进行无缝整合当然更加完美,不过这样的操作,界面设计上也不会很麻烦,一般普通的开发人员都能胜任,因此,对于其他流程表单,依葫芦画瓢就可以完成不同的表单了。

而且里面的工具栏代码都是可以操作的,虽然可能集成了不同业务的处理方式,但是我们还是动态进行处理,处理代码如下所示。

        private void InitToolBar()
        {
            //如果流程是可以撤销,且表单状态为处理中,那么可以“撤销”操作可用
            bool mayCancel = BLLFactory<AppApply>.Instance.IsApplyMayCancel(ApplyId, base.LoginUserInfo.ID);
            this.btnCancel.ToVisibility(mayCancel);

            //可退回重新编辑
            bool mayBackToEdit = BLLFactory<AppApply>.Instance.IsApplyMayBackEdit(ApplyId, base.LoginUserInfo.ID);
            this.btnEdit.ToVisibility(mayBackToEdit);

            //判断是否需要显示阅办状态
            bool isReadStatus = BLLFactory<ApplyRead>.Instance.IsReadSatus(ApplyId, base.LoginUserInfo.ID);
            this.btnRead.ToVisibility(isReadStatus);

            //如果不是当前审批人隐藏审批按钮
            bool canDeal = BLLFactory<BLL.ApplyUser>.Instance.IsCheckPermission(ApplyId, base.LoginUserInfo.ID);
            if (canDeal)
            {
                ApplyFlowInfo flowInfo = BLLFactory<ApplyFlow>.Instance.GetFirstUnHandledFlow(ApplyId);
                if (flowInfo != null)
                {
                    string procTypeName = BLLFactory<AppProc>.Instance.GetProcType(flowInfo.ProcType);
                    BarButtonItem button = new BarButtonItem();
                    button.Caption = procTypeName;
                    button.Name = procTypeName;
                    button.Tag = flowInfo;//绑定流程内容
                    button.ImageIndex = 3;
                    button.LargeImageIndex = 3;
                    button.PaintStyle = BarItemPaintStyle.CaptionGlyph;
                    button.ItemClick += new ItemClickEventHandler(button_ItemClick);
                    this.bar1.AddItem(button);
                }
            }
        }

上面对于流程步骤的处理,就交给一个独立的按钮事件进行判断处理即可,根据不同的业务步骤名称进行不同的处理,这样就能够进行很好的控制处理。

时间: 2024-10-10 00:40:47

Winform开发框架之简易工作流设计(转自 伍华聪博客)的相关文章

Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持 - 伍华聪

在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型.还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的.针对这两种情况,本文介绍在我的Winform开

Verilog代码可移植性设计(转自特权同学博客http://bbs.ednchina.com/BLOG_ARTICLE_1983188.HTM)

最近开始学习FPGA,之前项目中仅用过parameter,在CrazyBingo的<FPGA设计技巧与案例开发例程详解>中看到使用localparam,以及在366页中简单介绍了下‘define,parameter和localparam的区别.查找特权同学博客发现其曾经讲诉过.文中红色阴影处为文中错误. Verilog代码可移植性设计 1.       参数定义 localparam,实例代码如下: module tm1( clk,rst_n, pout ); input clk; input

设计node.js搭建多人博客的思路(不讲数据库)

1.1.4:搭建多人博客 1.功能分析 搭建一个简单的多人注册,登录,发表文章及登出功能的博客 2.设计目标 未登录:主页左侧导航显示home.login.register,右侧显示已发表文章,发表日期及作者 登陆后:主页左侧导航显示home.post.logout,右侧显示已发表文章,发表日期及作者 用户登录.注册.发表成功后 以及登出后都返回到主页 (1)未登录 主页 登录页 注册页 (2)登录后 主页 发表页 注意:没有登出页,点击logout后,退出登录并返回首页 3.路由规划 既然把设

Winform开发框架中工作流模块之审批会签操作(2)

前面随笔介绍了请假申请单和报销申请单两个不同的业务表单的流程处理,一个是单表信息,一个包含明细的主从表信息,后者包含了条件流程的处理,在流程审批中,一般还有一种流程处理就是会签的操作,会签处理是几个审批步骤中审批人同时处理是否通过的,一般同时通过即为通过.本篇随笔介绍工作流中的会签处理过程. 1.会签流程定义 会签是指创建一个或多个子流程供相关人员进行审批,等待全部人员完成处理后再次回到主流程上,然后决定是否继续流转到下一个流程步骤上去,一般的申请单的主流程如下所示. 这里设置的会签处理就是其中

Winform开发框架中工作流模块的表设计分析

在较早博客随笔里面写过文章<Winform开发框架之简易工作流设计>之后,很久没有对工作流部分进行详细的介绍了,本篇继续这个主题,详细介绍其中的设计.实现及效果给大家,这个工作流在好几年前就应用在了市行业审批系统上,经过不断的改造适合更广泛的审批流程处理,从最初的Web上扩展到WInform上,并从WInform框架到混合框架上都实现了不错的处理. 1.工作流模块的表设计分析 在工作流处理表中,首先我们区分流程模板和流程实例两个部分,这个其实就是类似模板和具体文档的概念,我们一份模板可以创建很

Winform开发框架主界面设计展示

做了好多年Winform的程序的开发,主窗口的界面设计一般都要求做的更好一些,可以根据不同的系统功能模块进行归类整合,能使客户迅速寻找到相关功能的同时,也能感觉到整体性的美观大方,因此主窗口的界面设计总是会精益求精,力求做到更好用.更美观,这样才能吸引客户使用. 目前的主体界面设计,可以使用很多控件进行美化,这样能使得开发者能够迅速开发好美观的界面,也可以使得界面总体性有一个统一.规范的基准.一般推荐使用DevExpress或者DotNetbar这两款界面控件套件,他们都能设计出类似Office

Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(2)

本篇继续上篇<Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(1)>来对Winform开发框架之存储过程的支持进行介绍,上篇主要介绍了SQLServer和Oracle两种数据库对常规存储过程的编写和对比,本篇主要介绍如何在C#里面,如何对这些存储过程进行调用,并获取到对应的数据类型,如输出参数,单个数据记录,多个数据记录等情况.最后在完成实现功能的基础上,对这些实现进行演化提炼,并扩展到我的WInform开发框架里面,实现功能重用.代码简化的目的. 1.数据访问接口的定义

WinForm开发框架--动态读取DLL模式

1\ WinForm开发框架--动态读取DLL模式   http://www.2cto.com/kf/201306/217199.html 2\ 广州爱奇迪     http://www.iqidi.com/   伍华聪的博客 | 爱奇迪淘宝店铺|

02-大鸭梨博客系统数据库设计及Dapper的使用

毫无疑问,数据库的设计在一个系统中起了至关重要的作用.我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计.构建一个完善的系统需要这两个阶段的充分考量.周密设计.合理联接以及密切配合.数据库设计是整个系统的根基,它关乎系统功能的实现.稳定性.扩展性等多个方面,可见数据库设计的重要性. 那么好的数据库设计应该具备什么样的基本条件呢,大致有这么几点: 1.充分体现系统的需求 不管是数据库设计还是功能设计,我们最终的目的都是要实现客户的业务需求,所以数据库设计的第一准则就是要符合业