數據合規性檢查案例

1.問題描述

1.1 數據驗證的意義

規則引擎可(kě)以在數據驗證和清洗場景中(zhōng)使用(yòng),通過使用(yòng)規則來驗證數據的有(yǒu)效性和一緻性,具(jù)體(tǐ)如下:

  • 數據格式驗證:驗證數據是否符合特定的格式要求,如郵件地址、電(diàn)話号碼等。
  • 數據範围驗證:驗證數據是否在允許的範围内,如年齡範围、工(gōng)資範围等。
  • 數據一緻性驗證:驗證不同數據項之間的一緻性,如郵寄地址和郵編号碼的一緻性等。

總之,數據驗證是确保用(yòng)戶輸入數據的有(yǒu)效性和正确性的重要手段,可(kě)以使用(yòng)戶提交的數據更加準确可(kě)靠,同時提高系統的可(kě)用(yòng)性和安(ān)全性。

1.2 表單數據驗證常用(yòng)的幾種方式

客戶端驗證

這種驗證方式在用(yòng)戶提交表單之前,先在客戶端進行驗證。客戶端驗證的優勢在于能(néng)夠即時發現并糾正用(yòng)戶的輸入問題,提高用(yòng)戶體(tǐ)驗,它通常使用(yòng)JavaScript或jQuery等前端技(jì )術實現。

這種驗證方式針對表單中(zhōng)的每個元素進行驗證,包括必填項、長(cháng)度、格式、類型等。表單元素驗證可(kě)以提高表單的可(kě)用(yòng)性和用(yòng)戶體(tǐ)驗,同時可(kě)以減少用(yòng)戶輸入錯誤的可(kě)能(néng)性。

服務(wù)端驗證

這種驗證方式在用(yòng)戶提交表單後,由服務(wù)端進行驗證。服務(wù)端驗證可(kě)以防止惡意用(yòng)戶繞過前端驗證,确保數據的完整性和安(ān)全性。它通常使用(yòng)後端編程語言如PHP、Java或Python等實現。

數據庫驗證

這種驗證方式在數據存儲到數據庫之前,對數據進行驗證。數據庫驗證可(kě)以确保數據的有(yǒu)效性和一緻性,同時可(kě)以防止惡意用(yòng)戶繞過前端和後端驗證,它通常使用(yòng)數據庫查詢語句實現。

總之,做好數據驗證工(gōng)作(zuò),可(kě)極大地提升數據質(zhì)量。

2.架構與設計

2.1 架構

應用(yòng)間交互图

img

說明

  • 推薦采用(yòng)以上系統間交互方式,通過網關來與規則引擎交互,可(kě)能(néng)更适應于當前市場主流的微服務(wù)體(tǐ)系
  • 将鑒權、流控、熔斷等都集中(zhōng)在應用(yòng)服務(wù)網關上完成,從而保護規則引擎服務(wù)器
  • 由于,規則引擎的輸入接口數據格式比較特殊,可(kě)能(néng)需要在應用(yòng)服務(wù)網關轉換,以更加适配于目标開發团隊現有(yǒu)的技(jì )術棧和接口交互标準

規則項目關系图

img

說明

  • 規則項目類型有(yǒu)2種,公(gōng)共項目和普通項目,我們的uRule産(chǎn)品支持項目間的引用(yòng)和共享,允許在普通項目中(zhōng)調用(yòng)公(gōng)共項目中(zhōng)的規則文(wén)件
  • 在新(xīn)建規則時,将本單位的輸入規則進行提練,将比較常用(yòng)的、通用(yòng)的規則編寫在【公(gōng)共項目】中(zhōng),然後在【普通項目】中(zhōng)進行引用(yòng),按需組合規則并向自己的業務(wù)應用(yòng)系統提供驗證服務(wù)

2.2 數據較驗流程

img

2.3 設計

用(yòng)戶本地維護的規則編号表

自定義全局編碼 知識包id 較驗規則說明
CK_USERNAME 301 用(yòng)戶名(míng)較驗
CK_USEREMAIL 302 用(yòng)戶郵箱較驗
  • 開發者自建的對照關系表,即能(néng)展示本地特色、方便開發者在前端應用(yòng)界面中(zhōng)記憶等,又(yòu)可(kě)以與uRule解耦,在遷移項目時知識包id可(kě)能(néng)會重新(xīn)編号,出現不能(néng)匹配到的問題
  • 自建的對照表可(kě)以作(zuò)為(wèi)組織的知識庫公(gōng)開顯示和查詢,更能(néng)提升工(gōng)作(zuò)效率

