业务背景
日常工作中,我们会应对各种各样的业务规则,这些规则往往写到代码里;
在市场运营过程中,避免不了业务规则调整,那问题就来了:需求评审
--
排期
--
编码
--
测试
--
上线
这个流程走下来,如果规则不断调整,开发也很疲倦,
运营感觉
业务规则匹配市场运营太慢,效率太低
........
其实 下面这张图,能很好地 说明我们的工作状态
解决方案
既然有这种问题,那肯定业界要有解决方案,目前
我从网上了解到
有两种方案比较流行:
* DMN: 是 OMG 公司发布规范,该规范主要用于定义业务决策的模型和图形;
* QLExpress : 阿里开源的规则引擎框架;
本期主要介绍 DMN,后期更新会接着介绍 QLExpress, 敬请期待…….
使用 这两种 解决方案,搭建规则中心,把业务规则从代码中剥离出来,
放到规则中心统一管理维护,同时提供规则服务,从而降低开发成本,提升运营效率……
DMN 解决方案
DMN:DecisionModel and Notation 的缩写,直译意为:决策模型与图形,
是 OMG 公司发布规范,该规范主要用于定义业务决策的模型和图形。
DMN 规范出现前,决策者无法参与到业务中,为了填补模型上的空白,新增了 DMN 规范,
定义决策的规范以及图形,DMN 规范相当于业务流程模型与决策逻辑模型之间的桥梁。
DMN 主要定义决策模型,Activiti 实现了 decision 部分。
解决方案官网链接:[https://camunda.com/dmn/]
以下是通过 DMN 官网 页面 创建的业务决策表(运营可视化管理规则,同时提供了规则解析 API)
欲知详情,请继续往下看…..,后面有这个实例的 Java 版的运行 Demo
DMN 优点
· 行业标准规范;
· 一套完整的解决方案,接入成本低;
· 决策表托管而非代码托管;
· 贴近实际运营操作;
DMN 详解
决策表支持的数据类型
· string
· boolean
· integer
· long
· double
· date
决策表支持的操作分类
备注:参考 官网 英文 连接地址 [查看],我翻译如下:
比较操作
注意:
· 等于操作符不是 = 而是空;
· 不等与操作符不是!=,需要通过否定实现,例如:not(“Steak”);
范围操作
注意:
· 数值类型和日期类型支持此操作符;
· 不等与操作符不是!=,需要通过否定实现,例如:not(“Steak”);
逻辑操作
一个简单的逻辑运算是一个特殊的表达式组合,此表达式为比较或者范围操作,
任何一个成立即被判断为 true
例子如下:
· 3,5,7: 是否为 3,5,7 中的任意一个值;
· <2,>10: 是否小于 2 或者大于 10;
· 10,[20..30]: 是否为 10 或者 大于等于 20 且小于等于 30;
· “Spareribs”,“Steak”,“Stew”:字符串是否为 "Spareribs",“Steak”,"Stew" 中的任何一个;
· date and time(“2015-11-30T12:00:00”),date and time(“2015-12-01T12:00:00”)
日期是否为 2015-11-30 12:00:00 或 2015-12-01 12:00:00;
· customer.age,>21: 输入大于变量 customer 的属性 age 或者 大于 21;
否定操作
逻辑操作可以通过 not 进行取反操作,逻辑操作为 true 取反后为 false,逻辑操作为 false 取反后为 true;
但是取反操作只能放在最开始,里面可以包含逻辑操作;
· not(“Steak”):输入不是字符串 Steak;
· not(>10):不大于 10;
· not(3,5,7):不是 3,5,7 中的任意一个;
· not([20..30]):不在区间 [20..30] 内;
其他
日期函数 date and time(“…”)
用 yyyy-MM-dd’T’HHss 格式的字符串创建一个时间,例如:date and time(“2015-11-30T12:00:00”)
变量或对象属性访问
通过匹配的名称可以访问一个变量或这个一个对象的属性,例如:
· x: 判断输入是否等于 x
· =x: 判断输入是否大于等于 x
· <customer.age>: 判断输入是否小于对象 customer 的属性 age;
DMN 解决方案实例介绍
说了那么多,可能你还没有什么感觉,那我就用一个简单业务场景,介绍一下我们如何使用 DMN,
大致的流程如下:
1. 梳理通用业务规则;
2. 通过页面建立决策表(一般运营操作);
3. 决策表内容(XML)保存;
4. 在对应的业务节点,加载对应业务决策表内容,后台传递决策表依赖信息进行业务决策,返回决策结果;
5. 根据决策结果,业务代码进行逻辑控制;
创建决策表
通过页面直接创建决策表,表格形式如下:
备注:
1、Activiti 提供了前端组件,对应链接地址:http://bpmn.io/toolkit/dmn-js/download/
2、完全可以把这些前端组件为我所用,进行定制化开发,搭建自己的 规则管理–决策表 管理后台,
3、在线可以创建决策表,链接为:[https://demo.bpmn.io/dmn]
我通过这个页面创建了以下决策表
备注:后面代码编写和运行结果以这个为例,同时简化了业务规则场景,便于理解
保存决策表信息
决策表的信息会被存储为一个 xml 文件,如上截图决策表保存的文件名称为:
lmRouteRule.dmn.xml ,内容格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitionsxmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd"id="definitions"name="definitions"namespace="http://camunda.org/schema/1.0/dmn"exporter="dmn-js (https://demo.bpmn.io/dmn)"exporterVersion="7.0.0">
<decisionid="lmRouteRule"name="末派路由逻辑">
<decisionTableid="decisionTable_1">
<inputid="input_1"label="配送分区范围">
<inputExpressionid="inputExpression_1"typeRef="string">
<text>deliveryScope
</text>
</inputExpression>
</input>
<outputid="output_1"name="末派公司"typeRef="string" />
<ruleid="DecisionRule_0tpi0ln">
<inputEntryid="UnaryTests_0xgrbp2">
<text>"A","B","C"
</text>
</inputEntry>
<outputEntryid="LiteralExpression_0dv07py">
<text>XpressBees
</text>
</outputEntry>
</rule>
<ruleid="DecisionRule_0zd77fe">
<inputEntryid="UnaryTests_19f4740">
<text>"D","E","F"
</text>
</inputEntry>
<outputEntryid="LiteralExpression_1j6aah4">
<text>Ecom
</text>
</outputEntry>
</rule>
<ruleid="DecisionRule_0wvr30c">
<inputEntryid="UnaryTests_1vi510h">
<text>not("A","B","C","D","E","E")
</text>
</inputEntry>
<outputEntryid="LiteralExpression_0gycnur">
<text>Delhivery
</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>
执行决策表
读取决策表的文件 lmRouteRule.dmn.xml 的 XML 内容,初始化决策模型,
通过传递过来的上下文信息,来执行决策,实现代码例子如下:
package org.camunda.bpm.example;
import org.camunda.bpm.dmn.engine.DmnDecision;
import org.camunda.bpm.dmn.engine.DmnDecisionTableResult;
import org.camunda.bpm.dmn.engine.DmnEngine;
import org.camunda.bpm.dmn.engine.test.DmnEngineRule;
import org.camunda.bpm.engine.variable.VariableMap;
import org.camunda.bpm.engine.variable.Variables;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.io.InputStream;
public
classStationMarginTest{
@Rule
public DmnEngineRule dmnEngineRule =
new DmnEngineRule();
public DmnEngine dmnEngine;
public DmnDecision decision;
@Before
publicvoidparseDecision(){
InputStream inputStream = StationMarginTest.class.getResourceAsStream(
"lmRouteRule.dmn.xml");
dmnEngine = dmnEngineRule.getDmnEngine();
decision = dmnEngine.parseDecision(
"lmRouteRule", inputStream);
}
@Test
publicvoidgetDeliveryScopeALm(){
VariableMap variables = Variables
.putValue(
"deliveryScope",
"A");
DmnDecisionTableResult result = dmnEngine.evaluateDecisionTable(decision, variables);
System.out.println(
"订单对应分区为A选择的末派为:" + result.getSingleResult().getSingleEntry());
}
@Test
publicvoidgetDeliveryScopeELm(){
VariableMap variables = Variables
.putValue(
"deliveryScope",
"E");
DmnDecisionTableResult result = dmnEngine.evaluateDecisionTable(decision, variables);
System.out.println(
"订单对应分区为E选择的末派为:" + result.getSingleResult().getSingleEntry());
}
@Test
publicvoidgetDeliveryScopeHLm(){
VariableMap variables = Variables
.putValue(
"deliveryScope",
"H");;
DmnDecisionTableResult result = dmnEngine.evaluateDecisionTable(decision, variables);
System.out.println(
"订单对应分区为H选择的末派为:" + result.getSingleResult().getSingleEntry());
}
}
运行结果:
订单对应分区为 A 选择的末派为:XpressBees
订单对应分区为 E 选择的末派为:Ecom
订单对应分区为 H 选择的末派为:Delhivery
备注:
* Java 工程依赖的 API 包下载 [点击链接]
· lmRouteRule.dmn.xml 为决策表的 XML 内容;
· 其中 lmRouteRule 为决策表的编码;
· deliveryScope 为决策表中 条件 配送范围 的 编码;
结论: 使用 DMN 方案 进行规则中心的大家,是 决策表 规则的托管,而非代码托管;
搭建规则中心
个人认为,我们的业务规则,不应该写死在代码里:如果写对应代码的人离职或者
换部门了,那么
就没有人了解这个业务规则了
所以 我们应该有一个统一的平台去承载 规则的抽象和集中统一管理:
* 规则管理;
* 规则查询;
* 规则发布上线;
* 规则启用禁用;
* 规则服务化;
规则中心在物流管理的应用场景
备注:以我目前在的部门 为例,与产品运营沟通中,待补充…….
针对以上截图中的规则,目前我们分两种方式应对:
1、针对部分规则单独做页面支持;
例如:报关税率、末派公司单量配比,如下截图:
** 问题:不具有通用性,无法复用;
**
2、规则写死在代码中;业务规则耦合在代码中,规则不透明,调整起来比较麻烦,成本高;
所以,规则中心的存在,是有业务场景的,是有价值的!
规则中心价值
相关推荐
借助此平台,企业能实现对复杂规则的简化处理,提高规则的可视化程度,并通过动态的规则引擎促进规则的实时更新和迭代。这不仅增强了企业对内部流程的控制力和透明度,还大大提升了其适应市场变化的能力。此外,统一...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...
决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...