activiti总结(二)常用API
一、查询所有已定义的流程
查询已定义的流程通过repositoryService.createProcessDefinitionQuery()
创建一个流程定义查询器,查询器可以设置很多查询条件。
下面是一个查询的例子:
public
List getAllProcess() {
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//添加排序条件
query.orderByProcessDefinitionVersion().desc();
// //添加分页查询
query.listPage(0, 10);
List list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getKey());
}
return list;
}
复制代码
上面的代码中只有两种查询条件,更多的查询方式可以参照activiti文档
通过文档可以很显然的发现,定义查询支持链式查询(activiti中的查询都支持链式查询)
二、创建流程实例
创建流程实例使用runtimeService.startProcessInstanceByKey
方法,这个方法被重载了很多次,支持多种方式创建流程实例。详细可以参照activiti文档。
//设置流程创建者
identityService.setAuthenticatedUserId(userId);
//创建流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, vars);
//返回流程实例id
return processInstance.getId();
复制代码
- 创建流程实例之前可以使用
identityService.setAuthenticatedUserId
方法设置流程创建者。 - 实例创建完成后会自动流转到流程的第一个任务。
- 创建实例的方法有多个,可以用根据key定义来创建实例,也可以根据流程id来创建实例,根据流程key创建流程会默认使用流程的最新版本。
- 流程被重新定义后,已被创建的流程不受影响
三、根据任务完成人查询任务
和任务(task)有关的API通常是通过TaskService来调用,查询任务之前首先要使用createTaskQuery
方法来创建一个任务查询器,然后设置查询条件,详细api解释可查看activiti官方文档。
/**
* 根据任务完成人查询任务
* @param assignee 任务完成者
*/
@Override
public void queryTasks(String assignee) {
TaskQuery taskQuery = taskService.createTaskQuery();
//添加查询条件 办理人
taskQuery.taskAssignee(assignee);
//查询所有
List list = taskQuery.list();
for (Task task : list) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(task.getProcessInstanceId()).singleResult();
System.out.println("任务id:" + task.getId() + "-----任务名称:" + task.getName() + "------任务完成者" +
task.getAssignee() + "------任务所有(指派)者" + task.getOwner() + "-------流程创建人" + processInstance.getStartUserId());
task.getProcessVariables();
}
}
复制代码
四、认领和完成任务
claim
和complete
函数。
/**
* 认领任务
* @param taskId 任务id
* @param assignee 任务认领人
*/
@Override
public void claimTask(String taskId, String assignee) {
taskService.claim(taskId, assignee);
}
/**
* 完成任务
* @param taskId 任务id
* @param varis 添加流程控制变量
*/
@Override
public void completeTask(String taskId, HashMap varis) {
taskService.complete(taskId, varis);
}
复制代码
- 使用
claim
方法时要注意,已经设置过了Assignee的任务再次调用claim
方法时会报错。
五、查询正在进行的流程实例
查询正在进行的流程相关的api通常是通过RuntimeService来调用。查询流程实例之前一样要创建流程查询器,然后设置查询条件。API的详细使用可以参照官方文档。
/**
* 查询正在进行的流程实例
* @param params 查询参数:包括userId, processInstanceId等字段
*/
@Override
public void queryProcess(HashMap params) {
//获取流程实例查询器
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
for(String key : params.keySet()){
if (key.equals("userId")) {//根据用户id查询
processInstanceQuery.involvedUser(params.get(key).toString());//用户id
}
else if(key.equals("processInstanceId")){
processInstanceQuery.processInstanceId(params.get(key).toString());//用户id
}
}
List processInstances = processInstanceQuery.list();
for (ProcessInstance processInstance : processInstances) {
System.out.println("流程实例ID:" + processInstance.getId() + "------>" +
"流程定义ID:" + processInstance.getProcessDefinitionId() + "------>" +
"流程开始时间:" + processInstance.getStartTime() + "------>" +
"流程创建者:" + processInstance.getStartUserId() + "------>" +
"当前任务:" + processInstance.getActivityId()
);
}
}
复制代码
六、查询历史流程 与 查询历史任务
- 查询历史流程相关的api通常是通过
HistoryService
来调用。查询历史流程实例之前一样要创建流程查询器,然后设置查询条件。API的详细使用可以参照官方文档。
/**
* 查询历史流程
* @param params 查询参数:包括userId等字段
*/
@Override
public void queryHistoricProcess(HashMap params) {
HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery();
for(String key : params.keySet()){
if (key.equals("userId")) {//根据用户id查询
processInstanceQuery.involvedUser(params.get(key).toString());//用户id
}
}
processInstanceQuery.finished();//已结束的流程
List processInstances = processInstanceQuery.list();
for (HistoricProcessInstance processInstance : processInstances) {
System.out.println("流程实例ID:" + processInstance.getId() + "------>" +
"流程定义ID:" + processInstance.getProcessDefinitionId() + "------>" +
"流程开始时间:" + processInstance.getStartTime() + "------>" +
"流程结束时间:" + processInstance.getEndTime() + "------>" +
"流程创建者:" + processInstance.getStartUserId());
}
}
复制代码
- 默认情况下,历史流程查询器会将所有流程都查询出来,包括正在运行的和已经结束的流程。
- 查询历史任务与查询历史流程类似
/**
* 根据任务Assignee查询历史任务(或根据任务Owner查询任务)
*/
@Override
public void queryHistoricTasks(String assignee, String owner) {
//创建历史任务查询器
HistoricTaskInstanceQuery historicTaskInstancesQuery = historyService.createHistoricTaskInstanceQuery();
//根据任务完成人查询
historicTaskInstancesQuery.taskAssignee(assignee);
//根据任务所有人查询
historicTaskInstancesQuery.taskOwner(owner);
List historicTaskInstances = historicTaskInstancesQuery.list();
for(HistoricTaskInstance pi:historicTaskInstances){
System.out.println("任务实例ID:" + pi.getId() + "------>" +
"任务定义ID" + pi.getProcessDefinitionId() + "------>" +
"任务名称:"+pi.getName() + "------>" +
"代理人:"+pi.getAssignee() + "------>" +
"任务所有者:" + pi.getOwner()
);
}
}
复制代码
七、撤销一个流程
撤销流程实际上是对一个未结束的流程做删除操作,代码如下
/**
* 根据流程实例id撤销一个流程
* @param processInstanceId 流程实例id
* @param taskId 若传入的流程实例id为空,则使用任务实例id来撤销一个流程
* @param reason 流程删除原因
*/
public void deleteProcess(String processInstanceId, String taskId, String reason){
if(processInstanceId != null){
runtimeService.deleteProcessInstance(processInstanceId, reason);
}
else{
//根据任务实例id获取任务实例
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
//根据任务实例获取任务所在的流程实例id
runtimeService.deleteProcessInstance(task.getProcessInstanceId(), reason);
}
}
复制代码