触发器开始组件
触发器开始组件(TriggerStart)是对象触发器画布的入口节点,标识一条对象触发器流程的起点。
本文档是 平台接口 组件说明的一部分。触发器画布与接口画布共用同一套流程引擎, 区别在于场景与可用节点白名单。
概述
对象触发器是以实体对象为触发源的一类流程,当对象数据发生变更(新增 / 更新 / 删除)时按配置触发。触发器画布(场景 MetaTrigger)的入口节点即触发器开始组件。
该节点属于引擎固定节点,不可删除、不可禁用,也不能插入到连线中间。它不包含额外业务配置,仅提供节点标识与通用属性。
触发器画布只允许白名单节点(数据操作、条件分支、消息通知等),不允许脚本类组件,服务端也会对画布进行校验。
配置项
触发器开始组件没有专属业务配置项,仅提供见 全局属性 的节点通用属性:
| 配置项 | 说明 |
|---|---|
| 节点名称 | 显示在流程图上的名称,缺省为「触发开始」 |
| 节点描述 | 节点的描述文本 |
使用说明
- 一个对象触发器只允许存在一个触发器开始节点
- 触发条件与触发时机的详细配置在对象触发器中维护
- 触发器画布不支持「输出到最终结果」开关
下一步
属性明细
以下内容面向技术实现与 AI 检索,说明触发器开始组件的节点元数据。
节点元数据
触发器开始组件由 FlowCmpType.TriggerStart 标识:
| 属性名 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | 固定为 "TriggerStart" |
order | string | 同级排序 | 例:"1" |
该节点为固定节点,不支持 IsDisabled(禁用)与 IsFinalResult(输出到最终结果)。
元数据存储示例
{
"ID": "trigger-start",
"type": "TriggerStart",
"order": "1"
}
服务端执行逻辑
触发器开始组件由 TriggerStartComponentManager 实现,继承 TriggerComponentManagerBase,组件类型为 FlowComponentTypeEnum.TriggerStart。
它本身不包含业务逻辑,职责有二:校验时定位唯一开始节点,执行时把已经注入上下文的触发载荷交给下游。触发载荷由触发器编排 TriggerComponentManagementApp.StartAsync 在进入画布前写入上下文。
节点 meta 以 Dictionary<string, string> 存储;触发器开始组件不含专属业务配置,仅 type 与 order 等通用键。
执行时机与场景
| 时机 | 入口 | 说明 |
|---|---|---|
| 保存 / 发布校验 | TriggerComponentManagementApp.VerifyFlowAsync | 校验画布全部节点在触发器白名单内,再由 _VerifyAsync 定位开始节点并校验下游 |
| 触发执行 | TriggerComponentManagementApp.StartAsync → _ExecuteAsync | 载荷注入上下文后,从开始节点进入画布 |
触发器上下文初始化(StartAsync)
执行画布前,编排层向 context 注入触发上下文:
| 上下文项 | 写入值 | 来源 |
|---|---|---|
DicParam["BizDataIds"] | payload.DataId | 变更数据 Id(复用数据组件的标准传参键) |
DicParam["MetaObjectId"] | payload.MetaObjectId | 触发对象 Id |
DicParam["MetaObjectCode"] | payload.MetaObjectCode | 触发对象编码 |
DicParam["TriggerNodeCollectorKey"] | collector.Id | 节点执行收集器标识(触发器链路标记) |
DicParam["SkipOperationPermission"] | "true" | 触发器为后台任务,跳过操作权限校验 |
DicParam["SkipMouPermission"] | "true" | 跳过 MOU 数据权限校验 |
SystemParam | payload(TriggerPayload) | 弱类型参数,组件用 context.SystemParam as TriggerPayload 读取 |
CmpResult / TransferResult | payload.After 非空时写入变更后数据快照 List<ObjectData> | 供下游数据组件取用 |
TriggerPayload 字段:DataChangeLogId(审计日志 Id)、MetaObjectCode / MetaObjectId、Action(Add / Update / Delete)、Before / After(变更前后快照,可能为 null)、DataId、TriggerDepth(触发跳数,1 为直接业务写入)。
执行步骤
_VerifyAsync:
- 查找所有
type == "TriggerStart"的节点:为 0 抛StartNodeNotFound,大于 1 抛ProcessCanNotExistMultipleStartCmp。 - 以开始节点为
CurrentNode,执行VerifyNextAsync校验下游。
_ExecuteAsync:
- 重新定位开始节点(找不到抛
StartCmpNotFound),置为context.CurrentNode。 - 触发载荷此时已由编排层注入
DicParam,开始组件不做额外处理,直接调用ExecuteNextAsync进入下游画布。
画布节点白名单
VerifyFlowAsync 通过 ComponentManagerBase.IsComponentOfBase<TriggerComponentManagerBase>(node.Type) 校验画布中每个节点,任一节点不属于触发器组件体系即抛 MetaTriggerNodeNotAllowed(带节点类型)。因此触发器画布只允许数据操作、条件分支、消息通知等由 TriggerComponentManagerBase 派生的节点,脚本类组件不在白名单内。
执行追踪与熔断
- 节点执行收集器:
TriggerComponentManagerBase.ExecuteAsync在触发器链路中记录每个实际执行到的节点的Id、Type、是否成功、耗时(毫秒)与失败信息,最终写入触发器运行日志MetaTriggerRunLog.NodeDetails。 - 触发深度:执行前把跳数写入
ChameleonContext的ChameleonTriggerExecutingDepth,执行结束后重置为"0",避免污染同批次的后续数据;下游写入会携带该跳数。 - 熔断:命中熔断缓存(
trigger_breaker_{triggerId})时静默跳过执行,不写运行日志、不更新「上次执行信息」;同一「触发器 + 数据 Id」在检测窗口内执行次数达到阈值后触发熔断并暂停一段时间。
异常与校验
| 场景 | 异常 / 提示 |
|---|---|
| 画布无开始节点 | StartNodeNotFound |
| 画布存在多个开始节点 | ProcessCanNotExistMultipleStartCmp |
| 执行时找不到开始节点 | StartCmpNotFound |
| 画布含非白名单节点 | MetaTriggerNodeNotAllowed(带节点类型) |
| 触发器版本缺失或配置无效 | MetaTriggerVersionError / MetaTriggerConfigInvalid |
权限与限制
- 一个对象触发器只允许存在一个触发器开始节点。
- 触发器为后台任务,不向调用方返回结果,执行前即跳过操作权限与 MOU 数据权限校验。
- 触发器画布不支持脚本类组件,「输出到最终结果」开关对其无意义。
相关实现
| 项 | 位置 |
|---|---|
| 组件管理器 | TriggerStartComponentManager(Components/Managers/Basic/) |
| 触发器基类 | TriggerComponentManagerBase(Components/Base/) |
| 编排 / 载荷注入 | TriggerComponentManagementApp.StartAsync |
| 载荷模型 | TriggerPayload(Chameleon.Model/ValueObject/Meta/) |