Workflow
基于Activiti5 定制化中国式工作流系统,定制化的流程设计器,添加自定义属性。
Install / Use
/learn @dunzung/WorkflowREADME
基于Activiti5 定制化中国式工作流系统
QQ技术交流群:838850873

工作流开发手册_V3.0
作者 段志军 2016-01-18
1. 简介
工作流开发手册V3.0的使用者是开发者。
工作流V3.0底层是基于 Activiti 进行开发完成的,整合了工作流V2.x的相关接口,易于开发者对现有工作流进行升级改造。
关于Activiti
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。 创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。 Activiti是一种轻量级,可嵌入的BPM引擎。 它将提供宽松的Apache许可2.0,以便这个项目可以广泛被使用,同时促进Activiti BPM引擎和的BPMN 2.0的匹配,该项目现正由OMG通过标准审定。 加入Alfresco Activiti项目的是VMware的SpringSource分支,Alfresco的计划把该项目提交给Apache基础架构,希望吸引更多方面的BPM专家和促进BPM的创新。
2. 依赖关系
2.1 软件环境
JDK 6+
Activiti需要运行在JDK 6或以上版本上。 进入 Oracle Java SE 下载页面 点击 "下载 JDK"按钮。页面上也提供了安装的方法。 为了验证是否安装成功,可以在命令行中执行 java -version。 它将会打印出安装的JDK的版本。
IDE
Eclipse、IntelliJ IDEA等
IE
由于我司银行用户使用工作流较多,需提供对IE浏览器支持,除了流程设计器最低版本要求IE9,工作流其他模块兼容IE8、IE9、IE10。
Spring
工作流V3.0采用 Spring 注解方式管理资源和Bean对象,与Spring无缝结合。开发者需在项目中集成工作流V3.0时,注意Spring版本。
Maven
安装工作流相关开发包
Activiti
工作流V3.0是基于Activiti-5.18.0版本开发,所以依赖如下:
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-explorer</artifactId>
<version>5.18.0</version>
<exclusions>
<exclusion>
<groupId>com.vaadin</groupId>
<artifactId>vaadin</artifactId>
</exclusion>
<exclusion>
<groupId>com.vaadin.addons</groupId>
<artifactId>dchats-widget</artifactId>
</exclusion>
<exclusion>
<groupId>com.vaadin.addons</groupId>
<artifactId>activiti-simple-workflow</artifactId>
</exclusion>
</exclusions>
</dependency>
...
</dependencies>
2.2 工作流软件包
开发者在使用工作流软件包时,分为两种模式。 如下:
-
开发模式
开发者需要在项目POM文件中引入工作流依赖项
-
离线模式
由于客户现场环境限制,需要要手动拷贝工作流相关资源。如jar、css、js、数据库脚本、页面等等。
一. 开发模式
首先,在POM中引用工作流jar
-
把app-workflow-core开发包放在对应的X-X-core工程POM文件中。
<dependencies> <dependency> <groupId>com.vprisk.workflow</groupId> <artifactId>app-workflow-core</artifactId> <version>3.0.0</version> </dependency> ... </dependencies> -
把app-workflow-mvc放在X-X-mvc工程POM文件中。
<dependencies> <dependency> <groupId>com.vprisk.workflow</groupId> <artifactId>app-workflow-mvc</artifactId> <version>3.0.0</version> </dependency> ... </dependencies>
其次,在POM中引用视图资源
把app-workflow-web开发包放在对应的X-X-web工程POM文件中。
<dependencies>
<dependency>
<groupId>com.vprisk.workflow</groupId>
<artifactId>app-workflow-web</artifactId>
<version>3.0.0</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.vprisk.workflow</groupId>
<artifactId>app-workflow-web</artifactId>
<version>3.0.0</version>
<type>warpath</type>
</dependency>
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<packageExcludes>WEB-INF/web.xml</packageExcludes>
<overlays>
<overlay>
<groupId>com.vprisk.workflow</groupId>
<artifactId>app-workflow-web</artifactId>
<includes>
<!-- <include>ec/**</include> --> <!-- 不引用该war的某些路径下文件 -->
...
</includes>
</overlay>
...
</overlays>
</configuration>
</plugin>
</plugins>
</build>
二. 离线模式: 由开发者直接拷贝工作流相关文件
1. 拷贝Activiti jar文件

2. 拷贝工作流 jar文件
-
app-workflow-core
MVC模式下的工作流服务层,负责工作流流程定义、任务审批、历史查询以及参与人等。
-
app-workflow-mvc
MVC模式下的工作流控制层
关于MVC模式理解,参考MVC
3. 拷贝工作流引擎配置类
在app-workflow-web下:
com.vprisk.config.WorkflowApplicationConfig
4. 拷贝工作流JSP文件

5. 拷贝流程设计器文件
在app-workflow-web工程的/workflow目录下,其中stencilset.json是流程设计器组件配置库。

在app-workflow-web/webapp/flowdesigner目录下是流程设计器的页面、css、javascripts、图片。

2.3 数据库脚本
1. 数据库
目前工作流V3.0支持Oracle和DB2
2. 理解数据库表的命名
工作流V3.0的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例,参数,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下。
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,参数,异步任务,等运行中的数据。
Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_EX_*: 'EX'表示extension。 这个前缀的表包含了代理人设置、触发器、审批历史、流程和任务定义扩展属性等。
3. 数据库脚本
分为两部分
- 一、工作流引擎表
- 二、工作流扩展表
工作流引擎表在工作流V3.0软件开发包中。在系统初始化时,工作流引擎自动初始化数据库脚本,不需要人为干预。
工作流引擎脚本在activiti-engine-5.18.0.jar中:

而工作流扩展表是针对工作流引擎表做的一些定制化配置的表,需要开发者手动整合到业务系统。
4. 扩展表数据库脚本
扩展的数据库脚本文件存放在工作流app-workflow-web工程的db/mini目录下:

在实际的业务系统开发过程中,根据使用的数据库类型,开发者可以直接把db/mini/db2或者db/mini/oracle目录下的workflow-table.sql和workflow-data.sql文件拷贝到业务系统初始化脚本目录下。
创建表
workflow-table.sql
扩展表说明
代理表 ACT_EX_AGENT
代理流程列表 ACT_EX_AGENT_SCOPE
流程任务历史扩展表 ACT_EX_HISTORY
流程和任务触发器扩展表 ACT_EX_LISTENER
流程和任务定义扩展表 ACT_EX_NODE_VARIABLE
在创建DB2表时,需要指定表空间,如:
CREATE TABLE TEST (
COL1 VARCHAR(20) NOT NULL,
...
)
in 指定表空间名
index in 指定表空间名
初始化数据
workflow-data.sql
包括字典参数和流程菜单两部分
1、 字典参数

2、 流程菜单

3. 集成工作流
3.1 模块说明
-
app-workflow-core
工作流核心服务接口,负责流程定义更新与查询、流程实例更新与查询、任务审批与查询,参与人查询、流程代理更新与查询、流程历史查询等。

-
app-workflow-mvc
负责工作流数据传递,页面地址跳转

-
app-workflow-web
负责数据库配置,事务管理、数据展示以及页面展示。

3.2 工作流引擎配置
工作流引擎采用Spring注解配置类,管理工作流引擎数据源-dataSource配置、数据库事务-transactionManager:
com.vprisk.config.WorkflowApplicationConfig

以及配置Activiti审批服务接口,如流程定义以及流程相关静态资源RepositoryService:

流程实例RuntimeService

任务服务TaskService

历史服务HistoryService

等服务接口,更多详细信息请参考Activiti用户手册。
3.3 工作流事务管理
工作流V3.0通过Spring的注解方式管理事务,一般事务控制在Service服务类的方法级别上,如保存流程定义:
@Transactional
public void saveProcessDefinition(ProcessDefinitionDto dto){
...
}
通过@Transactional来标识需要事务,这时候与Spring事务管理结合起来呢。
3.4 流程引擎的API和服务

1. 流程定义服务接口
流程定义是工作流V3.0核心功能之一,流程定义服务提供了管理和控制流程定义的操作。 包括新增、编辑、复制、锁定、激活、导入、导出、删除。它包含了一个流程每个环节的结构和行为。
2. 流程实例服务接口
流程实例服务是工作流V3.0核心功能之一。 包括启动流程,挂起、激活、删除、复位发起、查询、流程进度图等。
流程实例服务负责启动一个流程定义的新实例。 流程定义定义了流程各个节点的结构和行为。 流程实例就是这样一个流程定义的实例。对每个流程定义来说,同一时间会有很多实例在执行。 流程实例服务可以用来获取和保存流程参数。 这些数据是特定于某个流程实例的,并会被很多流程中的节点使用 (比如,一个决策器常常使用流程参数来决定流转到指定分支走流程)。 流程实例服务也能查询流程实例和执行。 最后,流程实例服务可以在流程实例等待外部触发时使用,这时可以用来继续流程实例。 流程实例可以有暂停状态,而服务提供了激活方法来“激活”实例, 接受外部激活后,流程实例就会继续向下执行。
流程进度图
其中标红的箭头是已走完的,标红任务节点是当前要审批节点。
3. 任务实例接口
任务实例是由系统中真实人员执行的,它是工作流V3.0核心功能之一。包括任务审批,查询用户任务、任务改派,任务驳回等。
4. 历史查询服务接口
流程历史是一个组件,它可以捕获发生在进程执行中的信息并永久的保存,与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中。
历史查询服务提供了工作流的所有历史数据。 在执行流程时,引擎会保存很多数据,比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径等等。 这个服务主要通过查询功能来获得这些数据。
5. 触发器服务接口
工作流V3.0扩展服务接口之一。 基本功能包括新增,编辑、删除、查询;
触发器可以理解为流程审批过程中,中间嵌入的一段小程序,他的主要用途在于可以做一些审批任务之外的一些事情,如操作业务数据,分配下一节点审批人、记录日志,消息提醒等等。
- 在任务审批前或审批完成后,开发者可自定义前置触发器或者后置触发器,
- 在决策器走流转分支时,指定流转分支路由
触发器包括前置触发器和后置触发器
触发器分类
- 任务触发器
- 决策器触发器
7. 流程参与人服务接口
工作流V3.0扩展服务接口之一,流程参与人服务可以查询流程审批相关审批人,机构、角色。
8. 历史任务扩展服务接口
工作流V3.0扩展服务接口之一。 基本功能包括新增,编辑、删除、查询;
在任务审批前或审批完成后,开发者可自定义前置任务触发器或者后置任务触发器,在触发器中可记录一些与业务相关的日志信息或者审批任务消息提醒等。
9. 流程代理服务接口
工作流V3.0扩展服务接口之一。 基本功能包括新增,编辑、删除、查询;
有些时候有的领导在一段时间内有事不能审批,比如出差。那问题来了,如果领导不能审批任务,整个流程将会停滞不前。所以这个时候需要有人代领导审批任务,流程代理服务就派上用场了。流程代理服务允许领导指定代理人在一段之间内,代理指定流程,审批任务。
10. 任务定义扩展服务接口
工作流V3.0扩展服务接口之一,流程设计器扩展了流程定义属性,而这些属性不属于工作流引擎本身,需要额外用数据库表存储。主要用途在于流程审批时,可以把流程定义属性(参数)当作流程审批权重,影响任务完成。比如回退规则、审批人、是否会签、允许改派等。
3.4 流程触发器
1. 触发器触发条件类型(type)
任务级别
- create 任务实例创建前触发
- complete 任务实例完成后触发
流程级别
- start 节点实例创建前触发
- end 节点实例完成后触发
2. 自定义任务触发器
开发者自定义任务触发器需要实现任务级触发器接口,如:
public class WorkflowTaskListenerA implements WorkflowTaskListener{
public void notify(DelegateTask delegateTask){
//....
}
}
开发者自定义决策器触发器需要实现流程级触发器接口,如:
3. 自定义决策器触发器
public class WorkflowTaskListenerB implements WorkflowTaskListener{
public void
Related Skills
node-connect
351.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.8kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
