本章接着后面几章会进行一个springboot+activiti7的整合,记录自己的学习过程,由于demo篇幅过长,会分好几章进行描述,等写完后,在文章末尾会附上后面几章的链接,本章主要描述demo的需求以及最终效果的一个演示,具体搭建以及实现在后面几章进行依次描述。
场景:假设某某公司现在进行了一个管理上的整顿,如果一个产品经理想要提需求,除了要满足甲方以外,还必须让码农们满意,这时就可以有一个审批过程。如下:
后面就通过整合activiti的方式实现如上的一个审批流程。
实现的效果就是:从产品经理发起流程,后面每个节点都可以通过或者退回,退回就是退回到产品经理步骤。然后实现一个流程记录跟踪和流程图跟踪功能。除了审批通过和退回初始节点外,其他的操作后面空了再慢慢学习。
1、第一步
准备数据库。
需要activi的表以及自己的业务表,activiti的表在部署时会自动创建,现在先不管,本次demo涉及的业务表有如下几个:
表名 | 描述 |
---|---|
user | 用户表 |
role | 角色表 |
user_role | 用户角色关联表 |
demand | 需求表 |
CREATE TABLE `demand` (
`id` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
`status` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '流程状态,-1是未启动,0是填写表单,1是组长审批,2是开发经理审批,3是项目经理审批,4是结束',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '需求名称',
`content` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '需求具体内容',
`salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '盐字段',
`taskid` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '任务id',
`createuser` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '发起人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
CREATE TABLE `role` (
`id` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '主键',
`role` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '角色名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
CREATE TABLE `user` (
`id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '主键',
`username` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '用户名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
CREATE TABLE `user_role` (
`id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '主键',
`userid` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '用户id',
`roleid` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '角色id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
2、第二步
idea安装插件,绘制流程图。
绘制activiti可以识别的流程图并实现部署,activiti默认可以部署.bpmn和**.bpmn20.xml结尾的文件。
idea有很多画bpmn图的插件,我选择的是activiti BPMN visualizer。
安装好之后,重启idea,在创建的springboot项目的resources资源目录下右键新建一个如下文件。
创建完成后会生成一个xml文件,在这个文件右键,选择view..........就可以打开流程图了。
在图中通过右键添加进行绘制。
最终根据demo的需求场景绘制了如上流程图。菱形是排他网关,长方形是用户事件。
每个节点以及线上面的具体参数后面再讲,此处先讲一个东西参数最好不要用重名的,不然会出问题。
3、第三步
创建项目、导入所需依赖。
这是我项目的目录结构:
然后导入这个demo所需要的依赖,如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 工作流依赖 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M3.1</version>
<exclusions>
<exclusion><!-- 排除activiti的mybatis,避免和外面的mybatis-plus冲突 -->
<!-- 重点坑,不然启动项目会报错mybatisplus缺少类 -->
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
<!-- 数据依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--流程图依赖-->
<!-- 试了几个版本的,有些版本的会导致图片展示不全,注意 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-image-generator</artifactId>
<version>5.20.0</version>
</dependency>
</dependencies>
有几个坑需要注意一下,上面有在备注里面标注,比如,mybatisplus和activiti的冲突问题以及之后的预览流程图功能的依赖会导致展示不全的问题等。
4、修改配置文件
server:
port: 8080
spring:
datasource:
username: root
password: 123456
# 加上nullCatalogMeansCurrent=true才能自动创建activiti需要的表
url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
activiti:
database-schema-update: true
check-process-definitions: true
# 注意,如果activiti后面加上了/,就要求启动的时候process文件夹中需要有流程定义文件
# 是指定activiti流程描述文件的前缀(路径),启动时,activiti就会去寻找此路径下的流程描述文件,并且自动部署
process-definition-location-prefix: classpath:/activiti/
# suffix 是一个String数组,表示描述文件的默认后缀名,默认**.bpmn和**.bpmn20.xml
# process-definition-location-suffixes:
# - **.bpmn
# - **.bpmn20.xml
# Activiti7历史数据无法自动插入,开启下面两个配置
history-level: audit
db-history-used: true
# mapper.xml文件所在路径
mybatis-plus:
mapper-locations: classpath*:mapper/**/*Mapper.xml
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
具体的描述我都有写在注释上面。
准备工作完成之后就可以开始编码实现了。demo代码有点多,下面先只展示效果。
1、首先模拟登录张三(产品经理,id为1),进入我的需求界面提出需求。
2、新增完成后,流程是未启动状态,张三点击发起流程,并点击提交审核按钮,选择审批人点击保存。
3、此时点击查看流程按钮。
4、可以看到流程现在在组长那里,就是数据库配置的李四,然后登录李四的账号,进入待办界面,查看待办列表。
5、点击退回按钮,退回给张三重新写需求。
6、登录张三(id:1)账号,重新提交需求。
7、点击提交审核,继续选择审批人。
8、登录李四的账号,重新审批(id:2)
9、这次选择同意
10、再次查看流程图
11、登录王五的账号(id:3)
12、点击同意
13、查看流程图
14、登录赵六的账号进行审批,(id:4)
15、点击通过
16、再次回到张三的需求列表,流程状态已结束