From 329ac67a710d31b2fe3c4a6e259ee5d8574af56f Mon Sep 17 00:00:00 2001 From: AdamGao Date: Wed, 2 Sep 2026 17:34:51 +0800 Subject: [PATCH] =?UTF-8?q?docs(=E8=BF=AD=E4=BB=A311+=E5=BD=92=E6=A1=A3):?= =?UTF-8?q?=20R-013=20=E5=BD=92=E6=A1=A3=E5=AE=8C=E6=88=90=20+=20=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=2011=20=E5=A4=8D=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 迭代 11 复盘:实施事实(R-013 自定义字段 + 列显隐 + 单元格编辑 + unit)+ 经验教训(JSX 未导入白屏 / z.dict dts / SQLite 关键字列 / map this 丢失 / 列宽稳定) - R-013 归档至 已完成/(归档头:日期/状态/实现迭代/讨论记录) - 索引 R-013 → 已实现(已归档);PLAN-012 → 已完成 --- docs/02-计划/计划-策略自定义字段配置.md | 2 +- .../11-策略自定义字段配置/迭代复盘.md | 48 +++++++++++++++++++ docs/05-需求池/{ => 已完成}/R-013.md | 7 ++- docs/05-需求池/需求池索引.md | 2 +- 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 docs/04-迭代记录/11-策略自定义字段配置/迭代复盘.md rename docs/05-需求池/{ => 已完成}/R-013.md (95%) diff --git a/docs/02-计划/计划-策略自定义字段配置.md b/docs/02-计划/计划-策略自定义字段配置.md index 2f7125c..e6795ee 100644 --- a/docs/02-计划/计划-策略自定义字段配置.md +++ b/docs/02-计划/计划-策略自定义字段配置.md @@ -1,6 +1,6 @@ # 计划:策略自定义字段配置(定义随策略,值落库)(阶段航点) -> 编号:PLAN-012 | 粒度:阶段航点 | 创建:2026-09-02 | 状态:**执行中** +> 编号:PLAN-012 | 粒度:阶段航点 | 创建:2026-09-02 | 状态:**已完成(迭代 11 验收通过,2026-09-02)** > 派生自终极目标:目标-002(策略定义能力)、目标-007(人机合一) > 依据需求:**R-013(已定稿,2026-09-02,老师确认 Q1-Q4 + D6)** —— 符合入范围门槛 > 设计约束:技术约束-012(策略定义仍存 DSH settings / SQLite 存储)沿用;本次新增 产品约束-010、技术约束-015、UI约束-005 diff --git a/docs/04-迭代记录/11-策略自定义字段配置/迭代复盘.md b/docs/04-迭代记录/11-策略自定义字段配置/迭代复盘.md new file mode 100644 index 0000000..c6024b0 --- /dev/null +++ b/docs/04-迭代记录/11-策略自定义字段配置/迭代复盘.md @@ -0,0 +1,48 @@ +# 迭代复盘:11-策略自定义字段配置(定义随策略,值落库 + 列显隐) + +> 复盘日期:2026-09-02 | 迭代状态:**已完成(老师确认)** +> 关联需求:R-013(策略自定义字段配置,已定稿 Q1-Q4 + D6) +> 关联计划:PLAN-012(计划-策略自定义字段配置) + +## 结果 + +迭代 11 达成:策略支持**自定义字段**(定义随策略 configSchema 存 settings 不落库,值落 strategy_holdings.values JSON 列),字段作为策略持仓表**列**展示,支持**列显隐/排序**(每策略独立配置)、**单元格点击编辑**(含单位、可编辑视觉记号)。配置页「策略分组」策略行展开配置字段。旧策略(无 configSchema)行为与现状一致。 + +## 过程事实 + +1. **需求定稿(R-013)**:老师提出每个策略可加自定义字段 → 多轮讨论收敛(定义不落库随策略取 / 值落库 / 类型化 text·number·boolean·enum / 枚举有用 / 旧策略兼容 Q4 / 值编辑入口 D6)→ 老师确认定稿,端到端示例入档; +2. **范围扩展(列显隐,老师 2026-09-02)**:字段升级为持仓表列 + 统一显隐管理(不限于自定义字段,含基础数据列);除 代码/名称/操作 外全部可配置;每策略独立;入口 = tab 顶部「列设置」;支持列排序 → visible 单一数据源(strategyColumns,configSchema 不加 visible)老师确认; +3. **实现**:settings.js(configSchema + COLUMN_META + strategyColumns + 归一化)、SqliteStore(values 列幂等 ALTER + readValues/writeValues)、DataStore(透传)、PositionManager(updateHoldingValues 按 configSchema 校验 + getStrategyPositions 附 values)、api(holdings/values-update + strategy-columns 端点)、index.js(注入 getStrategySchema); +4. **UI**:StrategyFieldsEditor(设置页字段定义编辑器)、StrategyTab 动态列化 + 列设置弹层 ColumnSettingsPopover + 单元格点击编辑 FieldCellEditor;自定义字段从展开交易明细移出(老师指示,字段已列化); +5. **UI 细节(老师验收反馈迭代)**:✎ 可编辑记号(值后)、编辑态 ✓/✕ 确认按钮、切换编辑列宽稳定(输入框内容宽度)、数字输入框统一 5 位宽、字段 unit 单位(可为空,展示拼值后); +6. **修复**:配置页白屏(SettingsSection Fragment/StrategyFieldsEditor 未导入 → 运行时 ReferenceError,checkJs:false 未捕获);z.dict dts 推断引用 cosmokit(显式类型注解); +7. **验证**:typecheck + build 通过;回归 test-r013-custom-fields 21/21、test-r013-columns 16/16、test-r011-tabs 23/23、test-r009 14/14; +8. **提交**:aac16b9(R-013 完整实现 + 列显隐 + 单元格编辑),已推送 origin/main。 + +## 经验教训(复盘沉淀) + +### 1. JSX 运行时错误 vs typecheck 盲区(白屏根因) +- 项目 checkJs:false → .jsx 不校验未导入标识符;`` 未 import / 组件未 import 只在运行时 ReferenceError → 整个组件树崩溃白屏; +- **沉淀**:jsx 改动必须自查「使用的 JSX 大写标签是否有 import/定义」(typecheck 不兜底);已建议加 client 构建期 lint 或保持自查清单。 + +### 2. z.dict 的 dts 推断陷阱 +- schemastery z.dict 返回值类型引用 cosmokit Dict → dts 生成报「cannot be named without reference」; +- **沉淀**:settings schema 用 z.dict 时给变量加显式 Schema 类型注解(@type import('@deepseek-ai/schemastery').Schema)规避。 + +### 3. SQLite 关键字列名 +- values 是 SQLite 保留字(INSERT VALUES)→ ALTER/SELECT/UPDATE 裸写报语法错误; +- **沉淀**:列名需双引号 `"values"`(PRAGMA 检测用裸名 OK);若可改名优先避开关键字。 + +### 4. .map(this._mapHolding) 的 this 丢失 +- 方法内新增调用 this._parseValues 后,`.map(this._mapHolding)` 裸传方法引用 → this 丢失 TypeError; +- **沉淀**:map 回调若依赖 this,改模块级纯函数或 `(row) => this._mapHolding(row)`。 + +### 5. 编辑态控件宽度 vs 表格列宽稳定 +- 固定宽输入框(90px)进入编辑使列宽跳变;改内容宽度(ch 随文本)+ 数字固定 5 位宽 + 紧凑 ✓/✕ 后变化最小; +- **沉淀**:表格内联编辑控件宽度应贴近展示态(内容宽度/位数基准),按钮用紧凑 inline(浮层会溢出遮挡相邻单元格)。 + +## 遗留/后续 + +1. **T-006 数据池 + 策略表格动态字段配置**(需求池起草):本迭代的列显隐/字段列化是其「表格列配置」子集的落地,数据池中间层仍未做——后续如需「列名→数据池字段映射/多源字段」再评估; +2. **列排序交互**:本期列设置用 ↑↓ 箭头(零依赖);如老师要 Tab 设置同款拖拽可后续换 DnD; +3. **值校验服务端已实现**,前端编辑即时提示靠服务端错误 Toast——如需前端预校验可后续加。 diff --git a/docs/05-需求池/R-013.md b/docs/05-需求池/已完成/R-013.md similarity index 95% rename from docs/05-需求池/R-013.md rename to docs/05-需求池/已完成/R-013.md index c6a84ad..4fd3bdb 100644 --- a/docs/05-需求池/R-013.md +++ b/docs/05-需求池/已完成/R-013.md @@ -1,4 +1,9 @@ -# R-013 策略自定义字段配置(定义随策略,值落库) +# R-013 策略自定义字段配置(定义随策略,值落库) · 已完成 + +> 归档日期:2026-09-02 | 需求状态:**已完成** +> 原索引:docs/05-需求池/需求池索引.md(主索引保留 R-013 条目,指向本归档) +> 实现迭代:11-策略自定义字段配置(验收通过,迭代复盘见 docs/04-迭代记录/11-策略自定义字段配置/迭代复盘.md) +> 讨论记录:2026-09-02 定稿(Q1-Q4 + D6);迭代 11 实施中扩展列显隐/单元格编辑/unit(老师确认);实现见迭代 11 技术实现方案/程序结构设计/复盘 > 状态:**已定稿**(2026-09-02,老师确认 Q1-Q4)| 登记日期:2026-09-02 > 来源:老师提出(2026-09-02,策略可自定义 / 可扩展讨论;T-009 转正) diff --git a/docs/05-需求池/需求池索引.md b/docs/05-需求池/需求池索引.md index ba1ee95..aed55e7 100644 --- a/docs/05-需求池/需求池索引.md +++ b/docs/05-需求池/需求池索引.md @@ -24,7 +24,7 @@ | R-010 | 策略持仓行展开关联交易记录(Holding → 交易汇总) | 策略持仓 tab 每个持仓行(Holding)可展开,展开显示与该 holding 关联的交易记录(仅委托汇总,不分笔成交);strategy-positions 附加 holding_id + 新增 trades/by-holding 端点 + 持仓行展开 UI + 成本价/最后一笔成交价两列 + 神之一手 tab 隐藏输入框。**2026-09-02 定稿(Q1-Q4 确认),2026-09-02 完成(老师确认),已归档至 已完成/R-010.md** | 老师指令(2026-09-02) | P1 | 已定稿 | 2026-09-02 | 08-策略持仓行展开关联交易记录 | **已实现(已归档)** | | R-011 | Tab 设置:统一管理所有 tab(内置 + 策略分组混排,显示/隐藏 + 拖动排序) | 设置页「通用设置」升级为「Tab 设置」,统一管理所有会话 tab(系统内置 + 策略分组)的唯一入口:两类混排、**拖动排序**(原生 HTML5 DnD,落点立即持久化)+ **显隐开关**;**任何 tab 均不支持重命名/删除**(策略命名/删除仍在「策略分组」子 tab);顺序/显隐统一为一份数据源(tabs 有序数组,策略行名 join strategies 自动跟随改名),删除策略联动删除对应条目;新增策略追加末尾;老配置自动迁移(旧隐藏策略迁移后显示)。**2026-09-02 定稿(Q1-Q5 确认)并完成(迭代 09 验收通过),已归档至 已完成/R-011.md** | 老师指令(2026-09-02) | P1 | 已定稿 | 2026-09-02 | 09-Tab设置统一管理 | **已实现(已归档)** | | R-012 | UI 适配 DSH 主题(浅色 / 深色 / 跟随系统) | 神之一手 UI 适配 DSH 浅色/深色/跟随系统主题:141 处硬编码色值替换为宿主 `--dsw-*` token,随主题自动切换;不自行维护主题偏好(**暂定跟随系统**);涨跌红涨绿跌 → 宿主 state-error/success;仅色值 token 化不动布局。**2026-09-02 定稿(暂定跟随系统)并完成(迭代 10),已归档至 已完成/R-012.md** | 老师指令(2026-09-02) | P1 | 已定稿 | 2026-09-02 | 10-UI主题适配 | **已实现(已归档)** | -| R-013 | 策略自定义字段配置(定义随策略,值落库) | 策略可自定义、可扩展:每个策略在设置页「策略分组」子 tab 配置自定义字段(字段名/类型文本·数字·布尔·枚举/默认值,configSchema 随策略定义存 settings);每个持仓行按所属策略的定义存一份键值对值(strategy_holdings 新增 values TEXT(JSON) 列);策略持仓 tab 持仓行展开区按定义渲染/编辑值。**2026-09-02 定稿(Q1-Q4 + D6 确认)并进入计划 PLAN-012(迭代 11 实施中)**,详见 docs/05-需求池/R-013.md | 老师指令(2026-09-02) | P1 | 已定稿 | 2026-09-02 | 11-策略自定义字段配置 | 实施中(迭代 11) | +| R-013 | 策略自定义字段配置(定义随策略,值落库) | 策略可自定义、可扩展:每个策略在设置页「策略分组」子 tab 配置自定义字段(字段名/类型文本·数字·布尔·枚举/枚举项/单位 unit/默认值,configSchema 随策略定义存 settings);每个持仓行按所属策略的定义存一份键值对值(strategy_holdings 新增 values TEXT(JSON) 列);自定义字段作为持仓表列展示,列显隐/排序每策略独立配置(strategyColumns),单元格点击内联编辑。**2026-09-02 定稿(Q1-Q4 + D6)并完成(迭代 11 验收通过),已归档至 已完成/R-013.md** | 老师指令(2026-09-02) | P1 | 已定稿 | 2026-09-02 | 11-策略自定义字段配置 | **已实现(已归档)** | ## 渐进明细规划素材