本文中使用的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如何动态获取流程图过程详解相关推荐

  1. Java中创建String的两道面试题及详解

    转载自 Java中创建String的两道面试题及详解 我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd";String str2 ...

  2. java显示参数,Java中的隐式参数和显示参数实例详解

    在学习java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数www.cppcns.com. 隐式参数 ...

  3. python画动图-Python绘制动态水球图过程详解

    先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...

  4. Istio 中的 Sidecar 注入及透明流量劫持过程详解

    图片来源:上海五角场 by Jimmy Song 本文基于 Istio 1.5.1 版本,将为大家介绍以下内容: 什么是 sidecar 模式和它的优势在哪里. Istio 中是如何做 sidecar ...

  5. Java单机部署,Nacos docker单机模式部署实现过程详解

    Nacos 的部署,我使用的时docker 部署(单机模式 mysql),官网文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 拉取代码: ...

  6. echarts图表动态获取后台数据详解(二)

    前篇文章介绍了如何在现有的页面中,建立容器存放echarts图表,如何引入echarts.js文件,和配置图表库的路径.并将静态数据在页面上呈现出来.相当于是为动态获取后台数据做了铺垫.那么这篇文章, ...

  7. Java中Character(类型char)类及类型详解

    1. java中char类型占2个字节.16位可以存放汉子,字母和数字占一个字节,一个字节8位,中文占2个字节,16位: 2. char类型赋值 char a='a'; //任意单个字符,加单引号. ...

  8. Java中的公平锁和非公平锁实现详解

    文章目录 前言 ReentrantLock的可重入性分析 synchronized的可重入性 ReentrantLock的可重入性 ReentrantLock锁的实现分析 公平锁和非公平锁 公平锁Fa ...

  9. java 怎么输出地址,Java中char[]输出不是内存地址的原因详解

    前言 Java中共有八种基本数据类型:byte,int,short,long,float,double,char,boolean. 计算机中的基础数据单位是bit, 1byte=8bit. 数据类型 ...

最新文章

  1. 我对变量产生了这些想法
  2. php mysql增删改查实例_php连接数据库实现用户数据的增删改查实例
  3. 【spring-session】 1.x与2.x 不兼容
  4. 使用gparted-LiveCD对centos分区调整---virtualbox磁盘调整序2
  5. 功率曲线k值_特性曲线在参数计算中的应用
  6. in use 大学英语4word_匈牙利留学 | 名校篇:罗兰大学2021英文授课项目最新招生信息...
  7. Anaconda——Youki常用的conda命令笔记
  8. Django 模板标签[转]
  9. linux中的文本处理方法集锦
  10. WOWZA的安装及(VOD+LIVE)简单配置和VLC RTP推流
  11. nRF51822 SPI 驱动 ADXL362
  12. vbs socket
  13. 穷查理宝典_穷查理宝典
  14. php 改变图片大小,如何把照片尺寸改小 电子照片尺寸怎么改
  15. 讲讲自己试用期被劝退的经历!
  16. VerA 0.15 by PE_kill
  17. 计算机考研网课平台哪个好,考研网课哪家排名好
  18. 高级程序语言c 平时作业,东北大学20秋学期《高级语言程序设计基础X》在线平时作业3...
  19. 计算机是数学还是结构标高区别,老师傅教你认识建筑施工图上的标高,还怕看不懂标高吗...
  20. 哈工大2021秋数据结构期末试题

热门文章

  1. M8软件开发经验总结:移植黄金岛斗地主的经验分享
  2. 如何免费创建云端爬虫集群
  3. 硬核干货,Java工程师飞升之路
  4. Qt+opencv 配置教程
  5. 简单了解线程pthread_create函数
  6. excel中删除空白行方法
  7. uniapp 微信小程序分享到好友 朋友圈
  8. webrtc 丢包反馈之 rtcp goog-remb
  9. 计算机组成原理高速缓冲存储器,计算机组成原理 存储器层次结构 高速缓冲存储器...
  10. Tomcat启动不了,或打开startup.bat一闪而过