Tham chiếu API

Phía Server

Các API có sẵn trong cấu trúc package phía server như đoạn code dưới đây:

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

PluginWorkflowServer

Class plugin Workflow.

Thông thường khi ứng dụng đang chạy, ở bất kỳ nơi nào có thể lấy được instance ứng dụng app thì đều có thể gọi app.pm.get<PluginWorkflowServer>(PluginWorkflowServer) để lấy instance plugin Workflow (dưới đây gọi là plugin).

registerTrigger()

Mở rộng đăng ký loại Trigger mới.

Chữ ký

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

Tham số

Tham sốKiểuMô tả
typestringĐịnh danh loại Trigger
triggertypeof Trigger | TriggerLoại hoặc instance Trigger

Ví dụ

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()

Mở rộng đăng ký loại Node mới.

Chữ ký

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

Tham số

Tham sốKiểuMô tả
typestringĐịnh danh loại Instruction
instructiontypeof Instruction | InstructionLoại hoặc instance Instruction

Ví dụ

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()

Kích hoạt Workflow cụ thể. Chủ yếu dùng trong Trigger tùy chỉnh, để kích hoạt Workflow tương ứng khi nghe được sự kiện tùy chỉnh nào đó.

Chữ ký

trigger(workflow: Workflow, context: any)

Tham số

Tham sốKiểuMô tả
workflowWorkflowModelĐối tượng Workflow cần kích hoạt
contextobjectDữ liệu ngữ cảnh được cung cấp khi kích hoạt
Gợi ý

context hiện là bắt buộc, nếu không cung cấp thì Workflow đó sẽ không được kích hoạt.

Ví dụ

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()

Khôi phục thực thi Workflow đang chờ với một Task Node cụ thể.

  • Chỉ có Workflow đang ở trạng thái chờ (EXECUTION_STATUS.STARTED) mới có thể được khôi phục thực thi.
  • Chỉ có Task Node đang ở trạng thái chờ (JOB_STATUS.PENDING) mới có thể được khôi phục thực thi.

Chữ ký

resume(job: JobModel)

Tham số

Tham sốKiểuMô tả
jobJobModelĐối tượng Task sau khi cập nhật
Gợi ý

Đối tượng Task được truyền vào thường là đối tượng sau khi cập nhật, và thường sẽ cập nhật status thành giá trị khác JOB_STATUS.PENDING, nếu không sẽ tiếp tục chờ.

Ví dụ

Xem chi tiết tại mã nguồn.

Trigger

Class cơ sở của Trigger, dùng để mở rộng loại Trigger tùy chỉnh.

import { Trigger } from '@nocobase/plugin-workflow';
Tham sốKiểuMô tả
constructor(public readonly workflow: PluginWorkflowServer): TriggerConstructor
on?(workflow: WorkflowModel): voidXử lý sự kiện sau khi bật Workflow
off?(workflow: WorkflowModel): voidXử lý sự kiện sau khi tắt Workflow

on/off được dùng để đăng ký/hủy đăng ký lắng nghe sự kiện khi Workflow được bật/tắt, tham số được truyền vào là instance Workflow của Trigger tương ứng, có thể xử lý theo cấu hình tương ứng. Một số loại Trigger nếu đã lắng nghe sự kiện ở phạm vi toàn cục thì cũng có thể không cần triển khai hai phương thức này. Ví dụ trong Trigger định kỳ, có thể đăng ký timer trong on, hủy đăng ký timer trong off.

Instruction

Class cơ sở của loại Instruction, dùng để mở rộng loại Instruction tùy chỉnh.

import { Instruction } from '@nocobase/plugin-workflow';
Tham sốKiểuMô tả
constructor(public readonly workflow: PluginWorkflowServer): InstructionConstructor
runRunnerLogic thực thi khi vào Node lần đầu
resume?RunnerLogic thực thi khi vào Node sau khi khôi phục thực thi từ trạng thái gián đoạn
getScope?(node: FlowNodeModel, data: any, processor: Processor): anyCung cấp nội dung biến cục bộ cho nhánh sinh ra bởi Node tương ứng

Kiểu liên quan

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 có thể tham khảo cách triển khai Node vòng lặp, được dùng để cung cấp nội dung biến cục bộ của nhánh.

