本文實例展示了Activiti流程圖檢視的實作方法,具體步驟如下所示:
1.測試案例查看圖片程式碼如下:
public void viewImage() throws Exception { // 建立倉庫服務對物件RepositoryService repositoryService = processEngine.getRepositoryService(); // 從倉庫尋找需要展示的檔案String deploymentId = "701"; List<String> names = repositoryService.getDeloymentId = "701"; List<String> names = repositoryService (deploymentId); String imageName = null; for (String name : names) { if(name.indexOf(".png")>=0){ imageName = name; } } if(imageName!=null){// System.out.println(imageName); File f = new File ("e:/"+ imageName); // 透過部署ID和檔案名稱得到檔案的輸入流InputStream in = repositoryService.getResourceAsStream(deploymentId, imageName); FileUtils.copyInputStreamToFile(in, f); }
說明:
1) deploymentId為流程部署ID
2) resourceName為act_ge_bytearray表中NAME_列的值
3) 使用repositoryService的getDeploymentResourceNames方法可以取得指定部署下得所有檔案的名稱
4) 使用repositoryService的getResourceAsStream方法傳入部署ID和檔案名稱可以取得部署下指定名稱檔案的輸入流
5) 最後的有關IO流的操作,使用FileUtils工具的copyInputStreamToFile方法完成流程流程到文件的拷貝
2、web項目中在流程定義頁面查看圖片:
public String viewImage(){InputStream in = repositoryService.getResourceAsStream.getImageStream(deploymentId,imageName);//此處方法實際專案應該放在service裡面HttpServletResponse resp = ServletActionContext.getResOutponse(Stream); ); //把圖片的輸入流程寫入resp的輸出流中byte[] b = new byte[1024]; for (int len = -1; (len= in.read(b))!=-1; ) { out. write(b, 0, len); } // 關閉流out.close(); in.close();} catch (IOException e) { e.printStackTrace();}return null;}
說明:
1) deploymentId為流程部署ID,imageName為圖片名稱
2) 因為是從流程定義清單頁面檢視圖片,id和imageName可以從流程定義(ProcessDefinition)取得(String getDeploymentId();和String getDiagramResourceName();)
3) web頁面標籤<a target="_blank" href="viewImage?deploymentId=1&imageName=imageName.png" rel="external nofollow" >查看流程圖</a>
3.web專案查看目前流程圖
public String viewCurrentImage(){ProcessDefinition pd = service.getProcessDefinitionByTaskId(taskId);// 1. 取得流程部署IDputContext("deploymentId", pd.getDeploymentId());// 2. 取得圖片的名稱Context(Context" , pd.getDiagramResourceName());// 3.取得目前活動的座標Map<String,Object> currentActivityCoordinates =service.getCurrentActivityCoordinates(taskId);putContext("acs", currentActivityCoordinates);return "image";}
其中service.getProcessDefinitionByTaskId(taskId);的程式碼實作:
public ProcessDefinition getProcessDefinitionByTaskId(String taskId) {// 1. 得到taskTask task = taskService.createTaskQuery().taskId(taskId).singleResult();// 2. 透過task repositoryService.getProcessDefinition(task.getProcessDefinitionId());return pd;}
其中service.getCurrentActivityCoordinates(taskId);的程式碼實作:
public Map<String, Object> getCurrentActivityCoordinates(String taskId) {Map<String, Object> coordinates = new HashMap<String, Object>();// 1. 取得目前活動的IDTask task = taskService.createTaskQuery().taskQuery().task (taskId).singleResult();ProcessInstance pi = runtimeService。 ));// 3. 使用流程定義透過currentActivitiId得到活動物件ActivityImpl activity = pd.findActivity(currentActivitiId);// 4. 取得活動的座標coordinates.put("x", activity.getX());coordinates.put("y" , activity.getY());coordinates.put("width", activity.getWidth());coordinates.put("height", activity.getHeight());return coordinates;}
image頁面部分:
從個人任務清單頁面點擊<a target="_blank" href="/viewCurrentImage?taskId=1" rel="external nofollow" >查看當前流程圖</a>跳到下面頁面:
<body><!-- 1.取得到規則流程圖這裡是用的strust2的標籤得到上面上面放入值棧的值--><img style="position: absolute;top: 0px;left: 0px; " src="viewImage?deploymentId=<s:property value='#deploymentId'/>&imageName=<s:property value='#imageName'/>"><!-- 2.根據目前活動的座標,動態繪製DIV --><div style="position: absolute;border:1px solid red;top:<s:property value ='#acs.y'/>px;left: <s:property value='#acs.x'/>px;width: <s:property value='#acs.width'/>px;height:<s:property value='#acs.height'/>px; "></div></body>