Files
one_divine_lot/docs/05-需求池/已完成/R-004.md
T
kyugao bb3f8bd28d 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
2026-09-01 13:21:49 +08:00

13 KiB
Raw Blame History

R-004 QMT 连接配置(多配置管理 + 会话头部快捷切换)· 已完成

归档日期:2026-08-29 | 需求状态:已完成 原索引:docs/05-需求池/需求池索引.md(主索引保留 R-004 条目,指向本归档) 定稿记录:2026-08-29 老师确认定稿(三要素满足:边界清楚 + 核心逻辑明确 + 老师确认) 来源:老师指令(2026-08-28 关联:docs/05-需求池/需求池索引.md(R-004) 说明:待确认问题清单与讨论记录原独立记录于 R-004-待确认问题.md,2026-08-29 经老师要求整合入本文档(保留一份),原独立文件已删除。

需求概述

在神之一手的设置页面新增一个子 tab「QMT 连接配置」,用于管理多个 QMT Bridge 连接配置:

  • 多配置管理:可维护多个连接配置(增 / 删 / 改 / 查);
  • 一次只能激活一个:从多个配置中单选激活一个,被激活的配置为当前生效连接;
  • 可设置默认:标记某配置为默认(默认 = 启动时自动激活的配置,见 Q1);
  • 快捷切换:在会话窗口顶栏(PTC 模式标签旁)提供常驻下拉控件,一键切换当前激活的连接,无需进入设置页(见 Q9/Q10)。

现状分析:插件当前使用的 QMT 连接信息

通过代码审查得出(src/data-source/qmt-bridge-rest.js、src/index.js、cordis.patch.yml):

配置项 当前值 是否必配 说明
HTTP 基础地址(baseUrl http://192.168.3.43:8610 是(唯一必配) 由宿主 cordis.patch.yml 注入 config.qmtBaseUrl;数据源所有 REST 请求基于此地址
请求超时(timeoutMs 15000ms 否(有默认值) 代码常量 REQUEST_TIMEOUT_MS=15000,当前未暴露到配置,使用默认值

分析结论

  1. 核心只需配置一个 HTTP 地址baseUrl)—— 插件与 QMT Bridge 的所有通信都基于它(/health、/trade/、/data/ 等 REST 端点);
  2. 可选配置一个请求超时(timeoutMs)—— 仅在需要调整超时时才需配置,可提供默认值;
  3. 当前不需要其他连接参数:无认证(QMT Bridge REST 端点无鉴权)、无账户/密码、无额外 header —— 未来若 QMT Bridge 增加鉴权,再扩展配置字段。

2026-08-29 讨论前代码审查补充(支撑决策):

  • 数据源的 baseUrl/timeoutMs 为按请求读取qmt-bridge-rest.js),激活切换只需更新数据源实例字段,无需重建实例,「立即切换」实现成本低;
  • QMT Bridge 已有 /health 端点(插件启动检查在用),「测试连接」可直接复用;
  • 策略配置已有 settings namespace + CRUD + 设置页子 tab 完整先例,连接配置存储可复用该模式。

功能范围(定稿)

  1. 设置页新增「QMT 连接配置」子 tab(与现有「通用设置 / 策略分组」并列);
  2. 配置 CRUD:新增 / 编辑 / 删除 / 重命名;配置字段为名称(识别用)+ HTTP 地址(必填);超时不纳入表单(Q5);
  3. 激活:单选激活,一次只能激活一个;激活后立即切换生效,无需重启 DSHQ2);
  4. 默认:标记某配置为默认;启动时自动激活默认配置,运行中手动激活其他配置立即生效,重启后回到默认(Q1);
  5. 测试连接:手动触发,请求 /health 返回可达性与延迟;激活不强制先测试(Q3);
  6. 删除边界:允许删除激活配置(自动切换到默认);删除默认配置时默认标记转移到列表第一条并激活之;禁止删除最后一条Q6);
  7. 会话头部快捷切换:在会话窗口顶栏注册下拉控件(slot conversation.session.header.actions,与 DSH 内置 PTC 模式标签并排):chip 形态显示 QMT: <激活配置名>,点开列出全部配置(激活项勾选标记),点选即激活并 toast 反馈;头部控件仅做切换,配置的增删改/测试连接/默认标记仍在设置页子 tab(Q9/Q10)。

存储:复用现有 one-divine-lot settings namespace(与策略配置同机制),不新增独立存储文件(Q8)。

