From a8b88b337532683e666f3ee0a36b2e5d71b988e6 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Wed, 4 Feb 2026 13:24:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(inventory):=20=E5=AF=A6=E4=BD=9C=E7=9B=A4?= =?UTF-8?q?=E9=BB=9E=E3=80=81=E7=9B=A4=E8=AA=BF=E8=88=87=E8=AA=BF=E6=92=A5?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=B4=80=E9=8C=84=EF=BC=8C=E4=B8=A6=E6=94=AF?= =?UTF-8?q?=E6=8F=B4=E5=89=8D=E7=AB=AF=E6=9C=AC=E5=9C=B0=E5=8C=96=E9=A1=AF?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/AdjustDocController.php | 51 ++++++++++++++++--- .../Controllers/CountDocController.php | 19 ++++--- .../Controllers/TransferOrderController.php | 49 ++++++++++++++++++ .../ActivityLog/ActivityDetailDialog.tsx | 15 ++++++ 4 files changed, 122 insertions(+), 12 deletions(-) diff --git a/app/Modules/Inventory/Controllers/AdjustDocController.php b/app/Modules/Inventory/Controllers/AdjustDocController.php index 2c5db51..ee9ae2c 100644 --- a/app/Modules/Inventory/Controllers/AdjustDocController.php +++ b/app/Modules/Inventory/Controllers/AdjustDocController.php @@ -76,6 +76,22 @@ class AdjustDocController extends Controller } $doc = $this->adjustService->createFromCountDoc($countDoc, auth()->id()); + + // 記錄活動 + activity() + ->performedOn($doc) + ->causedBy(auth()->user()) + ->event('created') + ->withProperties([ + 'attributes' => $doc->toArray(), + 'snapshot' => [ + 'doc_no' => $doc->doc_no, + 'warehouse_name' => $doc->warehouse?->name, + 'count_doc_no' => $countDoc->doc_no, + ] + ]) + ->log('created_from_count'); + return redirect()->route('inventory.adjust.show', [$doc->id]) ->with('success', '已從盤點單生成盤調單'); } @@ -172,6 +188,22 @@ class AdjustDocController extends Controller // 提交 (items 更新 或 過帳) if ($request->input('action') === 'post') { $this->adjustService->post($doc, auth()->id()); + + // 記錄活動 + activity() + ->performedOn($doc) + ->causedBy(auth()->user()) + ->event('posted') + ->withProperties([ + 'attributes' => ['status' => 'posted'], + 'old' => ['status' => 'draft'], + 'snapshot' => [ + 'doc_no' => $doc->doc_no, + 'warehouse_name' => $doc->warehouse?->name, + ] + ]) + ->log('posted'); + return redirect()->route('inventory.adjust.index') ->with('success', '盤調單已過帳生效'); } @@ -195,12 +227,19 @@ class AdjustDocController extends Controller return redirect()->back()->with('success', '儲存成功'); } - public function destroy(InventoryAdjustDoc $doc) - { - if ($doc->status !== 'draft') { - 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'); + $doc->items()->delete(); $doc->delete(); diff --git a/app/Modules/Inventory/Controllers/CountDocController.php b/app/Modules/Inventory/Controllers/CountDocController.php index e2768dc..266f0e9 100644 --- a/app/Modules/Inventory/Controllers/CountDocController.php +++ b/app/Modules/Inventory/Controllers/CountDocController.php @@ -200,12 +200,19 @@ class CountDocController extends Controller ->with('success', '已取消核准,單據回復為盤點中狀態'); } - public function destroy(InventoryCountDoc $doc) - { - if ($doc->status === 'completed') { - 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'); + $doc->items()->delete(); $doc->delete(); diff --git a/app/Modules/Inventory/Controllers/TransferOrderController.php b/app/Modules/Inventory/Controllers/TransferOrderController.php index 690efc1..c4e7484 100644 --- a/app/Modules/Inventory/Controllers/TransferOrderController.php +++ b/app/Modules/Inventory/Controllers/TransferOrderController.php @@ -81,6 +81,21 @@ class TransferOrderController extends Controller $remarks, auth()->id() ); + + // 記錄活動 + activity() + ->performedOn($order) + ->causedBy(auth()->user()) + ->event('created') + ->withProperties([ + 'attributes' => $order->toArray(), + 'snapshot' => [ + 'doc_no' => $order->doc_no, + 'from_warehouse_name' => $order->fromWarehouse?->name, + 'to_warehouse_name' => $order->toWarehouse?->name, + ] + ]) + ->log('created'); // 如果請求包含單筆商品資訊 if ($request->has('product_id')) { @@ -95,6 +110,23 @@ class TransferOrderController extends Controller if ($request->input('instant_post') === true) { try { $this->transferService->post($order, auth()->id()); + + // 記錄過帳活動 + activity() + ->performedOn($order) + ->causedBy(auth()->user()) + ->event('posted') + ->withProperties([ + 'attributes' => ['status' => 'posted'], + 'old' => ['status' => 'draft'], + 'snapshot' => [ + 'doc_no' => $order->doc_no, + 'from_warehouse_name' => $order->fromWarehouse?->name, + 'to_warehouse_name' => $order->toWarehouse?->name, + ] + ]) + ->log('posted'); + return redirect()->back()->with('success', '撥補成功,庫存已更新'); } catch (\Exception $e) { // 如果過帳失敗,雖然單據已建立,但應回報錯誤 @@ -156,6 +188,23 @@ class TransferOrderController extends Controller if ($request->input('action') === 'post') { try { $this->transferService->post($order, auth()->id()); + + // 記錄活動 + activity() + ->performedOn($order) + ->causedBy(auth()->user()) + ->event('posted') + ->withProperties([ + 'attributes' => ['status' => 'posted'], + 'old' => ['status' => 'draft'], + 'snapshot' => [ + 'doc_no' => $order->doc_no, + 'from_warehouse_name' => $order->fromWarehouse?->name, + 'to_warehouse_name' => $order->toWarehouse?->name, + ] + ]) + ->log('posted'); + return redirect()->route('inventory.transfer.index') ->with('success', '調撥單已過帳完成'); } catch (\Exception $e) { diff --git a/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx b/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx index afd73bf..37a8f22 100644 --- a/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx +++ b/resources/js/Components/ActivityLog/ActivityDetailDialog.tsx @@ -131,6 +131,18 @@ const fieldLabels: Record = { recipe_id: '生產配方', recipe_name: '配方名稱', yield_quantity: '預期產量', + // 庫存單據通用欄位 + doc_no: '單據編號', + snapshot_date: '快照日期', + completed_at: '完成日期', + posted_at: '過帳日期', + from_warehouse_id: '來源倉庫', + from_warehouse_name: '來源倉庫名稱', + to_warehouse_id: '目的地倉庫', + to_warehouse_name: '目的地倉庫名稱', + reason: '原因', + count_doc_id: '盤點單 ID', + count_doc_no: '盤點單號', }; // 狀態翻譯對照表 @@ -145,6 +157,9 @@ const statusMap: Record = { completed: '已完成', closed: '已結案', partial: '部分收貨', + // 庫存單據狀態 + counting: '盤點中', + posted: '已過帳', // 生產工單狀態 planned: '已計畫', in_progress: '生產中',