Как удалить задачу?

Или точнее - есть ли способ удалить участника из последующих итераций, если он был "удален" на первой итерации?

Что я имею в виду...

Например, есть какой-то параллельный рабочий процесс. Я выбрал 10 участников и инициировал этот бизнес-процесс. Таким образом, было создано 10 заданий, по одному на каждого участника. Но потом я решил удалить нескольких участников.

Насколько я знаю, я не могу удалить задачу. Но я могу выполнить эти задачи с помощью WebScript. Например, следующим образом. Я знаю workflowId и taskId:

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

Но проблема в том, что на этапе доработки инициатор может снова отправить на согласование. Затем задачи для исключенных участников будут созданы заново.

Есть ли способ «пометить» этих участников, чтобы в дальнейшем для них не создавались задачи?

Буду очень благодарен за информацию. Спасибо всем.


person Community    schedule 10.12.2017    source источник
comment
Вы должны иметь возможность удалить участников после завершения задачи из переменной рабочего процесса, чтобы дальнейшие задачи не создавали следующую версию.   -  person Muralidharan Deenathayalan    schedule 11.12.2017


Ответы (2)


Вы можете удалить человека из списка уполномоченных. Когда вы выполните задачу, используйте приведенный ниже код, чтобы удалить человека из списка с помощью javascript, если вы используете bpm:assignees для связи.

bpm_assignees.remove(person); // где person — это человек, вошедший в систему в данный момент.

Вы можете использовать nodeService для удаления ассоциации в java.

person Krutik Jayswal    schedule 11.12.2017
comment
Я собираюсь напечатать то же самое. - person Muralidharan Deenathayalan; 11.12.2017
comment
это не имеет значения, я думаю - person Krutik Jayswal; 11.12.2017

Решение можно представить следующим образом.

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

После этого появляется возможность удалять задачи участников во время выполнения и после повторной отправки для этих участников задачи не генерируются.

person Community    schedule 11.12.2017