BPMAXBPMAX
  • 快速入门
  • 核心概念
  • 管理员手册
  • 仿真和回放
  • 流程相关脚本
  • 表单相关脚本
  • 数据集相关脚本
  • 界面相关脚本
  • 系统相关脚本
  • 流程集成
  • 数据集
  • 接口集成
  • 实体映射
  • OpenAPI
  • 实体列表
  • 插件开发
  • 日志排查
  • 飞书平台

    • 同步组织架构
    • 同步团队组织架构
    • 一键拉群
    • 高级卡片消息
    • 服务台能力
  • 实用功能

    • 系统公告
    • 项目日历
    • 超时自动化
    • 报告自动生成
    • 流程资源档案
  • 文档更新记录
  • 系统更新说明
  • 快速入门
  • 核心概念
  • 管理员手册
  • 仿真和回放
  • 流程相关脚本
  • 表单相关脚本
  • 数据集相关脚本
  • 界面相关脚本
  • 系统相关脚本
  • 流程集成
  • 数据集
  • 接口集成
  • 实体映射
  • OpenAPI
  • 实体列表
  • 插件开发
  • 日志排查
  • 飞书平台

    • 同步组织架构
    • 同步团队组织架构
    • 一键拉群
    • 高级卡片消息
    • 服务台能力
  • 实用功能

    • 系统公告
    • 项目日历
    • 超时自动化
    • 报告自动生成
    • 流程资源档案
  • 文档更新记录
  • 系统更新说明
  • 插件开发入门

    • 插件开发
    • 插件架构与加载机制
    • 环境准备与开发模式
    • 第一个最小插件
  • 插件能力开发

    • 前端扩展点实战
    • 后端扩展点实战
    • 前后端联动完整案例:任务集成插件
  • 插件运行机制

    • 配置、安装、升级与发布
    • 定时任务与异步处理
    • Hook 机制与平台事件接入
    • 外部系统集成模式
  • 进阶与参考

    • 调试与排错
    • 设计规范与最佳实践
    • 能力类型索引与选型

Hook 机制与平台事件接入

本文介绍 BPMAX 插件体系中的 Hook 机制,包括插件如何注册事件处理逻辑,以及平台如何触发这些 Hook。

学习目标

  • 理解 Hook 的注册与触发机制
  • 理解哪些场景适合使用 Hook
  • 学会设计低耦合的插件扩展方式

Hook 机制概览

Hook 的作用是让插件在不修改平台主流程代码的前提下,挂接额外逻辑。

常见收益:

  • 降低耦合
  • 便于扩展
  • 便于多个插件共享平台事件

Hook 的执行方式

一般流程是:

  1. 平台在运行时准备 Hook 容器
  2. 插件启动时注册事件处理函数
  3. 平台在特定时机触发对应事件
  4. 插件处理函数接收上下文并执行业务逻辑

插件侧接入方式

在插件中注册 Hook

典型写法如下:

think.addPluginHook('workflow.step.active', async function (context) {
  return context;
});

如果需要把 Hook 转给服务层处理,可以写成:

think.addPluginHook('workflow.step.active', async function (context) {
  await think.service('plugin_task_integration_hook').handleStepActive(context);
  return context;
});

在 Hook 中调用插件服务

Hook 回调里不要堆太多业务逻辑,建议尽量转到服务层处理。

例如:

export default class PluginTaskIntegrationHookService extends think.Service {
  async handleStepActive(context) {
    const { step, project } = context;

    if (!step?.plugin_task_integration?.enabled) {
      return;
    }

    await this.service('plugin_task_integration').createTaskFromStep({
      project_id: project.guid,
      step_id: step.guid,
      config: step.plugin_task_integration,
    });
  }
}

Hook 返回值与异常处理

如果 Hook 参与主流程,返回值和异常都会影响调用结果。设计时要先明确:

  • 这个 Hook 是否允许失败
  • 失败后是否应阻断主流程
  • 是否需要降级处理

适合用 Hook 的场景

流程事件

例如环节激活、流转、完成后触发附加动作。

自定义鉴权处理器

适合把第三方鉴权逻辑注册到平台统一调用链中。

组织架构同步

适合监听组织、用户、团队等事件,触发同步或补偿动作。

第三方回调分发

适合在统一回调入口下按事件类型分发给不同插件。

回调分发可以先写成最简单的映射结构:

const callbackHandlers = {
  'task.created': 'handleTaskCreated',
  'task.completed': 'handleTaskCompleted',
};

const method = callbackHandlers[eventType];

if (method) {
  await this.service('plugin_task_integration_callback')[method](payload);
}

不适合用 Hook 的场景

以下场景更适合直接做页面、接口或服务,而不是强行使用 Hook:

  • 纯页面展示
  • 一次性配置保存
  • 简单 CRUD

典型案例

鉴权处理器注册

插件可以通过 Hook 把自定义鉴权逻辑注册给平台的 API 调用链。

组织同步事件

插件可以监听团队、用户、组织相关事件,在平台主流程之外完成同步。

常见问题

Hook 注册了但没有触发

  • 事件名写错
  • 插件未被加载
  • 触发条件未满足

Hook 抛错影响主流程

如果 Hook 参与主流程,就必须提前定义错误策略,避免把非关键附加逻辑变成全局阻塞点。

多个插件同时监听同一事件

这种情况是允许的,但要注意:

  • 执行顺序
  • 共享数据修改
  • 重复副作用

下一步

  • 外部系统集成模式
  • 设计规范与最佳实践
Prev
定时任务与异步处理
Next
外部系统集成模式