ruoyi-vue2集成DMN规则引擎实现Dish出餐决策

前言

DMN决策引擎的核心价值在于将复杂的业务决策逻辑从程序代码中剥离出来,通过标准化的模型进行可视化管理和执行。它在实战中的应用非常广泛,特别是在需要频繁调整业务规则、追求流程自动化与智能化的场景中。

具体应用场景有: 金融与风控 ​: 信贷审批、金融风险评估、反洗钱检查、 供应链与生产​ : 保险定价、供应链管理、生产调度 营销与客户服务​ : 客户分群、精准营销 其他创新场景​: 教育分班、智能餐饮

今天我们以一个经典的案例智能餐饮来讲解实战中的用法。

决策规则

请点击这个Dish查询规则建模,以下我们拆解一下这个DMN规则表的含义。

text 复制代码
这个Dish决策表规则是根据当前的气温(tempeature)和日期类型(dayType)决策上什么餐食。主要有三个决策表构成, 核心是Dish-Decision表。
Season Dicision和Guest Count 以输出结果传递给Dish Decision决策表。

Season Dicision规则描述:
tempeature>30, 得到season: Summary
tempeature<10, 得到season: Winter
tempeature=[10..30] 得到season: Spring

Guest Count规则描述:
dayType="Weekday",  客人数量(guestCount): 4 
dayType="Holiday",  客人数量(guestCount): 10
dayType="Weekend",  客人数量(guestCount): 15


Dish-Decision规则描述: 
season=winter, guestCount<=8, desiredDish='Spareribs'
season=winter, guestCount>8, desiredDish='Pasta'
season=Summer, guestCount>10, desiredDish='Light salad'
season=Summer, guestCount<=10, desiredDish='Beans salad'
season=Spring, guestCount<10, desiredDish='Stew'
season=Spring, guestCount>=10, desiredDish='Steak'

流程建模

  • 需求描述
text 复制代码
我们现在模拟一个流程, 用户输入当天的气温和日期类型(工作日,假期,周末), 系统决策提供什么类型的餐食。
  • 模型结构
  • 模型定义
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
  <bpmn:process id="Process_8887" name="出餐决策" isExecutable="true">
    <bpmn:startEvent id="Event_1i7sxll">
      <bpmn:outgoing>Flow_1rzb9vm</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_1rzb9vm" sourceRef="Event_1i7sxll" targetRef="Activity_0fzwoab" />
    <bpmn:userTask id="Activity_0fzwoab" name="就餐信息" camunda:assignee="${startUser}">
      <bpmn:extensionElements>
        <camunda:formData>
          <camunda:formField id="temperature" label="气温" type="long" />
          <camunda:formField id="dayType" label="日期" type="string" />
        </camunda:formData>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_1rzb9vm</bpmn:incoming>
      <bpmn:outgoing>Flow_0v0zyja</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:sequenceFlow id="Flow_0v0zyja" sourceRef="Activity_0fzwoab" targetRef="Activity_08c0387" />
    <bpmn:businessRuleTask id="Activity_08c0387" name="决策规则" camunda:resultVariable="desiredDish" camunda:decisionRef="dish-decision" camunda:mapDecisionResult="singleEntry">
      <bpmn:incoming>Flow_0v0zyja</bpmn:incoming>
      <bpmn:outgoing>Flow_1ajvk92</bpmn:outgoing>
    </bpmn:businessRuleTask>
    <bpmn:sequenceFlow id="Flow_1ajvk92" sourceRef="Activity_08c0387" targetRef="Activity_0jobe9d" />
    <bpmn:serviceTask id="Activity_0jobe9d" name="出餐程序" camunda:delegateExpression="${dishTask}">
      <bpmn:incoming>Flow_1ajvk92</bpmn:incoming>
      <bpmn:outgoing>Flow_0r2ykge</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="Event_0x2ftot">
      <bpmn:incoming>Flow_0r2ykge</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0r2ykge" sourceRef="Activity_0jobe9d" targetRef="Event_0x2ftot" />
  </bpmn:process>
  
</bpmn:definitions>
  • 运行结果
text 复制代码
运行结果解释:
用户输入的气温15度,根据Season Dicision可以得到是=Spring
用户输入的日期类型weekday, 根据Guest Count可以得到客人数量=4

根据season=spring, guestCount=4,根据Dish Decision可以得到=stew 

完全符合预期!

访问若依工作流点击顶部,演示系统立即体验!

相关推荐
源代码•宸9 小时前
Leetcode—1339. 分裂二叉树的最大乘积【中等】
开发语言·后端·算法·leetcode·golang·dfs
码农水水9 小时前
美团Java后端Java面试被问:Kafka的零拷贝技术和PageCache优化
java·开发语言·后端·缓存·面试·kafka·状态模式
计算机毕设指导69 小时前
基于微信小程序的考研资源共享系统【源码文末联系】
java·spring boot·后端·考研·微信小程序·小程序·maven
superman超哥9 小时前
Rust 结构体中的生命周期参数:所有权设计的核心抉择
开发语言·后端·rust·rust结构体·rust生命周期·所有权设计
沉默-_-10 小时前
从小程序前端到Spring后端:新手上路必须理清的核心概念图
java·前端·后端·spring·微信小程序
superman超哥10 小时前
Rust 生命周期边界:约束系统的精确表达
开发语言·后端·rust·rust生命周期边界·约束系统
a程序小傲10 小时前
中国邮政Java面试被问:gRPC的HTTP/2流控制和消息分帧
java·开发语言·后端
forestsea10 小时前
Springboot 4.0十字路口:虚拟线程时代,WebFlux与WebMVC的终极选择
java·后端·spring
superman超哥10 小时前
Rust 生命周期省略规则:编译器的智能推导机制
开发语言·后端·rust·编译器·rust生命周期·省略规则·智能推导
踏浪无痕10 小时前
从需求到落地:我们是如何搭建企业知识库问答系统的
后端·ai编程