审批流结束组件
审批流结束组件(ApproveEnd)是审批流画布的出口节点,标识一条审批流的终点。
概述
审批流结束组件是审批流画布(场景 MetaWorkflow)的固定出口节点。当流程流转到该节点时,审批流判定为结束。新建审批流时画布会自动预置该节点。
该节点属于引擎固定节点,不可删除、不可禁用,也不能插入到连线中间。它承载结束节点的标题信息,并可配置副标题作为补充说明。
配置项
| 配置项 | 必填 | 说明 |
|---|---|---|
| 节点名称 | 是 | 显示在流程图上的名称,缺省为「审批结束」 |
| 副标题 | 否 | 节点名称下方的补充说明文本 |
使用说明
- 一条审批流通常以一个审批流结束节点收尾,允许存在多个结束节点用于不同分支的收尾
- 结束后的终态回调接口等行为在流程属性中配置,详见 审批流配置
下一步
属性明细
以下内容面向技术实现与 AI 检索,说明审批流结束组件的节点元数据。
节点元数据
审批流结束组件由 FlowCmpType.ApproveEnd 标识:
| 属性名 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | 固定为 "ApproveEnd" |
Title | string | 节点名称 | 必填,为空时报「请输入流程节点名称」 |
SubTitle | string | 副标题 | 可为空 |
order | string | 同级排序 | 例:"2" |
该节点为固定节点,不支持 IsDisabled(禁用)与 IsFinalResult(输出到最终结果)。
元数据存储示例
{
"ID": "approve-end",
"type": "ApproveEnd",
"Title": "审批结束",
"SubTitle": "",
"order": "2"
}
服务端执行逻辑
审批流结束组件由 ApproveEndComponentManager 实现,继承 WorkflowComponentManagerBase,组件类型为 FlowComponentTypeEnum.ApproveEnd。
结束组件是审批链的终点:Build 阶段把结束节点写入实例的节点列表末尾,Execute 阶段将实例置为终态并调用基类 FinishAsync 执行终态回调(通知发起人、调用流程级自定义接口)。业务数据的状态回写由 WorkflowDataService.UpdateStatusAsync 统一完成。
节点 meta 以 Dictionary<string, string> 存储,Title、SubTitle、order 均以字符串保存,服务端统一通过 meta.SafeGet("Key") 读取。
执行时机与场景
| 时机 | 入口 | 说明 |
|---|---|---|
| 保存 / 发布校验 | _VerifyAsync | 校验整条链路至少存在一个审批节点 |
| 发起审批(构建节点列表) | _BuildAsync | 把结束节点追加进 WorkflowData.NodeItems |
| 流转到结束节点 | _NotifyAsync(内部转 _ExecuteAsync) | 将实例置为终态并执行终态回调 |
| 审批操作后继续流转 | _ExecuteAsync | 同上 |
_NotifyAsync 直接调用 _ExecuteAsync,因此「通知下一节点」和「审批动作后推进」两条路径到达结束节点时行为一致。
输入参数(meta 键)
| meta 键 | 读取方式 | 含义 |
|---|---|---|
Title | meta.SafeGet("Title") | 节点名称,为空时回退为本地化默认文案「审批结束」(ApprovalEnd) |
SubTitle | meta.SafeGet("SubTitle") | 副标题,可为空 |
上下文入参:context.Result 必须为 WorkflowData,context.Param 必须为 WorkflowOperationRequest,否则分别抛 ApprovalInstanceNotFound / ApprovalRequestParamError。
执行步骤
_VerifyAsync:
- 若
context.FinalResultCount == 0,抛WorkflowLinkMissingApprovalNode(明细MultiBranchLinkMissingApprovalNode)。
FinalResultCount由审批类节点在_VerifyAsync中累加(ApproveNode、ApproveAutoHandle)以及节点meta中IsFinalResult == "true"时累加(InterfaceComponentManagerBase.VerifyFinalResultCount)。它保证每条分支都能走到至少一个审批节点。
_BuildAsync:
- 读取
Title、SubTitle,要求context.Result为WorkflowData。 - 新建
WorkflowDataNode { NodeType = "ApproveEnd", NodeId, Title, SubTitle }追加到flowData.NodeItems,置context.CmpResult = true。 - 结束节点无下游,直接返回(不调用
BuildNextAsync)。
_ExecuteAsync:
- 要求
context.Result为WorkflowData、context.Param为WorkflowOperationRequest。 - 若
flowData.Status == InProgress,则置为Approved(其余终态保持原状)。 - 置
flowData.CurrentNode = 结束节点 Id。 - 调用基类
FinishAsync执行终态回调。
终态回调(FinishAsync)
FinishAsync 先按实例状态 / 操作动作确定流程级回调配置,再依次发通知、调接口:
| 场景 | 通知模板 | 自定义接口 |
|---|---|---|
Status = Approved | workflow.Properties.AgreeMessageTemplateId(为空用默认模板 DefaultTemplateId_ApprovalResult) | workflow.Properties.AgreeInterfaceId |
Status = Rejected | workflow.Properties.DisagreeMessageTemplateId(为空用默认模板) | workflow.Properties.DisagreeInterfaceId |
request.Action = Return | 不发通知(审批节点处理时已发) | workflow.Properties.ReturnInterfaceId |
request.Action = Revoke | 不发通知(审批节点处理时已发) | workflow.Properties.RevokeInterfaceId |
- 通知通过
SendNotificationByTemplateIdAsync发给发起人workflowData.LaunchUserId,参数含流程名与结果描述。 - 自定义接口通过
CallMetaInterfaceAsync调用InterfaceComponentManagementApp.StartAsync,注入的上下文参数为:WorkflowId、WorkflowNodeId、WorkflowNodeType、WorkflowDataIds(实例 Id)、Action、BizDataIds、MetaObjectCode。
实例状态与业务数据回写
| 上下文 / 实体 | 写入值 |
|---|---|
flowData.Status | 完成时 Approved;拒绝 / 驳回 / 撤回等终态由上游节点先行置为 Rejected / Returned / Revoked 后到达 |
flowData.CurrentNode | 结束节点 Id |
| 业务数据字段 | workflowdataid、approvalstatus、approvalnodeid、approvalnodetitle(由 UpdateStatusAsync 写入) |
终态取值(ApprovalStatusEnum):Approved = 2、Rejected = 3、Returned = 4、Revoked = 5。
异常与校验
| 场景 | 异常 / 提示 |
|---|---|
| 链路中不存在审批节点 | WorkflowLinkMissingApprovalNode(明细 MultiBranchLinkMissingApprovalNode) |
上下文缺少 WorkflowData | ApprovalInstanceNotFound |
上下文缺少 WorkflowOperationRequest | ApprovalRequestParamError |
| 流程定义不存在 | ApprovalWorkflowNotFound |
权限与限制
- 结束节点是固定引擎节点,可存在多个,用于不同分支收尾。
_ReAssignAsync为空实现(直接返回),保证重新分配审批人时流程可正常结束。- 终态判定:结束节点只在
InProgress时把状态改为Approved,不会覆盖上游已写入的驳回 / 撤回终态。
相关实现
| 项 | 位置 |
|---|---|
| 组件管理器 | ApproveEndComponentManager(Components/Managers/WorkFlow/) |
| 终态回调 | WorkflowComponentManagerBase.FinishAsync / CallMetaInterfaceAsync |
| 业务数据回写 | WorkflowDataService.UpdateStatusAsync |