From a7036c7a0bb2b35dbc67f8438df88bbc4a66c248 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 28 Aug 2025 15:39:34 +0800 Subject: [PATCH] update --- .../Controllers/Mobile/OtherController.php | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/Mobile/OtherController.php b/app/Http/Controllers/Mobile/OtherController.php index bf0303b..57484c8 100755 --- a/app/Http/Controllers/Mobile/OtherController.php +++ b/app/Http/Controllers/Mobile/OtherController.php @@ -140,20 +140,8 @@ class OtherController extends CommonController $sortName = $all['sort_name'] ?? 'distance'; $sortType = $all['sort_type'] ?? 'asc'; - // 使用简化的距离计算公式,避免精度问题 - $distanceFormula = " - (6371 * 2 * asin( - sqrt( - pow(sin(radians((CAST(company_latitude AS DECIMAL(10,8)) - ?) / 2)), 2) + - cos(radians(?)) * cos(radians(CAST(company_latitude AS DECIMAL(10,8)))) * - pow(sin(radians((CAST(company_longitude AS DECIMAL(10,8)) - ?) / 2)), 2) - ) - )) AS distance - "; - - // 先构建基础查询 + // 先构建基础查询,不使用SQL计算距离 $query = Company::select('*') - ->selectRaw($distanceFormula, [$latitude, $latitude, $longitude]) ->where(function ($query) use ($all) { if (isset($all['company_name'])) { $query->where('company_name', 'like', '%' . $all['company_name'] . '%'); @@ -195,15 +183,38 @@ class OtherController extends CommonController ]); // 根据排序字段进行排序 - if ($sortName === 'distance') { - // 距离排序始终按升序(从近到远) - $query->orderBy('distance', 'asc'); - } else { + if ($sortName !== 'distance') { $query->orderBy($sortName, $sortType); } $result = $query->paginate($pageSize, ['*'], 'page', $page); + // 在PHP中计算距离 + foreach ($result->items() as $company) { + $companyLat = floatval($company->company_latitude); + $companyLon = floatval($company->company_longitude); + + // 使用Haversine公式计算距离 + $distance = 6371 * acos( + cos(deg2rad($latitude)) * cos(deg2rad($companyLat)) * + cos(deg2rad($companyLon) - deg2rad($longitude)) + + sin(deg2rad($latitude)) * sin(deg2rad($companyLat)) + ); + + $company->distance = $distance; + } + + // 如果按距离排序,在PHP中排序 + if ($sortName === 'distance') { + $items = $result->items(); + usort($items, function ($a, $b) { + return $a->distance <=> $b->distance; + }); + + // 重新设置分页数据 + $result->setCollection(collect($items)); + } + // 添加调试信息 \Log::info('Distance calculation debug', [ 'input_lat' => $latitude, @@ -212,8 +223,7 @@ class OtherController extends CommonController 'target_lon' => '120.421618', 'expected_distance' => 13.22, 'actual_distance' => $result->first() ? $result->first()->distance : 'N/A', - 'formula' => $distanceFormula, - 'parameters' => [$latitude, $latitude, $longitude] + 'calculation_method' => 'PHP Haversine' ]); return $this->success($result);