Files
admin-web/src/modules/self-operated/overviewRange.ts
T

27 lines
1.5 KiB
TypeScript
Raw Normal View History

import type { RangePreset } from './types'
import { previousDate } from './dashboardNavigation'
import { validateCustomRange } from './state'
export const overviewRangeOptions: { value: RangePreset; label: string }[] = [3, 7, 15, 30].map(days => ({ value: `LAST_${days}_DAYS` as RangePreset, label: `最近${days}天` })).concat([{ value: 'CUSTOM', label: '自定义' }])
export function beijingDate(now: number) {
return new Intl.DateTimeFormat('sv-SE', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit' }).format(now)
}
export function overviewRange(preset: RangePreset, anchor: string, start = '', end = '') {
const yesterday = previousDate(anchor)
if (preset === 'CUSTOM') {
const problem = validateCustomRange(start, end)
if (problem) throw new Error(problem)
if (end > yesterday) throw new Error('仅查询已结束的自然日,结束日期最晚为昨日')
} else {
end = yesterday
const day = new Date(`${anchor}T00:00:00Z`)
const windows: Partial<Record<RangePreset, number>> = { LAST_3_DAYS: 3, LAST_7_DAYS: 7, LAST_15_DAYS: 15, LAST_30_DAYS: 30 }
const days = windows[preset]
if (!days) throw new Error('请选择有效的统计时间范围')
day.setUTCDate(day.getUTCDate() - days)
start = day.toISOString().slice(0, 10)
if (start > end) throw new Error('当前周期还没有已结束的自然日,请选择其他时间范围')
}
return { rangePreset: 'CUSTOM' as const, startDate: start, endDate: end }
}