腳本的生成程序

添加模板的時候生成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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/5981.html
標籤:架構設計
