init
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
# 迭代 02 实施步骤规划(分步执行)
|
||||
|
||||
> 2026-08-28 | 按步骤分批推进,每步有独立产出与验证点
|
||||
> 关联:技术实现方案.md、程序结构设计.md(02)、R-003(已定稿)
|
||||
|
||||
## 总览
|
||||
|
||||
| 步骤 | 内容 | 产出 | 验证点 | 依赖 |
|
||||
|---|---|---|---|---|
|
||||
| S1 | 服务端:策略 CRUD 逻辑(settings.js) | id 生成/增删改排序 + 删除联动 | 单元验证:slug 生成、CRUD、删除清份额 | - |
|
||||
| S2 | 服务端:存储清份额(storage.js) | removeStrategyShares/clearStrategy | 清空后 allocations.json 正确 | S1 |
|
||||
| S3 | 服务端:分仓快捷逻辑(manager.js) | 全部移入/清空策略份额 | 单元验证:未分配全部移入、清零 | S2 |
|
||||
| S4 | 服务端:API 新端点(api.js) | strategies/add、remove、move、remove-all-shares | 端点调用正确 + 错误码 | S1-S3 |
|
||||
| S5 | 客户端:基础组件(LoadState/Toast) | 三态加载 + 轻提示 | 组件渲染正确 | - |
|
||||
| S6 | 客户端:SettingsSection CRUD | 新增/重命名/删除(确认)/排序/显隐 UI | UI 操作正确 + 服务端联动 | S4+S5 |
|
||||
| S7 | 客户端:tab 动态注册(index.js) | 策略配置驱动 tabs + 手动刷新提示 | tab 随设置变化 + 提示出现 | S4+S5 |
|
||||
| S8 | 客户端:StrategyTab 快捷操作 | 全部移入/一键清零 | 操作正确 + 确认弹窗 + Toast | S4+S5 |
|
||||
| S9 | 构建 + 安装 + 联调验收 | 全链路 | 对照验收标准.md | S1-S8 |
|
||||
|
||||
## 分步细节
|
||||
|
||||
### S1:服务端策略 CRUD(settings.js)
|
||||
- `generateStrategyId(name)`:slug 化(去空格/转小写/非英文转拼音或序号兜底)
|
||||
- `addStrategy / renameStrategy / removeStrategy / moveStrategy`
|
||||
- removeStrategy 联动:删除策略 + 调 storage.removeStrategyShares
|
||||
- **验证**:Node 直接调用,验证 slug 生成、CRUD 后 settings 值正确、删除后份额清空
|
||||
|
||||
### S2:服务端存储清份额(storage.js)
|
||||
- `removeStrategyShares(strategyId)`:遍历 allocations,删除该 strategyId,原子保存
|
||||
- `clearStrategy(strategyId)`:同 removeStrategyShares(供一键清零复用)
|
||||
- **验证**:构造数据 → 清空 → 文件正确
|
||||
|
||||
### S3:服务端分仓快捷逻辑(manager.js)
|
||||
- `moveAllUnallocatedToStrategy(code, strategyId)`:未分配 = volume - 已分配,全部 add
|
||||
- `clearStrategyShares(strategyId)`:清空该策略全部份额,返回影响的标的列表
|
||||
- **验证**:真实/模拟持仓数据,全部移入后未分配归零、清零后份额归零
|
||||
|
||||
### S4:服务端 API 新端点(api.js)
|
||||
- `strategies/add`:{ name } → 新增策略
|
||||
- `strategies/remove`:{ strategyId } → 删除 + 清份额
|
||||
- `strategies/move`:{ strategyId, dir } → 排序
|
||||
- `remove-all-shares`:{ strategyId } → 一键清零
|
||||
- 全部移入复用 add-shares(服务端算未分配 or 客户端传)
|
||||
- **验证**:HTTP 调用各端点,200 + 正确返回;错误码(strategy-not-found 等)
|
||||
|
||||
### S5:客户端基础组件(LoadState.jsx / Toast.jsx)
|
||||
- LoadState:loading / error(原因+重试) / success 三态;自动重试 2 次(间隔 2s)
|
||||
- Toast:success(绿) / error(红),3s 自动消失
|
||||
- **验证**:组件在 tab 中渲染正确(可临时构造 error 态验证)
|
||||
|
||||
### S6:客户端 SettingsSection CRUD(O3)
|
||||
- 新增:名称输入 + 按钮 → strategies/add
|
||||
- 重命名:行内编辑 → strategies/update
|
||||
- 删除:确认弹窗(提示份额回未分配)→ strategies/remove
|
||||
- 排序:上移/下移 → strategies/move
|
||||
- 显隐开关保留
|
||||
- 操作后 Toast 反馈 + 触发「策略已变更」事件(供 S7)
|
||||
- **验证**:完整 CRUD 操作路径
|
||||
|
||||
### S7:客户端 tab 动态注册(O2)
|
||||
- index.js:loadStrategies() → 动态注册策略 tabs(visible=true)
|
||||
- 全部持仓 tab 固定
|
||||
- 提示「刷新页面后生效」(方案 X);优化项:会话切换自动重拉(方案 Y)
|
||||
- **验证**:增删/隐藏策略后刷新,tab 栏正确变化
|
||||
|
||||
### S8:客户端 StrategyTab 快捷操作(O6)
|
||||
- 行内「全部移入」→ add-shares(shares=未分配)
|
||||
- 顶部「一键清零」→ 确认弹窗 → remove-all-shares
|
||||
- Toast 反馈 + reload
|
||||
- **验证**:操作后份额正确、未分配正确变化
|
||||
|
||||
### S9:构建 + 安装 + 联调验收
|
||||
- pnpm build(tsdown + wrap-client.mjs)
|
||||
- dsh plugin add 更新安装
|
||||
- 对照验收标准.md 全链路验收(含断 QMT 验证 O5、CRUD 验证 O3、tab 验证 O2、快捷操作验证 O6)
|
||||
|
||||
## 建议执行批次
|
||||
|
||||
- **批次 1(S1-S3)**:服务端核心逻辑(策略 CRUD + 清份额 + 快捷分仓)—— 纯服务端可独立验证
|
||||
- **批次 2(S4)**:服务端 API 端点 —— 打通 HTTP 通道
|
||||
- **批次 3(S5-S6)**:客户端基础组件 + 设置 CRUD UI
|
||||
- **批次 4(S7-S8)**:客户端 tab 动态化 + 快捷操作 —— 全链路 UI
|
||||
- **批次 5(S9)**:构建安装 + 联调验收
|
||||
|
||||
## 前置技术确认(编码前)
|
||||
|
||||
1. ~~slots.unregister 能力~~ → **已确认**:`ctx.slots.register()` 返回 disposer 函数(SlotCore.register 的 return),可注销 entry;动态 tab 注册/注销可行
|
||||
2. ~~客户端跨组件事件实现方式~~ → **已确认**:无事件机制。设置页保存后就地提示「刷新页面后生效」;tab 更新 = 刷新页面 → 插件重载 → 重新注册(方案 X;方案 Y 会话切换自动更新为优化项)
|
||||
3. settings scope 更新后的 watch 机制(是否需要监听策略变更)
|
||||
|
||||
## 执行进度(2026-08-28)
|
||||
|
||||
### ✅ 批次 1-2(S1-S4)服务端已完成并验证
|
||||
|
||||
| 步骤 | 状态 | 验证结果 |
|
||||
|---|---|---|
|
||||
| S1 策略 CRUD(settings.js) | ✅ 完成 | slug 生成(长线持有→long-term-hold、网格超市→grid-supermarket、去重→-2)、增删改排序单元测试通过 |
|
||||
| S2 存储清份额(storage.js) | ✅ 完成 | removeStrategyShares 清空策略份额正确(受影响标的列表、记录清理) |
|
||||
| S3 分仓快捷逻辑(manager.js) | ✅ 完成 | 全部移入(未分配 700→1200)、无未分配报错(no-unallocated)、一键清零通过 |
|
||||
| S4 API 新端点(api.js) | ✅ 完成 | strategies/add、remove(联动清份额)、move、move-all-shares、remove-all-shares 全部 HTTP 验证通过 |
|
||||
|
||||
### ✅ 批次 3-4(S5-S8)客户端已完成,构建通过
|
||||
|
||||
| 步骤 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| S5 基础组件 | ✅ 完成 | LoadState.jsx(三态+自动重试2次+手动重试)、Toast.jsx(成功绿/失败红,3s) |
|
||||
| S6 SettingsSection CRUD | ✅ 完成 | 新增/重命名/删除(确认弹窗)/排序/显隐 + 就地「刷新后生效」提示 |
|
||||
| S7 tab 动态注册 | ✅ 完成 | 策略配置驱动注册(slots.register 返回 disposer),全部持仓固定,隐藏策略不注册 |
|
||||
| S8 StrategyTab 快捷操作 | ✅ 完成 | 全部移入(行内)、一键清零(确认弹窗)、LoadState 兜底 |
|
||||
|
||||
### 🔄 S9 构建安装 + 联调验收(进行中)
|
||||
|
||||
| 项 | 状态 | 验证结果 |
|
||||
|---|---|---|
|
||||
| pnpm build | ✅ 完成 | 客户端 bundle 41KB + 服务端 14 模块,lib 产物集成测试通过 |
|
||||
| 宿主加载 | ✅ 完成 | 客户端模块清单含 one-divine-lot(rev a238b5fa84d1),bundle 为新版本(41KB) |
|
||||
| 服务端 API 真实验证 | ✅ 完成 | 新端点全部可用:add/move/remove(联动清份额)/move-all-shares/remove-all-shares |
|
||||
| 快捷操作真实验证 | ✅ 完成 | 全部移入(603028.SH 未分配800→manual-t)、一键清零(manual-t 清零)验证通过,数据已恢复 |
|
||||
| UI 视觉验证 | ⏳ 待老师确认 | 需在浏览器实际查看 tab 动态化、设置 CRUD、快捷操作(当前环境无法自动化浏览器) |
|
||||
|
||||
### 待老师确认的 UI 验收项
|
||||
1. 主窗口 tab 栏:只显示「手动做T」(网格超市 visible=false 不显示)—— O2 动态 tab
|
||||
2. 设置页「神之一手」:策略 CRUD(新增/重命名/删除弹窗/排序/显隐)+「刷新页面后生效」提示
|
||||
3. 策略 tab:全部移入(行内)、一键清零(弹窗)、Toast 反馈
|
||||
4. 加载失败:LoadState 重试(可临时断 QMT 验证)
|
||||
@@ -0,0 +1,90 @@
|
||||
# 技术实现方案:02-分仓管理工具完善与优化
|
||||
|
||||
## 一、技术选型
|
||||
|
||||
| 项 | 选型 | 依据 |
|
||||
|---|---|---|
|
||||
| 技术栈 | 沿用迭代 01(Node/TS 服务端 + React 客户端) | 技术约束-001/003 |
|
||||
| 服务端 API | webServer 自开路由 /odl/api/*(**不 intercept /api**) | 技术约束-004 |
|
||||
| 客户端 bundle | CJS + window.__ModuleLoader__.load 包装 | 技术约束-005 |
|
||||
| slots.register | component 为第二参数;settings 用 schemastery z.object() | 技术约束-006 |
|
||||
| 插件安装 | dsh plugin add(自动 reconcile bundles) | 技术约束-007 |
|
||||
| 本地存储 | allocations.json(~/.dsh/one-divine-lot/) | 沿用迭代 01 |
|
||||
|
||||
## 二、改造点设计
|
||||
|
||||
### O2 策略 tab 动态化
|
||||
**现状**:src/client/index.js 写死注册 3 个 tab(全部持仓 + 2 策略)。
|
||||
**改造**:
|
||||
- 客户端新增「拉取策略配置」逻辑:启动/进入时 fetch /odl/api/strategies,取 visible=true 的策略;
|
||||
- 按策略列表动态注册 conversation.view tabs(id = odl-strategy-<slug>,label = 策略名);
|
||||
- 全部持仓 tab 固定保留(数据源 tab,始终显示);
|
||||
- 隐藏策略的 tab 不注册/移除;
|
||||
- 策略变更(设置页保存)→ 顶部轻提示「策略已变更,请手动刷新」+ 提供刷新按钮触发重新拉取注册。
|
||||
|
||||
### O3 设置界面完善(策略 CRUD)
|
||||
**现状**:SettingsSection.jsx 只有显示/隐藏开关。
|
||||
**改造**:
|
||||
- 新增策略:输入名称 → 服务端生成英文 id(slug 化,如「长线持有」→ long-term-hold)→ 追加到列表末尾;
|
||||
- 重命名:改 name(id 不变,分配数据不受影响);
|
||||
- 删除:弹窗确认(提示「该策略下 N 股将回到未分配」)→ 删除策略 + 其份额回未分配(服务端原子操作);
|
||||
- 排序:上移/下移按钮调整 order;
|
||||
- 预置策略(网格超市/手动做T)与其他策略一视同仁,可删可改;
|
||||
- 保留显示/隐藏开关。
|
||||
- 服务端:strategies/update 现有端点承载 CRUD;新增删除时份额回未分配的联动逻辑(删除策略 → storage 中该 strategyId 的分配清除,回到未分配)。
|
||||
|
||||
### O5 数据加载失败兜底
|
||||
**现状**:tab 加载失败仅显示「加载失败」文字。
|
||||
**改造**:
|
||||
- 统一「加载状态组件」:loading / error(含原因)/ success 三态;
|
||||
- error 态显示:失败原因(HTTP 错误 / 超时 / 网络异常)+ 「重试」按钮;
|
||||
- 自动重试 2 次(间隔 2s),仍失败进入 error 态(手动重试);
|
||||
- 超时:沿用 15s 可配置(qmtTimeoutMs),超时报「数据源超时」;
|
||||
- **不引入全局数据源状态监控**(O5 本质是页面加载兜底,非状态栏)。
|
||||
|
||||
### O6 份额编辑体验
|
||||
**现状**:StrategyTab 添加/移出需逐票输入。
|
||||
**改造**:
|
||||
- 「全部移入」(单票):策略 tab 表格行内按钮,把该票全部未分配份额移入当前策略(一次 add-shares 调用,shares = 未分配数);
|
||||
- 「一键清零」(策略级):策略 tab 顶部按钮,弹窗确认后把该策略下所有份额移出(循环 remove 或新增批量端点);
|
||||
- 保留 step=100 步进 + 手动输入任意值;
|
||||
- 操作反馈:统一轻提示组件(成功绿/失败红,3s 自动消失)。
|
||||
|
||||
## 三、服务端 API 变更
|
||||
|
||||
| 端点 | 变更 |
|
||||
|---|---|
|
||||
| /odl/api/strategies | 不变(列表) |
|
||||
| /odl/api/strategies/update | 承载 CRUD;删除时联动清空该策略份额(回未分配) |
|
||||
| /odl/api/add-shares | 不变(O6 全部移入复用,shares=未分配数) |
|
||||
| /odl/api/remove-shares | 不变 |
|
||||
| /odl/api/remove-all-shares(新增) | 一键清零:{ strategyId } → 清空该策略全部份额 |
|
||||
|
||||
## 四、客户端组件变更
|
||||
|
||||
| 组件 | 变更 |
|
||||
|---|---|
|
||||
| src/client/index.js | 动态注册策略 tabs(从 /strategies 拉取) |
|
||||
| src/client/views/SettingsSection.jsx | 补全 CRUD UI(新增/重命名/删除/排序)+ 删除确认弹窗 |
|
||||
| src/client/views/StrategyTab.jsx | 全部移入按钮、一键清零按钮(确认)、轻提示反馈 |
|
||||
| src/client/views/AllPositionsTab.jsx | 加载失败兜底(错误提示 + 重试) |
|
||||
| src/client/views/connection.jsx | 统一 API 调用错误处理(错误码/原因透出) |
|
||||
|
||||
## 五、实现步骤
|
||||
1. 服务端:strategies/update 删除联动(份额回未分配)+ remove-all-shares 端点;
|
||||
2. 客户端:加载状态组件 + 轻提示组件;
|
||||
3. 客户端:SettingsSection CRUD 补全 + 删除确认弹窗;
|
||||
4. 客户端:tab 动态注册(策略配置驱动 + 变更提示刷新);
|
||||
5. 客户端:StrategyTab 全部移入 / 一键清零;
|
||||
6. 构建(tsdown + wrap)+ 安装(dsh plugin add);
|
||||
7. 验收测试。
|
||||
|
||||
## 六、涉及设计约束
|
||||
- 产品约束-004(删除策略份额回未分配 + 弹窗确认,R-003 新增)
|
||||
- 产品约束-002/003、技术约束-001/003~007
|
||||
|
||||
## 七、风险与开放项
|
||||
1. 动态注册 tabs:重复注册/注销策略 tab 的精确 API(slots.unregister 或重挂载)需在实现时确认;
|
||||
2. 策略变更提示「手动刷新」的触发范围(当前会话内即时提示?跨会话?)—— 按 O2-3 决策:设置保存后提示手动刷新;
|
||||
3. 一键清零大批量份额的原子性(删除策略 vs 份额操作并发);
|
||||
4. 删除策略的份额回未分配是否涉及「未分配」展示(未分配 tab 已有,删除后份额自然出现在未分配)。
|
||||
@@ -0,0 +1,181 @@
|
||||
# 程序结构设计:02-分仓管理工具完善与优化
|
||||
|
||||
> 迭代设计 v2 的程序结构细化 | 2026-08-28
|
||||
> 关联:技术实现方案.md(02)、R-003(已定稿)
|
||||
|
||||
## 一、整体目录结构(基于迭代 01 演进)
|
||||
|
||||
```
|
||||
one_divine_lot/
|
||||
├── package.json # 不变(已有 dsh.client 声明)
|
||||
├── src/ # 源码(服务端 + 客户端)
|
||||
│ ├── index.js # 插件入口:apply(ctx),组装各模块(少量调整)
|
||||
│ ├── settings.js # 设置管理:策略 CRUD 逻辑扩展(新增 id 生成、删除联动)
|
||||
│ ├── storage.js # 本地存储:allocations.json(新增:清空策略份额)
|
||||
│ ├── api.js # 服务端 HTTP API(webServer /odl/api/*):新增端点
|
||||
│ ├── data-source/
|
||||
│ │ ├── types.js # 不变
|
||||
│ │ └── qmt-bridge-rest.js # 不变
|
||||
│ ├── position/
|
||||
│ │ └── manager.js # 分仓逻辑:新增全部移入/清空策略份额
|
||||
│ └── client/
|
||||
│ ├── index.js # 客户端入口:tab 动态注册(O2 核心改造)
|
||||
│ └── views/
|
||||
│ ├── AllPositionsTab.jsx # 加载失败兜底(O5)
|
||||
│ ├── StrategyTab.jsx # 全部移入/一键清零(O6)
|
||||
│ ├── SettingsSection.jsx # 策略 CRUD 补全(O3)
|
||||
│ ├── connection.jsx # API 调用错误透出增强(O5)
|
||||
│ ├── LoadState.jsx # 【新增】三态加载组件(O5)
|
||||
│ └── Toast.jsx # 【新增】轻提示组件(O6/O3)
|
||||
└── docs/ # 神之一手框架文档(既有)
|
||||
```
|
||||
|
||||
## 二、模块职责与变更点
|
||||
|
||||
### 1. index.js(插件入口)
|
||||
- 基本不变;新增:把「策略配置读取」能力暴露给 api(已由 settings 提供)
|
||||
- 组装链保持:dataSource → settings → storage → manager → api
|
||||
|
||||
### 2. settings.js(设置管理)—— O3 核心
|
||||
- **现有**:registerSettings / getStrategies / getVisibleStrategies / updateStrategies
|
||||
- **新增**:
|
||||
- `generateStrategyId(name)`:中文/任意名 → 英文 slug(如「长线持有」→ long-term-hold;去空格、转小写、连字符)
|
||||
- `addStrategy(scope, name)`:生成 id + 追加到列表末尾(order = max+1)
|
||||
- `renameStrategy(scope, id, name)`:只改 name(id 不变,分配数据不受影响)
|
||||
- `removeStrategy(scope, id)`:删除策略(**联动清空该策略份额** —— 调用 storage 清理 + 更新策略列表)
|
||||
- `moveStrategy(scope, id, dir)`:上移/下移(调整 order)
|
||||
- 策略 schema 不变(id/name/visible/order)
|
||||
|
||||
### 3. storage.js(本地存储)—— 配合 O3/O6
|
||||
- **现有**:load/save/get/getAll/set/remove(按 code)
|
||||
- **新增**:
|
||||
- `removeStrategyShares(strategyId)`:遍历所有 code,删除该 strategyId 的份额(删除策略联动)
|
||||
- `clearStrategy(strategyId)`:同 removeStrategyShares(O6 一键清零可复用)
|
||||
|
||||
### 4. position/manager.js(分仓逻辑)—— O6
|
||||
- **现有**:getAllPositions/getStrategyPositions/getUnallocated/addToStrategy/removeFromStrategy/getSummary
|
||||
- **新增**:
|
||||
- `moveAllUnallocatedToStrategy(code, strategyId)`:把某票**全部未分配份额**移入指定策略(O6 全部移入)—— 未分配 = volume - 已分配,一次 add
|
||||
- `clearStrategyShares(strategyId)`:清空某策略全部份额(O6 一键清零)—— 调 storage.clearStrategy + 返回影响标的列表
|
||||
- 校验保持:各策略份额之和 ≤ 总持仓
|
||||
|
||||
### 5. api.js(服务端 API)—— 承载新端点
|
||||
- **现有**:/odl/api/* 8 端点(webServer 自开路由,技术约束-004)
|
||||
- **新增端点**:
|
||||
- `POST /odl/api/strategies/remove`:{ strategyId } → 删除策略 + 联动清份额(O3)
|
||||
- `POST /odl/api/strategies/move`:{ strategyId, dir } → 排序(O3)
|
||||
- `POST /odl/api/strategies/add`:{ name } → 新增(O3,也可并入 update,分开更清晰)
|
||||
- `POST /odl/api/remove-all-shares`:{ strategyId } → 一键清零(O6)
|
||||
- 全部移入复用现有 `add-shares`(shares = 未分配数,由客户端先算好或服务端算)
|
||||
- `strategies/update` 保留(重命名/显隐仍走整表更新)
|
||||
- 错误透出:统一错误码(not-found / strategy-not-found / share-limit 等)
|
||||
|
||||
### 6. client/index.js(客户端入口)—— O2 核心改造
|
||||
- **现有**:写死注册 3 个 tab
|
||||
- **改造**:
|
||||
- 新增 `loadStrategies()`:fetch /odl/api/strategies,取 visible=true 列表
|
||||
- **动态注册**:遍历策略列表,逐个 `slots.register('conversation.view', { id: 'odl-strategy-<slug>', label: 策略名 }, StrategyTab)`
|
||||
- 全部持仓 tab 固定保留(order 10,数据源 tab)
|
||||
- **刷新机制**:暴露「刷新 tab 栏」函数 —— 重新拉策略配置 → 注销旧策略 tabs → 注册新 tabs
|
||||
- **变更提示(无事件机制,老师确认)**:设置页保存成功后**就地提示**「策略已变更,刷新页面后生效」(Toast);
|
||||
- **tab 更新时机**:插件启动时按策略配置注册 tabs → 刷新页面 = 插件重载 = 按最新策略重新注册(基线方案 X);
|
||||
- **可选优化(方案 Y)**:tab 栏利用「会话切换/重新挂载」时机重新拉策略配置自动更新(无需自定义事件,实现时验证框架挂载钩子,失败则保持方案 X)
|
||||
- **技术确认(已核实)**:`ctx.slots.register(...)` 返回 **disposer 函数**(注销该 entry)——动态注销旧 tabs 可行:注册时保存 disposer 列表,刷新时逐一调用 disposer 移除,再注册新 tabs
|
||||
|
||||
### 7. client/views/SettingsSection.jsx —— O3 UI
|
||||
- **现有**:策略列表 + 显示开关
|
||||
- **改造**:
|
||||
- 新增策略:输入框 + 按钮 → call strategies/add { name }
|
||||
- 重命名:行内编辑(改 name → strategies/update)
|
||||
- 删除:删除按钮 → **确认弹窗**(提示「该策略下 N 股将回到未分配」)→ call strategies/remove
|
||||
- 排序:上移/下移按钮 → call strategies/move
|
||||
- 保留显示开关
|
||||
- 操作反馈:Toast(成功/失败)
|
||||
|
||||
### 8. client/views/StrategyTab.jsx —— O6 UI
|
||||
- **现有**:添加(选标的+份额)/ 移出(指定数量)
|
||||
- **改造**:
|
||||
- 「全部移入」按钮(行内):该票未分配全部移入当前策略(call add-shares,shares=未分配)
|
||||
- 「一键清零」按钮(顶部):弹窗确认 → call remove-all-shares
|
||||
- 操作反馈:Toast
|
||||
- 加载失败:LoadState 兜底(O5)
|
||||
|
||||
### 9. client/views/AllPositionsTab.jsx —— O5
|
||||
- **现有**:直接显示/加载失败文字
|
||||
- **改造**:套 LoadState 三态组件(loading/error+重试/success)
|
||||
|
||||
### 10. 【新增】client/views/LoadState.jsx —— O5
|
||||
- 三态组件:loading(加载中)/ error(失败原因 + 重试按钮)/ success(children)
|
||||
- 自动重试 2 次(间隔 2s)逻辑内置(或由父组件控制)
|
||||
|
||||
### 11. 【新增】client/views/Toast.jsx —— O6/O3
|
||||
- 轻提示:success(绿)/ error(红),3s 自动消失
|
||||
- 简单实现:全局 state + 定时器,或 React portal
|
||||
|
||||
## 三、职责边界(延续迭代 01)
|
||||
|
||||
| 层 | 文件 | 职责 |
|
||||
|---|---|---|
|
||||
| API 封装层 | api.js | 接收 HTTP 请求 → 调业务层 |
|
||||
| 业务逻辑层 | position/manager.js + settings.js | 分仓逻辑 + 策略管理 |
|
||||
| 数据源适配层 | data-source/qmt-bridge-rest.js | 真正发 HTTP 到 QMT |
|
||||
| 存储层 | storage.js | allocations.json 本地持久化 |
|
||||
|
||||
**调用链**:client → HTTP /odl/api/* → api.js → manager/settings → storage / qmt-bridge-rest → QMT
|
||||
|
||||
## 四、数据流(关键路径)
|
||||
|
||||
```
|
||||
【O2 动态 tab】
|
||||
设置页保存策略变更
|
||||
→ SettingsSection 调 strategies/update(或 add/remove/move)
|
||||
→ 服务端更新 settings + 联动 storage
|
||||
→ 客户端 Toast「策略已变更,请手动刷新」+ 刷新按钮
|
||||
→ 用户点刷新 → 重新 loadStrategies() → 注销旧 tabs → 注册新 tabs
|
||||
|
||||
【O3 删除策略】
|
||||
设置页点删除 → 确认弹窗
|
||||
→ call strategies/remove { strategyId }
|
||||
→ settings.removeStrategy + storage.removeStrategyShares(strategyId)
|
||||
→ 份额回未分配(全部持仓 tab 未分配数增加)
|
||||
|
||||
【O6 全部移入】
|
||||
策略 tab 行内「全部移入」
|
||||
→ 客户端已知该票未分配数 → call add-shares { code, strategyId, shares: 未分配数 }
|
||||
→ manager.addToStrategy(校验 ≤ 总持仓)
|
||||
→ Toast 成功 → reload
|
||||
|
||||
【O6 一键清零】
|
||||
策略 tab 顶部「一键清零」→ 确认弹窗
|
||||
→ call remove-all-shares { strategyId }
|
||||
→ manager.clearStrategyShares → storage.clearStrategy
|
||||
→ Toast 成功 → reload
|
||||
```
|
||||
|
||||
## 五、关键接口签名(待实现时对照类型确认)
|
||||
|
||||
- slots.register('conversation.view', {id, label}, Component) —— 动态注册/注销(读 slots.d.ts 确认 unregister)
|
||||
- webServer.register({kind:'prefix', path:'/odl/api', handler}) —— 已有
|
||||
- settings scope.get()/update() —— 已有
|
||||
- **事件机制:不需要(老师确认,2026-08-28)**——策略变更的提示在设置页内就地显示,tab 更新靠「刷新页面 → 插件重载 → 重新注册」,全程无跨组件事件;
|
||||
- 优化(方案 Y):若框架支持会话切换挂载钩子,tab 栏自动重新拉策略配置(仍无事件)
|
||||
|
||||
## 六、开发顺序(编码)
|
||||
|
||||
1. 服务端:settings.js(add/rename/remove/move + id 生成)
|
||||
2. 服务端:storage.js(removeStrategyShares/clearStrategy)
|
||||
3. 服务端:manager.js(moveAllUnallocated/clearStrategyShares)
|
||||
4. 服务端:api.js(新端点 + 错误透出)
|
||||
5. 客户端:LoadState.jsx + Toast.jsx(基础组件)
|
||||
6. 客户端:SettingsSection CRUD + 确认弹窗
|
||||
7. 客户端:index.js 动态 tab 注册 + 刷新机制
|
||||
8. 客户端:StrategyTab 全部移入/一键清零
|
||||
9. 构建 + 安装 + 联调验收
|
||||
|
||||
## 七、非目标(本期不做)
|
||||
|
||||
- 表格列可配置(T-006 数据池)
|
||||
- 数据源状态全局监控(O5 澄清为加载兜底)
|
||||
- 数据实时刷新/WebSocket(T-005)
|
||||
- 持仓信息补全列(O1)
|
||||
- 网格参数管理、做T 记录、风控
|
||||
@@ -0,0 +1,22 @@
|
||||
# 迭代目标:02-分仓管理工具完善与优化
|
||||
|
||||
## 目标
|
||||
对 R-002 分仓管理工具进行完善与优化:**O2 策略 tab 动态化、O3 策略 CRUD 设置界面、O5 数据加载失败兜底提示+重试、O6 份额快捷操作**。将「分仓管理」从写死的 3 tab 形态升级为「策略配置驱动 + 完整策略管理 + 健壮加载体验」的可用工具。
|
||||
|
||||
## 目标描述
|
||||
- 范围:O2/O3/O5/O6(见 R-003 定稿,20 项决策收敛);不新增全新功能域;
|
||||
- 要解决的问题:策略 tab 写死不同步设置、设置界面缺 CRUD、加载失败无兜底、份额编辑繁琐;
|
||||
- 引用需求:**R-003(已定稿,2026-08-28)**;
|
||||
- 实现方式:沿用独立插件 one-divine-lot,服务端 + 客户端改造。
|
||||
|
||||
## 目标讨论过程
|
||||
- 2026-08-28 迭代 01 复盘提出下一步建议;
|
||||
- 2026-08-28 R003 讨论:候选方向 O1~O7 → 老师圈定 O2/O3/O5/O6(第 2 轮);
|
||||
- 2026-08-28 第 3 轮:16 项核心决策收敛(含删除份额回未分配、预置策略可删);
|
||||
- 2026-08-28 第 4 轮:剩余不确定点收敛(手动刷新提示、删除确认弹窗、单票全部移入、清零确认);
|
||||
- 2026-08-28 第 5 轮:O5 本质澄清(加载失败兜底提示,非数据源状态监控);
|
||||
- 2026-08-28 老师确认定稿;O8 数据池拆分独立为 T-006 草稿。
|
||||
|
||||
## 对老师的配合需求
|
||||
- 验收时提供 QMT 可用环境(数据加载失败场景可临时断网验证);
|
||||
- 确认策略 CRUD 操作路径符合预期(新增/重命名/删除/排序/显隐)。
|
||||
@@ -0,0 +1,29 @@
|
||||
# 验收标准:02-分仓管理工具完善与优化
|
||||
|
||||
## 验收标准线
|
||||
1. **O2 tab 动态化**:设置中增删/隐藏策略后,主窗口 tab 栏按策略配置更新(隐藏的策略 tab 不显示);策略变更后出现「手动刷新」提示;
|
||||
2. **O3 策略 CRUD**:设置界面支持新增(自动英文 id)/重命名/删除(弹窗确认 + 份额回未分配)/排序(上移下移)/显隐;预置策略可删除;
|
||||
3. **O5 加载失败兜底**:数据加载失败时显示失败原因 + 重试按钮;自动重试 2 次后仍失败可手动重试;超时给出提示;
|
||||
4. **O6 份额快捷操作**:单票「全部移入」(未分配全部进当前策略)、策略「一键清零」(弹窗确认后全部移出);操作有轻提示反馈;
|
||||
5. **无回归**:全部持仓/策略持仓展示、份额分配、本地持久化、响应式布局保持可用。
|
||||
|
||||
## 验收方法
|
||||
1. 在设置中新增/重命名/删除/排序/隐藏策略,观察主窗口 tab 栏变化与手动刷新提示;
|
||||
2. 删除有份额的策略,验证份额回到未分配(全部持仓 tab 未分配数增加);
|
||||
3. 临时断开 QMT,验证 tab 加载失败提示 + 重试按钮;恢复后重试成功;
|
||||
4. 在策略 tab 使用「全部移入」「一键清零」,验证份额变化与确认弹窗、轻提示;
|
||||
5. 回归:全部持仓/策略持仓展示、添加/移出份额、重启持久化。
|
||||
|
||||
## 验收目标
|
||||
- 老师能在设置中完整管理策略(CRUD + 显隐 + 排序),tab 栏实时反映;
|
||||
- 数据加载失败时老师能获得清晰提示并重试;
|
||||
- 份额编辑更高效(单票全部移入、一键清零),操作有反馈。
|
||||
|
||||
## 验收记录(待迭代完成后填写)
|
||||
| 验收项 | 结果 |
|
||||
|---|---|
|
||||
| O2 tab 动态化 | 待验收 |
|
||||
| O3 策略 CRUD | 待验收 |
|
||||
| O5 加载失败兜底 | 待验收 |
|
||||
| O6 份额快捷操作 | 待验收 |
|
||||
| 无回归 | 待验收 |
|
||||
Reference in New Issue
Block a user