Note/扩展知识/Activti 流程管理.md

471 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Activti流程管理
```java
Activti提供的主要的接口服务其中主要用到
存储库服务repositoryService用于管理和操作流程定义和流程部署相关的数据它提供了一系列方法来查询创建更新和删除流程定义流程部署以及相关的资源文件
运行时服务runtimeService用于管理和操作正在执行的流程实例和任务它允许启动新的流程实例对流程实例进行操作如激活挂起删除等)、获取当前正在运行的流程实例信息等操作
任务服务taskService用于管理和操作与用户任务相关的数据和操作它允许查询创建更新和删除任务以及对任务进行分配完成指派等操作
历史服务historyService用于访问和查询与历史数据相关的信息它提供了查询已完成流程实例任务变量等历史数据的能力通过历史服务可以获取对流程的审计跟踪和回顾以及生成历史报告和统计数据
//存储库服务
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
//运行时服务
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
//表单服务
<bean id="formService" factory-bean="processEngine" factory-method="getFormService" />
//身份服务
<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />
//任务服务
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
//历史服务
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
//管理服务
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
```
## 1、存储库服务 repositoryService
### 1.全部流程实例激活挂起
激活:
```java
activateProcessDefinitionById(,,)
```
根据流程定义的ID激活流程定义。
第一个参数 是要激活的流程定义的唯一标识符。
第二个参数 `true` 表示级联激活,即同时激活与该流程定义关联的所有挂起的流程实例。
第三个参数 `null` 表示没有要激活的特定日期。
挂起:
```java
suspendProcessDefinitionById(,,)
```
根据流程定义的ID挂起流程定义。
第一个参数 是要挂起的流程定义的唯一标识符。
第二个参数 `true` 表示级联挂起,即同时挂起与该流程定义关联的所有正在执行的流程实例。
第三个参数 `null` 表示没有要挂起的特定日期。
示例:
```java
/**
* 全部流程实例挂起
*/
@Test
public void suspendProcessInstance() {
ProcessDefinition leave = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave").singleResult();
// 获取到当前流程定义是否为暂停状态 suspended方法为true是暂停的suspended方法为false是运行的
boolean suspended = leave.isSuspended();
if (suspended) {
// 暂定,那就可以激活
// 参数1:流程定义的id 参数2:是否激活 参数3:时间点
//多个流程激活
repositoryService.activateProcessDefinitionById(leave.getId(), true, null);
System.out.println("流程定义:" + leave.getId() + "激活");
} else {
//多个流程挂起
repositoryService.suspendProcessDefinitionById(leave.getId(), true, null);
System.out.println("流程定义:" + leave.getId() + "挂起");
}
}
```
### 2.删除流程实例
单个删除
```java
deleteDeployment()
```
根据流程部署的ID删除相应的流程定义和资源。如果该流程定义已经有流程实例启动则会删除失败。
第一个参数 是流程ID
级联删除
```java
deleteDeployment(,true)
```
设置为级联删除方式,即使流程定义已经有流程实例启动,也会强制删除流程定义及其相关的流程实例和历史数据。
第一个参数 是流程ID
第二个参数 true 表示开启级联删除
示例:
```java
/**
* 删除流程定义
*/
public void deleteDeployment() {
//部署id
String deploymentId = "ce1f3cc0-08cf-11ee-b8cb-e645a9a03302";
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义即使该流程有流程实例启动也可以删除设置为false非级别删除方式
repositoryService.deleteDeployment(deploymentId, true);
}
```
### 3.查询流程实例
```java
createProcessDefinitionQuery()
```
创建一个流程定义查询对象,用于构建查询条件。
```java
orderByProcessDefinitionVersion()
```
按照流程定义的版本进行排序。
```java
desc()
```
降序排列,即最新的版本排在前面。
```java
list()
```
执行查询,并返回符合条件的流程定义结果列表。
示例:
```java
/**
* 查询流程定义
*/
@Test
public void findProcessDefinitionList() {
List<ProcessDefinition> definitionList = repositoryService.createProcessDefinitionQuery()
.orderByProcessDefinitionVersion()
.desc()
.list();
//输出流程定义信息
for (ProcessDefinition processDefinition : definitionList) {
System.out.println("流程定义 id= " + processDefinition.getId());
System.out.println("流程定义 name= " + processDefinition.getName());
System.out.println("流程定义 key= " + processDefinition.getKey());
System.out.println("流程定义 Version= " + processDefinition.getVersion());
System.out.println("流程部署ID = " + processDefinition.getDeploymentId());
}
}
```
### 4.单个文件部署
```java
createDeployment()
```
创建一个流程部署对象,用于部署流程定义和相关资源。
```java
addClasspathResource("")
```
从类路径中添加一个 BPMN 文件资源到部署中,路径为 ""。该文件包含了请假申请流程的流程定义。
参数 是bpmn文件路径
```java
addClasspathResource("")
```
从类路径中添加一个 PNG 文件资源到部署中,路径为 ""。该文件用于流程定义的可视化展示。
参数 是png文件路径
```java
name("")
```
设置流程部署的名称为 ""。
参数 流程部署名称
```java
deploy()
```
执行部署操作,将流程定义和资源文件部署到流程引擎中。
示例:
```java
/**
* 单个文件部署
*/
@Test
public void deployProcess() {
// 流程部署
Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/leave.bpmn20.xml").addClasspathResource("process/leave.png").name("请假申请流程").deploy();
System.out.println(deploy.getId());
System.out.println(deploy.getName());
}
```
## 2、运行时服务 runtimeService
### 1.启动流程实例
```java
startProcessInstanceByKey("")
```
按照流程定义的名称key启动一个流程实例。流程定义的键通常是在部署流程时设置的唯一标识符。
参数 是流程的名称
示例:
```java
/**
* 启动流程实例
*/
@Test
public void startUpProcess() {
//创建流程实例,我们需要知道流程定义的key
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave");
//输出实例的相关信息
System.out.println("流程定义id" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id" + processInstance.getId());
System.out.println("当前活动Id" + processInstance.getActivityId());
}
```
### 2.单个流程实例激活挂起
激活实例流程:
```java
activateProcessInstanceById()
```
挂起实例流程:
```java
suspendProcessInstanceById()
```
示例:
```java
/**
* 单个流程挂起
*/
@Test
public void SingleSuspendProcessInstance() {
String processInstanceId = "ce1f3cc0-08cf-11ee-b8cb-e645a9a03302";
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
//获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的
boolean suspended = processInstance.isSuspended();
if (suspended) {
//单个流程激活
runtimeService.activateProcessInstanceById(processInstanceId);
System.out.println("流程实例:" + processInstanceId + "激活");
} else {
//单个流程挂起
runtimeService.suspendProcessInstanceById(processInstanceId);
System.out.println("流程实例:" + processInstanceId + "挂起");
}
}
```
### 3.启动实例流程
```
startProcessInstanceByKey("", )
```
启动一个流程实例
第一个参数 是启动的流程定义的键(流程名称)
第二个参数 可选参数,表示与流程实例相关联的业务关键字
示例:
```java
/**
* 启动流程实例添加businessKey
*/
@Test
public void startUpProcessAddBusinessKey() {
String businessKey = "1";
// 启动流程实例指定业务标识businessKey也就是请假申请单id
ProcessInstance processInstance = runtimeService.
startProcessInstanceByKey("leave", businessKey);
// 输出
System.out.println("业务id:" + processInstance.getBusinessKey());
}
```
### 4.查询流程定义
```java
runtimeService.createProcessInstanceQuery()
```
创建流程实例查询对象
```java
processInstanceId()
```
设置流程实例ID为查询条件
参数 是流程实例ID
```java
singleResult()
```
执行查询并返回单个结果,即符合条件的唯一流程实例
```java
/**
* 单个流程挂起
*/
@Test
public void SingleSuspendProcessInstance() {
String processInstanceId = "ce1f3cc0-08cf-11ee-b8cb-e645a9a03302";
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
//获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的
boolean suspended = processInstance.isSuspended();
if (suspended) {
//单个流程激活
runtimeService.activateProcessInstanceById(processInstanceId);
System.out.println("流程实例:" + processInstanceId + "激活");
} else {
//单个流程挂起
runtimeService.suspendProcessInstanceById(processInstanceId);
System.out.println("流程实例:" + processInstanceId + "挂起");
}
}
```
## 3、任务服务 taskService
### 1.完成任务
```java
complete()
```
用于完成当前用户任务的方法
参数 任务ID
示例:
```java
/**
* 完成任务
*/
@Test
public void completTask() {
//要查询的负责人
Task task = taskService.createTaskQuery().taskAssignee("zhangsan").singleResult();//返回一条
//完成任务,参数任务id
taskService.complete(task.getId());
}
```
### 2.查询当前个人待执行任务
```java
createTaskQuery
```
创建任务查询对象
taskAssignee(assignee)
设置任务负责人的查询条件
参数 是查询的任务负责人的名称
```
list()
```
执行查询操作并返回查询结果
示例:
```java
/**
* 查询当前个人待执行的任务 zhangsan
*/
@Test
public void findPendingTaskList() {
//任务负责人
String assignee = "zhangsan";
List<Task> list = taskService.createTaskQuery()
.taskAssignee(assignee)//只查询该任务负责人的任务
.list();
for (Task task : list) {
System.out.println("流程实例id" + task.getProcessInstanceId());
System.out.println("任务id" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
```
## 4、历史服务 historyService
### 1.查询已处理任务
```java
createHistoricTaskInstanceQuery()
```
创建一个历史任务实例查询对象,用于执行历史任务的查询操作
```java
taskAssignee("")
```
设置查询条件,只返回指定负责人的历史任务
参数 是指定负责人的名称
```java
finished()
```
只返回已完成的历史任务
```java
list()
```
执行查询操作并返回查询结果
示例:
```java
/**
* 查询已处理历史任务
*/
@Test
public void findProcessedTaskList() {
//张三已处理过的历史任务
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().taskAssignee("zhangsan").finished().list();
for (HistoricTaskInstance historicTaskInstance : list) {
System.out.println("流程实例id" + historicTaskInstance.getProcessInstanceId());
System.out.println("任务id" + historicTaskInstance.getId());
System.out.println("任务负责人:" + historicTaskInstance.getAssignee());
System.out.println("任务名称:" + historicTaskInstance.getName());
}
}
```