fix(HEL-494): 修复个股缺失指标、问天遮罩、四爻外显并回补250日K
Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
co-authored by
Cursor
multica-agent
parent
c8a9376adb
commit
3e828b346c
@@ -113,9 +113,12 @@ async function loadHeavenSetup(force = false, sector = "", stockCode = "") {
|
||||
document.querySelector("#resetHeavenCalibrationButton"),
|
||||
].filter(Boolean);
|
||||
cancelHeavenPerformance();
|
||||
heavenView?.classList.add("heaven-data-loading");
|
||||
const blocking = !state.heavenSetup;
|
||||
if (blocking) heavenView?.classList.add("heaven-data-loading");
|
||||
if (loadButton) loadButton.disabled = true;
|
||||
calibrationButtons.forEach((button) => { button.disabled = true; });
|
||||
const controller = new AbortController();
|
||||
const timeoutId = window.setTimeout(() => controller.abort(), 25_000);
|
||||
try {
|
||||
if (state.heavenSetup?.requestedKey && state.heavenSetup.requestedKey !== requestedKey) {
|
||||
state.personalField = null;
|
||||
@@ -126,7 +129,7 @@ async function loadHeavenSetup(force = false, sector = "", stockCode = "") {
|
||||
if (sector) query.set("sector", sector);
|
||||
if (stockCode) query.set("stock_code", stockCode);
|
||||
if (manualData) query.set("manual_data", JSON.stringify(manualData));
|
||||
const payload = await apiRequest(`/api/heaven/setup?${query}`);
|
||||
const payload = await apiRequest(`/api/heaven/setup?${query}`, "GET", null, { signal: controller.signal });
|
||||
if (
|
||||
requestSequence !== state.heavenRequestSequence
|
||||
|| calendarDate !== document.querySelector("#qiObservationDate")?.value
|
||||
@@ -152,9 +155,15 @@ async function loadHeavenSetup(force = false, sector = "", stockCode = "") {
|
||||
if (payload.chart.selection_notice) showHeavenNotice(payload.chart.selection_notice);
|
||||
} catch (error) {
|
||||
if (requestSequence !== state.heavenRequestSequence) return;
|
||||
showHeavenNotice(error.message || "问天数据加载失败");
|
||||
showToast(error.message || "问天数据加载失败");
|
||||
const aborted = error?.payload?.aborted || /abort|超时|cancel/i.test(String(error?.message || ""));
|
||||
const message = aborted
|
||||
? "问天数据仍在准备,页面可继续输入和操作"
|
||||
: (error.message || "问天数据加载失败");
|
||||
showHeavenNotice(message);
|
||||
if (!aborted) showToast(message);
|
||||
if (!state.heavenSetup) renderHeavenWorkspace();
|
||||
} finally {
|
||||
window.clearTimeout(timeoutId);
|
||||
if (requestSequence === state.heavenRequestSequence) {
|
||||
heavenView?.classList.remove("heaven-data-loading");
|
||||
if (loadButton) loadButton.disabled = false;
|
||||
|
||||
@@ -20,17 +20,9 @@ async function openStock(code, fallback = null) {
|
||||
setText("detailStreak", row.status === "涨停" ? streakLabel(row.streak) : row.status || "--");
|
||||
setText("detailReason", row.reason || "--");
|
||||
setText("detailSector", row.sector || "其他");
|
||||
setText("detailFirst", row.first_time || "--");
|
||||
setText("detailLast", row.last_time || "--");
|
||||
setText("detailOpen", `${number(row.open_times)} 次`);
|
||||
setText("detailTurnover", `${formatNumber(row.turnover_rate, 2)}%`);
|
||||
setText("detailAmount", `${formatNumber(row.amount_billion, 2)} 亿`);
|
||||
setText("detailSeal", `${formatNumber(row.seal_amount_million, 0)} 万`);
|
||||
setStockBoardFields(row);
|
||||
setText("chartSource", "正在加载行情");
|
||||
setText("flowNet", "--");
|
||||
setText("flowLarge", "--");
|
||||
setText("flowMedium", "--");
|
||||
setText("flowSmall", "--");
|
||||
renderMoneyflow({});
|
||||
document.querySelector("#reasonInput").value = row.reason || "";
|
||||
document.querySelector("#stockNoteContent").value = "";
|
||||
document.querySelector("#stockNotePlan").value = "";
|
||||
@@ -48,6 +40,7 @@ async function openStock(code, fallback = null) {
|
||||
setText("detailName", stock.name || row.name);
|
||||
setText("detailPrice", formatNumber(stock.price || row.price, 2));
|
||||
setText("detailChange", `${signed(stock.change ?? row.change)}%`);
|
||||
setStockBoardFields({ ...row, ...stock });
|
||||
renderMoneyflow(payload.moneyflow || {});
|
||||
renderStockNotes(payload.notes || []);
|
||||
updateWatchButton();
|
||||
@@ -121,6 +114,21 @@ function renderStockDetailIntraday(payload) {
|
||||
});
|
||||
}
|
||||
|
||||
function setStockBoardFields(row) {
|
||||
const firstTime = String(row.first_time || "").trim();
|
||||
const lastTime = String(row.last_time || "").trim();
|
||||
setText("detailFirst", firstTime && firstTime !== "--" ? firstTime : "--");
|
||||
setText("detailLast", lastTime && lastTime !== "--" ? lastTime : "--");
|
||||
setText("detailOpen", row.open_times === null || row.open_times === undefined || row.open_times === "" ? "--" : `${number(row.open_times)} 次`);
|
||||
setText("detailTurnover", presentMetric(row.turnover_rate) ? `${formatNumber(row.turnover_rate, 2)}%` : "--");
|
||||
setText("detailAmount", presentMetric(row.amount_billion) ? `${formatNumber(row.amount_billion, 2)} 亿` : "--");
|
||||
setText("detailSeal", presentMetric(row.seal_amount_million) ? `${formatNumber(row.seal_amount_million, 0)} 万` : "--");
|
||||
}
|
||||
|
||||
function presentMetric(value) {
|
||||
return meaningfulNumber(value) && Number(value) !== 0;
|
||||
}
|
||||
|
||||
function openActiveStockInHeaven() {
|
||||
const code = state.activeStock?.code;
|
||||
if (!/^\d{6}$/.test(String(code || ""))) return;
|
||||
|
||||
@@ -408,8 +408,18 @@ async function saveReasonOverride(event) {
|
||||
}
|
||||
|
||||
function renderMoneyflow(flow) {
|
||||
for (const [id, value] of [["flowNet", flow.net_million], ["flowLarge", flow.large_million], ["flowMedium", flow.medium_million], ["flowSmall", flow.small_million]]) {
|
||||
const payload = flow || {};
|
||||
const available = payload.available !== false && [
|
||||
payload.net_million, payload.large_million, payload.medium_million, payload.small_million,
|
||||
].some((value) => value !== null && value !== undefined && value !== "");
|
||||
for (const [id, value] of [["flowNet", payload.net_million], ["flowLarge", payload.large_million], ["flowMedium", payload.medium_million], ["flowSmall", payload.small_million]]) {
|
||||
const element = document.getElementById(id);
|
||||
if (!element) continue;
|
||||
if (!available || value === null || value === undefined || value === "") {
|
||||
element.textContent = "--";
|
||||
element.className = "";
|
||||
continue;
|
||||
}
|
||||
element.textContent = formatMoneyMillion(value);
|
||||
element.className = changeClass(value);
|
||||
}
|
||||
|
||||
@@ -62,6 +62,9 @@
|
||||
try {
|
||||
response = await fetch(url, requestOptions(method, body, options.signal));
|
||||
} catch (error) {
|
||||
if (error?.name === "AbortError") {
|
||||
throw new ApiError("请求已取消或超时", 0, { aborted: true });
|
||||
}
|
||||
throw new ApiError(readableRequestError(error), 0, null);
|
||||
}
|
||||
const payload = await parseJson(response);
|
||||
|
||||
Reference in New Issue
Block a user