import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/Components/ui/dialog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/Components/ui/table"; import { StatusBadge } from "@/Components/shared/StatusBadge"; import { Loader2, Package, Calendar, Clock, BookOpen } from "lucide-react"; interface RecipeDetailModalProps { isOpen: boolean; onClose: () => void; recipe: any | null; // Detailed recipe object with items isLoading?: boolean; } export function RecipeDetailModal({ isOpen, onClose, recipe, isLoading }: RecipeDetailModalProps) { if (!isOpen) return null; const getUnitCost = (product: any, unitId: string | number) => { if (!product || !product.cost_price) return 0; let cost = Number(product.cost_price); if (String(unitId) === String(product.large_unit_id) || String(unitId) === String(product.purchase_unit_id)) { cost = cost * Number(product.conversion_rate || 1); } return cost; }; return (
配方明細 {recipe && ( {recipe.is_active ? "啟用中" : "已停用"} )}
{/* 現代化元數據條 */} {recipe && (
{recipe.code}
建立於 {new Date(recipe.created_at).toLocaleDateString()}
更新於 {new Date(recipe.updated_at).toLocaleDateString()}
)}
{isLoading ? (
) : recipe ? (
{/* 基本資訊區塊 */}
欄位 內容 配方名稱 {recipe.name} 對應成品
{recipe.product?.name || '-'} {recipe.product?.code}
標準產量 {Number(recipe.yield_quantity).toLocaleString(undefined, { maximumFractionDigits: 4 })} {recipe.product?.base_unit?.name || '份'} {recipe.description && ( 備註說明 {recipe.description} )}
{/* BOM 表格區塊 */}

原物料清單 (BOM)

原物料名稱 / 料號 標準用量 單位 預估單價 成本小計 備註 {recipe.items?.length > 0 ? ( recipe.items.map((item: any, index: number) => { const unitCost = item.product ? getUnitCost(item.product, item.unit_id) : 0; const subtotal = unitCost * Number(item.quantity); return (
{item.product?.name || 'Unknown'} {item.product?.code}
{Number(item.quantity).toLocaleString(undefined, { maximumFractionDigits: 4 })} {item.unit?.name || '-'} {unitCost.toLocaleString(undefined, { maximumFractionDigits: 2 })} 元 {subtotal.toLocaleString(undefined, { maximumFractionDigits: 2 })} 元 {item.remark || '-'}
) }) ) : ( 此配方尚未設定原物料 )}
配方預估總成本 {(recipe.items || []).reduce((sum: number, item: any) => sum + (getUnitCost(item.product, item.unit_id) * Number(item.quantity)), 0).toLocaleString(undefined, { maximumFractionDigits: 2 })} 元
單位生產成本 (共 {recipe.yield_quantity} 份) {(Number(recipe.yield_quantity) > 0 ? (recipe.items || []).reduce((sum: number, item: any) => sum + (getUnitCost(item.product, item.unit_id) * Number(item.quantity)), 0) / Number(recipe.yield_quantity) : 0).toLocaleString(undefined, { maximumFractionDigits: 2 })} 元
) : (
無法載入配方資料
)}
); }