zoukankan      html  css  js  c++  java
  • 基于脚本引擎的运费架构分享

    脚本的生成过程

    image-20190906115322960

    添加模板的时候生成script,商家添加商品的时候拷贝相应的script到sku中。

    image-20190906120058398

    更新运费模板的时候,发消息到消费者,批量更新相关sku的模板信息。

    计算过程

    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;
    
    
        }
  • 相关阅读:
    数据库主从同步相关问题
    前端使用node.js的http-server开启一个本地服务器
    css中height 100vh的应用场景,动态高度百分比布局,浏览器视区大小单位
    通过浏览器F12开发工具快速获取别的网站前端代码的方法
    vue打包app嵌入h5,区分app进入和android,ios显示不同的下载链接
    vue实现验证码倒计时60秒的具体代码
    vue用hbuilderX打包app嵌入h5方式云打包和遇到的问题
    Cookie写不进去问题深入调查 https Secure Cookie
    vue配置手机通过IP访问电脑开发环境
    区块链名词解析:ICO、IFO、IEO和IMO,分别是什么呢?
  • 原文地址:https://www.cnblogs.com/javashop-docs/p/12595148.html
Copyright © 2011-2022 走看看