項目中有一個特殊需求,需要根據一定的規則監控可疑的開票,鑑於規則的複雜性以及多變性,放棄硬編碼的想法,引入Drools規則引擎,以規則腳本的形式存放在文件中,使得規則的變更不需要修正代碼重啓機器就可以立即在線上環境生效。規則文件可以使用 .drl文件,也可以是xml文件,這裏我們使用drl文件。接下來就直接上代碼:
第一步:maven引入Drools依賴
第二步:在resources下面的META-INF中創建kmodule.xml
第三步:在resources/rules/suspicious目錄下創建規則文件suspicious.drl,Drools語法可以自行百度。
package com.logic import com.bosssoft.nontax.agency.invoice.domain.ComputerBill import com.bosssoft.nontax.agency.invoice.domain.ComputerBillItem global java.util.Map refuseData rule "baseMessage" no-loop true lock-on-active true salience 1 when ComputerBill(fpayerName contains "部隊" || fpayerName contains "武警") then refuseData.put("filter",true); end rule "baseMessage1" no-loop true lock-on-active true salience 1 when ComputerBill(fbillNature == "1" && ftotalAmt > 100000) then refuseData.put("filter",true); end rule "baseMessage2" no-loop true lock-on-active true salience 1 when ComputerBill(fbillNature == "9" && fbillName contains "資金往來" && (ftotalAmt > 1000000 || fpayerName contains "公司" || fpayerName contains "企業")) then refuseData.put("filter",true); end rule "baseMessage3" no-loop true lock-on-active true salience 1 when ComputerBill(fbillNature == "9" && fbillName contains "捐贈" && (ftotalAmt > 5000000 || fmemo contains "贊助")); then refuseData.put("filter",true); end rule "baseMessage4" no-loop true lock-on-active true salience 1 when $computerBill : ComputerBill(fbillNature == "9" && fbillName contains "捐贈"); ComputerBillItem(fitemName contains "捐贈") from $computerBill.computerBillItemList then refuseData.put("filter",true); end rule "baseMessage5" no-loop true lock-on-active true salience 1 when ComputerBill(fbillNature == "9" && fbillName contains "團體" && ftotalAmt > 100000) then refuseData.put("filter",true); end
第四步:系統調用