如何在报表中实现算法的可挂接需求
在報表項目中,有些報表中部分數(shù)據(jù)的計算方法會經(jīng)常改變。例如:某企業(yè)員工的實際工資是通過績效得分計算出的,而績效的算法可能經(jīng)常變動,需要在不改動其他代碼的情況下用新算法替換舊算法。一般我們都會想到用 Java 來實現(xiàn)計算,從而實現(xiàn)動態(tài)可掛接計算模塊,但是這種方式可能存在缺乏基礎類庫、占用多余內存等問題。
這里我們介紹一種可以實現(xiàn)低耦合、熱部署的動態(tài)掛接算法,使得解決此類問題更具結構性優(yōu)勢,這就是結合集算器使用潤乾報表。下圖對比了潤乾報表實現(xiàn)的可掛接算法和其他報表工具 +java 實現(xiàn)可掛接算法的在系統(tǒng)結構上的差異:
可以看出,java 程序必須要編譯、打包才能更新,無法實現(xiàn)熱部署。而集算腳本是解釋執(zhí)行的,腳本文件同時也是可執(zhí)行文件,所以可以直接進行替換更新。同時,集算腳本可以和報表模板成對存放,在代碼管理上更為清晰、便利。
下面就用員工績效工資的例子來說明潤乾報表的實現(xiàn)方法,并和其他報表工具 +Java 的實現(xiàn)方式做一下比較。
員工績效工資報表如下:
報表格式比較簡單,但是計算方法相對復雜,而且經(jīng)常變動,算法部分需要動態(tài)掛接才能滿足需求。
具體實現(xiàn)步驟如下:
1、編寫集算器腳本
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??| ? | A | B | C |
| 1 | =connect("demo") | ? | ? |
| 2 | =A1.query("select p.EMPLOYEEID as empID, p.EVALUATION as score,e.dept as dept, e.NAME as empName,p.BONUS as baseSalary ?from performance as p,employee as e where p.EMPLOYEEID=e.EID ?and e.gender=?",gender) | ||
| 3 | =A2.derive(PRETAX) | ? | ? |
| 4 | =sales=A3.select(DEPT=="Sales") | ? | |
| 5 | for sales | if A5.BASESALARY<2000 | >A5.PRETAX=A5.BASESALARY*(1+A5.SCORE/100) |
| 6 | ? | else if A5.BASESALARY<4000 | >A5.PRETAX=A5.BASESALARY*(1+A5.SCORE*0.9/100) |
| 7 | ? | else if A5.BASESALARY<6000 | >A5.PRETAX=A5.BASESALARY*(1+A5.SCORE*0.8/100) |
| 8 | ? | else | >A5.PRETAX=A5.BASESALARY*(1+A5.SCORE*0.6/100) |
| 9 | =normal=A3.select(DEPT!="Sales") | ? | |
| 10 | =A9.run(PRETAX=BASESALARY) | ? | |
| 11 | =sales|normal | ? | ? |
| 12 | =A11.new(EMPNAME,BASESALARY,PRETAX) | >A1.close() | |
| 13 | result A12 | ? | ? |
A2 單元格有個輸入?yún)?shù) gender,來自于查詢頁面。A13 單元格是將結果返回給報表頁面。A2 到 A12 之間是績效工資的計算方法,具體算法不是本文重點,這里不詳細介紹,只要知道這部分可以隨時替換就可以了。
2、配置報表數(shù)據(jù)集
潤乾報表的報表模板可以定義集算器數(shù)據(jù)集來調用可掛接計算模塊:
其中,gender 參數(shù)是 dynamic.dfx 的輸入?yún)?shù),數(shù)據(jù)集 ds1 接收 dynamic.dfx 返回的結果集。
可以看到集算器腳本 dynamic.dfx 和報表模板之間的耦合程度非常低。如果要改變績效工資的計算方法,只需要編寫一個新的 dynamic.dfx,替換服務器上原有的 dfx 文件即可。因為 dfx 腳本是解釋執(zhí)行的,所以可以不停機替換,實現(xiàn)真正的熱部署。
3、設計報表模板
在潤乾報表設計器中像使用普通數(shù)據(jù)集一樣設計報表模板即可。如下圖所示:
從這個例子可以看出潤乾報表實現(xiàn)的可掛接算法,相比普通報表工具 +Java 的實現(xiàn)方式有多方面的優(yōu)勢。
1、dynamic.dfx 可以使用潤乾報表提供的多種函數(shù)方法:分組、匯總、排序、過濾、關聯(lián)、唯一值、交集、排名等等。Java 程序員必須手工編寫這些基礎算法。而將這些基礎算法直接實現(xiàn)在業(yè)務邏輯中顯然是不合理的,因為這會導致每個計算模塊重復書寫類似的代碼,使得計算模塊過于龐大、可讀性變差。理想的作法是先實現(xiàn)一套基礎算法類庫,再在計算模塊中調用,而應用程序員很難設計出完備性和系統(tǒng)性優(yōu)秀的基礎算法類庫,因此常常使代碼的耦合性高,穩(wěn)定性差,最終導致計算模塊維護困難。
潤乾報表的集算引擎本身就是這樣一套精心設計的完備基礎類庫,經(jīng)過簡單的學習,應用程序員只需要 JAVA 十分之一的代碼量就可以實現(xiàn)同樣功能的計算模塊,開發(fā)效率更高。
2、JAVA 代碼需要重新編譯,部署起來比較麻煩;當可掛接的計算模塊較多時,不論是否還要使用它們,這些 Java class/jar 都會占據(jù)內存空間而無法釋放,對性能有一定的影響。
潤乾報表的集算器引擎和腳本文件是分開的,耦合性很低,維護起來更加方便。另外,集算腳本無需編譯即可使用,是真正的熱部署。腳本程序不會事先加載到內存,而是使用時再加載,計算完立刻釋放,不會長期占用內存。
轉載于:https://www.cnblogs.com/IBelieve002/p/10918067.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的如何在报表中实现算法的可挂接需求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 基础 函数
- 下一篇: 从深圳到南阳-13天单骑3000里回家记