6f74ed4a79
归类重构(技术约束-016)落地后同步活动文档旧路径: - 数据存储设计.md: 三处对应实现表 12 处 src/component/* → storage/position/market/trades - R-013 / PLAN-012 / 迭代11技术实现方案: SqliteStore/PositionManager 路径更新 - 迭代11程序结构设计: 补后续动作记录(历史档案按追加式原则不改写)
4.9 KiB
4.9 KiB
程序结构设计:11-策略自定义字段配置(含结构归类优化)
迭代编号:11 | 2026-09-02 | 依据:技术约束-016(目录归类)、R-013、PLAN-012
背景:结构审查发现与优化
2026-09-02 结构审查发现:src/component/ 平铺 10 个服务端模块,偏离迭代 01/02 程序结构设计的语义分域(data-source/、position/、storage/);component 命名语义含混(UI 组件实际在 client/views/);归类演进无文档记录;存在死代码。
优化动作(2026-09-02 落地)
- 归类还原:component/ 平铺 → 按功能域分目录:
src/
├── index.js # 插件入口(组装各模块)
├── settings.js # 设置管理(策略 + tabs + QMT 连接配置)
├── api/ # 服务端 HTTP API(webServer /odl/api/*),按领域拆子文件
│ ├── index.js # 路由入口(合并各领域 + 405/404/500)
│ ├── common.js # 公共工具
│ ├── positions.js # 持仓域
│ ├── strategies.js # 策略/份额/tabs 域
│ ├── qmt-connections.js # QMT 连接配置域
│ ├── market.js # 行情域
│ └── trades.js # 交易记录域
├── data-source/ # 数据源抽象层(技术约束-001/003)
│ ├── QmtBridgeRestDataSource.js # QMT Bridge REST 适配器
│ ├── data-source-types.js # 统一数据模型(Position/DataSource 接口)
│ └── QmtHealthMonitor.js # QMT 连接健康检查(数据源健康缓存)
├── storage/ # 存储层(R-008 SQLite)
│ ├── SqliteStore.js # SQLite 存储封装(node:sqlite)
│ └── DataStore.js # 存储门面(对外兼容 API + 迁移)
├── position/ # 分仓业务逻辑
│ └── PositionManager.js # 持仓↔策略份额分配、聚合视图
├── market/ # 行情域
│ ├── MarketDataHub.js # 行情缓存(内存 + 落盘 + 查询)
│ └── MarketFeed.js # 行情获取(WS + REST 轮询 + prime)
├── trades/ # 交易域
│ └── TradeSync.js # 交易记录定时同步(QMT → SQLite)
└── client/ # 客户端(UI)
├── index.js # 客户端入口:tab/settings 注册
├── market/ # MarketDataProvider.jsx(行情 context)
└── views/ # React 组件(StrategyTab / SettingsSection / Toast 等)
- 死代码清理:删除 src/component/AllocationStorage.js(旧 allocations.json 存储,0 引用);删除 DataStore.setDataset/removeDataset(PositionManager 适配单票生命周期后无调用方);
- 构建与脚本同步:tsdown.config.ts entry 更新为新目录 glob;scripts/*.mjs 导入路径更新;
- 验证:typecheck + build 通过;test-r009 回归 14/14 通过(独立数据目录)。
归类规则(沉淀为技术约束-016)
- 服务端代码禁止平铺,按功能域分目录:data-source / storage / position / market / trades;
- api/ 按领域拆子文件;client/ 仅放 UI(views/ 组件 + market/ provider);
- 文件命名 = 类名 PascalCase + .js/.jsx;
- 新增服务端模块必须先落对应域目录,无合适域时先讨论补域,不得回退平铺。
R-013 新增改动落点(本迭代实施)
src/settings.js # +configSchema(策略 schema 扩展)
src/storage/SqliteStore.js # +_ensureHoldingValuesColumn + readValues/writeValues
src/position/PositionManager.js # +updateHoldingValues(按 configSchema 校验)
src/api/strategies.js # +holdings/values-update 端点;strategy-positions 附加 values
src/client/views/SettingsSection.jsx # 「策略分组」策略行展开配置字段
src/client/views/StrategyTab.jsx # 持仓行展开区「自定义字段」编辑
scripts/test-r013-custom-fields.mjs # 回归脚本(独立数据目录)
后续动作(2026-09-02 结构约束对齐)
归类重构落地后,将活动文档中的旧路径引用同步到新结构(历史档案按追加式原则不改写):
- docs/03-设计约束/数据存储设计.md:三处「对应实现」表 12 处 src/component/* → 新域目录(storage/position/market/trades);
- docs/05-需求池/R-013.md:涉及改动面 SqliteStore → src/storage/;
- docs/02-计划/计划-策略自定义字段配置.md:文件树 → storage/SqliteStore.js;
- 本迭代技术实现方案:1.2 节标题路径 + §2 PositionManager 路径标注 → 新目录;
- 保留不改:迭代 04 说明/复盘、R-008 归档、旧计划中的 component/ 描述(历史事实)。