redis物流渠道优先(优化方法)

  /**
     * 修改(选择)物流渠道
     * @param int $id
     * @param int $shipping_id
     * @return string
     */
    function check_rule($id, $shipping_id)
    {
        $zipcode = strval(substr($this->db->getValue("SELECT zipcode FROM ".CFG_DB_PREFIX."order where order_id =".$id),0,5));        //获取订单邮编
        $ordersize = $this->ordersize($id);                                                                             //获取长宽高重量

        if ($ordersize['l'] <= 0 || $ordersize['w'] <= 0 || $ordersize['h'] <= 0 || $ordersize['weight'] <= 0) {        //订单的长宽高和重量不可为0或者为空
            return '订单尺寸/重量获取失败';
        }
        $weight = ceil($ordersize['weight'] / 28.3495);                                                                 //订单重量(oz)
        if ($weight > 16) {
            $weight = round(($weight + 7) / 16) * 16;
        }
        $sizeOfOrder['l'] = ceil($ordersize['l'] / 25.4);                                                               //向上取整
        $sizeOfOrder['w'] = ceil($ordersize['w'] / 25.4);
        $sizeOfOrder['h'] = ceil($ordersize['h'] / 25.4);
        arsort($sizeOfOrder);                                                                                           //处理得到订单的长宽高,最长的为长,其次为宽,最短的为高
        $orderCount = $this->getOrderGoodsCount($id);                                                                   //获取订单产品种类数
        $order_goods = $this->order_goods_info($id);                                                                    //获取订单产品信息
        $redis = new Redis();                                                                                           //实例化redis
        $redis->connect('localhost',6379);                                                                              //redis连接
        if ($orderCount == 1) {                                                                                         //如果订单只有一种产品,需要判断是否已经有缓存
            $key = $order_goods['0']['goods_sn'].":".$order_goods['0']['goods_qty'];                                    //处理得到redis数据的键值

            if ($v = $redis->get($key)) {                                                                               //redis已经存在该数据的情况下,直接从redis获取值
                echo "读取缓存";
                $re = explode(':',$v);
                $shipping_id = $re['0'];
                $shipping_cost = $re['1'];
            }
        }
        if ($shipping_id == 1 || $shipping_id == 2 || $shipping_id == 12) {                                             //这三种物流方式是不可用的,需要重新优选渠道
            $shippingInfoSql = "SELECT
                   f.shipping_id AS shipping_id,f.zone AS zone,f.fee AS fee,f.weight AS weight
                FROM
                   myr_zipcode_zone AS z,
                   myr_shipping_fee AS f
                WHERE
                    z.shipping_id = f.shipping_id
                AND 
                    f.zone = z.zone 
                AND 
                    z.zipcode = '".$zipcode."' 
                AND
                    f.weight = ".$weight;
            $this->db->open($shippingInfoSql);                                                                          //获取所有可能的物流渠道
            $result = array();
            while($rs = $this->db->next()){                                                                             //遍历得到所有可用物流渠道,并计算得到该订单用这个物流渠道所需要的费用
                $result[$rs['shipping_id']] = $this->checkExpress($sizeOfOrder,$weight,$rs['fee'],$rs['shipping_id']);
            }
            $re = array_keys($result, min($result));                                                                    //选择最便宜的物流渠道,多个物流渠道同时最低的时候,默认键值为0的物流渠道
            $shipping_id = $re['0'];                                                                                    //物流渠道类型
            $shipping_cost =sprintf("%.2f", $result[$shipping_id]);                                                     //物流费用
//            var_dump($shipping_cost);exit;
            if ($orderCount == 1) {                                                                                     //当订单只有一种产品的时候,将最终结果记录到redis                $key = $order_goods['0']['goods_sn'].":".$order_goods['0']['goods_qty'];                                //处理得到redis存储的键
                $value = $shipping_id.":".$shipping_cost;                                                               //处理得到redis存储的值
                echo  "写入缓存";
                $redis -> set($key,$value);                                                                             //存储到redis
            }
        }
        $shipping_goods_sn=$order_goods['0']['goods_sn'];                                                           //订单SKU
        $shipping_zipcode =$zipcode;                                                                                //订单邮编
        $shipping_orderid =$id;                                                                                     //订单ID        $shipping_l=$ordersize['l'];                                                                                //MM
        $shipping_w=$ordersize['w'];
        $shipping_h=$ordersize['h'];
        $shipping_weight=$ordersize['weight'];                                                                      //G
        $shipping_date =date('y-m-d h:i:s',time());
        $this->db-> insert($this->ziplogtableName, array(
            "logistics_id " => $shipping_id,
            "cost" =>  $shipping_cost,
            "sku" => $shipping_goods_sn,
            "zip" =>  $shipping_zipcode,
            "order_id" => $shipping_orderid,
            "l" => $shipping_l,
            "w" => $shipping_w,
            "h" => $shipping_h,
            "weight" => $shipping_weight,
            "add_time" =>  $shipping_date
        ));
        if ($shipping_id == 0) {
            return '订单物流方式匹配失败';
        }
        else {
            Log::errorLog('order shipping_id immediately before update: ' . $shipping_id);
            $this->db->execute("update " . $this->tableName . " set shipping_cost = " . $shipping_cost . ",shipping_id = " . $shipping_id . " where order_id = " . $id);
          return 'ok';
        }
    }

