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 { Import, Warehouse, CreditCard, ArrowLeft, Users, Droplets, Package, CheckCircle, Clock, LogOut, HelpCircle } from 'lucide-react'; import { useResponsive } from '../../hooks/useResponsive'; import { OnboardingGuide, shouldShowOnboarding } from '../../components/OnboardingGuide'; import { NotificationCenter } from '../../components/NotificationCenter'; import { HelpCenter, HelpButton } from '../../components/HelpCenter'; import { VersionUpdate, useVersionCheck, AboutModal } from '../../components/VersionUpdate'; import { FeedbackModal } from '../../components/FeedbackModal'; import { UserManual } from '../../components/UserManual'; import { CrashReporter } from '../../components/CrashReporter'; import type { WashingPlan } from '../../types'; const getQuickActions = (isMaster: boolean) => { const actions = [ { id: 'plans', icon: Import, label: '计划总览', path: '/washing/plans', gradient: 'from-purple-500 to-violet-500' }, { id: 'pending', icon: Package, label: '待处理坯布', path: '/washing/pending', gradient: 'from-amber-500 to-orange-500' }, { id: 'completed', icon: CheckCircle, label: '已完成坯布', path: '/washing/completed', gradient: 'from-green-500 to-emerald-500' }, { id: 'finished', icon: Warehouse, label: '成品仓库', path: '/washing/finished-warehouse', gradient: 'from-blue-500 to-cyan-500' }, { id: 'payment', icon: CreditCard, label: '待结款', path: '/washing/payments', gradient: 'from-rose-500 to-pink-500' } ]; if (isMaster) { actions.push({ id: 'members', icon: Users, label: '账号管理', path: '/members', gradient: 'from-indigo-500 to-purple-500' }); } return actions; }; const statusMap: Record = { pending: { label: '待处理', color: 'bg-amber-100 text-amber-700' }, processing: { label: '处理中', color: 'bg-blue-100 text-blue-700' }, completed: { label: '已完成', color: 'bg-green-100 text-green-700' } }; const containerVariants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { staggerChildren: 0.08, delayChildren: 0.05 } } }; const itemVariants = { hidden: { opacity: 0, y: 15, scale: 0.98 }, visible: { opacity: 1, y: 0, scale: 1, transition: { duration: 0.35, ease: [0.25, 0.46, 0.45, 0.94] } } }; export function WashingDashboard() { const navigate = useNavigate(); const { auth, logout } = useAuth(); const { isMobile } = useResponsive(); const [plans, setPlans] = useState([]); const [loading, setLoading] = useState(true); const [pendingCount, setPendingCount] = useState(0); const [completedCount, setCompletedCount] = useState(0); // 帮助中心状态 const [showHelp, setShowHelp] = useState(false); const [showOnboarding, setShowOnboarding] = useState(false); const [showUserManual, setShowUserManual] = useState(false); const [showFeedback, setShowFeedback] = useState(false); const [showAbout, setShowAbout] = useState(false); // 版本更新检查 const { showUpdate, setShowUpdate } = useVersionCheck(); // 检查是否显示新手引导 useEffect(() => { if (shouldShowOnboarding('washing')) { setShowOnboarding(true); } }, []); useEffect(() => { if (!auth.company) return; fetchPlans(); }, [auth.company]); const fetchPlans = async () => { const { data: washingPlans } = await supabase .from('washing_plans') .select('*') .eq('washing_factory_id', auth.company!.id) .order('created_at', { ascending: false }); const plans = washingPlans || []; setPlans(plans); setPendingCount(plans.filter(p => p.status === 'pending' || p.status === 'processing').length); setCompletedCount(plans.filter(p => p.status === 'completed').length); setLoading(false); }; const stats = { all: plans.length, producing: plans.filter(p => p.status === 'processing').length, completed: plans.filter(p => p.status === 'completed').length }; const recentPlans = plans.slice(0, 5); return (

{auth.company?.name || '水洗厂'}工作台 限时免费

{(auth.user as any)?.display_name || auth.user?.username || '用户'},欢迎回来

setShowHelp(true)} />
{loading ? (
加载中...
) : (

所有计划

{stats.all}

进行中

{stats.producing}

已完成

{stats.completed}

快捷操作

{getQuickActions(auth.user?.is_master || false).map((action, index) => ( navigate(action.path)} className="flex flex-col items-center justify-center p-3 md:p-4 rounded-xl border border-gray-200 hover:border-transparent hover:shadow-md transition-all duration-200 group will-change-transform" >
{action.label}
))}

待处理坯布

{pendingCount === 0 ? (

暂无待处理坯布

) : (
{plans .filter(p => p.status === 'pending' || p.status === 'processing') .slice(0, 3) .map((plan, i) => ( navigate(`/washing/plans?id=${plan.id}`)} className="border border-gray-200 rounded-xl p-3 md:p-4 hover:border-amber-300 cursor-pointer transition-all duration-200 will-change-transform" >

{plan.plan_code}

{plan.planned_meters}米

{statusMap[plan.status]?.label || plan.status}
))}
)}

已完成坯布

{completedCount === 0 ? (

暂无已完成坯布

) : (
{plans .filter(p => p.status === 'completed') .slice(0, 3) .map((plan, i) => ( navigate(`/washing/plans?id=${plan.id}`)} className="border border-gray-200 rounded-xl p-3 md:p-4 hover:border-green-300 cursor-pointer transition-all duration-200 will-change-transform" >

{plan.plan_code}

洗前: {plan.planned_meters}米 → 洗后: {plan.actual_washed_meters || plan.estimated_washed_meters}米

已完成

缩水率: {plan.actual_shrinkage_rate || plan.estimated_shrinkage_rate}%

))}
)}

最近计划

{recentPlans.length === 0 ? (

暂无关联计划

) : (
{recentPlans.map((plan, i) => ( navigate(`/washing/plans?id=${plan.id}`)} className="border border-gray-200 rounded-xl p-4 md:p-5 hover:border-purple-300 cursor-pointer transition-all duration-200 will-change-transform" >

{plan.plan_code}

计划米数: {plan.planned_meters}米

{statusMap[plan.status]?.label || plan.status}
{plan.status === 'completed' && (
洗后: {plan.actual_washed_meters}米 缩水率: {plan.actual_shrinkage_rate}%
)}
))}
)}
)}
{/* 帮助中心弹窗 */} setShowHelp(false)} /> {/* 新手引导 */} setShowOnboarding(false)} /> {/* 用户手册 */} setShowUserManual(false)} /> {/* 反馈弹窗 */} setShowFeedback(false)} /> {/* 关于窗口 */} setShowAbout(false)} /> {/* 版本更新弹窗 */} setShowUpdate(false)} /> {/* 崩溃报告 */}
); }