feat(生產/庫存): 實作生產管理模組與批號追溯功能
All checks were successful
Koori-ERP-Deploy-System / deploy-demo (push) Successful in 53s
Koori-ERP-Deploy-System / deploy-production (push) Has been skipped

This commit is contained in:
2026-01-21 17:19:36 +08:00
parent fc20c6d813
commit 1ae21febb5
17 changed files with 1753 additions and 33 deletions

View File

@@ -39,8 +39,8 @@ class InventoryController extends Controller
'quantity' => (float) $inv->quantity,
'safetyStock' => $inv->safety_stock !== null ? (float) $inv->safety_stock : null,
'status' => '正常', // 前端會根據 quantity 與 safetyStock 重算,但後端亦可提供基礎狀態
'batchNumber' => 'BATCH-' . $inv->id, // DB 批號,暫時模擬,某些 UI 可能還會用到
'expiryDate' => '2099-12-31', // DB 無效期,暫時模擬
'batchNumber' => $inv->batch_number ?? 'BATCH-' . $inv->id, // 優先使用 DB 批號,若無則 fallback
'expiryDate' => $inv->expiry_date ? $inv->expiry_date->format('Y-m-d') : null,
'lastInboundDate' => $inv->lastIncomingTransaction ? ($inv->lastIncomingTransaction->actual_time ? $inv->lastIncomingTransaction->actual_time->format('Y-m-d') : $inv->lastIncomingTransaction->created_at->format('Y-m-d')) : null,
'lastOutboundDate' => $inv->lastOutgoingTransaction ? ($inv->lastOutgoingTransaction->actual_time ? $inv->lastOutgoingTransaction->actual_time->format('Y-m-d') : $inv->lastOutgoingTransaction->created_at->format('Y-m-d')) : null,
];
@@ -98,15 +98,39 @@ class InventoryController extends Controller
'items' => 'required|array|min:1',
'items.*.productId' => 'required|exists:products,id',
'items.*.quantity' => 'required|numeric|min:0.01',
'items.*.batchNumber' => 'nullable|string',
'items.*.expiryDate' => 'nullable|date',
]);
return \Illuminate\Support\Facades\DB::transaction(function () use ($validated, $warehouse) {
foreach ($validated['items'] as $item) {
// 取得或建立庫存紀錄
// 取得或初始化庫存紀錄
$batchNumber = $item['batchNumber'] ?? null;
// 如果未提供批號,且系統設定需要批號,則自動產生 (這裡先保留彈性,若無則為 null 或預設)
if (empty($batchNumber)) {
// 嘗試自動產生:需要 product_code, country, date
$product = \App\Models\Product::find($item['productId']);
if ($product) {
$batchNumber = \App\Models\Inventory::generateBatchNumber(
$product->code ?? 'UNK',
'TW', // 預設來源
$validated['inboundDate']
);
}
}
// 取得或建立庫存紀錄 (加入批號判斷)
$inventory = $warehouse->inventories()->firstOrNew(
['product_id' => $item['productId']],
['quantity' => 0, 'safety_stock' => null]
[
'product_id' => $item['productId'],
'batch_number' => $batchNumber
],
[
'quantity' => 0,
'safety_stock' => null,
'arrival_date' => $validated['inboundDate'],
'expiry_date' => $item['expiryDate'] ?? null,
'origin_country' => 'TW', // 預設
]
);
$currentQty = $inventory->quantity;