API-Referenz

Serverseitig

Die im serverseitigen Paket verfügbaren APIs sind im folgenden Code dargestellt:

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

PluginWorkflowServer

Klasse des Workflow-Plugins.

Zur Laufzeit der Anwendung können Sie an jeder Stelle, an der Sie Zugriff auf die Anwendungsinstanz app haben, mit app.pm.get<PluginWorkflowServer>(PluginWorkflowServer) die Instanz des Workflow-Plugins abrufen (im Folgenden als plugin bezeichnet).

registerTrigger()

Erweitert und registriert einen neuen Trigger-Typ.

Signatur

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

Parameter

ParameterTypBeschreibung
typestringBezeichner des Trigger-Typs
triggertypeof Trigger | TriggerTrigger-Typ oder -Instanz

Beispiel

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

function handler(this: MyTrigger, workflow: WorkflowModel, message: string) {
  // trigger workflow
  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);
    // listen some event to trigger workflow
    process.on(
      'message',
      this.messageHandlers.set(workflow.id, messageHandler),
    );
  }

  off(workflow: WorkflowModel) {
    const messageHandler = this.messageHandlers.get(workflow.id);
    // remove listener
    process.off('message', messageHandler);
  }
}

export default class MyPlugin extends Plugin {
  load() {
    // get workflow plugin instance
    const workflowPlugin =
      this.app.pm.get<PluginWorkflowServer>(PluginWorkflowServer);

    // register trigger
    workflowPlugin.registerTrigger('myTrigger', MyTrigger);
  }
}

registerInstruction()

Erweitert und registriert einen neuen Knoten-Typ.

Signatur

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

Parameter

ParameterTypBeschreibung
typestringBezeichner des Instruction-Typs
instructiontypeof Instruction | InstructionInstruction-Typ oder -Instanz

Beispiel

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() {
    // get workflow plugin instance
    const workflowPlugin = this.app.pm.get<PluginWorkflowServer>(PluginWorkflowServer);

    // register instruction
    workflowPlugin.registerInstruction('log', LogInstruction);
  }
}

trigger()

Löst einen bestimmten Workflow aus. Wird hauptsächlich in benutzerdefinierten Triggern verwendet, um den entsprechenden Workflow auszulösen, wenn ein bestimmtes benutzerdefiniertes Ereignis erkannt wird.

Signatur

trigger(workflow: Workflow, context: any)

Parameter

ParameterTypBeschreibung
workflowWorkflowModelDas auszulösende Workflow-Objekt
contextobjectBeim Auslösen bereitgestellte Kontextdaten
Hinweis

context ist derzeit ein Pflichtfeld. Wird es nicht angegeben, wird der Workflow nicht ausgelöst.

Beispiel

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

class MyTrigger extends Trigger {
  timer: NodeJS.Timeout;

  on(workflow) {
    // register event
    this.timer = setInterval(() => {
      // trigger workflow
      this.plugin.trigger(workflow, { date: new Date() });
    }, workflow.config.interval ?? 60000);
  }
}

resume()

Setzt einen wartenden Workflow mit einem bestimmten Knoten-Job fort.

  • Nur Workflows im Wartezustand (EXECUTION_STATUS.STARTED) können fortgesetzt werden.
  • Nur Knoten-Jobs im Status „ausstehend" (JOB_STATUS.PENDING) können fortgesetzt werden.

Signatur

resume(job: JobModel)

Parameter

ParameterTypBeschreibung
jobJobModelDas aktualisierte Job-Objekt
Hinweis

Das übergebene Job-Objekt ist in der Regel ein aktualisiertes Objekt, dessen status üblicherweise auf einen anderen Wert als JOB_STATUS.PENDING gesetzt wurde, da es andernfalls weiterhin im Wartezustand verbleibt.

Beispiel

Siehe Quellcode für Details.

Trigger

Die Basisklasse für Trigger, die zum Erweitern benutzerdefinierter Trigger-Typen verwendet wird.

import { Trigger } from '@nocobase/plugin-workflow';
ParameterTypBeschreibung
constructor(public readonly workflow: PluginWorkflowServer): TriggerKonstruktor
on?(workflow: WorkflowModel): voidEvent-Handler nach Aktivieren eines Workflows
off?(workflow: WorkflowModel): voidEvent-Handler nach Deaktivieren eines Workflows

