4.6. Переходы в зависимости от выхода задачи
В отличие от jBPM, в нотации BPMN отсутствует возможность указать несколько выходов из одной задачи. Чтобы направить процесс по нужной ветке в зависимости от результата, используется узел Exclusive Gateway, переходы из которого имеют условия, оперирующие результатом выполнения задачи, расположенной перед этим Gateway. При завершении пользователем задачи результат его действия записывается в процессную переменную с именем [taskId]_result
. Тип этой переменной – ProcTaskResult
.
Методы класса ProcTaskResult
:
-
int count(String outcomeName)
– возвращает количество пользователей, завершивших задачу с данным выходом; -
boolean exists(String outcomeName)
– возвращаетtrue
, если есть хотя бы один пользователь, завершивший задачу с указанным выходом.
Далее объект с результатом используется в выражении Flow condition для переходов, выходящих из Gateway.
Предположим, что задача approval
была параллельно назначена нескольким пользователям. Для задачи были определены два возможных выхода: approve
и reject
. После того как все пользователи завершат задачу, процесс перейдет к Exclusive gateway. Нам нужно следующее поведение: если хоть кто-либо выбрал вариант reject
, то переходим по переходу Rejected
, если все согласились (approve
), то по Approved
.
Задание условия в поле Flow outcome
Самым удобным вариантом задания условия, который подойдет для большинства случаев, является выбор имени outcome предыдущей задачи в свойстве Flow outcome стрелки перехода. Данный переход сработает, если было хотя бы одно завершение задачи с указанным outcome.
Задание сложных условий для перехода
Если необходимо иметь более сложные условия для перехода, то их можно задать в поле Flow condition. Например условие "Более 5 пользователей выбрали вариант `Reject`" будет выглядеть следующим образом:
${approval_result.count('reject') > 5}