From 9e3eb8944b5a7b252e7a4dfaf3a8ff475ac39729 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Tue, 2 Jun 2026 14:19:48 +0800 Subject: [PATCH] =?UTF-8?q?[FEAT]=20=E6=96=B0=E5=A2=9E=E6=BA=AB=E6=8E=A7?= =?UTF-8?q?=E6=84=9F=E6=B8=AC=E5=99=A8=E9=9B=A2=E6=95=A3=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E8=99=95=E7=90=86=E6=A9=9F=E5=88=B6=E8=88=87?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. [FEAT] 新增 App/Jobs/Machine/ProcessMachineEvent.php 用以非同步處理 machine/{serial_no}/event 事件,將收到的風扇狀態(fanon/fanoff)記錄在機台狀態日誌中。 2. [FEAT] 修改 ListenMqttQueue.php 支援 event 類型的 MQTT 事件分派路由。 3. [FEAT] 更新 config/api-docs.php 規格文件,將原本在 status 主題的風扇說明移去,並新增獨立的 event (機台硬體事件上報) 主題文件。 4. [FIX] 更新多語系資源檔,新增 fanon 與 fanoff 扁平鍵對譯並進行 ksort 排序與去逸出美化。 --- app/Console/Commands/ListenMqttQueue.php | 4 ++ app/Jobs/Machine/ProcessMachineEvent.php | 59 ++++++++++++++++++++++++ config/api-docs.php | 16 ++++++- lang/en.json | 2 + lang/ja.json | 2 + lang/zh_TW.json | 2 + 6 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 app/Jobs/Machine/ProcessMachineEvent.php diff --git a/app/Console/Commands/ListenMqttQueue.php b/app/Console/Commands/ListenMqttQueue.php index 1839930..1b541f5 100644 --- a/app/Console/Commands/ListenMqttQueue.php +++ b/app/Console/Commands/ListenMqttQueue.php @@ -9,6 +9,7 @@ use App\Jobs\Machine\ProcessHeartbeat; use App\Jobs\Machine\ProcessMachineError; use App\Jobs\Machine\ProcessTransaction; use App\Jobs\Machine\ProcessStatus; +use App\Jobs\Machine\ProcessMachineEvent; use App\Jobs\Transaction\ProcessInvoice; use App\Jobs\Transaction\ProcessDispenseRecord; use App\Jobs\Machine\ProcessCommandAck; @@ -97,6 +98,9 @@ class ListenMqttQueue extends Command case 'status': ProcessStatus::dispatch($serialNo, $payload); break; + case 'event': + ProcessMachineEvent::dispatch($serialNo, $payload); + break; case 'error': ProcessMachineError::dispatch($serialNo, $payload); break; diff --git a/app/Jobs/Machine/ProcessMachineEvent.php b/app/Jobs/Machine/ProcessMachineEvent.php new file mode 100644 index 0000000..b6f0535 --- /dev/null +++ b/app/Jobs/Machine/ProcessMachineEvent.php @@ -0,0 +1,59 @@ +serialNo = $serialNo; + $this->payload = $payload; + } + + /** + * Execute the job. + */ + public function handle(): void + { + $machine = Machine::withoutGlobalScopes()->where('serial_no', $this->serialNo)->first(); + + if (!$machine) { + Log::warning("ProcessMachineEvent: Machine not found [{$this->serialNo}]"); + return; + } + + $event = $this->payload['event'] ?? null; + + if (!$event) { + Log::warning("ProcessMachineEvent: Missing event in payload", ['payload' => $this->payload]); + return; + } + + // 寫入機台狀態日誌,type 為 'status' 以便正確歸類顯示於「機台狀態」日誌中 + $machine->logs()->create([ + 'company_id' => $machine->company_id, + 'type' => 'status', // 忠實呈現於機台狀態中 + 'level' => 'info', + 'message' => $event, // 例如 "fanon" 或 "fanoff" + 'context' => $this->payload, + ]); + + Log::info("ProcessMachineEvent: Machine [{$machine->serial_no}] recorded event [{$event}] to status logs"); + } +} diff --git a/config/api-docs.php b/config/api-docs.php index d0e24c4..190c65a 100644 --- a/config/api-docs.php +++ b/config/api-docs.php @@ -534,12 +534,26 @@ return [ 'qos' => 0, 'description' => '用於機台連線與斷線的即時狀態同步。通常用於 MQTT 的遺囑訊息 (LWT) 設定,或由 Broker 連線事件觸發。', 'payload_parameters' => [ - 'status' => ['type' => 'string', 'description' => '連線狀態。接受值:online, offline'], + 'status' => ['type' => 'string', 'description' => '連線狀態。接受值:online, offline, restarting'], ], 'payload_example' => [ 'status' => 'online' ], ], + [ + 'name' => '機台硬體事件上報 (Event)', + 'slug' => 'mqtt-event', + 'action' => 'PUB', + 'topic' => 'machine/{serial_no}/event', + 'qos' => 1, + 'description' => '用於機台上報各種獨立的硬體運行與物理事件。後台收到後會直接寫入機台狀態日誌中並進行多語系翻譯。', + 'payload_parameters' => [ + 'event' => ['type' => 'string', 'description' => '事件識別碼。例如:fanon (風扇開), fanoff (風扇關) 等。'], + ], + 'payload_example' => [ + 'event' => 'fanon' + ], + ], [ 'name' => '機台異常上報 (Error)', 'slug' => 'mqtt-error', diff --git a/lang/en.json b/lang/en.json index 7d91fdf..0e8263f 100644 --- a/lang/en.json +++ b/lang/en.json @@ -2276,6 +2276,8 @@ "enabled": "enabled", "error": "error", "failed": "failed", + "fanoff": "Fan turned off", + "fanon": "Fan turned on", "files selected": "files selected", "hours ago": "hours ago", "image": "image", diff --git a/lang/ja.json b/lang/ja.json index 131fd97..c04b0d0 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -2276,6 +2276,8 @@ "enabled": "有効", "error": "異常", "failed": "失敗", + "fanoff": "ファン停止", + "fanon": "ファン起動", "files selected": "個のファイルを選択しました", "hours ago": "時間前", "image": "画像", diff --git a/lang/zh_TW.json b/lang/zh_TW.json index 422ec49..32e077e 100644 --- a/lang/zh_TW.json +++ b/lang/zh_TW.json @@ -2276,6 +2276,8 @@ "enabled": "啟用", "error": "異常", "failed": "失敗", + "fanoff": "風扇關", + "fanon": "風扇開", "files selected": "個檔案已選擇", "hours ago": "小時前", "image": "圖片",