/**
     * 描述 : 通过设定的重量和尺寸以及运费和物流方式,判断该物流的最终费用
     * 参数 :
     *      orderSize : 长宽高
     *      fee : 物流运费
     *      shipping_id : 物流方式ID
     * 返回 :
     *      shipping_cost : 最终确定的物流费用
     */
    function checkExpress($orderSize,$weight,$fee,$shipping_id) {
        $fuelCost = 0;                                                                                                  //燃油费,百分比
        $nonMachinableCost = 0;                                                                                         //不可加工额外收取的费用
        $remoteAreaCost = 0;                                                                                            //偏远地区额外收取的费用
        $superRemoteAreaCost = 0;                                                                                       //超级偏远地区额外收取的费用
        $oversizeCost = 0;                                                                                              //超尺寸额外收取的费用
        $additionalHandingCost = 0;                                                                                     //额外处理费
        $volumeCost = 0;                                                                                                //体积费
        $signatureCost = 0;                                                                                             //签名签收费
        $overWeightCost = 0;                                                                                            //超重费
        if ($shipping_id == 4) {                                                                                        //Fedex SmartPost
            if ($orderSize['l'] > 34 || $orderSize['w'] > 17 || $orderSize['h'] > 17 || $weight > 560) {
                $nonMachinableCost = 2.14;
            }
            $fuelCost = ($nonMachinableCost + $remoteAreaCost + $superRemoteAreaCost + $oversizeCost
                    + $additionalHandingCost + $volumeCost + $signatureCost + $overWeightCost + $fee) * 0.04;
        } else if ($shipping_id == 41) {                                                                                //Fedex Ground
            if ($orderSize['l'] > 60 && $orderSize < 108 || $orderSize['w'] > 30) {
                $additionalHandingCost = 7.35;
            }
            if (($orderSize['l'] + 2 * ($orderSize['w'] + $orderSize['h'])) > 130) {
                $oversizeCost = 43.13;
            }
            if ($weight > 1136) {
                $overWeightCost = 10.5;
            }
            $volumeCost = $orderSize['l'] * $orderSize['w'] * $orderSize['h'] / 194;
            $fuelCost = ($nonMachinableCost + $remoteAreaCost + $superRemoteAreaCost + $oversizeCost
                + $additionalHandingCost + $volumeCost + $signatureCost + $overWeightCost + $fee) * 0.035;
        }
        $shipping_cost = $fuelCost + $nonMachinableCost + $remoteAreaCost + $superRemoteAreaCost + $oversizeCost
            + $additionalHandingCost + $volumeCost + $signatureCost + $overWeightCost + $fee;
        return $shipping_cost;
    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值