# 计划:策略持仓行展开关联交易记录(Holding → 交易汇总)(阶段航点) > 编号:PLAN-009 | 粒度:阶段航点(大粒度) | 创建:2026-09-02 | 状态:**已完成(2026-09-02 迭代 08 老师确认)** > 派生自终极目标:目标-006(交易复盘)、目标-003(按策略监控市场) > 依据需求:**R-010(已定稿,2026-09-02,Q1-Q3 确认)** —— 符合入范围门槛 > 设计约束:技术约束-012(数据存储设计)、技术约束-001/003/004(沿用) ## 目标 策略持仓 tab 每个持仓行(Holding)可展开,展开显示与该 holding 关联的交易记录(仅委托汇总,不分笔成交),实现「持仓 ↔ 交易」的双向追溯(R-009 反向:交易→持仓已实现,本迭代持仓→交易)。 ## 范围 **做**: 1. **strategy-positions 附加 holding_id**:PositionManager.getStrategyPositions 返回时,查 strategy_holdings 附加当前持仓的 holding_id(Q1); 2. **trades/by-holding 端点**:按 holding_id 查 trade_orders,返回委托汇总列表(时间/方向/状态/委托量/成交量/均价/金额/费用)(Q2); 3. **持仓行展开 UI**:StrategyTab 持仓行加展开(类似交易记录 tab 展开效果),展开后内嵌小表格显示该 holding 的委托汇总;懒加载(展开时才请求)(Q3)。 **不做**: - 分笔成交明细展示(老师明确只要汇总); - 交易记录 tab 改动; - 归属设置入口(R-009 已有)。 ## 程序结构 ``` src/ ├── component/ │ ├── PositionManager.js # 改:getStrategyPositions 附加 holding_id │ ├── SqliteStore.js # 改:+getOrdersByHolding(holdingId) │ └── DataStore.js # 改:+getTradeOrdersByHolding ├── api/ │ └── trades.js # 改:+trades/by-holding 端点 src/client/views/ └── StrategyTab.jsx # 改:持仓行展开 + 内嵌委托汇总表(懒加载) ``` ## 实现步骤 1. **文档骨架**:PLAN-009 + 迭代 08(本步); 2. **SqliteStore**:getOrdersByHolding(WHERE holding_id=? ORDER BY insert_ts DESC); 3. **DataStore**:委托方法; 4. **PositionManager**:getStrategyPositions 附加 holding_id; 5. **api/trades.js**:trades/by-holding 端点; 6. **StrategyTab**:持仓行展开 + 懒加载 + 内嵌汇总表; 7. **构建测试**:pnpm run build + typecheck + 独立数据目录回归(技术约束-011); 8. **验收 + 复盘**。 ## 验收要点 - strategy-positions 每行含 holding_id(同策略同 code 当前持仓); - trades/by-holding 返回该 holding 的委托汇总(无成交的委托也显示); - StrategyTab 持仓行可展开,展开显示委托汇总表(不分笔成交); - 懒加载:不展开不请求; - 现有功能不回归。