java 商城系統-基於腳本引擎的運費架構分享

腳本的生成過程

在這裏插入圖片描述

添加模板的時候生成script,商家添加商品的時候拷貝相應的script到sku中。

在這裏插入圖片描述

更新運費模板的時候,發消息到消費者,批量更新相關sku的模板信息。

計算過程

在這裏插入圖片描述

緩存數據結構

在這裏插入圖片描述

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

領域模型

在這裏插入圖片描述

僞代碼

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;


    }

易族智匯(javashop)原創文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章