图例

环境

软件 版本
SpringBoot 1.5.10
activiti-spring-boot-starter-basic 6.0

生成代码

以下是简化代码:

    /*** 查看实例流程图,根据流程实例ID获取流程图*/@RequestMapping(value="traceprocess/{instanceId}",method=RequestMethod.GET)public void traceprocess(HttpServletResponse response,@PathVariable("instanceId")String instanceId) throws Exception{InputStream in = flowUtils.getResourceDiagramInputStream(instanceId);ServletOutputStream output = response.getOutputStream();IOUtils.copy(in, output);}

Flow 工具类:

/*** Flow 工具类* @author zhipeng.zhang*/
@Component
public class FlowUtils {@AutowiredRuntimeService runservice;@Autowiredprivate HistoryService historyService;@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate ProcessEngineFactoryBean processEngine;/*** 获取历史节点流程图* @param id* @return*/public  InputStream getResourceDiagramInputStream(String id) {try {// 获取历史流程实例HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult();// 获取流程中已经执行的节点,按照执行先后顺序排序List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery().processInstanceId(id).orderByHistoricActivityInstanceId().asc().list();// 构造已执行的节点ID集合List<String> executedActivityIdList = new ArrayList<String>();for (HistoricActivityInstance activityInstance : historicActivityInstanceList) {executedActivityIdList.add(activityInstance.getActivityId());}// 获取bpmnModelBpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());// 获取流程已发生流转的线ID集合List<String> flowIds = this.getExecutedFlows(bpmnModel, historicActivityInstanceList);// 使用默认配置获得流程图表生成器,并生成追踪图片字符流ProcessDiagramGenerator processDiagramGenerator = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();//你也可以 new 一个//DefaultProcessDiagramGenerator processDiagramGenerator = new DefaultProcessDiagramGenerator();InputStream imageStream = processDiagramGenerator.generateDiagram(bpmnModel, "png", executedActivityIdList, flowIds, "宋体", "微软雅黑", "黑体", null, 2.0);return imageStream;} catch (Exception e) {e.printStackTrace();return null;}}private List<String> getExecutedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances) {// 流转线ID集合List<String> flowIdList = new ArrayList<String>();// 全部活动实例List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>();// 已完成的历史活动节点List<HistoricActivityInstance> finishedActivityInstanceList = new LinkedList<HistoricActivityInstance>();for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true));if (historicActivityInstance.getEndTime() != null) {finishedActivityInstanceList.add(historicActivityInstance);}}// 遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的FlowNode currentFlowNode = null;for (HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) {// 获得当前活动对应的节点信息及outgoingFlows信息currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);List<SequenceFlow> sequenceFlowList = currentFlowNode.getOutgoingFlows();/*** 遍历outgoingFlows并找到已已流转的* 满足如下条件认为已已流转:* 1.当前节点是并行网关或包含网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转* 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最近的流转节点视为有效流转*/FlowNode targetFlowNode = null;if (BpmsActivityTypeEnum.PARALLEL_GATEWAY.getType().equals(currentActivityInstance.getActivityType())|| BpmsActivityTypeEnum.INCLUSIVE_GATEWAY.getType().equals(currentActivityInstance.getActivityType())) {// 遍历历史活动节点,找到匹配Flow目标节点的for (SequenceFlow sequenceFlow : sequenceFlowList) {targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);if (historicFlowNodeList.contains(targetFlowNode)) {flowIdList.add(sequenceFlow.getId());}}} else {List<Map<String, String>> tempMapList = new LinkedList<Map<String,String>>();// 遍历历史活动节点,找到匹配Flow目标节点的for (SequenceFlow sequenceFlow : sequenceFlowList) {for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) {tempMapList.add(UtilMisc.toMap("flowId", sequenceFlow.getId(), "activityStartTime", String.valueOf(historicActivityInstance.getStartTime().getTime())));}}}// 遍历匹配的集合,取得开始时间最早的一个long earliestStamp = 0L;String flowId = null;for (Map<String, String> map : tempMapList) {long activityStartTime = Long.valueOf(map.get("activityStartTime"));if (earliestStamp == 0 || earliestStamp >= activityStartTime) {earliestStamp = activityStartTime;flowId = map.get("flowId");}}flowIdList.add(flowId);}}return flowIdList;}}

UtilMisc 工具类:

public class UtilMisc {public static <V, V1 extends V, V2 extends V> Map<String, V> toMap(String name1, V1 value1, String name2, V2 value2) {return populateMap(new HashMap<String, V>(), name1, value1, name2, value2);}@SuppressWarnings("unchecked")private static <K, V> Map<String, V> populateMap(Map<String, V> map, Object... data) {for (int i = 0; i < data.length;) {map.put((String) data[i++], (V) data[i++]);}return map;}
}

工作流枚举类:

/*** 工作流枚举类* @author zhipeng.zhang*/
public enum BpmsActivityTypeEnum {START_EVENT("startEvent", "开始事件"),END_EVENT("endEvent", "结束事件"),USER_TASK("userTask", "用户任务"),EXCLUSIVE_GATEWAY("exclusiveGateway", "排他网关"),PARALLEL_GATEWAY("parallelGateway", "并行网关"),INCLUSIVE_GATEWAY("inclusiveGateway", "包含网关");private String type;private String name;private BpmsActivityTypeEnum(String type, String name) {this.type = type;this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

浏览器直接发送以下格式请求,就可以查看实时流程图:

# traceprocess 后面追加流程ID
http://localhost:8080/traceprocess/20190214

转载于:https://www.cnblogs.com/smallSevens/p/10403312.html

Activiti开发案例之代码生成工作流图片相关推荐

