camunda根据当前任务id获取下一步审批节点

该代码段实现了一个功能,根据当前任务ID获取BPMN流程中的下一个审批节点。它首先查询历史任务实例,然后基于流程定义获取BPMN模型实例,进一步找出用户任务的后续序列流。如果目标节点是排他网关,则处理其所有出站序列流;如果是用户任务,直接添加到节点列表。此外,还包含了生成任务节点信息及获取任务办理人的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 /**
     * 根据当前任务id获取下一步审批节点
     *
     * @param taskId
     * @return
     */
    @Override
    public List<Map<String, String>> getNextAuditNodes(String taskId) {
        HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult();
        if (Objects.isNull(historicTask)) {
            return null;
        }

        ProcessDefinition processDefinition = getByKey(historicTask.getProcessDefinitionKey());
        BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(processDefinition.getId());
        UserTask userTask = bpmnModelInstance.getModelElementById(historicTask.getTaskDefinitionKey());
        Collection<SequenceFlow> outgoing = userTask.getOutgoing();
        Iterator<SequenceFlow> iterator = outgoing.stream().iterator();
        List<Map<String, String>> nodeList = new ArrayList<>();
        while (iterator.hasNext()) {
            SequenceFlow flow = iterator.next();
            FlowNode target = flow.getTarget();
            if ("exclusiveGateway".equals(target.getElementType().getTypeName())) {
                Collection<SequenceFlow> targetOutgoing = target.getOutgoing();
                Iterator<SequenceFlow> targetIt = targetOutgoing.stream().iterator();
                while (targetIt.hasNext()) {
                    SequenceFlow targetFlow = targetIt.next();
                    FlowNode gatewayTarget = targetFlow.getTarget();
                    Map<String, String> map = generateTaskNode(gatewayTarget);
                    if (!Objects.isNull(map)) {
                        nodeList.add(map);
                    }
                }
            } else if ("userTask".equals(target.getElementType().getTypeName())) {
                Map<String, String> map = generateTaskNode(target);
                if (!Objects.isNull(map)) {
                    nodeList.add(map);
                }
            }
        }
        return nodeList;
    }


    /**
     * 生成任务节点
     *
     * @param target
     * @return
     */
    public Map<String, String> generateTaskNode(FlowNode target) {
        if ("userTask".equals(target.getElementType().getTypeName())) {
            Map<String, String> map = new HashMap<>();
            map.put("value", target.getId());
            map.put("label", target.getName());
            map.put("assignee", getTaskAssign(target));
            return map;
        }
        return null;
    }

    /**
     * 获取任务办理人
     *
     * @param target
     * @return
     */
    public String getTaskAssign(FlowNode target) {
        //代理人
        String assignee = target.getAttributeValueNs(BpmnModelConstants.CAMUNDA_NS, "assignee");
        if (StringUtils.isNotBlank(assignee)) {
            return assignee;
        } else {
            //代理人不存在,获取组任务办理人
            String candidateUsers = target.getAttributeValueNs(BpmnModelConstants.CAMUNDA_NS, "candidateUsers");
            if (StringUtils.isNotBlank(candidateUsers)) {
                return candidateUsers;
            } else {
                //如果组任务办理人不存在,获取多实例任务办理人
                MultiInstanceLoopCharacteristics modelElementInstance = (MultiInstanceLoopCharacteristics) target
                        .getUniqueChildElementByNameNs(BpmnModelConstants.BPMN20_NS, "multiInstanceLoopCharacteristics");
                if (!Objects.isNull(modelElementInstance)) {
                    return modelElementInstance.getAttributeValueNs(BpmnModelConstants.CAMUNDA_NS, "collection");
                }
                return null;
            }
        }
    }

Camunda Platform是一款流程管理平台,它允许开发者构建业务流程并进行查询和管理。在Camunda的查询中,如果你想要找出那些“审批部分已经通过”的流程实例节点,你可以使用历史活动查询(HistoricActivityInstanceQuery)。这个查询可以基于流程实例的状态过滤结果,比如检查每个任务是否已被参与者完成并提交(如"approved"状态)。 通常,你需要执行以下步骤: 1. 获取流程实例的历史记录:`HistoricProcessInstanceQuery`用于查询历史流程实例,然后可以根据流程实例ID获取其活动实例列表。 2. 遍历活动实例:对活动实例应用`HistoricActivityInstanceQuery#unfinished()`,只选择那些未结束的活动实例。 3. 检查任务状态:对于每个任务活动实例,检查其`HistoricTaskInstance#taskCompletionState()`是否为已完成,例如"COMPLETED"。 4. 过滤通过审批节点:筛选出状态为"COMPLETED"并且审批通过的任务。 ```java HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery() . unfinished(); // 查询所有未结束的流程实例 List<HistoricActivityInstance> activityInstances = processInstanceQuery.list(); for (HistoricActivityInstance activityInstance : activityInstances) { if (activityInstance.getTaskId() != null && activityInstance.getTaskCompletionState().equals("COMPLETED")) { HistoricTaskInstance taskInstance = historyService.createHistoricTaskInstanceQuery() .taskId(activityInstance.getTaskId()) .singleResult(); if (taskInstance != null && taskInstance.getExecutionVariables().containsKey("审批状态") && taskInstance.getExecutionVariables().get("审批状态").equals("通过")) { // 找到了审批已通过的节点 System.out.println("节点 " + activityInstance.getId() + " 已经通过审批"); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值