Activiti 流程图输出高亮

这是个单元测试,实现的效果,不过只实现了流程颜色红色高亮。如果还需要改变颜色需要更改Activiti源码扩展 ProcessDiagramGenerator 接口

环境:Activiti 5.18
jar包下载地址:https://www.mvnjar.com/search/spring.html
如果 new DefaultProcessDiagramGenerator 对象无法使用
上面地址下载:activiti-image-generator-5.19.0.jar

效果展示

1、针对单元测试引入jar包 的方法


2、如果项目将这个方法写成接口或者utile 如下图-找到 WebRoot-Web-INF-lib 点击引入上面的jar

3、重点来了

package hunshfdx;import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class PrjnActionTest extends AbstractJUnit4SpringContextTests {@ResourceRepositoryService repositoryService;@ResourceHistoryService historyService;@Testpublic void displayFlowCurrPicnew() {BufferedImage img = new BufferedImage(300, 150, BufferedImage.TYPE_INT_RGB);// 组织流程表中的字段中的值//流程图对象Key      表Act_Ru_EXECUTION 列BUSINESS_KEY_)String objId = "PackageBean.DB20190128";  try {// 获取流程图数据HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(objId).singleResult();// 获取所有节点List<HistoricActivityInstance> historicActivityInstanceLinkList = historyService.createHistoricActivityInstanceQuery().processInstanceId(historicProcessInstance.getId()).list();// 高亮环节id集合ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId());// 得到所有进程线List<String> highLightedFlowsList = getHighLightedFlows(definitionEntity, historicActivityInstanceLinkList);// 获取流程图对象 使用部署对象ID查询ProcessDefinition define = repositoryService.createProcessDefinitionQuery().deploymentId(definitionEntity.getDeploymentId()).list().get(0);// 获取历史节点不包括分叉节点// List<HistoricTaskInstance> htiList =// historyService.createHistoricTaskInstanceQuery()// .processInstanceBusinessKey(objId).orderByTaskId().asc().list();List<String> highLines = new ArrayList<String>();// 高亮线集合highLines.addAll(highLightedFlowsList);List<String> highNodes = new ArrayList<String>();// 高亮节点// 获取流程图modelBpmnModel bpmnModel = repositoryService.getBpmnModel(define.getId());// Collections.reverse(htiList);// list倒序for (int i = 0; i < historicActivityInstanceLinkList.size(); i++) {// 节点高亮highNodes.add(historicActivityInstanceLinkList.get(i).getActivityId());// 根据节点获得对象// 获取与 当前节点 出去关连的节点是否是结束节点如果是结束节点进行高亮FlowNode fl = (FlowNode) bpmnModel.getFlowElement(historicActivityInstanceLinkList.get(i).getActivityId());List<SequenceFlow> sequenceFlows = fl.getOutgoingFlows();for (SequenceFlow sequenceFlow : sequenceFlows) {if (sequenceFlow.getTargetRef().contains("endevent")) {highNodes.add(sequenceFlow.getTargetRef());highLines.add(sequenceFlow.getId());}}}// 递归获取节点// highNodes.addAll(getHighNodes(highNodes,bpmnModel,task.getTaskDefinitionKey()));// highLines.addAll(getHighLines(highLines,bpmnModel,task.getTaskDefinitionKey()));// 获取流程图图像字符流DefaultProcessDiagramGenerator generator = new DefaultProcessDiagramGenerator();// 流程图输出// 参数说明:流程图模板、输出图片类型、高亮节点、高亮线、设置字体、设置字体、null、生成版本 微软雅黑InputStream inputStream = generator.generateDiagram(bpmnModel, "jpg", highNodes, highLines, "黑体", "黑体",null, 2.0);//不输出图片可以直接调用 以资源文件的方式传输到前台this.writeFile(respon,inputStream );byte[] bytes = IOUtils.toByteArray(inputStream);String encoded = Base64.getEncoder().encodeToString(bytes);// 输出资源内容到相应对象byte[] b = new byte[1024];File file = new File("D://xmImge/1.jpg");int len;OutputStream out = new FileOutputStream(file);// imageStream=imageStream.while ((len = inputStream.read(b, 0, 1024)) != -1) {out.write(b, 0, len);}out.close();} catch (Exception e) {e.printStackTrace();}}/*** 获取高亮的线* * @param bpmnModel* @param key* @return* */public List<String> getHighLines(List<String> highLines, BpmnModel bpmnModel, String key, String key2) {FlowNode fl = (FlowNode) bpmnModel.getFlowElement(key);// List<SequenceFlow> inFlows = fl.getIncomingFlows();List<SequenceFlow> outFlows = fl.getOutgoingFlows();for (SequenceFlow sequenceFlow : outFlows) {highLines.add(sequenceFlow.getId());}return highLines;}/*** 获取高亮的线* * @param bpmnModel* @param key* @return* */private List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinitionEntity,List<HistoricActivityInstance> historicActivityInstances) {List<String> highFlows = new ArrayList<String>();// 用以保存高亮的线flowIdfor (int i = 0; i < historicActivityInstances.size() - 1; i++) {// 对历史流程节点进行遍历ActivityImpl activityImpl = processDefinitionEntity.findActivity(historicActivityInstances.get(i).getActivityId());// 得到节点定义的详细信息List<ActivityImpl> sameStartTimeNodes = new ArrayList<ActivityImpl>();// 用以保存后需开始时间相同的节点ActivityImpl sameActivityImpl1 = processDefinitionEntity.findActivity(historicActivityInstances.get(i + 1).getActivityId());// 将后面第一个节点放在时间相同节点的集合里sameStartTimeNodes.add(sameActivityImpl1);for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);// 后续第一个节点HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + 1);// 后续第二个节点if (activityImpl1.getStartTime().equals(activityImpl2.getStartTime())) {// 如果第一个节点和第二个节点开始时间相同保存ActivityImpl sameActivityImpl2 = processDefinitionEntity.findActivity(activityImpl2.getActivityId());sameStartTimeNodes.add(sameActivityImpl2);} else {// 有不相同跳出循环break;}}List<PvmTransition> pvmTransitions = activityImpl.getOutgoingTransitions();// 取出节点的所有出去的线for (PvmTransition pvmTransition : pvmTransitions) {// 对所有的线进行遍历ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition.getDestination();// 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示if (sameStartTimeNodes.contains(pvmActivityImpl)) {highFlows.add(pvmTransition.getId());}}}return highFlows;}/*** public List<String> getHighLines(List<String> highLines, BpmnModel bpmnModel,* String key) { FlowNode fl = (FlowNode) bpmnModel.getFlowElement(key);* List<SequenceFlow> sequenceFlows = fl.getIncomingFlows(); for (SequenceFlow* sf : sequenceFlows) { if (StringUtils.isNotBlank(sf.getSourceRef()) &&* !highLines.contains(sf.getSourceRef()) &&* !"usertask2".equals(sf.getSourceRef())) {* * highLines.add(sf.getId()); getHighLines(highLines, bpmnModel,* sf.getSourceRef());* * * if (highLine != null && highLine.size() > 0) { highLines.addAll(highLine); }* * * } } return highLines; }*//*** 获取高亮的节点* * @param bpmnModel* @param key* @return*/private List<String> getHighNodes(List<String> highNodes, BpmnModel bpmnModel, String key) {FlowNode fl = (FlowNode) bpmnModel.getFlowElement(key);List<SequenceFlow> sequenceFlows = fl.getIncomingFlows();highNodes.add(key);for (SequenceFlow sf : sequenceFlows) {if (StringUtils.isNotBlank(sf.getSourceRef()) && !highNodes.contains(sf.getSourceRef())&& !"usertask2".equals(sf.getSourceRef())) {List<String> HighNode = getHighNodes(highNodes, bpmnModel, sf.getSourceRef());if (HighNode != null && HighNode.size() > 0) {highNodes.addAll(HighNode);}}}return highNodes;}// 将图片输入流输出到页面public void writeFile(HttpServletResponse resp, InputStream inputStream) {OutputStream out = null;try {out = resp.getOutputStream();int len = 0;byte[] b = new byte[1024];while ((len = inputStream.read(b)) != -1) {out.write(b, 0, len);}out.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (out != null) {out.close();}} catch (Exception e) {e.printStackTrace();}}}}

4、界面如何引用 src填请求路径就可以了
<img src="" alt="" style="padding: 0px 0px 0px -10px;width:100%;" />

Activiti 流程图高亮显示相关推荐

  1. activiti6.0入门(三)-使用Eclipse绘制activiti流程图

    通过前面的学习,相信对activiti都有了个初步认识及大概了解,在之前绘制流程图时,是通过activiti服务链接来完成流程图的绘制,接下来我们不依赖服务来完成流程图绘制,IDE工具idea和ecl ...

  2. bpmn整合流程图高亮显示流程进度图

    bpmn整合流程图高亮显示流程进度图 最终展示的效果是这样的 引入组件 "bpmn-js": "^8.7.1","bpmn-js-properties ...

  3. activiti工作流项目中显示流程进度(流程图高亮显示)

    1.flowList.jsp页面使用img标签,processInstanceId为后台传来的值 <img src="testController.do?queryProPlan&am ...

  4. activiti5.21 + SVG 绘制流程图 高亮显示已完成节点

    本功能实现是结合actitivi5.21的数据结构来获取相关数据,并通过AJAX调用进行SVG图形的绘制. 1.SpringBoot 接口及相关实体 /** * 读取组装绘制流程图的数据 */ @Re ...

  5. activiti 流程图乱码

    前言 ruoyi 4.6.0 activiti 6.0.0 CentOS Linux release 7.6.1810 (Core) 流程图乱码 实际的到的流程图(乱码): 期望得到的流程图(解决乱码 ...

  6. activiti 流程图中使用SeriviceTask(自动服务任务)

    Bpmn2.0规范的Java 服务任务(java service task) 主要用处: 服务任务用户调用一个外部java类 应用场景: 当客户有这么一个需求:下一个任务我需要自动执行一些操作,并且这 ...

  7. 工作流Activiti流程图各元素介绍

    我们常见的工作流流程图,通过各元素的拖拽生成,如下图: 要想生成根据业务需求制定的流程图,首先要知道这些构成元素代表的是什么,这篇就来将一下这些元素的作用.通过activiti集成eclipse,会在 ...

  8. 画流程图activiti流程图_干货!小白也能一天画100张高逼格流程图

    今天是在一起两周年零128天纪念日~ 你喜滋滋地订好了花,买好了酒,暗暗盘算着下班以后赶紧走~ 不料老板的命令从天而降 "出100张流程图,今天给我!" What???100张!! ...

  9. activiti流程图查看

    1,测试用例查看图片 public void viewImage()throws Exception {// 创建仓库服务对象 RepositoryService repositoryService ...

最新文章

  1. 设置Eclipse中的tab键为4个空格的完整方法
  2. YOLOX——Win10下训练自定义VOC数据集
  3. 计算机操作员考评标准,计算机操作员职业技能鉴定标准.doc
  4. Spring容器初始化实现V3 版本
  5. 它是世界上最轻的固体!1000℃下不会熔化,上过火星,还能进你家......
  6. VMware Fusion8下CentOS7.1 安装vmtools报错kernel header path
  7. 这两个小技巧,让SQL语句不仅躲了坑,还提升了1000倍
  8. 理想汽车市值逼近蔚来,王兴曾多次在饭否为其站台
  9. MATLAB模拟声压分布,基于Matlab仿真软件构建圆形压电晶体三维模型
  10. 如何使用Burp Suite代理
  11. 目前为止微型计算机,2017年计算机一级考试题库及答案
  12. [开源之美] nanomsg -- 进程间通讯
  13. C语言数组制作拼图游戏,C语言例子自制拼图游戏
  14. linu {,} 使用
  15. JAVA核心知识点--IO流
  16. extern的几种用法
  17. Enable VT-x in your BIOS 怎么解决
  18. 常用的cmd命令与Linux命令
  19. 深度学习目标检测论文1(YOLOv1论文的翻译)
  20. jdk的keytool生成jks和获取jks的信息,公匙

热门文章

  1. P2P 终结者 for Linux
  2. NSInvocation的使用
  3. C程序设计(第五版) 第四章选择结构程序设计(二)
  4. 如何用Stata完成(shui)一篇经济学论文(十三):断点回归(上)
  5. CDR:如何使普通图片变为水彩画效果
  6. 蓝牙网状网络的基本原理及应用开发
  7. css实现div旋转任意角度
  8. 服务器2008系统如何设置休眠时间,Win7休眠和睡眠怎么开启(Win2008)
  9. java学习方法-浅谈软件开发的神速进步
  10. 读书笔记 - 小米生态链: 101条战地法则