Spaces:
Running
Running
| import { dataService } from './dataService.js' | |
| /** | |
| * 自动刷新服务 | |
| * 每天美东时间早上5点自动从数据库刷新数据 | |
| */ | |
| class AutoRefreshService { | |
| constructor() { | |
| this.timerId = null | |
| this.targetHour = 5 // 美东早上5点 | |
| this.isRunning = false | |
| } | |
| /** | |
| * 计算下一次美东早上5点的时间 | |
| */ | |
| getNextRefreshTime() { | |
| const now = new Date() | |
| // 获取美东时区的当前时间 | |
| const etOptions = { timeZone: 'America/New_York', hour12: false } | |
| const etTimeString = now.toLocaleString('en-US', etOptions) | |
| const etDate = new Date(etTimeString) | |
| // 设置为美东早上5点 | |
| const nextRefresh = new Date(etDate) | |
| nextRefresh.setHours(this.targetHour, 0, 0, 0) | |
| // 如果已经过了今天的5点,设置为明天 | |
| if (etDate.getTime() >= nextRefresh.getTime()) { | |
| nextRefresh.setDate(nextRefresh.getDate() + 1) | |
| } | |
| // 转换回本地时区 | |
| const etTimestamp = nextRefresh.getTime() | |
| const etOffset = this.getETOffset(nextRefresh) | |
| const localOffset = now.getTimezoneOffset() * 60 * 1000 | |
| const localTimestamp = etTimestamp - etOffset + localOffset | |
| return new Date(localTimestamp) | |
| } | |
| /** | |
| * 获取美东时区的偏移量(毫秒) | |
| */ | |
| getETOffset(date) { | |
| const etString = date.toLocaleString('en-US', { | |
| timeZone: 'America/New_York', | |
| timeZoneName: 'short' | |
| }) | |
| // EST is UTC-5, EDT is UTC-4 | |
| const isDST = etString.includes('EDT') | |
| return isDST ? -4 * 60 * 60 * 1000 : -5 * 60 * 60 * 1000 | |
| } | |
| /** | |
| * 执行刷新 | |
| */ | |
| async refresh() { | |
| console.log('[AutoRefresh] Refreshing data at', new Date().toLocaleString()) | |
| try { | |
| await dataService.load(true) | |
| console.log('[AutoRefresh] Data refreshed successfully') | |
| } catch (error) { | |
| console.error('[AutoRefresh] Failed to refresh data:', error) | |
| } | |
| } | |
| /** | |
| * 调度下一次刷新 | |
| */ | |
| scheduleNext() { | |
| // 清除现有的定时器 | |
| if (this.timerId) { | |
| clearTimeout(this.timerId) | |
| this.timerId = null | |
| } | |
| const nextRefresh = this.getNextRefreshTime() | |
| const now = new Date() | |
| const delay = nextRefresh.getTime() - now.getTime() | |
| console.log('[AutoRefresh] Next refresh scheduled at:', nextRefresh.toLocaleString()) | |
| console.log('[AutoRefresh] Time until next refresh:', Math.round(delay / 1000 / 60), 'minutes') | |
| this.timerId = setTimeout(async () => { | |
| await this.refresh() | |
| this.scheduleNext() // 刷新后调度下一次 | |
| }, delay) | |
| } | |
| /** | |
| * 启动自动刷新 | |
| */ | |
| start() { | |
| if (this.isRunning) { | |
| console.log('[AutoRefresh] Already running') | |
| return | |
| } | |
| console.log('[AutoRefresh] Starting auto-refresh service') | |
| this.isRunning = true | |
| this.scheduleNext() | |
| } | |
| /** | |
| * 停止自动刷新 | |
| */ | |
| stop() { | |
| console.log('[AutoRefresh] Stopping auto-refresh service') | |
| if (this.timerId) { | |
| clearTimeout(this.timerId) | |
| this.timerId = null | |
| } | |
| this.isRunning = false | |
| } | |
| /** | |
| * 手动触发刷新(不影响定时调度) | |
| */ | |
| async triggerManualRefresh() { | |
| console.log('[AutoRefresh] Manual refresh triggered') | |
| await this.refresh() | |
| } | |
| } | |
| // 创建单例 | |
| export const autoRefreshService = new AutoRefreshService() | |