EXECUTION_STATUS

Bảng hằng số trạng thái kế hoạch thực thi Workflow, dùng để xác định trạng thái hiện tại của kế hoạch thực thi tương ứng.

import { EXECUTION_STATUS } from '@nocobase/plugin-workflow';
Tên hằng sốÝ nghĩa
EXECUTION_STATUS.QUEUEINGĐang xếp hàng
EXECUTION_STATUS.STARTEDĐang thực thi
EXECUTION_STATUS.RESOLVEDHoàn tất thành công
EXECUTION_STATUS.FAILEDThất bại
EXECUTION_STATUS.ERRORLỗi thực thi
EXECUTION_STATUS.ABORTEDĐã gián đoạn
EXECUTION_STATUS.CANCELEDĐã hủy
EXECUTION_STATUS.REJECTEDĐã từ chối
EXECUTION_STATUS.RETRY_NEEDEDThực thi không thành công, cần thử lại

Ngoài ba trạng thái đầu, các trạng thái còn lại đều biểu thị trạng thái thất bại nhưng có thể dùng để mô tả các nguyên nhân thất bại khác nhau.

JOB_STATUS

Bảng hằng số trạng thái Task Node của Workflow, dùng để xác định trạng thái hiện tại của Task Node tương ứng, trạng thái sinh ra bởi Node cũng đồng thời ảnh hưởng đến trạng thái của toàn bộ kế hoạch thực thi.

import { JOB_STATUS } from '@nocobase/plugin-workflow';
Tên hằng sốÝ nghĩa
JOB_STATUS.PENDINGChờ: đã thực thi đến Node này nhưng instruction yêu cầu treo và chờ
JOB_STATUS.RESOLVEDHoàn tất thành công
JOB_STATUS.FAILEDThất bại: Node này thực thi không thỏa mãn điều kiện cấu hình
JOB_STATUS.ERRORLỗi: trong quá trình thực thi Node này phát sinh lỗi không được bắt
JOB_STATUS.ABORTEDGián đoạn: Node này sau khi chờ bị logic khác kết thúc thực thi
JOB_STATUS.CANCELEDHủy: Node này sau khi chờ bị hủy thực thi bởi người dùng
JOB_STATUS.REJECTEDTừ chối: Node này sau khi chờ bị từ chối tiếp tục bởi người dùng
JOB_STATUS.RETRY_NEEDEDThực thi không thành công, cần thử lại

Phía Client

Các API có sẵn trong cấu trúc package phía client như đoạn code dưới đây:

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

PluginWorkflowClientV2

Class plugin Workflow phía client. Thường được lấy thông qua this.app.pm.get('workflow').

registerTrigger()

Đăng ký panel cấu hình tương ứng với loại Trigger.

Chữ ký

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

Tham số

Tham sốKiểuMô tả
typestringĐịnh danh loại Trigger, nhất quán với định danh đăng ký phía server
triggertypeof Trigger | TriggerLoại hoặc instance Trigger

registerInstruction()

Đăng ký panel cấu hình tương ứng với loại Node.

Chữ ký

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

Tham số

Tham sốKiểuMô tả
typestringĐịnh danh loại Node, nhất quán với định danh đăng ký phía server
instructiontypeof Instruction | InstructionLoại hoặc instance Node

registerInstructionGroup()

Đăng ký nhóm loại Node. NocoBase mặc định cung cấp 4 nhóm loại Node:

  • 'control': nhóm điều khiển
  • 'collection': nhóm thao tác bảng dữ liệu
  • 'manual': nhóm xử lý thủ công
  • 'extended': nhóm mở rộng khác

Nếu cần mở rộng thêm nhóm khác, có thể sử dụng phương thức này để đăng ký.

Chữ ký

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

Tham số

Tham sốKiểuMô tả
typestringĐịnh danh nhóm Node
group{ label: string }Thông tin nhóm, hiện chỉ chứa tiêu đề

Ví dụ

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()

Kiểm tra Workflow có đang ở chế độ đồng bộ hay không.

Chữ ký

isWorkflowSync(workflow: object): boolean

Trigger

Class cơ sở của Trigger, dùng để mở rộng loại Trigger tùy chỉnh.

