前言

工作流程是我们日常开发项目中常见的功能,本文记录springboot整合activiti7。

Activiti介绍

官网:https://www.activiti.org

数据库表
acthi:’hi’表示 history,此前缀的表包含历史数据,如历史(结束)流程实例,变量,任务等等。
actge
:’ge’表示 general,此前缀的表为通用数据,用于不同场景中。
actevt:’evt’表示 event,此前缀的表为事件日志。
actprocdef
:’procdef’表示 processdefine,此前缀的表为记录流程定义信息。
actre:’re’表示 repository,此前缀的表包含了流程定义和流程静态资源(图片,规则等等)。
actru
:’ru’表示 runtime,此前缀的表是记录运行时的数据,包含流程实例,任务,变量,异步任务等运行中的数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。

表名 表注释
act_ge_bytearray 二进制数据表,存储通用的流程定义和流程资源。
act_ge_property 系统相关属性,属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。
act_re_deployment 部署信息表
act_re_model 流程设计模型部署表
act_re_procdef 流程定义数据表
act_ru_deadletter_job 作业死亡信息表,作业失败超过重试次数
act_ru_event_subscr 运行时事件表
act_ru_execution 运行时流程执行实例表
act_ru_identitylink 运行时用户信息表
act_ru_integration 运行时积分表
act_ru_job 运行时作业信息表
act_ru_suspended_job 运行时作业暂停表
act_ru_task 运行时任务信息表
act_ru_timer_job 运行时定时器作业表
act_ru_variable 运行时变量信息表
act_hi_actinst 历史节点表
act_hi_attachment 历史附件表
act_hi_comment 历史意见表
act_hi_detail 历史详情表,提供历史变量的查询
act_hi_identitylink 历史流程用户信息表
act_hi_procinst 历史流程实例表
act_hi_taskinst 历史任务实例表
act_hi_varinst 历史变量表
act_evt_log 流程引擎的通用事件日志记录表
act_procdef_info 流程定义的动态变更信息

BPM节点介绍

根据BPMN2.0规范的分类划分为以下部分:
1.启动与结束事件(event)
2.顺序流(Sequence Flow)
3.任务(Task)
4.网关(Gateway)
5.子流程(Subprocess)
6.边界事件(Boundary Event)
7.中间事件(Intermediate Event)
8.监听器(Listener)

Event

StartEvent,开始事件。
image.png

EndEvent,结束事件。
image.png

Task

UserTask,用户任务,用户任务用来设置必须由人员完成的工作。
image.png

属性名称 属性说明
Assignee 指定用户任务的处理人
Cadidate Users 指定用户任务的候选人,多个用逗号隔开
Cadidate Groups 指定多个候选组,多个用逗号隔开
Due Date 设置任务的到期日,通常用变量代替而不是设定一个具体的日期
Priority 设定任务的优先级,取值区间[0,100]

|







ScriptTask,脚本任务,脚本任务是一个自动节点,当流程到达脚本任务。
image.png

ServiceTask,服务任务
image.png

Gateway

ParallelGateway,并行网关,顺序流没有条件解析,且分支执行不分先后。例如下面流程,需要科任老师批准、班主任批准,请假流程才能结束。
image.png

ExclusiveGateway,排他网关,条件解析为true的顺序流会被选中,流程往前走。例如下面流程,请假天数小于等于1天,科任老师老师批准,请假流程结束;请假天数大于1天,就需要班主任批准。
image.png

InclusiveGateway,包含网关,并行与排他的结合体,所有顺序流的条件都会被解析,结果为true的顺序会以并行方式继续执行。例如下面流程,请假天数小于等于1天,科任老师老师批准,请假流程结束;请假天数大于1天,班主任批准,请假流程结束;请假天数大于三天,就需要班主任批准、校长批准,请假流程才能结束。
image.png

开发前准备

Idea安装actiBPM插件,用于绘制流程图
image.png

画流程图

创建bpmn文件,画一个简单的请假流程
image.png

代码编写

项目结构
image.png

引入依赖包

  1. <!-- activiti -->
  2. <dependency>
  3. <groupId>org.activiti</groupId>
  4. <artifactId>activiti-spring-boot-starter</artifactId>
  5. <version>7.1.0.M5</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.activiti</groupId>
  9. <artifactId>activiti-image-generator</artifactId>
  10. <version>7.1.0.M5</version>
  11. </dependency>
  12. <!--添加MySQL驱动依赖 -->
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-jdbc</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>mysql</groupId>
  19. <artifactId>mysql-connector-java</artifactId>
  20. </dependency>
  21. <!-- thymeleaf模板 -->
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>

springboot整合的activiti,默认自带security框架,为了方便测试,我们直接用官方提供的config类
image.png
几个默认账号,选一个来登录即可,可以选 admin/password
image.png

传统项目分层:controller层、service层
image.png

为了扩展、丰富原生的流程图生成器,创建自定义ProcessDiagramGenerator与ProcessDiagramCanvas
image.png

三个简单页面
image.png
1、流程发起,填写业务表单,发起一个请假流程
image.png
2、任务待办,查询指定用户的流程任务列表,并完成任务
image.png
3、查看流程,查询指定用户发起的流程列表,并查看实时流程图
image.png

