一、設計目標
a)規則引擎語法能夠滿足分單,計費,WMS策略的配置要求。語法是一致和統一的
b)能夠在不修改規則引擎模塊的情況下,加入任意一個新的規則;實現上述需求之外的規則配置需求
c)運算速度快
d)有良好的展現效果,能夠在售前階段幫助銷售
e)提供良好的調試和診斷手段,便於配置規則
二、基本語法及使用
在講解以下章節的內容時,我們來模擬OMS中一個真實的分單業務場景:根據訂單不同的出發地城市和目的地城市指派不一樣的承運商並創建運單,如果目的地城市為北京則在天津進行中轉。
首先:在相關類中增加如下代碼:
1.把頁面表單控件值取出來放到集合中
Dictionary<string, object>parames = newDictionary<string, object>(); Dictionary<string, object> returns = newDictionary<string, object>();
publicvoidGetFormToParames() { parames.Clear(); parames.Add("出發地", this.txtChuFaDi.Text); parames.Add("到達地", this.txtDaoDa.Text); parames.Add("業務類型", this.icbeCategory.Text); parames.Add("總金額", this.txtTotalMoney.Text); parames.Add("重量", this.txtZhongLiang.Text); parames.Add("運費", this.txtMoney.Text);
}
|
1.把組裝好的參數調整規則“類型不同折扣不同主規則”進行執行。
//類型不同折扣不同 privatevoidbtnCategory_Click(object sender, EventArgs e) { GetFormToParames(); RuleServiceruleService = (RuleService)CacheManager.Instance.Retrieve("RuleService"); returns = ruleService.Execute(this.UserInfo, "類型不同折扣不同主規則", parames, this.DbHelper, this.UserCenterDbHelper); if (returns != null) { if (returns.ContainsKey("費用") && returns["費用"] != null) { this.txtMoney.Text = returns["費用"].ToString(); } } } |
ruleService.Execute方法傳遞參數調用“類型不同折扣不同主規則”,並返回費用進行處理。
2.1、調試輸出
1. 語法:打印(Object)
2. 說明:該函數用於調試輸出,內容會輸出到規則日志上。
類型不同折扣主規則:
打印(“執行類型不同折扣主規則”); |
調用執行后,規則日志控制台便會輸出"執行類型不同折扣主規則"
2.2、局部變量
1. 語法:int運費=100
2. 說明:
a)文字前增加int符號就表明該變量是一個整型局部變量;
b)局部變量只能在單個規則文件內部使用。不能被外部賦值和讀取
c) 類型可以是C#語法中的任意類型。
規則內容如下:
|
調用方法后在日志控制台便會輸出:"標識:0"
2.3、運算符
符號 |
樣例 |
說明 |
= |
運費=100 |
向變量進行賦值 |
+,-,*,/,% |
運費=100*20+18 |
加,減,乘,除,取余 |
>,<,>=,<=,<>,!= |
如果(運費>100){} |
邏輯運算符 |
() |
(運費>100)且(運費<1000) |
括號;可以無限嵌套 |
且 |
(運費>100)且(運費<1000) |
與運算 |
|
|
|
|
|
|
例:
如果(字符串參數("業務類型") == "零售") { totalMoney = totalMoney * 0.9; }
如果( 字符串參數("業務類型").Equals( "大客戶")) { totalMoney = totalMoney * 0.6; } |
2.4、條件語句
1. 語法:如果(條件表達式){語句}
2. 說明:
a)條件表達式為必須(包括小括號),並且肯定是邏輯表達式,而語句體中的語句可以為任意語句,也就是支持語句嵌套。
b)注意只有如果子句,沒有或者子句。
主規則中內容如下:
int標識= 0 // 條件語句, 這里表示:如果訂單集為空,則拋出一個異常 如果(訂單集== 空) { 異常("訂單集為空") } 如果(訂單集!= 空) { 打印("正常,訂單集不為空") } |
2.5、空值
1. 語法:空,可以用:a==空的方式對於空值進行判斷
2. 說明:內置全局變量,用於進行空值判斷
主規則中內容如下:
int標識= 0 // 空:內置全局變量,用於進行空值判斷 如果(參數集== 空) { 異常("訂單集為空") } 如果(參數集!= 空) { 打印("正常,訂單集不為空") } |
2.6、循環
1. 語法:
每個(局部變量in列表){ 語句 } |
2. 說明:
a)條件表達式為必須(包括小括號),並且肯定是邏輯表達式,而語句體中的語句可以為任意語句,也就是支持語句嵌套。
b)注意:只有如果子句,沒有或者子句。
主規則中內容如下:
int標識= 0 如果(訂單集== 空) { 異常("訂單集為空") } // 對集合進行循環遍歷 每個(訂單in訂單集) { 打印(訂單.序號) } |
調用方法后在控制台日志便會輸出:訂單序號
三、高級語法及使用
3.1、創建對象
1. 語法:new 實體名(),參數:無,返回值:實體類。
2. 說明:下例第8行創建了一個運單對象,對象可以包含很多屬性,變量名.屬性名,形如:運單.出發地="A"
int標識= 0 如果(訂單集== 空) { 異常("訂單集為空") } 每個(OrderEntity訂單: 訂單集) { OrderEntity運單= new OrderEntity() 運單.出發地= 訂單.出發地 運單.目的地= 訂單.目的地 打印(運單) } |
調用方法時,在控制台便會輸出:運單相關信息
3.2、創建列表
1. 語法:創建列表(),參數:無,返回值:結果集
2. 說明:下例列表,用於存放鍵值對。
Dictionary<string, object>列表 = 創建列表() |
3.3、子規則
分單規則:
int標識= 0; 打印("分章主規則" + 標識); 如果(標識 == 0){ 子規則分單1(); } |
分單子規則:子規則分單1
/* * BaseUserInfo當前用戶 * Dictionary<string, object>參數集 * IDbHelperdbHelper //業務數據庫 * IDbHelperuserDbHelper//用戶中心數據庫 * * 取參數值方法:(強轉類型)參數集["key"] * * Dictionary<string, object>返回列表 * 返回參數方法:返回列表.Add("key",value); */
打印("子規則分單1------------"); string s, m; BaseRuleLogEntity entity = new BaseRuleLogEntity(); entity.Type = "打印"; entity.Description = "哈哈哈"; SNFService.Instance.CreateService<BaseRuleLogService, IBaseRuleLogService>().Add(BaseSystemInfo.UserInfo, entity, out s, out m);
單值查表("費用表","大連","青島");
返回列表("key",entity ); |
注:可以直接調用我們服務層代碼.
同時我們的調用代碼如下:
//01.規則調用代碼 System.Collections.Generic.Dictionary<string, object>parames = new System.Collections.Generic.Dictionary<string, object>(); ruleService = (RuleService)CacheManager.Instance.Retrieve("RuleService"); ruleService.Execute(BaseSystemInfo.UserInfo, "分單主規則", parames, null, null); |
3.4、內置函數
函數 |
參數 |
返回值 |
說明 |
查表 |
參數1:規則表名稱,參數2~N:表示查找參考項值,傳值順序跟規則表定義順序一致 |
結果集 |
用於規則表的查詢,$線路集=查表("上架規則表","海信",64) |
單值查表 |
參數1:數據表名;參數2:值參考項;其余:數據表查找參考項;返回:value |
值 |
string feiyong = 單值查表("運費表","費用",參數集["出發地"].ToString(),參數集["到達地"].ToString()); |
多值查表 |
參數1:數據表名;其余:數據表查找參考項; |
結果列表集(key,value) |
List< Dictionary<string, object>> |
最大 |
參數1~N:數值 |
最大數值 |
求最大值,int 最大值=最大(1,0,5,9,10) |
最小 |
參數1~N:數值 |
最大數值 |
求最小值,int 最小值=最小(1,0,5,9,10) |
|
|
|
|
求和 |
參數1:集合 |
數值 |
對集合中元素進行求和 |
四舍五入 |
參數1:值 |
數值 |
|
四舍五入 |
參數1:值,參數2:精度 |
數值 |
|
向上取整 |
數值 |
整型類型 |
向上取整(數量); |
向下取整 |
數值 |
整型 |
向下取整(數量); |
包含元素 |
參數1:集合類型,參數2:任意類型; |
布爾類型 |
|
格式化字符 |
參數1:值 ;參數2:占位符 ;參數3:位數 |
字符串值 |
|
創建列表 |
無參數 |
結果集 |
創建一個集合,Dictionary<string, object>返回列表=創建列表() |
相隔日 |
參數1:源日期,參數2:目標日期 |
天數 |
獲得兩個日期間相隔天數 |
相隔月 |
參數1:源日期,參數2:目標日期 |
月數 |
獲得兩個日期間相隔月數 |
現在 |
無 |
日期 |
獲取當前日期 |
異常 |
參數1:消息 |
無 |
判斷對象是否為空,如果為空則拋出異常,並且控制台輸出消息 |
打印 |
參數1:對象 |
無 |
輸出到控制台 |
字符串參數 |
key 參數的key |
string |
|
數值參數 |
key 參數的key |
Double |
|
整數參數 |
key 參數的key |
Int32 |
|
3.5、自定義函數-OK
項目中如果需要公用的函數,則可以在項目中的:RuleExtConfig.txt文件中進行擴展使用如下:
double 重量轉換(double weight) { return ExtRule.重量轉換(weight); } |
我們再修改一下(或新增)RuleExt.cs類,增加:ConvertWeight方法
using System; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text;
namespaceTony.DEMO.Business { publicclassRuleExt { publicdoubleConvertWeight(double weight) { return weight / 1000; } } }
|
同時要記錄在Program或Global.asax入口類增加如下代碼:
//3.第三步,初始擴展的業務規則引擎方法
SNF.Business.BaseRule.ExtRule = new Tony.DEMO.Business.RuleExt();
規則配置時使用方式如下:
四、規則表
用戶可在系統中自定義數據存儲表,二維結構,由行列組成,可將一些靈活多變的數據配置於規則表中供規則使用
1. 規則表的列由三個部分構成:
a)綁定參考項:可綁定平台、倉庫,適用於多平台規則表獨立維護數據;前台不可見,自動取Session中的值賦值;不是必須的。
b)查找參考項:是規則表的查詢條件,使用時每個查找項必須全部匹配才能得到既定的結果;不是必須的。
c)值參考項:是規則表的返回值;必須的。
4.1、一般規則表
1. 新建一個規則表,規則表名稱:承運商指派規則表,查找項:出發城市、目的城市,值項:承運商代碼、承運商名稱
出發地 |
目的地 |
費用 |
上海 |
蘇州 |
200 |
我們根據這個表進行查找費用。
string feiyong = 單值查表("運費表","費用",字符串參數("出發地"),字符串參數("到達地"));
|
說明:通過查表函數調用:運費表,按查找項的順序依次傳入參數,即可查詢得到對應的數據。
4.2、等級規則表
等級規則表就是:規則表的列中存在區間值,當調用查表函數時加入符號匹配。
根據上面的費用規則表擴展一下,我們得到:
- 規則表名稱:費用表,查找項:出發地、目的地、重量下限、重量上限,值項:費用
出發地 |
目的地 |
重量下限 |
重量上限 |
費用 |
上海 |
蘇州 |
20 |
200 |
200 |
string feiyong = 單值查表("運費表","費用",字符串參數("出發地"),字符串參數("到達地"),"<=" + 字符串參數("重量"),">=" +字符串參數("重量"));
返回列表("費用", feiyong ); |
4.3、多值規則表
多值規則表就是:根據同一組查找項能夠查詢得到一個結果集,一般用於某個結果集中存在優先級的時候
根據上面的費用表擴展一下,我們得到:
1. 規則表名稱:費用表,查找項:出發地、目的地、重量下限、重量上限,值項:費用
出發地 |
目的地 |
重量下限 |
重量上限 |
費用 |
上海 |
蘇州 |
20 |
200 |
200 |
上海 |
蘇州 |
201 |
300 |
300 |
具體實例日后完善
4.4、規則表版本
當定義好規則表之后我們還需要為規則表新建一個版本才能夠真正的使用規則表。規則表版本使得規則表在一段時間內是有效的,當過了有效期之后如果再調用就無法找到,類似於合同的期限。
比如:同一個規則表可能存在多個版本,在使用的過程中,框架會自動根據當前日期去匹配:在版本開始日期和結束日期之內的一個版本。
五、數據源
5.1、調用Sql腳本
在我們的規則里面除了一些自然方法外,我們還可以寫C#方法。甚至可以直接執行sql腳本進行更新數據操作。
傳入的參數當中有如下兩個數據庫連接,可以利用數據庫連接對數據庫進行操作。
IDbHelper dbHelper //業務數據庫
IDbHelper userDbHelper//用戶中心數據庫
如:
DataTabledtData = this.DbHelper.Fill("select * from baseuser");
int r = this.DbHelper.ExecuteNonQuery("UPDATE BaseUser SET Code='' WHERE Id= 1"); |
5.2、調用服務層
在規則里還可以直接調用服務層代碼。
如:
stringstateCode, message; DemoFeiYongEntity entity = new DemoFeiYongEntity(); entity.Type = 參數集["業務類型"].ToString(); entity.Money= 數值(參數集["運費"]); entity.Description = "測試哦"; SNFService.Instance.CreateService<DemoFeiYongService, IDemoFeiYongService>().Add(當前用戶, entity, out stateCode, out message); |
六、規則相關程序使用手冊
6.1、規則表設計
在某些業務場景下,經常會遇到通過查表來進行邏輯判斷。為保證規則開發過程的靈活性,通過“規則表設計”可以很快的根據業務需求設計出一個規則表結構,並且可以設計規則表中的字段的各項屬性。說明:“參考項”即為字段的列名,“類型”分為查找參考項和值參考項(使用方法參照3.4小結),“參考條件類型”為字段存儲數據的類型,如果為枚舉類型在“枚舉值”中可以存儲枚舉數據(各項用逗號隔開)。
以WMS項目中“上架分配規則”為例,業務需求:上架時可以根據不同的物料分類,上架時要指定固定的倉庫、區域和一定范圍內的貨位。根據以上要求可以創建規則表如下圖所示:
6.2、規則表管理
當“規則表”設計完成后,在“規則表管理”畫面中可以維護規則表中的業務邏輯數據,維護數據時以時間段為基准,每個時間段都可以創建一個數據表。調用規則時系統會根據當前時間,找到在時間段內的數據表,獲取此時間范圍內的業務邏輯數據。這樣可以提前設計未來一段時間內的業務邏輯,系統可以根據時間自動切換業所對應的務邏輯規則。
明細,對規則表增加數據行。
6.3、規則配置
“規則配置”畫面主要負責完成具體規則程序的編寫,定義的名稱即為業務程序所有調用的規則名。具體規則編寫方法參照以上各小節使用說明,此外還需要注意以下幾點:
- 只有在平台下線狀態才能編輯規則。
- 每一規則至少要有一個主規則,可以有多個子規則。
- 規則編寫完后要進行上線,並且要重新登錄系統后才能加載到最新規則。
注意:規則名稱要是連接的字母(a-zA-Z)或者漢字
在配置規則里,可以參照“4.規則表”進行調用。
6.4、規則日志
在規則日志畫面里可以看到規則在執行過程中通過“打印”函數輸出的變量的結果。由於在規則調試過程中無法使用斷點,但在關鍵節點仍然需要對程序執行過程中的中間變量進行跟蹤。此時可以把所需要查看的變量通過打印函數進行輸出,在規則日志中就會看到所打印的結果,從而達到調試程序的目的。規則日志結果如下圖所示:
七、測試程序
BS程序調整說明 http://www.cnblogs.com/spring_wang/p/6740490.html
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
作者: 王金斗 出處: http://www.cnblogs.com/spring_wang/ Email: spring_best@yeah.net QQ:903639067
QQ群:322581894
這個系列教程文檔,歡迎轉載:
SNF快速開發平台WinForm-CS甘特圖http://www.cnblogs.com/spring_wang/p/7418423.html
SNF快速開發平台MVC-審核流,審核完成后會給下一個審核人發郵件,下一個審核人可以不登錄系統,在郵件里進行審核處理http://www.cnblogs.com/spring_wang/p/7418402.html
SNF快速開發平台MVC-名片管理(實際名片樣式) http://www.cnblogs.com/spring_wang/p/7416540.html
SNF快速開發平台MVC-表格單元格合並組件http://www.cnblogs.com/spring_wang/p/7416368.html
SNF快速開發平台MVC-單據狀態水印http://www.cnblogs.com/spring_wang/p/7416349.html
SNF快速開發平台MVC-瀑布式分頁組件http://www.cnblogs.com/spring_wang/p/7411116.html
SNF快速開發平台MVC-高級查詢組件http://www.cnblogs.com/spring_wang/p/7411113.html
SNF快速開發平台MVC-自由排序組件http://www.cnblogs.com/spring_wang/p/7411090.html
SNF快速開發平台MVC-各種級聯綁定方式,演示樣例程序(包含表單和表格控件)http://www.cnblogs.com/spring_wang/p/7405371.html
SNF快速開發平台MVC-集成了百度開源項目echarshttp://www.cnblogs.com/spring_wang/p/7405171.html
SNF快速開發平台WinForm-平板拍照及掃描二維碼功能http://www.cnblogs.com/spring_wang/p/7404600.html
SNF快速開發平台WinForm規則引擎整體介紹及使用http://www.cnblogs.com/spring_wang/p/7404182.html
SNF快速開發平台WinForm-Grid表格控件大全http://www.cnblogs.com/spring_wang/p/7403881.html
SNF快速開發平台WinForm-表單驗證控件-通用http://www.cnblogs.com/spring_wang/p/7403750.html
SNF.CodeGenerator-升級生成BS頁面代碼-支持視圖-數據庫配置-快速開發者的利器http://www.cnblogs.com/spring_wang/p/7402612.html
SNF快速開發平台WinForm-審核流使用方法樣例http://www.cnblogs.com/spring_wang/p/7374176.html
SNF快速開發平台WinForm-EasyQuery統計分析-效果-非常牛逼的報表查詢工具http://www.cnblogs.com/spring_wang/p/7366059.html
SNF快速開發平台MVC-Grid++集成打印http://www.cnblogs.com/spring_wang/p/7365567.html
SNF快速開發平台MVC-富文本控件集成了百度開源項目editorhttp://www.cnblogs.com/spring_wang/p/7365265.html
C#按回車Enter使輸入焦點自動跳到下一個TextBox的方法收集http://www.cnblogs.com/spring_wang/p/7216538.html
關於系統前端開發的那些事http://www.cnblogs.com/spring_wang/p/7092721.html
WebApi和MVC-controller層接收的json字符串的取值方法和調用后台服務方法http://www.cnblogs.com/spring_wang/p/6740314.html
SNF快速開發平台--規則引擎在程序當中如何調用http://www.cnblogs.com/spring_wang/p/6740490.html
SNF快速開發平台--規則引擎介紹和使用文檔http://www.cnblogs.com/spring_wang/p/6740445.html
SNF快速開發平台MVC-EasyUI3.9之-DataGrid表格控件如何增加右鍵菜單http://www.cnblogs.com/spring_wang/p/6740338.html
SNF快速開發平台--多組織+多平台+多系統處理方案http://www.cnblogs.com/spring_wang/p/6734654.html
SNF快速開發平台MVC-EasyUI3.9之-Session過期處理和頁面請求篩選http://www.cnblogs.com/spring_wang/p/6733975.html
SNF快速開發平台MVC-EasyUI3.9之-WebApi身份驗證問題解決方案http://www.cnblogs.com/spring_wang/p/6733814.html
SNF快速開發平台MVC-EasyUI3.9之-WebApi跨域處理方案http://www.cnblogs.com/spring_wang/p/6733659.html
SNF快速開發平台MVC-EasyUI3.9之-ueditor富文本編輯在 asp.net MVC下使用步驟http://www.cnblogs.com/spring_wang/p/6710351.html
SNF開發平台WinForm之十五-時間軸控件使用-http://www.cnblogs.com/spring_wang/p/6285393.html
SNF開發平台WinForm之十四-站內發送系統信息http://www.cnblogs.com/spring_wang/p/6140031.html
SNF開發平台WinForm之十三-單獨從服務器上獲取PDF文件進行顯示http://www.cnblogs.com/spring_wang/p/6140025.html
SNF開發平台WinForm之十二-發送手機短信功能調用http://www.cnblogs.com/spring_wang/p/6139829.html
SNF開發平台WinForm之十一-程序打包http://www.cnblogs.com/spring_wang/p/6139827.html
SNF開發平台WinForm之十-Excel導入http://www.cnblogs.com/spring_wang/p/6128604.html
SNF開發平台WinForm之九-代碼生成器使用說明http://www.cnblogs.com/spring_wang/p/6128595.html
SNF開發平台WinForm之八-自動升級程序部署使用說明http://www.cnblogs.com/spring_wang/p/6128570.html
SNF開發平台WinForm之七-單據打印和使用說明http://www.cnblogs.com/spring_wang/p/6126016.html
SNF開發平台WinForm之六-上傳下載組件使用http://www.cnblogs.com/spring_wang/p/6125929.html
SNF開發平台WinForm之五-高級查詢使用說明-http://www.cnblogs.com/spring_wang/p/6116640.html
SNF開發平台WinForm之四-開發-主細表管理頁面-http://www.cnblogs.com/spring_wang/p/6116626.html
SNF開發平台WinForm之三-開發-單表選擇控件創建-http://www.cnblogs.com/spring_wang/p/6116592.html
SNF開發平台WinForm之二-開發-單表表單管理頁面-http://www.cnblogs.com/spring_wang/p/6116572.html
SNF開發平台WinForm之一-開發-單表表格編輯管理頁面-http://www.cnblogs.com/spring_wang/p/6116523.html
Winform開發框架之通用Windows攝像頭調用拍照http://www.cnblogs.com/spring_wang/p/6008674.html
Winform開發框架之圖表報表在線設計器2-圖表-SNF.EasyQuery項目--SNF快速開發平台3.3-Spring.Net.Framework
Winform開發框架之圖表報表在線設計器-報表-SNF.EasyQuery項目--SNF快速開發平台3.3-Spring.Net.Framework
Winform開發框架之通用附件管理模塊 --SNF快速開發平台3.3-Spring.Net.Framework
SNFAutoupdater通用自動升級組件V2.0-WinForm
SNF快速開發平台3.2之--.Net可擴展的單據編號生成器-SNF.CodeRule
SNF快速開發平台3.1之--審核流(3)低調奢華,簡單不凡,實例演示-SNF.WorkFlow
SNF快速開發平台3.1之--審核流(2)流程設計-SNF.WorkFlow功能使用說明
SNF快速開發平台3.1之--審核流(1)SNF.WorkFlow審核流簡介
SNF快速開發平台3.0之--完美的代碼生成器SNF.CodeGenerator-快速開發者的利器
基於MVC4+EasyUI的Web開發框架--Spring.Net.FrameworkV3.0總體介紹
SNF快速開發平台3.0之--文件批量上傳-統一附件管理器-在線預覽文件(有互聯網和沒有兩種)
SNF快速開發平台3.0之--asp.net mvc4 強大的導出和不需要上傳文件的批量導入EXCEL
SNF快速開發平台3.0之MVC通用控件庫展示-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout
SNF快速開發平台3.0之BS頁面展示和九大優點-部分頁面顯示效果-Asp.net+MVC4.0+WebAPI+EasyUI +Knockout
SNF快速開發平台3.0之-界面個性化配置+10種皮膚+7種菜單-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout