ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

跳转到任意节点实现(回退到某个节点)

2022-07-05 11:41:00  阅读:304  来源: 互联网

标签:currentFlowNode String 当前任务 taskId 跳转 回退 节点


跳转到任意节点实现(回退到某个节点)

需求:如下,执行到节点4的时候,我任务不符合要求,需要驳回/回退到节点1重新开始审批

image-20220705112119484

实现思路:

  • 将所有的节点设置一个唯一的id,作为跳转的标识
  • 首先自己查询出所有执行过的节点,也就是审批节点5之前的节点列表(里面包含每个节点的唯一id/key)
    --->可以从自己的业务系统表或者从activiti的历史任务表查
  • 选择一个回退的节点,
  • 完成当前任务,并设置当前节点的流向为选择的回退节点即可,
    注意设置好并执行完回退操作后,记得把当前节点的流向恢复成原来的,不然下次进来的时候会自动扭转到回退节点(因为这里的设置针对的是流程图,而不是流程实例)**

给每个节点设置唯一的id

image-20220705105948711

回退接口实现

 /**
     * 
     * @param taskId 当前任务id
     * @param nodeId 回退的节点id
     */
    @GetMapping("/backToEveryNode")
    @ApiOperation(value = "完成当前任务  并   回退到任意节点")
    public void backToEveryNode(String taskId,String nodeId) {


        //当前任务信息
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();

        //获得当前流程的活动ID
        ExecutionQuery executionQuery = runtimeService.createExecutionQuery();
        Execution execution = executionQuery.executionId(task.getExecutionId()).singleResult();
        String activityId = execution.getActivityId();


        //获取当前节点和目标节点的节点信息
        FlowNode currentFlowNode = getFlowNode(task.getProcessDefinitionId(), activityId);
        FlowNode targetFlowNode = getFlowNode(task.getProcessDefinitionId(), nodeId);

        //获取当前节点的原始流出节点信息
        List<SequenceFlow> oldFlowNodeOutgoingFlows = currentFlowNode.getOutgoingFlows();


        //重新设置流出节点信息  为退回的节点
        SequenceFlow sequenceFlow = new SequenceFlow();
        sequenceFlow.setId("newTempSequenceId");
        sequenceFlow.setSourceFlowElement(currentFlowNode);
        sequenceFlow.setTargetFlowElement(targetFlowNode);//设置流出节点信息  为退回的节点
        List<SequenceFlow> newSequenceFlows = new ArrayList<>();
        newSequenceFlows.add(sequenceFlow);
        currentFlowNode.setOutgoingFlows(newSequenceFlows);

        //完成当前任务
        taskService.complete(taskId);

        //最后恢复原来的流转走向
        currentFlowNode.setOutgoingFlows(oldFlowNodeOutgoingFlows);
    }

    private FlowNode getFlowNode(String processDefinitionId, String activityId) {
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
        return (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId);
    }

标签:currentFlowNode,String,当前任务,taskId,跳转,回退,节点
来源: https://www.cnblogs.com/cutesheep/p/16445793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有