腳本的生成過程 添加模板的時候生成script,商家添加商品的時候拷貝相應的script到sku中。 更新運費模板的時候,發消息到消費者,批量更新相關sku的模板信息。 計算過程 緩存數據結構 script和模板id作為sku的一部分存儲是為了計算使用相同模板的sku的總價。 腳本示例 functi ...
腳本的生成過程
添加模板的時候生成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;
}