崔歡歡 黃偉 舒江波
摘 要:目前大部分工資系統的計算方法采用硬編碼方式,與工資政策結合過于密切,系統適用性、重用性不高,更新維護困難。針對這一問題,提出了一種基于規則引擎的自適應工資系統。首先,結合Drools規則引擎組件建立一個可執行的規則庫,將規則庫與現實中的業務需求及政策一一對應;然后通過規則流控制規則的執行,使其更靈活地適應計算邏輯的變化,推動了工資系統的解耦合擴展和更新。根據規則引擎得到的規則文件,可經自然語言處理作為規則文檔使用,極大降低了政策變化與系統功能同步更新難度,具有較高的實用價值。
關鍵詞:工資系統;規則引擎;規則;規則流;適應性
DOI:10.11907/rjdk.172889
中圖分類號:TP319
文獻標識碼:A 文章編號:1672-7800(2018)006-0102-04
Abstract:At present,hard-coding is adopted in most payroll system, it is too dependent on wage policy,which makes the system dificult to update and maintain.To slove this problem, this paper prensents a payroll system based on rules. First, we establish a executable rule base with the Drools rules engine components , the rule base corresponds to business requirements and policies; then, the execution of regular flow control rules can make it more flexible to adapt to the changes of calculation logic. It is proved that the system can promote the decoupling, the expansion and update of the salary system. In addition, the rule file can be changed into rule documents by natural language processing, which greatly reducing the policy change and system update difficulty, has a strong practical value.
Key Words:payroll system; rules engine; rule; rule flow; adaptability
0 引言
軟件行業發展至今,靈活性和適應性愈加重要。設計模式、極限編程、敏捷軟件開發、Rup等,無一例外地強調了靈活和變化的重要性。
Drools是為Java量身定制的基于Charles Forgy的RETE算法規則實現[1],具有OO接口的RETE使商業規則有了更自然的表達,很多Java的應用系統中已開始引入Drools規則引擎以提高系統適應性。
本文以機關事業單位網絡工資管理系統開發為例,建立與工資政策相適應的規則,減少硬編碼,實現編碼與規則的解耦合[2], 以規則庫對應工資政策。通過對規則的管理和系統的重新設計,實現具有自適應性的網絡工資管理系統。
1 相關技術
1.1 規則引擎
規則引擎[3]一直以來沒有明確定義,因為規則引擎的廣義定義使得規則引擎范圍很大,包括以任何形式使用并能應用于生成數據結果的規則系統。本文的規則引擎是一種嵌入在應用程序中的組件,它主要負責利用用戶抽取的業務邏輯,按預先定義好的語義編寫業務規則,執行預定義流程,完成一定的檢測和執行功能。同時規則引擎還提供一些輔助性插件,如繪制規則流插件、調試插件等。
Java規則引擎作為一個軟件插件,可管理和執行業務規則、存儲規則,主要包括規則的語法形式、規則的組織形式、規則執行前的標識中間形式以及規則執行中的內存申請管理,具有聲明式編程、邏輯和數據分開、性能高、集中表示知識、不用硬編碼等優點。
1.2 Drool5.0介紹
1.2.1 業務規則
業務規則[4-5] (BusinessRule,簡稱BR)指包含一組條件和在此條件下執行的操作,表示應用程序的一段業務邏輯。Drools中每個規則結構如圖1所示。
1.2.2 規則流
Drools提供了很多元素以控制規則的執行順序,比如優先級、Active-group等。如果項目越來越大,規則越來越復雜,單純靠優先級和Active-group是很難維護的,Ruleflow可輕松地控制規則的執行順序,類似工作流那樣,將規則集中、分批管理和組織。Ruleflow還提供了Join、Split、條件判斷等復雜條件。圖2是一個規則流例子[6]。
1.2.3 規則執行
編寫完規則和規則流后,建立相應的drl、rf 、rfm或xml文件,這些文件將由一個Antlr3 的文法解析器檢測是否存在錯誤。正確性檢測后建立一個規則描述descr的中間結構,文法解析器將descr傳入PackageBuilder 中,由它來打包生成Package[7-8]。規則執行流程如圖3所示。
2 工資管理系統規則庫模型設計
2.1 工資管理系統中的規則
規則的分類思想較多,最具有代表性的是由James Odell提出的分類思想,該思想較為實用和全面。在對系統進行分析時,要對系統中的內容進行分析,確定規則是表示對象與對象之間的關系,還是表示系統運算邏輯或是商業邏輯,區分情況進行管理。該思想將規則分為6類:
(1)條件型:這類規則用來限制對象所處環境,設置對象為真還是為假,比如WHEN……IF……ELSE。
(2)充分型:這類規則表示當且僅當的條件,只有條件為真時才執行,比如ONLY,IF。
(3)必要型:用例后置規則是表示用例執行結果的規則,它只關心用例執行的結果。比如:Finally。
(4)關聯關系型:對象約束規則表示對象與對象之間的關系,有一對多、多對一、多對多等,還包含依賴、集成、聚合等關系。
(5)推理型:推理顧名思義是由條件A滿足時需要經過多個條件的比對才能得出結果。
(6)公式型:這類規則來自公式或算法的結果,比如:工資=基本工資+津貼+邊遠津貼-納稅。
2.2 系統規則流
規則流與工作流的區別在于解決問題的中心不一樣。如果流程經常變化,建議用工作流,如果流程變化較少而流程中的內容變化較大建議用規則流。一般規則流的變更并不頻繁,因此使用規則流。經過分析后一旦決定就不輕易變化,對于有變化的內容應該盡量用規則來處理。系統規則流分層如圖4所示。
2.3 規則文件組織與管理
規則管理是整個工資系統的核心。對工資系統的業務模式、業務規則以及影響工資計算的各種參數作充分分析,并以此建立基礎構建規則庫模型和基于規則庫的推理機制,同時將規則庫進行分類管理,實現規則的可配置管理。
2.3.1 規則的分類組織
工資系統依賴大量的政策文件,本文對政策文件進行分類管理,由規則包→規則文件→規則,由大到小進行分類和編號,提供規則管理界面,方便用戶修改規則和加入新的規則,見表1。
2.3.2 規則的沖突檢測與處理
沖突分為3種:①兩條規則條件中的關系運算完全相同;②兩條規則中的關系運算有交集而數值不同[7];③執行規則中順序不當或混亂導致規則匹配出錯。本文對沖突處理的方式如圖5所示。
3 系統設計與建模
3.1 激活規則庫
Drools支持多種規則文件格式,如drl、dsl和xml等。其中,drl格式為Drools規則引擎的標準格式。Drl語法簡單,格式固定,屬性理解方便,因此可讀性較強。本文的所有規則文件均以drl文件的形式存儲,但是對于各類人員的規則,具體到某一個單位時,只會用到部分規則,因此本文用數據庫存儲可以激發的規則文件。某一條規則是否激活有兩種狀態:已激活和未激活。
3.2 規則過濾器
工資計算時面對大量的規則,如何根據具體的人去選擇規則,僅僅靠規則引擎是不能完成的。它需要規則過濾器提取規則相關信息,檢測規則執行時的沖突,處理沖突。同時規則過濾器還擔當規則的預處理,根據人員的相關信息選取可能匹配的規則等。規則過濾流程如圖6所示。
3.3 規則管理平臺
規則管理界面中,業務規則編碼是添加規則時自動生成的規則編號,這個規則編號蘊含規則的相關信息,是規則文件的唯一標識。規則名稱是規則的說明性名稱,以方便用戶理解規則,規則執行狀態表示規則目前所處的狀態,規則類別記錄了規則所屬人員的類別,創建時間是最后一次修改規則的時間。
4 結語
本文進行了如下研究:
(1)規則引擎與工資計算相結合。規則引擎是人工智能領域專家系統的應用[9],與工資系統結合,提高了工資系統的智能性。
(2)根據jsr94語法規則,運用Drools插件[10]編寫了大量的工資系統相關政策文件規則,將工資政策直接與規則相關,將計算流程直接與規則流相關。
(3)提供規則管理界面。管理員利用規則管理界面可以方便地查看規則、修改規則、添加規則、配置規則,以適應新的政策變化。
(4)設置規則激活庫以適應不同單位的需要,激活規則由管理員進行配置和激活。
(5)設計規則過濾器,實現了規則文件、規則流和具體人員結合,通過規則過濾器解決執行時的沖突,調用規則流執行。
(6)高可擴展性。基于規則的系統本身就具有很好的擴展性能,脫離硬編碼后,依賴規則的方式擴展時只需要加入新的規則即可。
有待進一步研究的內容是:①規則沒有充分做到自然語言化,如果能做到自然語言化,那么規則的編輯與修改就會變得更加容易;②規則流管理基于Drools提供的myeclispe插件,因此規則流的修改還需要程序人員參與;③目前規則的生成,主要靠懂政策的人手動編寫,如果能設計一個通用的規則生成器用以生成規則,就會減少工作量,使規則編寫更加方便。
參考文獻:
[1] JOSEPH GIARRATANO,GARY RILEY.專家系統:原理與編程[M].印鑒,譯.第4版.北京:機械工業出版社,2010.
[2] 何仁杰,梁冰.用規則引擎替代代碼[N].計算機世界,2004-01-19.
[3] Drools開發手冊[EB/OL]. http://down.51cto.com/data/473041.
[4] TONEY MORGAN.Business rules and information systems:aligning it with business goals[M].Boston:Addison-wesley Professional,2002:34-63.
[5] RONALD G ROSS.業務規則方法原理[M].北京:機械工業出版社,2004.
[6] Drools官網[EB/OL].http://drools.org/download/download.html.
[7] 張宇,陳德禮.基于Drools的策略體系設計[J].福建電腦,2007(10):11-12.
[8] 劉金龍.Drools規則引擎模式匹配效率優化研究與實現[D].成都:西南交通大學,2016.
[9] 李春芳,譚慶平.面向業務的Drools規則引擎改進[J].計算機應用與軟件,2015(5):20-23.
[10] 劉金龍.Drools規則引擎模式匹配效率優化研究與實現[D].成都:西南交通大學,2015.
(責任編輯:杜能鋼)