BPM API

Jmix BPM использует Flowable API, что обеспечивает легкое взаимодействие приложения Spring Boot с процессным движком. Также REST API Flowable предлагает широкие возможности для интеграции с внешними приложениями. Понимание доступных API позволяет разработчикам максимально эффективно использовать Flowable в дополнении Jmix BPM.

Flowable API

Flowable API позволяет программно запускать экземпляры процессов, завершать задачи и выполнять различные запросы, например, получать список задач для пользователя или активные экземпляры определения процесса.

api services
В проектах Jmix BPM не используются FormService и IdentityService Flowable. Дополнение предоставляет 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 для запуска нового экземляра процесса, где:
  • new-customer – ключ процесса

  • params – аргументы процесса (экземляр сущности и имя клиента)

Получение списка пользовательских задач

Рассмотрим пример получения списка активных задач, назначенных аутентифицированному пользователю:

@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 для взаимодействия с определениями процессов:

  1. Развертывание: Определения процессов обычно разворачиваются как часть единицы развертывания, которая может включать несколько определений и связанные ресурсы.

    Deployment deployment = repositoryService.createDeployment()
                            .addClasspathResource("my-process.bpmn20.xml")
                            .deploy();
  2. Запросы: RepositoryService позволяет выполнять запросы к определениям процессов на основе различных критериев:

    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                                         .processDefinitionId("myProcessDefinitionId")
                                         .singleResult();
  3. Приостановка и Активация: Определения процессов могут быть приостановлены или активированы, что контролирует, могут ли новые экземпляры процессов быть запущены на основе данного определения:

    repositoryService.suspendProcessDefinitionById("myProcessDefinitionId");
  4. Генерация диаграмм: Flowable может генерировать диаграммы процессов для развернутых определений процессов:

    filename.java
    InputStream diagramStream = repositoryService.getProcessDiagram(processDefinition.getId());

Установка и обновление бизнес-ключа

Бизнес-ключ может быть обновлен программно через API:

runtimeService.updateBusinessKey("processInstanceId", "businessKey");