Devs--開源規則引擎介紹

CrankZ發表於2021-11-28

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

相關文章