Справочник API

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

API, доступные в серверной части пакета, показаны в следующем коде:

import PluginWorkflowServer, {
  Trigger,
  Instruction,
  EXECUTION_STATUS,
  JOB_STATUS,
} from '@nocobase/plugin-workflow';

PluginWorkflowServer

Класс плагина рабочего процесса.

Обычно во время выполнения приложения в любом месте, где доступен экземпляр приложения app, можно вызвать app.pm.get<PluginWorkflowServer>(PluginWorkflowServer), чтобы получить экземпляр плагина рабочего процесса (ниже — plugin).

registerTrigger()

Расширяет и регистрирует новый тип триггера.

Сигнатура

registerTrigger(type: string, trigger: typeof Trigger | Trigger })

Параметры

ПараметрТипОписание
typestringИдентификатор типа триггера
triggertypeof Trigger | TriggerТип триггера или его экземпляр

Пример

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

function handler(this: MyTrigger, workflow: WorkflowModel, message: string) {
  // запуск рабочего процесса
  this.workflow.trigger(workflow, { data: message.data });
}

class MyTrigger extends Trigger {
  messageHandlers: Map<number, WorkflowModel> = new Map();
  on(workflow: WorkflowModel) {
    const messageHandler = handler.bind(this, workflow);
    // подписка на событие для запуска рабочего процесса
    process.on(
      'message',
      this.messageHandlers.set(workflow.id, messageHandler),
    );
  }

  off(workflow: WorkflowModel) {
    const messageHandler = this.messageHandlers.get(workflow.id);
    // отмена подписки
    process.off('message', messageHandler);
  }
}

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

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

registerInstruction()

Расширяет и регистрирует новый тип узла.

Сигнатура

registerInstruction(type: string, instruction: typeof Instruction | Instruction })

Параметры

ПараметрТипОписание
typestringИдентификатор типа инструкции
instructiontypeof Instruction | InstructionТип инструкции или её экземпляр

Пример

import PluginWorkflowServer, { Instruction, JOB_STATUS } from '@nocobase/plugin-workflow';

class LogInstruction extends Instruction {
  run(node, input, processor) {
    console.log('my instruction runs!');
    return {
      status: JOB_STATUS.RESOVLED,
    };
  },
};

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

    // регистрация инструкции
    workflowPlugin.registerInstruction('log', LogInstruction);
  }
}

trigger()

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

Сигнатура

trigger(workflow: Workflow, context: any)

Параметры

ПараметрТипОписание
workflowWorkflowModelОбъект рабочего процесса, который нужно запустить
contextobjectКонтекстные данные, передаваемые при срабатывании триггера
Подсказка

context сейчас обязателен. Если его не передать, рабочий процесс не будет запущен.

Пример

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

class MyTrigger extends Trigger {
  timer: NodeJS.Timeout;

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

resume()

Возобновляет ожидающий рабочий процесс по конкретной задаче узла.

