关于 camunda-dmn
用于为 Camunda 8.8+ 编写和验证可执行 DMN 1.3 决策的 Skill,涵盖决策表、FEEL 表达式、BPMN 连接、静态检查与执行验证。
主要功能
- 01编写 DMN 1.3 决策
- 02配置决策表与命中策略
- 03在决策需求图中关联决策
- 04将决策连接到 BPMN 业务规则任务
- 05通过检查与执行验证决策
适用场景
- 01定义可执行业务规则
- 02使用 dmnlint 检查 DMN 结构
- 03通过 BPMN 测试决策行为
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ camunda/ skills --skill camunda-dmn安装后在 Claude Code 中输入/camunda-dmn确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
portability.jsonreferences/decision-tables.mddmnlint.mdfeel-in-dmn.mdtesting-decisions.md详细介绍
Camunda DMN
为 Camunda 8.8+ 编写可执行的 DMN 1.3 决策。.dmn 文件包含一个决策需求图,其中有一个或多个决策;每个决策都是决策表或字面表达式。BPMN 业务规则任务通过 ID 引用决策,并将结果作为流程变量返回。
交叉引用
- camunda-bpmn:业务规则任务连线(
<zeebe:calledDecision decisionId="..." resultVariable="..."/>) - camunda-feel:输入表达式、输出条目和字面表达式中的 FEEL 语法
- camunda-process-test:首选的行为验证方式——CPT 通过调用决策的 BPMN 流程来测试该决策
- camunda-process-mgmt:备用的行为验证方式——在集群上部署并运行(优先使用本地 c8run)
编写
DMN 文件声明 DMN 1.3 命名空间,并包含一个或多个 <decision> 元素:
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/"
id="DinnerDecisions" name="Dinner Decisions"
namespace="http://camunda.org/schema/1.0/dmn">
<decision id="dish" name="Dish">
<decisionTable id="decisionTable_dish" hitPolicy="UNIQUE">
</decisionTable>
</decision>
</definitions>
默认命名空间和 namespace="http://camunda.org/schema/1.0/dmn" 属性都是必需的。
决策包含 <decisionTable>(输入 / 输出 / 规则 + 命中策略)或 <literalExpression>(单个 FEEL 表达式——适用于组合上游决策)。包含多个决策的文件通过 <informationRequirement><requiredDecision href="#upstream"/></informationRequirement> 连接决策;Camunda 只会评估 BPMN 所引用的根决策,并自动拉取所需的决策。
完整的输入 / 输出子句 XML、一元测试语法、各命中策略的示例、COLLECT 聚合器、类型表和 DRG 连接方式,请参阅 references/decision-tables.md。
ID 和命名规则
- 决策
id、输出name、决策表列名:只能使用字母数字字符和_。不能有空格、-(它是 FEEL 运算符)或其他特殊字符。违反规则会导致 BPMN 引用静默失效——运行时解析出的值为null。 name属性(Decision、InputData、BusinessKnowledgeModel、KnowledgeSource、DecisionService):可以是任意字符串。dmnlint会标记缺少name的情况——即使id已表达其含义,也要设置name。- 字符串输出条目必须加引号。
"HIGH"是字符串字面量;不加引号的HIGH会被解析为变量引用并求值为null——不会出现解析错误,也不会有 lint 警告。
命中策略(Camunda 支持的策略)
在 decisionTable 元素上设置(默认值为 UNIQUE)。Camunda 8 支持五种策略;DMN 规范定义了更多策略——不支持 PRIORITY 和 OUTPUT ORDER。
| 命中策略 | 结果 | 行为 |
|---|---|---|
UNIQUE | 单个 | 必须恰好匹配一条规则;匹配多条会导致运行时错误。 |
ANY | 单个 | 可以匹配多条规则,但它们必须全部产生相同的输出;否则会导致运行时错误。 |
FIRST | 单个 | 从上到下检查;首条匹配规则生效。 |
RULE ORDER | 列表 | 按规则顺序返回所有匹配规则的输出。 |
COLLECT | 列表 / 标量 | 按任意顺序返回所有匹配项。使用 aggregation="SUM" | "MIN" | "MAX" | "COUNT" 时,会合并为单个值。 |
默认使用 UNIQUE。对于先严格后宽松的语义(例如“先检查阻止列表,再检查接受规则”),使用 FIRST。当列表输出确实是目标时,使用 COLLECT。各策略的示例请参阅 references/decision-tables.md。
配置 BPMN 侧
<bpmn:businessRuleTask id="ApplyDiscount" name="Apply discount">
<bpmn:extensionElements>
<zeebe:calledDecision decisionId="discount" resultVariable="discountPercent"/>
</bpmn:extensionElements>
</bpmn:businessRuleTask>
decisionId 与 DMN 的 decision id 对应。resultVariable 接收结果——UNIQUE/ANY/FIRST 返回单个结果,RULE ORDER/COLLECT 返回列表(使用聚合器时返回标量)。
resultVariable 会覆盖已有值。 如果名称与现有输入变量相同,输入值就会被覆盖——请使用不同的名称(例如 discountPercent,而不是 customer),这样下游活动仍可读取该输入。
<zeebe:calledDecision> 还接受 bindingType——latest(默认值)、deployment、versionTag。绑定类型表请参阅 camunda-bpmn;当 BPMN 和 DMN 一起部署时,应选择 deployment。
DMN 中的 FEEL
DMN 在 inputExpression、inputEntry(一元测试)、outputEntry 和 literalExpression 中使用 FEEL。与 BPMN 不同,不需要 = 前缀——每个 text 元素都会被解析为 FEEL。
输入条目使用一元测试子集:输入值是隐式的,< 5 表示 ? < 5,逗号分隔的字面量表示 OR,逗号分隔的比较表示 AND,范围写作 [1..10] / (1..10),not(...) 表示取反,- 表示匹配任意值。
有关一元测试语法、一元测试中的限制、关联决策间的变量作用域以及 DMN 特有的 FEEL 功能,请参阅 references/feel-in-dmn.md。
验证
分为两个层面——在确认文件完成之前,两项都要执行。
1. 结构 lint。 只有在 npx dmnlint 报告零问题后,DMN 编辑才算结构上完成。
[ -f .dmnlintrc ] || echo '{ "extends": "dmnlint:recommended" }' > .dmnlintrc
npx --yes dmnlint path/to/decision.dmn
对于目录范围的工作,请先递归查找 .dmn 文件(跳过 .git、node_modules、target、build、.gradle、.mvn、.idea、.settings、.snapshots),然后对每个找到的文件执行 lint。保持修复循环:lint → 有针对性地编辑 XML → 重新 lint,直到所有文件都没有问题。
常见规则:label-required(添加 name)、no-duplicate-requirements(删除重复的 informationRequirement 边)。完整的规则 → 修复映射请参阅 references/dmnlint.md。
2. 通过执行验证行为。 dmnlint 无法理解 FEEL、命中策略正确性或类型匹配。运行决策:
- 首选——编写或扩展 CPT 场景,覆盖每个
UNIQUE分区 /FIRST级联 /COLLECT路径。请参阅 camunda-process-test。 - 备选——部署
c8ctl deploy decision.dmn process.bpmn --profile=local,并使用c8ctl await pi --id MyProcess --variables '{...}' --profile=local启动实例。出现的问题会显示为EXTRACT_VALUE_ERROR(FEEL 问题)或DECISION_EVALUATION_FAILED(命中策略违规)。请参阅 camunda-process-mgmt。
BPMN 流程完成测试通过,只能证明决策未失败,并不能证明触发了正确的规则。有关行为正确性断言(assertThatDecision、按命中策略匹配规则序号、DRG 覆盖率),请参阅 references/testing-decisions.md。
参考资料
- decision-tables.md — 输入 / 输出子句结构、一元测试形式、各命中策略的示例、决策级
<variable>规则、类型表、注意事项 - feel-in-dmn.md — DMN 中的 FEEL 上下文、一元测试与完整 FEEL 的区别、关联决策间的作用域
- dmnlint.md —
dmnlint:recommended规则、规则 → 修复映射、lint 工具无法捕获的常见问题 - testing-decisions.md —
assertThatDecision、规则序号匹配、按命中策略制定的策略、DRG 覆盖率、模拟与测试