实例期权页增加中控条件单卡片,接单后显示状态与触发参数。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-04 18:39:47 +08:00
parent 8b584a0870
commit e11651d729
6 changed files with 164 additions and 12 deletions
+73
View File
@@ -5540,6 +5540,79 @@ html[data-theme="light"] .opt-source-badge--oo {
flex-wrap: wrap;
justify-content: flex-end;
}
.opt-cond-order-card {
margin-bottom: 12px;
padding: 12px 14px;
border-radius: 10px;
border: 1px solid rgba(56, 189, 248, 0.35);
background: rgba(14, 42, 68, 0.72);
}
.opt-cond-order-card[hidden] {
display: none !important;
}
.opt-cond-order-head {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 8px;
}
.opt-cond-order-head strong {
font-size: 0.9rem;
}
.opt-cond-lock-note {
margin-left: auto;
font-size: 0.72rem;
color: #9ec0ff;
}
.opt-cond-st {
display: inline-block;
padding: 2px 8px;
border-radius: 999px;
font-size: 0.72rem;
font-weight: 700;
}
.opt-cond-st.is-armed {
color: #7dd3fc;
background: rgba(56, 189, 248, 0.16);
}
.opt-cond-st.is-trig {
color: #fbbf24;
background: rgba(251, 191, 36, 0.16);
}
.opt-cond-st.is-open {
color: #6ee7b7;
background: rgba(52, 211, 153, 0.16);
}
.opt-cond-order-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 8px 12px;
}
.opt-cond-kv .k {
display: block;
font-size: 0.68rem;
color: #8ea0c0;
}
.opt-cond-kv .v {
font-weight: 600;
font-variant-numeric: tabular-nums;
}
.opt-cond-order-msg {
margin-top: 8px;
font-size: 0.72rem;
color: #c9d6f5;
}
html[data-theme="light"] .opt-cond-order-card {
border-color: rgba(14, 116, 144, 0.28);
background: rgba(224, 242, 254, 0.7);
}
html[data-theme="light"] .opt-cond-lock-note,
html[data-theme="light"] .opt-cond-kv .k,
html[data-theme="light"] .opt-cond-order-msg {
color: #35506e;
}
.opt-spot-sell-head {
display: flex;
align-items: center;
+76 -8
View File
@@ -2308,16 +2308,84 @@
head.hidden = false;
}
function escHtml(s) {
return String(s)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;");
}
function condStatusLabel(st) {
const map = { armed: "待命", triggering: "触发中", open: "持仓中" };
return map[st] || st || "已接收";
}
function condStatusClass(st) {
if (st === "open") return "is-open";
if (st === "triggering") return "is-trig";
return "is-armed";
}
function paintCondOrderLock(d) {
const el = document.getElementById("opt-cond-lock-banner");
if (!el) return;
if (d && d.cond_order_locked) {
const extra = d.cond_order_msg ? " · " + d.cond_order_msg : "";
el.textContent = "中控条件单占用中,禁止手动开仓" + extra;
el.style.display = "";
} else {
el.style.display = "none";
const card = document.getElementById("opt-cond-order-card");
if (!card) return;
const order = d && d.cond_order;
const locked = !!(d && d.cond_order_locked);
if (!order && !locked) {
card.hidden = true;
return;
}
const st = order ? String(order.status || "") : "";
const stEl = document.getElementById("opt-cond-order-st");
if (stEl) {
stEl.textContent = condStatusLabel(st);
stEl.className = "opt-cond-st " + condStatusClass(st);
}
const grid = document.getElementById("opt-cond-order-grid");
if (grid) {
if (!order) {
grid.innerHTML = "";
} else {
const put = String(order.opt_type || "").toUpperCase() !== "C";
const side = put ? "上穿 ≥" : "下穿 ≤";
const exitParts = [];
if (order.profit_exit_enabled) {
exitParts.push("翻倍×" + (order.profit_exit_mult != null ? order.profit_exit_mult : ""));
}
if (order.target_index != null && order.target_index !== "") {
exitParts.push("目标 " + order.target_index);
}
const items = [
["标的", (order.underlying || "") + " " + (put ? "Put" : "Call")],
["触发", side + " " + (order.trigger_px != null ? order.trigger_px : "—")],
["偏离", order.deviation_pct != null ? order.deviation_pct + "%" : "—"],
["最短到期", order.min_expiry_hours != null ? order.min_expiry_hours + "h" : "—"],
["出场", exitParts.join(" · ") || "—"],
["当前指数", order.last_index != null && order.last_index !== "" ? String(order.last_index) : "—"],
];
if (order.opened_inst_id) {
items.push(["已开合约", String(order.opened_inst_id)]);
}
grid.innerHTML = items
.map(function (it) {
return (
'<div class="opt-cond-kv"><span class="k">' +
escHtml(it[0]) +
'</span><span class="v">' +
escHtml(it[1]) +
"</span></div>"
);
})
.join("");
}
}
const msgEl = document.getElementById("opt-cond-order-msg");
if (msgEl) {
const msg = (order && order.message) || (d && d.cond_order_msg) || "";
msgEl.textContent = msg ? String(msg) : "";
}
card.hidden = false;
}
async function retrySpotSell() {