Devs--开源规则引擎介绍

Devs

Devs是一款轻量级的规则引擎。

开源地址:https://github.com/CrankZ/devs

基础概念

此规则引擎的基础概念有字段、条件、规则等。

其中字段组成条件,条件组成规则,并且支持多个条件通过与或组成一个规则。下面用常见的代码说明各个概念

代码举例

规则分类

多个规则可组成一个模板,调用接口执行的时候是以模板为维度执行的。

模板

模板名称
模板1

规则模板映射表

模板id 规则id
1 1
1 2
1 3

规则相关

字段

字段名称 字段编码 字段类型 取数类型 取数路径
name 姓名 STRING REFLECT engineServiceImpl#testReflect
age 年龄 NUMBER REFLECT engineServiceImpl#testReflect

条件

条件名称 条件编码 字段编码 逻辑比较符 期望值
姓名是否等于张三 C_NAME_IS_ZS name StringMethod.equals($EXPECT,$FACT) 张三
年龄是否大于18岁 C_AGE_GT18 age NumberMethod.gt($EXPECT,$FACT) 18

规则

规则名称 条件组
姓名是否等于张三 C_STRING_EQUALS1
年龄是否大于18岁 C_NUMBER_GE1
用户是否符合条件 C_STRING_EQUALS1 && C_NUMBER_GE1

规则结果

调用接口执行时,结果会直接通过接口返回。

TODO: 保存规则执行结果

TODO: 添加规则触发器

ER图

模板-规则关系

规则相关

规则执行结果

执行接口

URL:/engine/execute

METHOD:POST

入参

字段名 字段类型 是否必填 解释
templateId Long TRUE 模板ID
params Map<String,Object> FALSE 参数

例子

{
  "templateId": 1,
  "params": {
    "userId": 123
  }
}

出参

验收结果只有是、否、NULL。

执行结果为NULL,则只输出内容,需要手动判断

规则名称 执行结果 条件组 实际取值
姓名是否等于张三 TRUE 姓名是否等于张三 "姓名": "张三"
年龄是否大于18岁 FALSE 年龄是否大于18岁 "年龄": 10
用户是否符合条件 FALSE 姓名是否等于张三 && 年龄是否大于18岁 "姓名": "张三", "年龄": 10

例子

{
  "code": "0000",
  "msg": "success",
  "requestId": "",
  "timestamp": 1637996239325,
  "data": {
    "templateId": 1,
    "params": {},
    "ruleResult": [
      {
        "ruleName": "姓名是否等于张三",
        "trigger": true,
        "conditions": "姓名是否等于张三",
        "facts": {
          "姓名": "张三"
        }
      },
      {
        "ruleName": "年龄是否大于18岁",
        "trigger": false,
        "conditions": "年龄是否大于18岁",
        "facts": {
          "年龄": 10
        }
      },
      {
        "ruleName": "用户是否符合条件",
        "trigger": false,
        "conditions": "姓名是否等于张三 && 年龄是否大于18岁",
        "facts": {
          "姓名": "张三",
          "年龄": 10
        }
      }
    ]
  }
}
posted @ 2021-11-28 17:50  CrankZ  阅读(1661)  评论(0编辑  收藏  举报