Groovy调用示例
项目背景介绍: 由于某电商网站的数据量比较大,价格体系变更频繁,因此采用Groovy语言对价格统一展示,设计一个价格引擎具体如下: 一 、控制层中调用Groovy脚本 ? ? ? ? ? ? ? ? ObjectMapper mapper = new ObjectMapper(); ? 二、CalculateManager 接口类 public enum CalculateManager { 三、获取Groovy驱动 import java.math.BigDecimal;
三、CalculateContext ?类,将待传递到Groovy中的参数封装到Map中 public class CalculateContext { 四、数据中groovy脚本文件 import groovy.json.JsonSlurper; import org.leafframework.data.dao.orm.TGGoodsPrice; import org.springframework.util.StringUtils; import java.text.DecimalFormat; def params = new JsonSlurper().parseText(inparams.params) ; //data 数据格式:商品ID,数量; String pricecode=inparams.priceCode; String custtype=inparams.custType; String custlvl=inparams.custLvl; String data = params.data; def ? ?mybatis=dao.myBatisDAO; def result=[:]; double orderAmont=0.0; double feecardAmont=0.0; double numrateAmont=0.0; double userDiscAmont=0.0; double realOrderAmont=0.0; if((!StringUtils.isEmpty(data))) { String[] goodslist = data.split(";"); double diectPrice = 0.0; for(String str:goodslist) { String[] goods = str.split(","); String goodsId=goods[0]; int count = Integer.valueOf(goods[1]); def priceList = mybatis.getGoodsPrice(["pricecode":pricecode?.trim(),"goodsId":goodsId?.trim()]); if(priceList.size()==0) { priceList = mybatis.getGoodsPrice(["pricecode":"0001","goodsId":goodsId?.trim()]); } double nrAmont=0.0; double feAmont=0.0; double orAmont=0.0; for(def goodprice:priceList) { double price ? = goodprice.getValue(); int ? ?code ? ?= goodprice.getCode(); int ? ?min ? ? = 0; int ? ?max ? ? = 0; double disc ? ?= 0.0;? double feecard = 0.0;? println count+" : "+price; if( goodprice.getNumMin()!=null) { min = goodprice.getNumMin(); } if( goodprice.getNumMax()!=null) { max = goodprice.getNumMax(); } if( goodprice.getDiscount()!=null) { disc = goodprice.getDiscount(); } if( goodprice.getFeecard()!=null) { feecard = goodprice.getFeecard(); } //println price +":"+code +": ?"+min+":"+max+" ?:"+ disc+":"+feecard; if( count >=min && count<=max ) { println "1sssssss:"+disc;? if( disc!=null &&( disc >0 && disc<1) ) { nrAmont=(count*(price-feecard))*(1-disc); } feAmont = count*feecard; orAmont = price*count; println nrAmont+" : "+ feAmont+":"+orAmont;? break; } if( code == 1) { println "2sssssss:"+disc;? if( disc!=null && (disc >0 && disc<1 )) { nrAmont=(count*(price-feecard))*(1-disc); } feAmont =count*feecard; orAmont =price*count; } } orderAmont ? =orderAmont+orAmont; feecardAmont =feecardAmont+feAmont; numrateAmont =numrateAmont+nrAmont; } def custdisc = mybatis.getCustDisc( custlvl ); double userrate=custdisc.get(0).getDiscount(); if( userrate >0 && userrate<1 ) { userrate=custdisc.get(0).getDiscount(); userDiscAmont= (1-userrate)*(orderAmont-feecardAmont-numrateAmont); println "user: "+userrate+" : "+ (orderAmont-feecardAmont-numrateAmont); } realOrderAmont=orderAmont-feecardAmont-numrateAmont-userDiscAmont; } DecimalFormat df = new DecimalFormat(".00"); result.feecardAmont ? ?=Double.parseDouble(df.format( feecardAmont) ); result.numrateAmont ? ?=Double.parseDouble(df.format( numrateAmont) ); result.userDiscAmont ? =Double.parseDouble(df.format( userDiscAmont) ); result.orderAmont ? ? ?=Double.parseDouble(df.format( orderAmont) ); result.realOrderAmont ?=Double.parseDouble(df.format( realOrderAmont) ); result; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |