67 lines
2.1 KiB
TypeScript
67 lines
2.1 KiB
TypeScript
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';
|
|
}
|