ACTIVITI6实现预测下一个节点的名称
实现预测下一节点名称
需要根据排他网关进行逻辑代码的更改,我这里只是用了变量isPass判断是否通过还是驳回
public String getNextTaskGroup(String instanceId) {
Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult();
if (task == null) {
throw new RuntimeException("流程未启动或已执行完成");
}
// 取得已提交的任务
HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
.taskId(task.getId()).singleResult();
//获取流程定义
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicTaskInstance.getProcessDefinitionId());
//获得当前流程的活动ID
Execution execution = runtimeService.createExecutionQuery().executionId(historicTaskInstance.getExecutionId()).singleResult();
String activityId = execution.getActivityId();
UserTask userTask = null;
int count = 0;
while (true) {
//根据活动节点获取当前的组件信息
count++;
FlowNode flowNode;
try {
flowNode = getFlowNode(processDefinition.getId(), activityId);
} catch (RuntimeException e) {
continue;
}
//获取该流程组件的之后/之前的组件信息
List<SequenceFlow> sequenceFlowListOutGoing = flowNode.getOutgoingFlows();
//获取的下个节点不一定是userTask的任务节点,所以要判断是否是任务节点
//sequenceFlowListOutGoing数量可能大于1,可以自己做判断,此处只取第一个
FlowElement flowElement = null;
if (sequenceFlowListOutGoing.size() == 1) {
flowElement = sequenceFlowListOutGoing.get(0).getTargetFlowElement();
} else {
for (SequenceFlow item : sequenceFlowListOutGoing) {
String conditionExpression = item.getConditionExpression();
if ("${isPass}".equals(conditionExpression)) {
flowElement = item.getTargetFlowElement();
}
}
}
if (flowElement instanceof UserTask) {
userTask = (UserTask) flowElement;
return userTask.getName();
} else {
//下一节点不是任务userTask的任务节点,所以要获取再下一个节点的信息,直到获取到userTask任务节点信息
activityId = flowElement.getId();
}
if (count > 5) {
//极限寻找5次,超过5次直接返回
return "";
}
}
}