/** * 庫存表格元件 (Warehouse 版本) * 顯示庫存項目列表(依商品分組並支援折疊) */ import { useState } from "react"; import { AlertTriangle, Edit, Trash2, Eye, ChevronDown, ChevronRight, CheckCircle, Package } from "lucide-react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/Components/ui/table"; import { Button } from "@/Components/ui/button"; import { Badge } from "@/Components/ui/badge"; import { Collapsible, CollapsibleContent, } from "@/Components/ui/collapsible"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/Components/ui/tooltip"; import { GroupedInventory } from "@/types/warehouse"; import { formatDate } from "@/utils/format"; import { Can } from "@/Components/Permission/Can"; import BatchAdjustmentModal from "./BatchAdjustmentModal"; interface InventoryTableProps { inventories: GroupedInventory[]; onView: (id: string) => void; onDelete: (id: string) => void; onAdjust: (batchId: string, data: { operation: string; quantity: number; reason: string }) => void; onViewProduct?: (productId: string) => void; } export default function InventoryTable({ inventories, onView, onDelete, onAdjust, onViewProduct, }: InventoryTableProps) { // 每個商品的展開/折疊狀態 const [expandedProducts, setExpandedProducts] = useState>(new Set()); // 調整彈窗狀態 const [adjustmentTarget, setAdjustmentTarget] = useState<{ id: string; batchNumber: string; currentQuantity: number; productName: string; } | null>(null); if (inventories.length === 0) { return (

無符合條件的品項

請調整搜尋或篩選條件

); } // 按商品名稱排序 const sortedInventories = [...inventories].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) => { switch (status) { case "正常": return ( 正常 ); case "低於": return ( 低於 ); default: return null; } }; return (
{sortedInventories.map((group) => { const totalQuantity = group.totalQuantity; // 使用後端提供的狀態 const status = group.status; const isLowStock = status === "低於"; const isExpanded = expandedProducts.has(group.productId); const hasInventory = group.batches.length > 0; return ( toggleProduct(group.productId)} >
{/* 商品標題 - 可點擊折疊 */}
toggleProduct(group.productId)} className={`px-4 py-3 border-b cursor-pointer hover:bg-gray-100 transition-colors ${isLowStock ? "bg-red-50" : "bg-gray-50" }`} >
{/* 折疊圖示 */} {isExpanded ? ( ) : ( )}

{group.productName}

{hasInventory ? `${group.batches.length} 個批號` : '無庫存'}
總庫存:{totalQuantity} {group.baseUnit}
總價值:${group.totalValue?.toLocaleString()}
{group.safetyStock !== null ? ( <>
安全庫存:{group.safetyStock} {group.baseUnit}
{status && getStatusBadge(status)}
) : ( 未設定 )} {onViewProduct && ( )}
{/* 商品表格 - 可折疊內容 */} {hasInventory ? (
# 批號 庫存數量 單位成本 總價值 保存期限 最新入庫 最新出庫 操作 {group.batches.map((batch, index) => { return ( {index + 1} {batch.batchNumber || "-"} {batch.quantity} {batch.unit} ${batch.unit_cost?.toLocaleString()} ${batch.total_value?.toLocaleString()} {batch.expiryDate ? formatDate(batch.expiryDate) : "-"} {batch.lastInboundDate ? formatDate(batch.lastInboundDate) : "-"} {batch.lastOutboundDate ? formatDate(batch.lastOutboundDate) : "-"}

{batch.quantity > 0 ? "庫存須為 0 才可刪除" : "刪除"}

); })}
) : (

此商品尚無庫存批號

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

)}
); })} setAdjustmentTarget(null)} batch={adjustmentTarget || undefined} onConfirm={(data) => { if (adjustmentTarget) { onAdjust(adjustmentTarget.id, data); setAdjustmentTarget(null); } }} />
); }