flowable返回可回退节点列表(完美解决)
flowable返回可回退节点列表当前flowable版本6.6.0最近在做flowable回退到任意节点的时候遇到一个问题:当流为: A → B → C → D → E举例一:① A、B、C、D 完成后,从E 驳回到 B② B 完成到C③现在 C 想要驳回到之前任意节点,在获取可回退节点列表的时候遇到问题初始方案:之前获取可回退节点的关键代码为:// 查询历史节点实例List<Histor
·
flowable返回可回退节点列表
当前flowable版本6.6.0
最近在做flowable回退到任意节点的时候遇到一个问题:
当流为: A → B → C → D → E
举例一:
① A、B、C、D 完成后,从E 驳回到 B
② B 完成后到达C
③现在 C 想要驳回到之前任意节点,在获取可回退节点列表的时候遇到问题
问题为返回了 C 之后的节点,这并不是我们想要的
初始方案:
之前获取可回退节点的关键代码为:
// 查询历史节点实例
List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(task.getProcessInstanceId())
.finished()
.orderByHistoricActivityInstanceEndTime().asc().list();
// 可回退任务节点列表
List<String> activityIdList = activityInstanceList.stream()
// 仅获取 开始节点 和 用户任务节点
.filter(activityInstance -> BpmnXMLConstants.ELEMENT_TASK_USER.equals(activityInstance.getActivityType()) || BpmnXMLConstants.ELEMENT_EVENT_START.equals(activityInstance.getActivityType()))
.map(HistoricActivityInstance::getActivityId)
.filter(activityId -> !taskDefinitionKey.equals(activityId))
.distinct()
.collect(Collectors.toList());
初始方案,遇到上述【举例一】的时候返回可驳回 A B D E 四个节点,这不是我们想要的结果。
现在在 C 节点,最终返回可驳回的节点列表的结果应该是 A B
最终解决方案:
// 获取传入的当前任务id
String taskId = operationTask.getTaskId();
// 初始化返回结果列表
List<WorkFlowNodeDTO> result = new ArrayList<>(16);
if (StringUtils.isBlank(taskId)){
return result;
}
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task == null){
return result;
}
// 任务定义key 等于 当前任务节点id
String taskDefinitionKey = task.getTaskDefinitionKey();
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
Process mainProcess = bpmnModel.getMainProcess();
// 当前节点
FlowNode currentFlowElement = (FlowNode) mainProcess.getFlowElement(taskDefinitionKey, true);
// 查询历史节点实例
List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(task.getProcessInstanceId())
.finished()
.orderByHistoricActivityInstanceEndTime().asc().list();
List<String> activityIdList = activityInstanceList.stream()
.filter(activityInstance ->
BpmnXMLConstants.ELEMENT_TASK_USER.equals(activityInstance.getActivityType()) || BpmnXMLConstants.ELEMENT_EVENT_START.equals(activityInstance.getActivityType()))
.map(HistoricActivityInstance::getActivityId)
.filter(activityId -> !taskDefinitionKey.equals(activityId))
.distinct()
.collect(Collectors.toList());
for (String activityId : activityIdList) {
// 回退到主流程的节点
FlowNode toBackFlowElement = (FlowNode) mainProcess.getFlowElement(activityId, true);
// 判断 【工具类判断是否可以从源节点 到 目标节点】
Set<String> set = new HashSet<>();
if (toBackFlowElement != null && ExecutionGraphUtil.isReachable(mainProcess,toBackFlowElement,currentFlowElement, set)) {
WorkFlowNodeDTO workFlowNodeDTO = new WorkFlowNodeDTO();
workFlowNodeDTO.setNodeId(activityId);
workFlowNodeDTO.setNodeName(toBackFlowElement.getName());
result.add(workFlowNodeDTO);
}
}
关键代码分析:
// 这是flowable自带工具类,当前flowable版本 6.6.0
// 【判断模型图中是否可以从 一个节点(toBackFlowElement) 到达 目标节点(currentFlowElement)】
ExecutionGraphUtil.isReachable(mainProcess,toBackFlowElement,currentFlowElement, set)
通过判断模型图中,一个节点是否可以达到当前节点 成功 过滤之后的节点,解决问题。
这种方案在遇到【举例一】情况的时候,处在C节点的时候能够成功返回 A B 两个节点
更多推荐
已为社区贡献5条内容
所有评论(0)