From 3f41896532576d763d8776325fcfd167a8f489f9 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Wed, 18 Mar 2026 13:52:54 +0800 Subject: [PATCH] =?UTF-8?q?[FEAT]=20=E8=A3=9C=E5=85=A8=E6=A9=9F=E5=8F=B0?= =?UTF-8?q?=E8=88=87=E9=87=91=E6=B5=81=E8=A8=AD=E5=AE=9A=E5=A4=9A=E8=AA=9E?= =?UTF-8?q?=E7=B3=BB=EF=BC=8C=E4=B8=A6=E8=AA=BF=E6=95=B4=E5=B8=B3=E8=99=9F?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=A1=A8=E6=A0=BC=E4=BD=88=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .agents/skills/ui-minimal-luxury/SKILL.md | 158 ++--- .../BasicSettings/MachineModelController.php | 71 ++ .../MachineSettingController.php | 33 +- app/Models/Machine/Machine.php | 2 + app/Models/Machine/MachineModel.php | 2 + lang/en.json | 103 ++- lang/ja.json | 128 +++- lang/zh_TW.json | 93 ++- .../basic-settings/machines/index.blade.php | 622 +++++++++++++----- .../payment-configs/create.blade.php | 28 +- .../payment-configs/edit.blade.php | 28 +- .../payment-configs/index.blade.php | 5 +- resources/views/admin/dashboard.blade.php | 4 +- .../admin/data-config/accounts.blade.php | 8 +- .../views/admin/machines/create.blade.php | 22 +- resources/views/admin/machines/edit.blade.php | 22 +- .../views/admin/machines/index.blade.php | 28 +- resources/views/admin/machines/show.blade.php | 28 +- routes/web.php | 3 + 19 files changed, 990 insertions(+), 398 deletions(-) create mode 100644 app/Http/Controllers/Admin/BasicSettings/MachineModelController.php diff --git a/.agents/skills/ui-minimal-luxury/SKILL.md b/.agents/skills/ui-minimal-luxury/SKILL.md index 5b43012..d9bf821 100644 --- a/.agents/skills/ui-minimal-luxury/SKILL.md +++ b/.agents/skills/ui-minimal-luxury/SKILL.md @@ -25,8 +25,7 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 ### 豪華卡片 (Luxury Card) ```html
- -
+ ``` - **特效**: 懸停時帶有 Y 軸平移與深度投影。 @@ -45,20 +44,18 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 - **Ghost**: `.btn-luxury-ghost` (無背景,適用於取消、查看更多) ```html - - ``` ## 3. 動畫與互動 ### 進場動畫 -- **`.animate-luxury-in`**: 所有的主內容區域或卡片在頁面載入時,應具備由下而轉的淡入效果。 +- **`.animate-luxury-in`**: 所有的主內容區域或卡片在頁面載入時,應具備由下而上的淡入效果。 ### 互動過渡 (Transitions) - **標準時間**: 所有的懸停、色彩變換等過渡效果,統一建議使用 **`duration-300`** (300ms)。 @@ -68,6 +65,8 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 - **互動原則**: 點擊觸發下拉選單時,必須使用 `x-transition` 且帶有 `scale` 偏移。 - **樣式要求**: 選單背景需使用玻璃擬態 (Glassmorphism) 或帶透明度的深色背景。 +## 4. 實作檢查清單 (Checklist) + - [ ] **列表佈局**: 是否採用「整合式卡片」結構且內距設為 `p-8`? - [ ] **分頁與總數**: 列表底部是否正確召喚 `vendor.pagination.luxury`? - [ ] **文字色階**: 符合標題 `slate-900/white` 與標籤 `slate-500` 的對比度。 @@ -76,7 +75,7 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 ## 5. 開發注意事項 (Important Notes) ### 技術限制備忘 -- **CSS 編譯**: 複雜的 `box-shadow` 或漸層應直接寫原生 CSS 屬性,避免在 `@apply` 中使用帶空格的數值導致編譯失敗(詳見 KI: `tailwind-luxury-ui-patterns`)。 +- **CSS 編譯**: 複雜的 `box-shadow` 或漸層應直接寫原生 CSS 屬性,避免在 `@apply` 中使用帶空格的數值導致編譯失敗。 - **深色模式**: 互動式按鈕在深色模式下必須強化文字亮度(`dark:text-white`),並輔以青色發光效果。 ### 即時動態呈現規範 @@ -107,24 +106,46 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 ```html @section('content')
-

{{ __('Title') }}

{{ __('Subtitle') }}

