fix(hub): merge mark price from Flask snapshot and fix board refresh
Sync hub positions with instance price_snapshot (order_prices and position_marks). Fix monitor board UI when hub restarts (version rewind) and queue snapshot fetches. Expose board aggregate status on /api/ping for diagnostics. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
let lastMonitorBoardUpdatedAt = "";
|
||||
let localBoardVersion = 0;
|
||||
let monitorBoardInFlight = false;
|
||||
let monitorBoardFetchPending = false;
|
||||
let monitorBoardSlowHintTimer = null;
|
||||
let boardEventSource = null;
|
||||
let sseReconnectTimer = null;
|
||||
@@ -384,7 +385,7 @@
|
||||
try {
|
||||
const st = JSON.parse(ev.data || "{}");
|
||||
const ver = Number(st.board_version) || 0;
|
||||
if (ver > localBoardVersion) {
|
||||
if (ver !== localBoardVersion) {
|
||||
void fetchMonitorBoardSnapshot({ background: true });
|
||||
} else if (st.aggregating && lastMonitorRows.length) {
|
||||
applyMonitorBoardUi(lastMonitorRows, st.updated_at || lastMonitorBoardUpdatedAt, {
|
||||
@@ -468,7 +469,7 @@
|
||||
if (!cached) return false;
|
||||
lastMonitorRows = cached.rows;
|
||||
lastMonitorBoardUpdatedAt = cached.updated_at || "";
|
||||
localBoardVersion = Number(cached.board_version) || 0;
|
||||
localBoardVersion = 0;
|
||||
applyMonitorBoardUi(cached.rows, lastMonitorBoardUpdatedAt, { stale: true });
|
||||
return true;
|
||||
}
|
||||
@@ -660,7 +661,10 @@
|
||||
const background = !!options.background;
|
||||
const showLoading = !!options.showLoading && !lastMonitorRows.length;
|
||||
const box = document.getElementById("monitor-grid");
|
||||
if (monitorBoardInFlight && background) return;
|
||||
if (monitorBoardInFlight) {
|
||||
if (background) monitorBoardFetchPending = true;
|
||||
else return;
|
||||
}
|
||||
if (showLoading && box) {
|
||||
box.innerHTML =
|
||||
'<div class="board-loading"><span class="board-loading-spin" aria-hidden="true"></span>正在加载监控快照…<p class="board-loading-sub"></p></div>';
|
||||
@@ -687,11 +691,14 @@
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (ver >= localBoardVersion || !lastMonitorRows.length) {
|
||||
const ts = data.updated_at || "";
|
||||
const versionChanged = ver !== localBoardVersion;
|
||||
const timeChanged = ts && ts !== lastMonitorBoardUpdatedAt;
|
||||
if (versionChanged || timeChanged || !lastMonitorRows.length) {
|
||||
localBoardVersion = ver;
|
||||
lastMonitorRows = rows;
|
||||
saveMonitorBoardCache(lastMonitorRows, data.updated_at, ver);
|
||||
applyMonitorBoardUi(lastMonitorRows, data.updated_at, {
|
||||
saveMonitorBoardCache(lastMonitorRows, ts, ver);
|
||||
applyMonitorBoardUi(lastMonitorRows, ts, {
|
||||
stale: !!data.aggregating,
|
||||
});
|
||||
} else if (data.aggregating && lastMonitorRows.length) {
|
||||
@@ -715,6 +722,10 @@
|
||||
clearTimeout(fetchTimer);
|
||||
clearMonitorBoardSlowHint();
|
||||
monitorBoardInFlight = false;
|
||||
if (monitorBoardFetchPending) {
|
||||
monitorBoardFetchPending = false;
|
||||
void fetchMonitorBoardSnapshot({ background: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -724,6 +735,7 @@
|
||||
}
|
||||
try {
|
||||
await requestMonitorBoardRefresh();
|
||||
await fetchMonitorBoardSnapshot({ background: false });
|
||||
} catch (e) {
|
||||
showToast(String(e), true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user