由于项目中有获取当前节点的下一个任务节点的信息这个需求,主要思路如下:
- 根据传入的任务获取流程定义信息(因为获取流程图里的所有节点)
- 获取当前任务的activityId(为了得到任务的所在节点)
- 获取当前节点的出线
- 判断出线的条线,如果出线只有一条,则直接取出线所指向的节点
- 如果出线有多条,说明有分支,需要判断满足哪个分支的条件,再取得分支对应的节点
- 取出节点后需要判断是否为网关节点,如果是网关节点,则需要重复步骤5
- 如果节点为任务节点,则返回
直接上代码吧
/**
* 获取当前任务节点的下一个任务节点
*
* @param task 当前任务节点
* @return 下个任务节点
* @throws Exception
*/
public static FlowElement getNextUserFlowElement(org.activiti.api.task.model.Task task) throws Exception {
// 取得已提交的任务
HistoricTaskInstance historicTaskInstance = activitiUtil.historyService.createHistoricTaskInstanceQuery()
.taskId(task.getId()).singleResult();
// 获得流程定义
ProcessDefinition processDefinition = activitiUtil.repositoryService.getProcessDefinition(historicTaskInstance.getProcessDefinitionId());
//获得当前流程的活动ID
ExecutionQuery executionQuery = activitiUtil.runtimeService.createExecutionQuery();
Execution execution = executionQuery.executionId(historicTaskInstance.getExecutionId()).singleResult();
String activityId = execution.getActivityId();
UserTask userTask = null;
while (true) {
//根据活动节点获取当前的组件信息
FlowNode flowNode = getFlowNode(processDefinition.getId(), activityId);
//获取该节点之后的流向
List<SequenceFlow> sequenceFlowListOutGoing = flowNode.getOutgoingFlows();
// 获取的下个节点不一定是userTask的任务节点,所以要判断是否是任务节点
if (sequenceFlowListOutGoing.size() > 1) {
// 如果有1条以上的出线,表示有分支,需要判断分支的条件才能知道走哪个分支
// 遍历节点的出线得到下个activityId
activityId = getNextActivityId(execution.getId(),
task.getProcessInstanceId(), sequenceFlowListOutGoing);
} else if (sequenceFlowListOutGoing.size() == 1) {
// 只有1条出线,直接取得下个节点
SequenceFlow sequenceFlow = sequenceFlowListOutGoing.get(0);
// 下个节点
FlowElement flowElement = sequenceFlow.getTargetFlowElement();
if (flowElement instanceof UserTask) {
// 下个节点为UserTask时
userTask = (UserTask) flowElement;
System.out.println("下个任务为:" + userTask.getName());
return userTask;
} else if (flowElement instanceof ExclusiveGateway) {
// 下个节点为排它网关时
ExclusiveGateway exclusiveGateway = (ExclusiveGateway) flowElement;
List<SequenceFlow> outgoingFlows = exclusiveGateway.getOutgoingFlows();
// 遍历网关的出线得到下个activityId
activityId = getNextActivityId(execution.getId(), task.getProcessInstanceId(), outgoingFlows);
}
} else {
// 没有出线,则表明是结束节点
return null;
}
}
}
- /**
- * 获取当前任务节点的下一个任务节点
- *
- * @param task 当前任务节点
- * @return 下个任务节点
- * @throws Exception
- */
- public static FlowElement getNextUserFlowElement(org.activiti.api.task.model.Task task) throws Exception {
- // 取得已提交的任务
- HistoricTaskInstance historicTaskInstance = activitiUtil.historyService.createHistoricTaskInstanceQuery()
- .taskId(task.getId()).singleResult();
- // 获得流程定义
- ProcessDefinition processDefinition = activitiUtil.repositoryService.getProcessDefinition(historicTaskInstance.getProcessDefinitionId());
- //获得当前流程的活动ID
- ExecutionQuery executionQuery = activitiUtil.runtimeService.createExecutionQuery();
- Execution execution = executionQuery.executionId(historicTaskInstance.getExecutionId()).singleResult();
- String activityId = execution.getActivityId();
- UserTask userTask = null;
- while (true) {
- //根据活动节点获取当前的组件信息
- FlowNode flowNode = getFlowNode(processDefinition.getId(), activityId);
- //获取该节点之后的流向
- List<SequenceFlow> sequenceFlowListOutGoing = flowNode.getOutgoingFlows();
- // 获取的下个节点不一定是userTask的任务节点,所以要判断是否是任务节点
- if (sequenceFlowListOutGoing.size() > 1) {
- // 如果有1条以上的出线,表示有分支,需要判断分支的条件才能知道走哪个分支
- // 遍历节点的出线得到下个activityId
- activityId = getNextActivityId(execution.getId(),
- task.getProcessInstanceId(), sequenceFlowListOutGoing);
- } else if (sequenceFlowListOutGoing.size() == 1) {
- // 只有1条出线,直接取得下个节点
- SequenceFlow sequenceFlow = sequenceFlowListOutGoing.get(0);
- // 下个节点
- FlowElement flowElement = sequenceFlow.getTargetFlowElement();
- if (flowElement instanceof UserTask) {
- // 下个节点为UserTask时
- userTask = (UserTask) flowElement;
- System.out.println("下个任务为:" + userTask.getName());
- return userTask;
- } else if (flowElement instanceof ExclusiveGateway) {
- // 下个节点为排它网关时
- ExclusiveGateway exclusiveGateway = (ExclusiveGateway) flowElement;
- List<SequenceFlow> outgoingFlows = exclusiveGateway.getOutgoingFlows();
- // 遍历网关的出线得到下个activityId
- activityId = getNextActivityId(execution.getId(), task.getProcessInstanceId(), outgoingFlows);
- }
- } else {
- // 没有出线,则表明是结束节点
- return null;
- }
- }
- }
/**
* 获取当前任务节点的下一个任务节点
*
* @param task 当前任务节点
* @return 下个任务节点
* @throws Exception
*/
public static FlowElement getNextUserFlowElement(org.activiti.api.task.model.Task task) throws Exception {
// 取得已提交的任务
HistoricTaskInstance historicTaskInstance = activitiUtil.historyService.createHistoricTaskInstanceQuery()
.taskId(task.getId()).singleResult();
// 获得流程定义
ProcessDefinition processDefinition = activitiUtil.repositoryService.getProcessDefinition(historicTaskInstance.getProcessDefinitionId());
//获得当前流程的活动ID
ExecutionQuery executionQuery = activitiUtil.runtimeService.createExecutionQuery();
Execution execution = executionQuery.executionId(historicTaskInstance.getExecutionId()).singleResult();
String activityId = execution.getActivityId();
UserTask userTask = null;
while (true) {
//根据活动节点获取当前的组件信息
FlowNode flowNode = getFlowNode(processDefinition.getId(), activityId);
//获取该节点之后的流向
List<SequenceFlow> sequenceFlowListOutGoing = flowNode.getOutgoingFlows();
// 获取的下个节点不一定是userTask的任务节点,所以要判断是否是任务节点
if (sequenceFlowListOutGoing.size() > 1) {
// 如果有1条以上的出线,表示有分支,需要判断分支的条件才能知道走哪个分支
// 遍历节点的出线得到下个activityId
activityId = getNextActivityId(execution.getId(),
task.getProcessInstanceId(), sequenceFlowListOutGoing);
} else if (sequenceFlowListOutGoing.size() == 1) {
// 只有1条出线,直接取得下个节点
SequenceFlow sequenceFlow = sequenceFlowListOutGoing.get(0);
// 下个节点
FlowElement flowElement = sequenceFlow.getTargetFlowElement();
if (flowElement instanceof UserTask) {
// 下个节点为UserTask时
userTask = (UserTask) flowElement;
System.out.println("下个任务为:" + userTask.getName());
return userTask;
} else if (flowElement instanceof ExclusiveGateway) {
// 下个节点为排它网关时
ExclusiveGateway exclusiveGateway = (ExclusiveGateway) flowElement;
List<SequenceFlow> outgoingFlows = exclusiveGateway.getOutgoingFlows();
// 遍历网关的出线得到下个activityId
activityId = getNextActivityId(execution.getId(), task.getProcessInstanceId(), outgoingFlows);
}
} else {
// 没有出线,则表明是结束节点
return null;
}
}
}
配合代码里的注释应该不难理解整个过程,完整代码可以参照我的github地址
https://github.com/zhoupeng20188/activitispringboot/blob/master/src/main/java/com/zp/activitispringboot/utils/ActivitiUtil.java
2022年9月7日 下午5:39 沙发
会发生死循环
2022年9月7日 下午5:38 板凳
会陷入死循环