141 lines
7.8 KiB
Markdown
141 lines
7.8 KiB
Markdown
# 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 和页面前后台切换。
|