/** * 庫存表格元件 * 顯示庫存項目列表(依商品分類並支援折疊) */ import { useState } from "react"; import { Edit, ChevronDown, ChevronRight, Package } from "lucide-react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/Components/ui/table"; import { Button } from "@/Components/ui/button"; import { StatusBadge } from "@/Components/shared/StatusBadge"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/Components/ui/collapsible"; import { WarehouseInventory, SafetyStockSetting } from "@/types/warehouse"; import { getSafetyStockStatus } from "@/utils/inventory"; import { formatDate } from "@/utils/format"; export type InventoryItemWithId = WarehouseInventory & { inventoryId: string }; // 商品群組型別(包含有庫存和沒庫存的情況) export interface ProductGroup { productId: string; productName: string; items: InventoryItemWithId[]; // 可能是空陣列(沒有庫存) safetySetting?: SafetyStockSetting; } interface InventoryTableProps { productGroups: ProductGroup[]; onEdit: (inventoryId: string) => void; } export default function InventoryTable({ productGroups, onEdit, }: InventoryTableProps) { // 每個商品的展開/折疊狀態 const [expandedProducts, setExpandedProducts] = useState>(new Set()); if (productGroups.length === 0) { return (

無符合條件的品項

請調整搜尋或篩選條件

); } // 按商品名稱排序 const sortedProductGroups = [...productGroups].sort((a, b) => a.productName.localeCompare(b.productName, "zh-TW") ); const toggleProduct = (productId: string) => { setExpandedProducts((prev) => { const newSet = new Set(prev); if (newSet.has(productId)) { newSet.delete(productId); } else { newSet.add(productId); } return newSet; }); }; // 獲取狀態徽章 const getStatusBadge = (status: string) => { if (status === '正常') { return ( 庫存充足 ); } if (status === '接近') { return ( 低於安全存量 ); } if (status === '低於') { return ( 嚴重短缺 ); } return null; }; return (
{sortedProductGroups.map((group) => { const totalQuantity = group.items.reduce( (sum, item) => sum + item.quantity, 0 ); // 計算安全庫存狀態 const status = group.safetySetting ? getSafetyStockStatus(totalQuantity, group.safetySetting.safetyStock) : null; const isLowStock = status === "低於"; const isExpanded = expandedProducts.has(group.productId); const hasInventory = group.items.length > 0; return ( toggleProduct(group.productId)} >
{/* 商品標題 - 可點擊折疊 */}
{/* 折疊圖示 */} {isExpanded ? ( ) : ( )}

{group.productName}

{hasInventory ? `${group.items.length} 個批號` : '無庫存'}
總庫存:{totalQuantity} 個
{group.safetySetting && ( <>
安全庫存:{group.safetySetting.safetyStock} 個
{status && getStatusBadge(status)}
)} {!group.safetySetting && ( 未設定 )}
{/* 商品表格 - 可折疊內容 */} {hasInventory ? (
# 批號 庫存數量 進貨編號 保存期限 最新入庫 最新出庫 操作 {group.items.map((item, index) => { return ( {index + 1} {item.batchNumber || "-"} {item.quantity} {item.batchNumber || "-"} {item.expiryDate ? formatDate(item.expiryDate) : "-"} {item.lastInboundDate ? formatDate(item.lastInboundDate) : "-"} {item.lastOutboundDate ? formatDate(item.lastOutboundDate) : "-"} ); })}
) : (

此商品尚無庫存批號

請點擊「新增庫存」進行入庫

)}
); })}
); }