如何删除任务?

时间:2017-12-10 19:18:28

标签: alfresco activiti alfresco-webscripts alfresco-enterprise

或者更准确地说 - 有没有办法从后续迭代中移除参与者,如果它被删除"在第一次迭代?

我的意思......

例如,有一些并行工作流程。我选择10参与者并启动此业务流程。因此,创建了10个任务,每个参与者一个。但后来我决定删除一些参与者。

据我所知,我无法删除任务。但我可以使用WebScript完成这些任务。例如,如下。我知道workflowIdtaskId

...
Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();

// String workflowId = templateArgs.get("workflowId");
String taskId = templateArgs.get("taskId");

Map<QName, Serializable> updatedProperties = new HashMap<>();
updatedProperties.put(TaskRemoverModel.REVIEW_OUTCOME_PROPERTY, "Approve"); 
updatedProperties.put(TaskRemoverModel.COMMENT_PROPERTY, 
    "The user was excluded from the list of participants.");

workflowService.updateTask(taskId, updatedProperties, null, null);
workflowService.endTask(taskId, null);
...

但问题是,在修改阶段,发起人可以再次发送批准。然后将再次创建排除参与者的任务。

有没有办法去&#34;标记&#34;这些参与者,以便将来没有为他们创建任务?

我将非常感谢这些信息。谢谢大家。

2 个答案:

答案 0 :(得分:1)

您可以从受理人列表中删除此人。当您完成任务时,请使用下面的代码从列表中删除人员使用javascript ,如果您使用bpm:assignees进行关联。

bpm_assignees.remove(person); //其中,person是当前登录的人。

您可以使用nodeService删除java中的关联。

答案 1 :(得分:0)

解决方案可以表示如下。

在WebScript中,需要更新任务属性并完成该任务。对于任务属性,添加新属性以及对被排除参与者(谁是所有者)的引用:

...
Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();

String taskId = templateArgs.get("taskId");

Map<QName, Serializable> updatedProperties = new HashMap<>();
updatedProperties.put(TaskRemoverModel.WORKFLOW_CONFIRM_MODEL_CONFIRMOUTCOME_PROPERTY, 
    "Approve"); 
updatedProperties.put(TaskRemoverModel.WORKFLOW_MODEL_LASTCOMMENT_PROPERTY, 
    I18NUtil.getMessage("task.comment.excluded"));

WorkflowTask workflowTask = workflowService.getTaskById(taskId);
Iterator taskProperties = workflowTask.getProperties().entrySet().iterator();
while(taskProperties.hasNext()) {
    Map.Entry taskProperty = (Map.Entry)taskProperties.next();
    if(TaskRemoverModel.CONTENT_MODEL_OWNER_PROPERTY.toString().equals(
      taskProperty.getKey().toString())) {
        updatedProperties.put(TaskRemoverModel.TASK_WAS_EXCLUDED_SIGN, 
                personService.getPerson(taskProperty.getValue().toString()));
    }

}

workflowService.updateTask(taskId, updatedProperties, null, null);
workflowService.endTask(taskId, null);
...

对于任务的complete事件,添加侦听器。在WebScript中调用此侦听器之后,此侦听器将起作用:

...
workflowService.endTask(taskId, null);
...

在侦听器中,找到此新属性,其中包含对已排除参与者的引用。然后获取bpm_assignees列表并从该列表中删除该参与者的引用,并再次设置变量bpm_assignees

public class TaskCompleteListener implements TaskListener {
    private Map<Object, Object> registeredBeans = 
        Context.getProcessEngineConfiguration().getBeans(); 
    private ServiceRegistry registry = 
        (ServiceRegistry) registeredBeans.get(
            ActivitiConstants.SERVICE_REGISTRY_BEAN_KEY);
    private WorkflowService workflowService = registry.getWorkflowService();  

    @Override
    public void notify(DelegateTask delegateTask) {
        WorkflowTask workflowTask = 
            workflowService.getTaskById("activiti$" + delegateTask.getId());
        Map<QName, Serializable> taskProperties = workflowTask.getProperties();

        Iterator iterator = taskProperties.entrySet().iterator();
        while(iterator.hasNext()) {
            Map.Entry taskProperty = (Map.Entry)iterator.next();            
            if(taskProperty.getKey().toString().equals(
             ContractsApprovalModel.TASK_WAS_EXCLUDED_SIGN)) {
                ActivitiScriptNodeList assignees = 
                    (ActivitiScriptNodeList) delegateTask.getVariable("bpm_assignees");
                for(ActivitiScriptNode personNode : assignees) {
                    if(personNode.getNodeRef().toString().equals(
                      taskProperty.getValue().toString())) {
                        assignees.remove(personNode);
                    }
                }
                delegateTask.setVariable("bpm_assignees", assignees);
            }            
        }
    }
}

之后,可以在运行时删除参与者的任务,并且在重新提交后不会生成这些参与者任务。