feat: 迭代03-05 交易记录接入、行情实时、QMT连接配置、data store 标准化

- R-004 QMT连接配置:多配置管理 + 会话头部快捷切换(03-QMT连接配置)
- R-005 WS盘中价格实时更新:服务端中转+缓存+前端轮询(04-WS盘中价格实时更新)
- R-006 策略数据 JSON data store 标准化(store.json/market.json/schema.json)
- R-007 交易记录接入:当日订单+成交单表合并(委托主行+展开成交明细)、时间段查询(今日/本周/本月+手动起止)、费用计算(佣金费率万m_dCommission+最低5元、印花税卖出万5、过户费双向万0.1)
- 架构治理:api 按领域拆分、component 目录、QmtHealthMonitor
This commit is contained in:
2026-09-01 13:21:49 +08:00
parent 5a723d514e
commit bb3f8bd28d
57 changed files with 5244 additions and 397 deletions
@@ -0,0 +1,85 @@
# 技术实现方案:05-交易记录接入(订单与成交 + 日期导航)
> 依据:PLAN-006 | 需求:R-007 设计约束:技术约束-001/003/004/010、产品约束-007 方向语义
## 技术选型
- **数据源**:复用 QmtBridgeRestDataSourceREST 直连,技术约束-003),新增 3 方法;
- **服务端 API**webServer 自开路由(技术约束-004),新增 api/trades.js 领域;
- **前端数据流**:服务端中转 + 前端轮询(技术约束-010 思路,复用 market-snapshot 模式);
- **UI**React 组件 + 现有表格风格(LoadState 三态 / 内联样式 / Toast);
- **时间段查询**v32026-09-01):RangeSelector 组件(今日/本周/上周快捷 + 手动起止日期),替代单日导航。
## 架构设计
### 服务端
```
QmtBridgeRestDataSource.getOrders({code,status}) → GET /trade/orders → 语义化映射 order 列表
QmtBridgeRestDataSource.getTrades() → GET /trade/trades → 语义化映射 trade 列表
QmtBridgeRestDataSource.getTradingDates({s,e}) → GET /data/calendar/trading_dates → dates[]
api/trades.js(新增领域):
orders → dataSource.getOrders(args)
trades → dataSource.getTrades()
trading-dates → dataSource.getTradingDates(args)
registerApi 合并 TRADE_METHODS + HANDLERS
```
**语义化映射(核心)**
```
order: { orderId, code, name, exchange, direction(48买/49卖), status, orderVolume,
tradedVolume, totalVolume, limitPrice, tradedPrice, amount, insertTime }
trade: { tradeId, orderId, code, name, exchange, direction, price, volume, amount,
commission, tradeTime }
```
**方向判定**m_nOffsetFlag48=买入/49=卖出)为主 + m_strOptName 交叉验证(R-007 Q3 闭环)。
### 客户端(单表合并)
```
TradeRecordsTab(标题 + 时间段同一行 + 单表)
├─ RangeSelectortrading-dates → 快捷范围(今日/本周/上周)+ 手动起止日期
│ 今日=最近交易日单日(完整互斥时间段);本周=所在自然周周一~周五(不考虑周六日);本月=所在自然月1号~月末
├─ 合并逻辑:fetch orders+trades(带 start/end)→ 按 orderId 分组 → 聚合
│ 聚合:成交量=Σ、成交均价=加权、成交额=Σ、手续费=Σ
├─ OrderRow:委托主行(聚合成交),点击展开/折叠
└─ TradeDetailRows:展开的每笔成交明细
```
**合并规则**
- 主行 = 一笔委托(orderId 唯一);
- 成交聚合:m_strOrderSysID 匹配的 trades 聚合进主行(加权均价 + 求和);
- 无成交(待报/已撤/废单):成交量/均价/金额/手续费显示 —;
- 展开:逐笔渲染成交(时间/价/量/额/手续费/成交号)。
**排序**:委托主行默认按时间降序(最新在前);表头点击排序(时间/代码/方向/状态/委托量/成交量/金额),再次点击切换升/降序。
**轮询**:仅「今日」范围(最近交易日单日)3-5s 轮询;切换时间段取消轮询、按 range 一次性查询(历史接口就绪后接入 start/end 实际过滤)。
**时间段查询(v3 定稿)**
- 服务端 orders/trades 端点接收 start/end(透传,QMT Bridge 历史接口就绪后生效);
- 前端 RangeSelector:三个快捷按钮 + 两个 date input
- 历史范围(非今日)本期占位「历史数据接口开发中」。
## 涉及设计约束
| 约束 | 内容 |
|---|---|
| 技术约束-001 | 统一数据源抽象:交易数据走 QmtBridgeRestDataSource 适配器 |
| 技术约束-003 | 直连 QMT Bridge REST(不经过 MCP |
| 技术约束-004 | webServer 自开路由 /odl/api/*(不占 /api interceptor |
| 技术约束-010 | 服务端中转 + 前端轮询(复用市场模式) |
| 产品约束-007 | 方向着色沿用红/绿习惯语义(交易:红买绿卖) |
## 实现步骤
1. 文档骨架:PLAN-006 + 迭代 05(本步);
2. 数据源:getOrders/getTrades/getTradingDates + 语义化映射;
3. 服务端 APIapi/trades.js 三端点 + 领域分发;
4. 客户端合并逻辑:fetch 两接口 → 分组 → 聚合;
5. UIDateNav + OrderRow + TradeDetailRows + TradeRecordsTab + 排序;
6. 构建安装:pnpm run build + 刷新/重启;
7. 验收 + 复盘。
@@ -0,0 +1,38 @@
# 迭代 05 复盘:交易记录接入(订单与成交 + 日期导航)(2026-09-01
> 复盘日期:2026-09-01 | 迭代状态:**实现完成,待老师验收确认**
> 关联需求:R-007(交易记录接入,范围已定稿)
> 关联计划:PLAN-006(计划-交易记录接入.md
## 结果
迭代 05 达成:交易记录 tab 接入当日委托(/trade/orders+ 当日成交(/trade/trades),单表合并展示(委托主行 + 按 m_strOrderSysID 展开成交明细),日期导航(交易日历驱动,历史接口占位),排序默认降序可手动。
## 过程事实
1. **需求定稿(R-007**:老师指令接入订单与成交 → 技术研究(API 字段全表 / 方向判定澄清 / 数据时效研究 / sample data)→ 范围定稿(当日订单+成交 + 日期导航)→ 展示设计定稿(单表合并 + 排序降序);
2. **方向判定闭环**m_nDirection=48 恒为操作标记(官方 innerApi 字典),真实方向在 m_nOffsetFlag48买/49卖)+ m_strOptName 交叉验证;
3. **数据时效确认**/trade/orders 与 /trade/trades 仅当日数据(get_trade_detail_data 读客户端缓存),历史查询需老师完善 QMT Bridge 接口;
4. **服务端实现**QmtBridgeRestDataSource 新增 getOrders/getTrades/getTradingDates(语义化映射)+ api/trades.js 领域(orders/trades/trading-dates 端点);
5. **客户端实现**TradeRecordsTab(单表合并 + 排序 + 轮询 4s)+ DateNav(交易日历导航,当日默认,历史占位);
6. **验证**:typecheck 通过、构建成功、数据源三方法端到端实测通过(博纳影业卖出 200 股 @6.00,手续费 0.852)、合并逻辑多笔成交场景验证通过(加权均价 6.03);
7. **未做**:历史数据查询实现(等老师 QMT Bridge 接口)、本地持久化(Q5 本期不做)、按策略过滤(Q10 后续)。
## 经验(待沉淀)
- **方向判定**:大 QMT m_nDirection 恒 48 是操作标记,m_nOffsetFlag 才是方向(48买/49卖)——实现时勿踩坑;
- **手续费字段**m_dCommission 与 m_dComssion(拼写变体)同值,取值优先 m_dCommission
- **前端轮询**:静默刷新不闪 loadingsetOrders 直接更新,不置 loading=true);日期切换时清理轮询定时器;
- **服务端/客户端加载时机**:服务端改动需宿主重启,客户端 bundle 刷新即载(沿用迭代 03/04 经验)。
## 遗留/后续
1. **历史成交接口**:老师完善 QMT Bridge 后,DateNav 历史日期从占位切换为真实查询(trading-dates 已就绪,orders/trades 加日期参数即可);
2. **本地持久化**:跨日复盘需按日落盘(Q5),待历史接口就绪后评估;
3. **按策略过滤**Q10 后续迭代(strategy_name 与插件策略体系打通)。
## 验收状态
- 服务端/数据源端到端验证:✅(真实数据实测通过)
- 前端 UI:待老师页面验收(客户端 bundle 已构建,刷新页面即载)
- 完整验收:对照 验收标准.md 逐条核验(待老师确认)
@@ -0,0 +1,27 @@
# 迭代目标:05-交易记录接入(订单与成交 + 日期导航)
## 目标
在「交易记录」tab 接入 QMT Bridge **当日委托(/trade/orders)与当日成交(/trade/trades**:**单表合并**展示(委托主行 + 按 m_strOrderSysID 展开成交明细)+ **基于交易日历的日期导航**(当日默认选中,历史接口占位)。
## 目标描述
- 范围:R-007(范围已定稿 2026-09-01);不新增其他功能域;
- 要解决的问题:交易记录 tab 当前为占位(PlaceholderTab),无当日订单/成交数据展示,无法支撑交易复盘(目标-006);
- 引用需求:**R-007(范围定稿,2026-09-01**
- 实现方式:服务端 REST 直连 QMT Bridge(技术约束-003)+ 前端轮询(技术约束-010 思路)+ 单表合并 UI;
- 日期导航:复用 /data/calendar/trading_dates,为老师完善历史成交接口预留。
## 目标讨论过程
- 2026-09-01 老师提出需求:接入订单与成交数据,开始需求和技术研究(R-007 入池);
- 2026-09-01 技术研究:API 面实测(orders/trades 字段全表)、方向判定澄清(m_nOffsetFlag + m_strOptName)、数据时效研究(仅当日)、sample data 沉淀;
- 2026-09-01 范围定稿:当日订单+成交接入 + 日期导航(老师将完善历史接口);
- 2026-09-01 展示设计定稿:**单表合并**(委托主行 + 展开成交明细)+ **排序默认降序可手动调整**
- 关键决策:Q1-Q11 全部有结论(两块合一、3-5s 轮询、m_nOffsetFlag 判方向、本期不持久化、红买绿卖、P1 等)。
## 对老师的配合需求
- QMT Bridge(激活配置)可达,验证当日订单/成交返回真实数据;
- 构建安装后重载页面配合验证;
- 历史成交接口完善后接入日期导航历史查询(本期仅占位)。
@@ -0,0 +1,28 @@
# 验收标准:05-交易记录接入(订单与成交 + 日期导航)
## 验收标准线
1. 「交易记录」tab 显示**当日委托**(单表合并视图):每行一笔委托,展示时间/代码/名称/方向/状态/委托量/成交量/委托价/成交均价/成交额/手续费;
2. **合并正确**:委托行聚合成交(按 m_strOrderSysID);有成交的委托行可**展开**查看每笔成交明细(成交时间/价/量/额/手续费/成交号);聚合金额与逐笔合计一致;
3. **未成交委托**(待报/已报/已撤/废单):成交量/均价/金额/手续费显示 —;状态列中文映射正确(未报/待报/已报/部成/已成/已撤/废单等);
4. **方向**:红买绿卖(红=买、绿=卖);方向判定正确(对照 m_strOptName);
5. **时间段查询**:标题 + 时间段控件同一行;快捷按钮 今日/本周/本月 可快速切换(基于交易日历最近交易日计算);手动起止日期可用;非今日范围展示「历史数据接口开发中」占位;
6. **排序**:委托主行默认降序(最新在前);点击表头可手动排序(升/降切换);
7. **刷新**:当日数据 3-5s 自动刷新(无需手动);切换日期取消轮询;
8. **不回归**:持仓/策略/行情/连接配置等现有功能正常。
## 验收方法
- 打开交易记录 tab,对照 QMT 端确认当日委托/成交数据真实显示(实测博纳影业 001330.SZ 限价卖出 200 股);
- 点击有成交的委托行,确认展开显示每笔成交明细;
- 检查未成交委托(若有)成交列显示 —;
- 点击 今日/本周/上周 快捷按钮,确认时间段切换正确(今日=最近交易日单日、本周=周一~周五(交易日,不考虑周六日)、本月=完整自然月(1号~月末);三范围互斥,点哪个激活哪个);手动改起止日期确认生效;历史范围显示占位提示;
- 点击表头排序,确认升/降序切换与默认降序;
- 观察 3-5s 轮询刷新(数据变化自动更新);
- 回归:全部持仓 / 策略 / 行情 / QMT 连接配置正常。
## 验收目标
- 交易记录闭环完整:REST 查询 → 语义化映射 → 单表合并 → 展开明细 → 日期导航;
- 支撑交易复盘(目标-006):当日委托/成交全貌可见;
- 交互(合并/展开/排序/导航/着色)符合定稿设计。