开始组件
开始组件(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 只包含类型:
| 属性名 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | 固定为 "Start" |
order | string | 同级排序 | 例:"0" |
ID | string | 节点标识 | 画布生成 |
元数据存储示例
{
"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 键 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | "Start" |
order | string(数字) | 同级排序 | 如 "0" |
ID | string | 节点标识 | 画布生成 |
执行步骤
StartComponentManager._ExecuteAsync 的执行顺序如下:
- 在逻辑图节点中查找第一个
Type == "Start"的节点作为当前节点;找不到则抛StartCmpNotFound。 - 读取请求体:
context.TransferResult = ChameleonContext.Current.GetBody<TransferModel>();反序列化为空时退化为new TransferModel()。 - 合并请求参数:
context.Request = AttachRequestProperties(context.Request, context.TransferResult)。 - 异常兜底:捕获任意异常后保证
TransferResult ??= new TransferModel()、Request ??= TransferResult,即参数解析失败也不阻断流程。 - 调用
ExecuteNextAsync(context)推进下游。
请求上下文初始化
AttachRequestProperties 负责把请求体与既有 Request 合并,规则为「以 Request 为准,缺失字段用请求体补齐」:
| 处理 | 说明 |
|---|---|
request ??= httpRequest | TransferResult 同时是 CommonRequestModel,可直接作为请求模型使用 |
| 逐字段补齐 | Label、Value、DataSource、PageUrl 为空时用请求体中的值填充 |
| 引 用补齐 | Extend ??= httpRequest.Extend、List ??= httpRequest.List |
下游推进规则
ExecuteNextAsync(定义在 InterfaceComponentManagerBase)以「关系边 + 排序」驱动流程:
- 通过
GetNextList取Relations中Source == 当前节点.Id的所有Target节点;无下游则返回空;有下游 id 但节点缺失则抛ProcessIncompleteNotFoundDownstream。 - 下游节点按
order降序排列(LogicGraphicalNode.Order由meta.order解析为整数,缺省 0)。 - 逐个
Clone()上下文,写入CurrentNode与PreviousCmpType = "Start"后,递归调用下游组件的ExecuteAsync。 - 取第一个
Result != null的返回上下文作为最终结果上下文。
输出与上下文
| 上下文属性 | 开始组件的处理 |
|---|---|
Request / TransferResult | 由请求体初始化并互相补齐 |
DicParam | 初始化后由后续组件填充;系统内置键(如 MetaObjectId、BizDataIds)在对应组件执行时写入 |
CmpResult / Result | 开始组件不写入,留给下游组件 |
FinalResultCount | 在 VerifyAsync 中,节点 IsFinalResult == "true" 时累加 |
异常与校验
| 场景 | 触发点 | 异常 / 提示 |
|---|---|---|
| 流程无开始节点 | _VerifyAsync | StartNodeNotFound |
| 流程存在多个开始节点 | _VerifyAsync | ProcessCanNotExistMultipleStartCmp |
| 执行时找不到开始节点 | _ExecuteAsync | StartCmpNotFound |
| 下游 id 指向不存在节点 | GetNextList | ProcessIncompleteNotFoundDownstream |
| 递归层级超过 100 | VerifyAndRecursionDeep | ProcessCycleOrNodeMoreThanLimit |