getOneData([ ['id', '=', $freight_id] ]); if (empty($freight)) { return 0; } // 判断是否该商品免运费(是否满足满X元包邮) if ($price * $number >= $freight['free_money']) { return 0; } $start_standard = 0; //首件或首重 $start_fee = 0;//首费 $add_standard = 0;//续件或续重 $add_fee = 0;//续费 $standard = 0; //进行判断的标准 #TODO 可以将2种计费方式的字段统一到一个字段 运费规则是否符合标准逻辑 if ($freight['type'] == 1) { //计费方式 1--按件计费 2--按重计费 $start_standard = $freight['first_number']; $start_fee = $freight['first_number_money']; $add_standard = $freight['second_number']; $add_fee = $freight['second_number_money']; $standard = $number; } else if ($freight['type'] == 2) { $start_standard = $freight['first_weight']; $start_fee = $freight['first_weight_money']; $add_standard = $freight['second_weight']; $add_fee = $freight['second_weight_money']; $standard = $weight * $number; } if (!empty($freight['fee_conf'])) { //运费模板中运费信息对象,包含默认运费和指定地区运费 foreach ($freight['fee_conf'] as $key => $value) { if ((!empty($province_id) && array_key_exists($province_id, $value['province_list'])) && (!empty($city_id) && array_key_exists($city_id, $value['city_list'])) && (!empty($area_id) && array_key_exists($area_id, $value['area_list'])) ) { $start_standard = $value['start_standard']; $start_fee = $value['start_fee']; $add_standard = $value['add_standard']; $add_fee = $value['add_fee']; break; } } } // 计算并返回金额 return $this->computedFreight($standard, $start_standard, $start_fee, $add_standard, $add_fee); } /** * 计算并返回金额 * @param int $standard 进行判断的标准 * @param int $start_standard 首个 标准 * @param int $start_fee 首个 收费 * @param int $add_standard 续 标准 * @param int $add_fee 续 收费 * @date 2021-03-01 */ public function computedFreight($standard = 0, $start_standard = 0, $start_fee = 0, $add_standard = 0, $add_fee = 0) { //小于等于首(件/重),运费=取首(件/重)费;以此类推。 if ($standard <= $start_standard) { return $start_fee; } //超出首(件/重)后,超出部分小于等于续(件/重),运费=首重+续费, return $start_fee + ceil(($standard - $start_standard) / $add_standard) * $add_fee; } }