可视化工作流编排参数配置完整方案设计文档

​​​一、背景及需求分析

1. 背景

在复杂的工作流程中,后续程序需要动态构造输入参数,这些参数源自多个前序程序的 JSON 数据输出。为了增强系统的灵活性和可扩展性,配置文件需要支持以下功能:

  • 灵活映射前序程序的 JSON 数据。
  • 支持简单映射、条件逻辑、循环体、字段合并等。
  • 参数可直接使用常量或动态值作为输入。

2. 核心需求

  • 简单参数映射: 从单一来源提取数据。
  • 复杂逻辑支持: 条件逻辑 (if-then-else)、循环体、字段合并等。
  • 多来源支持: 从多个前序程序中提取数据,并支持合并策略(如拼接、去重、优先级)。
  • 常量支持: 参数可以直接为固定值,跳过数据映射逻辑。

二、设计目标

  1. 通用性: 提供统一的 JSON 配置结构,覆盖多种场景。
  2. 灵活性: 支持动态逻辑(条件、循环、多来源合并)。
  3. 易读性: 配置文件结构清晰,用户容易理解和使用。
  4. 可扩展性: 配置结构支持新增逻辑类型,无需大规模修改现有代码。

三、架构概览

bash 复制代码
+----------------+          +----------------+           +----------------+  
| 前序程序输出    | ------> | 参数映射服务     | -------> | 后序程序输入参数    |  
| JSON 数据      |          | (JSON 配置驱动) |           | 动态生成          |  
+----------------+          +----------------+           +----------------+  

主要组件:  
1. **前序程序输出:** 提供 JSON 数据(多个来源)。  
2. **参数映射服务:** 基于 JSON 配置解析前序数据,生成后续输入。  
3. **参数配置文件:** JSON 格式,定义参数映射规则及逻辑。  
4. **后序程序输入:** 动态生成符合后续程序要求的参数。

四、配置结构设计

1. 参数类

每个参数由参数类描述,包含以下字段:

表格

字段名称 类型 是否必填 说明
name 字符串 必填 参数名称,用于后续程序的输入标识。
value 对象 必填 参数的值对象,由值对象基类及其子类定义。
description 字符串 可选 参数描述信息,便于理解参数用途。

2. 值对象基类及子类

值对象基类

所有值对象从基类继承,区分逻辑通过 type 字段。

表格

字段名称 类型 是否必填 说明
type 字符串 必填 值对象类型(如 constant, jmespath, multiSource, loop, conditional)。

值对象子类设计
1. 常量值子类 (ConstantValue)

返回固定值。

表格

字段名称 类型 是否必填 说明
type 字符串 必填 固定为 constant
value 任意类型 必填 常量值,直接返回固定值。

示例:

{ "type": "constant", "value": 42 }


2. 单一来源值子类 (SingleSourceValue)

使用 JMESPath 从单一来源提取值。

字段名称 类型 是否必填 说明
type 字符串 必填 固定为 jmespath
jmespath 字符串 必填 包含来源的 JMESPath 表达式(如 programA.outputA.key)。

示例: { "type": "jmespath", "jmespath": "programA.outputA.simpleKey" }


3. 多来源值子类 (MultiSourceValue)

支持从多个来源合并数据,并按指定策略处理。

字段名称 类型 是否必填 说明
type 字符串 必填 固定为 multiSource
sources 对象 必填 多来源数据的键值对,键为前序程序名称,值为 JMESPath 表达式。
mergeStrategy 字符串 可选 合并策略(如 concat, unique, priority 等)。

示例: { "type": "multiSource", "sources": { "programA": "outputA.arrayA", "programB": "outputB.arrayB" }, "mergeStrategy": "concat" }


4. 循环体值子类 (LoopValue)

处理数组数据,支持动态字段映射。

表格

字段名称 类型 是否必填 说明
type 字符串 必填 固定为 loop
jmespath 字符串 必填 包含来源的 JMESPath 表达式,提取数组元素及字段。
mappings 对象 可选 动态映射规则,键为目标字段名,值为提取规则(支持默认值)。

示例: { "type": "loop", "jmespath": "programB.outputB.items", "mappings": { "id": "id", "value": "value || 'defaultValue'", "optionalField": "optionalField || 'defaultOptional'" } }


5. 条件值子类 (ConditionalValue)

根据条件逻辑动态返回值,支持默认值。

表格

字段名称 类型 是否必填 说明
type 字符串 必填 固定为 conditional
jmespath 字符串 必填 数据来源及条件逻辑使用的 JMESPath 表达式。
conditions 数组 必填 条件逻辑数组,每个条件包含 ifthen 值对象。
else 对象 可选 默认值,当所有条件不满足时返回的值。

示例:

{ "type": "conditional", "jmespath": "programA.outputA", "conditions": [ { "if": "status == 'success'", "then": { "type": "jmespath", "jmespath": "successMessage" } }, { "if": "status == 'error'", "then": { "type": "jmespath", "jmespath": "errorMessage" } } ], "else": { "type": "constant", "value": "defaultMessage" } }


五、完整配置示例

javascript 复制代码
{  
  "parameters": [  
    {  
      "name": "constantParam",  
      "value": {  
        "type": "constant",  
        "value": 42  
      },  
      "description": "A constant parameter with a fixed value"  
    },  
    {  
      "name": "simpleParam",  
      "value": {  
        "type": "jmespath",  
        "jmespath": "programA.outputA.simpleKey"  
      },  
      "description": "A simple parameter mapped from programA"  
    },  
    {  
      "name": "combinedParam",  
      "value": {  
        "type": "multiSource",  
        "sources": {  
          "programA": "outputA.arrayA",  
          "programB": "outputB.arrayB"  
        },  
        "mergeStrategy": "concat"  
      },  
      "description": "A combined parameter concatenating arrays from two sources"  
    },  
    {  
      "name": "complexArrayParam",  
      "value": {  
        "type": "loop",  
        "jmespath": "programB.outputB.items",  
        "mappings": {  
          "id": "id",  
          "value": "value || 'defaultValue'",  
          "optionalField": "optionalField || 'defaultOptional'"  
        }  
      },  
      "description": "An array parameter with dynamic attributes and default values"  
    },  
    {  
      "name": "conditionalParam",  
      "value": {  
        "type": "conditional",  
        "jmespath": "programA.outputA",  
        "conditions": [  
          {  
            "if": "status == 'success'",  
            "then": {  
              "type": "jmespath",  
              "jmespath": "successMessage"  
            }  
          },  
          {  
            "if": "status == 'error'",  
            "then": {  
              "type": "jmespath",  
              "jmespath": "errorMessage"  
            }  
          }  
        ],  
        "else": {  
          "type": "constant",  
          "value": "defaultMessage"  
        }  
      },  
      "description": "A conditional parameter with fallback value"  
    }  
  ]  
}

六、运行逻辑解析

  1. 常量参数:

    无需数据来源,直接返回固定值。

  2. 单一来源:

    根据 jmespath 表达式提取对应字段值。

  3. 多来源合并:

    遍历 sources,提取数据并按 mergeStrategy 合并。

  4. 循环体:

    遍历数组元素,按 mappings 提取字段值,支持默认值。

  5. 条件逻辑:

    conditions 顺序匹配条件,返回第一个满足条件的值;若无匹配,则返回 else


七、设计亮点

  1. 去冗余设计:

    source 合并到 jmespath,结构更简洁。参数类只负责元信息(如名称、描述),具体值交由值对象处理。

  2. 灵活性:

    支持常量、单一来源、多来源、循环体、条件逻辑等多种复杂场景。

  3. 高可读性:
    jmespath 表达式直观显示来源和提取规则,易于理解和维护。

  4. 扩展性:

    值对象子类支持进一步扩展,例如动态计算值、复杂逻辑等。

  5. 直观配置:

    JSON 配置清晰、简洁,便于前端用户或配置生成工具使用。


八、扩展方向

  1. 支持动态计算:

    增加对动态生成值的支持,例如通过公式计算。

  2. 前端配置工具:

    提供可视化工具,动态生成 JSON 配置,支持实时校验。

  3. 运行时校验:

    针对 jmespath 表达式的校验,确保数据提取逻辑的正确性。


相关推荐
永恒星4 个月前
行为树详解(4)——节点参数配置化
行为树·参数配置
Sarapines Programmer1 年前
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
数据库·oracle·性能优化·体系结构·存储结构·oracle数据库·参数配置
寸_铁1 年前
【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案
后端·rpc·golang·goland·goctl·参数配置