import type { ReactNode } from 'react'; import { AnimatePresence, motion } from 'motion/react'; import { ChevronDown, CircleGauge, MapPin, Truck, } from 'lucide-react'; import type { MileageReportGroup } from '../api'; import VehicleTable from './VehicleTable'; import { currentAssessmentYearLabel, dailyMileageStatus, fmtKm, } from './utils'; interface GroupRowProps { group: MileageReportGroup; reportDate: string; expanded: boolean; onToggle: () => void; } function BreakdownList({ title, icon, items, showAverage = true, }: { title: string; icon: ReactNode; items: MileageReportGroup['departments']; showAverage?: boolean; }) { const max = Math.max(1, ...items.map(item => item.vehicleCount)); return (
{icon} {title}
{items.length === 0 ? (
暂无数据
) : (
{items.map(item => (
{item.name} {item.vehicleCount} 台{showAverage ? ` · 均 ${fmtKm(item.averageMileage)} km` : ''}
))}
)}
); } export default function GroupRow({ group, reportDate, expanded, onToggle, }: GroupRowProps) { const highRate = group.operatingCount > 0 ? (group.highMileageCount / group.operatingCount) * 100 : 0; const qualifiedRate = group.vehicleCount > 0 ? (group.qualifiedCount / group.vehicleCount) * 100 : 0; const assessmentYearLabel = currentAssessmentYearLabel(group.assessmentPeriods, reportDate); const dailyStatus = dailyMileageStatus(group); const dailyStatusClass = dailyStatus.tone === 'positive' ? 'border-emerald-100 bg-emerald-50/70 text-emerald-700' : dailyStatus.tone === 'warning' ? 'border-amber-100 bg-amber-50/70 text-amber-700' : 'border-slate-100 bg-slate-50 text-slate-600'; return (
{expanded ? (
} items={group.departments} /> } items={group.inventoryRegions} showAverage={false} />
考核进度
累计完成率
{group.completionRate.toFixed(1)}%
达标50%
{group.halfQualifiedCount} 台
剩余任务
{fmtKm(group.remainingMileage)} km
每日应完成
{fmtKm(group.dailyRequiredMileage)} km
当日目标执行 · {dailyStatus.label}
当日实际 {fmtKm(group.dailyMileage)} km / 应完成 {fmtKm(group.dailyRequiredMileage)} km
{dailyStatus.detail}
累计达标率
已达标 {group.qualifiedCount} / {group.vehicleCount} 台
{qualifiedRate.toFixed(1)}%
{group.assessmentPeriods.join(';')}
) : null}
); }