feat(inventory): 重構庫存盤點流程與優化操作日誌

1. 重構盤點流程:實作自動狀態轉換(盤點中/盤點完成)、整合按鈕為「儲存盤點結果」、更名 UI 狀態標籤。
2. 優化操作日誌:
   - 實作全域 ID 轉名稱邏輯(倉庫、使用者)。
   - 合併單次操作的日誌記錄,避免重複產生。
   - 修復日誌產生過程中的 Collection 修改錯誤。
3. 修正 TypeScript lint 錯誤(Index, Show 頁面)。
This commit is contained in:
2026-02-04 15:12:10 +08:00
parent f4f597e96d
commit 702af0a259
9 changed files with 291 additions and 59 deletions

View File

@@ -84,7 +84,7 @@ class CountDocController extends Controller
);
// 自動執行快照
$this->countService->snapshot($doc);
$this->countService->snapshot($doc, false);
return redirect()->route('inventory.count.show', [$doc->id])
->with('success', '已建立盤點單並完成庫存快照');
@@ -173,14 +173,37 @@ class CountDocController extends Controller
$this->countService->updateCount($doc, $validated['items']);
}
// 如果是按了 "完成盤點"
if ($request->input('action') === 'complete') {
$this->countService->complete($doc, auth()->id());
// 重新讀取以獲取最新狀態
$doc->refresh();
if ($doc->status === 'completed') {
return redirect()->route('inventory.count.index')
->with('success', '盤點單已完成');
->with('success', '盤點完成,單據已自動存檔並完成');
}
return redirect()->back()->with('success', '暫存成功');
return redirect()->back()->with('success', '盤點資料已暫存');
}
public function reopen(InventoryCountDoc $doc)
{
// 權限檢查 (通常僅允許有權限者執行,例如 inventory.adjust)
// 注意:前端已經用 <Can> 保護按鈕,後端這裡最好也加上檢查
if (!auth()->user()->can('inventory.adjust')) {
abort(403);
}
if ($doc->status !== 'completed') {
return redirect()->back()->with('error', '僅能針對已完成的盤點單重新開啟盤點');
}
// 執行取消核准邏輯
$doc->update([
'status' => 'counting', // 回復為盤點中
'completed_at' => null, // 清除完成時間
'completed_by' => null, // 清除完成者
]);
return redirect()->back()->with('success', '已重新開啟盤點,單據回復為盤點中狀態');
}
public function destroy(InventoryCountDoc $doc)
@@ -189,18 +212,7 @@ class CountDocController extends Controller
return redirect()->back()->with('error', '已完成的盤點單無法刪除');
}
// 記錄活動
activity()
->performedOn($doc)
->causedBy(auth()->user())
->event('deleted')
->withProperties([
'snapshot' => [
'doc_no' => $doc->doc_no,
'warehouse_name' => $doc->warehouse?->name,
]
])
->log('deleted');
// Activity Log handled by Model Trait
$doc->items()->delete();
$doc->delete();