Files
biz_firstpage/doc/market-ranking-known-issues.md
T

141 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# market-ranking 当前状态与待确认项
`src/main/ets/market-ranking/` 来自 `futures-homepage/CardHarmoyos` 参考工程,现已按首页主代码流程完成以下收口:
- 卡片配置并入 `rawfile/first_page_cards_config.json`,由 `FirstPageCardsConfigLoader` 统一读取。
- 推荐合约通过 `@kit.NetworkKit``buildHeader()` 和资源 URL 发起真实 HTTP 请求。
- 行情统一使用 `node/clients/MarketRankingHqRequestClient.ets`,接入 `TableRequestClient`
`RequestHelper``TableData``applyStandardPriceToTableData`
- TCP 重连改用 `EmitterConstants.NETWORK_TCP_RECONNECT`,监听随首页可见性注册和注销。
- 页面隐藏、组件销毁、Tab 切换和下拉刷新都会释放旧行情订阅。
- 异步榜单请求和行情回调均有版本校验,避免旧 Tab 数据覆盖当前页面。
- HTTP 原始合约列表与 `@State cardData` 分开保存,重连不会因行情漏行丢失订阅标的。
- 行点击通过 `jumpToQuote()` 对齐 `futures-homepage``jumpToFenShi`
- 已移除 Mock 行情客户端、Mock 榜单、自定义 TableData、自建事件总线和重复卡片配置模型。
## 后续优化设计:拆分 UI 与业务配置
当前 `MarketRankingConstant.ets``TAB_METRICS` / `PERIOD_RANGES` 同时包含 `$r()` 文案、HTTP
`quote_type` 和行情 `sortid`。因此 `MarketRankingDataFetcher``MarketRankingHqRequestClient`
间接依赖 UI 资源。
计划拆为两层:
1. `MarketRankingConfig.ets`:纯业务配置,不包含 `$r()` / `ResourceStr`。定义一级指标 ID、HTTP API
参数、行情排序字段、排序方向、是否包含周期,以及二级周期的 API 参数和行情字段。
2. `MarketRankingUiConfig.ets`:只负责指标和周期 ID 到资源文案的映射,仅由
`MarketRankingNodeComponent` 引用。
一级指标顺序必须只在 `MarketRankingConfig.ets` 维护一份。View 直接遍历该配置,并通过
`getMetricLabel(id)` / `getPeriodLabel(id)` 获取文案,避免 UI 数组和业务数组下标错位。
迁移时同步完成:
- 用枚举替代散落的 `'rise'``'fallSpeed'``'turnOver'` 等字符串判断。
-`sortOrder` 写入指标配置,删除行情客户端对跌幅/跌速的硬编码判断。
- DataFetcher 仅使用 `api` / `hasPeriods`;行情客户端仅使用 `sortId` / `sortOrder`
- 删除旧 `TabMetric.label``PeriodRange.label` 字段及相关 `ResourceStr` 依赖。
## 后续优化设计:拆分 MarketRankingNodeComponent
`MarketRankingNodeComponent.ets` 当前同时负责页面状态、生命周期、HTTP 请求编排、HQ 订阅、TCP 重连、
跳转参数、展示计算和 UI 构建。后续按以下职责拆分:
- `MarketRankingNodeComponent.ets`:继续作为唯一状态拥有者,保留 `@State`、生命周期、请求/订阅版本保护、
Tab 选择、跳转和子组件回调编排。
- `MarketRankingDisplayHelper.ets`:承载第三列标题、值、颜色、展示行数和空状态高度等纯展示计算。
- `components/MarketRankingTitleBar.ets`:标题、说明入口和展开/收起交互。
- `components/MarketRankingTabBar.ets`:一级/二级 Tab,以及滚动宽度、偏移量和右侧渐变等局部 UI 状态。
- `components/MarketRankingTable.ets`:表头、加载/空状态、行情行和行点击回调。
- `components/MarketRankingExplainSheet.ets`:说明弹层内容;`bindSheet` 显隐状态仍由主组件控制。
分阶段实施,避免重构时破坏行情时序:
1. 先拆业务/UI 配置和纯展示计算,不改变请求及订阅流程。
2. 再拆 `TabBar``Table`,主组件通过明确参数和回调传递状态。
3. 最后清理无效 `isDarkMode` 状态、未使用回调参数、重复布局常量及命名不一致。
暂不把 HTTP、HQ、请求版本、页面可见性和 TCP 重连拆入多个 ViewModel/Controller。这些逻辑存在严格的
“旧请求失效 → 释放订阅 → HTTP 返回 → 版本校验 → HQ 订阅 → 回调校验”时序;应先完成宿主生命周期和
重连验证,再评估是否继续抽取控制器。
## 宿主工程验证状态
- 已验证通过:1. 行情字段、2. 基准价计算、3. HTTP 推荐合约接口、4. 4106 行情请求。
- 仍需确认:5. 生命周期与重连、6. 跳转与配置、7. UI 与性能。
### 1. 行情字段(已验证通过)
验证日期:2026-07-28。
`market-ranking/TableConstants.ets` 按主代码命名维护 4106 字段。虽然成交额、日增仓、
1/5/10/15 分钟涨跌速、昨收和今开等字段无法在当前 HAR 的依赖源码中核验,但已在宿主实际使用的
`@b2c/lib_baseui` 和行情协议版本中确认字段 ID。
已逐项验证涨幅、跌幅、1/5/10/15 分钟涨速和跌速、成交额、日增仓 Tab。每个 Tab 的 `sortid`
排序方向、第三列字段和值均正确,未出现整列 `--` 或排序方向相反。
### 2. 基准价计算(已验证通过)
验证日期:2026-07-28。
`MarketRankingHqRequestClient` 已按 `FirstPageSelfStockRequestClient` 补齐
`applyStandardPriceToTableData` 所需字段,包括 `DATA_ID_ZD``DATA_ID_MARKET_OLD` 以及
`StandardPriceTypeHelper` 提供的昨收、今开、昨结字段。4106 请求同时携带 `update=1` 和当前
`computemode`,使服务端排序口径与客户端展示口径保持一致。
当前 HAR 无法查看宿主 `biz_quote``@b2c/lib_baseui` 和 4106 服务实现;现已在宿主确认排序场景
`qht_qihuo_sort` 支持 `computemode`,并完成以下验证:
分别选择昨收、今开、昨结作为基准价,验证结果如下:
- 最新价不变,涨跌幅按当前基准价重新计算。
- 页面隐藏后修改基准价,再返回首页会重新订阅并更新。
- 首包和后续实时推送采用相同计算口径。
- 涨幅、跌幅列表顺序与当前基准价下展示的涨跌幅一致。
### 3. HTTP 推荐合约接口(已验证通过)
验证日期:2026-07-28。
在测试和生产环境验证 `recommend_futures`
- UA、Cookie 和登录状态满足接口要求。
- 返回结构为 `{ code, data }``contract_code``contract_name``market` 类型正确。
-`quote_type` 返回对应榜单,空数据、非 200、业务错误码和 JSON 异常进入空状态且不崩溃。
- 快速切换 Tab 时,旧请求不会覆盖当前 Tab。
### 4. 4106 行情请求(已验证通过)
验证日期:2026-07-28。
确认请求参数首行格式、`\r\n` 分隔、`dataitem``codelist``scenario``pushtime` 能被宿主行情服务识别。
验证首包、2.5 秒推送、排序和释放订阅均正常;页面隐藏后不再收到有效 UI 更新。
### 5. 生命周期与重连
验证以下操作不存在重复订阅、旧数据覆盖或资源泄漏:
- 首页前后台切换、Tab 页切换、组件销毁和重新创建。
- 下拉刷新过程中快速切换一级、二级 Tab。
- HTTP 请求未完成时隐藏或销毁页面。
- TCP 断开后重连;重连应使用完整的原始合约列表,而不是行情首包中的部分行。
### 6. 跳转与配置
- 行点击应与 `futures-homepage``jumpToFenShi` 一致,进入对应合约的分时页。
- 传入 `jumpToQuote()` 的代码、市场、名称列表顺序必须一致。
- 标题 `card_url` 在当前本地配置中为空;真实配置提供 Android URL 后再验证标题跳转和箭头显示。
### 7. UI 与性能
- 加载中、空数据和正常数据状态切换正确。
- 展开/收起只展示 3/5 行,行情更新后行内容及时刷新。
- 深浅色、说明弹层、长合约名和大数字格式正确。
- 连续行情推送下观察 `ForEach` 动态 Key 重建行的性能,确认无明显掉帧。
### 构建验证
本仓库缺少 `hvigorw``oh_modules` 和相邻 `biz_quote`,无法独立编译。最终需在宿主应用中验证 HTTP、
4106 首包/推送、TCP 重连、基准价切换、快速切换 Tab 和页面前后台切换。