export type VehicleDetailRangeKey = 'context' | 'last15' | 'month' | 'quarter'; export interface VehicleDetailDateRange { start: string; end: string; } const DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/; function fmtYmd(date: Date): string { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } function validDate(value?: string): string | null { if (!value) return null; const match = DATE_PATTERN.exec(value); if (!match) return null; const date = new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3])); return fmtYmd(date) === value ? value : null; } export function normalizeVehicleDetailContext( startDate?: string, endDate?: string, ): VehicleDetailDateRange | null { const start = validDate(startDate); const end = validDate(endDate); if (!start || !end) return null; return start <= end ? { start, end } : { start: end, end: start }; } export function resolveVehicleDetailRange( key: VehicleDetailRangeKey, context: VehicleDetailDateRange | null, now = new Date(), ): VehicleDetailDateRange { if (key === 'context' && context) return context; const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); const end = fmtYmd(today); if (key === 'month') { return { start: fmtYmd(new Date(today.getFullYear(), today.getMonth(), 1)), end }; } if (key === 'quarter') { const quarterStartMonth = Math.floor(today.getMonth() / 3) * 3; return { start: fmtYmd(new Date(today.getFullYear(), quarterStartMonth, 1)), end }; } const start = new Date(today); start.setDate(today.getDate() - 14); return { start: fmtYmd(start), end }; } export function vehicleDetailContextLabel(context: VehicleDetailDateRange): string { if (context.start === context.end) { return `${Number(context.start.slice(5, 7))}月${Number(context.start.slice(8, 10))}日`; } return '所选区间'; } export function includeCurrentDayInVehicleDetail(key: VehicleDetailRangeKey): boolean { return key === 'context'; }