基于脚本引擎的运费架构分享

脚本的生成过程

image-20190906115322960

添加模板的时候生成script,商家添加商品的时候拷贝相应的script到sku中。

image-20190906120058398

更新运费模板的时候,发消息到消费者,批量更新相关sku的模板信息。

计算过程

image-20190906120242167

缓存数据结构

image-20190918113303622

script和模板id作为sku的一部分存储是为了计算使用相同模板的sku的总价。

脚本示例

function getShipPrice(){
  var firstWeight=1; //首重 var firstPrice=1; //首重 var continuedWeight=1; //续重 var continuedPrice=1; //续重续费 var shipPrice=firstPrice; //校验是否超出首重 if(firstWeight < $goodsWeight){ //续重 = 总重/续重 var count = ($goodsWeight - firstWeight)/ continuedWeight; //总价 = 首重 + (续重*价格) shipPrice = firstPrice + count*continuedPrice; } return shipPrice; } 
参数 类型 详细
$goodsWeight double 商品总重量
$goodsNum Integer 商品总数

返回值示例 2

领域模型

image-20190911085425395

伪代码

     public Map<Integer, Double> setShippingPrice() {
        //获取购物车信息 Cart cart = cache.get(); //获取购物车中的所有的sku List<Sku> skuList = cart.getSkuList(); //获取所有sku中的key集合,用来批量的从缓存中读取脚本信息 List<String> keyList = getKeyList(skuList); //批量从缓存中读取所有的运费模板 List<TemplateScript> templateScripts = getCache(keyList); //根据模板id进行分组,查询出所有用到相同模板的sku Map<Integer, List<Sku>> maps = group(templateScripts); Iterator iter = maps.entrySet().iterator(); //用来存储每一个商家的运费 Map<Integer, Double> shipPriceMap = new HashMap<>(); Integer sellerId = 0; Double price = 0.0; while (iter.hasNext()) { List<Sku> sList = (List<Sku>) iter.next(); TemplateScript script = sList.get(0).getScript(); //计算总重量 Double goodsWeigth = countWeight(sList); //计算总数量 int goodsNum = countNum(sList); //调用脚本引擎计算价格 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); engine.put("$weight", goodsWeigth); engine.put("$num", goodsNum); String jsFunc = script; engine.eval(jsFunc); Invocable invocable = (Invocable) engine; double shipPrice = (Double) invocable.invokeFunction("price"); price += shipPrice; Integer newselelrid = getSellerId(sList); if (!sellerId.equals(newselelrid)) { //记录这个sellerid的运费价格 shipPriceMap.put(newselelrid, price); sellerId = newselelrid; price = 0.0; } } return shipPriceMap; }

猜你喜欢

转载自www.cnblogs.com/javashop-docs/p/12595148.html