import React, { useState, useEffect, useCallback } from 'react'; import { Truck, Warehouse, Activity, PlusCircle, MinusCircle, History, ChevronDown, ChevronRight, Info, Loader2, } from 'lucide-react'; import { motion, AnimatePresence } from 'motion/react'; import type { SummaryData, TypeSummary, VehicleListItem } from './types'; import { fetchSummary, fetchByType, fetchVehicleList, fetchWeeklyDetail } from './api'; import type { WeeklyDetailItem } from './api'; export default function App() { const [theme, setTheme] = useState<'soft' | 'minimal' | 'vibrant'>('soft'); const [expandedModels, setExpandedModels] = useState>(new Set()); const [expandedAssetTypes, setExpandedAssetTypes] = useState>(new Set()); const [showPlateNumbers, setShowPlateNumbers] = useState<{ batch: string; model: string; location: string; category?: 'Inventory' | 'Pending' | 'Delivered' | 'Returned' | 'Replaced'; } | null>(null); // Data state const [summary, setSummary] = useState(null); const [processedData, setProcessedData] = useState([]); const [modalVehicles, setModalVehicles] = useState([]); const [modalWeeklyDetail, setModalWeeklyDetail] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [lastUpdate, setLastUpdate] = useState(''); const [modalLoading, setModalLoading] = useState(false); const loadData = useCallback(async () => { try { setLoading(true); setError(null); const [s, byType] = await Promise.all([ fetchSummary(), fetchByType(), ]); setSummary(s); setProcessedData(byType); setLastUpdate(new Date().toLocaleString('zh-CN')); } catch (e) { setError(e instanceof Error ? e.message : '数据加载失败'); } finally { setLoading(false); } }, []); useEffect(() => { loadData(); const interval = setInterval(loadData, 60 * 1000); return () => clearInterval(interval); }, [loadData]); // Load modal vehicles useEffect(() => { if (!showPlateNumbers) { setModalVehicles([]); setModalWeeklyDetail([]); return; } setModalLoading(true); const cat = showPlateNumbers.category; // Weekly categories use the dedicated weekly-detail endpoint const weeklyTypes: Record = { Delivered: 'delivered', Returned: 'returned', Replaced: 'replaced', Pending: 'pending' }; if (cat && weeklyTypes[cat]) { setModalVehicles([]); fetchWeeklyDetail(weeklyTypes[cat]) .then(setModalWeeklyDetail) .catch(() => setModalWeeklyDetail([])) .finally(() => setModalLoading(false)); return; } // Normal vehicle list setModalWeeklyDetail([]); const params: Record = {}; if (showPlateNumbers.batch !== 'All') params.batch = showPlateNumbers.batch; if (showPlateNumbers.model !== 'All') params.model = showPlateNumbers.model; if (showPlateNumbers.location !== 'All') params.location = showPlateNumbers.location; if (cat === 'Inventory') params.status = 'Inventory'; fetchVehicleList(params) .then(setModalVehicles) .catch(() => setModalVehicles([])) .finally(() => setModalLoading(false)); }, [showPlateNumbers]); const allTypesExpanded = processedData.length > 0 && processedData.every((t) => expandedAssetTypes.has(t.type)); const toggleAllAssetTypes = () => { if (allTypesExpanded) { setExpandedAssetTypes(new Set()); } else { setExpandedAssetTypes(new Set(processedData.map((t) => t.type))); } }; const toggleAssetType = (type: string) => { const newSet = new Set(expandedAssetTypes); if (newSet.has(type)) newSet.delete(type); else newSet.add(type); setExpandedAssetTypes(newSet); }; const toggleModel = (model: string) => { const newSet = new Set(expandedModels); if (newSet.has(model)) newSet.delete(model); else newSet.add(model); setExpandedModels(newSet); }; if (loading && !summary) { return (
正在加载数据...
); } if (error && !summary) { return (
加载失败
{error}
); } const SUMMARY = summary!; return (
{/* Main Title and Global Descriptions */}

羚牛氢能车辆资产

最后更新: {lastUpdate}
每分钟更新
{loading && (
刷新中...
)}
{/* Theme Switcher */}
{/* Header Summary - Ultra Compact */}
{/* Total Assets */}
资产总数
{SUMMARY.totalAssets.toLocaleString()}
{/* Operating */}
总运营
{SUMMARY.operating.total}
自营{SUMMARY.operating.self} 租赁{SUMMARY.operating.leased}
{/* Inventory */}
总库存
{SUMMARY.inventory.total}
库存{SUMMARY.inventory.inStock} 异动{SUMMARY.inventory.abnormal}
{/* Pending */}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', category: 'Pending' })} >
待交车
{SUMMARY.pendingDelivery}
{/* New */}
本周新增
{SUMMARY.weeklyNew}
{/* Removed */}
本周移除
{SUMMARY.weeklyRemoved}
{/* Dynamics */}
本周动态
上周六-本周五
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', category: 'Delivered' })} > {SUMMARY.weeklyDelivered} 交车
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', category: 'Returned' })} > {SUMMARY.weeklyReturned} 还车
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', category: 'Replaced' })} > {SUMMARY.weeklyReplaced} 替换
{/* Main Content Area */}
{/* Asset Summary Table with Dimension Switch */}

资产数据实时汇总

点击车型展开品牌型号明细
{/* Desktop View Table */}
{['嘉兴', '广东', '北京', '新疆', '其他'].map((reg) => { const val = processedData.reduce((s, t) => s + (t.inventoryRegions?.[reg] || 0), 0); return ; })} {processedData.map((typeGroup) => ( {/* Category Header Row */} toggleAssetType(typeGroup.type)} > {expandedAssetTypes.has(typeGroup.type) ? ( ) : ( <> {['嘉兴', '广东', '北京', '新疆', '其他'].map((reg) => ( ))} )} {expandedAssetTypes.has(typeGroup.type) && typeGroup.models.map((model) => ( toggleModel(model.model)} > {['嘉兴', '广东', '北京', '新疆', '其他'].map((reg) => ( ))} ))} ))}
品牌型号 车辆总资产 库存总数 库存-江浙沪 库存-广东 库存-北京 库存-新疆 库存-其他 待交车 当前在运营 本周交车 本周还车 本周替换
总计 {processedData.reduce((s, t) => s + t.totalAssets, 0)} {processedData.reduce((s, t) => s + t.totalInventory, 0)}{val || ''}{processedData.reduce((s, t) => s + t.pending, 0) || ''} {processedData.reduce((s, t) => s + t.totalOperating, 0)} {processedData.reduce((s, t) => s + t.weeklyDelivered, 0) || ''} {processedData.reduce((s, t) => s + t.weeklyReturned, 0) || ''} {processedData.reduce((s, t) => s + t.weeklyReplaced, 0) || ''}
{typeGroup.type}
{typeGroup.type}
小计 {typeGroup.totalAssets} {typeGroup.totalInventory} {(typeGroup.inventoryRegions?.[reg] || 0) > 0 ? typeGroup.inventoryRegions[reg] : ''} {typeGroup.pending || ''} {typeGroup.totalOperating} {typeGroup.weeklyDelivered || ''} {typeGroup.weeklyReturned || ''} {typeGroup.weeklyReplaced || ''}
{typeGroup.type} {expandedModels.has(model.model) ? ( ) : ( )} {model.model} {model.inventory > 0 ? ( ) : model.inventory} {(model.inventoryRegions[reg] || 0) > 0 ? ( ) : ( '' )} {model.pending > 0 ? ( ) : ( '' )} {model.operating} {model.weeklyDelivered > 0 ? ( ) : ( '' )} {model.weeklyReturned > 0 ? ( ) : ( '' )} {model.weeklyReplaced > 0 ? ( ) : ( '' )}
{/* Mobile View Cards for Asset Summary */}
{processedData.map((typeGroup) => (
toggleAssetType(typeGroup.type)} >
{expandedAssetTypes.has(typeGroup.type) ? ( ) : ( )} {typeGroup.type}
资产 {typeGroup.totalAssets} 库存{' '} {typeGroup.totalInventory} 运营{' '} {typeGroup.totalOperating}
{expandedAssetTypes.has(typeGroup.type) && ( {typeGroup.models.map((model) => (
toggleModel(model.model)} >
{expandedModels.has(model.model) ? ( ) : ( )} {model.model}
运营 {model.operating}
{expandedModels.has(model.model) && (
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Inventory' })} > 总库存 {model.inventory}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Pending' }) } > 待交车 {model.pending}
{['嘉兴', '广东', '北京', '新疆', '其他'].map((reg) => (
{reg === '嘉兴' ? '江浙沪' : reg}
{(model.inventoryRegions[reg] || 0) > 0 ? ( ) : (
-
)}
))}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Delivered' }) } > 本周已交车 {model.weeklyDelivered}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Returned' }) } > 已还车 {model.weeklyReturned}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Replaced' }) } > 已替换 {model.weeklyReplaced}
)}
))}
)}
))}
{/* Plate Number Modal */} {showPlateNumbers && (

{showPlateNumbers.batch === 'All' ? '全量' : showPlateNumbers.batch} - 车牌明细

{showPlateNumbers.model === 'All' ? '全量型号' : showPlateNumbers.model} |{' '} {!showPlateNumbers.category ? '全部车辆' : showPlateNumbers.category === 'Inventory' ? (showPlateNumbers.location === 'All' ? '库存' : `${showPlateNumbers.location}库存`) : showPlateNumbers.category === 'Pending' ? '待交车' : showPlateNumbers.category === 'Delivered' ? '本周已交车' : showPlateNumbers.category === 'Returned' ? '已还车' : '已替换'}

{modalLoading ? (
) : modalWeeklyDetail.length > 0 ? (
{modalWeeklyDetail.map((v, i) => (
{v.plate_number}
{v.customer_name && {v.customer_name}} {v.handover_date && {v.handover_date}}
))}
) : modalVehicles.length > 0 ? (
{modalVehicles.map((v) => (
{v.plateNumber}
))}
) : (
暂无数据
)}
共 {modalWeeklyDetail.length > 0 ? modalWeeklyDetail.length : modalVehicles.length} 辆
)}
{/* Footer / Navigation */}
); }