Есть ли какой-то адекватный вариант сделать условия для сервисной задачи? BPM Jmix 2.0

Есть сервисная задача, необходимо по результатам ее выполнения выделить 2 ветки куда дальше двинется процесс, каким образом это можно реализовать? (в формах ауткомы есть, а в сервисных не нашел)

image
подобное ветвление, только не пользовательская задача, а сервисная

Добрый день,

Конечно же такой механизм есть, в принципе на UserTask + Service Task + TimerEvent + Error Event можно написать любой бизнес процесс любой сложности прибегая как раз таки к ServiceTask в сложных случаях.

Концепция

Самый простой вариант описан тут: BPMN 2.0 Constructs · Flowable Open Source Documentation

  1. Вам нужна либо SpringBean либо JavaDelegate либо Delegate (нужно вызвать Java делегат).
  2. Внутри делегата мы вызываем нашу бизнес логику, результат выполнения через Flowable API (RuntimeService SpringBean) складываем в процесс
  3. В процессе на sequenceFlow(ветки выходящие из Gate) мы ставим expression условие, по которому мы входим в ветку
  4. получили то самое ветвление

Пример

1) Создаем SpringBean:

У нас будет готовый спринг компонент(сервис) который будет выполнять бизнес логипу и складывать результат в переменную процесса, которая понадобиться в самом процессе, чтобы понять, куда далее идти

@Component("project_YourSpringBeanService")
public abstract class YourSpringBeanService implements JavaDelegate {
    private final SystemAuthenticator systemAuthenticator;
    private final RuntimeService runtimeService;
    private final DataManager dataManager;

    protected AbstractStep(...) {
        ... // Spring Constructor DI, nothing interesting
    }

    protected void runBusinessLogics(DelegateExecution execution) {
         ...// Your business logics here
        persistVariable("resultCheck", "true");
    }

    @Override
    public void execute(DelegateExecution execution) {
        // Running as system for escaping errors for unauthorized with data exception 
        systemAuthenticator.runWithSystem(() -> runBusinessLogics(execution));
    }

    protected void persistVariable(DelegateExecution execution, String variableName, Object value) {
        runtimeService.setVariable(execution.getId(), variableName, value);
    }

    protected void persistVariables(DelegateExecution execution, Map<String, Object> variables) {
        runtimeService.setVariables(execution.getId(), variables);
    }

    @SuppressWarnings("unchecked")
    protected <T> T getVariable(DelegateExecution execution, String variableName) {
        return (T) runtimeService.getVariable(execution.getId(), variableName);
    }
}

2) Пропишем сервис таску в бизнес процессе и ее sequenceFlow

<serviceTask id="SERVICE_TASK_RUN" name="Запуск сервис таски" flowable:expression="${project_YourSpringBeanService.execute(execution)}" jmix:taskType="springBean" jmix:beanName="project_YourSpringBeanService">
      <extensionElements>
        <jmix:springBean beanName="project_YourSpringBeanService" methodName="execute">
          <jmix:methodParam name="execution" type="org.flowable.engine.delegate.DelegateExecution" isVariable="true">execution</jmix:methodParam> 
тут мы прокидываем переменную которая дает данные о процессе
        </jmix:springBean>
      </extensionElements>
      <outgoing>FLOW_INTO_GATE</outgoing>
    </serviceTask>
  1. Далее эта сервис таска выходит в нужный Gate, например, ExcludingGate
  2. Из гейта выходят подобные SequenceFlow, который имеют expression условия:

<sequenceFlow id="POSITIVE_FLOW_FROM_GATE" name="положительный выход из гейта">
      <extensionElements>
        <jmix:conditionDetails conditionSource="expression"/>
      </extensionElements>
      <conditionExpression xsi:type="tFormalExpression">${resultCheck == 'true'}</conditionExpression>
    </sequenceFlow>

Для негативного флоу надо сделать тоже самое но с условием resultCheck == 'false'

1 симпатия