跳到主要内容

审批流结束组件

审批流结束组件(ApproveEnd)是审批流画布的出口节点,标识一条审批流的终点。

概念说明

本文档是 平台接口 组件说明的一部分。审批流的整体概念与流程属性请参考 审批流配置。

概述​

审批流结束组件是审批流画布(场景 MetaWorkflow)的固定出口节点。当流程流转到该节点时,审批流判定为结束。新建审批流时画布会自动预置该节点。

该节点属于引擎固定节点,不可删除、不可禁用,也不能插入到连线中间。它承载结束节点的标题信息,并可配置副标题作为补充说明。

配置项​

配置项必填说明
节点名称是显示在流程图上的名称,缺省为「审批结束」
副标题否节点名称下方的补充说明文本

使用说明​

提示
  • 一条审批流通常以一个审批流结束节点收尾,允许存在多个结束节点用于不同分支的收尾
  • 结束后的终态回调接口等行为在流程属性中配置,详见 审批流配置

下一步​

属性明细​

以下内容面向技术实现与 AI 检索,说明审批流结束组件的节点元数据。

节点元数据​

审批流结束组件由 FlowCmpType.ApproveEnd 标识:

属性名类型含义取值/存储值
typestring组件类型固定为 "ApproveEnd"
Titlestring节点名称必填,为空时报「请输入流程节点名称」
SubTitlestring副标题可为空
orderstring同级排序例:"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 键读取方式含义
Titlemeta.SafeGet("Title")节点名称,为空时回退为本地化默认文案「审批结束」(ApprovalEnd)
SubTitlemeta.SafeGet("SubTitle")副标题,可为空

上下文入参:context.Result 必须为 WorkflowData,context.Param 必须为 WorkflowOperationRequest,否则分别抛 ApprovalInstanceNotFound / ApprovalRequestParamError。

执行步骤​

_VerifyAsync:

  1. 若 context.FinalResultCount == 0,抛 WorkflowLinkMissingApprovalNode(明细 MultiBranchLinkMissingApprovalNode)。

FinalResultCount 由审批类节点在 _VerifyAsync 中累加(ApproveNode、ApproveAutoHandle)以及节点 meta 中 IsFinalResult == "true" 时累加(InterfaceComponentManagerBase.VerifyFinalResultCount)。它保证每条分支都能走到至少一个审批节点。

_BuildAsync:

  1. 读取 Title、SubTitle,要求 context.Result 为 WorkflowData。
  2. 新建 WorkflowDataNode { NodeType = "ApproveEnd", NodeId, Title, SubTitle } 追加到 flowData.NodeItems,置 context.CmpResult = true。
  3. 结束节点无下游,直接返回(不调用 BuildNextAsync)。

_ExecuteAsync:

  1. 要求 context.Result 为 WorkflowData、context.Param 为 WorkflowOperationRequest。
  2. 若 flowData.Status == InProgress,则置为 Approved(其余终态保持原状)。
  3. 置 flowData.CurrentNode = 结束节点 Id。
  4. 调用基类 FinishAsync 执行终态回调。

终态回调(FinishAsync)​

FinishAsync 先按实例状态 / 操作动作确定流程级回调配置,再依次发通知、调接口:

场景通知模板自定义接口
Status = Approvedworkflow.Properties.AgreeMessageTemplateId(为空用默认模板 DefaultTemplateId_ApprovalResult)workflow.Properties.AgreeInterfaceId
Status = Rejectedworkflow.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)
上下文缺少 WorkflowDataApprovalInstanceNotFound
上下文缺少 WorkflowOperationRequestApprovalRequestParamError
流程定义不存在ApprovalWorkflowNotFound

权限与限制​

  • 结束节点是固定引擎节点,可存在多个,用于不同分支收尾。
  • _ReAssignAsync 为空实现(直接返回),保证重新分配审批人时流程可正常结束。
  • 终态判定:结束节点只在 InProgress 时把状态改为 Approved,不会覆盖上游已写入的驳回 / 撤回终态。

相关实现​

项位置
组件管理器ApproveEndComponentManager(Components/Managers/WorkFlow/)
终态回调WorkflowComponentManagerBase.FinishAsync / CallMetaInterfaceAsync
业务数据回写WorkflowDataService.UpdateStatusAsync