fix: show expiry-filter sample stats so ops map filter effect is visible

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-02 10:48:40 +08:00
parent 3e492eb46c
commit 56f58a12bd
6 changed files with 143 additions and 27 deletions
+17 -1
View File
@@ -712,7 +712,23 @@
});
const lev = d.leverage || {};
document.getElementById("opsRange").textContent = (lev.start_ymd || "—") + " → " + (lev.end_ymd || "—");
document.getElementById("opsSamples").textContent = "杠杆样本 " + (lev.sample_count ?? 0);
const filt = d.expiry_filter || lev.expiry_filter || {};
const rawN = filt.raw_sample_count;
const keptN = filt.filtered_sample_count != null ? filt.filtered_sample_count : (lev.sample_count ?? 0);
let sampleHint = "杠杆样本 " + keptN;
if (rawN != null) {
const hMin = filt.raw_hours_min;
const hMax = filt.raw_hours_max;
const span = (hMin != null && hMax != null)
? (" · 样本距到期约 " + Math.floor(hMin) + "" + Math.ceil(hMax) + "h")
: "";
if (rawN === keptN) {
sampleHint = "杠杆样本 " + keptN + "(≥" + (state.minHours || 12) + "h 未减少)" + span;
} else {
sampleHint = "杠杆样本 " + keptN + "/" + rawN + "(≥" + (state.minHours || 12) + "h" + span;
}
}
document.getElementById("opsSamples").textContent = sampleHint;
document.getElementById("opsMin").textContent = lev.min_leverage ?? "—";
const titleMap = { day: "日", week: "近7日", month: "近30日" };
document.getElementById("chartTitle").textContent = "上图 · 时段杠杆均值(" + (titleMap[state.range]||"") + "";
+12
View File
@@ -229,9 +229,21 @@ export type MovePointsStats = {
buckets: MoveBucket[];
};
export type ExpiryFilterMeta = {
min_hours_filter: number;
raw_sample_count: number;
filtered_sample_count: number;
raw_hours_min: number | null;
raw_hours_max: number | null;
filtered_hours_min?: number | null;
filtered_hours_max?: number | null;
};
export type OpsMap = {
leverage: LeverageStats;
move_points: MovePointsStats;
min_hours?: number;
expiry_filter?: ExpiryFilterMeta;
};
export async function fetchHealth(): Promise<Health> {
+18 -1
View File
@@ -88,8 +88,25 @@ export default function OpsMapPage() {
const lev: LeverageStats | undefined = data?.leverage;
const mov: MovePointsStats | undefined = data?.move_points;
const filt = data?.expiry_filter;
const rangeLabel = range === "day" ? "日" : range === "week" ? "近7日" : "近30日";
const sampleHint = (() => {
if (!filt) return `杠杆样本 ${lev?.sample_count ?? 0}`;
const raw = filt.raw_sample_count;
const kept = filt.filtered_sample_count;
const hMin = filt.raw_hours_min;
const hMax = filt.raw_hours_max;
const span =
hMin != null && hMax != null
? ` · 样本距到期约 ${Math.floor(hMin)}${Math.ceil(hMax)}h`
: "";
if (raw === kept) {
return `杠杆样本 ${kept}(≥${minHours}h 未减少)${span}`;
}
return `杠杆样本 ${kept}/${raw}(≥${minHours}h${span}`;
})();
return (
<div className="layout">
<div className="brand"></div>
@@ -152,7 +169,7 @@ export default function OpsMapPage() {
<div className="value" style={{ fontSize: "1.1rem" }}>
{lev.start_ymd} {lev.end_ymd}
</div>
<div className="hint"> {lev.sample_count}</div>
<div className="hint">{sampleHint}</div>
</div>
<div className="tile">
<div className="label">线</div>