0

In meinem Dokument-Management-Prozess ist es oft notwendig, einige zusätzliche Dokumente (z. B. Liste der Kommentare, Liste der Unterschiede, einige Screenshots, etc.) zur Verfügung zu stellen.Wie füge ich zusätzliche Anhänge in den Workflow ein?

Diese zusätzlichen Dokumente sind bequem in den Activiti-Formularen hinzuzufügen. Ich möchte Dokumente in der Anfangsphase eines Geschäftsprozesses und in der Phase der Überarbeitung hinzufügen können.

Dazu habe ich einen Aspekt mit den Verbänden in dem workflow-model.xml (relevanten Teil):

... 
<type name="mswf:activitiRevise"> 
    ... 
    <mandatory-aspects> 
     ... 
     <aspect>mswf:attachments</aspect> 
    </mandatory-aspects> 
</type>   
... 
<aspect name="mswf:attachments"> 
    <associations> 
     <association name="mswf:package"> 
      <source> 
       <mandatory>false</mandatory> 
       <many>true</many> 
      </source> 
      <target> 
       <class>cm:content</class> 
       <mandatory>false</mandatory> 
       <many>true</many> 
      </target> 
     </association> 
    </associations>  
</aspect> 
... 
etc 

In share-config-custom.xml Ich habe den folgenden (relevanten Teil):

... 
<config evaluator="task-type" condition="bpm:startTask"> 
    <forms> 
     <form id="workflow-details"> 
      <field-visibility> 
       ... 
       <show id="mswf:package" /> 
      </field-visibility> 
      <appearance> 
       ... 
       <set id="attachments" appearance="title" label-id="Additional docs" /> 
       <field id="mswf:package" set="attachments" /> 
      </appearance> 
     </form> 
     <form> 
      <field-visibility> 
       <show id="mswf:package" /> 
       ... 
      </field-visibility> 
      <appearance> 
       <set id="attachments" appearance="title" label-id="Additional docs" /> 
       <field id="mswf:package" set="attachments" /> 
       ... 
      </appearance> 
     </form> 
    </forms> 
</config> 
... 
etc 

Jetzt habe ich eine zusätzliches Feld, in dem ich die passenden Dokumente auswählen kann.

enter image description here

Es funktioniert - ich einige Dokumente hinzugefügt und sie an allen Phasen des Dokumenten-Management-Prozess sehen.

Das Problem tritt auf, wenn ich versuche, eine Reihe von ursprünglich ausgewählten Dateien zu ändern. Zum Beispiel, wenn ich versuche, ein neues hinzuzufügen. Wenn ich eine neue hinzufügen (oder entfernen) - Änderungen werden nicht gespeichert und in der nächsten Aufgabe sehe ich die gleichen Dokumente, die am Anfang ausgewählt wurden.

Um Kontrolle über dieses Verhalten zu erhalten, habe ich WebScript entwickelt, in dem ich versuche, Eigenschaften zu verwalten. Ich nenne die WebScript von Teilen in der getAddedItems() Methode:

/** 
* Returns items that have been added to the current value 
* 
* @method getAddedItems 
* @return {array} 
*/ 
getAddedItems: function ObjectFinder_getAddedItems() { 
    var addedItems = [], 
    currentItems = Alfresco.util.arrayToObject(this.options.currentValue.split(",")); 

    for (var item in this.selectedItems) { 
     if (this.selectedItems.hasOwnProperty(item)) { 
      if (!(item in currentItems)) { 
       addedItems.push(item);      
      } 
     } 
    } 

    ... 

    // here the call to the WebScript 

    return addedItems; 
}, 

Teil meiner Java-backed WebScript:

... 
public class WorkflowAttachmentsManipulator extends DeclarativeWebScript { 
    private static final String WORKFLOW_MODEL_URI = "..."; 
    private WorkflowService workflowService; 