- +
-
+
+
+ +
+
+
- - +
+ + + + + + + + + + + +
{{ __('Name') }}{{ __('Action') }}
Example Name
+ +
+ {{ $items->links('vendor.pagination.luxury') }} +
@endsection @@ -170,9 +191,8 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 - 樣式: `bg-indigo-500/10 text-indigo-500` - **危險/移除動作**: **玫瑰紅 (`Rose`)**。代表破壞性操作。 - 樣式: `bg-rose-500/10 text-rose-500` -``` -## 8. 資料表格規範 (Data Tables) +## 9. 資料表格規範 (Data Tables) 為了確保管理後台資料的可讀性與精密感,表格內的所有文字級別必須對齊以下規範: @@ -214,7 +234,9 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 - 數字顏色對齊 `text-slate-600` (深色: `text-slate-300`)。 ### 底部清單控制項 (Bottom List Controls) -為了確保長列表的操作便利,清單底### 標準操作按鈕 (Standard Action Icons) +為了確保長列表的操作便利,清單底部應保持乾淨,統一由分頁與總數組件接管操作。 + +### 標準操作按鈕 (Standard Action Icons) 表格內的操作欄位(如「編輯」、「刪除」、「詳情」)必須使用以下定義之 **「黃金標準 (Gold Standard)」**: - **共同樣式**: @@ -226,92 +248,19 @@ description: 定義 Star Cloud 管理後台的「極簡奢華風」設計規範 - 尺寸: `w-4 h-4` - **編輯按鈕 (Edit)**: - - 懸停特效: `hover:text-cyan-500 hover:bg-cyan-500/5 hover:border-cyan-500/20` + - 懸停特效: `hover:text-cyan-500 hover:bg-cyan-500/10 hover:border-cyan-500/20` - SVG 路徑: ```html ``` - **查看詳情 (View/Detail)**: - - 懸停特效: `hover:text-indigo-500 hover:bg-indigo-500/5 hover:border-indigo-500/20` + - 懸停特效: `hover:text-indigo-500 hover:bg-indigo-500/10 hover:border-indigo-500/20` - SVG 路徑: ```html ``` -- **刪除按鈕 (Delete)**: - - 懸停特效: `hover:text-rose-500 hover:bg-rose-500/5 hover:border-rose-500/20` - - SVG 路徑: - ```html - - ``` -y items-center gap-2">... - - - - -
- -
-
- - -
-
- - -
- - - - - - - - - - - - - -
{{ __('Name') }}{{ __('Action') }}
Example Name
-
- - -
- {{ $items->links('vendor.pagination.luxury') }} -
-
- -``` - -### 清單欄位規範 (Column Visibility & Standards) -- **固定欄位**: 第一欄通常為「關鍵標識」(如 ID 或時間),應具備特殊字體樣式。 -- **操作欄位**: 統一位於表格最右端,並命名為 `Action` (或 `操作`),標題與內容皆應 `text-right`。 -## 9. 系統兼容性與標準化 (Compatibility & Standardization) - -為了確保在不同版本的開發環境中(如目前專案使用的 Tailwind CSS v3.1)UI 都能正確呈現,並維持全站操作感一致,必須遵守以下額外規範。 - -### Tailwind CSS 版本兼容性 (v3.1) -- **禁止使用 `size-` 屬性**: 舊版不支援 `size-4` 等語法,請一律分拆寫作 `w-4 h-4`。 -- **避免非標準間距**: 避免使用 `4.5` (`18px`) 等任意值,優先使用標準等級如 `4` (`16px`) 或 `5` (`20px`)。 - -### 標準操作按鈕 (Standard Action Icons) -表格內的操作欄位(如「編輯」、「刪除」)必須使用以下定義之標準: - -- **共同樣式**: - - 容器: `p-2 rounded-lg bg-slate-50 dark:bg-slate-800` - - 主色: `text-slate-400` - - 圖示粗細: `stroke-width="2.5"` - - 尺寸: `w-4 h-4` - -- **編輯按鈕 (Edit)**: - - 懸停特效: `hover:text-cyan-500 hover:bg-cyan-500/10 hover:border-cyan-500/20` - - SVG 路徑: - ```html - - ``` - - **刪除按鈕 (Delete)**: - 懸停特效: `hover:text-rose-500 hover:bg-rose-500/10 hover:border-rose-500/20` - SVG 路徑: @@ -319,25 +268,34 @@ y items-center gap-2">... ``` +## 10. 系統兼容性與標準化 (Compatibility & Standardization) -## 10. 字體與技術資訊規範 (Typography & Technical Data) +為了確保在不同版本的開發環境中(如目前專案使用的 Tailwind CSS v3.1)UI 都能正確呈現,並維持全站操作感一致,必須遵守以下額外規範。 + +### Tailwind CSS 版本兼容性 (v3.1) +- **禁止使用 `size-` 屬性**: 舊版不支援 `size-4` 等語法,請一律分拆寫作 `w-4 h-4`。 +- **避免非標準間距**: 避免使用 `4.5` (`18px`) 等任意值,優先使用標準等級如 `4` (`16px`) 或 `5` (`20px`)。 + +## 11. 字體與技術資訊規範 (Typography & Technical Data) 為了確保全站「次要資訊」具備極一致的高級感,必須遵守以下「機台標竿」規範: ### 核心樣式級別 (Core Typography Scale) -| 資訊類型 | 客戶/配置名稱 (標題) | 技術代碼 (ID, SN, Code) | 分隔符號 (•) | -| :--- | :--- | :--- | :--- | -| **字體族** | `font-sans` (Plus Jakarta Sans) | `font-mono` (微縮型單雙格) | `font-sans` | -| **尺寸** | `text-base` | `text-xs` (不可使用 10px) | `text-xs` | -| **字重** | `font-extrabold` (800) | `font-bold` (700) | `font-bold` | -| **字距** | `tracking-tight` (-0.02em) | `tracking-widest` (最寬) | `tracking-normal` | -| **格式** | 保持原始名稱 | `uppercase` (強制大寫) | N/A | -| **色彩** | `slate-900` / `slate-100` | `slate-500` / `slate-400` | `slate-300` / `slate-700` | +| 資訊類型 | 客戶/配置名稱 (標題) | 技術代碼 (ID, SN, Code) | 清單時間 (Timestamps) | 分隔符號 (•) | +| :--- | :--- | :--- | :--- | :--- | +| **字體族** | `font-sans` (Plus Jakarta Sans) | `font-mono` (微縮型單雙格) | `font-mono` (或 `sans` 視場景) | `font-sans` | +| **尺寸** | `text-base` | `text-xs` (不可使用 10px) | `text-xs` | `text-xs` | +| **字重** | `font-extrabold` (800) | `font-bold` (700) | `font-black` (900) | `font-bold` | +| **字距** | `tracking-tight` (-0.02em) | `tracking-widest` (最寬) | `tracking-widest` | `tracking-normal` | +| **格式** | 保持原始名稱 | `uppercase` (強制大寫) | `uppercase` | N/A | +| **色彩** | `slate-900` / `slate-100` | `slate-500` / `slate-400` | `slate-400` / `slate-400/80` | `slate-300` / `slate-700` | ### 實作禁忌與準則 - **禁止斜體 (No Italics)**: 名稱欄位嚴禁附帶 `italic`(特別是標題或配置名稱),保持直挺專業感。 - **作用範圍 (Mono Scoping)**: `font-mono` 僅限作用於「純英文/數字」的代碼。Email 或分隔點必須回歸 `font-sans` 以確保圓潤。 - **權重載入 (Font Weights)**: 確保 HTML Header 載入了 `800` 與 `900` 權重,避免瀏覽器模擬出的假粗體。 +- **清單資訊密度**: 對於高密度清單中的時間資訊,應優先使用 `font-black` 與 `tracking-widest` 來建立明確的「標籤感」,而非僅僅是「微縮文字」。 + --- > [!IMPORTANT] > **開發新功能前,必須確認 `app.css` 中的 `.btn-luxury-*` 系列組件是否滿足需求。** @@ -345,4 +303,4 @@ y items-center gap-2">... --- > [!TIP] -> 當遇到未定義的 UI 區塊時,優先參考 `admin.dashboard.blade.php` 的卡片與即時動態實作方式進行衍生。 +> 當遇到未定義的 UI 區塊時,優先參考 `admin.dashboard.blade.php` 的卡片與即時動態實作方式進行衍生。 \ No newline at end of file diff --git a/app/Http/Controllers/Admin/BasicSettings/MachineModelController.php b/app/Http/Controllers/Admin/BasicSettings/MachineModelController.php new file mode 100644 index 0000000..59f1861 --- /dev/null +++ b/app/Http/Controllers/Admin/BasicSettings/MachineModelController.php @@ -0,0 +1,71 @@ +route('admin.basic-settings.machines.index', ['tab' => 'models']); + } + + public function store(Request $request): RedirectResponse + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + ]); + + MachineModel::create(array_merge($validated, [ + 'company_id' => auth()->user()->company_id, + 'creator_id' => auth()->id(), + 'updater_id' => auth()->id(), + ])); + + return redirect()->route('admin.basic-settings.machines.index', ['tab' => 'models']) + ->with('success', __('Machine model created successfully.')); + } + + /** + * 顯示編輯頁面 (與 index 共用 Modal 則不需此方法,但 resource 路由建議保留或調整) + */ + public function edit(MachineModel $machine_model): View + { + // 若採用 index Modal 編輯,此處可回傳 JSON 或維持 Blade + return view('admin.basic-settings.machine-models.edit', compact('machine_model')); + } + + public function update(Request $request, MachineModel $machine_model): RedirectResponse + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + ]); + + $machine_model->update(array_merge($validated, [ + 'updater_id' => auth()->id(), + ])); + + return redirect()->route('admin.basic-settings.machines.index', ['tab' => 'models']) + ->with('success', __('Machine model updated successfully.')); + } + + public function destroy(MachineModel $machine_model): RedirectResponse + { + if ($machine_model->machines()->count() > 0) { + return redirect()->back()->with('error', __('Cannot delete model that is currently in use by machines.')); + } + + $machine_model->delete(); + + return redirect()->route('admin.basic-settings.machines.index', ['tab' => 'models']) + ->with('success', __('Machine model deleted successfully.')); + } +} diff --git a/app/Http/Controllers/Admin/BasicSettings/MachineSettingController.php b/app/Http/Controllers/Admin/BasicSettings/MachineSettingController.php index c0d8552..02d9dd8 100644 --- a/app/Http/Controllers/Admin/BasicSettings/MachineSettingController.php +++ b/app/Http/Controllers/Admin/BasicSettings/MachineSettingController.php @@ -17,31 +17,44 @@ use Illuminate\Support\Facades\Log; class MachineSettingController extends AdminController { /** - * 顯示機台設定列表 + * 顯示機台與型號設定列表 (採用標籤頁整合) */ public function index(Request $request): View { + $tab = $request->input('tab', 'machines'); $per_page = $request->input('per_page', 20); - $query = Machine::query()->with(['machineModel', 'paymentConfig', 'company']); + $search = $request->input('search'); - // 搜尋:名稱或序號 - if ($search = $request->input('search')) { - $query->where(function ($q) use ($search) { + // 1. 處理機台清單 (Machines Tab) + $machineQuery = Machine::query()->with(['machineModel', 'paymentConfig', 'company']); + if ($tab === 'machines' && $search) { + $machineQuery->where(function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('serial_no', 'like', "%{$search}%"); }); } + $machines = $machineQuery->latest()->paginate($per_page, ['*'], 'machines_page')->withQueryString(); - $machines = $query->latest() - ->paginate($per_page) - ->withQueryString(); + // 2. 處理型號清單 (Models Tab) + $modelQuery = MachineModel::query()->withCount('machines'); + if ($tab === 'models' && $search) { + $modelQuery->where('name', 'like', "%{$search}%"); + } + $models_list = $modelQuery->latest()->paginate($per_page, ['*'], 'models_page')->withQueryString(); + // 3. 基礎下拉資料 (用於新增/編輯機台的彈窗) $models = MachineModel::select('id', 'name')->get(); $paymentConfigs = PaymentConfig::select('id', 'name')->get(); - // 這裡應根據租戶 (Company) 決定可用的選項,暫採簡單模擬或從 Auth 取得 $companies = \App\Models\System\Company::select('id', 'name')->get(); - return view('admin.basic-settings.machines.index', compact('machines', 'models', 'paymentConfigs', 'companies')); + return view('admin.basic-settings.machines.index', compact( + 'machines', + 'models_list', + 'models', + 'paymentConfigs', + 'companies', + 'tab' + )); } /** diff --git a/app/Models/Machine/Machine.php b/app/Models/Machine/Machine.php index e06a6af..c432086 100644 --- a/app/Models/Machine/Machine.php +++ b/app/Models/Machine/Machine.php @@ -49,6 +49,8 @@ class Machine extends Model 'updater_id', ]; + protected $appends = ['image_urls']; + protected $casts = [ 'last_heartbeat_at' => 'datetime', 'welcome_gift_enabled' => 'boolean', diff --git a/app/Models/Machine/MachineModel.php b/app/Models/Machine/MachineModel.php index f2724de..cdde5b3 100644 --- a/app/Models/Machine/MachineModel.php +++ b/app/Models/Machine/MachineModel.php @@ -3,9 +3,11 @@ namespace App\Models\Machine; use Illuminate\Database\Eloquent\Model; +use App\Traits\TenantScoped; class MachineModel extends Model { + use TenantScoped; protected $fillable = [ 'name', 'company_id', diff --git a/lang/en.json b/lang/en.json index 441b27d..a3e7259 100644 --- a/lang/en.json +++ b/lang/en.json @@ -49,9 +49,6 @@ "Current Stock": "Current Stock", "Last Signal": "Last Signal", "Alert Summary": "Alert Summary", - "Online": "Online", - "Offline": "Offline", - "Low Stock": "Low Stock", "No alert summary": "No alert summary", "No data available": "No data available", "Showing :from to :to of :total items": "Showing :from to :to of :total items", @@ -278,5 +275,103 @@ "Warning": "Warning", "basic-settings": "Basic Settings", "permissions": "Permission Settings", - "Error": "Error" + "Error": "Error", + "Machine Model Settings": "Machine Model Settings", + "Machine Model": "Machine Model", + "Model Name": "Model Name", + "Machine Count": "Machine Count", + "Add Machine Model": "Add Machine Model", + "Edit Machine Model": "Edit Machine Model", + "Machine model created successfully.": "Machine model created successfully.", + "Machine model updated successfully.": "Machine model updated successfully.", + "Machine model deleted successfully.": "Machine model deleted successfully.", + "Cannot delete model that is currently in use by machines.": "Cannot delete model that is currently in use by machines.", + "Machine Details": "Machine Details", + "Create Machine": "Create Machine", + "Edit Machine": "Edit Machine", + "Basic Information": "Basic Information", + "Location": "Location", + "Temperature": "Temperature", + "Firmware Version": "Firmware Version", + "Last Heartbeat": "Last Heartbeat", + "Never Connected": "Never Connected", + "View Logs": "View Logs", + "Real-time Operation Logs (Last 50)": "Real-time Operation Logs (Last 50)", + "All Times System Timezone": "All times are in system timezone", + "Level": "Level", + "Logs": "Logs", + "Time": "Time", + "Message": "Message", + "Online": "Online", + "Offline": "Offline", + "Connecting...": "Connecting...", + "No logs found": "No logs found", + "Management of operational parameters and models": "Management of operational parameters and models", + "ECPay Invoice Settings Description": "ECPay Electronic Invoice Settings", + "E.SUN QR Scan Settings Description": "E.SUN Bank QR Scan Payment Settings", + "LINE Pay Direct Settings Description": "LINE Pay Official Direct Connection Settings", + "TapPay Integration Settings Description": "TapPay Payment Integration Settings", + "Merchant IDs": "Merchant IDs", + "Parameters": "Parameters", + "Hardware & Network": "Hardware & Network", + "Serial & Version": "Serial & Version", + "Heartbeat": "Heartbeat", + "Heating Range": "Heating Range", + "API Token": "API Token", + "No location set": "No location set", + "Close Panel": "Close Panel", + "Operations": "Operations", + "Operational Parameters": "Operational Parameters", + "Hardware & Slots": "Hardware & Slots", + "Slot Mechanism (default: Conveyor, check for Spring)": "Slot Mechanism (default: Conveyor, check for Spring)", + "Payment & Invoice": "Payment & Invoice", + "Payment Config": "Payment Config", + "Invoice Status": "Invoice Status", + "No Invoice": "No Invoice", + "Default Donate": "Default Donate", + "Default Not Donate": "Default Not Donate", + "Member & External": "Member & External", + "Welcome Gift": "Welcome Gift", + "Enabled/Disabled": "Enabled/Disabled", + "Member System": "Member System", + "Machine Images": "Machine Images", + "No images uploaded": "No images uploaded", + "Upload New Images": "Upload New Images", + "Max 3": "Max 3", + "Uploading new images will replace all existing images.": "Uploading new images will replace all existing images.", + "Search machines...": "Search machines...", + "Search models...": "Search models...", + "Card Reader": "Card Reader", + "Owner": "Owner", + "Action": "Action", + "Items": "Items", + "View Details": "View Details", + "Edit Settings": "Edit Settings", + "Are you sure?": "Are you sure?", + "Serial No": "Serial No", + "Select Owner": "Select Owner", + "Select Model": "Select Model", + "Machines": "Machines", + "Models": "Models", + "Edit": "Edit", + "Delete": "Delete", + "None": "None", + "Select Company": "Select Company", + "e.g., Company Standard Pay": "e.g., Company Standard Pay", + "APP_ID": "APP_ID", + "APP_KEY": "APP_KEY", + "ChannelId": "ChannelId", + "ChannelSecret": "ChannelSecret", + "EASY_MERCHANT_ID": "EASY_MERCHANT_ID", + "HashIV": "HashIV", + "HashKey": "HashKey", + "JKO_MERCHANT_ID": "JKO_MERCHANT_ID", + "Key": "Key", + "LINE_MERCHANT_ID": "LINE_MERCHANT_ID", + "PARTNER_KEY": "PARTNER_KEY", + "PI_MERCHANT_ID": "PI_MERCHANT_ID", + "PS_MERCHANT_ID": "PS_MERCHANT_ID", + "Save Config": "Save Config", + "StoreID": "StoreID", + "TermID": "TermID" } \ No newline at end of file diff --git a/lang/ja.json b/lang/ja.json index b5be74c..7d40c8c 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -49,9 +49,6 @@ "Current Stock": "現在の在庫", "Last Signal": "最終信号時間", "Alert Summary": "アラート概要", - "Online": "オンライン", - "Offline": "オフライン", - "Low Stock": "在庫少", "No alert summary": "アラートなし", "No data available": "データなし", "Showing :from to :to of :total items": ":total 件中 :from から :to 件を表示", @@ -144,11 +141,10 @@ "Machine Settings": "機台設定", "Permission Settings": "権限設定", "APP Features": "APP機能", - "Sales": "販売", "Others": "その他", "AI Prediction": "AI予測", - "Roles": "ロール権限", - "Role Management": "ロール権限管理", + "Roles": "ロール權限", + "Role Management": "ロール權限管理", "Define and manage security roles and permissions.": "システムのセキュリティロールと権限を定義および管理します。", "Search roles...": "ロールを検索...", "No permissions": "権限項目なし", @@ -182,21 +178,21 @@ "special-permission": "特別権限", "companies": "顧客管理", "accounts": "アカウント管理", - "roles": "ロール権限", - "Role Permissions": "ロール権限", + "roles": "ロール權限", + "Role Permissions": "ロール權限", "Role Settings": "ロール權限", "No login history yet": "ログイン履歴はまだありません", "Signed in as": "ログイン中", "Logout": "ログアウト", "Joined": "入会日", "Recent Login": "最近のログイン", - "Total Logins": "総ログイン数", - "Account Status": "アカウント状態", + "Total Logins": "總ログイン數", + "Account Status": "アカウント狀態", "Active": "アクティブ", "Customer Management": "顧客管理", "Manage all tenant accounts and validity": "すべてのテナントアカウントと有効期限を管理します", "Add Customer": "顧客を追加", - "Total Customers": "顧客総数", + "Total Customers": "顧客總數", "Expired / Disabled": "期限切れ / 停止中", "Search customers...": "顧客を検索...", "All": "すべて", @@ -276,5 +272,113 @@ "Warning": "警告", "basic-settings": "基本設定", "permissions": "權限設定", - "Error": "エラー" + "Error": "エラー", + "Machine Model Settings": "機台型號設定", + "Machine Model": "機台型號", + "Model Name": "型號名称", + "Machine Count": "機台数量", + "Add Machine Model": "機台型號を追加", + "Edit Machine Model": "機台型號を編輯", + "Machine model created successfully.": "機台型號が正常に作成されました。", + "Machine model updated successfully.": "機台型號が正常に更新されました。", + "Machine model deleted successfully.": "機台型號が正常に削除されました。", + "Cannot delete model that is currently in use by machines.": "機台で使用中の型號は削除できません。", + "Machine Details": "機台詳情", + "Create Machine": "機台新規作成", + "Edit Machine": "機台編集", + "Basic Information": "基本情報", + "Location": "場所", + "Temperature": "温度", + "Firmware Version": "ファームウェアバージョン", + "Last Heartbeat": "最終ハートビート時間", + "Never Connected": "未接続", + "View Logs": "ログを表示", + "Real-time Operation Logs (Last 50)": "リアルタイム操作ログ (直近 50 件)", + "All Times System Timezone": "時間はすべてシステムタイムゾーンです", + "Level": "レベル", + "Logs": "ログ", + "Time": "時間", + "Message": "メッセージ", + "Online": "オンライン", + "Offline": "オフライン", + "Connecting...": "接続中...", + "No logs found": "ログがありません", + "Management of operational parameters and models": "運用パラメータと型番の管理", + "ECPay Invoice Settings Description": "ECPay 電子発票設定", + "E.SUN QR Scan Settings Description": "玉山銀行 QR スキャン決済設定", + "LINE Pay Direct Settings Description": "LINE Pay 公式直結設定", + "TapPay Integration Settings Description": "TapPay 決済連携設定", + "Merchant IDs": "マーチャント ID", + "Parameters": "パラメータ設定", + "Hardware & Network": "ハードウェアとネットワーク", + "Serial & Version": "シリアルとバージョン", + "Heartbeat": "ハートビート状態", + "Heating Range": "加熱時間帯", + "API Token": "API キー", + "No location set": "場所が未設定です", + "Close Panel": "パネルを閉じる", + "Operations": "運用設定", + "Operational Parameters": "運用パラメータ", + "Hardware & Slots": "ハードウェアと貨道", + "Slot Mechanism (default: Conveyor, check for Spring)": "貨道メカニズム (デフォルト:コンベア、チェックでスプリング)", + "Payment & Invoice": "決済と発票", + "Payment Config": "決済設定", + "Invoice Status": "発票発行状態", + "No Invoice": "発票を発行しない", + "Default Donate": "デフォルト寄付", + "Default Not Donate": "デフォルト寄付しない", + "Member & External": "会員と外部システム", + "Welcome Gift": "会員登録特典", + "Enabled/Disabled": "有効/無効", + "Member System": "会員システム", + "Machine Images": "機台写真", + "No images uploaded": "写真がアップロードされていません", + "Upload New Images": "新しい写真をアップロード", + "Max 3": "最大3枚", + "Uploading new images will replace all existing images.": "新しい写真をアップロードすると、既存のすべての写真が置き換えられます。", + "Search machines...": "機台を検索...", + "Search models...": "型番を検索...", + "Card Reader": "カードリーダー", + "Owner": "所属会社", + "Action": "操作", + "Items": "個の項目", + "View Details": "詳細表示", + "Edit Settings": "設定編集", + "Are you sure?": "よろしいですか?", + "Serial No": "機台シリアル番号", + "Select Owner": "所属会社を選択", + "Select Model": "Select Model", + "Machines": "機台リスト", + "Models": "型番リスト", + "Edit": "編集", + "Delete": "削除", + "None": "なし", + "Create Payment Config": "決済設定を新規作成", + "Edit Payment Config": "決済設定を編集", + "Define new third-party payment parameters": "新しいサードパーティ決済パラメータを定義", + "Configuration Name": "設定名称", + "Belongs To Company": "所属会社", + "Select Company": "会社を選択", + "ECPay Invoice": "ECPay 電子発票", + "Store ID": "加盟店ID (MerchantID)", + "HashKey": "HashKey", + "HashIV": "HashIV", + "E.SUN QR Scan": "玉山銀行 QR スキャン", + "StoreID": "加盟店ID (StoreID)", + "TermID": "端末ID (TermID)", + "Key": "キー (Key)", + "LINE Pay Direct": "LINE Pay 直結決済", + "ChannelId": "チャンネルID", + "ChannelSecret": "チャンネルシークレット", + "TapPay Integration": "TapPay 統合決済", + "PARTNER_KEY": "パートナーキー", + "APP_ID": "APP_ID", + "APP_KEY": "APP_KEY", + "LINE_MERCHANT_ID": "LINE Pay 加盟店ID", + "JKO_MERCHANT_ID": "街口支付 加盟店ID", + "PI_MERCHANT_ID": "Pi 拍錢包 加盟店ID", + "PS_MERCHANT_ID": "全盈+Pay 加盟店ID", + "EASY_MERCHANT_ID": "悠遊付 加盟店ID", + "Save Config": "設定を保存", + "e.g., Company Standard Pay": "例:標準決済組合せ" } \ No newline at end of file diff --git a/lang/zh_TW.json b/lang/zh_TW.json index 9bb7c71..b9cf95a 100644 --- a/lang/zh_TW.json +++ b/lang/zh_TW.json @@ -49,9 +49,6 @@ "Current Stock": "當前庫存", "Last Signal": "最後訊號時間", "Alert Summary": "告警摘要", - "Online": "在線", - "Offline": "離線", - "Low Stock": "庫存低", "No alert summary": "暫無告警記錄", "No data available": "暫無資料", "Showing :from to :to of :total items": "顯示第 :from 到 :to 項,共 :total 項", @@ -281,22 +278,22 @@ "Unknown": "未知", "Info": "一般", "Warning": "警告", - "Error": "錯誤", + "Error": "異常", "Management of operational parameters": "機台運作參數管理", "Add Machine": "新增機台", "Search machines...": "搜尋機台...", - "Items": "項", + "Items": "個項目", "Machine Name": "機台名稱", "Serial No": "機台序號", - "Owner": "所屬客戶", + "Owner": "所屬公司", "Model": "機台型號", "Action": "操作", "No location set": "尚未設定位置", "Edit Settings": "編輯設定", "Enter machine name": "請輸入機台名稱", "Enter serial number": "請輸入機台序號", - "Select Owner": "請選擇所屬客戶", - "Select Model": "請選擇機台型號", + "Select Owner": "選擇所屬公司", + "Select Model": "選擇型號", "Customer Payment Config": "客戶金流設定", "Not Used": "不使用", "Edit Machine Settings": "編輯機台設定", @@ -307,18 +304,18 @@ "Checkout Time 2": "卡機結帳時間2", "Heating Start Time": "開啟-加熱時間", "Heating End Time": "關閉-加熱時間", - "Hardware & Slots": "硬體與貨道設定", + "Hardware & Slots": "硬體與貨道", "Card Reader No": "刷卡機編號", "Key No": "鑰匙編號", - "Slot Mechanism (default: Conveyor, check for Spring)": "貨道類型 (預設履帶,勾選為彈簧)", + "Slot Mechanism (default: Conveyor, check for Spring)": "貨道機制 (預設履帶,勾選為彈簧)", "Payment & Invoice": "金流與發票", - "Invoice Status": "發票狀態碼", - "No Invoice": "不開發票", - "Default Donate": "開發票預設捐", - "Default Not Donate": "開發票預設不捐", + "Invoice Status": "發票開立狀態", + "No Invoice": "不開立發票", + "Default Donate": "預設捐贈", + "Default Not Donate": "預設不捐贈", "Member & External": "會員與外部系統", - "Welcome Gift": "來店禮開關", - "Enabled/Disabled": "啟用/禁用", + "Welcome Gift": "註冊成效禮", + "Enabled/Disabled": "啟用/停用", "Member System": "會員系統", "Payment Configuration": "客戶金流設定", "Merchant payment gateway settings management": "特約商店支付網關參數管理", @@ -346,7 +343,7 @@ "PARTNER_KEY": "PARTNER_KEY", "APP_ID": "APP_ID", "APP_KEY": "APP_KEY", - "Merchant IDs": "特約商店代號 (Merchant IDs)", + "Merchant IDs": "商店代號群", "LINE_MERCHANT_ID": "LINE Pay 商店代號", "JKO_MERCHANT_ID": "街口支付 商店代號", "PI_MERCHANT_ID": "Pi 拍錢包 商店代號", @@ -354,5 +351,65 @@ "EASY_MERCHANT_ID": "悠遊付 商店代號", "basic-settings": "基本設定", "permissions": "權限設定", - "Edit Payment Config": "編輯金流配置" + "Edit Payment Config": "編輯金流配置", + "Machine Model Settings": "機台型號設定", + "Machine Model": "機台型號", + "Model Name": "型號名稱", + "Machine Count": "機台數量", + "Add Machine Model": "新增機台型號", + "Edit Machine Model": "編輯機台型號", + "Machine model created successfully.": "機台型號已成功建立。", + "Machine model updated successfully.": "機台型號已成功更新。", + "Machine model deleted successfully.": "機台型號已成功刪除。", + "Cannot delete model that is currently in use by machines.": "無法刪除目前正在被機台使用的型號。", + "Machine Details": "機台詳情", + "Create Machine": "新增機台", + "Edit Machine": "編輯機台", + "Basic Information": "基本資訊", + "Location": "位置", + "Temperature": "溫度", + "Firmware Version": "韌體版本", + "Last Heartbeat": "最後心跳時間", + "Never Connected": "從未連線", + "View Logs": "查看日誌", + "Real-time Operation Logs (Last 50)": "即時操作日誌 (最後 50 筆)", + "All Times System Timezone": "所有時間為系統時區", + "Level": "層級", + "Logs": "日誌", + "Time": "時間", + "Message": "訊息", + "Online": "線上", + "Offline": "離線", + "Connecting...": "連線中", + "No logs found": "暫無相關日誌", + "Management of operational parameters and models": "管理運作參數與型號", + "ECPay Invoice Settings Description": "綠界科技電子發票設定", + "E.SUN QR Scan Settings Description": "玉山銀行掃碼支付設定", + "LINE Pay Direct Settings Description": "LINE Pay 官方直連設定", + "TapPay Integration Settings Description": "喬睿科技支付串接設定", + "Parameters": "參數設定", + "Hardware & Network": "硬體與網路", + "Serial & Version": "序號與版本", + "Heartbeat": "心跳狀態", + "Heating Range": "加熱時段", + "API Token": "API 金鑰", + "Close Panel": "關閉面板", + "Operations": "運作設定", + "Payment Config": "金流配置", + "Machine Images": "機台照片", + "No images uploaded": "尚未上傳照片", + "Upload New Images": "上傳新照片", + "Max 3": "最多 3 張", + "Uploading new images will replace all existing images.": "上傳新照片將會取代所有現有照片。", + "Search models...": "搜尋型號...", + "Card Reader": "刷卡機", + "View Details": "查看詳情", + "Are you sure?": "確定要執行此操作嗎?", + "Machines": "機台列表", + "Models": "型號列表", + "Edit": "編輯", + "Delete": "刪除", + "None": "無", + "Select Company": "選擇所屬公司", + "e.g., Company Standard Pay": "例如:公司標準支付" } \ No newline at end of file diff --git a/resources/views/admin/basic-settings/machines/index.blade.php b/resources/views/admin/basic-settings/machines/index.blade.php index 6190c22..5683141 100644 --- a/resources/views/admin/basic-settings/machines/index.blade.php +++ b/resources/views/admin/basic-settings/machines/index.blade.php @@ -1,203 +1,373 @@ @extends('layouts.admin') @section('content') -
-
+