前端在調用(yòng)時,輸入數據問題

  • 規則碼如上图所示,标記着調用(yòng)那個知識包
  • 輸入數據格式需要抽象,并保持全域(所有(yǒu)的消費方)一緻性,方可(kě)多(duō)路複用(yòng),兼容多(duō)種複雜的場景
  • 輸入參數可(kě)能(néng)是個List集合或者是Map,但不能(néng)是個java對象(BOM),可(kě)能(néng)會涉及到多(duō)個表單要素間的組合性檢查,輸入對象的實例化(Map轉換成BOM)應放在調用(yòng)入口規則上
  • 需要注意此處的字段名(míng)fieldName輸入值來源于“數據字典”,全域公(gōng)用(yòng)的,規則引擎中(zhōng)會根據這個fieldName匹配規則算法
{
  "ckId":"CK_001",
  "inputData":[
    {
      "fieldName":"myName",
      "fieldValue":"張三"      
    },
    {
      "fieldName":"myCerKind",
      "fieldValue":"1"
    },
    {
      "fieldName":"myCerCode",
      "fieldValue":"420322xxxxxxxxxxxx"
    }
  ]
}
{
  "ckId":"CK_002",
  "inputMap":
    {
      "custName":"張三豐",
      "custCerType":"2",
      "custCerCode":"123456789"
    }
}

返回到前端的數據,标準結構

{
  "resultCode":"200",
  "resultMsg":"較驗通過"  
}
{
  "resultCode":"999",
  "resultMsg":"較驗未通過",
  "data":[
    {"checkMsg":"不滿足最小(xiǎo)長(cháng)度","checkCode":"0","checkFieldName":"myName"},
    {"checkCode":"1","checkFieldName":"myCerKind"},
    {"checkMsg":"證件号不滿足行業規範要求","checkCode":"0","checkFieldName":"myCerCode"}
  ]
}

3.示例程序

3.1 業務(wù)需求

3.1.1 技(jì )術要求

  • 實現對客戶信息的輸入項合規性較驗,在業務(wù)場景發生變更時,能(néng)及時調整數據的較驗規則,生産(chǎn)系統能(néng)及時變更生效,無需走繁雜的項目變更發版流程
  • 本單位各業務(wù)系統的具(jù)有(yǒu)相同業務(wù)含義的要素,原則上執行同一套輸入标準,以保證數據的完整性和一緻性

3.1.2 業務(wù)規則

  • 客戶姓名(míng):元素值是一個長(cháng)度在[4, 120]區(qū)間内的字符串
  • 客戶證件類型:元素值是一個整型數值,取值範围[1,2] ,身份證和戶口本
  • 客戶證件号碼:當證件類型是1-身份證時其長(cháng)度是18位字符串,而且是一個合法的有(yǒu)效的身份證号碼;當證件類型是2-戶口本時其長(cháng)度是9位字符串

3.2 uRule規則引擎實現過程

3.2.1 新(xīn)建項目

  • 新(xīn)建2個規則項目:公(gōng)共項目和普通項目
  • 在公(gōng)共項目中(zhōng)編寫【客戶姓名(míng)較驗規則】【客戶證件類型較驗規則】【客戶證件号較驗規則】

img

3.2.2 公(gōng)共規則庫項目

3.2.2.1 庫文(wén)件

變量庫(BOM)
  • 客戶信息

img

  • 輸出BOM

img

  • 輸入BOM

img

參數庫
  • 公(gōng)共參數庫

img

  • 其它參數庫

img

3.2.2.2 客戶姓名(míng)較驗規則

img

3.2.2.3 客戶證件類型較驗規則

注意:本示例隻允許1-身份證,2-戶口本這兩種類型

img

3.2.2.4 客戶證件号較驗規則

img

  • 戶口本号碼規則

img

  • 身份證号規則,算法有(yǒu)點複雜,涉及到多(duō)個規則文(wén)件

