Activiti——基本操作
1 流程定义
使用activiti流程建模工具(activity-designer)定义业务流程(.bpmn文件) 。
.bpmn文件就是业务流程定义文件,通过xml定义业务流程。
使用idea插件设置流程图, 设置流程中需要的节点,节点负责人。具体步骤参考:
2 流程定义部署
- activiti部署业务流程定义(.bpmn文件)。即:将流程图的内容存储到数据库
1 |
|
流程定义部署后操作activiti的3张表如下:
act_re_deployment 流程定义部署表,每部署一次增加一条记录
act_re_procdef 流程定义表,部署每个新的流程定义都会在这张表中增加一条记录。比如章三的话费报销是一条记录,李四的话费报销是一条记录。
act_ge_bytearray 流程资源表
3 启动流程实例
启动一个流程实例表示开始一次业务流程的运行。
在员工请假流程定义部署完成后,如果张三要请假就可以启动一个流程实例,如果李四要请假也启动一个流程实例,两个流程的执行互相不影响。
1 |
|
操作activiti的表如下:
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 已经完成的任务信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 当前代办的任务信息
4 用户查询待办任务(Task)
- 因为现在系统的业务流程已经交给activiti管理,通过activiti就可以查询当前流程执行到哪了,当前用户需要办理什么任务了,这些activiti帮我们管理了,而不需要开发人员自己编写在sql语句查询。
查询自己所能处理的任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void testFindPersonalTasks(){
// 1. 创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 获取taskService
TaskService taskService = processEngine.getTaskService();
// 3. 根据流程key和任务负责人 查询任务
List<Task> tasks = taskService.createTaskQuery()
.processDefinitionKey("myProcess")
.taskAssignee("张三")
.list();
// 4. 输出
tasks.forEach(task -> {
System.out.println("流程实例id="+task.getProcessInstanceId());
System.out.println("任务id="+task.getId());
System.out.println("任务负责人="+task.getAssignee());
System.out.println("任务名称="+task.getName());
});
}
5 用户处理任务
用户查询待办任务后,就可以办理某个任务,如果这个任务办理完成还需要其它用户办理,比如采购单创建后由部门经理审核,这个过程也是由activiti帮我们完成了。
1 |
|
操作activiti的表如下:
act_hi_taskinst: 已经完成的历史任务信息 -> 插入新数据; 更新完成任务的结束时间
act_ru_task:当前代办的任务信息 -> 删除旧数据,插入新数据
act_hi_identitylink: 流程的参与用户历史信息 -> 插入新数据
更加灵活的完成个人任务:
1 |
|
此时查看act_ru_task表,已经没有数据了,因为任务执行完了
查看act_hi_actinst,可以看到END_TIME都已经填充上了
6 流程结束
当任务办理完成没有下一个任务结点了,这个流程实例就完成了。
7. 流程历史信息的查看
即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在activiti的act_hi_*相关的表中。所以我们还是可以查询流程执行的历史信息,可以通过HistoryService来查看相关的历史记录。
1 |
|
8 实战使用
准备工作:
定义BPMN文件
myActProcessDefinitionRegister注册entity对应的工作流信息:entityName, definitionKey,name
EmActProcessStatus: entity上存储的taskDefinitionKey,可在这张表查询到对应的中文翻译
processRegisterId
taskDefinitionKey
name
entity上冗余了工作流字段:
task1Assignee,taskAssignee2: 任务受理人,根据bpmn文件定义的task数量定义,每个task对应一个受理人
currentTaskDefinitionKey: 当前记录的流程状态,即task的标识
流程:
- 新增entity,afterSaveTrigger发送mq启动流程实例
- definitionKey: 根据entityName查询emActProcessDefinitionRegister
- businessKey: entityId
- variables: entity复写自己的
- 查看认领任务:根据前端传过来的loginName, processDefinitionKeyList查看任务列表
- 候选人认领任务(如果有callBack,调用callback): taskService.claim(task.getId(), claimTaskForm.getUserLoginName());
- 查看待办任务:根据前端传过来的loginName, processDefinitionKeyList查看任务列表
- 完成任务:completeTask
- 执行完成任务回调completeFeedback, 比如:当前流程的填充审批完成时间