基于Web的工作流编辑的设计与实现

2021-11-22 15:51徐海啸于洪梅李想李朋洋陈威阳
电子技术与软件工程 2021年7期
关键词:流程图实例定义

徐海啸 于洪梅 李想 李朋洋 陈威阳

(1.吉林大学计算机学院与技术学院 吉林省长春市 130012 2.中共长春市纪律检查委员会 吉林省长春市 130041)

1 绪论

工作流相比于传统模式的一大优点是它能够将任务的管理和业务的管理分离出来。业务的流动倚赖于任务的执行,而任务的完成推动了业务的实现。举一个经典的逐级审批的例子,传统方式是为每一项任务设立一个标志,当任务被完成时更改对应的标志。这种方式在遇到业务流程的变动时便显得束手无策。例如在递交申请之后审批的流程由甲审批完后乙审批更改为获得甲乙任一审批即可,传统模式在应对这一实际变动时只能修改程序逻辑,更改代码来实现,而修改代码需要消耗极大的人力和时间资源。此时,工作流技术就体现了充分的优势。采用工作流技术来管理这项业务时,所有业务的参与者只能获取到被分配给自己的任务,流程的改变通过流程编辑器来实现,由流程编辑器重新编辑流程定义,部署到工作流引擎上,用不同的版本加以区分,流程的定义存放在一个xml 文件之中,因此采用工作流技术可以实现不修改代码或少量修改代码却能修改流程的目标。工作流技术的另外一个优点是能够在多个参与者之间自动地传递信息、分配任务,比如上述审批例子中修改后的流程,甲审批完成后自动消除乙的审批任务。

工作流技术的实现需要倚赖工作流管理系统。工作流管理系统定义、执行并管理工作流,是工作流技术的具体体现。为实现现实中常见的业务流程的从开始到结束的整体执行和流动,有效直观地管理流程执行中各项数据,并能够适应现实环境中经常变动的业务流程,本文设计并实现了一款基于Web 的工作流流程编辑系统。

本文首先从功能上对系统做出设计,接下来从模型的建立、工作流引擎等方面详细地把对系统设计之初的思想做出了介绍,并且在分析对比多个主流工作流引擎之后给出了工作流引擎选用的原因;本文分别对各个部分的技术实现给出了描述,总结了设计并实现本系统的研究意义等。

2 系统设计

2.1 系统总体设计

实现基于Web 的工作流系统,支持对流程定义和流程实例进行动态修改,在网页中以图形和文字方式直观地展示。在浏览器端将业务流程表示为以图形元素和带箭头的线条结合的方式,支持动态地修改流程,以及对每个结点的不同属性加以查看和修改。用户还可以管理流程定义和流程实例,查看和编辑它们的详细信息和所处状态。

本系统采用基于Web 的形式,以html+js+ajax 的方式来实现,无须客户端的安装,无须下载jre,只是第一次运行需要下载所有js的脚本,相比于java 图形界面包和applet 等是理想的实现方式。为了实现页面编辑功能的灵活简便,可以运用js、html、 xml 等技术,辅以ajax 动态地与后台交互,同时采用web 网页发布的形式,方便和其它应用程序的集成以及用户随时随地可操作的同时,一方面可以极大地节约时间,方便快速地对业务流程进行调整;另一方面可以直观地展示业务流程在调节前后的变化,方便对比完善。此外电子信息特有的快速搜索功能给人们提供了书面所达不到的便利。

具体实现技术为Spring 与工作流引擎集成,定义工作流流程,通过工作流引擎记录保存到xml 文件和数据库中,当流程启动时执行工作流流程,通过不同用户对其分配任务的完成情况推动流程的进展,直到完成所有步骤,结束流程,记录历史记录表中,有相关权限的用户可以查询和查看。

保存数据时采用ajax 的方式来实现,既可以把流程定义文件存储在文件格式中,也可以保存到数据库的表中。同时通过这两种方式对流程数据进行保存,便于流程的上传和下载。

2.2 系统详细设计

2.2.1 模型的建立

工作流中涉及的两个主要的设计模型:定义模型和实例模型。定义模型决定了流程本身的性质,流程的路由状态,流程进行到了哪一步,能否进入下一个状态、接下来流程的行进方向等。而实例模型则定义了在流程的这一状态下各个节点所处的状态,各分支条件满足情况、下一步各个节点状态的变化趋势等。

2.2.2 工作流引擎

业务流程建模标注,简称BPMN。是由BPMN 标准组织发布的,为各大厂商以及工作流相关开源社区提供了流程建模的标准。其主要目标是使用一些能够被所有使用者快速理解的标记,来用图形化的方式记录下工作流流程从创建初期的业务分析到流程实例的最终实现,同时由用户进行监管和控制的完整过程。

Activiti 继承自JBPM,是一个针对企业用户、开发人员、系统管理员的轻量级工作流业务管理平台,其核心是使用Java 开发的快速、稳定的BPMN 2.0 流程引擎[1]。Activiti 十分注重流程服务的可嵌入性和可扩展性,同时,作为一个符合 Apache 许可的基于工作流的业务流程管理开源项目,更加强调面向流程参与人员。这一点具体体现在Activiti 流程引擎将每一项 BPM 业务功能模块都采用服务的形式提供给开发技术人员。开发技术人员可以通过使用这些服务迅速、高效地搭建出功能强大、灵活简洁而且效率较高的 BPM 应用程序。Activiti 不仅可以与Spring 完美地集成,同时基于其简约思想的设计使Activiti 非常轻量级。Activiti 选择了使用MyBatis作为和数据库进行数据交换的工具通过SQL 语句执行Command,让引擎在速度上保持最高的性能。Activiti 提供了七大Service 接口。在表结构的设计方面,Activiti把运行时数据和历史数据进行了分离,这种设计方式在数据积累到十分庞大的情况下仍然可以做出快速的反应。

2.2.3 流程建模

BPMN 由一组图形元素构成,利用这些图形元素可以很快地实现流程建模和流程分析,并且利于对流程实例的管理和监控。一个业务流程模型是指一个由BPMN 通过的各种图形元素组合而成的网状结构图。其中图形元素包括一系列活动和定义活动执行顺序的流程控制器。BPMN 包括以下四种基本元素:

流对象(Flow Object):作为BPMN 的核心图形元素,流对象主要包括了事件(Event)、活动(Activity)和网关(Gateway)三种基本构件[2]。事件用一个圆圈形表示,指代了流程在执行期间发生的事情,包括开始(Start)事件、中间(Intermediate)事件和结束(End)事件。这些事件往往会对流程流转产生影响。活动用一个圆角矩形表示,表明了流程实例在执行过程中需要做的步骤和执行这些事情的人或系统。一个活动可以由多个活动组合而成,表示一系列需要完成的任务。网关用菱形表示,用来表示流程的分支以及合并。网关包括很多种,例如排他网关、并行网关等。

连接对象(Connecting Objects):将顺序相关的流对象连接起来的对象,与流对象一起组成了完整的业务流程结构。其中实线实心箭头表示序列流(Sequence Flow),代表流程中各个执行活动的先后顺序。虚线空心箭头表示消息流(Message Flow),主要用在不同的执行者之间传递信息。这里的执行者可以是角色也可以是具体的某个人,甚至是一个系统。点状线表示联合关系(Association),用来指代活动的输入和输出。

甬道(Swimlanes):用来对不同功能职责加以区分。Pool 代表流程实例执行过程中的一个参与实体。Pool 被用作一个图形容器来与另外实体进行隔离,常被用于两个独立的执行者之间的物理划分界限。通常出现在交互流程当中。一般来说,每一个Pool 都会有自身的流程,如果这些在Pool 内部的自身流程是顺序流,那么这个顺序流往往不会跨越多个Pool。两个Pool 之间的消息通过消息流进行传递。Lane 被用作对活动进行组织和分类,从图形系统上看是在Pool 中进行的子划分,既可以是水平的也可以是垂直的。

描述对象(Artifacts):BPMN 流程图中的拓展元素,提供了能够是流程图拥有可以表达具体化活动中必要的上下文的方法。数据对象(Data Object)用来描述业务流程活动所需要的相关数据以及在过程中产生的数据。这类对象可以用连线与活动进行连结。组(Group)用以对目标作出必要的解释,对流程的执行流转并不会产生影响。注释(Annotation)主要是给流程图的阅读者附加一些文字描述信息,有助于阅读者更快更全面地掌握流程。这主要是基于流程的参与者们不可能都参与了流程图的设计和绘制这一事实而产生的。

2.2.4 其它功能模块设计

日志系统:记录用户的主要操作、系统的使用情况等基本事项。通过数据库的logs 表进行维护每个用户的登录登出状态、期间所做的操作等,便于梳理流程的时间推进线,查看用户是否有违规操作,保障系统的安全性等。另外,在流程进行中遇到问题时可以参照日志更快地发现带来错误的错误操作,及时对流程进行相应补救。

历史记录:记录流程的状态变化,追踪流程进展。对流程执行过程中各个重要节点的执行状态进行记录。便于查询和分析。甚至可以实现一套简单的评价系统,对已经结束的流程进行简单的评价,并分析流程执行过程中耗费时间、资源最大的步骤,导致拖延的原因等,并且可以对下一次类似的流程执行进行参照和指导。

用户系统:不同用户按照组别给定不同的权限,展示权限范围内的内容和相关可执行的操作。对于管理人员可以查询相应的可执行人员,快速分配节点需要执行的相关工作;查看流程执行情况和各个节点状态,完成负责节点的执行和督办。

3 系统实现

3.1 数据库设计

根据数据库表中所存放的数据的性质可以大致将其分为模型数据和实例数据。

模型数据是用来存储过程模型的一系列数据。主要包括以下几张表:workflow,工作流模型表,用来存储工作流模型的基本信息,包括流程名称、对流程的描述、创建的时间等;node 记录节点的状态,不同的节点需要定义的内容有所不同;procdef 是流程定义表,包含流程定义的ID、资源文件表、原文件名和图示;model 是流程设计模型表,存储了流程模型各个节点的信息。

实例数据是用来存储流程实例的表,是工作流引擎对过程模型进行实例化操作时创建的。与模型数据相对应,实例数据主要包括:workflow_instance,工作流实例表,在工作流实例被创建时currentstep 记录当前步骤状态、currentstep_prev 记录前一个步骤的状态,当执行到下一步骤时自动将currentstep 转换为currentstep_prev,将新到达的步骤记录为currentstep、historystep 记录了历史执行步骤,每一步骤具有唯一的ID,在currentstep_prev 被覆盖之前先把其信息录入historystep 中,通过工作流程实例ID 与实例建立联系、workflowstate 记录了流程ID,流程名称和流程状态(包括被创建、活动、中止、完成、未知等)。Activiti 在工作时也创建了一些记录工作流状态和流程运行的表。deployment 包含了已经部署的流程名称和id,procdef 中保存的资源文件表保存了部署ID、资源的位置和存储方式等信息,execution 保存了正在执行的对象的信息,侧重于流程实例、对象状态、任务等,正在执行的任务则被保存在了currtask 中。以inst 为后缀的一些列表保存了各种历史记录的信息,比如taskinst 存放已经执行完的历史任务信息,procinst是流程实例的历史表,存放执行完毕的流程实例信息,actinst:存放历史所有完成的活动等。此外还有一些必要的数据记录表,例如variable 记录记录运行时流程变量数据;user 保存用户信息等。

3.2 具体实现技术

本系统的核心是Activiti 工作流引擎与Spring 框架的集成,实现工作流流程的管理、查看和编辑,用户历史记录和日志的查看等功能。系统采用B/S 模式,方便用户随时使用和系统升级。工作流引擎选用开源的Activiti,快速、高效地对流程的操作进行记录和做出反应,通过xml 文件和数据库两种方式存储流程实例数据,即可以直观地通过网页的形式展示,又可以方便地修改数据库中的某一项状态,记录流程运行的历史记录和用户操作日志,方便查看与分析。

3.3 流程在系统中的执行过程及部分代码分析

本节将按照工作流流程的一个完整周期,从流程的设计,流程定义的上传和部署,流程实例的启动,流程执行过程中任务的完成,到流程定义的版本更新等详细地实现工作流流程在本系统中的流转和执行,展现该系统的功能。

3.3.1 流程的设计

为了便于流程定义文件在Web 端的上传和下载,本系统在把流程定义文件放入数据库的同时还提供了bpmn 流程定义文件的上传。Activiti 为设计bpmn 文件提供了两种方式:

IDE(集成开发环境)插件:由于本系统是在JetBrains 公司提供的java 语言开发的集成环境IntelliJ IDEA 上实现的,因此采用了Activiti Designer 插件actiBPM 来设计流程定义文件。此外,除了IDEA,在Eclipse 上也存在Activiti 插件,同样可以很方便地设计流程文件。在IDEA 上利用actiBPM 插件来设计流程定义文件的界面,主要分为三个部分,左上部分为具体的流程图设计界面,通过拖拽右上部分的各个部件以及连接线就可以完成流程图的设计,下半部分为参数设置区,选中流程图设计界面具体的节点、部件或者连线就可以设置相应的参数。

3.3.2 流程定义的上传和部署

设计好了流程文件,接下来就是把该文件上传到系统并对流程定义进行部署。为了便于用户进行上传,本系统允许用户上传bpmn 和zip 两种文件,即允许用户将多个bpmn 文件进行打包上传。同时鉴于网络速度和稳定性考虑,单次上传最大只允许不超过5M的文件。

3.3.3 启动流程实例