Tham sốKiểuMô tả
titlestringTên loại Trigger
description?stringMô tả loại Trigger
PresetFieldsetLoader?LoaderOfForm cài đặt sẵn khi tạo (lazy-load)
FieldsetLoader?LoaderOfForm cấu hình Trigger đầy đủ (lazy-load)
TriggerFieldsetLoader?LoaderOfForm nhập liệu cho thực thi thủ công (lazy-load)
validate(config: Record<string, unknown>) => booleanKiểm tra cấu hình; trả về true nếu cấu hình hợp lệ
createDefaultConfig?() => Record<string, unknown>Cung cấp giá trị cấu hình mặc định
useVariables?(config, options?: UseVariableOptions) => VariableOption[] | nullTùy chọn biến cho dữ liệu ngữ cảnh Trigger
getCreateModelMenuItem?(args) => SubModelItem | SubModelItem[] | nullMục menu tạo sub-model trên canvas
useTempAssociationSource?(config, workflow?) => TriggerTempAssociationSource | nullCung cấp nguồn dữ liệu liên kết tạm thời

Kiểu liên quan

export type LoaderOf<P = {}> = () => Promise<{ default: ComponentType<P> }>;
  • Nếu useVariables không được thiết lập, có nghĩa loại Trigger này không cung cấp khả năng lấy giá trị, các Node trong quy trình không thể chọn dữ liệu ngữ cảnh của Trigger.

Instruction

Class cơ sở của Instruction, dùng để mở rộng loại Node tùy chỉnh.

Tham sốKiểuMô tả
titlestringTên loại Node
typestringĐịnh danh loại Node
groupstringĐịnh danh nhóm loại Node, có thể chọn: 'control'/'collection'/'manual'/'extended'
description?stringMô tả loại Node
icon?JSX.ElementIcon Node
FieldsetLoader?LoaderOfForm drawer cấu hình Node (lazy-load)
PresetFieldsetLoader?LoaderOfForm cài đặt sẵn khi tạo (lazy-load)
ComponentLoader?LoaderOf<{ data: any }>Render Node tùy chỉnh trên canvas (lazy-load), dùng cho Node nhánh và các trường hợp cần render đặc biệt
branching?boolean | object | ((config) => boolean | object)Khai báo Node có phải Node nhánh không
end?boolean | ((node) => boolean)Khai báo Node có phải Node kết thúc không
testable?booleanKhai báo Node có hỗ trợ chạy thử không
createDefaultConfig?() => objectCung cấp giá trị cấu hình mặc định
useVariables?(node, options?: UseVariableOptions) => VariableOptionPhương thức cung cấp tùy chọn biến của Node
useScopeVariables?(node, options?) => VariableOption[] | MetaTreeNode[]Phương thức cung cấp tùy chọn biến phạm vi nhánh của Node
isAvailable?(ctx: NodeAvailableContext) => booleanPhương thức kiểm tra Node có khả dụng không
getCreateModelMenuItem?({ node, workflow }) => SubModelItem | nullMục menu tạo sub-model trên canvas
useTempAssociationSource?(node) => TempAssociationSource | nullCung cấp nguồn dữ liệu liên kết tạm thời

Kiểu liên quan

export type NodeAvailableContext = {
  engine: WorkflowPlugin;
  workflow: object;
  upstream: object;
  branchIndex: number;
};
  • Nếu useVariables không được thiết lập, có nghĩa loại Node này không cung cấp khả năng lấy giá trị, các Node trong quy trình không thể chọn dữ liệu kết quả của loại Node này. Nếu giá trị kết quả là duy nhất (không thể chọn), chỉ cần trả về một nội dung tĩnh có thể biểu thị thông tin tương ứng (tham khảo: mã nguồn Node tính toán). Nếu cần có thể chọn (như một thuộc tính trong Object), có thể tự định nghĩa Component chọn tương ứng để xuất ra (tham khảo: mã nguồn Node truy vấn dữ liệu).
  • ComponentLoader là Component render tùy chỉnh của Node. Khi việc render Node mặc định không đủ, có thể hoàn toàn ghi đè để render view tùy chỉnh cho Node. Ví dụ để cung cấp thêm render nhánh cho các Node loại nhánh (tham khảo: mã nguồn Node điều kiện).
  • isAvailable chủ yếu được dùng để kiểm tra Node có thể được sử dụng (thêm vào) trong môi trường hiện tại hay không. Môi trường hiện tại bao gồm instance plugin Workflow, Workflow hiện tại, Node phía trên và chỉ số nhánh hiện tại.

