上一任务节点

在我的开发任务中,突然给我提出了一个待办任务需要获取当前任务节点下一任务节点的表单信息,刚开始搞得我有点措手不及,后来仔细是靠后,灵感一下,直接操作流程的bpmn信息就可以获取到节点信息嘛,顺着这个思路,我整理出了自己的思路:

(1)将节点大体分为两类,一类是网关节点,另外一类就是用户任务节点,使用List集合,将网关与用户任务进行分类

(2)获取上一节点,我们就需要从bpmn的连线信息入手,这次我们获取的是UserTask节点的出线,固定连线的sourceRef,辨别节点targtaetRef的类型,当是用户任务时,放进 List behildNodeIdlist= new ArrayList<>();,当是GateWay节点时,将sourceRef设为网关的,继续遍历下一节点,就是跳过网关节点,只要用户任务节点

 @Test
public void behindNode() {
// String nodeId="UserTask_0mkm9h7";
String nodeId = "UserTask_0mkm9h7";
String processInstanceId="2205001";
//网关集合
List<Gateway> gateways = new ArrayList<>();
//用户任务集合
List<UserTask> userTasks = new ArrayList<>(); //网关节点id
List<String> gatewayNodelIdList = new ArrayList<>();
//用户任务节点id
List<String> usertaskNodelIdList = new ArrayList<>(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
String processDefinitionId = processInstance.getProcessDefinitionId();
//ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
List<Process> processes = bpmnModel.getProcesses();
Process process = processes.get(0);
Collection<FlowElement> flowElements = process.getFlowElements();
//将网关信息与用户任务进行分类存储(放于JVM堆中)
flowElements.forEach(flowElement -> {
if (flowElement instanceof Gateway) {
gatewayNodelIdList.add(flowElement.getId());
gateways.add((Gateway) flowElement);
}
if (flowElement instanceof UserTask) {
usertaskNodelIdList.add(flowElement.getId());
userTasks.add((UserTask) flowElement);
}
}); //存放下一节点的nodeId(可能存在多个)
List<String> behildNodeIdlist = new ArrayList<>(); //变量所有的UserTask节点
for (UserTask userTask : userTasks) {
//获取UserTask节点的出线
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
for (SequenceFlow outgoingFlow : outgoingFlows) {
String sourceRef = outgoingFlow.getSourceRef();
String targetRef = outgoingFlow.getTargetRef();
//固定出线的(sourceRef)
if (nodeId.equals(sourceRef)) {
//当前节点的下一节点是网关,跳过
if (gatewayNodelIdList.contains(targetRef)) {
for (Gateway gateway : gateways) {
//获取网关的出线信息
List<SequenceFlow> outgoingFlowsGateWay = gateway.getOutgoingFlows();
for (SequenceFlow sequenceFlow : outgoingFlowsGateWay) {
String sourceRefGateWay = sequenceFlow.getSourceRef();
String targetRefGateWay = sequenceFlow.getTargetRef();
//定sourceRefGateWay
if (targetRef.equals(sourceRefGateWay)) {
behildNodeIdlist.add(targetRefGateWay);
}
}
}
} else {
behildNodeIdlist.add(targetRef);
}
}
} } behildNodeIdlist.forEach(System.out::println);
}

我使用的测试流程bpmn如下

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://activiti.org/bpmn">
<process id="Process_1" name="1023后台设计器测试数据HH" isExecutable="true">
<startEvent id="StartEvent_1b9bgjv" name="start"></startEvent>
<userTask id="UserTask_1wba62u" name="faqi" activiti:assignee="wuniting">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="SequenceFlow_1fnj22n" sourceRef="StartEvent_1b9bgjv" targetRef="UserTask_1wba62u"></sequenceFlow>
<parallelGateway id="ParallelGateway_0g393ev"></parallelGateway>
<userTask id="UserTask_1nt87by" name="tb1" activiti:assignee="wuniting">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<userTask id="UserTask_1xty4gu" name="tb2" activiti:assignee="zhangmiao">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<userTask id="UserTask_0y14rmq" name="sp1" activiti:assignee="wuniting">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<userTask id="UserTask_17jd9y1" name="sp2" activiti:assignee="zhangmiao">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<parallelGateway id="ParallelGateway_1qs7f87"></parallelGateway>
<endEvent id="EndEvent_0fo9mwb" name="交易完成"></endEvent>
<sequenceFlow id="SequenceFlow_1dkxqia" sourceRef="UserTask_1wba62u" targetRef="ParallelGateway_0g393ev"></sequenceFlow>
<sequenceFlow id="SequenceFlow_1pp85s1" sourceRef="ParallelGateway_0g393ev" targetRef="UserTask_1nt87by"></sequenceFlow>
<sequenceFlow id="SequenceFlow_1x051ae" sourceRef="ParallelGateway_0g393ev" targetRef="UserTask_1xty4gu"></sequenceFlow>
<sequenceFlow id="SequenceFlow_05zxco5" sourceRef="UserTask_1nt87by" targetRef="UserTask_0y14rmq"></sequenceFlow>
<sequenceFlow id="SequenceFlow_0bx5wt0" sourceRef="UserTask_1xty4gu" targetRef="UserTask_17jd9y1"></sequenceFlow>
<sequenceFlow id="SequenceFlow_0xgm2pr" sourceRef="UserTask_17jd9y1" targetRef="ParallelGateway_1qs7f87"></sequenceFlow>
<sequenceFlow id="SequenceFlow_1o2rph4" sourceRef="UserTask_0y14rmq" targetRef="ParallelGateway_1qs7f87"></sequenceFlow>
<sequenceFlow id="SequenceFlow_1hyky18" sourceRef="ParallelGateway_1qs7f87" targetRef="UserTask_0mkm9h7"></sequenceFlow>
<userTask id="UserTask_0mkm9h7" name="spe" activiti:assignee="wuniting">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="SequenceFlow_1smv331" sourceRef="UserTask_0mkm9h7" targetRef="EndEvent_0fo9mwb"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_Process_1">
<bpmndi:BPMNPlane bpmnElement="Process_1" id="BPMNPlane_Process_1">
<bpmndi:BPMNShape bpmnElement="StartEvent_1b9bgjv" id="BPMNShape_StartEvent_1b9bgjv">
<omgdc:Bounds height="36.0" width="36.0" x="182.0" y="222.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="UserTask_1wba62u" id="BPMNShape_UserTask_1wba62u">
<omgdc:Bounds height="80.0" width="100.0" x="270.0" y="200.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="ParallelGateway_0g393ev" id="BPMNShape_ParallelGateway_0g393ev">
<omgdc:Bounds height="50.0" width="50.0" x="425.0" y="215.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="UserTask_1nt87by" id="BPMNShape_UserTask_1nt87by">
<omgdc:Bounds height="80.0" width="100.0" x="540.0" y="140.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="UserTask_1xty4gu" id="BPMNShape_UserTask_1xty4gu">
<omgdc:Bounds height="80.0" width="100.0" x="540.0" y="260.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="UserTask_0y14rmq" id="BPMNShape_UserTask_0y14rmq">
<omgdc:Bounds height="80.0" width="100.0" x="710.0" y="140.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="UserTask_17jd9y1" id="BPMNShape_UserTask_17jd9y1">
<omgdc:Bounds height="80.0" width="100.0" x="710.0" y="260.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="ParallelGateway_1qs7f87" id="BPMNShape_ParallelGateway_1qs7f87">
<omgdc:Bounds height="50.0" width="50.0" x="865.0" y="205.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="EndEvent_0fo9mwb" id="BPMNShape_EndEvent_0fo9mwb">
<omgdc:Bounds height="36.0" width="36.0" x="1162.0" y="212.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="UserTask_0mkm9h7" id="BPMNShape_UserTask_0mkm9h7">
<omgdc:Bounds height="80.0" width="100.0" x="990.0" y="190.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1pp85s1" id="BPMNEdge_SequenceFlow_1pp85s1">
<omgdi:waypoint x="450.0" y="215.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="180.0"></omgdi:waypoint>
<omgdi:waypoint x="540.0" y="180.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_0xgm2pr" id="BPMNEdge_SequenceFlow_0xgm2pr">
<omgdi:waypoint x="810.0" y="300.0"></omgdi:waypoint>
<omgdi:waypoint x="890.0" y="300.0"></omgdi:waypoint>
<omgdi:waypoint x="890.0" y="255.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1dkxqia" id="BPMNEdge_SequenceFlow_1dkxqia">
<omgdi:waypoint x="370.0" y="240.0"></omgdi:waypoint>
<omgdi:waypoint x="425.0" y="240.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_05zxco5" id="BPMNEdge_SequenceFlow_05zxco5">
<omgdi:waypoint x="640.0" y="180.0"></omgdi:waypoint>
<omgdi:waypoint x="710.0" y="180.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1x051ae" id="BPMNEdge_SequenceFlow_1x051ae">
<omgdi:waypoint x="450.0" y="265.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="300.0"></omgdi:waypoint>
<omgdi:waypoint x="540.0" y="300.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1o2rph4" id="BPMNEdge_SequenceFlow_1o2rph4">
<omgdi:waypoint x="810.0" y="180.0"></omgdi:waypoint>
<omgdi:waypoint x="890.0" y="180.0"></omgdi:waypoint>
<omgdi:waypoint x="890.0" y="205.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_0bx5wt0" id="BPMNEdge_SequenceFlow_0bx5wt0">
<omgdi:waypoint x="640.0" y="300.0"></omgdi:waypoint>
<omgdi:waypoint x="710.0" y="300.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1smv331" id="BPMNEdge_SequenceFlow_1smv331">
<omgdi:waypoint x="1090.0" y="230.0"></omgdi:waypoint>
<omgdi:waypoint x="1162.0" y="230.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1fnj22n" id="BPMNEdge_SequenceFlow_1fnj22n">
<omgdi:waypoint x="218.0" y="240.0"></omgdi:waypoint>
<omgdi:waypoint x="270.0" y="240.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1hyky18" id="BPMNEdge_SequenceFlow_1hyky18">
<omgdi:waypoint x="915.0" y="230.0"></omgdi:waypoint>
<omgdi:waypoint x="990.0" y="230.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

Activit的心路历程:获取当前节点的下一节点【可能存在多个】的nodeId的更多相关文章

  1. javascript 获取dom书的下一个节点。

    利用javascript 写一个在页面点击加减按钮实现数字的累加.. 简略的html大概如此.看得懂就好不要在意这些细节啊 <input type="button" valu ...

  2. Activit的心路历程:获取当前节点的上一节点【可能存在多个】的nodeId

    在我的开发任务中,突然给我提出了一个待办任务需要获取当前任务节点上以任务节点的表单信息,刚开始搞得我有点措手不及,后来仔细是靠后,灵感一下,直接操作流程的bpmn信息就可以获取到节点信息嘛,顺着这个思 ...

  3. 优云老王的心路历程(二):下一站Web体验监控产品

    在上一篇文章中,和大家聊到了建立Web应用体验监控体系,经过了概念阶段,也完成了技术选型,就进入了把实质性的产品研发阶段.作为产品经理,时刻不敢忘记我们的产品目标:无限感知你的用户,建立完备的体验监控 ...

  4. 学习JS的心路历程-参数的传递(下)

    今天我们要来探讨JS到底是透过何种参数传递方式呢? 废话不多说,上示例!! 我们先声明原始型别和物件型别来看看两者是否会有不一样的差异: var myStr = 'Hola': var myObj = ...

  5. Activiti6.0获取下一节点任务的心路历程

    在我的开发任务中,我被分配了一个像下一个节点审批人发送短信的任务,这个任务看起来非常的简单,但在开发过程中遇到了许多的坑,在这里进行记录,如果你想要快速知道结果,请看代码版本(3). 首先,就是获取下 ...

  6. 同门不同类—创新Aurvana Live2/Air简评(附随身视听设备心路历程)

    (注,本文把live2/air并成一起写的,同时本人是木耳,请轻拍) 本命年各种坏东西,很是无语,终于坏到耳塞耳机了来了,之前用的拜亚DT235无缘无故就一边不响了,无奈只能扔了. 纠结了好几个月,终 ...

  7. 【剑指offer】08二叉树的下一个节点,C++实现

    原创博文,转载请注明出处! # 题目 父节点指向子节点的指针用实线表示,从子节点指向父节点的指针用虚线表示. # 思路 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点.例如,寻找b的下一 ...

  8. 剑指Offer的学习笔记(C#篇)-- 二叉树的下一个节点(好理解版本)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 一 . 理解题意 该题目我们可以借鉴一个非常影响不好的 ...

  9. 剑指offer笔记面试题8----二叉树的下一个节点

    题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 测试用例: 普通二叉树(完全二叉树,不完全二叉树). ...

随机推荐

  1. DM9000裸机驱动程序设计

    对于任何一个硬件模块的设计,首先第一步都是要先了解硬件本身后,再开始程序的软件设计.而由于DM9000的芯片文档内容很多,要驱动好网卡,需要很长时间,特别对于新手比较困难,所以可以参考linux内核代 ...

  2. C# 范型约束 new() 你必须要知道的事

    C# 范型约束 new() 你必须要知道的事 注意:本文不会讲范型如何使用,关于范型的概念和范型约束的使用请移步谷歌. 本文要讲的是关于范型约束无参构造函数 new 的一些底层细节和注意事项.写这篇文 ...

  3. 洛谷 P4819 [中山市选]杀人游戏(tarjan缩点)

    P4819 [中山市选]杀人游戏 思路分析 题意最开始理解错了(我太菜了) 把题意简化一下,就是找到可以确定杀手身份的最小的危险查看数 (就是不知道该村名的身份,查看他的身份具有危险的查看数量),用 ...

  4. MeteoInfoLab脚本示例:计算温度平流

    需要温度和风场U/V分量格点数据,计算中主要用到cdiff函数,结果用GrADS验证一致.脚本程序: print 'Open data files...' f_air = addfile('D:/Te ...

  5. Prometheus入门教程(三):Grafana 图表配置快速入门

    文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/sA0nYevO8yz6QLRz03qJSw 前面我们使用 Prometheus + Grafana ...

  6. Vue.js 3.0搭配.NET Core写一个牛B的文件上传组件

    在开发Web应用程序中,文件上传是经常用到的一个功能. 在Jquery时代,做上传功能,一般找jQuery插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...

  7. Go 包管理历史以及 Go mod 使用

    之前也写过 Go 管理依赖工具 godep 的使用,当时看 godep 使用起来还是挺方便,其原因主要在于有总比没有强.关于依赖管理工具其实还是想从头聊聊这个需求以及大家做这个功能的各种出发点. GO ...

  8. mapstruct 快速使用

    mapstruct 快速使用 mapstruct 主要的作用则是用来复制对象字段使用,功能非常的强大.在没有使用 mapstruct 之前可能都在使用 BeanUtils ,但是 BeanUtils ...

  9. web应用部署(Tomcat,springboot部署方式)

    转载自:https://www.cnblogs.com/haimishasha/p/10791454.html 核心内容 1.在Tomcat中有四种部署Web应用的方式,分别是: (1)利用Tomca ...

  10. MATLAB中的参数估计函数详解及调用示例【联合整理】

    前言 因为最近项目上的需要,才发现MATLAB的统计工具箱中的参数估计函数,觉得很简单很好用,现在把所有的参数估计函数整理一下,并在最后面附上调用示例. 参与人员 由于时间关系,这篇随笔是两个人一起整 ...