// +---------------------------------------------------------------------- namespace mall\basic; use mall\utils\BC; use think\facade\Db; class Distribution { private static $_delivery = []; public static function get(&$data,$address=[]){ if(empty($address)){ return $data; } foreach($data["item"] as $key=>$value){ $delivery = self::compute($value["distribution_id"],$address["province"],$value["goods_weight"] * $value["goods_nums"]); $data["item"][$key]["delivery"] = $delivery["delivery"]; $data["real_freight"] = BC::add($delivery["real_freight"],$data["real_freight"]); $data["payable_freight"] = BC::add($delivery["payable_freight"],$data["payable_freight"]); } $data = Promotion::run($data); $data["payable_amount"] = BC::add($data["real_freight"],$data["real_amount"]); $data["order_amount"] = $data["payable_amount"]; return $data; } private static function compute($delivery_id, $province, $weight){ $data = [ "real_freight" => 0, // 实付运费 "payable_freight" => 0 // 总运费金额 ]; $delivery = Db::name("distribution")->where(["status" => 0, "id" => $delivery_id])->find(); self::$_delivery = $delivery; if (empty($delivery)) { throw new \Exception("配送方式不存在", 0); } if ($delivery["type"] == 0) { $delivery["weight_price"] = self::calculate($weight, $delivery["first_price"], $delivery["second_price"]); }else { $index = 0; $flag = false; $area_groupid = json_decode($delivery["area_group"], true); foreach ($area_groupid as $key => $val) { $arr = explode(",", $val); //foreach ($province as $area_id) { if (in_array($province, $arr)) { $index = $key; $flag = true; break; } //} if ($flag) { break; } } if ($flag) { // 如果查找到所设置的省份 $firstprice = json_decode($delivery["first_price_group"], true); $secondprice = json_decode($delivery["second_price_group"], true); $delivery["weight_price"] = self::calculate($weight, $firstprice[$index], $secondprice[$index]); } else { //如果该地区未设置,使用默认费用 $delivery["weight_price"] = self::calculate($weight, $delivery["first_price"], $delivery["second_price"]); } } $data["real_freight"] = $delivery["weight_price"]; $data["payable_freight"] = $delivery["weight_price"]; $data["delivery"] = ["title" => $delivery["title"], "description" => isset($delivery["description"]) ? $delivery["description"] : ""]; return $data; } /* * 根据重量计算给定价格 */ private static function calculate($weight, $first_price, $second_price) { $first_weight = self::$_delivery["first_weight"]; $second_weight = self::$_delivery["second_weight"]; //当商品重量小于或等于首重的时候 if ($weight <= $first_weight) { return $first_price; } //当商品重量大于首重时,根据次重进行累加计算 $num = ceil(($weight - $first_weight) / $second_weight); return $first_price + $second_price * $num; } }