如何删除任务?

How to delete a task?

或者更准确地说 - 如果参与者在第一次迭代时是 "deleted",是否有办法从后续迭代中删除参与者?

我的意思是...

例如,有一些并行的工作流程。我选择了 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);
...

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

有没有办法 "mark" 这些参与者,以便以后不为他们创建任务?

如果能提供信息,我将不胜感激。感谢大家。

您可以从 assignee.When 列表中删除您完成任务使用下面的代码从列表中删除人员 使用 java 脚本 ,如果您使用 bpm:assignees 进行关联。

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

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

解决方案可以表示如下。

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

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