# 计划:策略自定义字段配置(定义随策略,值落库)(阶段航点) > 编号: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 通过;回归脚本全绿。