# 迭代目标:14-策略tab历史持仓展示 > 迭代编号:14 | 创建:2026-09-07 | 状态:已实施,待验收 > 依据计划:PLAN-015 | 需求:R-016(已定稿,2026-09-07,Q1-Q7 老师拍板) ## 目标描述 两个策略 tab(做T / 网格超市)title 旁添加「历史持仓」功能:① 显示/隐藏已清仓历史持仓的开关;② 显示历史时默认展示近一周清仓的持仓,并提供 近 1 个月 / 近 3 个月 / 近半年 / 近 1 年 范围选项。历史持仓行复用 R-010 行展开查看关联交易记录——补上「清仓即失联」的操作追溯缺口(核心目标:追溯该持仓相关的历史操作,老师 2026-09-07 定调)。 ## 目标分解 1. **存储查询**(SqliteStore.getHoldingsHistory):closed_at 非空 + closed_at ≥ sinceMs + strategy_id 过滤,按 closed_at DESC;只读新增,不动任何写路径(closeHolding 置 shares=0 语义维持,Q2 老师拍板「显示 0 就好」); 2. **门面透传**(DataStore.getHoldingsHistory); 3. **API 端点**(strategy-holdings/history):strategyId 必填 + range ∈ week|month|quarter|halfYear|year(服务端换算 sinceMs;week 为前端默认但服务端不设隐式默认,参数缺失报错); 4. **前端**(StrategyTab):头部按钮区加「历史持仓」开关 + 范围下拉(开启时显示,默认 week);懒加载 + 范围切换重拉 + 关闭隐藏(缓存保留);历史行追加在当前持仓行后(清仓时间降序)、灰显 + 「已清仓」徽标、标题计数不含历史行;历史行字段 = 代码/名称(关联委托 name 兜底)/份额(0)/清仓时间/持有天数,行情列 —,自定义字段列只读;行展开复用 R-010; 5. **回归**:scripts/test-r016-history.mjs(ODL_TEST_DATA_DIR 临时目录)+ typecheck + build + 存量回归三脚本。 ## 二轮补充(2026-09-07 验收前追加:今日已清仓默认层,Q8-Q9 老师拍板) - **补充诉求**:当天(本地自然日 00:00 起)已清仓的持仓**默认显示**;「历史持仓」开关只控制**今天之前**的历史——历史持仓关 ≠ 当天已清仓也被藏起(首轮「进 tab 默认只看当前」使当天清仓行当场不可见,补上该缺口); - **实现增量**:① 服务端 range='today' 特判本地自然日零点(不落回溯毫秒档);② 前端 rowsToRender 分两层——L1 今日已清仓恒显示(缓存键 'today',随每次持仓重载刷新)+ L2 历史范围层受开关控制,层间按 holdingId 去重;③ 视觉/计数维持首轮(灰显+徽标、计数不含已清仓行); - 影响面:只动只读查询 + 前端渲染合成;**零写路径变更**(closeHolding 语义仍不动); - 回归:test-r016 追加 range=today 自然日边界用例(24/24)。 ## 对老师/主理人的配合需求 - 实现完成后需老师真实环境人工验收(开关/范围切换/历史行展示/展开复盘/与真实清仓数据对照); - 二轮补充后重点验收:**「历史持仓」关时当天清仓的持仓仍显示**、「历史持仓」开时今天之前的行按范围显示、层间无重复行; - 验收通过后本迭代标记「验收通过」,R-016 进入归档流程。