on/off werden zum Registrieren bzw. Deregistrieren von Event-Listenern beim Aktivieren/Deaktivieren eines Workflows verwendet. Der übergebene Parameter ist die dem Trigger zugehörige Workflow-Instanz, die entsprechend der Konfiguration verarbeitet werden kann. Manche Trigger-Typen, die bereits global lauschende Ereignisse besitzen, müssen diese beiden Methoden nicht implementieren. Beispielsweise können Sie in einem zeitgesteuerten Trigger den Timer in on registrieren und in off wieder abmelden.

Instruction

Die Basisklasse für Instruction-Typen, die zum Erweitern benutzerdefinierter Instruction-Typen verwendet wird.

import { Instruction } from '@nocobase/plugin-workflow';
ParameterTypBeschreibung
constructor(public readonly workflow: PluginWorkflowServer): InstructionKonstruktor
runRunnerAusführungslogik beim erstmaligen Eintreten in den Knoten
resume?RunnerAusführungslogik beim Wiedereintreten in den Knoten nach einer Unterbrechung
getScope?(node: FlowNodeModel, data: any, processor: Processor): anyStellt den lokalen Variableninhalt für den vom entsprechenden Knoten erzeugten Branch bereit

Zugehörige Typen

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;
}

Für getScope können Sie sich an der Implementierung des Loop-Knotens orientieren, die dazu dient, lokalen Variableninhalt für Branches bereitzustellen.

EXECUTION_STATUS

Eine Konstantentabelle für Workflow-Ausführungsplanstatus, die zur Identifizierung des aktuellen Status des entsprechenden Ausführungsplans verwendet wird.

import { EXECUTION_STATUS } from '@nocobase/plugin-workflow';
KonstanteBedeutung
EXECUTION_STATUS.QUEUEINGIn der Warteschlange
EXECUTION_STATUS.STARTEDGestartet
EXECUTION_STATUS.RESOLVEDErfolgreich abgeschlossen
EXECUTION_STATUS.FAILEDFehlgeschlagen
EXECUTION_STATUS.ERRORFehler
EXECUTION_STATUS.ABORTEDAbgebrochen
EXECUTION_STATUS.CANCELEDStorniert
EXECUTION_STATUS.REJECTEDAbgelehnt
EXECUTION_STATUS.RETRY_NEEDEDNicht erfolgreich ausgeführt, Wiederholung nötig

Mit Ausnahme der ersten drei stehen alle übrigen für einen Fehlerzustand, können aber zur Beschreibung unterschiedlicher Fehlerursachen verwendet werden.

JOB_STATUS

Eine Konstantentabelle für Workflow-Knoten-Job-Status, die zur Identifizierung des aktuellen Status des entsprechenden Knoten-Jobs verwendet wird. Der vom Knoten erzeugte Status beeinflusst auch den Status des gesamten Ausführungsplans.

import { JOB_STATUS } from '@nocobase/plugin-workflow';
KonstanteBedeutung
JOB_STATUS.PENDINGAusstehend: Die Ausführung hat diesen Knoten erreicht, aber die Instruction erfordert ein Anhalten und Warten
JOB_STATUS.RESOLVEDErfolgreich abgeschlossen
JOB_STATUS.FAILEDFehlgeschlagen: Die Ausführung dieses Knotens hat die konfigurierten Bedingungen nicht erfüllt
JOB_STATUS.ERRORFehler: Bei der Ausführung dieses Knotens ist ein nicht behandelter Fehler aufgetreten
JOB_STATUS.ABORTEDBeendet: Die Ausführung dieses Knotens wurde nach dem Wartezustand durch andere Logik beendet
JOB_STATUS.CANCELEDStorniert: Die Ausführung dieses Knotens wurde nach dem Wartezustand manuell storniert
JOB_STATUS.REJECTEDAbgelehnt: Die Fortsetzung dieses Knotens wurde nach dem Wartezustand manuell abgelehnt
JOB_STATUS.RETRY_NEEDEDNicht erfolgreich ausgeführt, Wiederholung nötig

Clientseitig