{{ __('Machine Settings') }}

-

{{ __('Management of operational parameters') }}

+

{{ __('Management of operational parameters and models') }}

-
- + @else + + @endif
- -
+ + + + +
-
+
+ - + - +
-
- + @if($tab === 'machines') +
- - - - - + + + + + - @foreach($machines as $machine) + @forelse($machines as $machine) - - - - - @endforeach - -
{{ __('Machine Info') }}{{ __('Status') }}{{ __('Card Reader') }}{{ __('Owner') }}{{ __('Action') }} + {{ __('Machine Info') }} + {{ __('Status') }} + {{ __('Card Reader') }} + {{ __('Owner') }} + {{ __('Action') }}
-
- +
+ + +
-
{{ $machine->name }}
+
+ {{ $machine->name }}
- {{ $machine->serial_no }} + {{ + $machine->serial_no }} - {{ $machine->machineModel->name ?? '--' }} + {{ + $machine->machineModel->name ?? '--' }}
@php - $isOnline = $machine->last_heartbeat_at && $machine->last_heartbeat_at->diffInMinutes() < 5; - @endphp -
+ $isOnline = $machine->last_heartbeat_at && $machine->last_heartbeat_at->diffInMinutes() < 5; + @endphp
@if($isOnline) - - + + @else - + @endif
- + {{ $isOnline ? __('Online') : __('Offline') }} -
-
-
- {{ $machine->card_reader_seconds ?? 0 }}s / No.{{ $machine->card_reader_no ?? '--' }} -
-
- - {{ $machine->company->name ?? __('None') }} - - - - - - -
-
- - -
- {{ $machines->links('vendor.pagination.luxury') }}
+ + +
+ {{ $machine->card_reader_seconds ?? 0 }}s / No.{{ + $machine->card_reader_no ?? '--' }} +
+ + + + {{ $machine->company->name ?? __('None') }} + + + + + + + + + + + + @empty + + + {{ __('No data available') }} + + + @endforelse + + +
+
+ {{ $machines->appends(['tab' => 'machines'])->links('vendor.pagination.luxury') }}
- -