脚本的生成过程
添加模板的时候生成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; }