成功部署流程定义并跳转到“已部署流程定义”界面后,即可看到所有已经部署到工作流引擎中的流程定义文件,以及包括版本、ID、名称、Key 等在内的流程定义的各项属性。其中流程定义ID的固定格式是 Key:版本:ID。在这个界面可以根据流程定义来启动对应的流程实例,也可以查看流程定义对应的流程图。对各个部署的Process 流程定义查看其流程图。

为了显示方便和简洁,工作流引擎对流程图进行了相应的修改,但是流程的总体结构任然与设计时相同。为了完整地执行一遍流程,检测系统的实现程度,启动一个流程实例。单击“启动流程”按钮,成功启动后系统会自动跳转到流程实例界面,在这个界面可以查看已启动的流程实例的ID、流程定义ID 等属性,并且可查看对应的流程图。

启动的流程图与未启动流程实例时流程定义的流程图一个巨大的区别就是:此时流程图与开始节点相连的第一个节点被高亮显示,表明了流程已经开始执行,并且现在处在某个节点的任务上,等待该任务的完成。

3.3.4 任务的完成和分支的选择

流程的流动需要任务完成来推动。流程在运行到任务节点时自动分配任务给对应的参与者和执行者。

在“审核”和“审批”的节点,任务的完成有两种方式,一种是通过并向下一个节点流转,另一种是未通过回流到上一个节点。为了区分这两种方式,需要用到自流程设计时赋予连线的变量Condition。当在这一节点取到“通过”时,通过对于的连线取到了True,条件成立,而另一条连线上的条件不成立,取到False,因此流程向着通过的连线流进,流程向下一步执行;同样的在当前节点“未通过”时向下流的连线取到了False,而回流的连线取到了True,因此流程刘回到之前的节点。

通过用户的ID可以从数据库中查询该用户被分配的个人任务,对于不被分配的任务详情是不可见的,这样可以保障数据的安全性,也符合java 的封装性。通过与任务相关的Service 创建一个任务查询对象就可以从数据库中获得该责任人的任务,然后封装在model中传递给前台以便对用户展示。

3.3.5 历史任务的查询

在实际应用中常常会遇到这样的情况,即使某项任务已经完成了,但是我们对于这项任务执行人,执行时间和执行情况等仍需要一定的了解。为了满足这类需求,所有已经完成的任务都被存放在数据库的历史表格当中。通过一定的查询操作可以获取想要的信息。

除了列出所有的历史任务,还可以根据流程定义ID、流程实例ID 等快速找出想要的信息。此外,信息化相较于纸张形式的一个很大的优点就是快速便捷的搜索功能。只要在表格右上角的Search 栏里输入想要查询的部分或全部内容,就可以迅速查到对应的信息,带来了极大的便利,增加效率。

通过历史任务Service 创建历史任务实例查询,指定办理人或者通过流程实例ID 查询相关任务。可以通过相应的Service 查看正在运行的流程定义、实例变量等数据;而对于当前未处于活动状态的流程实例的相关信息只能从actinst 表中查询。虽然查询方式大同小异,但是采用这种分开管理的模式,把正在运行各类数据的交给RuntimeService、TaskService 来处理,而把历史数据统统交给HistoryService 来进行管理,可以很好地增强流程实例的执行效率,避免由于庞大冗余的历史数据给流程的执行带来负担。这是因为正在执行的流程实例所用到和产生的数据相比于记录在数据库中的历史数据来说要小很多,而且对正在执行的流程实例的相关数据的访问也比历史数据要频繁许多。

3.3.6 流程定义的更新

工作流相比于传统模式实现的一个很大的优势就在于,可以不修改或者少修改代码就可以实现流程的变更。基于实际生活中,往往会因为人员变动、时间安排、应用环境的变更等导致业务流程产生变化。为应对这种常常发生的实际情况,本系统允许流程定义的更新。只需要对任务节点进行拖拽,对连线进行重组,或者新加入或者删除一些节点部件。完成设计之后,将最新的流程定义文件上传到系统,对其进行部署,就可以看到新版本的流程定义了。

4 结论

本文设计并实现了基于Web 的工作流流程编辑器,可以在Web 端轻松控制流程的流转,查看流程实例和流程定义,改变其状态。本文从流程的设计、流程的上传和部署、流程实例的启动、个人任务的选择、流程变量的传递、任务完成推动流程的执行以及历史任务的查询等流程从创建到完成的一个完整周期介绍了本系统的功能和使用。

猜你喜欢
流程图实例定义
专利申请审批流程图
专利申请审批流程图
宁海县村级权力清单36条
完形填空Ⅱ
完形填空Ⅰ
修辞学的重大定义
山的定义
《天津医药》稿件处理流程图
教你正确用(十七)