Die im clientseitigen Paket verfügbaren APIs sind im folgenden Code dargestellt:

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

PluginWorkflowClientV2

Klasse des Workflow-Client-Plugins. Wird üblicherweise über this.app.pm.get('workflow') abgerufen.

registerTrigger()

Registriert das Konfigurationspanel für einen Trigger-Typ.

Signatur

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

Parameter

ParameterTypBeschreibung
typestringBezeichner des Trigger-Typs, übereinstimmend mit dem serverseitig registrierten Bezeichner
triggertypeof Trigger | TriggerTrigger-Typ oder -Instanz

registerInstruction()

Registriert das Konfigurationspanel für einen Knoten-Typ.

Signatur

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

Parameter

ParameterTypBeschreibung
typestringBezeichner des Knoten-Typs, übereinstimmend mit dem serverseitig registrierten Bezeichner
instructiontypeof Instruction | InstructionKnoten-Typ oder -Instanz

registerInstructionGroup()

Registriert eine Knoten-Typ-Gruppe. NocoBase stellt standardmäßig 4 Knoten-Typ-Gruppen bereit:

  • 'control': Ablaufsteuerung
  • 'collection': Datenoperationen
  • 'manual': Manuelle Verarbeitung
  • 'extended': Weitere Erweiterungen

Wenn Sie weitere Gruppen benötigen, können Sie diese Methode verwenden, um sie zu registrieren.

Signatur

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

Parameter

ParameterTypBeschreibung
typestringBezeichner der Knoten-Gruppe
group{ label: string }Gruppeninformationen, enthält derzeit nur den Titel

Beispiel

import { Plugin } from '@nocobase/client-v2';

export default class YourPluginClient extends Plugin {
  async load() {
    const pluginWorkflow = this.app.pm.get('workflow');
    pluginWorkflow.registerInstructionGroup('ai', { label: `{{t("AI", { ns: "${NAMESPACE}" })}}` });
  }
}

isWorkflowSync()

Bestimmt, ob ein Workflow im synchronen Modus läuft.

Signatur

isWorkflowSync(workflow: object): boolean

Trigger

Die Basisklasse für Trigger, die zum Erweitern benutzerdefinierter Trigger-Typen verwendet wird.

ParameterTypBeschreibung
titlestringName des Trigger-Typs
description?stringBeschreibung des Trigger-Typs
PresetFieldsetLoader?LoaderOfVoreinstellungsformular beim Erstellen (Lazy-Loading)
FieldsetLoader?LoaderOfVollständiges Trigger-Konfigurationsformular (Lazy-Loading)
TriggerFieldsetLoader?LoaderOfEingabeformular für manuelle Ausführung (Lazy-Loading)
validate(config: Record<string, unknown>) => booleanKonfigurationsvalidierung; gibt true zurück, wenn die Konfiguration gültig ist
createDefaultConfig?() => Record<string, unknown>Stellt Standard-Konfigurationswerte bereit
useVariables?(config, options?: UseVariableOptions) => VariableOption[] | nullVariablenoptionen für Trigger-Kontextdaten
getCreateModelMenuItem?(args) => SubModelItem | SubModelItem[] | nullMenüeinträge zum Erstellen von Untermodellen auf der Canvas
useTempAssociationSource?(config, workflow?) => TriggerTempAssociationSource | nullStellt eine temporäre Assoziationsdatenquelle bereit

Zugehörige Typen

export type LoaderOf<P = {}> = () => Promise<{ default: ComponentType<P> }>;
  • Wenn useVariables nicht gesetzt ist, bietet dieser Trigger-Typ keine Wertabruffunktion an, und die Kontextdaten des Triggers können in den Workflow-Knoten nicht ausgewählt werden.

Instruction

Die Basisklasse für Instructions, die zum Erweitern benutzerdefinierter Knoten-Typen verwendet wird.

