import React, { useState, useEffect, useCallback } from 'react'; import { Truck, Warehouse, Activity, PlusCircle, MinusCircle, History, ChevronDown, ChevronRight, Info, Loader2, Search, Filter, ArrowRightLeft, Users, MapPin, Building2, } from 'lucide-react'; import { motion, AnimatePresence } from 'motion/react'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, LabelList, } from 'recharts'; import type { SummaryData, TypeSummary, VehicleListItem, DeptGroup, RegionGroup, CustomerStats, RegionalInventoryStats } from './types'; import { fetchSummary, fetchByType, fetchVehicleList, fetchWeeklyDetail, fetchDeptStats, fetchRegionStats, fetchCustomerStats, fetchInventoryStats, fetchRegionChart } from './api'; import type { WeeklyDetailItem } from './api'; // --- Constants --- const TABS = [ { id: 'overview', label: '总览' }, { id: 'department', label: '按部门' }, { id: 'region', label: '按区域' }, { id: 'customer', label: '按客户' }, ]; export default function App() { const [activeTab, setActiveTab] = useState<'overview' | 'department' | 'region' | 'customer'>('overview'); 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' | 'Operating'; vehicleType?: string; manager?: string; customer?: string; isColdChain?: boolean; isTrailer?: boolean; type?: string; source?: string; title?: string; } | 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); // Dept/Region/Customer data const [deptData, setDeptData] = useState([]); const [regionData, setRegionData] = useState([]); const [customerData, setCustomerData] = useState([]); // Dept section state const [deptViewMode, setDeptViewMode] = useState<'department' | 'manager'>('department'); const [expandedDepts, setExpandedDepts] = useState>(new Set()); const [expandedManagerDetails, setExpandedManagerDetails] = useState>(new Set()); const [selectedManager, setSelectedManager] = useState('All'); // Region section state const [expandedRegions, setExpandedRegions] = useState>(new Set()); const [expandedRegionCities, setExpandedRegionCities] = useState>(new Set()); const [regionFilters, setRegionFilters] = useState({ region: '', city: '', customer: '' }); const [isRegionFilterOpen, setIsRegionFilterOpen] = useState(false); // Customer section state const [expandedCustomers, setExpandedCustomers] = useState>(new Set()); const [customerFilters, setCustomerFilters] = useState({ customer: '', brand: '', department: '', manager: '', region: '' }); const [isCustomerFilterOpen, setIsCustomerFilterOpen] = useState(false); // Inventory statistics section state const [inventoryData, setInventoryData] = useState([]); const [inventoryTab, setInventoryTab] = useState<'region' | 'model'>('region'); const [expandedInventoryRegions, setExpandedInventoryRegions] = useState>(new Set()); const [expandedInventoryTypes, setExpandedInventoryTypes] = useState>(new Set(['4.5T普货'])); const [inventoryFilters, setInventoryFilters] = useState({ region: '', city: '', brand: '', batch: '', model: '' }); const [isInventoryFilterOpen, setIsInventoryFilterOpen] = useState(false); // Chart view states const [customerChartView, setCustomerChartView] = useState<'region' | 'city'>('region'); const [regionChartView, setRegionChartView] = useState<'region' | 'city'>('region'); const [regionChartData, setRegionChartData] = useState<{ name: string; value: number }[]>([]); // Modal filter state const [modalFilters, setModalFilters] = useState({ plateNumber: '', model: '', brand: '', location: '' }); const [isModalFilterExpanded, setIsModalFilterExpanded] = useState(false); // Reset modal filters when modal opens useEffect(() => { if (showPlateNumbers) { setModalFilters({ plateNumber: '', model: '', brand: '', location: '' }); } }, [showPlateNumbers]); const loadData = useCallback(async () => { try { setLoading(true); setError(null); const [s, byType, dept, region, cust, inv] = await Promise.all([ fetchSummary(), fetchByType(), fetchDeptStats(), fetchRegionStats(), fetchCustomerStats(), fetchInventoryStats(), ]); setSummary(s); setProcessedData(byType); setDeptData(dept); setRegionData(region); setCustomerData(cust); setInventoryData(inv); 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]); // Fetch region chart data when view changes useEffect(() => { fetchRegionChart(regionChartView, regionChartView === 'city' ? 5 : 8).then(setRegionChartData).catch(() => setRegionChartData([])); }, [regionChartView]); // 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.vehicleType) params.vehicleType = showPlateNumbers.vehicleType; 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'; if (cat === 'Operating') params.category = 'Operating'; if (showPlateNumbers.manager) params.manager = showPlateNumbers.manager; if (showPlateNumbers.customer) params.customer = showPlateNumbers.customer; if (!showPlateNumbers.type) { if (showPlateNumbers.isColdChain !== undefined) params.isColdChain = String(showPlateNumbers.isColdChain); if (showPlateNumbers.isTrailer !== undefined) params.isTrailer = String(showPlateNumbers.isTrailer); } // Map type field to backend vehicleType if (showPlateNumbers.type) { const t = showPlateNumbers.type; if (t === '4.5T') { if (showPlateNumbers.isColdChain === true) params.vehicleType = '4.5T冷链'; else if (showPlateNumbers.isColdChain === false) params.vehicleType = '4.5T普货'; } else if (t === '4.5T普货' || t === '4.5T冷链' || t === '18T' || t === '49T' || t === '挂车' || t === '其他') { params.vehicleType = t; } else if (t === '其他车型') { if (showPlateNumbers.isTrailer === true) params.isTrailer = 'true'; else if (showPlateNumbers.isTrailer === false) params.vehicleType = '其他'; } } 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); }; const toggleDept = (dept: string) => { const newSet = new Set(expandedDepts); if (newSet.has(dept)) newSet.delete(dept); else newSet.add(dept); setExpandedDepts(newSet); }; const toggleManagerDetails = (manager: string) => { const newSet = new Set(expandedManagerDetails); if (newSet.has(manager)) newSet.delete(manager); else newSet.add(manager); setExpandedManagerDetails(newSet); }; const toggleRegion = (region: string) => { const newSet = new Set(expandedRegions); if (newSet.has(region)) newSet.delete(region); else newSet.add(region); setExpandedRegions(newSet); }; const toggleRegionCity = (key: string) => { const newSet = new Set(expandedRegionCities); if (newSet.has(key)) newSet.delete(key); else newSet.add(key); setExpandedRegionCities(newSet); }; const toggleCustomer = (customer: string) => { const newSet = new Set(expandedCustomers); if (newSet.has(customer)) newSet.delete(customer); else newSet.add(customer); setExpandedCustomers(newSet); }; const toggleInventoryRegion = (region: string) => { const newSet = new Set(expandedInventoryRegions); if (newSet.has(region)) newSet.delete(region); else newSet.add(region); setExpandedInventoryRegions(newSet); }; const toggleInventoryType = (type: string) => { const newSet = new Set(expandedInventoryTypes); if (newSet.has(type)) newSet.delete(type); else newSet.add(type); setExpandedInventoryTypes(newSet); }; // Derived data for inventory section const filteredInventoryStats = inventoryData.filter((s) => { const mr = !inventoryFilters.region || s.region === inventoryFilters.region; const mc = !inventoryFilters.city || s.city === inventoryFilters.city; const mb = !inventoryFilters.brand || s.brand === inventoryFilters.brand; const mbt = !inventoryFilters.batch || s.batch === inventoryFilters.batch; const mm = !inventoryFilters.model || s.model.toLowerCase().includes(inventoryFilters.model.toLowerCase()); return mr && mc && mb && mbt && mm; }); const uniqueInventoryBrands = Array.from(new Set(inventoryData.map((s) => s.brand).filter(Boolean))); const uniqueInventoryRegions = Array.from(new Set(inventoryData.map((s) => s.region))); const uniqueInventoryCities = Array.from(new Set(inventoryData.map((s) => s.city).filter(Boolean))); const uniqueInventoryBatches = Array.from(new Set(inventoryData.map((s) => s.batch).filter(Boolean))); const inventoryByRegion: Record> = {}; for (const s of filteredInventoryStats) { if (!inventoryByRegion[s.region]) inventoryByRegion[s.region] = {}; if (!inventoryByRegion[s.region][s.city]) inventoryByRegion[s.region][s.city] = []; inventoryByRegion[s.region][s.city].push(s); } const INVENTORY_TYPE_ORDER = ['4.5T普货', '4.5T冷链', '18T', '49T', '挂车', '其他']; const inventoryByModelRaw: Record> = {}; for (const s of filteredInventoryStats) { if (!inventoryByModelRaw[s.type]) inventoryByModelRaw[s.type] = {}; if (!inventoryByModelRaw[s.type][s.model]) inventoryByModelRaw[s.type][s.model] = []; inventoryByModelRaw[s.type][s.model].push(s); } const inventoryByModel: Record> = {}; for (const t of INVENTORY_TYPE_ORDER) { if (inventoryByModelRaw[t]) inventoryByModel[t] = inventoryByModelRaw[t]; } for (const t of Object.keys(inventoryByModelRaw)) { if (!inventoryByModel[t]) inventoryByModel[t] = inventoryByModelRaw[t]; } // Derived data for dept section const allManagersList = deptData.flatMap((d) => d.managers.map((m) => m.manager)).filter((v, i, a) => a.indexOf(v) === i).sort(); const managerStats = deptData .flatMap((d) => d.managers) .filter((m) => selectedManager === 'All' || m.manager === selectedManager) .sort((a, b) => b.total - a.total); // Derived data for customer section const filteredCustomerStats = customerData.filter((s) => { const mc = !customerFilters.customer || s.customer.toLowerCase().includes(customerFilters.customer.toLowerCase()); const mb = !customerFilters.brand || s.brand === customerFilters.brand; const md = !customerFilters.department || s.department === customerFilters.department; const mm = !customerFilters.manager || s.manager.toLowerCase().includes(customerFilters.manager.toLowerCase()); const mr = !customerFilters.region || s.region === customerFilters.region; return mc && mb && md && mm && mr; }); const uniqueBrands = Array.from(new Set(customerData.map((s) => s.brand).filter(Boolean))); const uniqueDepts = Array.from(new Set(customerData.map((s) => s.department).filter(Boolean))); const uniqueRegions = Array.from(new Set(customerData.map((s) => s.region))); const uniqueCities = Array.from(new Set(customerData.map((s) => s.city).filter(Boolean))); const uniqueCustomerNames = Array.from(new Set(customerData.map((s) => s.customer).filter(Boolean))); const uniqueCustomerManagers = Array.from(new Set(customerData.map((s) => s.manager).filter(Boolean))); const uniqueInventoryModels = Array.from(new Set(inventoryData.map((s) => s.model).filter(Boolean))); const uniqueModalPlates = Array.from(new Set(modalVehicles.map(v => v.plateNumber || v.vin).filter(Boolean))); const uniqueModalModels = Array.from(new Set(modalVehicles.map(v => v.model).filter(Boolean))); const uniqueModalBrands = Array.from(new Set(modalVehicles.map(v => v.brandLabel).filter((x): x is string => Boolean(x)))); const uniqueModalLocations = Array.from(new Set(modalVehicles.map(v => v.location).filter(Boolean))); // Derived data for region section const filteredRegionData = regionData.filter((r) => !regionFilters.region || r.region === regionFilters.region); // Filtered modal vehicles based on modal filters const filteredModalVehicles = modalVehicles.filter((v) => { const mp = !modalFilters.plateNumber || v.plateNumber.toLowerCase().includes(modalFilters.plateNumber.toLowerCase()) || v.vin.toLowerCase().includes(modalFilters.plateNumber.toLowerCase()); const mm = !modalFilters.model || v.model.toLowerCase().includes(modalFilters.model.toLowerCase()); const mb = !modalFilters.brand || (v.brandLabel || '').toLowerCase().includes(modalFilters.brand.toLowerCase()); const ml = !modalFilters.location || v.location.toLowerCase().includes(modalFilters.location.toLowerCase()); return mp && mm && mb && ml; }); const filteredModalWeeklyDetail = modalWeeklyDetail.filter((v) => { const mp = !modalFilters.plateNumber || v.plate_number.toLowerCase().includes(modalFilters.plateNumber.toLowerCase()); return mp; }); if (loading && !summary) { return (
正在加载数据...
); } if (error && !summary) { return (
加载失败
{error}
); } const SUMMARY = summary!; const watermarkText = `羚牛氢能-${new Date().toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).replace(/\//g, '-')}`; return (
{/* Watermark */}
${watermarkText}`)}")`, backgroundRepeat: 'repeat', }} />
{/* Compact Header Bar */}
{/* Title row */}

