`
javashop
  • 浏览: 40836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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)原创文章

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics