`

规则中心 -- 实现业务规则可视化集中管理

阅读更多

业务背景

日常工作中,我们会应对各种各样的业务规则,这些规则往往写到代码里;
在市场运营过程中,避免不了业务规则调整,那问题就来了:
需求评审--排期--编码--测试--上线 这个流程走下来,如果规则不断调整,开发也很疲倦, 运营感觉 业务规则匹配市场运营太慢,效率太低........
其实 下面这张图,能很好地 说明我们的工作状态

解决方案

既然有这种问题,那肯定业界要有解决方案,目前 我从网上了解到 有两种方案比较流行:
* DMN: 
 OMG 公司发布规范,该规范主要用于定义业务决策的模型和图形;
* QLExpress : 
阿里开源的规则引擎框架;
本期主要介绍 DMN,后期更新会接着介绍 QLExpress, 敬请期待…….

使用 这两种 解决方案,搭建规则中心,把业务规则从代码中剥离出来,
放到规则中心统一管理维护,同时提供规则服务,从而降低开发成本,提升运营效率……

DMN 解决方案

DMNDecisionModel 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):不是 35中的任意一个;

·         not([20..30]):不在区间 [20..30] 内;

其他

日期函数 date and time(“…”)

 yyyy-MM-dd’T’HHss 格式的字符串创建一个时间,例如: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;
 
publicclassStationMarginTest{
  @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、规则写死在代码中;
业务规则耦合在代码中,规则不透明,调整起来比较麻烦,成本高;

所以,规则中心的存在,是有业务场景的,是有价值的!

规则中心价值

 

分享到:
评论

相关推荐

    企业统一规则管控平台解决方案.rar

    借助此平台,企业能实现对复杂规则的简化处理,提高规则的可视化程度,并通过动态的规则引擎促进规则的实时更新和迭代。这不仅增强了企业对内部流程的控制力和透明度,还大大提升了其适应市场变化的能力。此外,统一...

    毕业设计----酒店管理系统demo.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    BlazorCommunity 是一个使用 Element-Blazor 实现的社区系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    网络集中监控和管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    api实现医药管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    电商库存管理系统 企业进销存管理系统 - Part 1.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    Asp.net实现学籍管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    基于ASP.NET MVC实现的后台管理系统,如有侵权,请联系本人删除.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    纯手写数据层业务层人力资源管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    操作系统 - 文件管理系统模拟.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    该项目使用C#编写,主要实现了图书管理系统注册、登录、管理员实现对书籍的增、删、改、查功能以及用户借 、还书的功能。.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    基于C# Winform 实现简易超市管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    MLTcola桌面管理系统,对电脑上的应用进行系统的管理,实现快速打开或跳转的功能.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    操作系统存储管理的算法实现与演示.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    基于C# WPF实现的图书馆管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    C#程序模拟操作系统进程管理的实现,以加深对操作系统工作原理和操作系统实现方法的理解.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    c#实现基本的学校人员信息管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    c#实现的一个图书馆管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    基于abp vnext实现的前后端分离管理系统.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

    ASP.NET MVC + SQL Server实现的图书管理系统。.zip

    决策支持模块:基于数据分析结果,为管理者提供直观的可视化报告,辅助其进行科学决策。 用户界面与交互模块:提供友好的人机交互界面,方便用户操作使用。 二、主要类型与功能 管理系统根据所针对的管理对象和...

Global site tag (gtag.js) - Google Analytics