From 4dad775568b069e125215cc0594ced252a353895 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Fri, 22 May 2026 09:51:05 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[FIX]=20=E4=BF=AE=E6=AD=A3=E5=8F=B0?= =?UTF-8?q?=E7=81=A3=E5=9C=B0=E5=9D=80=E8=A7=A3=E6=9E=90=E7=B6=93=E7=B7=AF?= =?UTF-8?q?=E5=BA=A6=E5=A4=B1=E6=95=97=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增 cleanFloorInfo 方法,過濾地址末尾的樓層、室、地下室等非門牌雜訊,防範 Nominatim 解析失敗。 2. 重構 parseTaiwanAddress 的路名拆分正則表達式,導入層級感知台灣地址結構,避免含有「巷、弄」的地址被提前截斷。 --- .../Controllers/Admin/GeocodingController.php | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/GeocodingController.php b/app/Http/Controllers/Admin/GeocodingController.php index e7ce15c..cb91d31 100644 --- a/app/Http/Controllers/Admin/GeocodingController.php +++ b/app/Http/Controllers/Admin/GeocodingController.php @@ -25,6 +25,9 @@ class GeocodingController extends Controller $address = $request->input('address'); + // 1. 清洗台灣地址中的樓層、室、地下室與括號備註,避免干擾地理編碼解析 + $address = $this->cleanFloorInfo($address); + // 策略 1:結構化搜尋(台灣地址精確度最高) $parsed = $this->parseTaiwanAddress($address); @@ -114,8 +117,8 @@ class GeocodingController extends Controller $streetPart = $address; } - // 拆分路名與門牌號碼 - preg_match('/^(.+?(?:路|街|大道|巷|弄)(?:[一二三四五六七八九十]+段)?)\s*(.*)/u', $streetPart, $roadMatch); + // 拆分路名與門牌號碼(層級感知台灣地址結構,完整保留巷弄) + preg_match('/^(.+?(?:路|街|大道)(?:[一二三四五六七八九十]+段)?(?:[0-9一二三四五六七八九十百]+巷)?(?:[0-9一二三四五六七八九十百]+弄)?)\s*(.*)/u', $streetPart, $roadMatch); $street = ''; $houseNumber = ''; @@ -134,4 +137,21 @@ class GeocodingController extends Controller 'street' => $fullStreet, ]; } + + /** + * 清洗台灣地址中的樓層、室、地下室與括號備註,避免干擾 OpenStreetMap 解析 + */ + private function cleanFloorInfo(string $address): string + { + // 1. 移除常見的樓層與地下室資訊,以及其後方的所有贅字:例如 "2樓", "12樓之3", "89F", "B1", "地下1樓" 等 + $address = preg_replace('/(?:地下一?|地下)?(?:[0-9一二三四五六七八九十百]+樓|[0-9a-zA-Z]+[fF]|[bB][0-9]+)(?:之[0-9一二三四五六七八九十百]+)?.*/u', '', $address); + + // 2. 移除 "x室", "x房", "x戶" 等室內資訊 + $address = preg_replace('/(?:[0-9a-zA-Z一二三四五六七八九十百]+(?:室|房|戶)).*/u', '', $address); + + // 3. 移除常見 the 括號備註,例如 "(五樓)", "(A棟)", "(總統府)" + $address = preg_replace('/[\((][^\))]+[\))]/u', '', $address); + + return trim($address); + } } From 44d0499b53fdf1cc871e1a27097047da3c69ab7d Mon Sep 17 00:00:00 2001 From: sky121113 Date: Fri, 22 May 2026 09:55:23 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(i18n):=20=E6=96=B0=E5=A2=9E=20Discord?= =?UTF-8?q?=20=E9=80=9A=E7=9F=A5=E8=A8=AD=E5=AE=9A=E7=9A=84=E7=B9=81?= =?UTF-8?q?=E4=B8=AD=E3=80=81=E8=8B=B1=E6=96=87=E3=80=81=E6=97=A5=E6=96=87?= =?UTF-8?q?=E5=A4=9A=E8=AA=9E=E7=B3=BB=E7=BF=BB=E8=AD=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lang/en.json | 1 + lang/ja.json | 1 + lang/zh_TW.json | 1 + 3 files changed, 3 insertions(+) diff --git a/lang/en.json b/lang/en.json index 64c203b..668b9dd 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1897,6 +1897,7 @@ "menu.basic": "Basic Settings", "menu.basic.machines": "Machine Settings", "menu.basic.payment-configs": "Customer Payment Config", + "menu.basic.discord-notifications": "Discord Notifications", "menu.data-config": "Data Configuration", "menu.data-config.admin-products": "Product Status", "menu.data-config.advertisements": "Advertisement Management", diff --git a/lang/ja.json b/lang/ja.json index 986fcbf..992a5a1 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -1897,6 +1897,7 @@ "menu.basic": "基本設定", "menu.basic.machines": "機器設定", "menu.basic.payment-configs": "顧客決済設定", + "menu.basic.discord-notifications": "Discord通知設定", "menu.data-config": "データ設定", "menu.data-config.admin-products": "商品ステータス", "menu.data-config.advertisements": "広告管理", diff --git a/lang/zh_TW.json b/lang/zh_TW.json index 3170218..b0de74d 100644 --- a/lang/zh_TW.json +++ b/lang/zh_TW.json @@ -1932,6 +1932,7 @@ "menu.basic": "基本設定", "menu.basic.machines": "機台設定", "menu.basic.payment-configs": "客戶金流設定", + "menu.basic.discord-notifications": "Discord通知設定", "menu.data-config": "資料設定", "menu.data-config.admin-products": "商品狀態", "menu.data-config.advertisements": "廣告管理", From 51f489c496626e4632eee9c53e3e8c15e1f3c6f2 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Fri, 22 May 2026 09:59:22 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(sidebar):=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E7=A7=9F=E6=88=B6=E7=AE=A1=E7=90=86=E5=93=A1=E7=84=A1=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E8=A8=AD=E5=AE=9A=E6=AC=8A=E9=99=90=E6=99=82=E4=BB=8D?= =?UTF-8?q?=E9=A1=AF=E7=A4=BA=E7=A9=BA=E9=81=B8=E5=96=AE=E7=9A=84=E5=95=8F?= =?UTF-8?q?=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/layouts/partials/sidebar-menu.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/layouts/partials/sidebar-menu.blade.php b/resources/views/layouts/partials/sidebar-menu.blade.php index 293b637..a688f66 100644 --- a/resources/views/layouts/partials/sidebar-menu.blade.php +++ b/resources/views/layouts/partials/sidebar-menu.blade.php @@ -448,7 +448,7 @@ @endcan --}} -@if(auth()->user()->isSystemAdmin() || auth()->user()->isTenant()) +@if(auth()->user()->isSystemAdmin() || (auth()->user()->isTenant() && (auth()->user()->can('menu.basic.machines') || auth()->user()->can('menu.basic.payment-configs') || auth()->user()->can('menu.basic.discord-notifications')))) {{-- 14.5. 基本設定 --}}