以前采用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
分享到:
相关推荐
这个“简单的activiti请假流程”项目是针对初学者或希望了解Activiti基本操作的一个实例,旨在展示如何在实际场景中部署、启动、执行和结束一个流程。 1. Activiti 概述: Activiti 是基于模型驱动的,采用BPMN ...
在这个“基于Activiti的OA系统”项目中,我们可以看到它被巧妙地应用于请假、薪资调整和报销流程等关键业务模块,以实现企业的高效运营。 首先,我们来详细了解一下Activiti。Activiti是基于模型驱动的,这意味着...
在学习和开发过程中,Activiti 提供了 Activiti Designer 工具,这是一个基于 Eclipse 的插件,可以帮助我们图形化地设计和编辑 BPMN 2.0 流程图。通过这个工具,我们可以直观地添加开始活动节点,配置其行为,并...
### Activiti 5.16 流程管理中文版知识点概览 #### 1. 简介 - **协议**:Activiti采用Apache License 2.0协议。 - **下载**:可以从官方网站或第三方镜像站点下载Activiti 5.16版本。 - **源码**:GitHub上提供了...
- **审计跟踪**:记录完整的流程历史,便于追溯和分析。 7. **部署与集成**: 在Java EE环境中,Activiti7可以轻松集成到现有的Spring、Hibernate等框架中。此外,它还提供了RESTful API,便于与其他非Java应用...
《基于Activiti流程监控的毕业设计管理系统》 在信息技术飞速发展的今天,毕业设计作为高等教育的重要环节,已经不再局限于传统的纸质文档提交与评审方式。现代的毕业设计管理系统借助先进的信息技术,实现了全流程...
7. **流程历史记录**:提供完整的流程历史记录,便于分析和审计,帮助企业优化流程。 在实际应用中,企业协同OA系统通常会包含以下模块: 1. **流程设计模块**:使用BPMN编辑器设计和导入流程模型。 2. **任务管理...
通过《疯狂工作流讲义:基于Activiti 6.x的应用开发》,你将能掌握使用Activiti进行工作流系统开发的全过程,从设计到实现,从基础到高级技巧,从而提升你的业务流程自动化能力。阅读过程中,结合书中的示例代码和...
Activiti 是一个流行的开源工作流引擎,它基于模型驱动的架构,提供了一套完整的工具来设计、部署和执行业务流程。在使用Activiti时,为了更好地理解流程状态和追踪执行过程,开发者往往需要实现流程图的高亮显示...
基于Activiti6.0的开发平台,旨在提供一套全面的OA(Office Automation)数字化解决方案,让企业能够轻松地设计、部署、执行和监控业务流程。这个平台融合了流程设计、流程部署、流程执行和任务办理等核心功能,为...
3. **流程设计器**:Activiti提供了一个基于Web的流程设计器,使得非技术人员也能通过图形化界面设计和编辑流程,极大地降低了流程建模的门槛。 4. **数据库存储**:Activiti将流程实例、任务、变量等信息存储在...
《疯狂Workflow讲义:基于Activiti的工作流应用开发》是一份深入探讨工作流管理系统和Activiti框架的专业资料。本文将围绕工作流、Activiti以及如何使用Activiti进行应用开发进行详细阐述。 工作流(Workflow)是...
总的来说,"基于ssh框架的activiti实战请假流程代码"是一个将企业级开发框架与工作流引擎相结合的示例,展示了如何利用现代Java技术栈构建一个完整的业务流程管理系统。通过学习这个项目,开发者可以深入理解SSH框架...
在本教程中,我们将深入探讨基于Activiti5的工作流实战,特别是如何应用于企业协同OA(Office Automation)办公系统。Activiti5是一个强大的、轻量级的业务流程管理系统(BPMN 2.0)引擎,它为企业提供了一种高效、...
同时,它们都可以与数据库(如MySQL、Oracle等)进行交互,存储和检索流程实例和历史数据。 开发和部署: 在开发过程中,可以使用Eclipse或IntelliJ IDEA等IDE配合专用的插件进行流程模型的图形化设计。完成后,...
这个"activiti流程设计器.zip"压缩包内包含的资源显然是用于帮助用户设计和理解Activiti流程的工具,并且特别加入了中文翻译,使得中国用户在使用过程中能更方便地理解和操作。 Activiti 流程设计器是 Activiti ...
Activiti提供了强大的流程监控能力,包括查看当前运行的流程实例、查询历史流程实例、干预活动任务等。这些功能可以帮助管理者了解流程运行状态,及时发现并解决问题。 **七、源码解析** 对于进阶用户,深入理解...
5. **节点和连线**:在Activiti流程图中,节点代表流程中的活动,如开始事件、任务、决策点等;连线则表示这些活动之间的逻辑关系,如顺序流、并行流等。高亮这些元素可以直观地反映流程的动态变化。 6. **实施方法...
4. **数据库配置**:Activiti 使用数据库来存储流程实例、任务和历史信息。项目可能包含数据库脚本和配置文件,说明如何设置与 Activiti 配合的数据库。 5. **单元测试**:为了确保流程的正确性,示例项目可能包含...