BPM API
Jmix BPM использует Flowable API, что обеспечивает легкое взаимодействие приложения Spring Boot с процессным движком. Также REST API Flowable предлагает широкие возможности для интеграции с внешними приложениями. Понимание доступных API позволяет разработчикам максимально эффективно использовать Flowable в дополнении Jmix BPM.
Flowable API
Flowable API позволяет программно запускать экземпляры процессов, завершать задачи и выполнять различные запросы, например, получать список задач для пользователя или активные экземпляры определения процесса.
 
| В проектах Jmix BPM не используются FormServiceиIdentityServiceFlowable. Дополнение предоставляет BpmTaskService, расширяющую TaskService Flowable. См. пример использования ниже. | 
Доступ к сервисам Flowable можно получить одним из двух способов:
- 
Используя ProcessEngines:ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); RepositoryService repositoryService = processEngine.getRepositoryService(); TaskService taskService = processEngine.getTaskService();
- 
Инжектируя сервисы в бины, поскольку они зарегистрированы как Spring-бины: @Component("sample_MyCustomBean") public class MyCustomBean { @Autowired private RuntimeService runtimeService;
Примеры
Программный запуск процесса
В приведенном ниже примере процесс запускается программно из обычного редактора сущностей с помощью RuntimeService:
@Autowired
private RuntimeService runtimeService;
@Subscribe("commitAndCloseBtn")
public void onCommitAndCloseBtnClick(Button.ClickEvent event) {
    Customer customer = getEditedEntity();
    String name = customer.getName();
    Map<String, Object> params = new HashMap<>();
    params.put("customer", customer); (1)
    params.put("name", name); (2)
    runtimeService.startProcessInstanceByKey( (3)
            "new-customer",
            params);
}| 1 | Метод размещает редактируемую сущность в переменной процесса customer. | 
| 2 | Имя клиента помещается в переменную процесса с типом String. | 
| 3 | Вызов RuntimeServiceдля запуска нового экземляра процесса, где:
 | 
Получение списка пользовательских задач
Рассмотрим пример получения списка активных задач, назначенных аутентифицированному пользователю:
@Autowired
private TaskService taskService;
@Autowired
private CurrentAuthentication currentAuthentication;
public List<Task> getCurrentUserTasks() {
    return taskService.createTaskQuery() (1)
            .processDefinitionKey("approval") (2)
            .taskAssignee(currentAuthentication.getUser().getUsername()) (3)
            .active()
            .orderByTaskCreateTime()
            .desc()
            .list();
}| 1 | Метод формирует запрос для получения задач. | 
| 2 | Запрос фильтруется, чтобы включать задачи относящиеся к определению процесс с ключом approval. | 
| 3 | Запрос фильтруется, чтобы включать задачи, назначенные текущему пользователю. | 
Получение списка экземпляров процесса
В примере ниже показано получение списка экземпляров процесса с ключом approval, относящегося к указанной сущности Order:
@Autowired
private RuntimeService runtimeService;
public List<ProcessInstance> getActiveProcessInstances() {
    return runtimeService.createProcessInstanceQuery() (1)
            .processDefinitionKey("approval") (2)
            .variableValueEquals("orderId", "N-1") (3)
            .active()
            .list();
}| 1 | Метод формирует запрос для получения экземпляров процесса. | 
| 2 | Запрос фильтруется, чтобы включать только экземпляры процессов, относящиеся к определению процесса с ключом approval. | 
| 3 | Запрос фильтруется, чтобы включать экземпляры процессов с укзанной переменной orderId. | 
Использование BpmTaskService
BpmTaskService расширяет TaskService и добавляет метод для выполнения задач с исходом
void completeTaskWithOutcome(String taskId, String outcomeId, Map<String, Object> processVariables);Вы можете внедрить сервис в свой бин Spring:
@Autowired
private BpmTaskService bpmTaskService;Либо использовать класс ProcessEngines:
BpmTaskService bpmTaskService = (BpmTaskService) ProcessEngines
        .getDefaultProcessEngine()
        .getTaskService();Взаимодействие с определениями процессов
Flowable предоставляет богатый API для взаимодействия с определениями процессов:
- 
Развертывание: Определения процессов обычно разворачиваются как часть единицы развертывания, которая может включать несколько определений и связанные ресурсы. Deployment deployment = repositoryService.createDeployment() .addClasspathResource("my-process.bpmn20.xml") .deploy();
- 
Запросы: RepositoryService позволяет выполнять запросы к определениям процессов на основе различных критериев: ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId("myProcessDefinitionId") .singleResult();
- 
Приостановка и Активация: Определения процессов могут быть приостановлены или активированы, что контролирует, могут ли новые экземпляры процессов быть запущены на основе данного определения: repositoryService.suspendProcessDefinitionById("myProcessDefinitionId");
- 
Генерация диаграмм: Flowable может генерировать диаграммы процессов для развернутых определений процессов: filename.javaInputStream diagramStream = repositoryService.getProcessDiagram(processDefinition.getId());