/** * 修改(选择)物流渠道 * @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; } }
redis物流渠道优先(优化方法)
最新推荐文章于 2025-04-08 14:38:54 发布