123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <?php
- // +----------------------------------------------------------------------
- // | A3Mall
- // +----------------------------------------------------------------------
- // | Copyright (c) 2020 http://www.a3-mall.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Author: xzncit <158373108@qq.com>
- // +----------------------------------------------------------------------
- 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;
- }
- }
|