多路分支 组件
多路分支组件(Switch)用于按脚本计算结果进行多路匹配,类似编程中的 switch / case。
概述
多路分支通过一段脚本产生一个结果值,再由连出的匹配分支判断该值是否等于各自配置的匹配值,命中则执行对应分支。
脚本使用 C# 语法,保存时会先做语法检查(/api/CSharpScript/SyntaxChecking),检查通过后才写入。
配置项
| 配置项 | 说明 |
|---|---|
| 脚本 | 计算分支值的脚本,缺省为系统脚本模板,保存前会做语法检查 |
| 输出到最终结果 | 开启后该组件结果作为接口返回值 |
执行流程
使用场景
- 状态值编排到不同处理路径
- 按类型分类处理
- 多条件路由
下一步
属性明细
以下内容面向技术实现与 AI 检索,说明多路分支组件的节点元数据。
节点元数据
多路分支组件由 FlowCmpType.Switch 标识:
| 属性名 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | 固定为 "Switch" |
Script | string | 分支计算脚本 | C# 脚本,缺省为系统脚本模板 |
IsFinalResult | string(bool) | 是否输出到最终结果 | "true" / "false" |
order | string | 同级排序 | 例:"2" |
元数据存储示例
{
"ID": "switch1",
"type": "Switch",
"Script": "return context.Request.List[0][\"Status\"];",
"IsFinalResult": "false",
"order": "2"
}
相关接口
| 接口 | 说明 |
|---|---|
POST /api/CSharpScript/SyntaxChecking | 脚本保存前的语法检查,Type 为 CSharp |
服务端执行逻辑
多路分支由 SwitchComponentManager(继承 InterfaceComponentManagerBase)实现。本节说明脚本如何执行、结果如何传递给匹配分支。
元数据均为 字符串
节点元数据以 Dictionary<string, string> 存储,Script 是脚本源码字符串,IsFinalResult 是字符串布尔;服务端通过 meta.SafeGet("键名") 读取。
执行时机与场景
| 时机 | 说明 |
|---|---|
| 保存/发布校验 | _VerifyAsync 先校验脚本,再 VerifyNextAsync |
| 流程执行到多路分支 | _ExecuteAsync 执行脚本,把结果写入 CmpResult,再推进全部下游 |
输入参数(meta 键)
| meta 键 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
Script | string | 分支计算脚本 | C# 脚本源码,缺省为系统脚本模板 |
IsFinalResult | string(bool) | 是否输出到最终结果 | "true" / "false",缺省视为 false |
脚本执行环境
脚本通过 ICSharpScriptEngineService(实现类 CSharpScriptEngineService)执行:
| 项 | 值 |
|---|---|
Language | CSharp |
ClassFullName | ChameleonCSharpScript |
FunctionName | 脚本含 async Task<object> ExecuteAsync 时为 ExecuteAsync,否则为 Execute |
Parameters | [context, sdk](ComponentContext 与 ChameleonSDK) |
| 异步执行 | 异步脚本走 ExecuteAsync,同步脚本走 Execute |
| 安全校验 | 校验前先执行 InvalidCSharpScriptVerifyHelper.VerifyDangerousCode 拦截危险代码 |
执行步骤
- 读取
meta.SafeGet("Script")。 - 调用
cSharpScriptEngineService.ExecuteInterfaceComponentAsync(context, scriptText, ComponentType)得到结果(scriptText为空时返回null)。 context.CmpResult = result;把脚本结果写入上下文,供下游匹配分支读取。- 若
IsFinalResult == true,同时context.Result = result;。 - 调用
ExecuteNextAsync(context)推进全部下游。
分支路由规则
多路分支本身不做 匹配判断,它只负责计算并写入 CmpResult;匹配由连出的 SwitchCase 各自完成:
ExecuteNextAsync会执行全部下游节点(按order降序),因此每个SwitchCase都会被调度一次。- 只有
CmpResult与其CaseValue相等的SwitchCase才会继续推进;不等的SwitchCase返回上下文、终止自身分支。 - 边的端口信息在服务端被丢弃(只保留
source/target),分支完全由脚本结果与CaseValue的等值比较决定。
输出与上下文
| 上下文属性 | 多路分支的处理 |
|---|---|
CmpResult | 写入脚本执行结果,供下游 SwitchCase 比较 |
Result | 仅当 IsFinalResult == true 时写入脚本结果 |
PreviousCmpType | 推进下游时被置为 "Switch",SwitchCase 依赖该校验 |
异常与校验
| 场景 | 说明 |
|---|---|
| 脚本语法错误 | _VerifyAsync 抛 ComponentValidationFailed(MoreMessage 为编译错误) |
| 危险代码 | VerifyDangerousCode 拦截,校验失 败 |
| 脚本执行异常 | 抛 ComponentExecutionFailed,并记录 ComponentExecutionFailedWithDetails 日志 |