最近項目有個需求,需要執行一個方法,方法的目的是輸入一個金額XXX,根據抹零方式算出抹零後的金額,但是有個問題,困難場景:上游又獲取不到抹零的方式;下游又獲取不到XXX這個金額;這個時候需要寫一個Groovy腳本,他有一個入參變量XXX,爲抹零前的金額,我們在腳本中根據XXX、抹零方式給我計算邏輯;然後將這個腳本傳遞給上游調用。
處理方式:
下游寫Groovy腳本:
if("00".equals(molingPattern) || "10".equals(molingPattern)){ //舍掉角(規則:精確到元位,角位四捨五入)
scriptString = "priceAfterMoling = priceBeforeMoling.setScale(0, BigDecimal.ROUND_HALF_UP);";
} else if("01".equals(molingPattern) || "11".equals(molingPattern)){//舍掉分(規則:精確到角位,分位四捨五入)
scriptString = "priceAfterMoling = priceBeforeMoling.setScale(1, BigDecimal.ROUND_HALF_UP);";
}
上游獲取到這個腳本後,傳遞一個抹零前金額priceBeforeMoling,進行執行:
Binding binding = new Binding();
binding.setVariable("priceBeforeMoling", BigDecimal.valueOf(99.99));
GroovyShell shell = new GroovyShell(binding);
String scriptString = getScrpitMethod();//通過某種方式獲取到
shell.evaluate(scriptString);
BigDecimal priceAfterMoling = (BigDecimal) binding.getProperty("priceAfterMoling");
System.out.println("priceAfterMoling:"+priceAfterMoling);
需引入jar包:
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import groovy.lang.Script;
pom.xml文件添加依賴:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>2.1.6</version>
</dependency>
上游處理還有另外一種寫法,給出代碼做參考:
Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
//直接方法調用
Script script = shell.parse("def calculate(BigDecimal priceBeforeMoling) {return priceBeforeMoling.setScale(0, BigDecimal.ROUND_HALF_UP);}");
BigDecimal result = (BigDecimal)script.invokeMethod("calculate", BigDecimal.valueOf(0.0001));
System.out.println(result);
根據groovy腳本方法的返回值來得到,而不是通過binding.getProperty來獲取。這種寫法對於只有一個返回值的比較方便,如果需要獲取多個值,可能上面的會好一點,至於哪個性能好,沒有測試過~相關博文:
http://www.cnblogs.com/zz0412/p/Groovy001.html
http://blog.csdn.net/haigenwong/article/details/22947173