  • Возобновить можно только рабочий процесс в состоянии ожидания (EXECUTION_STATUS.STARTED).
  • Возобновить можно только задачу узла в состоянии ожидания (JOB_STATUS.PENDING).

Сигнатура

resume(job: JobModel)

Параметры

ПараметрТипОписание
jobJobModelОбновлённый объект задачи
Подсказка

Передаваемый объект задачи обычно уже обновлён, и его status обычно изменён на значение, отличное от JOB_STATUS.PENDING, иначе ожидание продолжится.

Пример

Подробности см. в исходном коде.

Trigger

Базовый класс триггера, используется для расширения пользовательских типов триггеров.

ПараметрТипОписание
constructor(public readonly workflow: PluginWorkflowServer): TriggerКонструктор
on?(workflow: WorkflowModel): voidОбработчик события после включения рабочего процесса
off?(workflow: WorkflowModel): voidОбработчик события после отключения рабочего процесса

on/off используются для регистрации и снятия обработчиков событий при включении и отключении рабочего процесса. Передаваемый параметр — экземпляр рабочего процесса, соответствующий триггеру, который можно обрабатывать в соответствии с конфигурацией. Некоторым типам триггеров с уже глобально прослушиваемыми событиями эти методы могут быть не нужны. Например, в триггере по расписанию можно зарегистрировать таймер в on и снять его в off.

Instruction

Базовый класс типов инструкций, используется для расширения пользовательских инструкций.

ПараметрТипОписание
constructor(public readonly workflow: PluginWorkflowServer): InstructionКонструктор
runRunnerЛогика выполнения при первом входе в узел
resume?RunnerЛогика выполнения при входе в узел после возобновления
getScope?(node: FlowNodeModel, data: any, processor: Processor): anyПредоставляет содержимое локальных переменных для ветви, созданной соответствующим узлом

Связанные типы

export type Job =
  | {
      status: JOB_STATUS[keyof JOB_STATUS];
      result?: unknown;
      [key: string]: unknown;
    }
  | JobModel
  | null;

export type InstructionResult = Job | Promise<Job>;

export type Runner = (
  node: FlowNodeModel,
  input: JobModel,
  processor: Processor,
) => InstructionResult;

export class Instruction {
  run: Runner;
  resume?: Runner;
}

Для getScope можно ориентироваться на реализацию узла «Цикл», которая используется для предоставления локальных переменных для ветвей.

EXECUTION_STATUS

Таблица констант статусов плана выполнения рабочего процесса, используется для идентификации текущего состояния соответствующего плана выполнения.

Имя константыЗначение
EXECUTION_STATUS.QUEUEINGВ очереди
EXECUTION_STATUS.STARTEDЗапущен
EXECUTION_STATUS.RESOLVEDУспешно завершён
EXECUTION_STATUS.FAILEDСбой
EXECUTION_STATUS.ERRORОшибка
EXECUTION_STATUS.ABORTEDПрерван
EXECUTION_STATUS.CANCELEDОтменён
EXECUTION_STATUS.REJECTEDОтклонён
EXECUTION_STATUS.RETRY_NEEDEDВыполнен неуспешно, требуется повтор

Кроме первых трёх, все остальные представляют неуспешное состояние, но используются для описания разных причин неуспеха.

JOB_STATUS

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

Имя константыЗначение
JOB_STATUS.PENDINGОжидание: выполнение дошло до узла, но инструкция требует приостановить и ждать
JOB_STATUS.RESOLVEDУспешно завершён
JOB_STATUS.FAILEDСбой: выполнение узла не удовлетворило заданным условиям
JOB_STATUS.ERRORОшибка: во время выполнения узла возникла необработанная ошибка
JOB_STATUS.ABORTEDПрерван: выполнение узла завершено другой логикой после состояния ожидания
JOB_STATUS.CANCELEDОтменён: выполнение узла вручную отменено после состояния ожидания
JOB_STATUS.REJECTEDОтклонён: продолжение узла вручную отклонено после состояния ожидания
JOB_STATUS.RETRY_NEEDEDВыполнен неуспешно, требуется повтор

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

API, доступные в клиентской части пакета, показаны в следующем коде:

import PluginWorkflowClient, {
  Trigger,
  Instruction,
} from '@nocobase/plugin-workflow/client';

PluginWorkflowClient

registerTrigger()

Регистрирует панель настройки для типа триггера.

Сигнатура

registerTrigger(type: string, trigger: typeof Trigger | Trigger): void

Параметры

ПараметрТипОписание
typestringИдентификатор типа триггера, должен совпадать с идентификатором при регистрации
triggertypeof Trigger | TriggerТип триггера или его экземпляр

registerInstruction()

Регистрирует панель настройки для типа узла.

Сигнатура

registerInstruction(type: string, instruction: typeof Instruction | Instruction): void

Параметры

ПараметрТипОписание
typestringИдентификатор типа узла, должен совпадать с идентификатором при регистрации
instructiontypeof Instruction | InstructionТип узла или его экземпляр

registerInstructionGroup()

Регистрирует группу типов узлов. В NocoBase есть 4 группы по умолчанию:

