跳到主要内容

开始组件

开始组件(Start)是平台接口流程图的入口节点,每个流程必须且仅有一个开始组件,用于接收调用方传入的参数并初始化执行上下文。

概述​

调用事件触发接口后,流程从开始组件启动。开始组件本身不含业务逻辑,它负责把请求参数(请求 Body、URL 查询串)与当前登录信息装载进上下文,供后续组件引用。开始节点属于引擎固定节点,不可禁用、不可删除,也不能插入到连线中间。

在属性面板中只显示通用属性(ID、名称、描述、排序),没有额外的业务配置项。

配置项​

配置项说明
排序同一层级节点的执行顺序,固定为入口节点,通常为 0
禁用当前节点固定节点不支持禁用,不显示该开关

执行流程​

上下文初始化​

开始组件把请求数据初始化到组件上下文,后续组件可通过 组件上下文 引用:

上下文数据说明
Request通用请求模型(CommonRequestModel),请求 Body 中的 list 即 Request.List(List<ObjectData>)
TransferResult链路通用交互模型(TransferModel),由请求体反序列化而来,贯穿整条链路
URL 查询参数接口测试/调用时拼接的查询串参数,下游通过 ChameleonContext.Current.GetQuery() 读取
当前登录用户登录人身份、组织、角色信息,通过 ChameleonContext.Current.UserId、TenantId 等读取
系统变量时间、租户等系统级变量

使用场景​

  • 表单按钮、视图按钮触发的业务接口入口
  • 由 api/Biz/{接口ID} 直接调用的接口入口
  • 被对象触发器、审批流等场景复用的逻辑起点

下一步​

属性明细​

以下内容面向技术实现与 AI 检索,说明开始组件的节点元数据。

节点元数据​

开始组件由 FlowCmpType.Start 标识,GetNodeMeta 返回的 meta 只包含类型:

属性名类型含义取值/存储值
typestring组件类型固定为 "Start"
orderstring同级排序例:"0"
IDstring节点标识画布生成

元数据存储示例​

{
"ID": "start1",
"type": "Start",
"order": "0"
}

引擎约束​

约束说明
固定节点FlowCmpFixedTypes 包含 Start,不可禁用、不可插入边中间
初始节点接口画布以 initialCmpTypes: [Start, End] 初始化,保证流程有入口与出口

服务端执行逻辑​

开始组件由 StartComponentManager(继承 InterfaceComponentManagerBase)实现,是接口链路的唯一起点。本节说明引擎进入开始节点后如何初始化上下文并推进下游。

元数据均为字符串

节点元数据以 Dictionary<string, string> 存储,meta 中所有值都是字符串(布尔存为 "true" / "false",数字存为 "0" 等)。服务端读取时通过 meta.SafeGet("键名") 获取,再由代码做类型转换。

执行时机与场景​

时机说明
接口被调用引擎从开始组件进入执行(_ExecuteAsync),装载请求上下文后推进下游
保存/发布校验_VerifyAsync 校验流程中存在且仅存在一个开始节点,再校验下游

开始组件是 FlowCmpFixedTypes 成员,IsDisabled 对其无效;引擎不会跳过开始节点。

输入参数(meta 键)​

开始组件没有业务输入参数,meta 仅含通用键:

meta 键类型含义取值/存储值
typestring组件类型"Start"
orderstring(数字)同级排序如 "0"
IDstring节点标识画布生成

执行步骤​

StartComponentManager._ExecuteAsync 的执行顺序如下:

  1. 在逻辑图节点中查找第一个 Type == "Start" 的节点作为当前节点;找不到则抛 StartCmpNotFound。
  2. 读取请求体:context.TransferResult = ChameleonContext.Current.GetBody<TransferModel>();反序列化为空时退化为 new TransferModel()。
  3. 合并请求参数:context.Request = AttachRequestProperties(context.Request, context.TransferResult)。
  4. 异常兜底:捕获任意异常后保证 TransferResult ??= new TransferModel()、Request ??= TransferResult,即参数解析失败也不阻断流程。
  5. 调用 ExecuteNextAsync(context) 推进下游。

请求上下文初始化​

AttachRequestProperties 负责把请求体与既有 Request 合并,规则为「以 Request 为准,缺失字段用请求体补齐」:

处理说明
request ??= httpRequestTransferResult 同时是 CommonRequestModel,可直接作为请求模型使用
逐字段补齐Label、Value、DataSource、PageUrl 为空时用请求体中的值填充
引用补齐Extend ??= httpRequest.Extend、List ??= httpRequest.List

下游推进规则​

ExecuteNextAsync(定义在 InterfaceComponentManagerBase)以「关系边 + 排序」驱动流程:

  1. 通过 GetNextList 取 Relations 中 Source == 当前节点.Id 的所有 Target 节点;无下游则返回空;有下游 id 但节点缺失则抛 ProcessIncompleteNotFoundDownstream。
  2. 下游节点按 order 降序排列(LogicGraphicalNode.Order 由 meta.order 解析为整数,缺省 0)。
  3. 逐个 Clone() 上下文,写入 CurrentNode 与 PreviousCmpType = "Start" 后,递归调用下游组件的 ExecuteAsync。
  4. 取第一个 Result != null 的返回上下文作为最终结果上下文。

输出与上下文​

上下文属性开始组件的处理
Request / TransferResult由请求体初始化并互相补齐
DicParam初始化后由后续组件填充;系统内置键(如 MetaObjectId、BizDataIds)在对应组件执行时写入
CmpResult / Result开始组件不写入,留给下游组件
FinalResultCount在 VerifyAsync 中,节点 IsFinalResult == "true" 时累加

异常与校验​

场景触发点异常 / 提示
流程无开始节点_VerifyAsyncStartNodeNotFound
流程存在多个开始节点_VerifyAsyncProcessCanNotExistMultipleStartCmp
执行时找不到开始节点_ExecuteAsyncStartCmpNotFound
下游 id 指向不存在节点GetNextListProcessIncompleteNotFoundDownstream
递归层级超过 100VerifyAndRecursionDeepProcessCycleOrNodeMoreThanLimit