大家好,
在公司中,每个人都需要经常创建或者审批一些流程,比如说
转正申请
、
请假流程
、
出差申请
等等
那么,你有没有想过,要是你,你会如何实现这些流程的控制逻辑呢?
比如说请假申请,首先需要提前定义好一个
流程模板
吧,包括当请假天数大于 3 天的话,需要公司级的领导审批等这些
规则
然后当某个员工发起请假申请时,根据这个员工所在的部门以及请假天数等信息,便可以确定其具体的
流程信息
,包括每个节点的
审批人
在任何一个审批节点,都需要看到这个流程的历史审批信息以及将来要走的流程吧,所以还需要将完成的和将要完成的任务
保存
下来
你应该很容易想到,我们可以通过
表的字段状态
来进行流程的这些逻辑控制
但是呢,简单的流程的话,还可以实现,流程一旦复杂一点,不仅需要实现的代码会增加,而且需要操作的表的数量也特别多,逻辑只会更复杂
那么,有没有现成的工作流框架,可以直接拿来使用,轻松实现这些逻辑,实现流程的自动化控制呢?
答案是肯定的,今天带领大家认识的就是一个专门用来管理工作流的框架:Activiti
一 理论篇
1 实现逻辑
Activiti 就是使用
BPMN 2.0
进行流程建模、流程执行管理,那么,
BPMN
又是什么呢?
BPMN
(Business Process Model AndNotation)- 业务流程模型和符号 是由
BPMI
(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用
BPMN
提供的符号可以创建业务流程
定义好的流程模板,最终会被存储至数据库表中,而它的实现逻辑其实就是
封装了诸多流程控制的表的操作,提供给开发人员一些快捷操作的 API ,来进行快捷的工作流管理
2 实现步骤
使用 Activiti 这种工作流框架大致都分为以下几个步骤:
-
流程定义
-
部署流程定义
-
启动流程实例
-
查询当前用户的待办任务
-
完成任务
说明:
流程定义就相当于是一个个的
流程模板
,比如预先定义好的请假流程、出差流程模板,而流程实例则是由各个员工发起的实实在在的流程,流程实例一旦创建,那么这个流程需要经历哪些审批环节,每个环节由哪个(或者哪些)人负责审批,便完全确定下来了
流程定义与流程实例的关系,你也可以理解为
类与对象实例
的关系。一个是
静态
的,一个则是真正被拿来使用的,相对
动态
的
3 Service
Activiti 提供了几个
Service
类,用来管理工作流,常用的有以下四项:
-
1)
RepositoryService:提供
流程定义和部署
等功能。比如说,实现流程的的部署、删除,暂停和激活以及流程的查询等功能 -
2)
RuntimeService:提供了处理
流程实例
不同步骤的结构和行为。包括启动流程实例、暂停和激活流程实例等功能 -
3)
TaskService:提供有关
任务相关功能
的服务。包括任务的查询、删除以及完成等功能 -
4)
HistoryService:提供 Activiti 引擎收集的
历史记录信息
服务。主要用于历史信息的查询功能还有以下两项:
-
**1)**ManagementService:job 任务查询和数据库操作
-
**2)**DynamicBpmnService:无需重新部署就能修改流程定义内容
4 认识表结构
二 实战篇
以下进入实战环节,分别从
生成 25 张表
和
运行第一个
Activiti
流程实例,快速认识这个工作流框架的简单易用性
这两个例子,采用 Activiti7 版本,需要预先引入如下依赖:
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activit