  • 'control': управление
  • 'collection': операции с коллекциями
  • 'manual': ручная обработка
  • 'extended': прочие расширения

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

Сигнатура

registerInstructionGroup(type: string, group: { label: string }): void

Параметры

ПараметрТипОписание
typestringИдентификатор группы узлов, должен совпадать с идентификатором при регистрации
group{ label: string }Информация о группе, сейчас включает только заголовок

Пример

export default class YourPluginClient extends Plugin {
  load() {
    const pluginWorkflow = this.app.pm.get(PluginWorkflowClient);

    pluginWorkflow.registerInstructionGroup('ai', { label: `{{t("AI", { ns: "${NAMESPACE}" })}}` });
  }
}

Trigger

Базовый класс триггера, используется для расширения пользовательских триггеров.

ПараметрТипОписание
titlestringНазвание типа триггера
fieldset{ [key: string]: ISchema }Набор элементов настройки триггера
scope?{ [key: string]: any }Набор объектов, которые могут использоваться в схеме настройки
components?{ [key: string]: React.FC }Набор компонентов, которые могут использоваться в схеме настройки
useVariables?(config: any, options: UseVariableOptions ) => VariableOptionsМетод доступа к значениям контекстных данных триггера
  • Если useVariables не задан, этот тип триггера не предоставляет функцию получения значений, и контекстные данные триггера нельзя выбрать в узлах рабочего процесса.

Instruction

Базовый класс инструкций, используется для расширения пользовательских типов узлов.

ПараметрТипОписание
groupstringИдентификатор группы типа узла; сейчас доступны: 'control'/'collection'/'manual'/'extended'
fieldsetRecord<string, ISchema>Набор элементов настройки узла
scope?Record<string, Function>Набор объектов, которые могут использоваться в схеме элементов настройки
components?Record<string, React.FC>Набор компонентов, которые могут использоваться в схеме элементов настройки
Component?React.FCПользовательский компонент отображения узла
useVariables?(node, options: UseVariableOptions) => VariableOptionМетод, с помощью которого узел предоставляет варианты переменных
useScopeVariables?(node, options?) => VariableOptionsМетод, с помощью которого узел предоставляет локальные переменные ветви
useInitializers?(node) => SchemaInitializerItemTypeМетод, с помощью которого узел предоставляет варианты инициализации
isAvailable?(ctx: NodeAvailableContext) => booleanМетод определения доступности узла

Связанные типы

export type NodeAvailableContext = {
  workflow: object;
  upstream: object;
  branchIndex: number;
};
  • Если useVariables не задан, этот тип узла не предоставляет функцию получения значений, и данные результата такого узла нельзя выбрать в узлах рабочего процесса. Если результат единственный (не выбирается), можно вернуть статическое содержимое с нужной информацией (см.: исходный код узла «Вычисление»). Если значение нужно выбирать (например, свойство объекта), можно настроить соответствующий компонент выбора (см.: исходный код узла «Создать запись»).
  • Component — пользовательский компонент отображения узла. Если стандартного отображения недостаточно, его можно полностью переопределить для пользовательского представления узла. Например, если для стартового узла ветвящегося типа нужны дополнительные кнопки действий или другое взаимодействие, используйте этот метод (см.: исходный код узла «Параллельная ветвь»).
  • useInitializers предоставляет метод инициализации блоков. Например, в ручном узле можно инициализировать связанные пользовательские блоки на основе вышестоящих узлов. Если метод задан, он доступен при инициализации блоков в интерфейсе настройки ручного узла (см.: исходный код узла создания записи).
  • isAvailable в основном определяет, можно ли использовать (добавить) узел в текущем окружении. Текущее окружение включает текущий рабочий процесс, вышестоящие узлы и индекс текущей ветви.