    @Override 
    protected Map<String, Object> executeImpl(WebScriptRequest req, Status status) { 
     Map<String, Object> model = new HashMap<>(); 

     String taskId = req.getParameter("taskId"); 
     String addedItem = req.getParameter("addedItem"); 

     WorkflowTask workflowTask = workflowService.getTaskById(taskId); 
     Map<QName, Serializable> taskProperties = workflowTask.getProperties(); 

     ... 
     taskProperties.replace(
      QName.createQName(WORKFLOW_MODEL_URI, "package"), oldValue, addedItem); 
     workflowService.updateTask(taskId, taskProperties, null, null); 

... 

Ich versuche, um die ausgewählten Dateien mit einer beliebigen und die replace(...) Verfahren kehrt zu ersetzen true. In alfrescotomcat-stdout.2017-09-06.log Ich sehe auch, dass die Eigenschaft ersetzt wurde:

Vor dem WebScript (zwei Dateien im Paket) Aufruf:

key: {WORKFLOW_MODEL_URI_HERE}package 
value: [workspace://SpacesStore/7f980005-2a1b-49a5-a8ff-ce9dff31a98a, 
     workspace://SpacesStore/30d9122f-4467-451b-aeab-ca8b164f7769] 

Nach dem WebScript (eine Datei im Paket) Aufruf:

key: {WORKFLOW_MODEL_URI_HERE}package 
value: workspace://SpacesStore/1a0b110f-1e09-4ca2-b367-fe25e4964a4e 

Nach dem Aktualisieren des Formulars bei der aktuellen Aufgabe sehe ich meine neue Datei.

Aber der Wert wird nicht gespeichert (verloren) nach Überarbeitung/Überprüfung und in der nächsten Aufgabe sehe ich die gleichen Dateien. Lassen Sie uns sagen, war die Task-ID für den aktuellen Benutzer activiti$204587, dann wurde es activiti$204647 gleich ...

Ich habe gefunden einige Debug-Code zu dem BPMN-Diagramm und dass der Inhalt der mswf_package nicht nach dem Aufruf der WebScript geändert hat.

enter image description here

In 'Senden', Haupt config:

for(var i = 0; i < mswf_package.size(); i++) { 
    logger.log(mswf_package.get(i).nodeRef); 
} 

Ausgang:

DEBUG [repo.jscript.ScriptLogger] [http-apr-8080-exec-9] workspace://SpacesStore/7f980005-2a1b-49a5-a8ff-ce9dff31a98a 
DEBUG [repo.jscript.ScriptLogger] [http-apr-8080-exec-9] workspace://SpacesStore/30d9122f-4467-451b-aeab-ca8b164f7769 

In 'Überprüfung der Aufgabe', Hörer der create und complete Ereignisse:

for(var i = 0; i < mswf_package.size(); i++) { 
    logger.log(mswf_package.get(i).nodeRef); 
} 

Ausgang:

DEBUG [repo.jscript.ScriptLogger] [http-apr-8080-exec-9] workspace://SpacesStore/7f980005-2a1b-49a5-a8ff-ce9dff31a98a 
DEBUG [repo.jscript.ScriptLogger] [http-apr-8080-exec-9] workspace://SpacesStore/30d9122f-4467-451b-aeab-ca8b164f7769 

Wie weitere Anlagen im Workflow hinzufügen ... Ist es möglich, ...

ich für die Informationen sehr dankbar sein würde?. Dank an alle.

Antwort

1

Eine Reihe von Strings mit NodeRefs kann an folgenden WebScript weitergegeben werden, zum Beispiel:

public class WorkflowAttachmentsManipulator extends DeclarativeWebScript { 
    private static final String WORKFLOW_MODEL_URI = "..."; 
    private WorkflowService workflowService; 

    @Override 
    protected Map<String, Object> executeImpl(WebScriptRequest req, Status status) { 
     Map<String, Object> model = new HashMap<>(); 

     String taskId = req.getParameter("taskId"); 
     String addedItems = req.getParameter("addedItems"); 

     String oldValue = ""; 

     WorkflowTask workflowTask = workflowService.getTaskById(taskId); 
     Map<QName, Serializable> taskProperties = workflowTask.getProperties(); 

     Iterator taskIterator = taskProperties.entrySet().iterator(); 
     while(taskIterator.hasNext()) { 
      Map.Entry taskPair = (Map.Entry)taskIterator.next(); 
      Object key = taskPair.getKey(); 
      if(key != null && 
       key.toString().equalsIgnoreCase("{" + WORKFLOW_MODEL_URI + "}package")) { 

       if(taskPair.getValue() != null) { 
        oldValue = taskPair.getValue().toString(); 
        if(!oldValue.equals("[]")) { 
         oldValue = oldValue.replaceAll("[\\[\\]]", ""); 
         addedItems = "[" + oldValue + "," + addedItems + "]"; 
        } else { 

         if(addedItems.indexOf(",") > 0) { 
          addedItems = "[" + addedItems + "]";  
         } 
        } 
       } 

       taskProperties.replace(
        QName.createQName(WORKFLOW_MODEL_URI, "package"), 
        oldValue, 
        addedItems); 

       workflowService.updateTask(workflowTask.getId(), 
        taskProperties, null, null); 

       break; 
      } 
     } 
     ... 
    } 

    public WorkflowService getWorkflowService() { 
     return workflowService; 
    } 

    public void setWorkflowService(WorkflowService workflowService) { 
     this.workflowService = workflowService; 
    } 
} 

Dieser Code überschreibt Anhänge für die bestimmte Aufgabe.

Zusätzliche Dateien müssen von denen unterschieden werden, die am Dokumentenverwaltungsprozess beteiligt sind. Es kann zum Beispiel dadurch geschehen, wie folgt:

/** 
* Returns items that have been added to the current value 
* 
* @method getAddedItems 
* @return {array} 
*/ 
getAddedItems: function ObjectFinder_getAddedItems() { 
    var addedItems = [], 
    currentItems = Alfresco.util.arrayToObject(this.options.currentValue.split(",")); 

    var attachments = []; 

    for (var item in this.selectedItems) { 
     if (this.selectedItems.hasOwnProperty(item)) {   
      if (!(item in currentItems)) { 
       // modified for differentiation 
       if (this.options.displayMode == "items") { 
        attachments.push(item); 
       } else { 
        addedItems.push(item);      
       } 
      } 
     } 
    } 

    ... 

    // call to the WebScript with attachments 

    // modified for merge 
    return addedItems.concat(attachments); 
}, 

Für die überschriebenen Anlagen in der Prozessvariablen Speichern ist es notwendig, den Hörer des complete Ereignis zu definieren.

Darüber hinaus ist es möglich, Dateien von der Kette von Aufgabe zu Aufgabe „pass“ (mit Änderungen) durch Verwendung dieser Technik:

Listener der complete Veranstaltung:

public class TaskCompleteListener implements TaskListener { 
    @Override 
    public void notify(DelegateTask delegateTask) { 
     DelegateExecution execution = delegateTask.getExecution();  
     execution.setVariable("mswf_package", delegateTask.getVariable("mswf_package")); 
    } 
} 

Zuhörer von der create Veranstaltung:

public class TaskCreateListener implements TaskListener { 
    @Override 
    public void notify(DelegateTask delegateTask) { 
     DelegateExecution execution = delegateTask.getExecution(); 
     delegateTask.setVariable("mswf_package", execution.getVariable("mswf_package")); 
    } 
} 

Dies löste mein Problem.

Verwandte Themen