6.1. Программный запуск процесса

Ниже приведён пример программного запуска отчёта с заданными ролями из контроллера экрана редактирования сущности с помощью сервиса ProcessRuntimeService. Полный код данного тестового приложения можно посмотреть на GitHub.

  1. Для начала загрузите экземпляр описания процесса (process definition) по его коду:

    ProcDefinition procDefinition = dataManager.load(
            LoadContext.create(ProcDefinition.class)
                    .setQuery(new LoadContext.Query("select pd from bpm$ProcDefinition pd where pd.code = :code")
                            .setParameter("code", PROCESS_CODE))
                    .setView("procDefinition-procInstanceEdit")
    );
  2. Затем создайте экземпляр процесса (process instance) и свяжите его с описанием процесса и сущностью проекта:

    ProcInstance procInstance = metadata.create(ProcInstance.class);
    procInstance.setProcDefinition(procDefinition);
    procInstance.setEntityId(getItem().getUuid());
    procInstance.setEntityName(getItem().getMetaClass().getName());
  3. Создайте участников процесса (process actors), назначив их роли:

    ProcActor manager = metadata.create(ProcActor.class);
    manager.setUser(userSession.getUser());
    manager.setOrder(0);
    manager.setProcInstance(procInstance);
    manager.setProcRole(procDefinition.getProcRoles().get(0));
    
    ProcActor mechanic = metadata.create(ProcActor.class);
    mechanic.setUser(getItem().getMechanic().getUser());
    mechanic.setOrder(1);
    mechanic.setProcInstance(procInstance);
    mechanic.setProcRole(procDefinition.getProcRoles().get(1));
  4. Свяжите набор участников с экземпляром процесса:

    Set<ProcActor> procActors = new HashSet<>();
    procActors.add(manager);
    procActors.add(mechanic);
    
    procInstance.setProcActors(procActors);
  5. Сохраните созданные сущности участников и процесса в базе данных:

    Set<Entity> committed = dataManager.commit(new CommitContext()
            .addInstanceToCommit(manager)
            .addInstanceToCommit(mechanic)
            .addInstanceToCommit(procInstance));
  6. Запустите сохранённый экземпляр процесса:

    ProcInstance committedProcInstance = (ProcInstance) committed.stream()
            .filter(p -> p.equals(procInstance))
            .findFirst()
            .orElseThrow(() -> new RuntimeException("Error"));
    
    processRuntimeService.startProcess(committedProcInstance, "Started!", new HashMap<>());

В данном примере метод startProcess() вызывается в контроллере экрана по нажатию кнопки. Код метода полностью:

@Inject
private ProcessRuntimeService processRuntimeService;

private static String PROCESS_CODE = "orderProcessing";

public class OrderEdit extends AbstractEditor<Order> {

    public void startProcess() {
        commit();

        ProcDefinition procDefinition = dataManager.load(
                LoadContext.create(ProcDefinition.class)
                .setQuery(new LoadContext.Query("select pd from bpm$ProcDefinition pd where pd.code = :code")
                        .setParameter("code", PROCESS_CODE))
                .setView("procDefinition-procInstanceEdit")
        );

        ProcInstance procInstance = metadata.create(ProcInstance.class);
        procInstance.setProcDefinition(procDefinition);
        procInstance.setEntityId(getItem().getUuid());
        procInstance.setEntityName(getItem().getMetaClass().getName());

        Set<ProcActor> procActors = new HashSet<>();

        ProcActor manager = metadata.create(ProcActor.class);
        manager.setUser(userSession.getUser());
        manager.setOrder(0);
        manager.setProcInstance(procInstance);
        manager.setProcRole(procDefinition.getProcRoles().get(0));

        ProcActor mechanic = metadata.create(ProcActor.class);
        mechanic.setUser(getItem().getMechanic().getUser());
        mechanic.setOrder(1);
        mechanic.setProcInstance(procInstance);
        mechanic.setProcRole(procDefinition.getProcRoles().get(1));

        procActors.add(manager);
        procActors.add(mechanic);

        procInstance.setProcActors(procActors);

        Set<Entity> committed = dataManager.commit(new CommitContext()
                .addInstanceToCommit(manager)
                .addInstanceToCommit(mechanic)
                .addInstanceToCommit(procInstance));

        ProcInstance committedProcInstance = (ProcInstance) committed.stream()
                .filter(p -> p.equals(procInstance))
                .findFirst()
                .orElseThrow(() -> new RuntimeException("Error"));

        processRuntimeService.startProcess(committedProcInstance, "Started!", new HashMap<>());

        close(COMMIT_ACTION_ID);
    }
}