logologo
开始
手册
开发
插件
API
English
简体中文
开始
手册
开发
插件
API
English
简体中文
logologo
工作流
概述
快速开始

触发器

概述
数据表事件
定时任务
操作前事件
操作后事件
自定义操作事件
审批
Webhook

节点

概述

人工智能

大语言模型

流程控制

条件
循环
变量
并行分支
调用工作流
流程输出
延时
结束

计算

计算
日期计算
JSON 计算
JSON 变量映射

数据操作

新增数据
更新数据
查询数据
删除数据
SQL 操作

人工处理

人工处理
审批
抄送

扩展类型

HTTP 请求
JavaScript 脚本
通知
邮件发送
响应
响应消息
变量
执行记录
版本管理
高级选项

扩展开发

概述
扩展触发器类型
扩展节点类型
API 参考
Previous Page扩展节点类型

#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) {
  // 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()

扩展注册新的节点类型。

签名

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

    // register instruction
    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) {
    // register event
    this.timer = setInterval(() => {
      // trigger workflow
      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 }配置项 Schema 中可能用到的对象集合
components?{ [key: string]: React.FC }配置项 Schema 中可能用到的组件集合
useVariables?(config: any, options: UseVariableOptions ) => VariableOptions触发上下文数据的值获取器
  • useVariables 如果没有设置,则代表该类型触发器不提供取值功能,在流程的节点中无法选取触发器的上下文数据。

#Instruction

指令基类,用于扩展自定义节点类型。

参数类型说明
groupstring节点类型分组标识,目前可选:'control'/'collection'/'manual'/'extended'
fieldsetRecord<string, ISchema>节点配置项集合
scope?Record<string, Function>配置项 Schema 中可能用到的对象集合
components?Record<string, React.FC>配置项 Schema 中可能用到的组件集合
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 如果没有设置,则代表该节点类型不提供取值功能,在流程的节点中无法选该类型节点的结果数据。如果结果值是单一的(不可选),则返回一个可以表达对应信息的静态内容即可(参考:运算节点源码)。如果需要可选(如一个 Object 中的某个属性),则可以自定义对应的选择组件输出(参考:新增数据节点源码)。
  • Component 节点自定义渲染组件,当默认节点渲染不满足时可以完全覆盖替代使用,进行自定义节点视图渲染。例如要针对分支类型的开始节点提供更多操作按钮或其他交互,则需要使用该方法(参考:并行分支源码)。
  • useInitializers 用于提供初始化区块的方法,例如在人工节点中可以根据上游节点初始化相关用户区块。如果提供了该方法,则会在人工节点界面配置中初始化区块时可用(参考:新增数据节点源码)。
  • isAvailable 主要用于判断节点是否可以在当前环境中可以被使用(添加)。当前环境包括当前工作流、上游节点和当前分支索引等。