ParameterTypBeschreibung
titlestringName des Knoten-Typs
typestringBezeichner des Knoten-Typs
groupstringBezeichner der Knoten-Typ-Gruppe, Optionen: 'control'/'collection'/'manual'/'extended'
description?stringBeschreibung des Knoten-Typs
icon?JSX.ElementKnoten-Symbol
FieldsetLoader?LoaderOfKnoten-Konfigurations-Drawer-Formular (Lazy-Loading)
PresetFieldsetLoader?LoaderOfVoreinstellungsformular beim Erstellen (Lazy-Loading)
ComponentLoader?LoaderOf<{ data: any }>Benutzerdefiniertes Knoten-Rendering auf der Canvas (Lazy-Loading), verwendet für Branch-Knoten und andere Fälle, die spezielles Rendering erfordern
branching?boolean | object | ((config) => boolean | object)Deklariert, ob der Knoten ein Branch-Knoten ist
end?boolean | ((node) => boolean)Deklariert, ob der Knoten ein Endknoten ist
testable?booleanDeklariert, ob der Knoten Testläufe unterstützt
createDefaultConfig?() => objectStellt Standard-Konfigurationswerte bereit
useVariables?(node, options?: UseVariableOptions) => VariableOptionMethode, mit der der Knoten Variablenoptionen bereitstellt
useScopeVariables?(node, options?) => VariableOption[] | MetaTreeNode[]Methode, mit der der Knoten Branch-bezogene Variablenoptionen bereitstellt
isAvailable?(ctx: NodeAvailableContext) => booleanMethode zur Bestimmung, ob der Knoten verfügbar ist
getCreateModelMenuItem?({ node, workflow }) => SubModelItem | nullMenüeinträge zum Erstellen von Untermodellen auf der Canvas
useTempAssociationSource?(node) => TempAssociationSource | nullStellt eine temporäre Assoziationsdatenquelle bereit

Zugehörige Typen

export type NodeAvailableContext = {
  engine: WorkflowPlugin;
  workflow: object;
  upstream: object;
  branchIndex: number;
};
  • Wenn useVariables nicht gesetzt ist, bietet dieser Knoten-Typ keine Wertabruffunktion an, und die Ergebnisdaten dieses Knoten-Typs können in den Workflow-Knoten nicht ausgewählt werden. Wenn der Ergebniswert einwertig ist (nicht auswählbar), können Sie statischen Inhalt zurückgeben, der die entsprechende Information ausdrückt (siehe: Quellcode des Berechnungsknotens). Wenn er auswählbar sein muss (z. B. eine Eigenschaft eines Objekts), können Sie die entsprechende Auswahlkomponente anpassen (siehe: Quellcode des Datenabfrageknotens).
  • ComponentLoader ist eine benutzerdefinierte Rendering-Komponente für den Knoten. Wenn das Standard-Knoten-Rendering nicht ausreicht, kann es vollständig überschrieben werden, um eine benutzerdefinierte Knotenansicht zu rendern. Beispielsweise um zusätzliches Branch-Rendering für Branch-Typ-Knoten bereitzustellen (siehe: Quellcode des Bedingungsknotens).
  • isAvailable wird hauptsächlich verwendet, um zu bestimmen, ob ein Knoten in der aktuellen Umgebung verwendet (hinzugefügt) werden kann. Die aktuelle Umgebung umfasst die Workflow-Plugin-Instanz, den aktuellen Workflow, vorgelagerte Knoten und den aktuellen Branch-Index.

Variableneingabe-Komponenten

Der Workflow stellt eine Reihe von Variableneingabe-Komponenten bereit, mit denen Benutzer Workflow-Variablen in Knoten-/Trigger-Konfigurationsformularen auswählen können.

import {
  WorkflowVariableInput,
  WorkflowVariableTextArea,
  WorkflowTypedVariableInput,
  WorkflowVariableWrapper,
} from '@nocobase/plugin-workflow/client-v2';

WorkflowVariableInput

Variableneingabe, die das Auswählen einer Variable und das anschließende Weiterschreiben von Inhalten unterstützt. Geeignet für einzeilige Eingabeszenarien, die eine Mischung aus Variablenreferenzen und Freitext erfordern.

import { WorkflowVariableInput } from '@nocobase/plugin-workflow/client-v2';

<Form.Item name={['config', 'target']} label="Target">
  <WorkflowVariableInput />
</Form.Item>

WorkflowVariableInput

Props

