基於腳本引擎的運費架構分享

腳本的生成過程

image-20190906115322960

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

image-20190906120058398

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

計算過程

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; }
相關文章
相關標籤/搜索