From 9faa2ca069a88129b59a4b56129e0be10a6a0338 Mon Sep 17 00:00:00 2001 From: Council Date: Mon, 29 Jun 2026 00:26:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(vr=5Fticket):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=9D=90=E6=A0=87=E5=8F=8D=E6=9F=A5=E5=9F=8E=E5=B8=82=20API?= =?UTF-8?q?=EF=BC=88=E7=A6=BB=E7=BA=BF=EF=BC=8C=E5=9F=BA=E4=BA=8E=20Region?= =?UTF-8?q?=20=E8=A1=A8=EF=BC=8C=E6=97=A0=E5=A4=96=E9=83=A8=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shopxo/app/plugins/vr_ticket/api/Geo.php | 109 ++++++++++++++++++ .../vr_ticket/service/GeoCityService.php | 4 +- 2 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 shopxo/app/plugins/vr_ticket/api/Geo.php diff --git a/shopxo/app/plugins/vr_ticket/api/Geo.php b/shopxo/app/plugins/vr_ticket/api/Geo.php new file mode 100644 index 0000000..58c8ec4 --- /dev/null +++ b/shopxo/app/plugins/vr_ticket/api/Geo.php @@ -0,0 +1,109 @@ + 180 || $lat < -90 || $lat > 90) { + return DataReturn('坐标越界', -1); + } + + // 2. 缓存命中优先(按 ~1m 精度聚合,30 天) + $cache_key = 'vr_ticket_geo_regeocode_' . round($lng, 5) . '_' . round($lat, 5); + $cached = MyCache($cache_key); + if (is_array($cached) && isset($cached['city'])) { + return DataReturn('success', 0, $cached); + } + + // 3. 查 Region 表 + // FindNearestCity 已在 2026-06-28 修复距离单位 bug + // 修复前 distance = 真实 km 数 / 1000(错误) + // 修复后 distance = 真实 km 数(正确) + $nearest = GeoCityService::FindNearestCity($lng, $lat, 3); + + // 4. 没匹配到任何城市 + if (empty($nearest) || empty($nearest['id']) || empty($nearest['name'])) { + return DataReturn('暂无服务城市数据', -1); + } + + // 5. 距离超阈值 → 视为无附近服务城市 + $distance_km = (float)($nearest['distance'] ?? 0); + if ($distance_km > self::MAX_NEARBY_DISTANCE_KM) { + return DataReturn( + '当前位置暂无服务城市(最近 ' . $nearest['name'] . ' 约 ' . $distance_km . 'km)', + -1 + ); + } + + // 6. 组装统一返回 + $result = [ + 'city' => (string)$nearest['name'], + 'city_id' => (int)$nearest['id'], + 'distance' => $distance_km, + 'input' => [ + 'lng' => $lng, + 'lat' => $lat, + ], + 'matched' => [ + 'lng' => (float)($nearest['lng'] ?? 0), + 'lat' => (float)($nearest['lat'] ?? 0), + ], + ]; + + // 7. 写缓存 + MyCache($cache_key, $result, 86400 * self::CACHE_DAYS); + + return DataReturn('success', 0, $result); + } +} diff --git a/shopxo/app/plugins/vr_ticket/service/GeoCityService.php b/shopxo/app/plugins/vr_ticket/service/GeoCityService.php index 9c46f26..676a9a7 100644 --- a/shopxo/app/plugins/vr_ticket/service/GeoCityService.php +++ b/shopxo/app/plugins/vr_ticket/service/GeoCityService.php @@ -75,7 +75,7 @@ class GeoCityService $region['lat'], $lng, $lat, - 2 // 返回米 + 2 // 返回 km(GeoTransUtil::GetDistance 第 4 参 2=km) ); if ($distance < $min_distance) { @@ -123,7 +123,7 @@ class GeoCityService $nearest = [ 'id' => $region['id'], 'name' => $region['name'], - 'distance' => round($distance / 1000, 2), // 转为km,保留2位小数 + 'distance' => round($distance, 2), // km(GetDistance 第 4 参 2 已是 km,保留 2 位小数) 'lng' => $region['lng'], 'lat' => $region['lat'], ];