$warehouseId, 'status' => 'draft', 'remarks' => $remarks, 'created_by' => $userId, ]); return $doc; }); } /** * 執行快照:鎖定當前庫存量 */ public function snapshot(InventoryCountDoc $doc): void { DB::transaction(function () use ($doc) { // 清除舊的 items (如果有) $doc->items()->delete(); // 取得該倉庫所有庫存 (包含 quantity = 0 但未軟刪除的) // 這裡可以根據需求決定是否要過濾掉 0 庫存,通常盤點單會希望能看到所有 "帳上有紀錄" 的東西 $inventories = Inventory::where('warehouse_id', $doc->warehouse_id) ->whereNull('deleted_at') ->get(); $items = []; foreach ($inventories as $inv) { $items[] = [ 'count_doc_id' => $doc->id, 'product_id' => $inv->product_id, 'batch_number' => $inv->batch_number, 'system_qty' => $inv->quantity, 'counted_qty' => null, // 預設未盤點 'diff_qty' => 0, 'created_at' => now(), 'updated_at' => now(), ]; } if (!empty($items)) { InventoryCountItem::insert($items); } $doc->update([ 'status' => 'counting', 'snapshot_date' => now(), ]); }); } /** * 完成盤點:過帳差異 */ public function complete(InventoryCountDoc $doc, int $userId): void { DB::transaction(function () use ($doc, $userId) { // 僅更新單據狀態為「已完成」,不執行庫存入庫/調整 // 盤點單僅作為記錄,後續調整由盤調單 (AdjustDoc) 執行 $doc->update([ 'status' => 'completed', 'completed_at' => now(), 'completed_by' => $userId, ]); }); } /** * 更新盤點數量 */ public function updateCount(InventoryCountDoc $doc, array $itemsData): void { DB::transaction(function () use ($doc, $itemsData) { foreach ($itemsData as $data) { $item = $doc->items()->find($data['id']); if ($item) { $countedQty = $data['counted_qty']; $diff = is_numeric($countedQty) ? ($countedQty - $item->system_qty) : 0; $item->update([ 'counted_qty' => $countedQty, 'diff_qty' => $diff, 'notes' => $data['notes'] ?? $item->notes, ]); } } }); } }