feat(Inventory): 實作批號溯源完整功能與 UI 呈現,包含文字敘述卡片與更完整的關聯屬性

This commit is contained in:
2026-02-26 10:39:24 +08:00
parent 63e4f88a14
commit f960aaaeb2
16 changed files with 1085 additions and 694 deletions

View File

@@ -175,15 +175,33 @@ export default function Show({ requisition, warehouses }: Props) {
};
const handleApprove = () => {
// 確認每個核准數量
// 確認每個核准數量與庫存上限
for (const item of approvedItems) {
const originalItem = requisition.items.find(i => i.id === item.id);
if (!originalItem) continue;
for (const batch of item.batches) {
if (batch.qty !== "") {
const qty = parseFloat(batch.qty);
if (isNaN(qty) || qty < 0) {
toast.error("核准數量不能為負數");
toast.error("核准數量不能為負數或無效數字");
return;
}
// 檢查是否超過批號最大可用庫存
if (batch.inventory_id && originalItem.supply_batches) {
const originalBatch = originalItem.supply_batches.find(b => b.inventory_id === batch.inventory_id);
if (originalBatch && qty > originalBatch.available_qty) {
toast.error(`${originalItem.product_name}」批號 ${originalBatch.batch_number || '無批號'} 數量不可大於庫存上限 (${originalBatch.available_qty})`);
return;
}
} else if (batch.inventory_id === null) {
// 無批號情境:檢查總可用庫存
if (originalItem.supply_stock !== null && qty > originalItem.supply_stock) {
toast.error(`${originalItem.product_name}」數量不可大於供貨倉庫存上限 (${originalItem.supply_stock})`);
return;
}
}
}
}
}