/* 完整设计稿新增的页面与弹层:首页、页内标签页(风险监控)、清算、TRS 交易下单页与下单弹窗、票据详情抽屉、 * 确认框、修改密码弹窗、个人中心、404/401、登录页、组件总览、反馈类总览。登记到 UI.pageRenderers / overlayRenderers / canvasRenderers。 */ (function () { "use strict"; const U = window.UI; const { D, D2: P, T, esc, ic, CHECK, EMPTY, tag, ENDS, kv, tableHTML, btn, item, dgWrap, dgCard, sfDialog, stepper, closeX, btnCancel, drCard } = U; /* ================= 首页(工作台) ================= */ U.pageRenderers.__home = function (st) { const e = ENDS[st.end]; const H = P.home[st.end]; const total = H.status.reduce((n, s) => n + s[1], 0); const hot = H.status.filter((s) => s[2]).reduce((n, s) => n + s[1], 0); const tiles = H.status.map(([n, c, h]) => `
${n}${c}
`).join(""); const statusCard = `
上午好,admin今日${H.noun}共 ${total} 笔,其中 ${hot} 笔需要处理(高亮的状态)查看全部${ic("right")}
${tiles}
`; const sc = H.shortcuts.map(([g, l, icn]) => `
${ic(icn)}${esc(l)}${esc(g)}
`).join(""); const scCard = `
快捷入口取自本系统菜单
${sc}
`; const rows = e.rows.filter(H.pick).slice(0, 6); const cols = H.manualCols.map((c) => [c[0], c[1], c[4] === "r" ? "r" : ""]).concat([["操作", 72]]); const cell = (r, i) => { const def = H.manualCols[i]; if (!def) return `详情`; const key = def[2]; const v = key === "stock" && st.end === "trs" ? `${r.code} ${r.sname}` : r[key]; const kind = def[3] || ""; if (kind.startsWith("tag:")) return v ? tag(kind.slice(4), v) : "--"; return v; }; const tblCard = `
${H.manualTitle}${H.manualSub};按下单时间倒序,最多 6 条查看全部${ic("right")}
${tableHTML(cols, rows, { cell, keep: "hm-tbl", empty: "没有需要处理的" + H.noun })}
`; return `
${statusCard}${scCard}${tblCard}
`; }; /* ================= 页内标签页 ================= */ // 页面级(ptabs)或卡片内(tabs)的页签条;选中项记在 st.tab[g] const ptabs = (st, g, tabs, cls = "ptabs") => { const cur = st.tab[g] || tabs[0][0]; return `
${tabs.map(([k, l]) => `${l}`).join("")}
`; }; const searchCard = (fields, actions, withLabel) => { const lw = withLabel ? Math.max(...fields.map((f) => f.label.length)) * 14 : 0; const rem = 3 - (fields.length % 3); const acts = `
${actions.map(([t, type, icn]) => `${ic(icn)}${t}`).join("")}
`; return `
${fields.map((f) => `
${withLabel ? `` : ""}${U.ctlHTML(f)}
`).join("")}${acts}
`; }; // 风险监控:页面级页签,三个页签各是一套搜索 + 表格 U.pageRenderers["风控管理/共赢票据风险监控"] = function (st) { const R = P.risk; const cur = st.tab.risk || "monitor"; let body; if (cur === "monitor") { const cell = (r, i) => { if (i === 0) { const danger = r[2] === "危险" || r[2] === "强平"; return `详情${danger ? `强平卖出` : ""}`; } const v = r[i - 1]; if (i === 2) return [v, "note_status"]; if (i === 3) return [v, "note_risk_status"]; if (i === 11) return v.startsWith("+") ? [v, "up"] : v.startsWith("-") ? [v, "dn"] : v; return v; }; body = `${searchCard(R.search, R.actions, false)}
${tableHTML(R.cols, R.rows, { cell, keep: "risk-tbl" })}${U.pagerHTML(R.rows.length)}
`; } else if (cur === "status-log") { const cell = (r, i) => (i === 4 || i === 5 ? [r[i], "note_risk_status"] : r[i]); body = `${searchCard(R.search.slice(2, 8), R.actions.slice(0, 2), false)}
${tableHTML(R.statusLogCols, R.statusLog, { cell, keep: "risk-log" })}${U.pagerHTML(R.statusLog.length)}
`; } else { const cell = (r, i) => (i === 4 ? [r[i], "send_status"] : r[i]); body = `${searchCard(R.search.slice(2, 5), R.actions.slice(0, 2), false)}
${tableHTML(R.notifyCols, R.notify, { cell, keep: "risk-ntf" })}${U.pagerHTML(R.notify.length)}
`; } return `
${ptabs(st, "risk", R.tabs)}${body}
`; }; // 销售端同名菜单复用 U.pageRenderers["风控管理/共赢票据风险监控"].sales = true; // 清算管理:页签在卡片标题栏里 U.pageRenderers["清算管理/共赢票据清算"] = function (st) { const C = P.clearing; const cur = st.tab.clr || "clearing"; const running = C.batchStatus === "执行中"; const tools = cur === "clearing" ? `${btn(ic("refresh") + "刷新")}${btn("一键清算", running ? "pri is-dis" : "pri")}${btn("重新清算", "", "ovopen", 'data-o="confirm" data-kind="redo"')}` : `${btn(ic("refresh") + "刷新")}${running ? btn(ic("stop") + "停止当前任务", "dng", "ovopen", 'data-o="confirm" data-kind="stop"') : ""}`; const info = `
市场${C.market}本次清算交易日${C.tradeDate}批次${C.batchNo}状态${tag("clearing_batch", C.batchStatus)}${running ? `执行中不能再次发起;页面每 5 秒自动刷新` : ""}
`; let body; if (cur === "clearing") { const cell = (r, i) => (i === 2 ? [r[i], "clearing_step"] : r[i]); const rowCls = (r) => (r[2] === "执行中" ? "is-sel" : ""); body = `${info}${C.blockedReason ? `
${ic("info")}${esc(C.blockedReason)}
` : ""}${tableHTML(C.stepCols, C.steps, { cell, rowCls, keep: "clr-steps", cls: "bd" })}${C.errorDetail ? `
${ic("error")}${esc(C.errorDetail)}
` : ""}`; } else { const cell = (r, i) => (i === 3 ? [r[i], "clearing_step"] : r[i]); const hcell = (r, i) => (i === 3 ? [r[i], "clearing_batch"] : r[i]); body = `${info}${tableHTML(C.logCols, C.logs, { cell, keep: "clr-logs", cls: "bd" })}
${C.historyTitle}${C.history.length} 条
${tableHTML(C.historyCols, C.history, { cell: hcell, keep: "clr-his", cls: "bd" })}`; } return `
${ptabs(st, "clr", C.tabs, "tabs")}${tools}
${body}
`; }; /* ================= TRS · 交易下单页 + 下单弹窗 ================= */ U.pageRenderers["系统设置/交易下单"] = function (st) { const H = D.trsTrade.host; const cur = st.tab.trs || "pos"; const acct = `
${H.account} · ${H.user}${ic("down")}
${btn(ic("refresh") + "刷新")}${btn("买入", "pri", "ovopen", 'data-o="trs" data-dir="买入"')}${btn("卖出", "", "ovopen", 'data-o="trs" data-dir="卖出"')}
${kv(H.accountCols.map((c, i) => [c, H.accountRows[0][i], "num"]), "bd3", 3)}
`; const tabs = [["pos", `持仓${H.posRows.length}`], ["ord", `当日委托${H.orderRows.length}`]]; const tbl = cur === "pos" ? tableHTML(H.posCols, H.posRows, { cell: (r, i) => (i === 2 ? [r[i], "trade_channel"] : i === 10 || i === 11 ? [r[i], r[i].startsWith("+") ? "up" : "dn"] : r[i]), keep: "trs-pos" }) : tableHTML([["操作", 72]].concat(H.orderCols), H.orderRows, { cell: (r, i) => (i === 0 ? (["已报", "部成"].includes(r[10]) ? `撤单` : "--") : i === 4 ? [r[i - 1], "trade_channel"] : i === 6 ? [r[i - 1], "direction"] : i === 11 ? [r[i - 1], "trs_order_status"] : r[i - 1]), keep: "trs-ord" }); return `
${acct}
${ptabs(st, "trs", tabs, "tabs")}${btn(ic("refresh") + "刷新", "txt")}
${tbl}
`; }; U.overlayRenderers.trs = function (ov) { const G = D.trsTrade.dialog; const H = D.trsTrade.host; const buy = ov.dir === "买入"; const seg = (k, opts) => `
${opts.map((o) => `${o}`).join("")}
`; const chips = `
${G.quick.map(([l, v]) => `${l}${v}`).join("")}
`; const QTY = buy ? { "1/4": "25,200", "1/3": "33,600", "1/2": "50,400", "全部可买": "100,900" } : { "1/4": "3,000", "1/3": "4,000", "1/2": "6,000", "全部可卖": "12,000" }; const qtyChips = `
${Object.entries(QTY).map(([l, v]) => `${l}`).join("")}
`; const amount = parseFloat(ov.price) * parseFloat(ov.qty.replace(/,/g, "")); const fmt = (n) => n.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }); const tiles = buy ? G.strip : [G.strip[0], ["可卖股数", H.posRows[0][4], "股"]]; const rows = [ { label: "交易渠道", req: true, body: seg("channel", G.channels) }, { label: "股票代码", req: true, body: `
${G.stock.code}${G.stock.name}${G.stock.mkt}${ic("down")}
` }, { label: "委托价格", req: true, body: stepper(ov.price, G.priceCcy), extra: chips }, { label: "委托数量", req: true, body: stepper(ov.qty, "股"), extra: qtyChips + `
${buy ? G.qtyHelp : "卖出不超过可卖股数"}
` }, ]; const results = [[`${ov.dir}金额(交易币种)`, fmt(amount), "CNY"], [`${ov.dir}金额(结算币种)`, fmt(amount * 1.0944), "HKD"]]; const Q = G.quote; const prev = parseFloat(Q.prev); const maxVol = Math.max(...[...Q.asks, ...Q.bids].map((r) => r[2])); const lvl = (rowsQ, cls) => rowsQ.map(([l, pr, v]) => `
${l}${pr}${v}
`).join(""); const aside = ``; const okBtn = `确认${ov.dir} ${ov.qty} 股`; return sfDialog({ w: 880, lw: 72, cls: "dg-trs", keep: "trs-dg", title: ov.dir, sub: `${G.account} · ${G.user}`, tiles, rows, results, aside, ft: `${ic("info")}${G.footHint}${btnCancel}${okBtn}` }); }; /* ================= 票据详情抽屉(页签 + 描述表) ================= */ U.overlayRenderers.note = function (ov) { const N = P.noteDetail; const tags = `${N.tags.map(([v, dk]) => tag(dk, v)).join("")}`; const rf = `${ic("refresh", "rf")}刷新数据`; const x = `${ic("x")}`; const hb = N.buttons.map(([t, ty]) => btn(t, ty, "ovtoast", 'data-msg="示例:各操作弹窗按弹窗 J 的卡片分区实现"')).join(""); const tabs = `
${N.tabs.map(([k, l]) => `${l}`).join("")}
`; const subHd = (t, extra = "") => `
${t}${extra}
`; let body; if (ov.tab === "main") { const sub = N.subA; const H = N.hedge; const posCell = (r, i) => (i === 0 ? (r[0] === "合计" ? `合计` : [r[0], "hedge_system"]) : r[i]); const trCell = (r, i) => (i === 0 ? [r[i], "hedge_system"] : i === 6 ? `${r[i][0]}` : i === 7 ? [r[i], "direction"] : r[i]); const dlyCols = [["操作", 100]].concat(H.tradeCols); const dlyCell = (r, i) => { if (i === 0) return r[0].length ? `${r[0].map(([t, ty]) => `${t}`).join("")}` : "--"; return trCell(r.slice(1), i - 1); }; const dailyBtns = H.dailyButtons.map(([t, ty]) => btn(t === "刷新" ? ic("refresh") + t : t, ty === "txt" ? "txt" : "sm", t === "补录" ? "ovopen" : "ovtoast", t === "补录" ? 'data-o="fill"' : 'data-msg="示例:日常买卖的下单弹窗按「TRS 下单弹窗」的专用布局实现"')).join(""); body = drCard(N.master.title, "", kv(N.master.fields, "bd3", 3)) + drCard(sub.title, "", kv(sub.fields, "bd3", 3) + subHd(sub.init.title) + kv(sub.init.fields, "bd2", 2) + subHd(sub.current.title) + kv(sub.current.fields, "bd2", 2)) + drCard(H.title, `${H.ratioLabel}${H.ratio}`, subHd(H.posTitle) + tableHTML(H.posCols, H.posRows, { cell: posCell, keep: "nt-pos" }) + subHd(H.tradeTitle) + tableHTML(H.tradeCols, H.tradeRows, { cell: trCell, keep: "nt-tr" }) + subHd(H.dailyTitle, dailyBtns) + tableHTML(dlyCols, H.dailyRows, { cell: dlyCell, keep: "nt-dly" })); } else { body = N.changes.sections.map((s) => drCard(s.title, `${s.rows.length} 条`, tableHTML(s.cols, s.rows, { empty: s.empty, emptyH: 120, keep: "nt-" + s.title }))).join(""); } return `
${N.noteNo}${tags}
${N.facts.map(([l, v]) => `${l}${v}`).join("")}
${rf}${x}
${hb}
${tabs}
${body}
`; }; /* ================= 确认框、修改密码弹窗 ================= */ const CONFIRMS = Object.assign({}, P.feedback.confirms, { force: { title: "强平卖出", msg: "确定对该票据执行强平卖出吗?卖出后票据状态变为「已卖出」,不能恢复。", kind: "danger", ok: "确定强平", kv: [["票据编号", "NT001202608141A"], ["投资者", "陈思雨 · 安衡证券"], ["证券", "601318 中国平安 · 28,700 股"]] }, redo: { title: "重新清算", msg: "将回拨到该批次的交易日并重新执行全部步骤,期间不能下单。确定重新清算吗?", kind: "warning", ok: "重新清算", kv: [["交易日", "2026-09-25"], ["批次", "CLR20260925001"]] }, stop: { title: "停止当前任务", msg: "停止后本批次标记为「已停止」,已完成的步骤不会回滚。确定停止吗?", kind: "danger", ok: "停止", kv: [["批次", "CLR20260925001"], ["当前步骤", "4 · 交易交收处理"]] }, }); U.overlayRenderers.confirm = function (ov) { const c = CONFIRMS[ov.kind] || CONFIRMS.cancel; const icn = c.kind === "danger" ? "error" : c.kind === "warning" ? "warn" : "info"; const okCls = c.kind === "danger" ? "dng-pri" : "pri"; return `
${ic(icn)}${esc(c.title)}

${esc(c.msg)}

${c.kv.length ? `
${c.kv.map(([l, v]) => `
${l}
${esc(v)}
`).join("")}
` : ""}
${c.cancel || "取消"}${c.ok}
`; }; U.overlayRenderers.pwd = function () { const rows = P.profile.pwdForm.map((f, i) => ({ label: f.label, req: f.req, body: U.ctl({ ...f, ph: i === 1 ? "请输入新密码" : f.ph }, {}), extra: i === 1 ? `
6~20 位,至少两类字符
` : "" })); return sfDialog({ w: 480, lw: 72, title: "修改密码", sub: `${P.profile.username} · ${P.profile.role}`, rows, ft: `${ic("info")}修改后需要重新登录${btnCancel}确定` }); }; /* ================= 个人中心 ================= */ U.pageRenderers["个人中心"] = function () { const p = P.profile; const left = `
A${ic("camera")}
${p.nickname}${ic("edit")}
${p.role}
`; const bind = (v, what) => (v ? `${v}` : `未绑定绑定`); const info = `
账号信息
用户名
${p.username}${ic("male", "gender")}
手机号码
${bind(p.mobile, "手机")}
邮箱
${bind(p.email, "邮箱")}
部门
${p.dept}示例
创建时间
${p.createTime}
`; const sec = `
安全设置
${p.security.map(([t, d, a], i) => `
${t}${d}
${a}
`).join("")}
`; return `
${left}
${info}${sec}
`; }; /* ================= 404 / 401 ================= */ function errHTML(code, st) { const is404 = code === "404"; const art = `${code}`; const home = ENDS[st.end].home; return `
${art}
${is404 ? "页面不存在" : "没有访问权限"}

${is404 ? "请确认输入的网址是否正确,或从左侧菜单重新进入。" : "当前账号没有「共赢票据清算」的访问权限,请联系系统管理员开通后再试。"}

${btn("返回首页", "pri", "leaf", 'data-k="首页"')}${btn("返回上一页", "", "leaf", `data-k="${home}"`)}
`; } U.pageRenderers["404"] = (st) => errHTML("404", st); U.pageRenderers["401"] = (st) => errHTML("401", st); /* ================= 登录页:分项选型登录页 C「右侧浮卡·全幅底图」(2026-10-07 选定) ================= * 整页是视觉 F 的渐变底色叠一层淡线条装饰;左侧一列:系统名、本系统业务模块、三端入口;右侧 440px 浮卡放表单。 * 画布规格 sp 上记临时状态:cap(验证码种子)、showPw、remember。 */ const CAPCH = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // 验证码图片示意:按种子生成 4 个字符和两条干扰线,点一下换一张 function capSVG(seed, w = 120, h = 40) { let s = (seed * 7919 + 104729) % 233280; const rnd = () => (s = (s * 9301 + 49297) % 233280) / 233280; const chars = Array.from({ length: 4 }, () => CAPCH[Math.floor(rnd() * CAPCH.length)]); const fs = Math.round(h * 0.58); const txt = chars.map((ch, i) => { const x = Math.round(w * (0.13 + i * 0.22)), y = Math.round(h * 0.7), r = Math.round((rnd() - 0.5) * 28); return `${ch}`; }).join(""); const wave = (c) => ``; return `${wave("--c-primary-border")}${wave("--bd-ctl")}${txt}`; } // 底图:淡网格、几条主色曲线、右上角两个圆(内联 SVG,不用图片文件) const LG_DECO = ` `; U.canvasRenderers.login = function (sp) { const end = sp.end || "issue"; const e = ENDS[end]; const L = P.login; const c = L.copy; const v = sp.v || "login"; const groups = D.menus[end].map((g) => g[0]).filter((n) => !L.opsGroups.includes(n)); const mods = `
本系统业务模块${groups.length}
${groups.map((n) => `${esc(n)}`).join("")}
`; // 三端入口:当前系统标「当前」,另外两个点一下跳到对应系统的登录页(本稿里是切到那个系统) const ents = `
三端系统点击前往对应系统的登录页
${Object.entries(ENDS).map(([x, ex]) => `
${esc(ex.sys)}${L.nodes[x][1]}${x === end ? "当前系统" : `前往登录${ic("right")}`}
`).join("")}
`; const left = `
${esc(e.sys)}
${L.version}
${mods}${ents}
`; const field = (label, inner) => `
${inner}
`; const pw = sp.showPw ? "123456" : "••••••"; let form; if (v === "login") { form = `
登录
${field(c.username, `
admin
`)} ${field(c.password, `
${pw}${ic(sp.showPw ? "eye" : "eyeoff")}
`)} ${field(c.captcha, `
${c.captcha}
${capSVG((sp.cap || 0) + 3)}
`)}
${CHECK}${c.remember}${c.forget}
${c.login}`; } else { form = `
${c.reset}

输入账号绑定的邮箱,重置链接会发到这个邮箱。

${field(c.email, `
${c.enterEmail}
`)} ${c.sendReset}
${c.think}${c.back}
`; } return `
${LG_DECO}
${ic(T.dark ? "sun" : "moon")}${ic("globe")}
${left}
${esc(e.sys)}
${form}
`; }; U.extraActions.cap = (host, sp) => { sp.cap = (sp.cap || 0) + 1; return true; }; U.extraActions.eye = (host, sp) => { sp.showPw = !sp.showPw; return true; }; U.extraActions.rem = (host, sp) => { sp.remember = sp.remember === false; return true; }; U.extraActions.lv = (host, sp, el) => { sp.v = el.dataset.v; return true; }; /* ================= 组件总览 ================= */ U.canvasRenderers.kit = function () { const Tk = T.tokens; const dict = U.dict; const sw = (label, key) => { const val = Tk[key]; const none = val === "transparent"; return `
${label}${none ? "无" : esc(val)}
`; }; const group = (items) => `
${items.map(([l, key]) => sw(l, key)).join("")}
`; const colors = `
颜色主色 ${Tk["c-primary"]} 只做填充,文字链接 ${Tk["c-link"]};买入红、卖出绿语义不变
${T.palette.map(([, items]) => group(items)).join("")}
`; const ty = (spec, html) => `
${spec}
${html}
`; const type = `
文字中文系统字体,英文和数字 Inter
${ty("20 / 28 · 编号标题", `ORD001202609250031`)} ${ty("16 / 24 · 弹窗标题", `撤销订单`)} ${ty("15 / 22 · 区块标题", `订单信息`)} ${ty("14 / 22 · 正文", `订单已进入对冲流程,预计交收日 2026-09-29。`)} ${ty("14 / 22 · 次要", `投资者名称、机构名称等次要信息`)} ${ty("12 / 18 · 辅助", `表头、键名、输入框下方的提示`)} ${ty("数字", `3,000,000.00 1,688.00 0.0003 2026-09-25 09:31:07`)}
`; const buttons = `
按钮${T.notes.buttons}
常规${ic("search")}查找${ic("refresh")}重置${ic("download")}数据导出撤单禁用
悬停${ic("plus")}新增${ic("refresh")}重置${ic("refresh")}查找中
表格内详情编辑撤单确认补录
方向确认买入 1,000 股确认卖出 500 股取消
`; const f = (label, html, extra = "") => `
${label}
${html}${extra}
`; const forms = `
输入控件默认 32px;登录页 40px
${f("默认", `
主订单编号
`)} ${f("已填写", `
ORD001202609250031
`)} ${f("聚焦", `
贵州茅台
`)} ${f("下拉选择", `
待处理${ic("down")}
`, `
全部
待处理${ic("check")}
执行中
已完成
`)} ${f("日期区间", `
${ic("calendar")}2026-09-25~2026-09-25
`, `
带单位
1,000股
多选
待生效存续期${ic("down")}
`)} ${f("校验失败", `
请输入委托数量
`, `
${ic("error")}委托数量必须是 100 的整数倍
禁用
CNY
两段切换
自定义TRS
`)} ${f("勾选与开关", `
${CHECK}已勾选${CHECK}未勾选部分
限价市价开启关闭
`)}
`; const tags = (dk, list) => (list || Object.keys(dict[dk])).map((t) => tag(dk, t)).join(""); const status = `
状态与字典${T.notes.status}
订单状态${tags("note_order_status")}
委托状态${tags("trs_order_status", ["已报", "部成", "已成", "已撤", "废单", "过期"])}
票据${tags("note_status")}${tags("note_risk_status")}
方向${tags("direction")}文字形式:买入卖出盈亏:+58,002.47-31,886.40
操作类型${tags("op_type")}${tags("process_mode")}${tags("hedge_progress")}
`; const kvs = `
描述表${T.notes.kv}
主订单编号
ORD001202609250031
订单状态
${tag("note_order_status", "待处理")}
订单方向
${tag("direction", "买入")}
投资者
张明远 · INV001100151
证券
600519 贵州茅台
名义本金
3,000,000.00 CNY
下单时间
2026-09-25 09:31:07
备注
--
数字卡片(汇总)
对冲比例
77.78%
累计成交数量
6,300
对冲含费成交均价
245.2112CNY
`; const rows = D.issueRows.filter((r) => r.sub === 0).slice(0, 5); const table = `
全部12待处理1执行中3已完成5
${ic("refresh")}刷新
${rows.map((r, i) => ``).join("")}
主订单编号订单方向订单状态投资者名称证券代码/名称订单名义本金(交易币种)下单时间操作
${CHECK}${r.no}${tag("direction", r.direction)}${tag("note_order_status", r.status)}${r.invName}${r.stock}${r.notional === "--" ? '--' : r.notional}${r.orderTime}详情撤单
${U.pagerHTML(12)}
第 2 行为选中态,第 4 行为悬停态;卡片内页签见「清算管理」。
`; const feedback = `
提示与反馈完整排布见「反馈类总览」
${ic("info")}自开始日期(含)起同步交易日,重复同步不会产生重复数据。
${ic("error")}撤单结果未知:上轮撤单未取得明确结果,可人工再次撤单。
${ic("success", "ok")}保存成功${ic("error", "no")}导出失败,请稍后重试点击复制编号
`; const dialog = `
弹窗与弹层${T.notes.dialog}
撤销订单${ic("x")}
${ic("warn")}撤销后订单进入「撤单中」,不能恢复。
主订单编号
ORD001202609250031
证券
600519 贵州茅台
取消确认撤销
`; return `

组件总览 · ${T.title}

主色 ${Tk["c-primary"]}|正文 14px · 控件 32px · 表格行高 40px · 圆角 ${Tk["r-ctl"]}/${Tk["r-card"]}|尺寸和圆角四套皮肤相同,换肤只改颜色与质感
${colors}${type}${buttons}${forms}${status}${table}${kvs}${feedback}${dialog}
`; }; /* ================= 反馈类总览 ================= */ U.canvasRenderers.feedback = function () { const F = P.feedback; const card = (title, sub, body, cls = "") => `
${title}${sub ? `${sub}` : ""}
${body}
`; const icOf = (t) => ic(t === "success" ? "success" : t === "error" || t === "danger" ? "error" : t === "warning" ? "warn" : "info", t); const msgs = `
${F.messages.map(([t, m, close]) => `
${icOf(t)}${esc(m)}${close ? `${ic("x")}` : ""}
`).join("")}
顶部居中,距顶 72px;多条时向下堆叠;默认 3 秒消失,带关闭按钮的停留 8 秒。
`; const ntf = `
${ic("success", "ok")}${F.notification.title}${F.notification.time}${ic("x")}

${F.notification.body}

${F.notification.link}${ic("right")}
右上角,距顶 16px、距右 16px;用于后台任务完成这类不打断操作的消息。
`; const alerts = `
${F.alerts.map(([t, m]) => `
${icOf(t)}${esc(m)}
`).join("")}
${icOf("warning")}
${F.alertTitled[1]}

${F.alertTitled[2]}

${ic("x")}
`; const cfm = U.overlayRenderers.confirm({ kind: "cancel" }); const confirm = `
${cfm}
在页面里的样子见「确认框」;危险操作红色实心按钮并写明动作。
`; const empties = `
${F.empties.map(([n, t, d, a]) => `
${n}
${EMPTY}${esc(t)}${d ? `${esc(d)}` : ""}${a ? `${esc(a)}` : ""}
`).join("")}
`; const rows = D.issueRows.filter((r) => r.sub === 0).slice(0, 4); const loadTbl = `
${rows.map((r) => ``).join("")}
主订单编号订单方向订单状态投资者名称订单名义本金
${r.no}${tag("direction", r.direction)}${tag("note_order_status", r.status)}${r.invName}${r.notional}
加载中
按钮
查找中导出中
首屏骨架
`; const results = `
${F.results.map(([t, ttl, d, bs]) => `
${icOf(t)}${ttl}

${d}

${bs.map(([b, ty]) => `${b}`).join("")}
`).join("")}
`; const validate = `
wanqing.li@
${ic("error")}邮箱格式不正确
请输入HKD
${ic("error")}请输入发生金额(HKD)
错误在失焦时校验、提交时全部校验;长表单的弹窗底部汇总「还有几项必填未填、几项有误」,第一处错误滚动到可见。
`; return `

反馈类总览

全局提示、通知、提示条、确认框、空状态、加载态、结果提示、表单校验
${card("全局提示", "ElMessage", msgs, "s6")}${card("通知", "ElNotification", ntf, "s6")}${card("提示条", "el-alert:按状态取色;可带标题、可关闭", alerts, "s6")}${card("确认框", "ElMessageBox.confirm", confirm, "s6")}${card("空状态", "el-empty:说明原因,必要时给一个动作", empties)}${card("加载态", "v-loading、按钮 loading、骨架", loadTbl, "s6")}${card("结果提示", "el-result:整块居中", results, "s6")}${card("表单校验", "输入框变红 + 下方原因", validate)}
`; }; })();