java中bpmn流程图_Activiti如何动态获取流程图过程详解
本文中使用的activiti版本是5.22.0
一、绘图原理
activiti中提供了一个可以用来绘制流程图的类DefaultProcessDiagramGenerator,这个类在5.22.0及以上的版本中
是以一个单独jar包的方式提供的,所以还需要引入相应的依赖。
org.activiti
activiti-image-generator
5.22.0
使用时先创建这个类的对象,
//这个类在5.22.0往上的版本中才有
DefaultProcessDiagramGenerator diagramGenerator=new DefaultProcessDiagramGenerator();
然后调用画图方法
diagramGenerator.generateDiagram(bpmnModel, imageType, highLightedActivities);
其中的几个参数:
bpmnModel:当前流程对应的流程模型,可以通过repositoryService.getBpmnModel(processDefinitionId)获取
imageType:图片类型,jpg,png等
highLightedActivities:需要高亮显示的节点的id
二、根据流程定义id绘图
根据流程定义表act_re_procdef的主键id绘图,这时可以没有流程,只要流程图成功部署了就会产生act_re_procdef表的记录。所以也就不存在节点高亮的问题,因为这个图和流程实例无关。
@Test
public void test1() throws Exception {
//根据流程定义id来获取BpmnModel对象
String processDefinitionId="process:2:4304";
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
//这个类在5.22.0往上的版本中才有
DefaultProcessDiagramGenerator diagramGenerator=new DefaultProcessDiagramGenerator();
//绘制bpmnModel代表的流程的流程图
InputStream inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", new ArrayList());
FileOutputStream output=new FileOutputStream(new File("d:/test.png"));
IOUtils.copy(inputStream, output);
System.out.println("输出完成");
}
注意这里generateDiagram()方法的第3个参数传了一个空list,这个list表示要高亮显示的节点的id集合。也就是流程图中每一个任务的id
三、根据流程实例id绘图
3.1 基本原理
上面已经实现了根据processDefinitionId画图。根据processInstanceId画图时,其实是先根据processInstanceId查询到对应的流程实例对象ProcessInstance,
然后通过流程实例对象获取到processDefinitionId,使用其中的get方法processInstance.getProcessDefinitionId()
再想办法获取到需要高亮显示的节点的id:当前节点+走过的节点。
3.2 当前节点的获取
使用runtimeService服务组件的方法来获取
String executionId=processInstance.getId();
List activeActivityIds = runtimeService.getActiveActivityIds(executionId);
activeActivityIds这个list就是当前节点的id集合,如果是并行流程会有多个,其他情况只有一个。
3.3 走过的节点的获取
走过的节点需要从activiti的历史行为表act_hi_actinst中获取。流程的行为数据记录在该表中,当流程进行到一个节点时,该表中会记录流程节点的信息,包括节点id,名称等。其中有一个ACT_ID_就代表流程图上对应节点的id
也就是需要高亮显示的节点id
所以我们要做的就是从这张表中查询到这个数据。activiti已经提供了查询这张表的api,可以通过historyService这个服务组件来获取
//得到已经走过的节点的id集合
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
List historicActivityInstanceList = historicActivityInstanceQuery.processInstanceId(processInstanceId).list();
for(HistoricActivityInstance hi:historicActivityInstanceList) {
String taskKey=hi.getActivityId();
activeActivityIds.add(taskKey);
}
以上代码先查询出ACT_ID_,再把它们添加到需要高亮显示的集合activeActivityIds中
3.4 绘图
DefaultProcessDiagramGenerator defaultProcessDiagramGenerator=new DefaultProcessDiagramGenerator();
//获取流程图的输入流
InputStream inputStream = defaultProcessDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);
//输出图片到指定路径
IOUtils.copy(inputStream, new FileOutputStream(new File("d:/test2.png")));
System.out.println("输出成功");
这样绘制出的流程图上已经走过的节点就会被高亮显示。
四、总结
绘制流程图的原理是使用DefaultProcessDiagramGenerator类中的方法
这个类在一个单独的jar中提供,需要新添加依赖
要高亮显示某些节点,就给画图方法中传入节点id的集合。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java中bpmn流程图_Activiti如何动态获取流程图过程详解相关推荐
- Java中创建String的两道面试题及详解
转载自 Java中创建String的两道面试题及详解 我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd";String str2 ...
- java显示参数,Java中的隐式参数和显示参数实例详解
在学习java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数www.cppcns.com. 隐式参数 ...
- python画动图-Python绘制动态水球图过程详解
先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...
- Istio 中的 Sidecar 注入及透明流量劫持过程详解
图片来源:上海五角场 by Jimmy Song 本文基于 Istio 1.5.1 版本,将为大家介绍以下内容: 什么是 sidecar 模式和它的优势在哪里. Istio 中是如何做 sidecar ...
- Java单机部署,Nacos docker单机模式部署实现过程详解
Nacos 的部署,我使用的时docker 部署(单机模式 mysql),官网文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 拉取代码: ...
- echarts图表动态获取后台数据详解(二)
前篇文章介绍了如何在现有的页面中,建立容器存放echarts图表,如何引入echarts.js文件,和配置图表库的路径.并将静态数据在页面上呈现出来.相当于是为动态获取后台数据做了铺垫.那么这篇文章, ...
- Java中Character(类型char)类及类型详解
1. java中char类型占2个字节.16位可以存放汉子,字母和数字占一个字节,一个字节8位,中文占2个字节,16位: 2. char类型赋值 char a='a'; //任意单个字符,加单引号. ...
- Java中的公平锁和非公平锁实现详解
文章目录 前言 ReentrantLock的可重入性分析 synchronized的可重入性 ReentrantLock的可重入性 ReentrantLock锁的实现分析 公平锁和非公平锁 公平锁Fa ...
- java 怎么输出地址,Java中char[]输出不是内存地址的原因详解
前言 Java中共有八种基本数据类型:byte,int,short,long,float,double,char,boolean. 计算机中的基础数据单位是bit, 1byte=8bit. 数据类型 ...
最新文章
- 我对变量产生了这些想法
- php mysql增删改查实例_php连接数据库实现用户数据的增删改查实例
- 【spring-session】 1.x与2.x 不兼容
- 使用gparted-LiveCD对centos分区调整---virtualbox磁盘调整序2
- 功率曲线k值_特性曲线在参数计算中的应用
- in use 大学英语4word_匈牙利留学 | 名校篇:罗兰大学2021英文授课项目最新招生信息...
- Anaconda——Youki常用的conda命令笔记
- Django 模板标签[转]
- linux中的文本处理方法集锦
- WOWZA的安装及(VOD+LIVE)简单配置和VLC RTP推流
- nRF51822 SPI 驱动 ADXL362
- vbs socket
- 穷查理宝典_穷查理宝典
- php 改变图片大小,如何把照片尺寸改小 电子照片尺寸怎么改
- 讲讲自己试用期被劝退的经历!
- VerA 0.15 by PE_kill
- 计算机考研网课平台哪个好,考研网课哪家排名好
- 高级程序语言c 平时作业,东北大学20秋学期《高级语言程序设计基础X》在线平时作业3...
- 计算机是数学还是结构标高区别,老师傅教你认识建筑施工图上的标高,还怕看不懂标高吗...
- 哈工大2021秋数据结构期末试题