# PMS 前端「交易员视图」改造方案 v1.1 > 2026-08-10 起草,v1.1 并入用户四点反馈与「站在交易员角度」的重排。 > 落地方向(已拍板):六块全套 + 同一单页加「交易员/运维」开关、默认交易员,运维模式保留现控制台。 > 纪律:只做加法(不碰后端引擎与既有 API 行为)、可读性优先(完整中文句、不摆裸键/裸码/表名)、 > 按交易员任务组织而非按后端模块。 > > **v1.1 相对 v1 的四处变化**(详见文内标注): > 1. 配色定为 A 股习惯(红涨绿跌)。 > 2. 股票中文名取自 153 表 `gp_code_all`(`gp_code_two = ts_code` → `gp_name`)。 > 3. **命令重新归类**:多数命令是交易员动作(清仓某只/暂停买入/设止损/一键清仓),下沉到持仓行内与 > 「组合操作」块;只有调度类运维按钮(回放/对账/日终/exec-tick/扫描…)才进运维模式。 > 4. 翻译表全部改用**从代码核实**的真实枚举(DDL + cushion.py),措辞贴交易员语境,未登记的码显示原码并告警,不臆造。 --- ## 一、目标与判收 **最终检验**:交易员打开页面,不需记任何内部词汇,就看清四件事——手里有什么、系统想干什么以及为什么、 此刻要我拍板的是哪几条、今天发生与在办的是什么;并能安全完成交易员该做的动作(采纳/驳回提议、 对某只票清/减/设止损、暂停买入、一键清仓、撤在办委托、调高层旋钮)。运维机制原样保留但不挡在面前。 **输出级判收(五条,任一不满足即未判收)**:交易员视图的首屏与每块里—— 1. 不出现任何 `PMS_` 开头的裸参数键; 2. 不出现任何数据库表名(`pms_qmt_order`、`pms_action_ledger` 之类); 3. 不出现任何裸状态码(`WAIT_USER` / `EXECUTING` / `REJECT` / `full` 之类); 4. 每一条提议、每一条裁决、每一个动作按钮都带一句**完整中文说明**(提议/裁决给理由,按钮给「点了会怎样」); 5. 每个数字都有单位和中文标签。 平行判收:**运维模式里现控制台的每个按钮、每张表都还在,行为一字未变。** --- ## 二、现状定位(以代码为准) 前端是单页 `app/web/static/index.html`(Vue3 + ElementPlus,1088 行)+ `app/web/main.py`(FastAPI 托管, 所有接口走 `ok()` 包装、失败也回 HTTP 200 由顶部横幅提示)。它面向搭系统的人:参数区摆裸键 (`PMS_TOTAL_SCALE`)、分区标题印表名(「出口委托 (pms_qmt_order)」)、一排调度类运维按钮 (回放/对账/日终/materialize/exec-tick/scan-proposals/digest-signals/清 resync)、状态全是裸码、 按后端模块而非交易员任务组织。 **关键发现:翻译材料与动作命令基本都现成。** 命令目录 `command_spec.SPECS` 每条自带中文 `label` (`EXIT_STOCK`→清仓某股、`HALT_BUY`→全局暂停买入、`SET_STOP_PRICE`→设定某股止损价,还带 `danger`/`instant`/`disabled_reason`);参数中心 `param_store` 每键配了中文说明;提议表 `pms_proposal` 自带 `judge_verdict`/`judge_reason`;账本 `reason` 是现成文本。**缺的是把裸 token 换人话的一层薄映射 + 按任务重排 + 把交易员动作从运维堆里拎出来。** 因此本次是纯加法的呈现层,后端引擎与既有 API 不动。 --- ## 三、设计原则 1. **只做加法。** 后端引擎、状态机语义、既有 API 入参出参一律不改;交易员视图消费现有接口。 2. **可读性优先。** 裸键→中文标签+说明;裸码→中文短语;表名不上台面;理由用完整自然句。 3. **任务导向。** 按「交易员此刻要做什么」分块;命令按「作用在某只票 / 作用在整个组合」就近摆放, 而不是集中在一个「命令台」里让人查手册。 4. **分层可见。** 交易员默认视图 + 运维高级模式一个开关切换;危险动作(一键清仓/暂停/force 对账/清 resync) 加二次确认,弹窗写清后果。 5. **翻译单一事实源。** 所有 token→人话映射集中一处,全页共用,杜绝措辞打架。配色按 A 股习惯:**红涨绿跌**。 --- ## 四、总体形态 同一单页,顶部「交易员 / 运维」切换,默认交易员。两套视图共用同一批后端接口,差别只在呈现: - **交易员视图**:六块(下一节),只读接口 + 现有的少量写接口(采纳/驳回提议、下命令、撤在办委托、改参数), 全部经翻译层渲染、按任务就近摆放。 - **运维模式**:现控制台原样搬过来(**调度类**运维按钮、裸 `cmd_type` 命令台表单、通道明细、 出口委托/上行消息原始表、全量参数),危险动作加二次确认。 **后端改动至多两处只读加法**:① `GET /api/labels` 吐翻译字典(或字典写死前端);② 一个批量「代码→中文名」 只读查询(见 §5 名称映射)。不新增写接口、不改既有接口。部署仍 `make deploy` + `make test`。 --- ## 五、六块逐块设计(数据来源锚到真实字段) > 股票中文名映射(全块共用):PMS 用点式 `ts_code`(如 `688280.SH`)。**取名走 153 表 `gp_code_all`**, > 连接键 `gp_code_all.gp_code_two = ts_code` → 取 `gp_name`(简称,页面主显)与 `fullname`(全称,悬浮显示); > `gp_code_two` 缺时用 `gp_code`(`SH688280` 形)经 `command_spec.normalize_code` 归一兜底。落地=复用现有 > 153 连接(`downstream_repo` 已在读 `gp_` 表)加一个 `name_map(codes)` 批量只读、按日缓存。 > **注意**:该表 `industry` 列示例为 NULL,不拿它当行业源——行业仍走现有 `industry` 服务;这里只取名称。 ### 1. 今日一览 + 需要注意(顶部) - **给谁看**:一眼掌握账户全局,并把「今天有什么不对/降级」用人话摆出来。 - **数据来源**:`GET /api/overview`(`portfolio.overview()`)+ 提议条数 + `GET /api/dispatch-mode` / `/api/ws-channel`(通道)。 - **一览字段映射**: | 接口字段 | 显示 | |---|---| | `total_asset`、`cash_avail`(`cash_source=ws`) | 账户总资产、可用资金(标「实时」);`estimate` 时标「估算」并置灰 | | `portfolio_mv`、`portfolio_pct` | 持仓市值、仓位占比 | | `float_pnl`、`float_pnl_pct` | 当日浮动盈亏(**红涨绿跌**) | | `names_count`/`max_names` | 持仓 N 只 / 上限 M 只 | | 提议条数 | **等我拍板 N 条**(可点跳第 2 块) | | `autonomy` | 自主档位:全自动 / 只提议不下手 / 暂停 | - **需要注意条**(有才显示,各一句人话):`buy_halt`/`exec_halt`/`brake_until`→「已暂停买入 / 休假模式 / 组合刹车中(至 X 日)」;`price_missing`→「N 只取不到现价(停牌等),其盈亏与安全垫暂不可用」; 研判 `UNAVAILABLE` 占比高→「研判暂不可用,多只提议降级为需你确认」;通道 `conn_state≠ONLINE` 或 `resync_flag=1`→「行情/成交通道断开 / 待人工对账」。这些让交易员知道「系统今天为什么不太动」。 ### 2. 等我拍板(提议卡片,最高频,重心) - **数据来源**:`GET /api/proposals?status=WAIT_USER`(`pms_repo.list_proposals`,含解析好的 `hard_numbers`、 以及**提议自带的** `judge_verdict`/`judge_reason`)。 - **每张卡片**: | 来源字段 | 显示 | |---|---| | `ts_code` | 股票简称 + 代码(`gp_name`;悬浮全称 `fullname`) | | `action` | 中文动作(见翻译表:建新仓/加仓/补仓/换仓…) | | `judge_reason` | 研判意见原句(完整中文),如「站上关键位、量比放大,驱动仍成立」 | | `hard_numbers`(价/分/主题/档位/预期空间/热度/名次) | 一句人话理由 + 关键数字,如「候选榜第 3、强传导主题『算力』、预期空间 +42%、当前尚未过热」 | | `qty` × `hard_numbers.price` | 数量 / 参考价 / 约需金额 | | `expire_at` | 有效期(还剩 X 小时,过期自动作废) | - **动作**:「采纳」「驳回」→ `POST /api/proposals/{id}/decide`;旁注「采纳=记一笔待执行指令, 由择时在窗口内择机下单;驳回=今日不再提这只」。**采纳后端回的 `warning`(一次性守卫没锁上)原样弹出,不吞。** ### 3. 我的持仓(每行带行内快捷动作) - **数据来源**:`GET /api/positions`(`portfolio.positions_view()`);展开 `GET /api/positions/{code}/lots` + `GET /api/ledger?ts_code=`。 - **行字段映射**: | 来源字段 | 显示 | |---|---| | `ts_code` | 简称 + 代码 | | `price`/`price_ok` | 现价;`price_ok=false` 标「估价(停牌/无分钟线)」,该行盈亏与安全垫标不可用 | | `avg_cost`、`market_value`、`pct_of_scale` | 摊薄成本、市值、占规模比例 | | `price/avg_cost−1` | 浮动盈亏(**红涨绿跌**) | | `cushion_state`/`cushion_pct`/`cushion_peak` | 安全垫:浮亏无垫 / 薄垫 / 厚垫 + 当前垫幅 + 峰值 | | `neg_cushion_days` | 安全垫连续为负 N 日(清弱票判据提示) | | `status`、`frozen_reason` | 持仓状态(持有中/建仓中/清仓中…);冻结时标「已冻结(禁增持,卖出不受影响)」 | | `stop_ref`/目标价/`ref_source` | 止损价 / 目标价(用户设定标「手动」) | | 「下一步」 | 由 `cushion_state`+参数合成人话:「浮盈已过厚垫线,达标可加仓」「浮亏进入补仓评估档,深档需你确认」 | - **行内快捷动作**(**v1.1 新增**,就近摆放,下命令走现有 `POST /api/commands`):清仓某只(`EXIT_STOCK`)、 减至 X%(`REDUCE_STOCK`)、设止损价(`SET_STOP_PRICE`)、设目标价(`SET_TARGET_PRICE`)、 冻结/解冻(`FREEZE_STOCK`/`UNFREEZE_STOCK`)、拉黑(`BLACKLIST_ADD`)。每个按钮旁注后果;卖出类给轻确认。 - **展开区**:批次(底仓/回踩补足/盈利加仓/补仓/做T 各多少股,`lot_type` 见翻译表)+ 该股账本时间线(整句化)。 ### 4. 今日在办与动向(**v1.1 强化:先看在办,再看已发生**) - **在办(前瞻)**:`GET /api/instructions`(在途指令:要买/卖什么、限价、窗口、进度)+ `GET /api/ws-channel` 的出口委托(`pms_qmt_order`,枚举简化:排队/已报/部分成交/已成/已撤/过期/被拒)。每条可**撤** (`POST /api/instructions/{id}/cancel`)。让交易员看清「系统今天正打算做什么、我能不能拦」。 - **已发生(回溯)**:`GET /api/ledger` + 成交合并成人话时间线:「10:32 XX:研判驳回建新仓——证据不足」 「10:35 你采纳了 XX 的建仓提议」「14:46 XX 成交 1700 股 @34.71」。 ### 5. 组合操作 + 设置(**v1.1:把交易员级组合命令从运维里拎出来**) - **组合操作**(下命令走 `POST /api/commands`,危险项二次确认):暂停买入/恢复买入(`HALT_BUY`/`RESUME_BUY`)、 休假模式/恢复(`HALT_ALL`/`RESUME_ALL`)、**一键清仓(紧急)**(`LIQUIDATE_ALL`,`danger`,二次确认+输 YES)、 降仓/升仓(`REDUCE_EXPOSURE`/`INCREASE_EXPOSURE`)、清仓某行业/限行业上限(`SECTOR_EXIT`/`SECTOR_CAP`, 行业源未就绪时置灰并给 `disabled_reason`)。每个按钮旁用 `command_spec` 里现成的 `note` 说明后果。 - **设置**(`GET/POST /api/params`,标签用 `param_store` 现成中文说明):总操作规模、总仓上限、单股上限、 最大持仓只数、预留现金比例、自主档位(中文枚举下拉)。改「自主档位/总仓上限」这类会触发降仓提议的,改完给提示。 其余几十个参数留运维模式。`SECRET_KEYS`(签名种子)本就不入库不显示,保持不动。 ### 6. 运维模式(开关切过去,只留**调度/联调**这类) - **内容**:调度类运维按钮(回放 replay、对账 reconcile、日终 daily-settle、materialize、exec-tick、 sweep-windows、scan-proposals、digest-signals、premarket、build-report、rebuild-preflight/accept、 清 resync、plan-refresh、downstream-schema)、裸 `cmd_type` 命令台表单(`GET /api/commands/catalog` 已带中文 label,交易员平时用第 3/5 块的按钮,这里保留给联调)、通道明细(连接/seq 水位/出口队列/上行消息)、 出口委托与上行消息原始表、全量参数、行业映射导入。 - **加固(只加不改)**:`danger=true`、`HALT_*`、`reconcile?force=true`、`clear-resync` 一律二次确认。接口本身不动。 > 可选(v1 收尾或 v2):**候选/关注**——`GET /api/upstream/plan`(今日选股计划主榜/观察档)给交易员一个 > 「系统在盯哪些、为什么会冒出这些提议」的上下文。默认折叠,不占首屏。 --- ## 六、翻译层(从代码核实,未登记即显原码并告警) **动作 `action`**(DDL `pms_plan`/`pms_qmt_order.intent` + `cushion.py` + `PMS_BATCH_SPLIT` 语义核实) | 码 | 交易员看到的 | 依据 | |---|---|---| | OPEN | 建新仓 | 首次建仓 | | FILL | 回踩补足 | 建仓期按批把仓位补到目标(非「建满」) | | ADD | 盈利加仓 | 安全垫达厚垫(SOLID)才解锁 | | DCA | 浮亏补仓 | 跌到评估档补仓(深档需确认) | | TRIM | 保垫减仓 | 垫子回吐过半的止盈减仓 | | EXIT | 清仓 | | | T0 / T0_ROUND | 做T(日内) | 收盘应归零 | | SWITCH | 换仓 | 见 `PMS_JUDGE_ACTIONS`(研判侧动作),执行层少见,出现即按此显示 | | HALT | 停手(内部标记) | 方案层动作,一般不面向交易员 | **状态类(全部取自 DDL 列注释)** | 域 | 码 → 人话 | |---|---| | 提议 `pms_proposal.status` | WAIT_USER 等你确认 / ACCEPTED 已采纳 / DECLINED 已驳回 / EXPIRED 已过期 | | 指令 `pms_instruction.status` | PROPOSED 待校验 / RULE_PASSED 规则闸已过 / JUDGE_PASSED 研判已过 / DISPATCHED 已下发(挂单中) / CONFIRMED 已成交 / REJECTED 被拒 / EXPIRED 到期作废 / CANCELLED 已撤销 | | 委托 `pms_qmt_order.status` | QUEUED 排队 / SENDING·SENT 已报 / PARTIAL 部分成交 / FILLED 已成 / CANCELLED 已撤 / EXPIRED 过期 / REJECTED 被拒 / SEND_FAILED·ABORTED 未发出 | | 命令 `pms_command.status` | 任务:PENDING 待处理 / PLANNING 规划中 / EXECUTING 执行中 / PARTIAL 部分完成(顺延) / DONE 已完成 / CANCELLED 已撤销;参数:EFFECTIVE 生效中 / SUPERSEDED 已被覆盖 | | 方案 `pms_plan.status` | PENDING 待执行 / GATED 待解锁(动作引擎未放行) / EXECUTING 执行中 / DONE 已完成 / PARTIAL 部分完成 / CANCELLED 已撤销 | | 持仓 `pms_position.status` | PLANNED 计划建仓 / OPENING 建仓中 / HOLDING 持有中 / EXITING 清仓中 / CLOSED 已清仓 | | 冻结 `frozen_reason` | NONE 未冻结 / COMMAND_HALT 命令冻结(禁增持) / BRAKE 组合刹车冻结 / MANUAL 手动冻结 | | 安全垫 `cushion_state` | NONE 浮亏无垫 / THIN 薄垫 / SOLID 厚垫 | | 批次 `lot_type` | BASE 底仓 / FILL 回踩补足 / ADD 盈利加仓 / DCA 补仓 / T0 做T仓 / RECON 对账调整 | | 裁决 `arbiter`/`verdict` | rule 规则闸 / judge 研判闸 / user 你;PASS 放行 / REJECT 驳回 / NOTE 记录(信号留痕) / UNAVAILABLE 研判暂不可用 | | 现价来源 `cash_source`/参考位 `ref_source` | ws 实时(账户快照) / estimate 估算;bionic 决策系统 / self_calc 兜底自算 / user 你设定 | | 自主档位 `autonomy` | full 全自动 / propose_only 只提议不下手 / off 暂停 | | 通道 `conn_state`/`resync_flag` | ONLINE 已连接 / OFFLINE 断开 / CONNECTING 连接中 / STOPPED 已停;resync=1 待人工全量对账 | > `verdict` 的 `NOTE`/`UNAVAILABLE` 是 DDL 注释(PASS/REJECT)之外、由信号/研判路径后加的实际取值, > 已在此登记。**翻译层遇到未登记的码:显示原码 + 一条告警**,绝不静默套错文案(防「显示得像对的」)。 > 命令与参数标签直接用 `command_spec.list_commands()` 的 `label`/`note` 与 `param_store` 的中文说明,不自造。 --- ## 七、落地路径(只做加法) 1. **前端**:`index.html` 顶部加「交易员/运维」切换;新增六块交易员组件,调用 §5 列出的现有接口; 新增翻译字典模块(或拉 `GET /api/labels`);行内/组合动作复用现有 `POST /api/commands`。现有各块整体归入运维模式。 2. **后端(至多两处只读加法)**:`GET /api/labels`(翻译字典,或写死前端);`name_map(codes)` 批量代码→中文名 (复用 153 连接读 `gp_code_all`,按日缓存)。**不新增写接口、不改既有接口行为。** 3. **部署**:源码打进镜像 → `make deploy`;`make test` 见 ALL SUITES PASS(前端不影响 469 例,按纪律照跑)。 4. **离线兜底**:沿用 `static/vendor/`,新组件不加外网依赖。 --- ## 八、判收清单(实机逐条对) **交易员视图(五条输出级)**:首屏与六块搜不到裸 `PMS_` 键 / 搜不到表名 / 搜不到裸状态码 / 每条提议·裁决·动作按钮都有一句完整中文 / 每个数字有单位与标签。 **动作走通**:采纳·驳回提议、行内清仓/减仓/设止损、组合暂停买入/一键清仓(二次确认)、撤在办委托—— 各走一遍,账本与指令落表与改造前一致。 **运维模式功能不减**:调度类按钮、裸命令台、通道明细、出口/上行原始表、全量参数逐一还在; 危险动作弹二次确认;抽三个运维接口返回与改造前一致。 **回归**:`make test` ALL SUITES PASS。 --- ## 九、边界与不做什么 - 不碰后端引擎、状态机语义、闸门逻辑;交易员视图只读 + 复用已有写接口。 - 危险动作只在前端加确认,后端行为不动。 - 单用户自用,v1 不做权限/角色体系(交易员/运维是同一人的两个视图,非权限隔离)。 - 移动端适配、图表美化、候选/关注块留 v2(或 v1 收尾)。 --- ## 十、已定与待办 **本轮已定(用户 08-10 反馈)**:① 红涨绿跌;② 中文名走 `gp_code_all`(`gp_code_two=ts_code→gp_name`); ③ 命令按交易员/运维重分类(本稿 §5);④ 翻译措辞贴交易员语境、枚举以代码为准(本稿 §6)。 **仍想请你过一眼**: 1. §5 第 3、5 块的**行内动作与组合动作清单**是不是你要的那几个(清/减/止损/冻结/拉黑;暂停/休假/一键清仓/降升仓/行业)——多退少补你定。 2. §6 翻译表的**中文用词**逐条可改;你点头后写死进翻译层。 3. 「候选/关注」块放 v1 收尾还是 v2。