From 84ec95d95f15c39106d16eb547752863bf6a24e2 Mon Sep 17 00:00:00 2001 From: twsystem1004 Date: Fri, 17 Jul 2026 08:29:34 +0000 Subject: [PATCH] =?UTF-8?q?feat(remote):=20=E6=8C=87=E4=BB=A4=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E6=96=B0=E5=A2=9E=E5=8D=A1=E8=B2=A8=E8=B2=A8=E9=81=93?= =?UTF-8?q?=E6=9F=A5=E8=A9=A2/=E6=B8=85=E9=99=A4=20(query=5Fjam=20/=20clea?= =?UTF-8?q?r=5Fjam)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 微波機出貨卡貨後,下位機會記錄該貨道異常;未清除前該貨道再出貨仍會失敗, 原本只能到機台端手動排除。此版把機台「系統設定 → 貨道卡貨排除」的能力 搬到後台指令中心,可遠端對個別機台查詢/清除。 對應下位機協定 4.5.32(CMD 0x32): 0x00 查詢貨道卡貨狀態 → 回 卡貨貨道N + 皮帶自檢失敗貨道N 0x01 清除卡貨故障(不帶貨道參數=一次清全部) - RemoteController: command_type 白名單加 query_jam,clear_jam - index.blade.php: 新增兩顆按鈕;getCommandName 對照;translateNote 將 機台回傳的 JSON {jam:[2,5],belt:[]} 渲染為可讀文字 - lang(en/zh_TW/ja): 補 5 個標籤 機台端以 ACK message 回傳 JSON(App v40 JamSlotManager),走既有 ProcessCommandAck → note 的既有管道,故 ACK 處理與 migration 皆免改。 --- .../Controllers/Admin/RemoteController.php | 2 +- lang/en.json | 7 ++- lang/ja.json | 7 ++- lang/zh_TW.json | 7 ++- resources/views/admin/remote/index.blade.php | 60 +++++++++++++++++++ 5 files changed, 79 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/RemoteController.php b/app/Http/Controllers/Admin/RemoteController.php index 6c155a2..6930ab3 100644 --- a/app/Http/Controllers/Admin/RemoteController.php +++ b/app/Http/Controllers/Admin/RemoteController.php @@ -142,7 +142,7 @@ class RemoteController extends Controller { $validated = $request->validate([ 'machine_id' => 'required|exists:machines,id', - 'command_type' => 'required|string|in:reboot,reboot_force,reboot_card,checkout,lock,unlock,change,dispense,fanon,fanoff,fanauto', + 'command_type' => 'required|string|in:reboot,reboot_force,reboot_card,checkout,lock,unlock,change,dispense,fanon,fanoff,fanauto,query_jam,clear_jam', 'amount' => 'nullable|integer|min:0', 'slot_no' => 'nullable|string', 'note' => 'nullable|string|max:255', diff --git a/lang/en.json b/lang/en.json index 03a8b22..b75afcb 100644 --- a/lang/en.json +++ b/lang/en.json @@ -2748,5 +2748,10 @@ "video": "Video", "visit_gift": "Visit Gift", "vs Yesterday": "vs Yesterday", - "warning": "warning" + "warning": "warning", + "Query Jammed Slots": "Query Jammed Slots", + "Clear Jammed Slots": "Clear Jammed Slots", + "No jammed slots": "No jammed slots", + "Jammed slots:": "Jammed slots:", + "Belt self-test failed:": "Belt self-test failed:" } diff --git a/lang/ja.json b/lang/ja.json index 96221a7..3ef49ec 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -2709,5 +2709,10 @@ "video": "動画", "visit_gift": "来店ギフト", "vs Yesterday": "昨日比", - "warning": "警告" + "warning": "警告", + "Query Jammed Slots": "詰まりレーン照会", + "Clear Jammed Slots": "詰まりレーン解除", + "No jammed slots": "詰まりレーンなし", + "Jammed slots:": "詰まりレーン:", + "Belt self-test failed:": "ベルト自己診断failed:" } diff --git a/lang/zh_TW.json b/lang/zh_TW.json index 75c9985..93b3e07 100644 --- a/lang/zh_TW.json +++ b/lang/zh_TW.json @@ -2749,5 +2749,10 @@ "video": "影片", "visit_gift": "來店禮", "vs Yesterday": "較昨日", - "warning": "警告" + "warning": "警告", + "Query Jammed Slots": "查詢卡貨貨道", + "Clear Jammed Slots": "清除卡貨貨道", + "No jammed slots": "無卡貨貨道", + "Jammed slots:": "卡貨貨道:", + "Belt self-test failed:": "皮帶自檢失敗貨道:" } diff --git a/resources/views/admin/remote/index.blade.php b/resources/views/admin/remote/index.blade.php index 7d72714..a8b24be 100644 --- a/resources/views/admin/remote/index.blade.php +++ b/resources/views/admin/remote/index.blade.php @@ -46,6 +46,11 @@ 'Ambient Temperature Upper Limit' => __('Ambient Temperature Upper Limit'), 'Remote Change' => __('Remote Change'), 'Remote Dispense' => __('Remote Dispense'), + 'Query Jammed Slots' => __('Query Jammed Slots'), + 'Clear Jammed Slots' => __('Clear Jammed Slots'), + 'No jammed slots' => __('No jammed slots'), + 'Jammed slots:' => __('Jammed slots:'), + 'Belt self-test failed:' => __('Belt self-test failed:'), 'Adjust Stock & Expiry' => __('Adjust Stock & Expiry'), 'Sync Ads' => __('Sync Ads'), 'Sync Products' => __('Sync Products'), @@ -456,6 +461,8 @@ 'ambient_temp_limit': this.translations['Ambient Temperature Upper Limit'], 'change': this.translations['Remote Change'], 'dispense': this.translations['Remote Dispense'], + 'query_jam': this.translations['Query Jammed Slots'], + 'clear_jam': this.translations['Clear Jammed Slots'], 'reload_stock': this.translations['Adjust Stock & Expiry'], 'update_ads': this.translations['Sync Ads'], 'update_products': this.translations['Sync Products'], @@ -483,6 +490,21 @@ translateNote(note) { if (!note) return ''; + // query_jam 的 ACK message 是 JSON:{"jam":[2,5],"belt":[]}(機台 JamSlotManager.toJson) + // 這裡渲染成可讀文字;非此格式則走原本的字典/原樣顯示。 + if (note.startsWith('{') && note.includes('"jam"')) { + try { + const d = JSON.parse(note); + const parts = []; + parts.push(d.jam && d.jam.length + ? this.translations['Jammed slots:'] + ' ' + d.jam.join('、') + : this.translations['No jammed slots']); + if (d.belt && d.belt.length) { + parts.push(this.translations['Belt self-test failed:'] + ' ' + d.belt.join('、')); + } + return parts.join(' / '); + } catch (e) { /* 解析失敗就原樣顯示 */ } + } const translations = { 'Superseded by new adjustment': this.translations['Superseded by new adjustment'], 'Superseded by new command': this.translations['Superseded by new command'], @@ -703,6 +725,44 @@ + + + + + +