mcpField
C
camunda-dmn

camunda-dmn

github.com/camunda开发26134 次安装今天更新
代码仓库

关于 camunda-dmn

用于为 Camunda 8.8+ 编写和验证可执行 DMN 1.3 决策的 Skill,涵盖决策表、FEEL 表达式、BPMN 连接、静态检查与执行验证。

主要功能

  1. 01编写 DMN 1.3 决策
  2. 02配置决策表与命中策略
  3. 03在决策需求图中关联决策
  4. 04将决策连接到 BPMN 业务规则任务
  5. 05通过检查与执行验证决策

适用场景

  1. 01定义可执行业务规则
  2. 02使用 dmnlint 检查 DMN 结构
  3. 03通过 BPMN 测试决策行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/camunda/skills --skill camunda-dmn

安装后在 Claude Code 中输入/camunda-dmn确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

portability.json
references/
decision-tables.md
dmnlint.md
feel-in-dmn.md
testing-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 覆盖率、模拟与测试

评论

支持 Markdown