flowable返回可回退节点列表(完美解决)

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 两个节点

你可以按照以下步骤来安装conda、torchcudacudnn: 1. 首先,安装Anaconda或Miniconda,这是一个用于管理Python环境和软件包的工具。你可以从Anaconda官方网站(https://www.anaconda.com)下载适合你操作系统的版本,并按照官方文档的说明进行安装。 2. 安装CUDA(Compute Unified Device Architecture),这是一个用于利用NVIDIA GPU进行并行计算的平台。你可以从NVIDIA官方网站(https://developer.nvidia.com/cuda-downloads)下载适合你操作系统和GPU的CUDA版本,并按照官方文档的说明进行安装。 3. 安装cuDNNCUDA Deep Neural Network library),这是NVIDIA提供的针对深度神经网络的加速库。你需要先注册一个NVIDIA开发者账号,然后从NVIDIA开发者网站(https://developer.nvidia.com/cudnn)下载适合你CUDA版本的cuDNN,并按照官方文档的说明进行安装。 4. 创建一个新的conda环境,并安装PyTorch。你可以使用以下命令创建一个名为"myenv"的新环境: ``` conda create --name myenv ``` 接下来,激活这个环境: ``` conda activate myenv ``` 然后,安装PyTorch和相应的CUDA版本,比如PyTorch 1.9.0: ``` conda install pytorch==1.9.0 torchvision torchaudio cudatoolkit=<your_cuda_version> -c pytorch ``` 记得将`<your_cuda_version>`替换为你安装CUDA版本,比如`10.2`。 现在,你已经成功安装了conda、torchcudacudnn,并创建了一个新的conda环境,其中包含了PyTorch和相关依赖。你可以在这个环境中进行深度学习任务了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值