不做

  • 认证/多账户支持(QMT Bridge 当前无鉴权,未来扩展);
  • 连接状态监控(如断线重连策略)—— 后续;
  • 超时(timeoutMs)配置化 —— 保持代码默认 15000ms(Q5);
  • 宿主配置(cordis.patch.yml qmtBaseUrl)自动迁移 —— 首次使用手动录入(Q4);
  • 激活前强制连通性校验 —— 测试连接为手动操作(Q3)。

待确认问题(Q1-Q10,已确认)

2026-08-29 由老师逐条拍板(AI 提议 + 老师确认)。Q8(存储位置)与 Q9/Q10(快捷切换)为当轮讨论新增。

# 问题 状态 确认日期 结论摘要
Q1 「默认」的语义:默认 = 插件启动时自动激活的配置?还是仅作为列表中的默认选中项?手动激活非默认配置后,下次启动是否回到默认? 已确认 2026-08-29 默认 = 插件启动时自动激活的配置;运行中手动激活其他配置立即生效,重启后回到默认
Q2 生效机制:激活配置后立即切换(动态重建数据源,无需重启 DSH)?还是保存后重启生效?(当前数据源在插件 apply 时创建一次,改为动态切换需调整架构) 已确认 2026-08-29 激活后立即切换:更新数据源实例的 baseUrl 即可,无需重启 DSH(代码审查已核实:数据源按请求读取地址,改动成本低)
Q3 是否提供「测试连接」按钮:验证地址可达(请求 /health 检查 status=ok),帮助确认配置正确? 已确认 2026-08-29 提供,手动测:请求 /health 返回可达性与延迟;激活本身不强制先测试(复用现有 /health 端点)
Q4 现有宿主配置迁移cordis.patch.yml 中的 qmtBaseUrl192.168.3.43:8610)如何处理 —— 首次启动时作为初始默认配置自动迁入设置页? 已确认 2026-08-29 不迁移:首次使用手动录入配置
Q5 超时是否纳入配置项:timeoutMs 是否需要出现在配置表单(可选字段),还是保持代码默认值? 已确认 2026-08-29 不纳入表单:timeoutMs 保持代码默认 15000ms
Q6 删除/切换边界:删除当前激活配置时如何处理(禁止删除?自动切换到默认?);删除默认配置时默认标记如何转移? 已确认 2026-08-29 允许删除激活配置,删除后自动切换到默认配置;删除的若是默认配置,默认标记转移到列表第一条并激活之;禁止删除最后一条配置
Q7 优先级:老师定级(P0-P2?)—— 建议 P1(提升多环境可用性,单地址当前可用) 已确认 2026-08-29 P1
Q8 配置存储位置2026-08-29 讨论新增):连接配置存储于何处? 已确认 2026-08-29 复用现有 one-divine-lot settings namespace(与策略配置同机制),不新增独立存储文件
Q9 快捷切换入口位置2026-08-29 讨论新增):会话窗口顶栏(PTC 模式标签旁)?新建会话页?两处都放? 已确认 2026-08-29 会话头部,PTC 模式标签旁slot conversation.session.header.actions,多实例挂载点已核实可并排注册,无需改动宿主)
Q10 头部菜单能力2026-08-29 讨论新增):仅切换激活?含每项测试连接?含管理入口? 已确认 2026-08-29 仅切换激活:列出配置、点选激活 + toast 反馈;测试连接与配置管理留在设置页

讨论记录

追加式记录:日期 · 轮次 · 结论。

  • 2026-08-29 · 第一轮(代码审查 + 逐条拍板)
    • 讨论前代码审查补充三项事实(见「现状分析」补充节):① 数据源 baseUrl/timeoutMs 按请求读取,「立即切换」成本低;② /health 端点可复用做测试连接;③ 策略配置的 settings namespace + CRUD + 设置页子 tab 模式可复用。
    • 讨论中新增 Q8(配置存储位置),连同原 Q1-Q7 共 8 项由老师逐条拍板,结论见上表。
    • 定稿确认环节:老师反馈「还有要调整的」,追问具体调整点未获选择。故 Q1-Q8 结论按已确认记录,R-004 暂不定稿,等待老师补充调整点后继续讨论。
    • 文档整合:待确认问题清单与讨论记录并入本文档(老师要求保留一份),原独立文件 R-004-待确认问题.md 删除;「功能范围」一节同步按已确认决策对齐(超时移入不做、补充测试连接与删除边界、标注 Q 编号)。
  • 2026-08-29 · 第二轮(新增会话头部快捷切换功能)
    • 老师提出新功能:会话窗口顶栏(PTC 模式标签旁)增加 QMT 连接快捷切换,避免每次进设置页修改。
    • AI 前置技术调研结论:PTC 标签为 DSH 内置客户端插件 ui-agent-preset 向 slot conversation.session.header.actions 注册的会话头部标签;该 slot 为多实例挂载点(按 order 排序、多插件共存),本插件可并排注册控件,无需改动宿主;DSH 预设标签做成只读是因宿主禁止会话中途更换预设,而 QMT 激活是插件自管逻辑(Q2 已定立即切换),头部放真切换控件成立。
    • 老师拍板:功能并入 R-004(不拆独立需求);入口定会话头部 PTC 标签旁Q9);头部菜单仅切换激活(Q10)。管理能力(增删改/测试连接/默认标记)仍在设置页子 tab。
  • 2026-08-29 · 第三轮(定稿)
    • 老师确认需求定稿。三要素核验:① 边界清楚(做/不做清单完整,含快捷切换);② 核心逻辑明确(Q1-Q10 全部有结论,含存储、生效机制、删除边界、入口与菜单能力);③ 老师明确确认。
    • 决策沉淀:产品约束-005/006、技术约束-008/009(含技术约束-003 关联变更标注)、UI约束-001/002。
    • 派生计划:PLAN-003(计划-QMT连接配置.md),进入执行范围。

