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:
dekun
2026-06-03 22:44:01 +08:00
parent 2a9602610e
commit d07357b98e
9 changed files with 275 additions and 31 deletions
+18 -6
View File
@@ -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);
}
+1 -1
View File
@@ -245,6 +245,6 @@
<div id="toast"></div>
<script src="https://unpkg.com/lightweight-charts@4.2.0/dist/lightweight-charts.standalone.production.js"></script>
<script src="/assets/chart.js?v=20260603-hub-binance-tick"></script>
<script src="/assets/app.js?v=20260604-hub-mark-price2"></script>
<script src="/assets/app.js?v=20260604-hub-board-refresh"></script>
</body>
</html>