一、创建项目
1.创建一个springboot项目,勾选自己需要的依赖,也可以后期在pom.xml添加
引入activiti依赖
<!--activiti-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M4</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M4</version>
<scope>import</scope>
<type>pom</type>
</dependency>
yml配置
server:
port: 8080
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver
#activiti配置
activiti:
history-level: full
db-history-used: true
check-process-definitions: true
2启动项目
自动创建activiti相关数据表,如果未自动创建,在数据库连接后加上&nullCatalogMeansCurrent=true
生成数据表
act_ge_* 通用表
act_hi_* 历史表
act_re_* 资源表
act_ru _* 运行状态表,实例,任务,变量等等
activiti7部署表bug修复
ALTER TABLE act_re_deployment add COLUMN PROJECT_RELEASE_VERSION_ varchar(255) DEFAULT null;
ALTER TABLE act_re_deployment add COLUMN VERSION_ varchar(255) DEFAULT null;
二、activiti相关概念及操作
activiti架构
获取流程引擎工具
// 获取默认流程引擎
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
ProcessEngine 流程引擎工具
服务接口:下面这些服务类主要用户流程的实现,执行与管理。
具体使用时可以通过获取流程工具使用,在springboot中也可以直接注入其实现类
BPMN
定义
bpmn定义了一种业务流程模型标准。通过它可以设计一套业务流程的图形化模型。简而言之,它是业务流程的可视化编辑器。
idea插件
在idea插件官网搜索actiBPM并下载,通过idea插件导入。
使用时输入中文会乱码
乱码修改三个位置
idea安装目录 idea.exe.vmoptions idea64.exe.vmoptions 相关两个文件末尾加上-Dfile.encoding=UTF-8
c盘搜索idea64.exe.vmoptions 末尾加上 -Dfile.encoding=UTF-8
新建bpmn文件,便可以创建业务流程模型了。可以在流程中指定办理人,也可以传一些参数,表单信息等功能,这里是通过模型直接指定办理人。
流程部署 deployment
流程部署就是将生成好的业务流程模型(BPMN)部署到服务器上去。相关的操作如下
- 指定流程key
- 指定流程名称
- 指定任务处理人
- 上传bpmn文件,图片
- 增删改查
- 查询部署列表与xml文件
代码实现
@SpringBootTest
class ActivitiDeplomentTests {
@Autowired
RepositoryServiceImpl repositoryService;
@Test
void addDeployment() {
// 新增流程部署
String fileName = "BPMN/work_over_time2.0.bpmn";
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource(fileName)
.key("work_over_time")
.name("加班申请")
.deploy();
System.out.println(deployment.getVersion());
}
@Test
void listDeployment() {
/**
* 查询所有流程部署
*/
List<Deployment> list = repositoryService.createDeploymentQuery().list();
list.forEach(item -> {
System.out.println("流程部署id:" + item.getId() + "-流程部署名称:" + item.getName() + "-流程部署key:" + item.getKey() + "-流程部署版本:" + item.getVersion());
});
}
@Test
void updateDeployment() {
/**
* 更新流程部署
*/
repositoryService.setDeploymentKey("8a3031a4-7644-11eb-b54e-e0d55e485056","ask2");
}
}
流程定义 processDefination
流程定义与流程部署的关系,流程定义是流程部署的具体实现。流程部署完成后就生成了一个流程定义,同样key的流程部署,会更据key值的不一样生成不同版本的流程定义,具体使用的时候可能会区分流程定义的版本。(入口)
- 查询已有流程定义
- 根据条件key查询流程定义(最常用)
- 删除流程定义
代码实现
@SpringBootTest
class ActivitiProcessDefinitionTests {
@Autowired
RepositoryServiceImpl repositoryService;
@Test
void listDeployment() {
/**
* 查询所有流程定义
*/
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
list.forEach(item -> {
System.out.println("流程定义id:" + item.getId() +"部署id:" + item.getDeploymentId() + "-流程定义名称:" + item.getName() + "-流程定义key:" + item.getKey() + "-流程定义版本:" + item.getVersion());
});
}
@Test
void getOneProcessDefinition(){
/**
* 流程定义key在bpmn文件的key
*/
ProcessDefinition ask1 = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").latestVersion().singleResult();
System.out.println("流程定义id:" + ask1.getId() +"部署id:" + ask1.getDeploymentId() + "-流程定义名称:" + ask1.getName() + "-流程定义key:" + ask1.getKey() + "-流程定义版本:" + ask1.getVersion());
}
@Test
void deleteDeployment() {
/**
* 删除流程定义
*/
repositoryService.deleteDeploymentCascade("29eed94a-7642-11eb-a2a6-e0d55e485056");
repositoryService.deleteDeploymentCascade("438f67c9-7643-11eb-9bd0-e0d55e485056");
repositoryService.deleteDeploymentCascade("6e5d2b4a-7646-11eb-bb37-e0d55e485056");
}
流程实例 processInstance
流程开启时会产生一个流程实例,到当前流程结束之前,该实例会一直存在。
任务操作 task
- 查询到当前用户的任务
- 完成任务
- 历史任务查询
代码实现
@Test
void startProcess() {
// 开始任务,生成流程实例
runtimeService.startProcessInstanceByKey("work_over_time");
}
@Test
void taskQuery() {
// 任务查询
List<Task> taskList = taskService.createTaskQuery().taskAssignee("two").list();
taskList.forEach(task -> {
System.out.println("任务名称" + task.getName());
System.out.println("拥有者" + task.getOwner());
System.out.println("任务描述" + task.getDescription());
System.out.println("-------------");
});
}
@Test
void completeTask() {
// 完成任务
// 1.查询请假流程任务(通过流程实例与当前处理者查询)
Task task = taskService.createTaskQuery()
.processDefinitionKey("work_over_time")
.taskAssignee("two")
.singleResult();
// 2.完成任务
taskService.complete(task.getId());
}
@Test
void historyTaskQuery() {
// 获取默认流程引擎
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// 历史任务(已办任务)查询
List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().taskAssignee("one").list();
historicTaskInstanceList.forEach(historicTaskInstance -> {
System.out.println("任务名称:" + historicTaskInstance.getName());
System.out.println("任务描述:" + historicTaskInstance.getDescription());
System.out.println("任务持续时间:" + historicTaskInstance.getDurationInMillis() / 1000 / 60 / 60 + "小时");
System.out.println("-------------");
});
}
上面的查询和部署的方式条件都有很多种,这里我展示的只是其中一种,可以通过很多种的组合达到我们查询的要求。
三、总结
我掌握了以下几点
- 工作流相关的基础概念及其关联(流程部署,流程定义,流程实例,任务)
- 了解bpmn
- 流程走的时候对应的数据库的大致的变化(这里未介绍)。
- 不同的服务接口对应什么功能及其基本的操作需要有 一定的了解。
- 了解一个任务流程的完整生命周期
工作流其它操作
- 动态指点办理人
- 网关
- 流程变量
- 表单
- 复杂流程