# 计划:策略计算字段 + 策略 tab 静态化重构(阶段航点) > 编号:PLAN-019 | 粒度:阶段航点 | 创建:2026-09-10 | 状态:**进行中(迭代 22 交互设计阶段)** > 派生自终极目标:目标-002(策略定义能力)、目标-003(按策略监控市场) > 依据需求:**R-027(已定稿,2026-09-10,重构·第一阶段)+ R-026(已定稿,2026-09-10,计算字段·第二阶段)** —— 均符合入范围门槛 > 设计约束:沿用 技术约束-012(策略定义存储)、技术约束-015(configSchema)、UI约束-003/004/005/006/007; > 本次拟修订(实施时执行):产品约束-002/003/004/009、UI约束-002/003/005;新增计算字段约束条目 ## 目标 **一句话**:策略字段能力升级为「可算」,并把字段配置的入口搬到它该在的地方。 - **第一阶段(R-027 重构)**:策略 tab **静态化**(插件内置、不可增删改名,保留显隐/排序);设置页「策略分组」移除; 字段编辑功能迁到**主窗口策略 tab 内、「列设置」旁的「字段配置」弹层**,保存走单策略字段端点; - **第二阶段(R-026 计算字段)**:在迁移后的入口上新增第五种字段类型「**计算(formula)**」——用户写中文变量公式 引用服务端缓存数据集,服务端按持仓行**实时计算**列值(不落库、列只读、缺数据显示 `—`)。 **为什么合并成一个迭代**:计算字段的公式表单必须落在字段配置入口上;若先按旧入口(设置页)实现再搬迁,等于白做一遍。 ## 范围 **第一阶段 · 重构(R-027)** 1. **tab 体系**:`strategies` 常量化为内置两项(网格超市 / 手动做T);`settings.tabs` 中策略条目固定(不可增删); 保留 Tab 设置的显隐 + 拖拽排序;`addStrategy / removeStrategy / appendStrategyTab / removeStrategyTab / generateStrategyId` 退役; 2. **设置页**:移除「策略分组」子 tab(含策略新增/重命名/删除与确认弹窗)→ 设置页 = Tab 设置 + QMT 连接配置; 3. **字段配置入口**:策略 tab 顶部新增「字段配置」按钮(列设置旁)→ 独立弹层(字段列表 + 添加/编辑/删除 + 保存); `StrategyFieldsEditor` 改造为弹层内容;保存改走新增端点 `strategies/schema-update { strategyId, configSchema }`; 4. **存储归一化**:settings 只保留字段定义(按 strategyId)+ `strategyColumns` 覆盖;存量 settings 读取时归一化(无迁移脚本)。 **第二阶段 · 计算字段(R-026)** 5. **轻量变量目录**(服务端):数据集 → 中文变量名 → 取数函数(行情+合约 / 持仓账本 / 本行自定义字段值),T-006 数据池的第一块砖; 6. **公式引擎**:自写小型表达式解析器(零依赖、支持中文标识符、四则 + 括号 + round/abs/min/max),含语法校验与求值; 7. **数据/API**:`configSchema` 支持 `type='formula'` + 公式串 + 小数位;`strategy-positions` 逐行现算随行返回; 字段保存校验(语法 / 变量存在性 / 变量命名规则)+ **试算端点**(取一行真实持仓试算); 8. **UI**:字段配置弹层内公式分支(公式框 + 变量选择器 + 试算 + 单位/小数位);策略持仓表计算列只读渲染(`ƒ` 表头 + 悬停看公式 + 格式化 + 缺数据 `—`); 9. 交互设计 → 技术方案 → 实现 → 回归脚本(独立数据目录,技术约束-011)→ 验收。 **不做**(本期边界): - 策略级聚合(跨行求和)——留二期;QMT 账户域 / 交易记录作为变量来源(用例不明确,后补); - 公式引用公式(变量目录排除 formula 字段);历史持仓行时点计算(显示 `—`);布尔型公式结果;公式框实时高亮/自动补全; - 完整 T-006 数据池中间层(本期只落变量目录); - 策略的重命名 / 增删 / 归档(静态化后不存在);自建策略数据迁移(实测无自建策略)。 ## 涉及文件(技术方案阶段细化) ``` src/ ├── settings.js # strategies 常量 + tabs 固定 + 字段定义/列配置归一化;退役 CRUD 辅助 ├── api/strategies.js # 策略 CRUD 端点退役;新增 strategies/schema-update(单策略字段) ├── formula/ # 新增:公式引擎(第二阶段) │ ├── variables.js # 轻量变量目录(数据集 → 中文变量名 → 取数函数) │ └── evaluator.js # 表达式解析 + 校验 + 求值 ├── position/PositionManager.js # strategy-positions 行内公式现算 ├── client/views/SettingsSection.jsx # 移除「策略分组」子 tab;Tab 设置保留 ├── client/views/StrategyTab.jsx # 顶栏「字段配置」+「列设置」;计算列只读渲染 ├── client/views/FieldConfigDialog.jsx # 新增:字段配置弹层(复用/改造 StrategyFieldsEditor) └── client/views/StrategyFieldsEditor.jsx # 改造为弹层内容 + 单策略保存 + 公式分支 scripts/ └── test-r026-formula-fields.mjs # 回归脚本(第二阶段) ``` ## 实现步骤 1. **文档骨架**:PLAN-019 + 迭代 22(迭代目标 / UI交互设计),R-026 + R-027 定稿 —— 本步; 2. **交互设计过审**(老师拍板)→ 出技术实现方案(两阶段规格)+ 验收标准; 3. **第一阶段实现**:tab 静态化 + 设置页收敛 + 字段配置弹层 + 单策略端点 + 存量归一化 → 回归(策略 CRUD 相关用例退役); 4. **第二阶段实现**:变量目录 + 公式引擎 + 现算/校验/试算端点 + UI(公式表单 / 只读列)→ 回归; 5. **验证 + 老师人工验收 + 迭代复盘**。 ## 验收要点 **第一阶段(重构)** - 设置页只有「Tab 设置 / QMT 连接配置」,无「策略分组」;无新增/重命名/删除策略入口; - 策略 tab 恒为「网格超市 / 手动做T」两个:不可增删改名;Tab 设置里仍可显隐 + 拖拽排序(现有偏好生效); - 策略 tab 顶部「字段配置」按钮打开弹层:可添加/编辑/删除字段并保存;保存后表格列同步跟随;重启后定义仍在; - 服务端只接受内置两个 strategyId;`strategy_holdings` / 归属数据零影响(13 / 3 行不变)。 **第二阶段(计算字段)** - 字段类型可选「计算」:写中文变量公式、选择器插入、试算可算出结果;非法公式/未知变量被拒并提示; - 策略持仓表计算列只读,按单位/小数位格式化,悬停可见公式;缺数据/除零显示 `—`,不炸表; - 计算字段不落库(公式存 settings、值每次现算);四式用例(浮动盈亏 / 盈亏比例 / 距涨停 / 网格占用)可算出; - 既有四类字段与手填值编辑、列设置、历史持仓展示零回归; - typecheck + build + 回归脚本通过;老师人工验收。 ## 关联 - 需求:**R-027**(重构·第一阶段)、**R-026**(计算字段·第二阶段);上游 R-013(字段模型/列机制)、R-011(Tab 显隐排序)、R-015(行情/合约缓存)、R-010(最后一笔成交价)、R-018(份额账本); - 取代:R-003、R-011(部分)、R-013(入口条款)——由 R-027 取代; - 延展:T-006(数据池中间层草稿)——变量目录为其起点; - 迭代:22-策略计算字段与策略tab静态化(两阶段)。