Component nhập biến

Workflow cung cấp một bộ component nhập biến để người dùng chọn biến Workflow trong form cấu hình Node/Trigger.

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

WorkflowVariableInput

Ô nhập biến hỗ trợ chọn biến và tiếp tục nhập nội dung. Phù hợp cho các tình huống nhập một dòng cần kết hợp tham chiếu biến và văn bản tự do.

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

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

WorkflowVariableInput

Props

Tham sốKiểuMô tả
value?stringGiá trị đường dẫn biến, ví dụ {{$jobsMapByNodeKey.xxx.field}}
onChange?(value: string) => voidCallback khi giá trị thay đổi
variableOptions?UseWorkflowVariableOptionsTùy chọn lọc biến (lọc kiểu, độ sâu...)
disabled?booleanCó bị vô hiệu hóa không
placeholder?stringVăn bản placeholder

WorkflowVariableTextArea

Vùng nhập văn bản nhiều dòng hỗ trợ chèn tham chiếu biến tại bất kỳ vị trí con trỏ nào. Phù hợp cho các tình huống văn bản tự do như HTTP Body, văn bản template...

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

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

WorkflowVariableTextArea

Props

Tham sốKiểuMô tả
value?stringGiá trị văn bản (có thể chứa tham chiếu biến)
onChange?(value: string) => voidCallback khi giá trị thay đổi
variableOptions?UseWorkflowVariableOptionsTùy chọn lọc biến
delimiters?readonly [string, string]Ký tự phân cách biến, mặc định ['{{', '}}']

Kế thừa các Props khác từ antd TextArea (như autoSize, placeholder...).

WorkflowTypedVariableInput

Ô nhập có kiểu, chuyển đổi giữa chế độ "hằng số" và "tham chiếu biến". Ở chế độ biến, chỉ có thể chọn biến, không thể tiếp tục nhập sau khi chọn. Ở chế độ hằng số, hỗ trợ năm kiểu: string, number, boolean, dateobject.

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

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

WorkflowTypedVariableInput

Props

Tham sốKiểuMô tả
variableOptions?UseWorkflowVariableOptionsTùy chọn lọc biến

Kế thừa các Props khác từ TypedVariableInput (ngoại trừ extraNodes, metaTree, namespaces được sử dụng nội bộ).

WorkflowVariableWrapper

Component bọc tổng quát để thay thế các component nhập khác nhau trong các ngữ cảnh khác nhau. Ví dụ khi cùng một trường cần phương thức nhập khác nhau trong cấu hình Node Trigger và drawer cấu hình Node, có thể sử dụng component này để bọc ô nhập native thành ô nhập có thể chuyển đổi chế độ biến.

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

Tham sốKiểuMô tả
value?TValue | string | nullGiá trị hiện tại (giá trị hằng số hoặc chuỗi đường dẫn biến)
onChange?(value: TValue | string | null) => voidCallback khi giá trị thay đổi
variableOptions?UseWorkflowVariableOptionsTùy chọn lọc biến
render(props: { value?, onChange? }) => ReactNodeRender component nhập native
clearValue?TValue | nullGiá trị khởi tạo khi chuyển từ chế độ biến về chế độ hằng số, mặc định null

Component liên quan đến bảng dữ liệu

Workflow cũng cung cấp một bộ component trợ giúp liên quan đến bảng dữ liệu:

import {
  CollectionCascader,
  AppendsSelect,
  FieldsSelect,
  SortFieldsInput,
  PaginationFields,
} from '@nocobase/plugin-workflow/client-v2';
  • CollectionCascader — Bộ chọn bảng dữ liệu hỗ trợ nguồn dữ liệu (cascader)
  • AppendsSelect — Bộ chọn tải trước trường liên kết (tree select)
  • FieldsSelect — Bộ chọn nhiều trường của bảng dữ liệu
  • SortFieldsInput — Ô nhập trường sắp xếp
  • PaginationFields — Các mục form tham số phân trang