diff --git a/app/Http/Controllers/Admin/MachineController.php b/app/Http/Controllers/Admin/MachineController.php index fe8d57b..6386ce4 100644 --- a/app/Http/Controllers/Admin/MachineController.php +++ b/app/Http/Controllers/Admin/MachineController.php @@ -208,9 +208,12 @@ class MachineController extends AdminController ->get(); // 取得該機台目前所有等待中的庫存更新指令 (Pending Commands) + // 僅將「1 分鐘內」的 pending 視為鎖定中;超過 1 分鐘未收到機台回傳 (ACK) + // 視為逾時,自動解除鎖定,讓使用者可重新編輯與重新下發 (與 dispense 逾時邏輯一致) $pendingSlotNos = \App\Models\Machine\RemoteCommand::where('machine_id', $machine->id) ->where('command_type', 'reload_stock') ->where('status', 'pending') + ->where('created_at', '>=', now()->subMinute()) ->get() ->pluck('payload.slot_no') ->flatten() diff --git a/app/Services/Machine/MachineService.php b/app/Services/Machine/MachineService.php index 9086329..abda173 100644 --- a/app/Services/Machine/MachineService.php +++ b/app/Services/Machine/MachineService.php @@ -510,10 +510,15 @@ class MachineService ->first(); if ($pendingCommand) { - // 直接覆蓋:將前一個尚未執行的指令標記為「已取代」 + // 重新下發時覆蓋前一筆尚未執行的指令。 + // 若舊指令已超過 1 分鐘未收到機台回傳 (ACK),視為逾時 (timeout); + // 否則為使用者主動覆蓋 (superseded)。與 dispense 逾時邏輯一致。 + $isTimedOut = $pendingCommand->created_at->lt(now()->subMinute()); $pendingCommand->update([ - 'status' => 'superseded', - 'note' => __('Superseded by new command'), + 'status' => $isTimedOut ? 'timeout' : 'superseded', + 'note' => $isTimedOut + ? __('Superseded by new command (Timeout)') + : __('Superseded by new command'), ]); }