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
        }
      }
    ]
  }
}