实现记录

内容
实现迭代 03-QMT连接配置
实现方式 沿用独立插件 one-divine-lot(服务端 + 客户端改造)
服务端 settings.jsqmtConnections schema + CRUD/激活/默认/启动解析 9 函数)、qmt-bridge-rest.jssetBaseUrl 热切换)、index.js(启动激活地址解析 + dataSource 注入)、api.js7 个 qmt-connections/* 端点 + /health 代理测试 + 激活/编辑/删除热切换编排)
客户端 QmtConnectionChip.jsx(会话头部快捷切换 chipslot conversation.session.header.actions order=-9)、SettingsSection.jsx(「QMT 连接配置」第三个子 tab,卡片形式)、client/index.js(头部 slot 注册)
构建安装 pnpm run build(服务端 ESM + 客户端 CJS bundle + wrap);profile 为 link 引用,构建即生效(服务端需宿主重启加载)

实现期间调整(2026-08-29,老师反馈):① chip 空配置态由「隐藏」改为「显示 + 引导提示」(消除空态不可见问题);② 设置页配置由列表形式改为卡片形式(自适应网格 + 长文本单行省略悬停看全文,UI约束-002 变更)。

验收结果(2026-08-29 线上实测,详见 docs/04-迭代记录/03-QMT连接配置/验收标准.md

  • 标准 1:设置页子 tab + 配置 CRUD(实录 GEMWIN / QMT_CYY 两条真实配置)
  • 标准 2:激活立即切换(切不可达配置 → 持仓立即失败;切回 → 立即恢复;全程无重启)
  • 标准 3:默认/启动行为(单测覆盖启动激活默认并回写、cordis 兜底;线上激活=默认一致)
  • 标准 4:测试连接(GEMWIN 可达 726msQMT_CYY 不可达 10.1s;激活无预检,符合 Q3)
  • 标准 5:删除边界(线上实测删激活配置自动切回默认;删默认转移/禁删最后一条由单测覆盖)
  • 标准 7:现有功能不回归(持仓/策略端点正常返回真实数据)
  • 标准 6:会话头部 chip —— 老师确认完成并标记 R-004 已完成(2026-08-29

经验沉淀

  • 服务端改动需重启宿主:客户端 bundle 页面刷新即加载,服务端模块(api.js/settings.js 等)宿主启动时装入内存——"设置页报 unknown method 但页面能看到新 UI" 即两侧版本差的典型症状
  • 空态可见性:入口控件「无数据即隐藏」在「数据需要经该入口创建」时形成死锁,空态应显示并给引导
  • 数据源热切换可行性:baseUrl 为按请求读取的实例字段,运行期改字段即生效——无需重建实例/重启宿主(技术约束-008 的事实依据)
  • profile link 安装形态:插件以 symlink 指向工作区时,构建产物即宿主加载物,dsh plugin add 无需重复执行
  • 拼音 slug 兜底:映射表外中文名会兜底为通用 id(如 qmt-conn),后续可扩词表或时间戳后缀增强区分度

关联文档

  • 迭代记录:docs/04-迭代记录/03-QMT连接配置/(迭代目标 / 技术实现方案 / 验收标准)
  • 计划:docs/02-计划/计划-QMT连接配置.mdPLAN-003
  • 设计约束:产品约束-005/006、技术约束-003(变更标注)/008/009、UI约束-001/002