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:
clz
2026-07-26 01:10:20 +08:00
commit af0025ce38
137 changed files with 13358 additions and 0 deletions
+100
View File
@@ -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 和页面前后台切换。