最近项目有个需求,需要执行一个方法,方法的目的是输入一个金额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