Fix freeze countdown exceeding configured cooloff hours.

Clamp future last_close anchors, cap remaining time server-side, prefer freeze_remaining_sec in the badge JS, and auto-repair stale DB rows on read.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-18 22:11:09 +08:00
parent deb240d4eb
commit 9330e356fc
9 changed files with 148 additions and 24 deletions
+18 -7
View File
@@ -21,10 +21,20 @@
return "正常";
}
function resolveFreezeUntilMs(riskStatus) {
if (!riskStatus) return null;
const sec = Number(riskStatus.freeze_remaining_sec);
if (Number.isFinite(sec) && sec > 0) {
return Date.now() + sec * 1000;
}
const until = Number(riskStatus.freeze_until_ms);
return Number.isFinite(until) && until > 0 ? until : null;
}
function badgeText(riskStatus) {
const label = baseLabel(riskStatus, null);
const until = Number(riskStatus && riskStatus.freeze_until_ms);
if (!Number.isFinite(until) || until <= Date.now()) return label;
const until = resolveFreezeUntilMs(riskStatus);
if (!until || until <= Date.now()) return label;
const cd = formatRemaining((until - Date.now()) / 1000);
return cd ? `${label} · ${cd}` : label;
}
@@ -58,8 +68,9 @@
const st = riskStatus.status || "normal";
el.className = "risk-status-badge risk-status-" + st;
el.dataset.statusLabel = baseLabel(riskStatus, el);
if (riskStatus.freeze_until_ms != null && riskStatus.freeze_until_ms !== "") {
el.dataset.freezeUntilMs = String(riskStatus.freeze_until_ms);
const until = resolveFreezeUntilMs(riskStatus);
if (until) {
el.dataset.freezeUntilMs = String(until);
} else if (el.dataset) {
delete el.dataset.freezeUntilMs;
}
@@ -74,10 +85,10 @@
const label = safe(riskStatus.status_label || "正常");
const title = safe(riskStatus.reason || "");
const text = safe(badgeText(riskStatus));
const until = riskStatus.freeze_until_ms;
const until = resolveFreezeUntilMs(riskStatus);
const untilAttr =
until != null && until !== ""
? ` data-freeze-until-ms="${safe(String(until))}"`
until != null
? ` data-freeze-until-ms="${safe(String(Math.floor(until)))}"`
: "";
return (
`<span class="risk-status-badge risk-status-${safe(st)}" role="status"` +