ParameterTypBeschreibung
value?stringVariablenpfadwert, z. B. {{$jobsMapByNodeKey.xxx.field}}
onChange?(value: string) => voidCallback bei Wertänderung
variableOptions?UseWorkflowVariableOptionsVariablenfilteroptionen (Typfilterung, Tiefe usw.)
disabled?booleanOb deaktiviert
placeholder?stringPlatzhaltertext

WorkflowVariableTextArea

Mehrzeiliger Textbereich, der das Einfügen von Variablenreferenzen an beliebiger Cursorposition unterstützt. Geeignet für Freitextszenarien wie HTTP-Body, Vorlagentexte usw.

import { WorkflowVariableTextArea } from '@nocobase/plugin-workflow/client-v2';

<Form.Item name={['config', 'body']} label="Body">
  <WorkflowVariableTextArea autoSize={{ minRows: 5 }} />
</Form.Item>

WorkflowVariableTextArea

Props

ParameterTypBeschreibung
value?stringTextwert (kann Variablenreferenzen enthalten)
onChange?(value: string) => voidCallback bei Wertänderung
variableOptions?UseWorkflowVariableOptionsVariablenfilteroptionen
delimiters?readonly [string, string]Variablen-Trennzeichen, Standard ist ['{{', '}}']

Erbt weitere Props von antd TextArea (wie autoSize, placeholder usw.).

WorkflowTypedVariableInput

Typisierte Eingabe, die zwischen den Modi „Konstante" und „Variablenreferenz" umschaltet. Im Variablenmodus kann nur eine Variable ausgewählt werden; nach der Auswahl kann nicht weitergetippt werden. Im Konstantenmodus werden fünf Typen unterstützt: string, number, boolean, date und object.

import { WorkflowTypedVariableInput } from '@nocobase/plugin-workflow/client-v2';

<Form.Item name={['config', 'value']} label="Value">
  <WorkflowTypedVariableInput />
</Form.Item>

WorkflowTypedVariableInput

Props

ParameterTypBeschreibung
variableOptions?UseWorkflowVariableOptionsVariablenfilteroptionen

Erbt weitere Props von TypedVariableInput (ausgenommen intern verwendete extraNodes, metaTree, namespaces).

WorkflowVariableWrapper

Generischer Wrapper zum Austauschen verschiedener Eingabekomponenten in unterschiedlichen Kontexten. Wenn beispielsweise dasselbe Feld in der Trigger-Knotenkonfiguration und im Knotenkonfigurations-Drawer unterschiedliche Eingabemethoden erfordert, können Sie diese Komponente verwenden, um eine native Eingabe in eine Eingabe mit Variablenmodus-Umschaltung zu verpacken.

import { WorkflowVariableWrapper } from '@nocobase/plugin-workflow/client-v2';

<Form.Item name={['config', 'timeout']} label="Timeout">
  <WorkflowVariableWrapper
    render={({ value, onChange }) => (
      <InputNumber value={value} onChange={onChange} min={0} />
    )}
  />
</Form.Item>

Props

ParameterTypBeschreibung
value?TValue | string | nullAktueller Wert (Konstantenwert oder Variablenpfad-String)
onChange?(value: TValue | string | null) => voidCallback bei Wertänderung
variableOptions?UseWorkflowVariableOptionsVariablenfilteroptionen
render(props: { value?, onChange? }) => ReactNodeRendert die native Eingabekomponente
clearValue?TValue | nullAnfangswert beim Zurückschalten vom Variablenmodus in den Konstantenmodus, Standard ist null

Collection-bezogene Komponenten

Der Workflow stellt außerdem eine Reihe von Collection-bezogenen Hilfskomponenten bereit:

import {
  CollectionCascader,
  AppendsSelect,
  FieldsSelect,
  SortFieldsInput,
  PaginationFields,
} from '@nocobase/plugin-workflow/client-v2';
  • CollectionCascader — Datenquellenbasierter Collection-Selektor (Kaskadierung)
  • AppendsSelect — Selektor für das Vorladen von Assoziationsfeldern (Baumauswahl)
  • FieldsSelect — Mehrfachselektor für Collection-Felder
  • SortFieldsInput — Sortierfeld-Eingabe
  • PaginationFields — Paginierungs-Parameter-Formularfelder