移植期权复盘自动K线、时区修复与保存后轮询展示,与今日 crypto_monitor 改动对齐。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -582,31 +582,103 @@
|
||||
}
|
||||
}
|
||||
|
||||
var detailChartPollTimer = null;
|
||||
var detailChartPollTradeId = 0;
|
||||
|
||||
function hideDetail() {
|
||||
hideLightbox();
|
||||
stopDetailChartPoll();
|
||||
var backdrop = $("or-detail-backdrop");
|
||||
if (backdrop) backdrop.hidden = true;
|
||||
}
|
||||
|
||||
function openDetail(tradeId) {
|
||||
function stopDetailChartPoll() {
|
||||
if (detailChartPollTimer) {
|
||||
clearTimeout(detailChartPollTimer);
|
||||
detailChartPollTimer = null;
|
||||
}
|
||||
detailChartPollTradeId = 0;
|
||||
}
|
||||
|
||||
function tradeHasAutoChart(t) {
|
||||
var images = ((t && t.entry) || {}).images || [];
|
||||
for (var i = 0; i < images.length; i++) {
|
||||
var tf = String((images[i] && images[i].tf) || "").trim();
|
||||
var file = String((images[i] && images[i].file) || "").trim();
|
||||
if (tf === "auto" && file) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function openDetail(tradeId, opts) {
|
||||
opts = opts || {};
|
||||
var waitAuto = !!opts.waitAutoChart;
|
||||
var backdrop = $("or-detail-backdrop");
|
||||
if (!backdrop) return;
|
||||
stopDetailChartPoll();
|
||||
backdrop.hidden = false;
|
||||
($("or-detail-title") || {}).textContent = "加载中…";
|
||||
($("or-detail-meta") || {}).innerHTML = "";
|
||||
($("or-detail-text") || {}).innerHTML = "";
|
||||
($("or-detail-images") || {}).innerHTML = "";
|
||||
($("or-detail-images") || {}).innerHTML = waitAuto
|
||||
? '<div class="or-detail-img-cell"><span class="or-detail-img-label">自动K线</span><div class="or-detail-img-miss">生成中…</div></div>'
|
||||
: "";
|
||||
|
||||
fetch("/api/options/review/trades/" + tradeId, { credentials: "same-origin" })
|
||||
.then(function (r) {
|
||||
function applyTrade(trade, pendingAuto) {
|
||||
renderDetail(trade, { pendingAuto: !!pendingAuto });
|
||||
}
|
||||
|
||||
function fetchOnce() {
|
||||
return fetch("/api/options/review/trades/" + tradeId, {
|
||||
credentials: "same-origin",
|
||||
}).then(function (r) {
|
||||
return r.json();
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
fetchOnce()
|
||||
.then(function (data) {
|
||||
if (!data.ok || !data.trade) {
|
||||
($("or-detail-title") || {}).textContent = "加载失败";
|
||||
return;
|
||||
}
|
||||
renderDetail(data.trade);
|
||||
if (!waitAuto || tradeHasAutoChart(data.trade)) {
|
||||
applyTrade(data.trade, false);
|
||||
return;
|
||||
}
|
||||
applyTrade(data.trade, true);
|
||||
detailChartPollTradeId = tradeId;
|
||||
var tries = 0;
|
||||
var maxTries = 20;
|
||||
function poll() {
|
||||
if (detailChartPollTradeId !== tradeId) return;
|
||||
tries += 1;
|
||||
fetchOnce()
|
||||
.then(function (again) {
|
||||
if (detailChartPollTradeId !== tradeId) return;
|
||||
if (again.ok && again.trade && tradeHasAutoChart(again.trade)) {
|
||||
stopDetailChartPoll();
|
||||
applyTrade(again.trade, false);
|
||||
loadReviewed({ sync: false, soft: true });
|
||||
return;
|
||||
}
|
||||
if (tries >= maxTries) {
|
||||
stopDetailChartPoll();
|
||||
applyTrade((again && again.trade) || data.trade, false);
|
||||
return;
|
||||
}
|
||||
detailChartPollTimer = setTimeout(poll, 1500);
|
||||
})
|
||||
.catch(function () {
|
||||
if (detailChartPollTradeId !== tradeId) return;
|
||||
if (tries >= maxTries) {
|
||||
stopDetailChartPoll();
|
||||
return;
|
||||
}
|
||||
detailChartPollTimer = setTimeout(poll, 1500);
|
||||
});
|
||||
}
|
||||
detailChartPollTimer = setTimeout(poll, 1200);
|
||||
})
|
||||
.catch(function () {
|
||||
($("or-detail-title") || {}).textContent = "加载失败";
|
||||
@@ -626,9 +698,29 @@
|
||||
return base + encodeURIComponent(name);
|
||||
}
|
||||
|
||||
function renderDetailImages(images) {
|
||||
function chartTfLabel(tf) {
|
||||
if (tf === "auto") return "自动K线";
|
||||
if (tf === "_") return "截图";
|
||||
return tf;
|
||||
}
|
||||
|
||||
function setChartOptionsVisible(visible) {
|
||||
var box = $("or-chart-options");
|
||||
var hint = $("or-chart-hint");
|
||||
if (box) box.classList.toggle("hidden", !visible);
|
||||
if (hint) hint.classList.toggle("hidden", !visible);
|
||||
}
|
||||
|
||||
function resetChartOptions() {
|
||||
var cb = $("or-exchange-chart");
|
||||
if (cb) cb.checked = false;
|
||||
}
|
||||
|
||||
function renderDetailImages(images, opts) {
|
||||
var imagesHost = $("or-detail-images");
|
||||
if (!imagesHost) return;
|
||||
opts = opts || {};
|
||||
var pendingAuto = !!opts.pendingAuto;
|
||||
var byTf = {};
|
||||
(images || []).forEach(function (img) {
|
||||
var tf = String((img && img.tf) || "").trim();
|
||||
@@ -637,16 +729,29 @@
|
||||
var key = tf || "_";
|
||||
byTf[key] = file;
|
||||
});
|
||||
var order = ["5m", "15m", "1h", "4h"];
|
||||
// 互斥:有自动K线只显示自动;否则只显示手动四周期
|
||||
var hasAuto = !!byTf.auto;
|
||||
if (pendingAuto && !hasAuto) {
|
||||
imagesHost.innerHTML =
|
||||
'<div class="or-detail-img-cell">' +
|
||||
'<span class="or-detail-img-label">自动K线</span>' +
|
||||
'<div class="or-detail-img-miss">生成中…</div>' +
|
||||
"</div>";
|
||||
return;
|
||||
}
|
||||
var order = hasAuto ? ["auto"] : ["5m", "15m", "1h", "4h"];
|
||||
var keys = order.slice();
|
||||
Object.keys(byTf).forEach(function (k) {
|
||||
if (keys.indexOf(k) < 0) keys.push(k);
|
||||
});
|
||||
if (!hasAuto) {
|
||||
Object.keys(byTf).forEach(function (k) {
|
||||
if (k === "auto") return;
|
||||
if (keys.indexOf(k) < 0) keys.push(k);
|
||||
});
|
||||
}
|
||||
var cells = keys
|
||||
.map(function (tf) {
|
||||
var file = byTf[tf];
|
||||
if (!file) {
|
||||
if (order.indexOf(tf) < 0) return "";
|
||||
if (hasAuto || order.indexOf(tf) < 0) return "";
|
||||
return (
|
||||
'<div class="or-detail-img-cell">' +
|
||||
'<span class="or-detail-img-label">' +
|
||||
@@ -657,7 +762,7 @@
|
||||
);
|
||||
}
|
||||
var src = optionsJournalImgSrc(file);
|
||||
var label = escapeHtml(tf === "_" ? "截图" : tf);
|
||||
var label = escapeHtml(chartTfLabel(tf));
|
||||
return (
|
||||
'<div class="or-detail-img-cell">' +
|
||||
'<span class="or-detail-img-label">' +
|
||||
@@ -698,7 +803,7 @@
|
||||
});
|
||||
}
|
||||
|
||||
function renderDetail(t) {
|
||||
function renderDetail(t, opts) {
|
||||
var e = t.entry || {};
|
||||
reviewedCache[t.id] = t;
|
||||
($("or-detail-title") || {}).textContent =
|
||||
@@ -782,7 +887,7 @@
|
||||
|
||||
var imagesHost = $("or-detail-images");
|
||||
if (imagesHost) {
|
||||
renderDetailImages(e.images || []);
|
||||
renderDetailImages(e.images || [], opts || {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -992,6 +1097,8 @@
|
||||
($("or-f-note") || {}).value = "";
|
||||
setMoodTags("");
|
||||
resetUploadSlots();
|
||||
resetChartOptions();
|
||||
setChartOptionsVisible(false);
|
||||
var summary = $("or-journal-summary");
|
||||
if (summary) {
|
||||
summary.textContent = "截图槽位与合约复盘相同(5m / 15m / 1h / 4h).";
|
||||
@@ -1053,6 +1160,8 @@
|
||||
setSelectValue($("or-f-entry"), e.entry_logic || "");
|
||||
($("or-f-note") || {}).value = e.note || "";
|
||||
setMoodTags(e.mistake_tags);
|
||||
resetChartOptions();
|
||||
setChartOptionsVisible(t.source_type === "option_spot");
|
||||
|
||||
var summary = $("or-journal-summary");
|
||||
if (summary) {
|
||||
@@ -1068,6 +1177,8 @@
|
||||
}
|
||||
|
||||
(e.images || []).forEach(function (img) {
|
||||
var tf = String((img && img.tf) || "").trim();
|
||||
if (tf === "auto") return;
|
||||
var hidden = document.querySelector(
|
||||
'#or-upload-slots .or-upload-hidden[data-tf="' + img.tf + '"]'
|
||||
);
|
||||
@@ -1167,6 +1278,15 @@
|
||||
note: ($("or-f-note") || {}).value || "",
|
||||
images: collectImages(),
|
||||
};
|
||||
var chartBox = $("or-chart-options");
|
||||
var chartVisible = chartBox && !chartBox.classList.contains("hidden");
|
||||
if (chartVisible && ($("or-exchange-chart") || {}).checked) {
|
||||
payload.journal_exchange_chart = true;
|
||||
payload.journal_chart_tf1 = ($("or-chart-tf1") || {}).value || "";
|
||||
payload.journal_chart_tf2 = ($("or-chart-tf2") || {}).value || "";
|
||||
payload.journal_chart_limit = ($("or-chart-limit") || {}).value || "";
|
||||
payload.journal_chart_anchor = ($("or-chart-anchor") || {}).value || "close";
|
||||
}
|
||||
($("or-save-status") || {}).textContent = "保存中…";
|
||||
fetch("/api/options/review/entry", {
|
||||
method: "POST",
|
||||
@@ -1182,10 +1302,12 @@
|
||||
($("or-save-status") || {}).textContent = data.msg || "保存失败";
|
||||
return;
|
||||
}
|
||||
($("or-save-status") || {}).textContent = "已保存";
|
||||
($("or-save-status") || {}).textContent = data.chart_queued
|
||||
? "已保存,K线图后台生成中"
|
||||
: "已保存";
|
||||
hideJournalForm();
|
||||
reloadAll();
|
||||
openDetail(tradeId);
|
||||
openDetail(tradeId, { waitAutoChart: !!data.chart_queued });
|
||||
})
|
||||
.catch(function () {
|
||||
($("or-save-status") || {}).textContent = "保存失败";
|
||||
|
||||
Reference in New Issue
Block a user