Das Beispiel in diesem Artikel zeigt die Implementierungsmethode der Activiti-Flussdiagrammanzeige. Die spezifischen Schritte sind wie folgt:
1. Der Testfall zum Anzeigen des Bildcodes lautet wie folgt:
public void viewImage() throws Exception { // Ein Warehouse-Serviceobjekt erstellen RepositoryService inventoryService =processEngine.getRepositoryService(); // Finden Sie die Dateien, die aus dem Warehouse angezeigt werden müssen Stringbereitstellungs-ID = "701"; RepositoryService.getDeploymentResourceNames (deploymentId); String imageName = null for (String name : Names) { if(name.indexOf(".png")>=0){ imageName = name; } } if(imageName!=null){// System.out.println(imageName); /"+ imageName); // Den Eingabestream der Datei über die Bereitstellungs-ID und den Dateinamen abrufen InputStream in = inventoryService.getResourceAsStream(deploymentId, imageName); FileUtils.copyInputStreamToFile(in, f);
veranschaulichen:
1) „deploymentId“ ist die Prozessbereitstellungs-ID
2) „resourceName“ ist der Wert der Spalte „NAME_“ in der Tabelle „act_ge_bytearray“.
3) Verwenden Sie die Methode „getDeploymentResourceNames“ von „repositoryService“, um die Namen aller Dateien unter der angegebenen Bereitstellung abzurufen
4) Verwenden Sie die getResourceAsStream-Methode von RepositoryService, um die Bereitstellungs-ID und den Dateinamen zu übergeben und den Eingabestream der Datei mit dem angegebenen Namen unter der Bereitstellung zu erhalten.
5) Für den letzten E/A-Stream-Vorgang verwenden Sie die Methode copyInputStreamToFile des FileUtils-Tools, um die Kopie des Prozessflusses in die Datei abzuschließen.
2. Sehen Sie sich das Bild auf der Prozessdefinitionsseite im Webprojekt an:
public String viewImage(){InputStream in = inventoryService.getResourceAsStream.getImageStream(deploymentId,imageName);//Das eigentliche Projekt der Methode hier sollte im Dienst HttpServletResponse resp = ServletActionContext.getResponse();try { OutputStream out = resp .getOutputStream( ); // Schreibe den Bildeingabeprozess in den jeweiligen Ausgabestream byte[] b = new byte[1024]; for (int len = -1; (len= in.read(b))!=-1; ) { out.write(b, 0, len } // Den Stream schließen .close( ); in.close();} Catch (IOException e) { e.printStackTrace();}return null;}
veranschaulichen:
1) „deploymentId“ ist die Prozessbereitstellungs-ID, „imageName“ ist der Bildname
2) Da das Bild auf der Seite mit der Prozessdefinitionsliste angezeigt wird, können die ID und der Bildname aus der Prozessdefinition (ProcessDefinition) abgerufen werden (String getDeploymentId(); und String getDiagramResourceName();)
3) Webseiten-Tag <a target="_blank" href="viewImage?deploymentId=1&imageName=imageName.png" rel="external nofollow" >Flussdiagramm anzeigen</a>
3. Sehen Sie sich das aktuelle Flussdiagramm des Webprojekts an
public String viewCurrentImage(){ProcessDefinition pd = service.getProcessDefinitionByTaskId(taskId);// 1. Rufen Sie die Prozessbereitstellungs-ID ab putContext("deploymentId", pd.getDeploymentId());// 2. Rufen Sie den Namen des Prozessabbilds putContext ab ("imageName" , pd.getDiagramResourceName());// 3. Holen Sie sich die Koordinaten der aktuellen Aktivität Map<String,Object> currentActivityCoordinates =service.getCurrentActivityCoordinates(taskId);putContext("acs", currentActivityCoordinates);return "image";}
Die Code-Implementierung von service.getProcessDefinitionByTaskId(taskId);
public ProcessDefinition getProcessDefinitionByTaskId(String taskId) {// 1. TaskTask task = taskService.createTaskQuery().taskId(taskId).singleResult();// abrufen 2. Prozessdefinitionsobjekt ProcessDefinition über die pdid des Aufgabenobjekts pd = abrufen RepositoryService.getProcessDefinition (task.getProcessDefinitionId());return pd;}
Die Code-Implementierung von service.getCurrentActivityCoordinates(taskId);
public Map<String, Object> getCurrentActivityCoordinates(String taskId) {Map<String, Object> columns = new HashMap<String, Object>(); // 1. Holen Sie sich die aktuell aktive IDTask task = taskService.createTaskQuery().taskId ( taskId).singleResult();ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();String currentActivitiId = pi.getActivityId();// 2. Holen Sie sich die Prozessdefinition ProcessDefinitionEntity pd = (ProcessDefinitionEntity) inventoryService.getProcessDefinition(task.getProcessDefinitionId( ));// 3. Verwenden Sie die Prozessdefinition, um das Aktivitätsobjekt ActivityImpl über currentActivitiId abzurufen.activity = pd.findActivity(currentActivitiId);// 4. Rufen Sie die Koordinaten der Aktivität ab columns.put("x",activity.getX()); put("y" ,activity.getY());coordinates.put("width",activity.getWidth());coordinates.put("height", Activity.getHeight());Rückgabekoordinaten;}
Bildseitenteil:
Klicken Sie auf der Seite mit der persönlichen Aufgabenliste auf <a target="_blank" href="/viewCurrentImage?taskId=1" rel="external nofollow" >Aktuelles Flussdiagramm anzeigen</a>, um zur folgenden Seite zu springen:
<body><!-- 1. Rufen Sie das Regelflussdiagramm ab. Hier verwenden wir das Tag strust2, um den oben in den Wertestapel eingefügten Wert abzurufen--><img style="position: absolute;top: 0px;left: 0px". ; " src="viewImage?deploymentId=<s:property value='#deploymentId'/>&imageName=<s:property value='#imageName'/>"><!-- 2. DIV dynamisch entsprechend den Koordinaten der aktuellen Aktivität zeichnen --><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>