Skip to content

决策表

决策表用 key 定位一组输入列、输出列和规则行,发布后生成不可变快照供运行时求值。编辑态可以随时保存、测试、仿真和体检;业务消费方只读取发布快照。

数据结构

字段说明
key规则资产唯一键,字母开头,支持字母、数字、下划线、短横线;更新时不可修改
name / description展示名与说明
categoryId可关联工作流分类,用于后台归类
statusdraft / published / disabled
hitPolicyfirst / unique / priority / collect / any
inputs输入列数组:keylabelexprtype、可选 dictCode
outputs输出列数组:keylabeltype、可选 defaultisExpr
rules规则行数组:idwhenthen、可选 prioritylabel
settingscollectAggregatefallbackToDefaults
version / publishedAt发布版本与发布时间
gray灰度配置:grayPercentgrayDimensiongrayVersion
dirty编辑态与最新发布快照不一致
reviewStatus决策表发布审批状态,目前使用 pending

输入列的 expr 和输出列的 = 表达式 使用工作流安全表达式引擎,例如 form.amount= form.amount * 0.8

单元格 DSL

rules[].when[i]inputs[i] 一一对应,解析逻辑由 packages\shared\src\rules\cell.ts 统一提供。

写法语义适用类型
空、-*通配,恒真全部
> 100>=10!= 3比较;= / == / === 等价,!= / !== 等价number / date;string / boolean 仅支持等于与不等于
10-20数值闭区间number
[10..20)(0..5]FEEL 风格开闭区间number / date
in a,b,c集合命中string / number / boolean / date
not in a,b集合排除string / number / boolean / date
其它字面量按列类型归一化后等值匹配全部

date 值按 YYYY-MM-DDYYYY-MM-DD HH:mm:ss 解析后比较。

命中策略

策略行为
first取第一条命中行输出
unique必须唯一命中;多行命中返回 matched=falsereason=unique_conflict
priority多行命中时按 priority 降序取最高优先级
collect收集所有命中行输出,并按 settings.collectAggregate 聚合
any允许多行命中,但所有命中行输出必须一致;不一致返回 reason=any_conflict

collectAggregate 可取:list(默认)、summinmaxcountdistinct。启用 fallbackToDefaults 时,未命中仍返回输出列默认值,matched=falseusedFallback=true

生命周期

发布会写入 rule_decision_table_versions 快照,并清理运行时缓存。运行时按发布快照执行;后台测试按编辑态执行。

发布门禁与审批

发布前执行以下门禁:

  1. 至少一个输入列、一个输出列、一条规则行。
  2. 输入列表达式语法有效。
  3. 条件单元格 DSL 语法有效。
  4. = 表达式 输出语法有效。
  5. 测试用例全部通过。
  6. 存在测试用例时,规则行覆盖率必须为 100%。

系统配置 rule_publish_approvaltrue 时,直接发布接口会拒绝发布,需要先申请发布,再由非申请人审批。审批通过后执行发布,驳回会清空待审批状态并记录意见。待审批期间修改快照内容会使申请失效。

灰度发布

POST /api/rules/decision-tables/{id}/publish 可携带:

json
{
  "grayPercent": 20,
  "grayDimension": "form.userId"
}
  • grayPercent 范围为 1–99。
  • grayDimension 是可选安全表达式;为空时使用整个输入包作为分桶依据。
  • 分桶使用 FNV-1a:bucket = fnv1a(subject) % 100bucket < grayPercent 走新版本,否则走上一版本。
  • 首次发布不能灰度,因为没有上一版本承接灰度外流量。
  • POST /api/rules/decision-tables/{id}/gray 使用 complete 转正,使用 cancel 放弃灰度并以前一版本内容前滚为新版本。

测试、仿真与观测

能力API说明
编辑态测试POST /api/rules/decision-tables/{id}/test使用输入 JSON 直接求值,返回命中行、输出、原因
按 key 求值POST /api/rules/decision-tables/evaluate后台手动求值,caller 为 admin.evaluate,source 为 manual
测试用例/api/rules/decision-tables/{id}/cases*维护输入与期望输出,可批量运行并计算覆盖率
批量仿真POST /api/rules/decision-tables/{id}/simulate每行一条输入,最多 200 行,按编辑态汇总命中率与行命中分布
命中分析GET /api/rules/decision-tables/{id}/stats?days=30基于执行记录统计总量、命中、未命中、日期趋势、行命中与来源分布
影子对比POST /api/rules/decision-tables/{id}/shadow-run重放最近执行输入到编辑态,比较线上输出与编辑态输出差异,最多 500 条
版本对比GET /api/rules/decision-tables/{id}/diff?from=1&to=00 表示当前编辑态

删除保护

删除决策表前会进行 where-used 分析:

  • 工作流网关节点的 decisionRuleKeydecisionRefKind=table
  • 内置 coupon_eligibility 消费方。
  • 内置 payment_risk 消费方。

存在引用时拒绝删除;停用不受引用保护限制,可作为运维开关。

管理 API

方法路径说明权限
GET/api/rules/decision-tables分页列表,支持 keywordstatusrule:table:list
GET/api/rules/decision-tables/{id}详情rule:table:list
POST/api/rules/decision-tables创建rule:table:create
PUT/api/rules/decision-tables/{id}更新,支持 expectedUpdatedAt 乐观锁rule:table:update
DELETE/api/rules/decision-tables/{id}删除rule:table:delete
DELETE/api/rules/decision-tables/batch批量删除rule:table:delete
POST/api/rules/decision-tables/{id}/publish发布,可选灰度rule:table:publish
POST/api/rules/decision-tables/{id}/toggle启用 / 停用rule:table:publish
POST/api/rules/decision-tables/{id}/gray灰度转正 / 放弃rule:table:publish
POST/api/rules/decision-tables/{id}/submit-review申请发布rule:table:publish
POST/api/rules/decision-tables/{id}/review审批发布rule:table:approve
POST/api/rules/decision-tables/{id}/test编辑态测试求值rule:table:evaluate
POST/api/rules/decision-tables/evaluate按 key 手动求值rule:table:evaluate
GET/api/rules/decision-tables/{id}/versions版本列表rule:table:list
GET/api/rules/decision-tables/{id}/diff版本对比rule:table:list
POST/api/rules/decision-tables/{id}/rollback/{version}回滚到历史版本rule:table:update
GET/api/rules/decision-tables/{id}/usages引用分析rule:table:list
GET/api/rules/decision-tables/{id}/stats命中分析rule:table:list
POST/api/rules/decision-tables/{id}/shadow-run影子对比rule:table:evaluate
POST/api/rules/decision-tables/{id}/simulate批量仿真rule:table:evaluate
GET/api/rules/decision-tables/{id}/cases测试用例列表rule:table:list
POST/api/rules/decision-tables/{id}/cases新增测试用例rule:table:update
PUT/api/rules/decision-tables/{id}/cases/{caseId}更新测试用例rule:table:update
DELETE/api/rules/decision-tables/{id}/cases/{caseId}删除测试用例rule:table:update
POST/api/rules/decision-tables/{id}/cases/run批量运行用例rule:table:evaluate

Built with VitePress for local documentation preview.