`
xsmart
  • 浏览: 11039 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

基于Activiti的简单流程历史图形展示

阅读更多
以前采用jbpm编写流程,后来决定采用activiti在新系统中进行流程实现,所以重新编写了流程历史图形展示


[list=1]
  • 首先需要获取流程定义图
  • ByteArrayOutputStream os = new ByteArrayOutputStream();
    InputStream is = getProcessEngine().getRepositoryService().getProcessDiagram(processDefinitionId);
    
    try {
    	new BASE64Encoder().encode(is, os);
    	is.close();
    } catch (Exception e) {
    	;
    }
    
    String image = os.toString();
    

    将image缓存起来备用

  • 读取流程定义信息,获取流程节点信息
  • 基于BPMN2.0的Activiti流程图定义是以xml形式记录的,内容中不仅保存了流程信息,还保存了流程图示信息,我们可以解析流程图示信息,用于之后流程节点的展示
    我们定义如下的流程图

    它的xml定义为
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
    	xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
    	expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
    	<process id="process1" name="process1">
    		<startEvent id="startevent1" name="Start"></startEvent>
    		<endEvent id="endevent1" name="End"></endEvent>
    		<userTask id="usertask1" name="User Task1"></userTask>
    		<sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    		<sequenceFlow id="flow2" name="" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    		<userTask id="usertask2" name="User Task2"></userTask>
    		<sequenceFlow id="flow3" name="" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
    	</process>
    	<bpmndi:BPMNDiagram id="BPMNDiagram_process1">
    		<bpmndi:BPMNPlane bpmnElement="process1" id="BPMNPlane_process1">
    			<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
    				<omgdc:Bounds height="35" width="35" x="70" y="20"></omgdc:Bounds>
    			</bpmndi:BPMNShape>
    			<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
    				<omgdc:Bounds height="35" width="35" x="70" y="260"></omgdc:Bounds>
    			</bpmndi:BPMNShape>
    			<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
    				<omgdc:Bounds height="55" width="105" x="35" y="90"></omgdc:Bounds>
    			</bpmndi:BPMNShape>
    			<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
    				<omgdc:Bounds height="55" width="105" x="35" y="170"></omgdc:Bounds>
    			</bpmndi:BPMNShape>
    			<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
    				<omgdi:waypoint x="87" y="55"></omgdi:waypoint>
    				<omgdi:waypoint x="87" y="90"></omgdi:waypoint>
    			</bpmndi:BPMNEdge>
    			<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
    				<omgdi:waypoint x="87" y="145"></omgdi:waypoint>
    				<omgdi:waypoint x="87" y="170"></omgdi:waypoint>
    			</bpmndi:BPMNEdge>
    			<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
    				<omgdi:waypoint x="87" y="225"></omgdi:waypoint>
    				<omgdi:waypoint x="87" y="260"></omgdi:waypoint>
    			</bpmndi:BPMNEdge>
    		</bpmndi:BPMNPlane>
    	</bpmndi:BPMNDiagram>
    </definitions>
    

    其中bpmndi:BPMNDiagram记录了流程图示信息,bpmndi:BPMNShape记录节点,omgdc:Bounds记录节点的位置和大小信息,我们只需要通过sax解析该xml文件,即可获得节点图示信息
    
    InputStream is = getProcessEngine().getRepositoryService().getProcessModel(processDefinitionId);
    try {
    	SAXParserFactory.newInstance().newSAXParser().parse(is, new DefaultHandler() {
    		@Override
    		public void startElement(String uri, String localName, String qName, Attributes attributes)
    				throws SAXException {
    			switch (qName) {
    			case SHAPE:
    				n = attributes.getValue(SHAPE_NAME);
    				ds = new Double[4];
    				break;
    			case BOUND:
    				if (ds != null) {
    					ds[0] = Double.parseDouble(attributes.getValue("x"));
    					ds[1] = Double.parseDouble(attributes.getValue("y"));
    					ds[2] = Double.parseDouble(attributes.getValue("width"));
    					ds[3] = Double.parseDouble(attributes.getValue("height"));
    				}
    				break;
    			default:
    			}
    		}
    
    		@Override
    		public void endElement(String uri, String localName, String qName) throws SAXException {
    			if (qName.equals(SHAPE)) {
    				// TODO 存储节点图示信息
    				// k = processDefinitionId + n
    				// v = ds
    				n = null;
    				ds = null;
    			}
    		}
    
    		private static final String SHAPE = "bpmndi:BPMNShape";
    		private static final String SHAPE_NAME = "bpmnElement";
    		private static final String BOUND = "omgdc:Bounds";
    		private String n;
    		private Double[] ds;
    	});
    } catch (Exception e) {
    	e.printStackTrace();
    }
    

    在代码的TODO部分,将节点图示信息缓存起来备用

  • 展示流程运行情况
  • 通过activiti api获取历史审核情况
    HistoricTaskInstanceQuery taskQuery = getProcessEngine().getHistoryService().createHistoricTaskInstanceQuery();
    taskQuery.processInstanceId(processInstanceId);
    List<HistoricTaskInstance> list = taskQuery.list();
    for (HistoricTaskInstance taskInstance : list) {
    	Double[] shape = getShape(processDefinitionId, taskInstance.getTaskDefinitionKey()); // TODO 从缓存获取节点图示信息
    	taskInstance.getAssignee();
    	taskInstance.getStartTime();
    	taskInstance.getEndTime();
    }
    

    在代码的TODO部分,从缓存获取节点图示信息;
    并且可以从taskInstance获取节点审核相关信息,这些信息就可以用于在页面上通过html进行展示

    页面上,由于流程定义图已经以base64编码,所以可以直接用展示,而审核历史节点,则采用<div style="left:px,top:px,width:px,height:px"></div>以position:absolute;展示在流程定义图上
    由于流程图上的节点可能有圆角,所以css上还需要加上radius来展示

    实际使用效果如图


  • 我们还可以
  • 除了审核历史节点,还可以通过taskquery查询等待审核的节点,以不同的效果展现
    我们还可以在鼠标放到节点上的时候,展示节点的审核信息,如审核人、审核时间、审核意见和办结花费时间等
    由于流程审核过程可能比较复杂,所以还可以作一个过程展示,按审核顺序依次加亮审核节点,用于过程展示



    [/list]
    • 大小: 6 KB
    • 大小: 15.2 KB
    • 大小: 21.9 KB
    3
    5
    分享到:
    评论
    1 楼 poeao 2013-12-07  
    你好, 请问,

    方便把相关的代码发给我参考一下么?

    谢谢.

    shaw.tao@163.com

    相关推荐

      简单的activiti请假流程

      这个“简单的activiti请假流程”项目是针对初学者或希望了解Activiti基本操作的一个实例,旨在展示如何在实际场景中部署、启动、执行和结束一个流程。 1. Activiti 概述: Activiti 是基于模型驱动的,采用BPMN ...

      基于Activiti的OA系统.zip

      在这个“基于Activiti的OA系统”项目中,我们可以看到它被巧妙地应用于请假、薪资调整和报销流程等关键业务模块,以实现企业的高效运营。 首先,我们来详细了解一下Activiti。Activiti是基于模型驱动的,这意味着...

      Activiti 学习笔记十:开始活动节点(判断流程是否结束及查询历史)

      在学习和开发过程中,Activiti 提供了 Activiti Designer 工具,这是一个基于 Eclipse 的插件,可以帮助我们图形化地设计和编辑 BPMN 2.0 流程图。通过这个工具,我们可以直观地添加开始活动节点,配置其行为,并...

      activiti 5.16 流程管理 中文版

      ### Activiti 5.16 流程管理中文版知识点概览 #### 1. 简介 - **协议**:Activiti采用Apache License 2.0协议。 - **下载**:可以从官方网站或第三方镜像站点下载Activiti 5.16版本。 - **源码**:GitHub上提供了...

      Activiti7的开源项目,用于二次开发!

      - **审计跟踪**:记录完整的流程历史,便于追溯和分析。 7. **部署与集成**: 在Java EE环境中,Activiti7可以轻松集成到现有的Spring、Hibernate等框架中。此外,它还提供了RESTful API,便于与其他非Java应用...

      基于Activiti流程监控的毕业设计管理系统.zip

      《基于Activiti流程监控的毕业设计管理系统》 在信息技术飞速发展的今天,毕业设计作为高等教育的重要环节,已经不再局限于传统的纸质文档提交与评审方式。现代的毕业设计管理系统借助先进的信息技术,实现了全流程...

      基于Activiti5工作流实战企业协同OA办公系统教程第二部分

      7. **流程历史记录**:提供完整的流程历史记录,便于分析和审计,帮助企业优化流程。 在实际应用中,企业协同OA系统通常会包含以下模块: 1. **流程设计模块**:使用BPMN编辑器设计和导入流程模型。 2. **任务管理...

      疯狂工作流讲义 基于Activiti 6.x的应用开发

      通过《疯狂工作流讲义:基于Activiti 6.x的应用开发》,你将能掌握使用Activiti进行工作流系统开发的全过程,从设计到实现,从基础到高级技巧,从而提升你的业务流程自动化能力。阅读过程中,结合书中的示例代码和...

      使用activiti工作流引擎显示流程图时高亮显示流程图中已执行节点和已执行路径方法源代码

      Activiti 是一个流行的开源工作流引擎,它基于模型驱动的架构,提供了一套完整的工具来设计、部署和执行业务流程。在使用Activiti时,为了更好地理解流程状态和追踪执行过程,开发者往往需要实现流程图的高亮显示...

      基于Activiti6.0,集流程设计、流程部署、流程执行、任务办理、流程监控于一体的开源工作流开发平台

      基于Activiti6.0的开发平台,旨在提供一套全面的OA(Office Automation)数字化解决方案,让企业能够轻松地设计、部署、执行和监控业务流程。这个平台融合了流程设计、流程部署、流程执行和任务办理等核心功能,为...

      activiti-5.22.0zip下载

      3. **流程设计器**:Activiti提供了一个基于Web的流程设计器,使得非技术人员也能通过图形化界面设计和编辑流程,极大地降低了流程建模的门槛。 4. **数据库存储**:Activiti将流程实例、任务、变量等信息存储在...

      疯狂Workflow讲义 基于Activiti的工作流应用开发

      《疯狂Workflow讲义:基于Activiti的工作流应用开发》是一份深入探讨工作流管理系统和Activiti框架的专业资料。本文将围绕工作流、Activiti以及如何使用Activiti进行应用开发进行详细阐述。 工作流(Workflow)是...

      基于ssh框架的activiti实战请假流程代码

      总的来说,"基于ssh框架的activiti实战请假流程代码"是一个将企业级开发框架与工作流引擎相结合的示例,展示了如何利用现代Java技术栈构建一个完整的业务流程管理系统。通过学习这个项目,开发者可以深入理解SSH框架...

      基于Activiti5工作流实战企业协同OA办公系统教程第三部分

      在本教程中,我们将深入探讨基于Activiti5的工作流实战,特别是如何应用于企业协同OA(Office Automation)办公系统。Activiti5是一个强大的、轻量级的业务流程管理系统(BPMN 2.0)引擎,它为企业提供了一种高效、...

      流程引擎(Flowable+Activiti)

      同时,它们都可以与数据库(如MySQL、Oracle等)进行交互,存储和检索流程实例和历史数据。 开发和部署: 在开发过程中,可以使用Eclipse或IntelliJ IDEA等IDE配合专用的插件进行流程模型的图形化设计。完成后,...

      activiti流程设计器.zip

      这个"activiti流程设计器.zip"压缩包内包含的资源显然是用于帮助用户设计和理解Activiti流程的工具,并且特别加入了中文翻译,使得中国用户在使用过程中能更方便地理解和操作。 Activiti 流程设计器是 Activiti ...

      Activiti工作流之管理流程定义

      Activiti提供了强大的流程监控能力,包括查看当前运行的流程实例、查询历史流程实例、干预活动任务等。这些功能可以帮助管理者了解流程运行状态,及时发现并解决问题。 **七、源码解析** 对于进阶用户,深入理解...

      activiti工作流流程跟踪图(网页布局)

      5. **节点和连线**:在Activiti流程图中,节点代表流程中的活动,如开始事件、任务、决策点等;连线则表示这些活动之间的逻辑关系,如顺序流、并行流等。高亮这些元素可以直观地反映流程的动态变化。 6. **实施方法...

      activiti-demo

      4. **数据库配置**:Activiti 使用数据库来存储流程实例、任务和历史信息。项目可能包含数据库脚本和配置文件,说明如何设置与 Activiti 配合的数据库。 5. **单元测试**:为了确保流程的正确性,示例项目可能包含...

    Global site tag (gtag.js) - Google Analytics