羚牛氢能车辆资产

{/* Right: status + theme */}
{lastUpdate}
{loading && (
)}
{(['soft','minimal','vibrant'] as const).map((t) => ( ))}
{/* Tab row */}
{TABS.map(tab => ( ))}
{/* Status row */}
最后更新: {lastUpdate}
每分钟更新一次
{activeTab === 'overview' && ( <> {/* Header Summary - Ultra Compact */}
{/* Total Assets */}
资产总数
{SUMMARY.totalAssets.toLocaleString()}
{/* Operating */}
总运营
{SUMMARY.operating.total} 自{SUMMARY.operating.self} 租{SUMMARY.operating.leased}{SUMMARY.operating.hanging > 0 ? ` 挂${SUMMARY.operating.hanging}` : ''}
{/* Inventory */}
总库存
{SUMMARY.inventory.total} 库{SUMMARY.inventory.inStock} 异{SUMMARY.inventory.abnormal}
{/* Pending */}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', category: 'Pending' })}>
待交车
{SUMMARY.pendingDelivery}
{/* Dynamics */}
本周动态
上周六-本周五
{SUMMARY.weeklyNew} 新增
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 */}
{activeTab === 'overview' && ( <> {/* 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)} > <> {['嘉兴', '广东', '北京', '新疆', '其他'].map((reg) => ( ))} {expandedAssetTypes.has(typeGroup.type) && typeGroup.models.map((model) => ( toggleModel(model.model)} > {['嘉兴', '广东', '北京', '新疆', '其他'].map((reg) => ( ))} {expandedModels.has(model.model) && model.batches.map((batch) => ( {['嘉兴', '广东', '北京', '新疆', '其他'].map((reg) => ( ))} ))} ))} ))}
品牌型号 车辆总资产 库存总数 库存-江浙沪 库存-广东 库存-北京 库存-新疆 库存-其他 待交车 当前在运营 本周交车 本周还车 本周替换
总计 {val > 0 ? ( ) : ''} {processedData.reduce((s, t) => s + t.pending, 0) > 0 ? ( ) : ''} {processedData.reduce((s, t) => s + t.weeklyDelivered, 0) > 0 ? ( ) : ''} {processedData.reduce((s, t) => s + t.weeklyReturned, 0) > 0 ? ( ) : ''} {processedData.reduce((s, t) => s + t.weeklyReplaced, 0) > 0 ? ( ) : ''}
{expandedAssetTypes.has(typeGroup.type) ? ( ) : ( )} {typeGroup.type}
小计 {(typeGroup.inventoryRegions?.[reg] || 0) > 0 ? ( ) : ''} {typeGroup.pending > 0 ? ( ) : ''} {typeGroup.weeklyDelivered > 0 ? ( ) : ''} {typeGroup.weeklyReturned > 0 ? ( ) : ''} {typeGroup.weeklyReplaced > 0 ? ( ) : ''}
{typeGroup.type} {expandedModels.has(model.model) ? ( ) : ( )} {model.model} {model.inventory > 0 ? ( ) : model.inventory} {(model.inventoryRegions[reg] || 0) > 0 ? ( ) : ( '' )} {model.pending > 0 ? ( ) : ( '' )} {model.weeklyDelivered > 0 ? ( ) : ( '' )} {model.weeklyReturned > 0 ? ( ) : ( '' )} {model.weeklyReplaced > 0 ? ( ) : ( '' )} {batch.batch} {batch.inventory > 0 ? ( ) : ''} {(batch.inventoryRegions[reg] || 0) > 0 ? ( ) : ''} {batch.pending > 0 ? ( ) : ''} {batch.weeklyDelivered > 0 ? ( ) : ''} {batch.weeklyReturned > 0 ? ( ) : ''} {batch.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.total} 库存 {model.inventory} 运营 {model.operating}
{expandedModels.has(model.model) && (
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Inventory', source: 'asset', title: `${model.model} - 库存` })}> 总库存 {model.inventory}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Pending', source: 'asset', title: `${model.model} - 待交车` })}> 待交车 {model.pending}
{['嘉兴', '广东', '北京', '新疆', '其他'].map(reg => (
{reg === '嘉兴' ? '浙' : reg === '广东' ? '粤' : reg === '北京' ? '京' : reg === '新疆' ? '新' : '其'}
{(model.inventoryRegions[reg] || 0) > 0 ? ( ) : (
-
)}
))}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Delivered', source: 'asset', title: `${model.model} - 本周交车` })}> 本周已交车 {model.weeklyDelivered}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Returned', source: 'asset', title: `${model.model} - 本周还车` })}> 已还车 {model.weeklyReturned}
setShowPlateNumbers({ batch: 'All', model: model.model, location: 'All', category: 'Replaced', source: 'asset', title: `${model.model} - 本周替换` })}> 已替换 {model.weeklyReplaced}
)}
))}
)}
))}
{/* Inventory Statistics */}

库存统计

实时更新库存数据
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', category: 'Inventory', source: 'asset', title: '库存总数' })}> 总库存数据 {filteredInventoryStats.reduce((acc, s) => acc + s.quantity, 0)}
{isInventoryFilterOpen && ( <>
setIsInventoryFilterOpen(false)} />

库存统计 - 数据筛选

setInventoryFilters({...inventoryFilters, region: e.target.value})} className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueInventoryRegions.map(r =>
setInventoryFilters({...inventoryFilters, city: e.target.value})} className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueInventoryCities.map(c =>
setInventoryFilters({...inventoryFilters, brand: e.target.value})} className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueInventoryBrands.map(b =>
setInventoryFilters({...inventoryFilters, batch: e.target.value})} className="w-full text-xs bg-white border border-slate-200 rounded-lg px-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueInventoryBatches.map(b =>
setInventoryFilters({...inventoryFilters, model: e.target.value})} className="w-full text-xs bg-white border border-slate-200 rounded-lg pl-7 pr-2 py-1.5 focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueInventoryModels.map(m =>
)}
{/* Active Filters Bar */} {(inventoryFilters.region || inventoryFilters.city || inventoryFilters.brand || inventoryFilters.batch || inventoryFilters.model) && (
当前筛选: {inventoryFilters.region && ( 区域: {inventoryFilters.region} )} {inventoryFilters.city && ( 城市: {inventoryFilters.city} )} {inventoryFilters.brand && ( 品牌: {inventoryFilters.brand} )} {inventoryFilters.batch && ( 批次: {inventoryFilters.batch} )} {inventoryFilters.model && ( 车型: {inventoryFilters.model} )}
)} {/* Desktop View Table */}
{inventoryTab === 'region' ? ( Object.entries(inventoryByRegion).map(([region, cities]) => ( toggleInventoryRegion(region)} > {expandedInventoryRegions.has(region) && Object.entries(cities).map(([city, stats]) => ( {stats.map((stat, idx) => ( ))} ))} )) ) : ( Object.entries(inventoryByModel).map(([type, models]) => ( toggleInventoryType(type)} > {expandedInventoryTypes.has(type) && Object.entries(models).map(([model, stats]) => ( {stats.map((stat, idx) => ( ))} ))} )) )}
{inventoryTab === 'region' ? '区域 / 城市' : '车型分类 / 型号'} {inventoryTab === 'region' ? '品牌' : '品牌'} {inventoryTab === 'region' ? '车型' : '所在区域/城市'} 库存数量
{expandedInventoryRegions.has(region) ? : } {region} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: region, category: 'Inventory', source: 'asset', title: `库存统计 - ${region}` }); }}> (共 {Object.values(cities).flat().reduce((acc, s) => acc + s.quantity, 0)} 台)
{idx === 0 ? {city} : ''} {stat.brand} {stat.model}
{expandedInventoryTypes.has(type) ? : } {type} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', type: type, category: 'Inventory', source: 'asset', title: `库存统计 - ${type}` }); }}> (共 {Object.values(models).flat().reduce((acc, s) => acc + s.quantity, 0)} 台)
{idx === 0 ? {model} : ''} {stat.brand} {stat.region} / {stat.city}
{/* Mobile View */}
{inventoryTab === 'region' ? ( Object.entries(inventoryByRegion).map(([region, cities]) => (
toggleInventoryRegion(region)} >
{expandedInventoryRegions.has(region) ? : } {region}
{Object.values(cities).flat().reduce((acc, s) => acc + s.quantity, 0)} 台
{expandedInventoryRegions.has(region) && (
{Object.entries(cities).map(([city, stats]) => (
{city}
{stats.map((stat, idx) => (
{stat.brand} {stat.model}
))}
))}
)}
)) ) : ( Object.entries(inventoryByModel).map(([type, models]) => (
toggleInventoryType(type)} >
{expandedInventoryTypes.has(type) ? : } {type}
{Object.values(models).flat().reduce((acc, s) => acc + s.quantity, 0)} 台
{expandedInventoryTypes.has(type) && (
{Object.entries(models).map(([model, stats]) => (
{model}
{stats.map((stat, idx) => (
{stat.brand} {stat.region} / {stat.city}
))}
))}
)}
)) )}
)} {activeTab === 'department' && ( /* Department Operations Statistics */

部门运营统计

实时更新部门运营核心指标

{/* Overall Total Summary (Compact) - Moved to Top */}
总资产 {deptData.reduce((s, d) => s + d.totalAssets, 0)}
运营中 {deptData.reduce((acc, d) => acc + d.operatingCount, 0)}
闲置中 {deptData.reduce((acc, d) => acc + d.idleCount, 0)}
平均出勤 {deptData.length > 0 ? (deptData.reduce((acc, d) => acc + d.attendanceRate, 0) / deptData.length).toFixed(1) : 0}%
{/* Controls Row: Toggles Left, Filter Right */}
{deptViewMode === 'manager' && (
setSelectedManager(e.target.value || 'All')} className="w-full pl-9 pr-8 py-1.5 bg-white border border-gray-200 rounded-lg text-xs focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm font-bold text-gray-700" /> {allManagersList.map(m => (
)}
{/* Desktop Table View */}
{deptViewMode === 'manager' && } {deptViewMode === 'department' && ( <> )} {deptViewMode === 'manager' && ( <> )} {deptViewMode === 'department' ? ( deptData.map((dept) => { const isExpanded = expandedDepts.has(dept.department); return ( toggleDept(dept.department)} > {isExpanded && ( )} ); }) ) : ( managerStats.map((m) => { const isManagerExpanded = expandedManagerDetails.has(m.manager); return ( toggleManagerDetails(m.manager)} > {isManagerExpanded && ( )} ); }) )}
{deptViewMode === 'department' ? '部门名称' : '业务负责人'}所属部门{deptViewMode === 'department' ? '出勤率' : '合计资产'}资产总数 日均里程 运营中 闲置中4.5T 冷链 18T 49T 挂车 其他详情
{dept.department} {dept.attendanceRate}% {dept.totalAssets}
{dept.avgMileage} km
{dept.operatingCount} {dept.idleCount} {isExpanded ? : }
{dept.managers.map(m => { const isManagerExpanded = expandedManagerDetails.has(m.manager); return (
toggleManagerDetails(m.manager)} >
{isManagerExpanded ? : } {m.manager}
{isManagerExpanded && (
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: false, category: 'Operating', source: 'department' })} >
4.5T
{m.t4_5}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: true, category: 'Operating', source: 'department' })} >
冷链
{m.t4_5c}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '18T', category: 'Operating', source: 'department' })} >
18T
{m.t18}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '49T', category: 'Operating', source: 'department' })} >
49T
{m.t49}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: true, category: 'Operating', source: 'department' })} >
挂车
{m.trailer}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: false, category: 'Operating', source: 'department' })} >
其他
{m.other}
)}
); })}
{isManagerExpanded ? : } {m.manager} {m.department} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, category: 'Operating', source: 'department' }); }} > {m.total} - - - - - -
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: false, category: 'Operating', source: 'department' })}> 4.5T {m.t4_5}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: true, category: 'Operating', source: 'department' })}> 冷链 {m.t4_5c}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '18T', category: 'Operating', source: 'department' })}> 18T {m.t18}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '49T', category: 'Operating', source: 'department' })}> 49T {m.t49}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: true, category: 'Operating', source: 'department' })}> 挂车 {m.trailer}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: false, category: 'Operating', source: 'department' })}> 其他 {m.other}
{/* Mobile Card View */}
{deptViewMode === 'department' ? ( deptData.map((dept) => { const isExpanded = expandedDepts.has(dept.department); return (
toggleDept(dept.department)} >

{dept.department}

出勤率: {dept.attendanceRate}%
资产
{dept.totalAssets}
里程
{dept.avgMileage}
运营
{dept.operatingCount}
闲置
{dept.idleCount}
{isExpanded ? : }
{isExpanded && (
{dept.managers.map(m => { const isManagerExpanded = expandedManagerDetails.has(m.manager); return (
toggleManagerDetails(m.manager)} >
{isManagerExpanded ? : } {m.manager}
{isManagerExpanded && (
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: false, category: 'Operating', source: 'department' })} >
4.5T
{m.t4_5}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: true, category: 'Operating', source: 'department' })} >
冷链
{m.t4_5c}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '18T', category: 'Operating', source: 'department' })} >
18T
{m.t18}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '49T', category: 'Operating', source: 'department' })} >
49T
{m.t49}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: true, category: 'Operating', source: 'department' })} >
挂车
{m.trailer}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: false, category: 'Operating', source: 'department' })} >
其他
{m.other}
)}
); })}
)}
); }) ) : ( managerStats.map((m) => { const isManagerExpanded = expandedManagerDetails.has(m.manager); return (
toggleManagerDetails(m.manager)} >
{isManagerExpanded ? : }

{m.manager}

{m.department}
{ e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, category: 'Operating', source: 'department' }); }} > 资产: {m.total}
{isManagerExpanded && (
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: false, category: 'Operating', source: 'department' })} >
4.5T
{m.t4_5}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '4.5T', isColdChain: true, category: 'Operating', source: 'department' })} >
冷链
{m.t4_5c}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '18T', category: 'Operating', source: 'department' })} >
18T
{m.t18}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '49T', category: 'Operating', source: 'department' })} >
49T
{m.t49}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: true, category: 'Operating', source: 'department' })} >
挂车
{m.trailer}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', manager: m.manager, type: '其他车型', isTrailer: false, category: 'Operating', source: 'department' })} >
其他
{m.other}
)}
); }) )}
)} {activeTab === 'region' && (
{/* Region Distribution Chart */}

区域资产分布概览

{/* Region - Vehicle - Customer Section */}

区域运营统计

*按区域—车型—客户维度统计

{isRegionFilterOpen && ( <>
setIsRegionFilterOpen(false)} />

区域筛选

setRegionFilters(prev => ({ ...prev, customer: e.target.value }))} /> {uniqueCustomerNames.map(c =>
setRegionFilters(prev => ({ ...prev, region: e.target.value }))} /> {uniqueRegions.map(r =>
setRegionFilters(prev => ({ ...prev, city: e.target.value }))} /> {uniqueCities.map(c =>
)}
{regionData.filter(r => !regionFilters.region || r.region === regionFilters.region).map((r) => { const isExpanded = expandedRegions.has(r.region); return ( toggleRegion(r.region)} > {isExpanded && r.cities.map((city) => { const cityKey = `${r.region}-${city.city}`; const isCityExpanded = expandedRegionCities.has(cityKey); return ( toggleRegionCity(cityKey)} > {isCityExpanded && city.typeBreakdown.map(tb => ( ))} ); })} ); })}
区域 / 车型 / 客户 资产总数 运营中 待交车 主要客户
{isExpanded ? : } {r.region}区域 { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: r.region, category: 'Operating' }); }}>{r.totalAssets} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: r.region, category: 'Operating' }); }}>{r.operatingCount} { e.stopPropagation(); if (r.pendingCount) setShowPlateNumbers({ batch: 'All', model: 'All', location: r.region, category: 'Pending' }); }}>{r.pendingCount || ''} {r.customers.slice(0, 2).join(', ')}
{isCityExpanded ? : } {city.city} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: city.city, category: 'Operating' }); }}>{city.totalAssets} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: city.city, category: 'Operating' }); }}>{city.operatingCount} { e.stopPropagation(); if (city.pendingCount) setShowPlateNumbers({ batch: 'All', model: 'All', location: city.city, category: 'Pending' }); }}>{city.pendingCount || ''} {city.customers.slice(0, 2).join(', ')}
{tb.type} 车型
setShowPlateNumbers({ batch: 'All', model: 'All', location: city.city, vehicleType: tb.type, category: 'Operating' })}>{tb.total} setShowPlateNumbers({ batch: 'All', model: 'All', location: city.city, vehicleType: tb.type, category: 'Operating' })}>{tb.operating} { if (tb.inventory) setShowPlateNumbers({ batch: 'All', model: 'All', location: city.city, vehicleType: tb.type, category: 'Pending' }); }}>{tb.inventory || ''} {tb.customers.slice(0, 2).join(', ')}
{/* Mobile View (Region) */}
{regionData.filter(r => !regionFilters.region || r.region === regionFilters.region).map((r) => { const isExpanded = expandedRegions.has(r.region); return (
toggleRegion(r.region)} >
{isExpanded ? : } {r.region}区域
资产: {r.totalAssets}
{isExpanded && ( <>
setShowPlateNumbers({ batch: 'All', model: 'All', location: r.region, category: 'Operating', source: 'asset' })} >
运营中
{r.operatingCount}
setShowPlateNumbers({ batch: 'All', model: 'All', location: r.region, category: 'Pending', source: 'asset' })} >
待交车
{r.pendingCount || ''}
{r.typeBreakdown.map(tb => (
{tb.type} 车型
setShowPlateNumbers({ batch: 'All', model: 'All', location: r.region, vehicleType: tb.type, category: 'Operating', source: 'asset' })} > 运:{tb.operating} setShowPlateNumbers({ batch: 'All', model: 'All', location: r.region, vehicleType: tb.type, category: 'Pending', source: 'asset' })} > 待:{tb.inventory || ''}
))}
)}
); })}
)} {activeTab === 'customer' && (
{/* Customer Region Distribution Chart */}

客户运营地区占比

{(() => { const PIE_COLORS = ['#6366f1','#06b6d4','#f59e0b','#f43f5e','#10b981','#a855f7','#94a3b8']; let pieData: { name: string; value: number }[] = []; if (customerChartView === 'region') { const map: { [k: string]: number } = {}; customerData.forEach(item => { map[item.region] = (map[item.region] || 0) + item.total; }); pieData = Object.entries(map).map(([name, value]) => ({ name, value })).sort((a,b) => b.value - a.value); } else { const map: { [k: string]: number } = {}; customerData.forEach(item => { map[item.city] = (map[item.city] || 0) + item.total; }); const tot = Object.values(map).reduce((a,b) => a+b, 0); const threshold = tot * 0.05; let other = 0; Object.entries(map).forEach(([name, value]) => { if (value >= threshold) pieData.push({ name, value }); else other += value; }); if (other > 0) pieData.push({ name: '其他', value: other }); pieData.sort((a,b) => b.value - a.value); } const grandTotal = pieData.reduce((s,d) => s + d.value, 0); return (
{/* Donut chart */}
{pieData.map((_, i) => ( ))} [`${value} 辆`, '']} contentStyle={{ borderRadius: '10px', border: 'none', boxShadow: '0 8px 24px -4px rgba(0,0,0,0.12)', fontSize: 12 }} /> {/* Center label */}
{grandTotal}
{/* Custom legend */}
{pieData.map((item, i) => { const pct = grandTotal > 0 ? (item.value / grandTotal * 100) : 0; const color = PIE_COLORS[i % PIE_COLORS.length]; return (
{item.name}
{item.value} {pct.toFixed(1)}%
); })}
); })()}
{/* Customer Operations Statistics Section */}

客户运营统计

*按客户维度统计资产分布

{isCustomerFilterOpen && ( <> {/* Backdrop for closing */}
setIsCustomerFilterOpen(false)} /> {/* Popover Content */}

数据筛选

setCustomerFilters(prev => ({ ...prev, customer: e.target.value }))} /> {uniqueCustomerNames.map(c =>
setCustomerFilters(prev => ({ ...prev, manager: e.target.value }))} /> {uniqueCustomerManagers.map(m =>
setCustomerFilters(prev => ({ ...prev, brand: e.target.value }))} /> {uniqueBrands.map(b =>
setCustomerFilters(prev => ({ ...prev, department: e.target.value }))} /> {uniqueDepts.map(d =>
setCustomerFilters(prev => ({ ...prev, region: e.target.value }))} /> {uniqueRegions.map(r =>
)}
{/* Desktop Table View (Customer) */}
{filteredCustomerStats.map((cust) => { const isExpanded = expandedCustomers.has(cust.customer); return ( toggleCustomer(cust.customer)} > {isExpanded && ( )} ); })}
客户名称 所在区域 关联业务负责人 4.5T 4.5T冷链 18T 49T 挂车 其他 合计
{isExpanded ? : } {cust.customer} {cust.region} {cust.manager} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '4.5T', source: 'customer' }); }}>{cust.t4_5} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '4.5T', source: 'customer' }); }}>{cust.t4_5c} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '18T', source: 'customer' }); }}>{cust.t18} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '49T', source: 'customer' }); }}>{cust.t49} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '其他车型', source: 'customer' }); }}>{cust.trailer} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '其他车型', source: 'customer' }); }}>{cust.other} { e.stopPropagation(); setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, source: 'customer' }); }}>{cust.total}
客户详情
{cust.customer}
主要车型
{cust.t49 > cust.t18 ? '49T 重卡' : (cust.t18 > cust.t4_5c ? '18T 货车' : '4.5T 轻卡')}
业务经理
{cust.manager}
资产占比
{((cust.total / deptData.reduce((s, d) => s + d.totalAssets, 0)) * 100).toFixed(1)}%
{/* Mobile Card View (Customer) */}
{filteredCustomerStats.map((cust) => { const isExpanded = expandedCustomers.has(cust.customer); return (
toggleCustomer(cust.customer)} >
{isExpanded ? : }
{cust.customer} {cust.region}区域
合计: {cust.total}
{isExpanded && (
{/* Details Cards for Mobile */}
客户详情
{cust.customer}
主要车型
{cust.t49 > cust.t18 ? '49T 重卡' : (cust.t18 > cust.t4_5c ? '18T 货车' : '4.5T 轻卡')}
业务经理
{cust.manager}
资产占比
{((cust.total / deptData.reduce((s, d) => s + d.totalAssets, 0)) * 100).toFixed(1)}%
车型分布
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '4.5T', source: 'customer' })} >
4.5T
{cust.t4_5}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '4.5T', source: 'customer' })} >
冷链
{cust.t4_5c}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '18T', source: 'customer' })} >
18T
{cust.t18}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '49T', source: 'customer' })} >
49T
{cust.t49}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '其他车型', source: 'customer' })} >
挂车
{cust.trailer}
setShowPlateNumbers({ batch: 'All', model: 'All', location: 'All', customer: cust.customer, type: '其他车型', source: 'customer' })} >
其他
{cust.other}
)}
); })}
)} {/* Vehicle Detail Modal */} {showPlateNumbers && (

{showPlateNumbers.title || ( (showPlateNumbers.manager ? `${showPlateNumbers.manager} 的${showPlateNumbers.type || ''}车辆` : showPlateNumbers.customer ? `${showPlateNumbers.customer} 的${showPlateNumbers.type || ''}车辆` : showPlateNumbers.batch === 'All' ? '全量批次' : `${showPlateNumbers.batch} 批次`) + ' - 运营明细' )}

{showPlateNumbers.model === 'All' ? '全量型号' : showPlateNumbers.model} | {showPlateNumbers.category === 'Pending' ? '待交车' : showPlateNumbers.category === 'Delivered' ? '本周已交车' : showPlateNumbers.category === 'Returned' ? '已还车' : showPlateNumbers.category === 'Replaced' ? '已替换' : showPlateNumbers.category === 'Inventory' ? `${showPlateNumbers.location}库存` : showPlateNumbers.category === 'Operating' ? '正在运营' : '全部状态'}

{/* Modal Filters */}
setIsModalFilterExpanded(!isModalFilterExpanded)} >
筛选条件
{/* Quick Search always visible when collapsed */} {!isModalFilterExpanded && (
e.stopPropagation()}> setModalFilters({...modalFilters, plateNumber: e.target.value})} placeholder="快速搜索车牌..." className="w-full text-[11px] pl-7 pr-2 py-1 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" />
)}
{isModalFilterExpanded && (
setModalFilters({...modalFilters, plateNumber: e.target.value})} placeholder="搜索车牌..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueModalPlates.map(p =>
setModalFilters({...modalFilters, model: e.target.value})} placeholder="搜索车型..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueModalModels.map(m =>
setModalFilters({...modalFilters, brand: e.target.value})} placeholder="搜索品牌..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueModalBrands.map(b =>
setModalFilters({...modalFilters, location: e.target.value})} placeholder="搜索所在地..." className="w-full text-[11px] pl-7 pr-2 py-1.5 bg-white border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all shadow-sm" /> {uniqueModalLocations.map(l =>
)}
{modalLoading ? (
) : modalWeeklyDetail.length > 0 ? (
{filteredModalWeeklyDetail.map((v, i) => ( ))}
车牌 客户名称 日期
{v.plate_number} {v.customer_name || '—'} {v.handover_date || '—'}
) : (
{showPlateNumbers.source === 'customer' ? ( <> ) : ( <> {showPlateNumbers.source !== 'asset' && ( )} )} {filteredModalVehicles.map((v, idx) => ( {showPlateNumbers.source === 'customer' ? ( <> ) : ( <> {showPlateNumbers.source !== 'asset' && ( )} )} ))} {filteredModalVehicles.length === 0 && ( )}
业务部门 业务负责人 品牌 车型 资产归属 客户名称 车牌 状态 提车时间 合同到期时间 运营区域 离到期 签约公司车牌客户名称品牌 车型 所在地
{'—'} {v.departmentName || '—'} {v.customerManager || '—'} {v.brandLabel || '—'} {v.type} {v.subjectOrg || '—'} {v.customerName || '—'} {v.plateNumber || v.vin || '—'} {v.status === 'Operating' ? '在租' : v.status === 'Inventory' ? '库存' : '异常'} {'—'} {'—'} {v.location} {'—'} {v.orgName || '—'}{v.plateNumber || v.vin || '—'}{v.customerName || '—'}{v.brandLabel || '—'} {v.type} {v.location}
暂无符合条件的车辆数据
)}
共计 {filteredModalWeeklyDetail.length > 0 ? filteredModalWeeklyDetail.length : filteredModalVehicles.length} 台车辆
)}
{/* Footer / Navigation */}
); }