import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../../contexts/AuthContext'; import { supabase } from '../../supabase/client'; import { motion } from 'framer-motion'; import { ArrowLeft, CheckCircle, Droplets, ChevronRight } from 'lucide-react'; import { useResponsive } from '../../hooks/useResponsive'; import type { WashingPlan, WashingPlanCompletion } from '../../types'; interface CompletedFabricItem { id: string; plan_code: string; purchaser_name: string; product_name: string; product_color: string; fabric_code: string; planned_meters: number; actual_washed_meters: number; shrinkage_rate: number; washing_date: string; rolls: number; completed_at: string; } export function CompletedFabric() { const navigate = useNavigate(); const { auth } = useAuth(); const { isMobile } = useResponsive(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (!auth.company) return; fetchCompletedFabric(); }, [auth.company]); const fetchCompletedFabric = async () => { setLoading(true); // 获取已完成的水洗计划 const { data: washingPlans, error } = await supabase .from('washing_plans') .select(` *, product:product_id(product_name, color, fabric_code), company:company_id(name) `) .eq('washing_factory_id', auth.company!.id) .eq('status', 'completed') .order('updated_at', { ascending: false }); if (error) { console.error('获取已完成坯布失败:', error); } else { // 获取完成记录详情 const planIds = (washingPlans || []).map(p => p.id); const { data: completions } = await supabase .from('washing_plan_completions') .select('*') .in('washing_plan_id', planIds); const completionMap: Record = {}; (completions || []).forEach(c => { completionMap[c.washing_plan_id] = c; }); const formattedItems = (washingPlans || []).map(plan => { const completion = completionMap[plan.id]; return { id: plan.id, plan_code: plan.plan_code, purchaser_name: (plan.company as any)?.name || '未知采购商', product_name: (plan.product as any)?.product_name || '-', product_color: (plan.product as any)?.color || '-', fabric_code: (plan.product as any)?.fabric_code || '-', planned_meters: plan.planned_meters, actual_washed_meters: completion?.actual_washed_meters || plan.actual_washed_meters || 0, shrinkage_rate: completion?.actual_shrinkage_rate || plan.actual_shrinkage_rate || 0, washing_date: completion?.washing_date || plan.washing_date || '', rolls: completion?.rolls || 0, completed_at: completion?.completed_at || plan.updated_at }; }); setItems(formattedItems); } setLoading(false); }; const totalBefore = items.reduce((sum, item) => sum + item.planned_meters, 0); const totalAfter = items.reduce((sum, item) => sum + item.actual_washed_meters, 0); const avgShrinkage = items.length > 0 ? items.reduce((sum, item) => sum + item.shrinkage_rate, 0) / items.length : 0; return (
{/* Header - 与 Dashboard 一致 */}

已完成坯布

查看已完成水洗的坯布记录

{/* 统计卡片 */}

已完成计划

{items.length}

水洗前米数

{totalBefore.toFixed(2)}

水洗后米数

{totalAfter.toFixed(2)}

平均缩水率

{avgShrinkage.toFixed(2)}%

{/* 列表 */} {loading ? (
加载中...
) : items.length === 0 ? (

暂无已完成坯布

) : (

已完成列表

{items.map((item, index) => ( navigate(`/washing/plans?id=${item.id}`)} className="p-4 hover:bg-gray-50 transition-colors cursor-pointer" >
已完成 {item.plan_code}

{item.purchaser_name}

{item.product_name} - {item.product_color}

坯布码: {item.fabric_code} | 匹/件数: {item.rolls}匹/件

{item.planned_meters}米 {item.actual_washed_meters}米

缩水率: {item.shrinkage_rate}%

{item.washing_date ? new Date(item.washing_date).toLocaleDateString('zh-CN') : '-'}

))}
)}
); }