# 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=<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。
