Skip to main content

多路分支组件

多路分支组件(Switch)用于按脚本计算结果进行多路匹配,类似编程中的 switch / case。

概述​

多路分支通过一段脚本产生一个结果值,再由连出的匹配分支判断该值是否等于各自配置的匹配值,命中则执行对应分支。

脚本使用 C# 语法,保存时会先做语法检查(/api/CSharpScript/SyntaxChecking),检查通过后才写入。

配置项​

配置项说明
脚本计算分支值的脚本,缺省为系统脚本模板,保存前会做语法检查
输出到最终结果开启后该组件结果作为接口返回值

执行流程​

使用场景​

  • 状态值编排到不同处理路径
  • 按类型分类处理
  • 多条件路由

下一步​

属性明细​

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

节点元数据​

多路分支组件由 FlowCmpType.Switch 标识:

属性名类型含义取值/存储值
typestring组件类型固定为 "Switch"
Scriptstring分支计算脚本C# 脚本,缺省为系统脚本模板
IsFinalResultstring(bool)是否输出到最终结果"true" / "false"
orderstring同级排序例:"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 键类型含义取值/存储值
Scriptstring分支计算脚本C# 脚本源码,缺省为系统脚本模板
IsFinalResultstring(bool)是否输出到最终结果"true" / "false",缺省视为 false

脚本执行环境​

脚本通过 ICSharpScriptEngineService(实现类 CSharpScriptEngineService)执行:

项值
LanguageCSharp
ClassFullNameChameleonCSharpScript
FunctionName脚本含 async Task<object> ExecuteAsync 时为 ExecuteAsync,否则为 Execute
Parameters[context, sdk](ComponentContext 与 ChameleonSDK)
异步执行异步脚本走 ExecuteAsync,同步脚本走 Execute
安全校验校验前先执行 InvalidCSharpScriptVerifyHelper.VerifyDangerousCode 拦截危险代码

执行步骤​

  1. 读取 meta.SafeGet("Script")。
  2. 调用 cSharpScriptEngineService.ExecuteInterfaceComponentAsync(context, scriptText, ComponentType) 得到结果(scriptText 为空时返回 null)。
  3. context.CmpResult = result; 把脚本结果写入上下文,供下游匹配分支读取。
  4. 若 IsFinalResult == true,同时 context.Result = result;。
  5. 调用 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 日志