Расширение типов триггеров

Каждый рабочий процесс должен быть настроен с конкретным триггером — это точка входа для запуска выполнения.

Тип триггера обычно соответствует конкретному событию в окружении системы. В течение жизненного цикла приложения для определения типа триггера можно использовать любую часть системы с подписываемыми событиями: приём запросов, операции с коллекциями, задачи по расписанию и т. д.

Типы триггеров регистрируются в таблице триггеров плагина по строковому идентификатору. В плагине «Рабочий процесс» есть несколько встроенных триггеров:

  • 'collection': срабатывает при операциях с коллекциями;
  • 'schedule': срабатывает по расписанию;
  • 'action': срабатывает при событиях после действия;

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

Серверная часть

Любой триггер наследует базовый класс Trigger и реализует методы on и off для подписки на события окружения и отписки от них соответственно. В методе on в обратном вызове нужного события нужно вызвать this.workflow.trigger(), чтобы запустить рабочий процесс. В методе off выполняется очистка при отписке.

this.workflow — экземпляр плагина рабочего процесса, передаваемый в конструктор базового класса Trigger.

import { Trigger } from '@nocobase/plugin-workflow';

class MyTrigger extends Trigger {
  timer: NodeJS.Timeout;

  on(workflow) {
    // регистрация события
    this.timer = setInterval(() => {
      // запуск рабочего процесса
      this.workflow.trigger(workflow, { date: new Date() });
    }, workflow.config.interval ?? 60000);
  }

  off(workflow) {
    // отмена регистрации события
    clearInterval(this.timer);
  }
}

Затем в плагине, расширяющем рабочий процесс, зарегистрируйте экземпляр триггера в движке рабочего процесса:

import WorkflowPlugin from '@nocobase/plugin-workflow';

export default class MyPlugin extends Plugin {
  load() {
    // получение экземпляра плагина рабочего процесса
    const workflowPlugin = this.app.pm.get(WorkflowPlugin) as WorkflowPlugin;

    // регистрация триггера
    workflowPlugin.registerTrigger('interval', MyTrigger);
  }
}

После старта и загрузки сервера триггер типа 'interval' можно добавить и выполнять.

Клиентская часть

На клиенте в основном задаётся интерфейс настройки по параметрам, которые требует тип триггера. Каждый тип триггера также должен зарегистрировать свою конфигурацию в плагине «Рабочий процесс».

Например, для триггера периодического запуска, упомянутого выше, в форме настройки задайте обязательный параметр интервала (interval):

import { Trigger } from '@nocobase/workflow/client';

class MyTrigger extends Trigger {
  title = 'Interval timer triggerа';
  // поля настройки триггера
  fieldset = {
    interval: {
      type: 'number',
      title: 'Interval',
      name: 'config.interval',
      'x-decorator': 'FormItem',
      'x-component': 'InputNumber',
      default: 60000,
    },
  };
}

После этого зарегистрируйте этот тип триггера в экземпляре плагина рабочего процесса внутри вашего расширяющего плагина:

import { Plugin } from '@nocobase/client';
import WorkflowPlugin from '@nocobase/plugin-workflow/client';

import MyTrigger from './MyTrigger';

export default class extends Plugin {
  // здесь доступен экземпляр приложения для чтения и изменения
  async load() {
    const workflow = this.app.pm.get(WorkflowPlugin) as WorkflowPlugin;
    workflow.registerTrigger('interval', MyTrigger);
  }
}

После этого новый тип триггера появится в интерфейсе настройки рабочего процесса.

Примечание

Идентификатор типа триггера, зарегистрированный на клиенте, должен совпадать с идентификатором на сервере, иначе возникнут ошибки.

Подробнее об определении типов триггеров см. Справочник API.