如何在工作流程中添加其他附件?

时间:2017-09-06 07:06:51

标签: workflow alfresco alfresco-share activiti alfresco-webscripts

在我的文档管理过程中,通常需要提供一些额外的文档(例如评论列表,差异列表,一些屏幕截图等)。

这些附加文档可以方便地添加到Activiti表单中。我希望能够在业务流程的初始阶段和修订阶段添加文档。

为此,我在workflow-model.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

share-config-custom.xml我有以下(相关部分):

...
<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,在其中我尝试管理属性。我使用getAddedItems()方法从Share中调用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;
},

我支持Java的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);

...

我正在尝试用一些任意替换所选文件,replace(...)方法返回true。在alfrescotomcat-stdout.2017-09-06.log中,我也看到该属性已被替换:

在调用WebScript(包中的两个文件)之前:

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

调用WebScript(包中的一个文件)后:

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

在当前任务更新表单后,我会看到我的新文件。

但是在修改/审核后没有保存(丢失)值,在下一个任务中我看到相同的文件。比方说,当前用户的任务ID为activiti$204587,然后它变为等于activiti$204647 ......

我在BPMN图中添加了一些调试代码,发现调用WebScript后mswf_package的内容没有改变。

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

在“审核任务”中,createcomplete事件的听众:

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 个答案:

答案 0 :(得分: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事件的监听器。

此外,有可能通过&#34;通过使用这种技术将链从任务链接到任务(带有更改):

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"));
    }
}

这解决了我的问题。

相关问题