lfqian commited on
Commit
0b89e2d
·
1 Parent(s): 6ddae08

Add auto-refresh service: refresh data daily at 5 AM ET

Browse files
Files changed (2) hide show
  1. src/lib/autoRefresh.js +129 -0
  2. src/main.js +4 -0
src/lib/autoRefresh.js ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { dataService } from './dataService.js'
2
+
3
+ /**
4
+ * 自动刷新服务
5
+ * 每天美东时间早上5点自动从数据库刷新数据
6
+ */
7
+ class AutoRefreshService {
8
+ constructor() {
9
+ this.timerId = null
10
+ this.targetHour = 5 // 美东早上5点
11
+ this.isRunning = false
12
+ }
13
+
14
+ /**
15
+ * 计算下一次美东早上5点的时间
16
+ */
17
+ getNextRefreshTime() {
18
+ const now = new Date()
19
+
20
+ // 获取美东时区的当前时间
21
+ const etOptions = { timeZone: 'America/New_York', hour12: false }
22
+ const etTimeString = now.toLocaleString('en-US', etOptions)
23
+ const etDate = new Date(etTimeString)
24
+
25
+ // 设置为美东早上5点
26
+ const nextRefresh = new Date(etDate)
27
+ nextRefresh.setHours(this.targetHour, 0, 0, 0)
28
+
29
+ // 如果已经过了今天的5点,设置为明天
30
+ if (etDate.getTime() >= nextRefresh.getTime()) {
31
+ nextRefresh.setDate(nextRefresh.getDate() + 1)
32
+ }
33
+
34
+ // 转换回本地时区
35
+ const etTimestamp = nextRefresh.getTime()
36
+ const etOffset = this.getETOffset(nextRefresh)
37
+ const localOffset = now.getTimezoneOffset() * 60 * 1000
38
+ const localTimestamp = etTimestamp - etOffset + localOffset
39
+
40
+ return new Date(localTimestamp)
41
+ }
42
+
43
+ /**
44
+ * 获取美东时区的偏移量(毫秒)
45
+ */
46
+ getETOffset(date) {
47
+ const etString = date.toLocaleString('en-US', {
48
+ timeZone: 'America/New_York',
49
+ timeZoneName: 'short'
50
+ })
51
+ // EST is UTC-5, EDT is UTC-4
52
+ const isDST = etString.includes('EDT')
53
+ return isDST ? -4 * 60 * 60 * 1000 : -5 * 60 * 60 * 1000
54
+ }
55
+
56
+ /**
57
+ * 执行刷新
58
+ */
59
+ async refresh() {
60
+ console.log('[AutoRefresh] Refreshing data at', new Date().toLocaleString())
61
+ try {
62
+ await dataService.load(true)
63
+ console.log('[AutoRefresh] Data refreshed successfully')
64
+ } catch (error) {
65
+ console.error('[AutoRefresh] Failed to refresh data:', error)
66
+ }
67
+ }
68
+
69
+ /**
70
+ * 调度下一次刷新
71
+ */
72
+ scheduleNext() {
73
+ // 清除现有的定时器
74
+ if (this.timerId) {
75
+ clearTimeout(this.timerId)
76
+ this.timerId = null
77
+ }
78
+
79
+ const nextRefresh = this.getNextRefreshTime()
80
+ const now = new Date()
81
+ const delay = nextRefresh.getTime() - now.getTime()
82
+
83
+ console.log('[AutoRefresh] Next refresh scheduled at:', nextRefresh.toLocaleString())
84
+ console.log('[AutoRefresh] Time until next refresh:', Math.round(delay / 1000 / 60), 'minutes')
85
+
86
+ this.timerId = setTimeout(async () => {
87
+ await this.refresh()
88
+ this.scheduleNext() // 刷新后调度下一次
89
+ }, delay)
90
+ }
91
+
92
+ /**
93
+ * 启动自动刷新
94
+ */
95
+ start() {
96
+ if (this.isRunning) {
97
+ console.log('[AutoRefresh] Already running')
98
+ return
99
+ }
100
+
101
+ console.log('[AutoRefresh] Starting auto-refresh service')
102
+ this.isRunning = true
103
+ this.scheduleNext()
104
+ }
105
+
106
+ /**
107
+ * 停止自动刷新
108
+ */
109
+ stop() {
110
+ console.log('[AutoRefresh] Stopping auto-refresh service')
111
+ if (this.timerId) {
112
+ clearTimeout(this.timerId)
113
+ this.timerId = null
114
+ }
115
+ this.isRunning = false
116
+ }
117
+
118
+ /**
119
+ * 手动触发刷新(不影响定时调度)
120
+ */
121
+ async triggerManualRefresh() {
122
+ console.log('[AutoRefresh] Manual refresh triggered')
123
+ await this.refresh()
124
+ }
125
+ }
126
+
127
+ // 创建单例
128
+ export const autoRefreshService = new AutoRefreshService()
129
+
src/main.js CHANGED
@@ -1,6 +1,7 @@
1
  import { createApp } from 'vue'
2
  import App from './App.vue'
3
  import router from './router/index.js'
 
4
 
5
  // PrimeVue setup
6
  import PrimeVue from 'primevue/config'
@@ -86,4 +87,7 @@ try {
86
  if (pubKey) { emailjs.init(pubKey) }
87
  } catch (_) { }
88
 
 
 
 
89
  app.mount('#app')
 
1
  import { createApp } from 'vue'
2
  import App from './App.vue'
3
  import router from './router/index.js'
4
+ import { autoRefreshService } from './lib/autoRefresh.js'
5
 
6
  // PrimeVue setup
7
  import PrimeVue from 'primevue/config'
 
87
  if (pubKey) { emailjs.init(pubKey) }
88
  } catch (_) { }
89
 
90
+ // Start auto-refresh service (daily at 5 AM ET)
91
+ autoRefreshService.start()
92
+
93
  app.mount('#app')