决策表
决策表是一种类似电子表格的编辑模式,用于定义规则逻辑,与现有的流程图和表单视图互为补充。
概述
决策表以紧凑的表格形式展现业务规则。每行代表一条规则,包含输入条件和输出值,便于一目了然地审查和维护大量规则。
三种编辑模式
可视化编辑器支持三种编辑模式,可无缝切换:
- 表单(Form) — 传统的表单编辑,使用字段和下拉菜单
- 流程图(Flow) — 可视化流程图,展示步骤图
- 决策表(Table) — 类似电子表格的决策表(新增)
切换模式时,数据会自动同步。
表格结构
决策表由以下部分组成:
| 组成部分 | 描述 |
|---|---|
| 输入列 | 用作条件的 Schema 字段路径(如 user.age) |
| 输出列 | 规则产生的结果字段 |
| 行(规则) | 每行一条规则,包含优先级、条件和输出值 |
| 命中策略 | 匹配方式:first、all 或 collect |
单元格类型
每个输入单元格可使用五种条件类型之一:
| 类型 | 示例 | 描述 |
|---|---|---|
exact | "premium" | 精确值匹配 |
range | [18, 65] | 数值范围(含两端) |
in | ["A", "B", "C"] | 值在集合中 |
any | * | 匹配任意值(通配符) |
expression | age > 18 && vip | 自由 Ordo 表达式 |
使用方法
创建决策表
- 在可视化编辑器中打开或创建规则集
- 使用工具栏图标或状态栏切换到决策表模式
- 使用工具栏添加输入/输出列
- 添加行并填写条件和输出值
列操作
- 添加输入列 — 选择 Schema 字段路径作为新输入条件
- 添加输出列 — 定义新的输出字段
- 从 Schema 导入 — 从规则集的 Schema 定义批量导入列
- 删除列 — 点击列标题菜单删除
行操作
- 添加行 — 追加新规则行
- 复制行 — 复制现有行
- 删除行 — 删除行
- 排序 — 拖拽行以改变优先级顺序
命中策略
| 策略 | 行为 |
|---|---|
first | 返回第一个匹配行的输出(默认) |
all | 返回所有匹配行的输出 |
collect | 将所有匹配行的输出收集为列表 |
TIP
目前仅 first 命中策略支持与流程图的双向转换。
模式间转换
决策表支持与步骤图模型的双向转换:
- 表格 → 流程图:
compileTableToSteps()将表格转为决策步骤及其分支指向的终止步骤 - 流程图 → 表格:
decompileStepsToTable()分析步骤图并提取为表格形式
切换表格和流程图模式时,转换自动进行。
转换约束
自动反编译适用于以下模式的规则集:
- 以单个决策步骤为入口
- 每个分支指向一个终止步骤
- 条件使用标准比较运算符
包含多个链式决策或动作步骤的复杂步骤图将回退到流程图模式手动编辑。
导出
使用工具栏中的导出 JSON 按钮将决策表下载为独立 JSON 文件。
编程 API
typescript
import {
type DecisionTable,
createEmptyTable,
createInputColumn,
createOutputColumn,
createEmptyRow,
compileTableToSteps,
decompileStepsToTable,
} from '@ordo-engine/editor-core';
// 以编程方式创建表格
const table = createEmptyTable();
table.inputColumns.push(createInputColumn('user.age', 'number'));
table.outputColumns.push(createOutputColumn('discount', 'number'));
// 转换为步骤以供执行
const steps = compileTableToSteps(table, 'my-rule');
// 将步骤转回表格
const recovered = decompileStepsToTable(steps);