  1. java抓取当前任务,Activiti 开发案例之获取当前活动任务节点

    前言 移动端需求,在工作审批流中发起一个流程实例,会通知到下一个指派人或者相关角色,后台把相关审批参数发送给微信端来实现移动端办公. 步骤 申请人发起流程实例,同时我们可以获取到业务ID.流程实例ID ...

  2. SpringBoot - 工作流Activiti开发

    1.工作流 1.1 开发前奏 介绍 当前系统activit开发以springboot+mybatis开发为准, 1.1.1 IDEA安装actiBPM 通过File -> Settings -& ...

  3. iphone iPhone开发中如何将制作图片放大缩小代码实现案例

    1:原文摘自:http://mobile.51cto.com/iphone-285108.htm iPhone开发中如何将制作图片放大缩小案例是本文要介绍的内容,主要是来学习iphone开发中动画的制 ...

  4. 百度UEditor开发案例(JSP)

    本案例的开发环境:MyEclipse+tomcat+jdk 本案例的开发内容: 用百度编辑器发布新闻(UEditor的初始化开发部署) 编辑已发过的新闻(UEditor的应用--编辑旧文章) 上传附件 ...

  5. python项目开发案例-Python项目开发案例集锦 PDF 全彩超清版

    给大家带来的一篇关于Python案例相关的电子书资源,介绍了关于Python.项目开发.Python案例方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小99.1 MB,明日科技编写,目前 ...

  6. 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》

    <实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明    辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...

  7. java ee web高级,Java EE Web高级开发案例

    核心提示:Java EE Web高级开发案例 内容简介:<Java EE Web高级开发案例>充分体现了高等职业教育的特点,突出了理论和实践的紧密结合,以充分掌握基本技术技能和必要的基本知 ...

  8. 《实战突击.php项目开发案例整合》.(明日科技).[PDF]ckook

    图书作者: 明日科技 图书编号: 9787121141140 图书格式: PDF 出 版 社: 电子工业出版社 出版年份: 2011 图书页数: 800-900 [内容简介] <实战突击:php ...

  9. Bootstrap手机网站开发案例

    Bootstrap手机网站开发案例 一.总结 一句话总结:Bootstrap手机网站开发注意事项(3点):a.引入viewpoint声明,b.通过屏幕宽动态控制元素显隐 c.图片添加自适应 1.Boo ...

  10. python开发项目案例集锦 pdf_Python项目开发案例集锦 实战项目代码+配套文件

    Python项目开发案例集锦涵盖8个开发方向.23个项目,循序渐进地让读者在实践中学习,在实践中提升实际开发能力. 全书共8篇:控制台程序.小游戏.实用小工具.网络爬虫.数据分析.人工智能.Web开发 ...

最新文章

  1. Java AQS论文翻译
  2. 语言处理想突破,三座大山必须过
  3. ExtJs4–表格--Grid
  4. linux shell写的文件断网没保存
  5. python行为识别_牛!Python 也能实现图像姿态识别溺水行为了
  6. PHP接入支付宝手机网站支付、移动支付接口
  7. 【openjudge】【字符串+模拟】1777:文件结构“图”
  8. 解决datafountain比赛提交.csv文件报错问题
  9. NFS服务安装与配置方案
  10. 从 SAS 到 NVMe,换个底盘就完儿事了?
  11. 大数据开发笔记(四):Hive数据仓库
  12. Javascript:Promise异步编程解决方案
  13. asp.net pdf如何转换成tif_PDF如何转换成PPT格式?PDF转PPT软件使用方法分享
  14. 矩阵特征值的求解例子
  15. windows 7 开机启动提示bcd错误修复方法
  16. Oliver的成绩(score)
  17. 【保姆级!完整详细!】小米路由器3 刷openwrt固件并连接上校园网
  18. 【知识图谱】知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?深度学习在知识图谱构建中的应用。
  19. 数据分析画图:50道练习玩转matplotlib
  20. [buuctf] crypto全解——前84道(不建议直接抄flag)

热门文章

  1. qt控制程序打开记事本_Qt 记事本程序
  2. jdbc 事务没有回滚_《Spring Cloud Alibaba》微服务搭建之Seata分布式事务quot;发现问题quot;(十四)...
  3. java ajax_Ajax Java示例
  4. 在UITextView显示HTML,以及NSAttributedString乱码问题解决 swift
  5. Swift 5 Dictionary用法大全
  6. 算法:Sqrt(x) (x 的平方根)
  7. 【3月22日】2022年百度机器学习春实习笔试题解
  8. 线性可分支持向量机与硬间隔最大化
  9. java开发常用的linux命令,Java开发中最常用的Linux命令整理
  10. Ubiquant LGBM Baseline 九坤量化大赛 版本44