效果演示

自动建表

数据库无相关表,启动程序,就会自动创建相关的表,共25张
image.png
注:自动创建的表中,actre_deployment少两个字段,部署流程时报错,补全即可(VERSION、PROJECTRELEASE_VERSION
image.png

流程部署

单元测试,部署刚才的请假流程

  1. import org.activiti.engine.*;
  2. import org.junit.Test;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.test.context.junit4.SpringRunner;
  7. @RunWith(SpringRunner.class)
  8. @SpringBootTest
  9. public class SpringbootActiviti7ApplicationTests {
  10. @Autowired
  11. private RepositoryService repositoryService;
  12. /**
  13. * 流程部署
  14. */
  15. @Test
  16. public void test() {
  17. repositoryService.createDeployment()
  18. .addClasspathResource("bpm/askForLeaveBpm.bpmn")
  19. .name("请假流程")
  20. .key("ASK_FOR_LEAVE_ACT")
  21. .deploy();
  22. System.out.println("流程部署成功!");
  23. }
  24. }

流程发起

http://localhost:10010/activiti/index
发起两个请假流程,一个1天、一个5天
image.png image.png

查看流程

http://localhost:10010/activiti/getHistoricProcessInstanceByUserName?username=zhangsan
查看指定用户发起的流程
image.png

任务待办

http://localhost:10010/activiti/queryUserTaskByUserName?username=wangwu
查看任务待办,项目经理:lisi、部门经理:wangwu,并完当前成流程节点,流程会自动推进直至流程结束
image.png

流程结束

key1,请假小于3天,项目经理李四审批后流程直接结束
key2,请假大于3天,项目经理审批后,到部门经理审批,然后流程才结束
image.pngimage.png

代码开源

代码已经开源、托管到我的GitHub、码云:
GitHub:https://github.com/huanzi-qch/springBoot
码云:https://gitee.com/huanzi-qch/springBoot

后记

简单的整合实例暂时先记录到这,后续有空再补充。

更新

2021-08-13更新
整合Activti官方编辑器插件

pom文件引入

  1. <activiti.modeler.version>5.23.0</activiti.modeler.version>
  2. <dependency>
  3. <groupId>org.activiti</groupId>
  4. <artifactId>activiti-modeler</artifactId>
  5. <version>${activiti.modeler.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.activiti</groupId>
  9. <artifactId>activiti-diagram-rest</artifactId>
  10. <version>${activiti.modeler.version}</version>
  11. </dependency>

插件GitHub地址:https://github.com/Activiti/Activiti/tree/5.x/modules/activiti-webapp-explorer2
首先把开源项目下载成压缩包,方便拷贝东西:
1、这几个静态资源拷贝到我们项目里
Activiti-5.x\modules\activiti-webapp-explorer2\src\main\webapp
image.png
2、拷贝这三个Controller到我们的项目里
Activiti-5.x\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\main\StencilsetRestResource.java
Activiti-5.x\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelEditorJsonRestResource.java
Activiti-5.x\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelSaveRestResource.java
3、拷贝这个json文件到我们项目的resources文件夹
Activiti-5.x\modules\activiti-webapp-explorer2\src\main\resources\stencilset.json

中文汉化:stencilset.json、en.json,这些文件默认都是英文的,找一个中文的替换即可

代码修改
editor-app/app-cfg.js
image.png

三个Controller,同时都加上:@RequestMapping(value = “/service”)
另外,保存方法的接参要改一改
image.png

为了方便,我们配置一下Security框架配置,所有请求都不需要登录了(前端调用保存方法总是403没权限,很烦)
SpringBoot系列 - Activiti7工作流引擎 - 图31

  1. /**
  2. * Security框架配置
  3. */
  4. @EnableWebSecurity
  5. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  6. @Override
  7. protected void configure(HttpSecurity http) throws Exception {
  8. http
  9. // 关闭csrf防护
  10. .csrf().disable()
  11. .headers().frameOptions().disable()
  12. .and()
  13. //定制url访问权限
  14. .authorizeRequests()
  15. //无限登录即可访问
  16. .antMatchers("/**").permitAll()
  17. //需要特定权限
  18. // .antMatchers("/sysUser/**","/sysAuthority/**").hasAnyAuthority("ROLE_ADMIN","ROLE_SA")
  19. //其他接口登录才能访问
  20. // .anyRequest().authenticated()
  21. .and()
  22. ;
  23. }
  24. }

http://localhost:10010/modeler/index
写个流程管理页面,可以进行CRUD、发布流程模型,同时还可以删除流程部署
image.png

一个简单的请假流程
image.png

将之前的请假流程发起的流程部署小调整一下,改成发起我们刚刚画的流程(修改key值)
image.png

流程图效果(其他的步骤跟之前的一样,就没什么好说的了,主要是看生成的流程图效果)
image.png
可以看到,使用在线编辑器不仅方便、流程图还比之前的好看,nice!
注意项:activiti7强依赖security框架,如果使用默认配置,可能导致有些有些API调用报403,建议还是使用自己的Security配置
参考:https://www.jianshu.com/p/cf766a713a86

参考

https://www.cnblogs.com/huanzi-qch/p/14758858.html