diff --git a/app/web/static/index.html b/app/web/static/index.html
index ecd62fd..df32ba7 100644
--- a/app/web/static/index.html
+++ b/app/web/static/index.html
@@ -1885,7 +1885,7 @@ createApp({
loadPositions(), loadInstructions(), loadLedger(), loadProposals(),
loadDispatchMode(), loadWs(), loadStrategies(), loadOpLog(), loadOpenScan(), loadUpstream()]);
await loadNames();
- lastRefresh.value = (health.value.now || '').slice(11, 19);
+ lastRefresh.value = new Date().toTimeString().slice(0, 8);
loading.value = false;
wsPollSync();
}
@@ -2080,20 +2080,20 @@ createApp({
}
// —— 自动刷新: 盘中 30s、休市 5min; 只拉快变数据, 不动 params(免得冲掉设置里在改的输入) ——
- let refreshTimer = null, refreshTick = 0;
+ let refreshTimer = null;
async function refreshLive() {
- await Promise.all([loadOverview(), loadPositions(), loadInstructions(), loadLedger(),
+ // allSettled: 单个 loader 失败/超时(axios 60s 兜底)不拖累其余与时间戳更新。
+ await Promise.allSettled([loadOverview(), loadPositions(), loadInstructions(), loadLedger(),
loadProposals(), loadStrategies(), loadOpLog(), loadOpenScan(), loadUpstream()]);
- await loadNames();
- lastRefresh.value = (health.value.now || '').slice(11, 19);
+ try { await loadNames(); } catch (e) {}
+ // 用客户端钟, 保证"自动·HH:MM:SS"稳定跳动, 不依赖 /health 的 now。
+ lastRefresh.value = new Date().toTimeString().slice(0, 8);
}
function startAutoRefresh() {
if (refreshTimer) return;
- refreshTimer = setInterval(() => {
- if (!autoRefresh.value) return;
- refreshTick++;
- if (marketOpen.value || refreshTick % 10 === 0) refreshLive();
- }, 30000);
+ // 固定 30s 自动刷新(开关开时)。不再按 marketOpen 分档 —— 交易日历对模拟/未来日期可能
+ // 误判成非交易日, 那样会把刷新降到 5 分钟、体感像"卡住不刷"。休市时多刷几次也无害。
+ refreshTimer = setInterval(() => { if (autoRefresh.value) refreshLive(); }, 30000);
}
onUnmounted(() => { if (refreshTimer) clearInterval(refreshTimer); });
onMounted(() => { loadAll(); loadPlan(); startAutoRefresh(); }); // 首屏 + 启动自动刷新