bpmn.js--获取当前节点下一节点,上一节点

需求背景:

在以bpmn.js为框架基础的流程编辑器开发中,遇到一个需求,需要获取与开始节点直连的用户任务节点。如果是单任务简单流程,直连的用户任务节点只有一个。如果遇到了复杂的网关,可能有多个用户任务节点。

分析

首先以一个简单流程为例,只有一个开始节点,结束节点,一个用户任务节点,两条连接线
在这里插入图片描述

我们打印出流程中所有节点,观察一下数据。

 modeler.get("elementFactory")    //获取所有节点

在这里插入图片描述可以看到,用户任务节点里,有一个incoming和outgoing。incoming里是进来的连接线,outgoing是出来的连接线。同理,我们找到开始节点对应的出去的连接线,是这一条
在这里插入图片描述
我们找到开始节点出来的这条线,对应的节点,观察数据
在这里插入图片描述
可以看到开始节点出来的这条线,节点属性里有一个target,target里放得就是这条线要通向的节点,也就是用户任务1.
那么思路就清晰了,要找到开始节点直连了哪些用户任务节点,找到从开始节点的出来的那条线的target,就能找到对应的用户任务节点。
如果遇到网关也不用怕,比如这种
在这里插入图片描述
判断开始节点出来的连接线的target的类型,是不是usertask,如果是网关类型,找网关节点的outgoing,看里面有几条线,再在每条线里找对应的target,就能得到要的用户任务节点。

贴一下代码

代码我们写的时候有封装,大家看懂原理,对应在项目里就知道怎么改了。

const getFirstTasks = () => {
  console.log(BpmnHelper.getModeler().get('elementRegistry'),"所有标签")
  let firstTasksList:any = [];
  //开始节点的出线
  const firstFlow = BpmnHelper.getModeler().get('elementRegistry').find(function (item) {
    return item.type == "bpmn:StartEvent";
  })?.outgoing[0];
  if(firstFlow && firstFlow.target && firstFlow.target.type == 'bpmn:UserTask') {
    firstTasksList.push(firstFlow.target)
  }else{
    //开始节点连接网关
    firstFlow.target?.outgoing.forEach(ele => {
      firstTasksList.push(ele.target)
    });
  }
  return firstTasksList;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值