可以利用 taskService 的 createTaskQuery() 方法,来获取某个流程节点的 Task 对象。
/**
* 查找任务
*
* @param executionId Execution 实例 ID
* @param activityName 活动名称
* @return 任务
*/
public Task findTask(String executionId, String activityName) {
try {
List<Task> tasks = taskService.createTaskQuery().activityName(activityName)
.executionId(executionId).orderDesc("createTime").list();
if (tasks == null || tasks.isEmpty()) {
return null;
}
if (tasks.size() > 1) {
logger.warn("activityName" +
":" + activityName + " 任务数大于 1,取最新创建的第一个任务");
}
return tasks.get(0);
} catch (Exception e) {
logger.error("查找任务;executionId:" + executionId, e);
return null;
}
}
/**
* 查找任务
*
* @param processInstance 流程实例
* @param activityName 活动名称
* @return 任务
*/
public Task findTask(ProcessInstance processInstance, String activityName) {
Execution execution = processInstance.findActiveExecutionIn
(activityName);
return findTask(execution.getId(), activityName);
}
createTaskQuery() 方法支持链式编程方式,我们在此传入节点名称(activityName)与流程实例 ID(executionId)作为查询条件,并以创建时间作为倒序顺序排列。
orderDesc() 方法还支持 Task 对象的这些字段作为排序条件:name、assignee、createTime、duedate、priority、progress。
除非存在并发执行的流程,否则一个流程实例,在某个流程节点上,至多存在一个 Task 对象。所以,上述封装的代码适用于一般场景。