从案例角度解析建模平台动态规则引擎
源寶導(dǎo)讀:明源云ERP建模平臺(tái)提供了強(qiáng)大的頁面聯(lián)動(dòng)規(guī)則引擎,原來需要編寫代碼完成的聯(lián)動(dòng)控制邏輯,現(xiàn)在只需要點(diǎn)點(diǎn)鼠標(biāo),通過配置完成。本文從實(shí)際案例的角度出發(fā),介紹原始的代碼邏輯如何轉(zhuǎn)化為引擎規(guī)則的過程。
一、背景
? ? 明源云ERP建模平臺(tái)提供了強(qiáng)大的規(guī)則引擎機(jī)制,開發(fā)或者實(shí)施人員只需要通過簡單的界面配置就可以完成必填、顯隱、顏色等界面交互控制,從需要代碼開發(fā)轉(zhuǎn)為界面配置,極大提高了業(yè)務(wù)的交付效率。
? ? 在行業(yè)中也存在類似規(guī)則配置解決方案,但是大部分支持簡單的基于代碼轉(zhuǎn)換可視化配置,界面也十分復(fù)雜,并且缺少如業(yè)務(wù)參數(shù)、關(guān)鍵字等業(yè)務(wù)應(yīng)用場景。所以我們?nèi)绾紊钊氲慕Y(jié)合業(yè)務(wù)特性并且將界面的學(xué)習(xí)和使用成本降低到最小,就是我們面臨的挑戰(zhàn)。
? ? 本文從實(shí)際案例的角度出發(fā),介紹原始的代碼邏輯如何轉(zhuǎn)化為引擎規(guī)則的過程。
二、規(guī)則引擎整體架構(gòu)
設(shè)計(jì)時(shí)(Design-Time):用于規(guī)則的可視化配置,配置內(nèi)容將會(huì)存儲(chǔ)到配置文件中;
條件配置:規(guī)則對應(yīng)的業(yè)務(wù)判斷邏輯,如“表編輯模式”;
行為配置:將條件綁定到控件對應(yīng)的組件屬性或行為上,如保存按鈕在”表單編輯模式“時(shí)顯示;
元數(shù)據(jù)(Metadata)
元數(shù)據(jù)作為設(shè)計(jì)時(shí)和運(yùn)行時(shí)的橋梁,用于存儲(chǔ)設(shè)計(jì)時(shí)布局、字段配置、條件配置信息,通過元數(shù)據(jù)配置文件進(jìn)行存儲(chǔ),在運(yùn)行時(shí)解析元數(shù)據(jù)文件輸出布局及規(guī)則配置;
運(yùn)行時(shí)(Runtime):解析規(guī)則配置,將規(guī)則和用戶行為綁定, 轉(zhuǎn)化為對應(yīng)代碼可執(zhí)行邏輯;
解析引擎:將設(shè)計(jì)時(shí)中的規(guī)則條件、行為配置等解析為可執(zhí)行函數(shù),保障執(zhí)行性能;
事件映射:將組件事件、用戶操作等交互行為和規(guī)則執(zhí)行函數(shù)綁定,觸發(fā)事件時(shí)執(zhí)行對應(yīng)規(guī)則邏輯;
執(zhí)行器:在組件觸發(fā)事件時(shí)構(gòu)造數(shù)據(jù)上下文,將上下文對象傳遞到解析引擎生成的可執(zhí)行函數(shù)中,根據(jù)函數(shù)執(zhí)行結(jié)果分發(fā)到對應(yīng)組件行為;
三、通過代碼實(shí)現(xiàn)規(guī)則業(yè)務(wù)
? ? 案例:折扣管理中折扣方案應(yīng)用樓棟或者整棟樓或者單棟樓,涉及到隱藏規(guī)則及必填校驗(yàn)規(guī)則
“應(yīng)用范圍”為“整個(gè)項(xiàng)目”:
“應(yīng)用范圍”為“指定樓棟”:
通過腳本代碼如何實(shí)現(xiàn)
? ? 首先我們嘗試將需求轉(zhuǎn)為代碼實(shí)現(xiàn)設(shè)計(jì):
當(dāng)”應(yīng)用范圍“為”整個(gè)項(xiàng)目“時(shí),樓棟名稱隱藏,并且取消必填;
當(dāng)”應(yīng)用范圍“為”指定樓棟”時(shí),樓棟名稱顯示,樓棟名稱為必填。
? ? 假設(shè)我們通過代碼來實(shí)現(xiàn)上述場景的邏輯,首先我們會(huì)訂閱“應(yīng)用范圍“的值更改事件,在事件中判斷應(yīng)用范圍為”指定樓棟“時(shí)設(shè)置樓棟名稱顯示及必填。
// 訂閱應(yīng)用范圍值更改事件 usedScope_valuechanged:function(e){// 獲取樓棟名稱控件var bldList = appform.get('BldList');switch(e.value){case 'all': // 應(yīng)用范圍:整個(gè)項(xiàng)目bldList.hide();bldList.setRequired(false);break;case 'one': // 應(yīng)用范圍:指定樓棟// 顯示樓棟列表bldList.show();// 樓棟列表設(shè)置為必填bldList.setRequired(true);break;} }四、規(guī)則設(shè)計(jì)時(shí)配置
? ? 基于代碼實(shí)現(xiàn)我們可以將邏輯抽象為兩個(gè)部分:
條件:當(dāng)”應(yīng)用范圍“等于”指定樓棟“
行為:”樓棟名稱“設(shè)置”必填、顯示“都屬于對應(yīng)執(zhí)行的行為
? ? 如果我們需要將條件再做一次抽象,作為可視化界面可配置的,首先我們將條件翻譯為代碼:
// 當(dāng)”應(yīng)用范圍“為”指定樓棟“ if(data.usedScop == 'one'){// todo }? ? 我們可以從代碼中得出條件包含以下幾點(diǎn):
條件數(shù)據(jù)來源類型 :條件匹配會(huì)有不同的數(shù)據(jù)來源,一般是當(dāng)前表單的數(shù)據(jù)中某個(gè)字段,也有場景是通過URL參數(shù)或者業(yè)務(wù)參數(shù)作為判斷條件;
條件數(shù)據(jù)來源值:這里的值是字段名稱 ”userScope“;
操作符:用于比較的方式,這里是”=“等于符號,其他操作符還有大于、小于、為空判斷等等;
匹配值類型:匹配值常見為固定值或者URL參數(shù)值等;
匹配值:匹配值類型對應(yīng)的值,如果是固定值這里是對應(yīng)的固定值文本。
? ? 我們這里的示例中只有一個(gè)條件,實(shí)際過程中條件一般會(huì)有多個(gè)并且還有不同邏輯的組合,所以我們需要考慮多個(gè)條件組合及復(fù)雜的判斷邏輯。
規(guī)則行為配置
? ? 條件配置完成后,條件需要和對應(yīng)控件行為做關(guān)聯(lián),如“隱藏、必填”等,具體配置邏輯如下:
? ? “樓棟名稱”控件顯隱規(guī)則:如果“應(yīng)用范圍為指定樓棟”則“顯示”:
綁定控件:樓棟名稱;
綁定行為:顯隱行為;
對應(yīng)條件:應(yīng)用范圍為指定樓棟;
行為:顯示。
五、規(guī)則運(yùn)行時(shí)解析機(jī)制
? ? 剛才提到的條件及行為都屬于設(shè)計(jì)時(shí)的配置或描述,那么在界面運(yùn)行時(shí)如何應(yīng)用這些配置呢,需要對配置進(jìn)行解析綁定到對應(yīng)控件上。
1、將規(guī)則配置解析為對應(yīng)表達(dá)式:
//?通過new?Function?將規(guī)則生成為可執(zhí)行函數(shù) function rule(e){return e.data.useScope == 'one'; }2、將規(guī)則行為綁定到控件上:
// 訂閱應(yīng)用范圍值更改事件 var control = appform.get('usedScope'); control.on('valuechanged', invokeRule);3、控件觸發(fā)值改變時(shí)執(zhí)行規(guī)則:
//執(zhí)行規(guī)則 function invokeRule(e){var result = rule(e);//執(zhí)行行為invokeAction(e, result); }4、執(zhí)行組件行為:
function invokeAction(e){var action = e.action;switch(action){case 'show':if(result){e.control.show();}else{e.control.hide();}break;} }六、小結(jié)
? ? 通過這個(gè)模型我們在必填、顏色、加粗、編輯模式、顯隱等場景都實(shí)現(xiàn)了通過可視化配置,已經(jīng)滿足了80%的交互場景配置。后續(xù)面向更加復(fù)雜通過在線編碼支撐,在規(guī)則條件上增加代碼段在線編碼,如API數(shù)據(jù)源、算法邏輯等,這樣就可以通過規(guī)則引擎配置全面托管系統(tǒng)的交互邏輯配置,實(shí)現(xiàn)交互簡單場景可視化配置、復(fù)雜場景低代碼開發(fā)。
------ END ------
作者簡介
文同學(xué):?產(chǎn)品經(jīng)理,目前負(fù)責(zé)建模平臺(tái)的規(guī)劃工作。
也許您還想看
【復(fù)雜系統(tǒng)遷移 NET Core平臺(tái)系列】之界面層
.NET Core MVC擴(kuò)展實(shí)踐
如何解決大批量數(shù)據(jù)保存的性能問題
招商城科走進(jìn)武漢研發(fā)中心,現(xiàn)場編碼解鎖平臺(tái)內(nèi)核技術(shù)
總結(jié)
以上是生活随笔為你收集整理的从案例角度解析建模平台动态规则引擎的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十问十答 Ms-PL 许可证
- 下一篇: 想基于K8s按需扩展应用程序,可从这几方