img

  • 身份證号較驗算法明細

img

img

img

  • 以下是身份證号較驗算法所需要的轉換關系表,在上述規則中(zhōng)有(yǒu)調用(yòng)

img

img

3.2.3 數據分(fēn)析項目(普通規則項目)

img

3.2.3.1 客戶三要素較驗規則

注意:

  • 在此規則中(zhōng)需要導入【公(gōng)共項目】的參數庫,也會直接調用(yòng)公(gōng)共項目中(zhōng)的規則文(wén)件
  • 根據輸入的【字段名(míng)】動态匹配相應的規則執行組,也可(kě)以增加一個輸入項“規則名(míng)”來匹配規則的
  • 将輸入的Map轉換成【變量】對象,方便後續的規則較驗邏輯的輸入

img

img

img

img

3.2.3.2 定義公(gōng)共動作(zuò)模闆

說明:将常用(yòng)的賦值語句分(fēn)組定義在動作(zuò)模闆庫中(zhōng),以達到抽象和快速引用(yòng)目的,提高規則編寫效率和可(kě)讀性;例如上述的規則中(zhōng)就出現了【動作(zuò)模闆:數據較驗返回值賦值動作(zuò)】,二者遙向呼應

img

3.2.3.3 創建知識包

  • 創建知識包

img

  • Rest服務(wù)測試

img

3.2.4 示例項目(普通規則項目)

img

3.2.4.1 客戶姓名(míng)較驗規則

注意:将輸入Map轉換成【客戶信息】對象

img

3.2.4.2 創建知識包

  • 創建知識包

img

  • Rest服務(wù)測試

img

3.3 測試

3.3.1 在postMan工(gōng)具(jù)中(zhōng)模拟消費方

3.3.1.1 客戶三要素較驗測試

img

3.3.1.2 客戶姓名(míng)較驗測試

img

  • 輸入數據
[
    {
        "name": "參數",
        "fields": {
            "inputMap": {
                "custName": "張"
            }
        },
        "class": "java.util.HashMap"
    }
]
  • 輸出數據
{
    "output": [
        {
            "參數": {
                "outList": [
                    {
                        "checkMsg": "客戶姓名(míng)違反業務(wù)規則:張",
                        "checkFieldName": "custName",
                        "checkCode": "0"
                    }
                ]
            }
        }
    ],
    "duration": 6
}

3.3.2 在某個消費方業務(wù)系統模拟

3.3.2.1 編寫消費方後端api接口

img

3.3.2.2 驗證‘客戶姓名(míng)合規性’

(1)前端頁(yè)面代碼

img

img

(2)測試用(yòng)例

  • 前端輸入空值,較驗未通過

img

  • 前端輸入【張三豐】較驗通過

img

  • 前端輸入【1234】較驗不通過

img

  • 消費方控制台打印日志(zhì)

img

3.3.2.3 驗證‘客戶三要素合規性’

(1)編寫前端頁(yè)面代碼

img

img

(2)測試用(yòng)例

  • 輸入空值,較驗不通過

img

  • 輸入合規的三要素,驗收通過

img

  • 輸入不合規的要素值,較驗不通過

img

  • 消費方控制台打印日志(zhì)

img

3.4 小(xiǎo)結

  • 規則設計時,隻有(yǒu)要确保入口規則數據結構的通用(yòng)性,才能(néng)保證消費方在java端調用(yòng)規則代碼的兼容性,通過【知識包id】和【輸入參數】自動觸發對應的規則,輸入參數結構是固定不變的,與你要調用(yòng)的規則文(wén)件一一對應。
  • 規則設計時,若遇到比較複雜的規則,我們通常會聲明變量(BOM)在多(duō)個規則文(wén)件中(zhōng)傳遞,以提升可(kě)讀性和便捷性;那麽,在入口規則處就得對象實例化,出應當做好入參的檢查工(gōng)作(zuò)。
  • 前端頁(yè)面在調用(yòng)規則時,輸入參數至少包括該規則文(wén)件中(zhōng)要用(yòng)到的元素值,通常在你的团隊開發規範中(zhōng),會要求每個規則接口的輸入和輸出都有(yǒu)一個api說明文(wén)檔。

results matching ""

    No results matching ""