From 71458dd976807326876274dca7da6b077b367bf4 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Mon, 2 Feb 2026 09:27:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(inventory):=20=E5=AF=A6=E4=BD=9C=E6=92=A5?= =?UTF-8?q?=E8=A3=9C=E5=96=AE=E5=BB=BA=E7=AB=8B=E5=8D=B3=E8=87=AA=E5=8B=95?= =?UTF-8?q?=E9=81=8E=E5=B8=B3=E9=82=8F=E8=BC=AF=E4=B8=A6=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E5=8F=83=E6=95=B8=E5=B0=8D=E9=BD=8A=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/TransferOrderController.php | 41 ++++++++++++++++--- .../Warehouse/TransferOrderDialog.tsx | 19 +++------ 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/app/Modules/Inventory/Controllers/TransferOrderController.php b/app/Modules/Inventory/Controllers/TransferOrderController.php index 86cbd48..8a97f8b 100644 --- a/app/Modules/Inventory/Controllers/TransferOrderController.php +++ b/app/Modules/Inventory/Controllers/TransferOrderController.php @@ -55,19 +55,50 @@ class TransferOrderController extends Controller public function store(Request $request) { + // 兼容前端不同的參數命名 (from/source, to/target) + $fromId = $request->input('from_warehouse_id') ?? $request->input('sourceWarehouseId'); + $toId = $request->input('to_warehouse_id') ?? $request->input('targetWarehouseId'); + $validated = $request->validate([ - 'from_warehouse_id' => 'required|exists:warehouses,id', - 'to_warehouse_id' => 'required|exists:warehouses,id|different:from_warehouse_id', + 'from_warehouse_id' => 'required_without:sourceWarehouseId|exists:warehouses,id', + 'to_warehouse_id' => 'required_without:targetWarehouseId|exists:warehouses,id|different:from_warehouse_id', 'remarks' => 'nullable|string', + 'notes' => 'nullable|string', + 'instant_post' => 'boolean', + // 支援單筆商品直接建立 (撥補單模式) + 'product_id' => 'nullable|exists:products,id', + 'quantity' => 'nullable|numeric|min:0.01', + 'batch_number' => 'nullable|string', ]); + $remarks = $validated['remarks'] ?? $validated['notes'] ?? null; $order = $this->transferService->createOrder( - $validated['from_warehouse_id'], - $validated['to_warehouse_id'], - $validated['remarks'] ?? null, + $fromId, + $toId, + $remarks, auth()->id() ); + // 如果請求包含單筆商品資訊 + if ($request->has('product_id')) { + $this->transferService->updateItems($order, [[ + 'product_id' => $validated['product_id'], + 'quantity' => $validated['quantity'], + 'batch_number' => $validated['batch_number'] ?? null, + ]]); + } + + // 如果是撥補單,執行直接過帳 + if ($request->input('instant_post') === true) { + try { + $this->transferService->post($order, auth()->id()); + return redirect()->back()->with('success', '撥補成功,庫存已更新'); + } catch (\Exception $e) { + // 如果過帳失敗,雖然單據已建立,但應回報錯誤 + return redirect()->back()->withErrors(['items' => $e->getMessage()]); + } + } + return redirect()->route('inventory.transfer.show', [$order->id]) ->with('success', '已建立調撥單'); } diff --git a/resources/js/Components/Warehouse/TransferOrderDialog.tsx b/resources/js/Components/Warehouse/TransferOrderDialog.tsx index d082a19..51b48f7 100644 --- a/resources/js/Components/Warehouse/TransferOrderDialog.tsx +++ b/resources/js/Components/Warehouse/TransferOrderDialog.tsx @@ -152,22 +152,15 @@ export default function TransferOrderDialog({ } } - const sourceWarehouse = warehouses.find((w) => w.id === formData.sourceWarehouseId); - const targetWarehouse = warehouses.find((w) => w.id === formData.targetWarehouseId); - onSave({ - sourceWarehouseId: formData.sourceWarehouseId, - sourceWarehouseName: sourceWarehouse?.name || "", - targetWarehouseId: formData.targetWarehouseId, - targetWarehouseName: targetWarehouse?.name || "", - productId: formData.productId, - productName: formData.productName, - batchNumber: formData.batchNumber, + from_warehouse_id: formData.sourceWarehouseId, + to_warehouse_id: formData.targetWarehouseId, + product_id: formData.productId, quantity: formData.quantity, - transferDate: formData.transferDate, - status: formData.status, + batch_number: formData.batchNumber, notes: formData.notes, - }); + instant_post: true, + } as any); }; const handleProductChange = (productKey: string) => {