[RELEASE] 晉升 demo 變更至 main 生產環境

1. 修正台灣地址解析經緯度失敗問題,支援瑞光路特定二樓格式
2. 新增 Discord 通知設定的繁體中文、英文、日文多語系翻譯
3. 修正租戶管理員無基本設定權限時側邊欄仍顯示空選單的問題
This commit is contained in:
sky121113 2026-05-22 10:04:09 +08:00
commit 2a3d59054f
5 changed files with 26 additions and 3 deletions

View File

@ -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);
}
}

View File

@ -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",

View File

@ -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": "広告管理",

View File

@ -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": "廣告管理",

View File

@ -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. 基本設定 --}}
<li x-data="{ open: localStorage.getItem('menu_basic_settings') === 'true' || {{ request()->routeIs('admin.basic-settings.*') ? 'true' : 'false' }} }">
<button type="button" @click="if(sidebarCollapsed) { sidebarCollapsed = false; open = true; } else { open = !open; } localStorage.setItem('menu_basic_settings', open)" class="luxury-nav-item w-full text-start group">