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);
                }
            }
        }

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

本文转自博客园伍华聪的博客,原文链接:Winform开发框架之简易工作流设计,如需转载请自行联系原博主。



目录
相关文章
|
XML 数据库 数据格式
嵌入式工作流程开发!工作流 Activiti 框架中子流程的使用指南
本篇文章对工作流Activiti框架中的子流程进行的详尽的分析和说明,在工作流Activiti集成到项目中开发时,可以嵌入子流程进行使用。子流程包括了事件子流程,事务子流程以及调用活动子流程。通过对内嵌子流程的方式的学习,可以帮助我们将工作流框架很好地应用在继承式建模的流程场景下。
1066 0
嵌入式工作流程开发!工作流 Activiti 框架中子流程的使用指南
|
存储 缓存 JSON
Unity资源热更新知识梳理及工作流介绍
研究了大半年的热更,才做出了一套相对完善的热更架构。不得不说,这块的知识点还是多而杂的,值得专门开篇博文来记录梳理。
2631 0
|
消息中间件 API Nacos
【组件开发实践】云巧流程组件对接实践
通过简单的业务场景进行举例,介绍如果通过云巧流程组件的API进行集成对接
31756 1
|
数据可视化 前端开发 Java
云巧组件如何实现代码架构设计可视化
在项目搭建完成进行了N个迭代之后,往往因为需求的变化以及设计的缺陷导致领域模型、接口、数据库设计等和最开始的时候大为不同,架构设计需要保鲜会花去大量的时间。有没有一种办法可以实时反应项目的各种技术设计呢?就像Swagger一样,代码自动生成文档。我们采用了静态代码扫描的方案,通过代码来反应真实的技术设计,这就是《云巧工坊-应用素描》的功能。
278 0
|
SQL 缓存 安全
项目实践之工作流引擎基本文档!Activiti工作流框架之流程引擎API和服务详解
本文介绍了工作流框架中的几个流程引擎API的使用场景以及几个工作流的服务类。详细说明了工作流Activiti框架中几个服务类的作用。然后说明了工作流中的异常处理策略。接着介绍了工作流Activiti框架中的查询API以及支持的表达式的应用,最后通过单元测试的示例说明这些API和服务类的使用方式。通过这篇文章,基本上就能够使用代码在项目中熟练的使用工作流框架Activiti进行问题的处理。
684 0
项目实践之工作流引擎基本文档!Activiti工作流框架之流程引擎API和服务详解
|
Android开发 容器 数据格式
Android组件化开发实践(五):组件生命周期管理
每个Android应用启动时,都会先创建一个Application。通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化。
1466 0
|
Java 测试技术 Maven
Android组件化开发实践(三):组件开发规范
不以规矩,不成方圆。特别是多人协作开发时,如果没有统一的开发规范,势必会造成各种混乱。在实际开发中,常常会碰到的问题有: 引入的某个第三方库版本冲突; 不同组件里同名资源文件被覆盖; APP壳工程打包时AndroidManifest.xml合并发生错误; 往往单独的组件工程运行良好,但是集成到壳工程时就是不行,所以我们必须要严格遵守规范,尽可能减少这种问题的出现。
3265 0