0

私の文書管理プロセスでは、追加の文書(コメントのリスト、相違点のリスト、スクリーンショットなど)を追加する必要があることがよくあります。ワークフローに添付ファイルを追加するにはどうすればよいですか?

これらの追加ドキュメントは、Activitiフォームに追加すると便利です。私は、ビジネスプロセスの開始段階と改訂の段階でドキュメントを追加できるようにしたいと考えています。このため

、Iはworkflow-model.xml(関連部分)に関連のある局面を追加:share-config-custom.xml

... 
<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 

をIは、以下の(関連部分)を有する:

... 
<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 

今は持っています私は適切な文書を選ぶことができる追加のフィールド。

enter image description here

それは動作します - 私はいくつかの文書を追加し、文書管理プロセスの各段階のすべてでそれらを見ることができます。

問題は、最初に選択したファイルのセットを変更しようとしたときに発生します。たとえば、新しいものを追加しようとしたときなどです。新しいものを追加(または削除)した場合、変更は保存されず、次のタスクでは最初に選択されたものと同じものが表示されます。

この動作を制御するために、私はプロパティを管理しようとするWebScriptを開発しました。私はいくつかの任意とreplace(...)方法を返すと、選択したファイルを置き換えるためにしようとしている

... 
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); 

... 

:私のJavaの担保WebScriptの一部

/** 
* 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; 
}, 

:私はgetAddedItems()方法で共有からWebScriptを呼び出しますtrue

:(パッケージ内の1つのファイル)WebScriptを呼び出した後

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

WebScriptを呼び出す前に(パッケージに2つのファイルを):alfrescotomcat-stdout.2017-09-06.logで、私はまた、プロパティが置き換えられていることを確認します

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

現在のタスクでフォームを更新した後、新しいファイルが表示されます。

しかし、値は変更/レビュー後に保存されず(紛失)、次のタスクでは同じファイルが表示されます。私はBPMN図にいくつかのデバッグコードを追加し、mswf_packageの内容がWebScriptを呼び出した後に変更していないことが判明

...それはactiviti$204647に等しくなった、のは、現在のユーザーのためのタスクIDがactiviti$204587だったとしましょう。

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

出力:: 'レビュータスク' で

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 

createcompleteイベントのリスナー:

'送信'、メイン設定で

enter image description here

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

出力:??ワークフローで追加の添付ファイルを追加する方法

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 

...それは可能です...

私は情報のために非常に感謝されます。ありがとうございます。

答えて

1

NodeRefsと文字列のセットは、例えば、以下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 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; 
    } 
} 

このコードは、特定のタスクの添付ファイルを上書き。

追加ファイルは、ドキュメント管理プロセスに関連するファイルと区別する必要があります。次のようにそれは、例えば、行うことができます。

/** 
* 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); 
}, 

プロセス変数でオーバーライドされた添付ファイルを保存するためには、completeイベントのリスナーを定義する必要があります。

また、それはこの技術を用いて(変更に)タスクからタスクへの連鎖によって「パス」ファイルすることが可能である:completeイベントの

リスナー:

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

のリスナーcreateイベント:

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

これが私の問題を解決しました。

関連する問題