packages/plugins/@nocobase/plugin-flow-engine/src/server/flow-surfaces/approval/README.md
在 flowSurfaces 现有 API 体系内,直接支持审批相关 UI 搭建能力,不新增独立 resource,也不引入 approval provider / extensibility。
这里的审批界面不是普通页面搭建,而是工作流审批节点的配置界面。它的 FlowModel、可放置区块、可添加动作、字段包装器,都和普通 page surface 不同,因此实现放在 flow-surfaces/approval/ 子目录,并由 flowSurfaces 主服务按语义 use 接入。
flowSurfaces 已经负责 target 定位、树结构持久化、catalog 发现、compose/addBlock/addField/addAction/updateSettings 等通用写入流程。因此更合理的做法是在 flowSurfaces 内扩展 approval-specific action/block/field semantics,而不是再复制一套审批专用 API。
semantic-use.ts
catalog-specs.ts
builder.ts
PatternFormFieldModel 专用构建逻辑blueprint-service.ts
flowSurfaces:applyApprovalBlueprint 的 binding/root/orchestrationruntime-config.ts
approvalInitiator -> ApplyFormModel
TriggerBlockGridModelApplyFormSubmitModelapprovalApprover -> ProcessFormModel
ApprovalBlockGridModelapprovalInformation -> ApprovalDetailsModel
ApprovalBlockGridModelTriggerBlockGridModel / ApprovalBlockGridModel
markdownjsBlockapplyApprovalBlueprint 的 page-like blocks[] 允许沿用普通 compose/addBlock 的 template: { uid, mode } 语义catalog / addBlock / compose 判定为准,而不是再维护一份 approval blueprint 静态白名单fields + layoutapprovalSubmitapprovalSaveDraftapprovalWithdrawapprovalApproveapprovalRejectapprovalReturnapprovalDelegateapprovalAddAssigneeconfigure 语义:
approvalSubmit / approvalSaveDraft: confirm、assignValuesapprovalWithdraw: confirmapprovalApprove / approvalReject: commentFormUidapprovalReturn: commentFormUid、approvalReturnapprovalDelegate / approvalAddAssignee: assigneesScopePatternFormItemModelApprovalDetailsItemModelApplyTaskCardDetailsItemModelApprovalTaskCardDetailsItemModelPatternFormItemModel
text / picker / subFormtext / picker / subFormList / subTable / popupSubTableApprovalDetailsItemModel / ApplyTaskCardDetailsItemModel / ApprovalTaskCardDetailsItemModel
text / subDetailstext / subDetailsList / subTablecatalog.node.configureOptions.fieldType.enum 会按当前 wrapper use 与真实字段 interface 动态收窄,configure(fieldType) 也按同一套 truth source 校验TriggerBlockGridModel / ApprovalBlockGridModel 是 approval page-like block container:
markdown / jsBlockApplyTaskCardDetailsModel / ApprovalTaskCardDetailsModel 仍是 block-forbidden surface,不接受 block blueprint,也不接受 incremental addBlockPatternFormItemModel 下的 inner field 必须持久化为 PatternFormFieldModel,并把真实字段 use 记录到 stepParams.fieldBinding.use。fieldType 的公开切换范围必须跟随真实字段 interface 与 wrapper use 动态收窄,不能再靠静态全局枚举推断。继续使用:
flowSurfaces:applyApprovalBlueprintflowSurfaces:catalogflowSurfaces:addBlockflowSurfaces:addFieldflowSurfaces:addActionflowSurfaces:composeflowSurfaces:configureapproval 相关差异通过 target 所在的 approval surface 与 catalog key / use 来表达,而不是通过新 endpoint 表达。
其中 flowSurfaces:applyApprovalBlueprint 是 approval surface 的薄 orchestration 层:
approvalUid / taskCardUidcompose(..., mode: "replace"),并沿用普通 flowSurfaces block legality 检查addField + setLayout