7.8 KiB
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 资源。
计划拆为两层:
MarketRankingConfig.ets:纯业务配置,不包含$r()/ResourceStr。定义一级指标 ID、HTTP API 参数、行情排序字段、排序方向、是否包含周期,以及二级周期的 API 参数和行情字段。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显隐状态仍由主组件控制。
分阶段实施,避免重构时破坏行情时序:
- 先拆业务/UI 配置和纯展示计算,不改变请求及订阅流程。
- 再拆
TabBar和Table,主组件通过明确参数和回调传递状态。 - 最后清理无效
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 和页面前后台切换。