329ac67a71
- 迭代 11 复盘:实施事实(R-013 自定义字段 + 列显隐 + 单元格编辑 + unit)+ 经验教训(JSX 未导入白屏 / z.dict dts / SQLite 关键字列 / map this 丢失 / 列宽稳定) - R-013 归档至 已完成/(归档头:日期/状态/实现迭代/讨论记录) - 索引 R-013 → 已实现(已归档);PLAN-012 → 已完成
58 lines
4.7 KiB
Markdown
58 lines
4.7 KiB
Markdown
# 计划:策略自定义字段配置(定义随策略,值落库)(阶段航点)
|
||
|
||
> 编号: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
|
||
|
||
## 目标
|
||
|
||
策略可**自定义、可扩展**:每个策略在设置页「策略分组」子 tab 配置自己的自定义字段定义(configSchema,含类型/枚举/默认值,随策略定义存 settings 不落库);该策略下的每个持仓(strategy_holdings 行)按定义存取一份键值对值(新增 values JSON 列落库);策略持仓 tab 持仓行展开区按定义渲染并编辑值。旧策略无定义的行为与现状完全一致。
|
||
|
||
## 范围
|
||
|
||
**做**:
|
||
1. settings.strategies 扩展 configSchema(schemastery:array of object,type union text|number|boolean|enum + enum 选项 + def 默认值),读取归一化(旧项缺省 []);
|
||
2. strategy_holdings 新增 values TEXT(JSON) 列(幂等 ALTER,沿用 _ensureTradeAttributionColumns 模式,只读容忍);新增 readValues(holdingId) / writeValues(holdingId, values);现有 openHolding/addShares/reduceShares/closeHolding 保持 values 不随份额操作变动;
|
||
3. API:strategy-positions 每行附 values;新增 holdings/values-update {holdingId, values} 写回(服务端按 configSchema 校验:数字有限数、枚举在选项内、布尔为布尔;允许额外键=可扩展;空值/缺省可写入);
|
||
4. 设置页「策略分组」子 tab:策略行可展开 → 展开区字段列表(label/key/type/enum/def)+ 添加/编辑/删除字段(字段名/类型/选项/默认值表单)+ 保存走 strategies/update(整表);
|
||
5. 策略持仓 tab:持仓行展开区(R-010 基础上)增加「自定义字段」区块:按该策略 configSchema 渲染输入控件(文本=输入框、数字=数字输入、布尔=开关、枚举=下拉),值来自该行 values,编辑即保存调 values-update,保存成功 Toast 反馈;
|
||
6. 回归脚本(独立数据目录,技术约束-011):定义字段 → 批量写/改持仓行 values → 校验存储与读取、校验过界值拒绝。
|
||
|
||
**不做**:
|
||
- 字段定义落库(定义随策略定义走,D1);
|
||
- 策略级(整策略一份)值(值=持仓级,Q1);
|
||
- T-006 数据池 / 表格列动态配置(独立需求,起草中);
|
||
- T-003 策略配置文件骨架(被本需求吸收,不另做);
|
||
- 删除策略时字段定义联动处理之外的数据迁移(兼容:旧策略无定义、旧行 NULL,不迁移,Q4)。
|
||
|
||
## 涉及文件
|
||
|
||
```
|
||
src/
|
||
├── settings.js # strategySchema 扩展 configSchema + 归一化
|
||
├── storage/SqliteStore.js # _ensureHoldingValuesColumn + readValues/writeValues
|
||
├── api/strategies.js # strategy-positions 附加 values + holdings/values-update 端点
|
||
├── client/views/SettingsSection.jsx # 「策略分组」子 tab 策略行展开配置字段
|
||
└── client/views/StrategyTab.jsx # 持仓行展开区「自定义字段」编辑
|
||
scripts/
|
||
└── test-r013-custom-fields.mjs # 回归脚本(独立数据目录)
|
||
```
|
||
|
||
## 实现步骤
|
||
|
||
1. **文档骨架**:PLAN-012 + 迭代 11(迭代目标 / 技术实现方案 / 验收标准)+ 约束条目(产品约束-010、技术约束-015、UI约束-005)(本步);
|
||
2. **数据层**:settings.js configSchema 扩展 + SqliteStore 补列/读写(幂等迁移验证);
|
||
3. **API 层**:strategy-positions 附加 values + holdings/values-update(含 configSchema 校验);
|
||
4. **设置页 UI**:「策略分组」展开配置字段;
|
||
5. **策略持仓 UI**:展开区自定义字段编辑(文本/数字/布尔/枚举);
|
||
6. **回归脚本 + 验证 + 验收复盘**。
|
||
|
||
## 验收要点
|
||
|
||
- 设置页「策略分组」:策略行可展开,添加/编辑/删除字段(四种类型 + 枚举选项 + 默认值)后保存,重启后定义仍在;
|
||
- 策略持仓 tab:持仓行展开可见「自定义字段」区块,四种类型控件按定义渲染,编辑值保存后刷新仍在(落库);
|
||
- 同策略多行各有各的值;不同策略字段集互不影响;
|
||
- 旧策略(无 configSchema)持仓行不出现字段区,现有操作(加仓/减仓/清仓/展开交易记录)不受影响;
|
||
- 服务端校验生效:数字填非数字、枚举填选项外拒绝并提示;
|
||
- typecheck + build 通过;回归脚本全绿。 |