L'exemple de cet article montre la méthode d'implémentation de l'affichage du diagramme de flux Activiti. Les étapes spécifiques sont les suivantes :
1. Le code d'image de visualisation du scénario de test est le suivant :
public void viewImage() throws Exception { // Créer un objet de service d'entrepôt RepositoryService depositService = processEngine.getRepositoryService(); // Rechercher les fichiers qui doivent être affichés à partir de l'entrepôt String déploiementId = "701"; référentielService.getDeploymentResourceNames (deploymentId); String imageName = null for (String name : noms) { if(name.indexOf(".png")>=0){ imageName = name; } } if(imageName!=null){// System.out.println(imageName); /"+ imageName); // Récupère le flux d'entrée du fichier via l'ID de déploiement et le nom du fichier InputStream in = depositService.getResourceAsStream(deploymentId, imageName); FileUtils.copyInputStreamToFile(in, f);
illustrer:
1) déploiementId est l'ID de déploiement du processus
2) resourceName est la valeur de la colonne NAME_ dans la table act_ge_bytearray
3) Utilisez la méthode getDeploymentResourceNames de depositService pour obtenir les noms de tous les fichiers sous le déploiement spécifié
4) Utilisez la méthode getResourceAsStream de depositService pour transmettre l'ID de déploiement et le nom de fichier afin d'obtenir le flux d'entrée du fichier avec le nom spécifié sous le déploiement.
5) Pour l'opération finale du flux IO, utilisez la méthode copyInputStreamToFile de l'outil FileUtils pour terminer la copie du flux de processus dans le fichier.
2. Affichez l'image sur la page de définition du processus dans le projet Web :
public String viewImage(){InputStream in = depositService.getResourceAsStream.getImageStream(deploymentId,imageName);//Le projet réel de la méthode ici doit être placé dans le service HttpServletResponse resp = ServletActionContext.getResponse();try { OutputStream out = resp .getOutputStream( ); // Écrit le processus d'entrée d'image dans le flux de sortie resp byte[] b = new byte[1024]; for (int len = -1; (len= in.read(b))!=-1; ) { out.write(b, 0, len } // Ferme le flux .close( ); in.close();} catch (IOException e) { e.printStackTrace();}return null;}
illustrer:
1) déploiementId est l'ID de déploiement du processus, imageName est le nom de l'image
2) Étant donné que l'image est affichée à partir de la page de liste de définitions de processus, l'identifiant et le nom d'image peuvent être obtenus à partir de la définition de processus (ProcessDefinition) (String getDeploymentId(); et String getDiagramResourceName();)
3) Balise de page Web <a target="_blank" href="viewImage?deploymentId=1&imageName=imageName.png" rel="external nofollow" >Afficher l'organigramme</a>
3. Afficher l'organigramme actuel du projet Web
public String viewCurrentImage(){ProcessDefinition pd = service.getProcessDefinitionByTaskId(taskId);// 1. Obtenez l'ID de déploiement du processus putContext("deploymentId", pd.getDeploymentId());// 2. Obtenez le nom de l'image du processus putContext ("nomimage" , pd.getDiagramResourceName());// 3. Obtenez les coordonnées de l'activité en cours Map<String,Object> currentActivityCoordonnées =service.getCurrentActivityCoordonnées(taskId);putContext("acs", currentActivityCoordonnées);return "image";}
L'implémentation du code de service.getProcessDefinitionByTaskId(taskId);
public ProcessDefinition getProcessDefinitionByTaskId(String taskId) {// 1. Obtenez taskTask task = taskService.createTaskQuery().taskId(taskId).singleResult();// 2. Obtenez l'objet de définition de processus ProcessDefinition via le pdid de l'objet de tâche pd = référentielService.getProcessDefinition (task.getProcessDefinitionId());retour pd ;}
L'implémentation du code de service.getCurrentActivityCoordonnées(taskId) est :
public Map<String, Object> getCurrentActivityCoordonnées(String taskId) {Map<String, Object> coordinates = new HashMap<String, Object>(); // 1. Obtenez la tâche IDTask actuellement active = taskService.createTaskQuery().taskId ( taskId).singleResult();ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();String currentActivitiId = pi.getActivityId();// 2. Obtenez la définition du processus ProcessDefinitionEntity pd = (ProcessDefinitionEntity) référentielService.getProcessDefinition(task.getProcessDefinitionId( ));// 3. Utilisez la définition de processus pour obtenir l'objet d'activité ActivityImpl via currentActivitiId Activity = pd.findActivity(currentActivitiId);// 4. Obtenez les coordonnées de l'activité coordinates.put("x", Activity.getX()); put("y" , activité.getY());coordonnées.put("largeur", activité.getWidth());coordonnées.put("hauteur", Activity.getHeight());coordonnées de retour;}
partie de la page image :
Sur la page de liste des tâches personnelles, cliquez sur <a target="_blank" href="/viewCurrentImage?taskId=1" rel="external nofollow" >Afficher l'organigramme actuel</a> pour accéder à la page suivante :
<body><!-- 1. Obtenez l'organigramme des règles. Ici, nous utilisons la balise strust2 pour obtenir la valeur mise dans la pile de valeurs ci-dessus--><img style="position: absolu;top: 0px;left: 0px ; " src="viewImage?deploymentId=<s:property value='#deploymentId'/>&imageName=<s:property value='#imageName'/>"><!-- 2. Dessinez dynamiquement le DIV en fonction des coordonnées de l'activité en cours --><div style="position: absolue;border:1px solid red;top:<s: valeur de la propriété ='#acs.y'/>px;gauche : <s:property value='#acs.x'/>px;largeur : <s:property value='#acs.width'/>px;hauteur :<s:property value='#acs.height'/>px "></div></body>