Core · 使用插件

审批

提供的能力

@nocobase/app-plugin-approval 将人工审批接入围绕业务记录推进的工作流,管理审批参与人、任务、操作记录与内容快照。适合请假、采购、合同等需要人工确认的业务。它是商业插件,安装前确认相应包访问权限与使用授权。

插件提供审批编排与读模型;业务页面、接口、授权和定时执行由应用组合。

使用场景与示例

示例:采购申请

申请人在草稿中填写采购内容,提交后进入主管审批。主管可以通过、驳回或退回草稿。通过时,审批结论和采购记录状态在同一事务中推进;退回后由申请人通过业务允许的入口修改,再次提交。

处理页面应使用 runViewsFor、upcomingStagesFor、previewRoute 等公开读模型展示进度和候选动作。应用可安装 UI Library 的 approval-ui 源码组件,将读模型映射为进度、时间线、预览和操作栏。

接口必须重新检查当前用户、记录权限、任务资格和内容版本,不能只因为浏览器显示“通过”按钮就允许提交。审批内容变化后,原来的正向结论可能需要重新审阅。

开发提示词(交给当前应用目录中的 Coding Agent):

纯文本
请使用已获授权的审批插件,为采购申请接入主管审批。
沿用业务记录生命周期,明确草稿、审批、退回与最终状态及审批人范围。
用公开读模型和审批 UI 组件显示进度、时间线与允许操作,接口重新校验资格和内容版本。
最终审批结论与业务状态在同一事务推进,接入宿主 Jobs 的定时检查。
验证无审批人、重复操作、退回修改、并发冲突和事务失败。

完成标志:采购申请可以提交、通过或退回;无资格操作被拒绝,事务失败不会留下不一致的最终状态。

重要原理与实现

以下是实现本例时的接入位置与预期界面变化;它们是开发说明,具体文件名沿用当前应用结构。

接入位置代码或配置变化界面与行为变化
业务生命周期、审批配置与事务存储组合阶段、参与人和结论映射采购记录状态与审批结果一致
业务接口与详情页接入读模型、进度和受授权操作申请人与审批人看到对应动作
Jobs 与后续业务处理接入 sweep、prune 及外部执行状态定时工作与业务失败有明确处理

接入前准备

插件 Server 入口提供审批数据迁移和公开编排 API,Client 入口提供语言资源与读模型工具,不自动生成审批中心、业务接口或工作流设计器。

应用需要提供:

  • 业务 Collection、记录生命周期及其事务存储。
  • 身份认证、业务权限、组织与人员查询。
  • 审批配置、操作接口和业务页面。
  • 定时检查及提交后的通知、业务执行等集成。

通过 /server 的 defineApproval、stagesFor、approvalState 等声明流程,再将生命周期交给宿主 LifecycleRuntime,将审批配置交给 ApprovalService。一个业务记录标识一个流程,不要为审批另建一份脱离业务状态的“流程状态”。

配置审批

先确定草稿、审批、退回修改和最终状态,再设置每个审批阶段的参与人、决策规则和允许动作。公开策略涵盖单人、会签、任一通过、顺序、阈值和自定义聚合;转交或加签还需配置可选择的接收人范围。

业务问题配置要点
谁审批参与人解析、人员有效性、无审批人时的处理
何时通过阶段决策规则及结果到业务状态的映射
能否退回或转交显式声明动作、退回目标和接收人范围
审批期间能否改数据冻结字段、内容 hash 与版本检查
通过后做什么业务生命周期的后续状态与副作用

AI 开发的约束与验证

本插件的开发约束

  • 复用业务记录作为流程标识,不能维护与业务状态脱节的第二份状态。
  • 可见按钮不代表有权审批;服务端同时校验用户、记录、任务资格和内容版本。
  • 在隔离数据上验证重复与并发操作、最终事务失败;外部执行失败使用业务重试状态,不重复人工审批。

定时工作与验证

插件不自己运行定时器。应用通过 createLifecycleJobs 接入宿主 Jobs,在 sweep 回调中调用 ApprovalService.sweep() 和 runtime.prune(),处理任务时钟与生命周期触发器。

验证无审批人、不同决策规则、重复操作、退回修改、内容冲突和最终事务失败。后续外部执行失败应由业务记录可观察的失败与重试状态承接,避免重复人工审批。

相关文档:权限管理、后台任务、数据库事务、管理插件。

本篇按商业插件的公开导出与示例核对;包获取与使用以相应授权为准。

上述检查是接入后的验收要求,不表示本文已完成运行验证。让 Agent 报告实际改动、执行过的检查和未验证项;项目指引、Skills 与通用检查流程见持续开发应用和测试。

NocoBase 文档助手

关于 NocoBase,你想了解什么?

每次提问独立回答,不会参考之前的问答。请提供完整背景。