提供的能力
@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 与通用检查流程见持续开发应用和测试。