3.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}