Initial commit: @b2c/first_page HarmonyOS stage-mode HAR
## Repository - HarmonyOS stage-mode HAR module, consumed by host app - No standalone build — hvigorw, oh_modules, and ../biz_quote absent here ## Architecture ### Feed Cards - FirstPage.createNodeView dispatches cards by FirstPageConstant.KEY_* - Card config from first_page_cards_config.json loaded by FirstPageCardsConfigLoader - Public entrypoint: Index.ets ### Market Ranking (src/main/ets/market-ranking/) - HTTP: MarketRankingDataFetcher fetches recommend_futures contracts - HQ: MarketRankingHqRequestClient subscribes via 4106/frame 2201/scenario qht_qihuo_sort - TCP reconnect rebuilds subscription from original HTTP contract list - Async callbacks guarded by request/subscription versions ### Other Cards - HotList, CommodityOptions, AiDiagnosis, AiRiseFall, SelfSelectedStock, CustomEntryList, FourEntryList - Each has DataFetcher + HQ request client + NodeComponent ## Key Changes (from CardHarmonyOS reference) - Added MetricId, PeriodId, SortOrder enums (MarketRankingModels.ets) - Replaced string comparisons with enum switches in thirdColumnTitle/Value/Color - Removed redundant undefined guards in thirdColumnColor/priceColor, delegated to riseFallColor - Inlined priceColor(), use riseFallColor directly - Tab bar Stack.height(30), Alignment.End (reverted from 46/TopEnd) - Name column fontWeight removed (default regular)
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
# 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` 依赖。
|
||||
|
||||
## 仍需在宿主工程确认
|
||||
|
||||
### 1. 行情字段
|
||||
|
||||
`market-ranking/TableConstants.ets` 按主代码命名维护 4106 字段。基础字段名称已经对齐,但成交额、日增仓、
|
||||
1/5/10/15 分钟涨跌速、昨收和今开等字段无法在当前 HAR 的依赖源码中核验。需要在宿主实际使用的
|
||||
`@b2c/lib_baseui` 和行情协议版本中确认字段 ID。
|
||||
|
||||
逐项验证涨幅、跌幅、1/5/10/15 分钟涨速和跌速、成交额、日增仓 Tab。预期每个 Tab 的 `sortid`、
|
||||
排序方向、第三列字段和值均正确,不出现整列 `--` 或排序方向相反。
|
||||
|
||||
### 2. 基准价计算
|
||||
|
||||
`applyStandardPriceToTableData` 已接入,但需要确认传入的 `fieldIds` 是否包含宿主实现要求的全部字段,
|
||||
特别是 `DATA_ID_ZD`、`DATA_ID_MARKET_OLD` 以及昨收、今开、昨结字段。
|
||||
|
||||
分别选择昨收、今开、昨结作为基准价,验证:
|
||||
|
||||
- 最新价不变,涨跌幅按当前基准价重新计算。
|
||||
- 页面隐藏后修改基准价,再返回首页会重新订阅并更新。
|
||||
- 首包和后续实时推送采用相同计算口径。
|
||||
|
||||
### 3. HTTP 推荐合约接口
|
||||
|
||||
在测试和生产环境验证 `recommend_futures`:
|
||||
|
||||
- UA、Cookie 和登录状态满足接口要求。
|
||||
- 返回结构为 `{ code, data }`,`contract_code`、`contract_name`、`market` 类型正确。
|
||||
- 各 `quote_type` 返回对应榜单,空数据、非 200、业务错误码和 JSON 异常进入空状态且不崩溃。
|
||||
- 快速切换 Tab 时,旧请求不会覆盖当前 Tab。
|
||||
|
||||
### 4. 4106 行情请求
|
||||
|
||||
确认请求参数首行格式、`\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 和页面前后台切换。
|
||||
Reference in New Issue
Block a user