`

activiti 实例流程图的显示方法

 
阅读更多

所谓实例流程图的显示,就是显示流程图的同时,高亮显示正在执行的节点。有两种方法 
直接生成带老亮节点的图片: 

Java代码  收藏代码
  1.             try{  
  2. //              ProcessDefinitionEntity pde = (ProcessDefinitionEntity) RepositoryService  
  3. //              .getDeployedProcessDefinition(procDefId);  
  4.   
  5.   
  6.              InputStream imageStream =  
  7.              ProcessDiagramGenerator.generateDiagram(  
  8.              def, "png",  
  9.              runtimeService.getActiveActivityIds(executionId));  
  10.              List<Task> list = taskService.createTaskQuery().processInstanceId(executionId).orderByTaskId().desc().list();  
  11.              int size = list.size();  
  12.              getRequest().setAttribute("inputStream", imageStream);  
  13.             }catch(RasterFormatException e){  
  14.                 e.printStackTrace();  
  15.             }  


img.jsp 

Html代码  收藏代码
  1. <%@page import="java.io.InputStream"%>  
  2. <%@page import="org.activiti.engine.impl.*"%>  
  3. <%@page import="org.activiti.engine.impl.pvm.*"%>  
  4. <%@page import="org.activiti.engine.impl.pvm.process.*"%>  
  5. <%@page import="org.activiti.engine.repository.*"%>  
  6. <%@page import="org.activiti.engine.*"%>  
  7. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  8.     pageEncoding="UTF-8"%>  
  9.   
  10. <%  
  11.       
  12.     InputStream is = (InputStream)request.getAttribute("inputStream");  
  13.       
  14.     byte[] b = new byte[1024];  
  15.     int len = -1;  
  16.     while((len = is.read(b, 0, 1024)) != -1) {  
  17.         response.getOutputStream().write(b, 0, len);  
  18.         // 防止异常:getOutputStream() has already been called for this response  
  19.         out.clear();  
  20.         out = pageContext.pushBody();  
  21.     }     
  22.   
  23. %>  


方法2: 图片和高亮节点圈分别产生 

Java代码  收藏代码
  1. /** 
  2.      * 显示流程图 
  3.      * @return 
  4.      * @throws Exception 
  5.      */  
  6.         public String getProcessPic() throws Exception {  
  7.             // String taskId =  
  8.             // "2901";//getRequest().getParameter("taskId");3016,552,3020  
  9.             String procDefId = getRequest().getParameter("procDefId");  
  10.             ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId).singleResult();  
  11.             String diagramResourceName = procDef.getDiagramResourceName();  
  12.             InputStream imageStream = repositoryService.getResourceAsStream(  
  13.                     procDef.getDeploymentId(), diagramResourceName);  
  14.             getRequest().setAttribute("inputStream", imageStream);  
  15.             return SUCCESS;  
  16.         }  
  17.     /** 
  18.      * 获取跟踪信息 
  19.      * @return 
  20.      * @throws Exception 
  21.      */  
  22.         public String getProcessMap() throws Exception {  
  23.             String procDefId = getRequest().getParameter("procDefId");  
  24.             String executionId = getRequest().getParameter("executionId");  
  25.             ProcessDefinition processDefinition = repositoryService  
  26.                     .createProcessDefinitionQuery().processDefinitionId(procDefId).singleResult();  
  27.   
  28.             ProcessDefinitionImpl pdImpl = (ProcessDefinitionImpl) processDefinition;  
  29.             String processDefinitionId = pdImpl.getId();// 流程标识  
  30.   
  31.             ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)  
  32.                     .getDeployedProcessDefinition(processDefinitionId);  
  33.             ActivityImpl actImpl = null;  
  34.   
  35.             ExecutionEntity execution = (ExecutionEntity) runtimeService  
  36.                     .createExecutionQuery().executionId(executionId).singleResult();// 执行实例  
  37.   
  38.             String activitiId = execution.getActivityId();// 当前实例的执行到哪个节点  
  39. //          List<String>activitiIds = runtimeService.getActiveActivityIds(executionId);  
  40.               
  41.   
  42.             List<ActivityImpl> activitiList = def.getActivities();// 获得当前任务的所有节点  
  43. //          for(String activitiId : activitiIds){  
  44.             for (ActivityImpl activityImpl : activitiList) {  
  45.                 String id = activityImpl.getId();  
  46.                 if (id.equals(activitiId)) {// 获得执行到那个节点  
  47.                     actImpl = activityImpl;  
  48.                     break;  
  49.                 }  
  50.             }  
  51. //          }  
  52.   
  53.             getRequest().setAttribute("coordinateObj", actImpl);  
  54.             getRequest().setAttribute("procDefId",procDefId );  
  55.             return SUCCESS;  
  56.         }  


pic.jsp 

Html代码  收藏代码
  1. <%@page import="java.io.InputStream"%>  
  2. <%@page import="org.activiti.engine.impl.*"%>  
  3. <%@page import="org.activiti.engine.impl.pvm.*"%>  
  4. <%@page import="org.activiti.engine.impl.pvm.process.*"%>  
  5. <%@page import="org.activiti.engine.repository.*"%>  
  6. <%@page import="org.activiti.engine.*"%>  
  7. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  8.     pageEncoding="UTF-8"%>  
  9.   
  10. <%  
  11.       
  12.     InputStream is = (InputStream)request.getAttribute("inputStream");  
  13.       
  14.     byte[] b = new byte[1024];  
  15.     int len = -1;  
  16.     while((len = is.read(b, 0, 1024)) != -1) {  
  17.         response.getOutputStream().write(b, 0, len);  
  18.         // 防止异常:getOutputStream() has already been called for this response  
  19.         out.clear();  
  20.         out = pageContext.pushBody();  
  21.     }     
  22.   
  23. %>  


showImg.jsp 

Html代码  收藏代码
  1. <%@page import="java.io.InputStream"%>  
  2. <%@page import="org.activiti.engine.impl.*"%>  
  3. <%@page import="org.activiti.engine.impl.pvm.*"%>  
  4. <%@page import="org.activiti.engine.impl.pvm.process.*"%>  
  5. <%@page import="org.activiti.engine.repository.*"%>  
  6. <%@page import="org.activiti.engine.*"%>  
  7. <%@ page language="java" pageEncoding="UTF-8"%>  
  8.   
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  10.   
  11. <html>  
  12. <head>  
  13.     <title></title>  
  14. </head>  
  15. <body>  
  16.     <div >  
  17.         <img src="getProcessPic.action?procDefId=${procDefId}" style="position:absolute; left:0px; top:0px;">  
  18.         <!-- 给执行的节点加框 -->  
  19.         <div style="position:absolute; border:2px solid red;left:${coordinateObj.x-1 }px;top:${coordinateObj.y-1 }px;width:${coordinateObj.width }px;height:${coordinateObj.height }px;"></div>  
  20.     </div>  
  21.   
  22. </body>  
  23. </html>  


struts.xml 

Xml代码  收藏代码
  1. <action name="getProcessPic" class="processInstanceAction" method="getProcessPic">  
  2.             <result name = "success" >/incident/pic.jsp</result>  
  3.         </action>  
  4.         <action name="getProcessMap" class="processInstanceAction" method="getProcessMap">  
  5.             <result name = "success" >/incident/showImg.jsp</result>  
  6.         </action>  


需要注意的是,当你的流程图中存在并发节点时需要用到runtimeService.getActiveActivityIds(proInstId)得到多个活动节点。 


这个方法可以在activiti的帮助文档中找到,但它的原文中是getActiveActivityIds(String executionId)(执行ID)这是错的,因为在数据库的_ru_task表(运行任务表)中,执行ID与任务记录一一对应,但可以存在多个流程实例Id相同的任务记录。 


鉴于第一种方法形成的流程图太丑,采用第二种方法最好! 
*********************格叽格叽******************************* 
孔雀东南飞…有情人还是共饮一江水的吧!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics