修改页面布局样式

This commit is contained in:
zlt 2026-08-12 15:31:10 +08:00
parent 823b24cccb
commit df0f1dbec5
2 changed files with 56 additions and 6 deletions

View File

@ -209,6 +209,41 @@ def _scan_open(view, params, stock_params, skip, mkt, out) -> list:
return res["candidates"] return res["candidates"]
def _plain_check(c) -> str:
"""规则闸的 failed 串形如 "T1_UNAVAILABLE: 卖出…" —— 去掉给运维看的大写代码前缀, 只留中文说明。"""
s = str(c)
head, sep, tail = s.partition(":")
if sep and head.strip() and all(ch.isupper() or ch.isdigit() or ch == "_" for ch in head.strip()):
return tail.strip()
return s.strip()
def _today_open_reject_reasons(now):
"""今天各票**新建仓**被驳回的实因, 供候选处置显示真正的「为什么」:
= 决策系统给的原话 (评审账本 arbiter=judge 那行的 reason);
合规 = 规则闸具体未过的检查 (failed_checks, 去掉大写代码前缀)
只读评审账本按票取当天最新一条 (list_ledger id 倒序); 读不到就返回空, 调用方退回概述"""
judge, rule = {}, {}
today = now.strftime("%Y-%m-%d")
try:
for r in pms_repo.list_ledger(limit=500):
if r.get("verdict") != "REJECT" or r.get("action") != ae.A_OPEN:
continue
if str(r.get("decided_at"))[:10] != today:
continue
code = r.get("ts_code")
if not code:
continue
if r.get("arbiter") == "judge" and code not in judge:
judge[code] = (r.get("reason") or "").strip()
elif r.get("arbiter") == "rule" and code not in rule:
fc = r.get("failed_checks") or []
rule[code] = "".join(_plain_check(x) for x in fc) if fc else (r.get("reason") or "").strip()
except Exception:
logger.exception("读当日新建仓驳回实因失败 (退回概述)")
return judge, rule
def disposition_snapshot(now=None) -> dict: def disposition_snapshot(now=None) -> dict:
"""候选池处置快照 (只读, 无副作用): 候选池里每只票今天为什么下单 / 没下单。 """候选池处置快照 (只读, 无副作用): 候选池里每只票今天为什么下单 / 没下单。
@ -239,14 +274,17 @@ def disposition_snapshot(now=None) -> dict:
view = portfolio.positions_view() view = portfolio.positions_view()
params = _scan_params(view) params = _scan_params(view)
stock_params = command_service.effective_stock_params() stock_params = command_service.effective_stock_params()
# 给交易员的白话原因: 用同一套去重键 (口径与实盘扫描一致), 但值不含内部闸门术语、 # 给交易员的白话原因: 用同一套去重键 (口径与实盘扫描一致), 但值不含内部闸门术语、也不指引
# 也不指引任何终端命令 —— 原来的 _*_keys() 串带「研判闸/规则闸/看 make t-gate」, 那是 # 任何终端命令。能取到实因就带上实因 (决策系统原话 / 合规具体未过项), 取不到才退回概述。
# 给日志与运维看的, 不该出现在交易员页面。落库顺序同实盘 (在途最后, 覆盖被拒)。 # 落库顺序同实盘 (在途最后, 覆盖被拒)。
_jr, _rr = _today_open_reject_reasons(now)
skip = {} skip = {}
for _k in _judge_rejected_open_keys(): for _k in _judge_rejected_open_keys():
skip[_k] = "决策系统今天判过暂不建仓,明天开盘会重新评估" _w = _jr.get(_k[0])
skip[_k] = ("决策系统判暂不建仓:" + _w) if _w else "决策系统今天判过暂不建仓,明天开盘会重新评估"
for _k in _rejected_today_keys(): for _k in _rejected_today_keys():
skip[_k] = "今天没通过合规检查,明天开盘会重新评估" _w = _rr.get(_k[0])
skip[_k] = ("未通过合规检查:" + _w) if _w else "今天没通过合规检查,明天开盘会重新评估"
for _k in _inflight_keys(): # 在途; 前端多半已按指令/提议标成「已下单/待你确认」 for _k in _inflight_keys(): # 在途; 前端多半已按指令/提议标成「已下单/待你确认」
skip[_k] = "系统已经在处理这只票(见『等我拍板』或『今日在办』)" skip[_k] = "系统已经在处理这只票(见『等我拍板』或『今日在办』)"
sink = {"skipped": []} # 丢弃用: _scan_open 只往里 append/extend, 不读它 sink = {"skipped": []} # 丢弃用: _scan_open 只往里 append/extend, 不读它

View File

@ -305,6 +305,14 @@ pre.json{background:var(--surface-2);border:1px solid var(--hair);border-radius:
<el-table-column label="结束方式" min-width="150"><template #default="s"><span class="chip warn"><span class="dot"></span>{{ tx('insStatus', s.row.status) }}</span></template></el-table-column> <el-table-column label="结束方式" min-width="150"><template #default="s"><span class="chip warn"><span class="dot"></span>{{ tx('insStatus', s.row.status) }}</span></template></el-table-column>
</el-table> </el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane name="deny">
<template #label>今日否决 <span class="tabn">{{ denyToday.length }}</span></template>
<div class="sub2" style="margin:8px 2px 4px">今天考察过、但没建仓的票,连原因一起摆出来。</div>
<el-table :data="denyToday" size="small" max-height="320" empty-text="今天没有被否决的候选">
<el-table-column label="股票" width="180"><template #default="s"><b>{{ s.row.name }}</b> <span class="muted mono">{{ s.row.ts_code }}</span></template></el-table-column>
<el-table-column label="为什么没建仓" min-width="440"><template #default="s"><div class="why" style="margin:0">{{ s.row.why || '—' }}</div></template></el-table-column>
</el-table>
</el-tab-pane>
</el-tabs> </el-tabs>
<h3 style="margin-top:14px;cursor:pointer" @click="showLedger=!showLedger">今天发生了什么 · {{ ledger.length }} 条 <span class="muted" style="font-size:12px;font-weight:normal">{{ showLedger?'▲ 收起':'▼ 展开' }}</span></h3> <h3 style="margin-top:14px;cursor:pointer" @click="showLedger=!showLedger">今天发生了什么 · {{ ledger.length }} 条 <span class="muted" style="font-size:12px;font-weight:normal">{{ showLedger?'▲ 收起':'▼ 展开' }}</span></h3>
<template v-if="showLedger"> <template v-if="showLedger">
@ -1405,6 +1413,10 @@ createApp({
} }
return { cls: 'wait', label: '在盯', why: '' }; return { cls: 'wait', label: '在盯', why: '' };
} }
const denyToday = computed(() => (planRows.value || []).map(r => {
const d = dispOf(r.ts_code);
return d.cls === 'deny' ? { ts_code: r.ts_code, name: (r.name || nm(r.ts_code)), why: d.why } : null;
}).filter(Boolean));
const settingKeys = ['PMS_TOTAL_SCALE', 'PMS_PORTFOLIO_CAP', 'PMS_STOCK_CAP', const settingKeys = ['PMS_TOTAL_SCALE', 'PMS_PORTFOLIO_CAP', 'PMS_STOCK_CAP',
'PMS_MAX_NAMES', 'PMS_CASH_RESERVE', 'PMS_MAX_NAMES', 'PMS_CASH_RESERVE',
@ -1889,7 +1901,7 @@ createApp({
strategies, stratEnabled, opLog, stratDlg, stratQty, loadStrategies, loadOpLog, strategies, stratEnabled, opLog, stratDlg, stratQty, loadStrategies, loadOpLog,
openStrategy, validateStrategy, attachStrategy, setStrategyStatus, stratStateText, resumeBuy, openStrategy, validateStrategy, attachStrategy, setStrategyStatus, stratStateText, resumeBuy,
showLedger, onPosExpand, showLedger, onPosExpand,
openScan, insTab, todayYmd, insLive, insDone, insEnd, dispOf, loadOpenScan }; openScan, insTab, todayYmd, insLive, insDone, insEnd, dispOf, loadOpenScan, denyToday };
} }
}).use(ElementPlus).mount('#app'); }).use(ElementPlus).mount('#app');
</script> </script>