---
pkg: '@nocobase/plugin-workflow-action-trigger'
---

# Событие после действия

## Введение

Все изменения данных в системе, которые вносят пользователи, обычно выполняются посредством какого-либо действия, как правило, путем нажатия кнопки. Эта кнопка может быть кнопкой отправки в форме или кнопкой действия в блоке данных. Событие после действия позволяет привязать соответствующие рабочие процессы к этим кнопкам, чтобы после успешного выполнения действия пользователя запускался определенный процесс.

Например, при добавлении или обновлении данных вы можете настроить для кнопки опцию «Привязать рабочий процесс». После завершения действия будет запущен привязанный рабочий процесс.

На уровне реализации, поскольку обработка событий после действия происходит на уровне промежуточного ПО (middleware Koa), вызовы HTTP API NocoBase также могут запускать определенные события после действия.

## Установка

Это встроенный плагин, установка не требуется.

## Конфигурация триггера

### Создание рабочего процесса

При создании рабочего процесса выберите тип «Событие после действия»:

![Создание рабочего процесса_Триггер события после действия](https://static-docs.nocobase.com/13c87035ec1bb7332514676d3e896007.png)

### Режим выполнения

Для событий после действия при создании вы также можете выбрать режим выполнения: «Синхронный» или «Асинхронный»:

![Создание рабочего процесса_Выбор синхронного или асинхронного режима](https://static-docs.nocobase.com/bc83525c7e539d578f9e2e20baf9ab69.png)

Если рабочий процесс должен быть выполнен немедленно после действия пользователя и вернуть результат, вы можете использовать синхронный режим; в противном случае по умолчанию используется асинхронный режим. В асинхронном режиме действие считается завершенным сразу после запуска рабочего процесса, а сам рабочий процесс будет последовательно выполняться в фоновом режиме приложения в виде очереди.

### Настройка коллекции

Перейдите на холст рабочего процесса, нажмите на триггер, чтобы открыть всплывающее окно конфигурации, и сначала выберите коллекцию для привязки:

![Конфигурация рабочего процесса_Выбор коллекции](https://static-docs.nocobase.com/35c49a91eba731127edcf76719c97634.png)

### Выбор режима запуска

Затем выберите режим запуска, доступны два режима: локальный и глобальный:

![Конфигурация рабочего процесса_Выбор режима запуска](https://static-docs.nocobase.com/317809c48b2f2a2d38aedc7d08abdadc.png)

Где:

*   Локальный режим запускается только на кнопках действия, к которым привязан этот рабочий процесс. Нажатие кнопок, не привязанных к этому рабочему процессу, не вызовет его. Вы можете решить, привязывать ли этот рабочий процесс, исходя из того, должны ли формы с различными целями запускать один и тот же процесс.
*   Глобальный режим запускается на всех настроенных кнопках действия коллекции, независимо от того, из какой формы они исходят, и не требует привязки соответствующего рабочего процесса.

В локальном режиме в настоящее время поддерживаются следующие кнопки действия для привязки:

*   Кнопки «Отправить» и «Сохранить» в форме добавления.
*   Кнопки «Отправить» и «Сохранить» в форме обновления.
*   Кнопка «Обновить данные» в строках данных (таблица, список, канбан и т. д.).

### Выбор типа действия

Если вы выбрали глобальный режим, вам также необходимо выбрать тип действия. В настоящее время поддерживаются «Действие создания данных» и «Действие обновления данных». Оба действия запускают рабочий процесс после успешного выполнения операции.

### Выбор предварительно загруженных связанных данных

Если вам необходимо использовать связанные данные триггера в последующих процессах, вы можете выбрать поля связей для предварительной загрузки:

![Конфигурация рабочего процесса_Предварительная загрузка связей](https://static-docs.nocobase.com/5cded063509c7ba1d34f49bec8d68227.png)

После запуска вы сможете напрямую использовать эти связанные данные в рабочем процессе.

## Настройка действия

Для действий в режиме локального запуска, после завершения настройки рабочего процесса, вам необходимо вернуться в пользовательский интерфейс и привязать рабочий процесс к кнопке действия формы соответствующего блока данных.

Рабочие процессы, настроенные для кнопки «Отправить» (включая кнопку «Сохранить данные»), будут запущены после того, как пользователь отправит соответствующую форму и операция с данными будет завершена.

![Событие после действия_Кнопка Отправить](https://static-docs.nocobase.com/ae12d219b8400d75b395880ec4cb2bda.png)

Выберите «Привязать рабочий процесс» из меню настройки кнопки, чтобы открыть всплывающее окно настройки привязки. Во всплывающем окне вы можете настроить любое количество рабочих процессов для запуска; если ни один не настроен, это означает, что запуск не требуется. Для каждого рабочего процесса сначала необходимо определить, являются ли запускаемые данные данными всей формы или данными определенного поля связи в форме, а затем, в соответствии с выбранной моделью данных и соответствующей коллекцией, выберите рабочий процесс формы, который был настроен для соответствия этой модели коллекции.

![Событие после действия_Настройка привязки рабочего процесса_Выбор контекста](https://static-docs.nocobase.com/358315fc175849a7fbadbe3276ac6fed.png)

![Событие после действия_Настройка привязки рабочего процесса_Выбор рабочего процесса](https://static-docs.nocobase.com/175a71a61b93540cce62a1cb124eb0b5.png)

:::info{title="Подсказка"}
Рабочий процесс должен быть включен, чтобы его можно было выбрать в вышеуказанном интерфейсе.
:::

## Пример

Здесь мы продемонстрируем это на примере операции добавления.

Предположим сценарий «Заявление на возмещение расходов». Нам необходимо, чтобы после подачи сотрудником заявления на возмещение расходов проводилась автоматическая проверка суммы и ручная проверка для сумм, превышающих лимит. Только успешно прошедшие проверку заявления одобряются и затем передаются в финансовый отдел для обработки.

Сначала мы можем создать коллекцию «Возмещение расходов» со следующими полями:

-   Название проекта: Однострочный текст
-   Заявитель: Многие к одному (Пользователь)
-   Сумма: Число
-   Статус: Одиночный выбор («Одобрено», «Обработано»)

Затем создайте рабочий процесс типа «Событие после действия» и настройте модель коллекции в триггере как коллекцию «Возмещение расходов»:

![Пример_Конфигурация триггера_Выбор коллекции](https://static-docs.nocobase.com/6e1abb5c3e1198038676115943714f07.png)

После того как рабочий процесс будет включен, мы вернемся к настройке конкретных узлов обработки процесса позже.

Затем мы создаем на интерфейсе блок таблицы для коллекции «Возмещение расходов», добавляем кнопку «Добавить» на панель инструментов и настраиваем соответствующие поля формы. В параметрах конфигурации кнопки действия «Отправить» формы открываем диалоговое окно настройки «Привязать рабочий процесс», выбираем все данные формы в качестве контекста и наш ранее созданный рабочий процесс:

![Пример_Настройка кнопки формы_Привязка рабочего процесса](https://static-docs.nocobase.com/fc00bdcdb975bb8850e5cab235f854f3.png)

После завершения настройки формы вернемся к логической организации рабочего процесса. Например, если сумма превышает 500 юаней, требуется ручная проверка администратором, в противном случае она одобряется автоматически. Запись о возмещении создается только после успешной проверки и затем передается в финансовый отдел для дальнейшей обработки (опущено).

![Пример_Процесс обработки](https://static-docs.nocobase.com/059e8e3d5ffb34cc2da6880fa3dc490b.png)

Если опустить последующую обработку финансовым отделом, то настройка процесса подачи заявления на возмещение расходов завершена. Когда сотрудник заполняет и отправляет заявление на возмещение расходов, запускается соответствующий рабочий процесс. Если сумма расходов меньше 500, запись будет создана автоматически и будет ожидать дальнейшей обработки финансовым отделом. В противном случае она будет рассмотрена руководителем, и после одобрения также будет создана запись и передана в финансовый отдел для обработки.

Процесс из этого примера также может быть настроен на обычной кнопке «Отправить». Вы можете решить, нужно ли сначала создавать запись, а затем выполнять последующие процессы, исходя из конкретного бизнес-сценария.

## Внешний вызов

Запуск событий после действия не ограничивается операциями пользовательского интерфейса; их также можно запускать через вызовы HTTP API.

:::info{title="Подсказка"}
При запуске событий после действия через вызовы HTTP API вам также необходимо обратить внимание на статус включения рабочего процесса и на то, соответствует ли конфигурация коллекции, в противном случае вызов может не пройти успешно или может возникнуть ошибка.
:::

Для рабочих процессов, локально привязанных к кнопке действия, вы можете вызвать их следующим образом (на примере кнопки создания коллекции `posts`):

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \
  '{
    "title": "Hello, world!",
    "content": "This is a test post."
  }'
  "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey"
```

Где параметр URL `triggerWorkflows` — это ключ рабочего процесса, несколько рабочих процессов разделяются запятыми. Этот ключ можно получить, наведя указатель мыши на имя рабочего процесса в верхней части холста рабочего процесса:

![Рабочий процесс_Ключ_Способ просмотра](https://static-docs.nocobase.com/20240426135108.png)

После успешного выполнения вышеуказанного вызова будет запущено событие после действия для соответствующей коллекции `posts`.

:::info{title="Подсказка"}
Поскольку внешние вызовы также должны основываться на идентификации пользователя, при вызове через HTTP API, как и при обычных запросах из интерфейса, необходимо предоставить информацию для аутентификации, включая заголовок запроса `Authorization` или параметр `token` (токен, полученный при входе в систему), а также заголовок запроса `X-Role` (имя текущей роли пользователя).
:::

Если вам необходимо запустить событие для данных связи «один к одному» (связь «один ко многим» пока не поддерживается) в этой операции, вы можете использовать `!` в параметре для указания данных триггера поля связи:

```bash
curl -X POST -H 'Authorization: Bearer <your token>' -H 'X-Role: <roleName>' -d \
  '{
    "title": "Hello, world!",
    "content": "This is a test post.",
    "category": {
      "title": "Test category"
    }
  }'
  "http://localhost:3000/api/posts:create?triggerWorkflows=workflowKey!category"
```

После успешного выполнения вышеуказанного вызова будет запущено событие после действия для соответствующей коллекции `categories`.

:::info{title="Подсказка"}
Если событие настроено в глобальном режиме, то нет необходимости использовать параметр URL `triggerWorkflows` для указания соответствующего рабочего процесса; достаточно просто вызвать соответствующее действие коллекции для запуска.
:::

## Частые вопросы

### Отличие от события до действия

*   **Событие до действия:** Запускается до выполнения определенного действия (например, добавления, обновления и т. д.). До выполнения действия в рабочем процессе можно проверить или обработать запрошенные данные. Если рабочий процесс прерван (запрос перехвачен), действие (добавление, обновление и т. д.) не будет выполнено.
*   **Событие после действия:** Запускается после успешного выполнения действия пользователя. На этом этапе данные уже успешно отправлены и сохранены в базе данных, и вы можете продолжить обработку связанных процессов на основе успешного результата.

Как показано на рисунке ниже:

![Порядок выполнения действий](https://static-docs.nocobase.com/20251219234806.png)

### Отличие от события коллекции

События после действия и события коллекции имеют сходства. С точки зрения эффекта, оба являются процессами, запускаемыми после изменения данных. Однако их уровни реализации отличаются. События после действия ориентированы на уровень API, в то время как события коллекции ориентированы на изменения данных в коллекции.

События коллекции находятся ближе к базовому уровню системы. В некоторых случаях изменение данных, вызванное одним событием, может запустить другое событие, создавая цепную реакцию. Особенно, если данные в некоторых связанных коллекциях также изменились во время операции с текущей коллекцией, то события, связанные со связанной коллекцией, также могут быть запущены.

Запуск событий коллекции не содержит информации, связанной с пользователем. В то время как события после действия ближе к пользовательской стороне, являются результатом действий пользователя, и контекст рабочего процесса будет содержать информацию, связанную с пользователем, что делает их подходящими для обработки процессов, связанных с действиями пользователя. В будущих разработках NocoBase может быть расширено количество событий после действия, которые можно использовать для запуска, поэтому **настоятельно рекомендуется использовать события после действия** для обработки процессов, в которых изменения данных вызваны действиями пользователя.

Еще одно отличие заключается в том, что события после действия могут быть локально привязаны к определенным кнопкам формы. Если есть несколько форм, отправка некоторых форм может запускать это событие, в то время как другие не будут его запускать. События коллекции, напротив, относятся к изменениям данных во всей коллекции и не могут быть привязаны локально.