<?php namespace App\Http\Controllers\Api; use App\Command\Log; use App\Models\Store; use Illuminate\Http\Request; class StoreController extends BaseController { public function getList() { $list = (new Store())->select("id", "title", "contact", "is_type") ->limit(15) ->get(); return $this->JsonResponse($list); } //代收点列表 public function getDeliveryList(Request $request) { $mid = $request->user()->merchant_id; $lat1 = $request->lat ?? ''; $lng1 = $request->lng ?? ''; $list = Store::where(['merchant_id' => $mid]) ->select(['id', 'title', 'lat_lng', 'address', 'contacts', 'phone'])->get(); foreach ($list as $key => $val) { $atng = $val->lat_lng ? explode(',', $val->lat_lng) : []; $lat2 = $atng[1]; $lng2 = $atng[0]; $list[$key]['distance'] = ($lat1 && $lat2) ? $this->haversineDistance($lat1, $lng1, $lat2, $lng2) : ''; } return $this->JsonResponse($list); } //送货上门-距离判断 public function checkDistance(Request $request) { $mid = $request->user()->merchant_id; $lat1 = $request->lat ?? ''; $lng1 = $request->lng ?? ''; $flag = false; $store_id = 0; if ($mid) { $list = Store::where(['merchant_id' => $mid]) ->select(['id', 'title', 'lat_lng', 'distance'])->get(); foreach ($list as $key => $val) { $atng = $val->lat_lng ? explode(',', $val->lat_lng) : []; $lat2 = $atng[1]; $lng2 = $atng[0]; $res = ($lat1 && $lat2) ? $this->haversineDistance($lat1, $lng1, $lat2, $lng2) : ''; if ($res <= $val->distance) { $flag = true; break; } } } else { $flag = true; } return $this->JsonResponse(['flag' => $flag, 'delivery_store_id' => $store_id]); } function haversineDistance($lat1, $lng1, $lat2, $lng2) { // 地球半径(单位:千米) $radius = 6371; // 将角度转为弧度 $lat1 = deg2rad($lat1); $lng1 = deg2rad($lng1); $lat2 = deg2rad($lat2); $lng2 = deg2rad($lng2); // 计算经纬度差值 $latDiff = $lat2 - $lat1; $lngDiff = $lng2 - $lng1; // 计算Haversine公式中的参数 $a = pow(sin($latDiff / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($lngDiff / 2), 2); $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); $distance = $radius * $c; return floor($distance); } }