refactor: reorganize first page card modules

This commit is contained in:
clz
2026-07-30 16:35:47 +08:00
parent f75936a9bf
commit 7b123ec5f9
22 changed files with 174 additions and 1254 deletions
-17
View File
@@ -1,17 +0,0 @@
export const MAX_TABS = 5;
export const MAX_ITEMS = 3;
export const MAX_TAGS = 3;
export const MAX_SHOW_KEYS = 3;
export const MAX_DOUBLE_KEYS = 2;
export const BLACK_LIST: string[] = [
'合约代码',
'合约简称',
'收盘价',
'最新价',
'涨跌幅',
'code',
'market_id',
'market_code',
'最新涨跌幅',
];
File diff suppressed because it is too large Load Diff
@@ -23,8 +23,8 @@ import { AiDiagnosisNodeComponent } from '../../node/view/AiDiagnosisNodeCompone
import { AiRiseFallNodeComponent } from '../../node/view/AiRiseFallNodeComponent'
import { HotListNodeComponent } from '../../node/view/HotListNodeComponent'
import { CommodityOptionsNodeComponent } from '../../node/view/CommodityOptionsNodeComponent'
import { MarketRankingNodeComponent } from '../../market-ranking/MarketRankingNodeComponent'
import { AiPickNodeComponent } from '../../ai-pick/AiPickNodeComponent'
import { MarketRankingNodeComponent } from '../../node/view/MarketRankingNodeComponent'
import { AiPickNodeComponent } from '../../node/view/AiPickNodeComponent'
/**
+17
View File
@@ -0,0 +1,17 @@
export const MAX_TABS = 5;
export const MAX_ITEMS = 3;
export const MAX_TAGS = 3;
export const MAX_SHOW_KEYS = 3;
export const MAX_DOUBLE_KEYS = 2;
export const BLACK_LIST: Resource[] = [
$r('app.string.ai_pick_contract_code'),
$r('app.string.ai_pick_contract_nickname'),
$r('app.string.ai_pick_close_price'),
$r('app.string.ai_pick_latest_price'),
$r('app.string.ai_pick_change_percent'),
$r('app.string.ai_pick_code'),
$r('app.string.ai_pick_market_id'),
$r('app.string.ai_pick_market_code'),
$r('app.string.ai_pick_latest_change_percent'),
];
@@ -1,20 +1,21 @@
import { MetricId, PeriodId, PeriodRange, SortOrder, TabMetric } from './MarketRankingModels';
import { TableConstants } from './TableConstants';
import { MetricId, PeriodId, PeriodRange, SortOrder, TabMetric } from '../node/model/MarketRankingModels';
import { XTableConstants } from './MarketRankingTableConstants';
import { TableConstants } from "@b2c/lib_baseui";
// 一级 Tab 配置:涨幅/跌幅/涨速/跌速/成交额/日增仓。
export const TAB_METRICS: TabMetric[] = [
{ id: MetricId.RISE, label: $r('app.string.market_ranking_tab_rise'), api: 'rise_percent', hqId: TableConstants.DATA_ID_ZF, sortOrder: SortOrder.ASC, hasChildren: false },
{ id: MetricId.FALL, label: $r('app.string.market_ranking_tab_fall'), api: 'fall_percent', hqId: TableConstants.DATA_ID_ZF, sortOrder: SortOrder.DESC, hasChildren: false },
{ id: MetricId.RISE_SPEED, label: $r('app.string.market_ranking_tab_rise_speed'), api: 'rise_percent', hqId: TableConstants.DATA_ID_CHG_SPEED_1MIN, sortOrder: SortOrder.ASC, hasChildren: true },
{ id: MetricId.FALL_SPEED, label: $r('app.string.market_ranking_tab_fall_speed'), api: 'fall_percent', hqId: TableConstants.DATA_ID_CHG_SPEED_1MIN, sortOrder: SortOrder.DESC, hasChildren: true },
{ id: MetricId.TURN_OVER, label: $r('app.string.market_ranking_tab_turnover'), api: 'turnover', hqId: TableConstants.DATA_ID_TURNOVER, sortOrder: SortOrder.ASC, hasChildren: false },
{ id: MetricId.INCRE_POSIT, label: $r('app.string.market_ranking_tab_increase_position'), api: 'increase_position', hqId: TableConstants.DATA_ID_INCRE_POSIT, sortOrder: SortOrder.ASC, hasChildren: false },
{ id: MetricId.RISE_SPEED, label: $r('app.string.market_ranking_tab_rise_speed'), api: 'rise_percent', hqId: XTableConstants.DATA_ID_CHG_SPEED_1MIN, sortOrder: SortOrder.ASC, hasChildren: true },
{ id: MetricId.FALL_SPEED, label: $r('app.string.market_ranking_tab_fall_speed'), api: 'fall_percent', hqId: XTableConstants.DATA_ID_CHG_SPEED_1MIN, sortOrder: SortOrder.DESC, hasChildren: true },
{ id: MetricId.TURN_OVER, label: $r('app.string.market_ranking_tab_turnover'), api: 'turnover', hqId: XTableConstants.DATA_ID_TURNOVER, sortOrder: SortOrder.ASC, hasChildren: false },
{ id: MetricId.INCRE_POSIT, label: $r('app.string.market_ranking_tab_increase_position'), api: 'increase_position', hqId: TableConstants.DATA_ID_RZC, sortOrder: SortOrder.ASC, hasChildren: false },
];
// 二级 Tab 配置:仅涨速/跌速下出现,按周期筛选
export const PERIOD_RANGES: PeriodRange[] = [
{ id: PeriodId.ONE_MIN, label: $r('app.string.market_ranking_period_1min'), api: 'one_minute', hqId: TableConstants.DATA_ID_CHG_SPEED_1MIN },
{ id: PeriodId.FIVE_MIN, label: $r('app.string.market_ranking_period_5min'), api: 'five_minute', hqId: TableConstants.DATA_ID_CHG_SPEED_5MIN },
{ id: PeriodId.TEN_MIN, label: $r('app.string.market_ranking_period_10min'), api: 'ten_minute', hqId: TableConstants.DATA_ID_CHG_SPEED_10MIN },
{ id: PeriodId.FIFTEEN_MIN, label: $r('app.string.market_ranking_period_15min'), api: 'fifteen_minute', hqId: TableConstants.DATA_ID_CHG_SPEED_15MIN },
{ id: PeriodId.ONE_MIN, label: $r('app.string.market_ranking_period_1min'), api: 'one_minute', hqId: XTableConstants.DATA_ID_CHG_SPEED_1MIN },
{ id: PeriodId.FIVE_MIN, label: $r('app.string.market_ranking_period_5min'), api: 'five_minute', hqId: XTableConstants.DATA_ID_CHG_SPEED_5MIN },
{ id: PeriodId.TEN_MIN, label: $r('app.string.market_ranking_period_10min'), api: 'ten_minute', hqId: XTableConstants.DATA_ID_CHG_SPEED_10MIN },
{ id: PeriodId.FIFTEEN_MIN, label: $r('app.string.market_ranking_period_15min'), api: 'fifteen_minute', hqId: XTableConstants.DATA_ID_CHG_SPEED_15MIN },
];
@@ -0,0 +1,11 @@
// 市场排名使用的 4106 行情字段 ID,且"@b2c/lib_baseui"的TableConstants不存在的
export class XTableConstants {
static readonly DATA_ID_TURNOVER: number = 19; // 成交额
static readonly DATA_ID_CHG_SPEED_1MIN: number = 34874; // 1 分钟涨跌速
static readonly DATA_ID_CHG_SPEED_5MIN: number = 34325; // 5 分钟涨跌速
static readonly DATA_ID_CHG_SPEED_10MIN: number = 34875; // 10 分钟涨跌速
static readonly DATA_ID_CHG_SPEED_15MIN: number = 34876; // 15 分钟涨跌速
private constructor() {
}
}
@@ -11,9 +11,9 @@ import {
RawPickTabItem,
RawStrategyDetail,
RawStrategyItem,
} from './AiPickModels';
import { getResData, getTableList, ResData } from './AiPickUtils';
import { MAX_ITEMS, MAX_TABS, MAX_TAGS } from './AiPickConstant';
} from '../node/model/AiPickModels';
import { getResData, getTableList, ResData } from '../util/AiPickUtils';
import { MAX_ITEMS, MAX_TABS, MAX_TAGS } from '../constants/AiPickConstant';
const EMPTY_RAW_STRATEGY_ITEM: RawStrategyItem = {};
const EMPTY_RAW_STRATEGY_DETAIL: RawStrategyDetail = {
@@ -22,7 +22,7 @@ const EMPTY_RAW_STRATEGY_DETAIL: RawStrategyDetail = {
strategy_type: '',
};
function parseRawTab(item: RawPickTabItem): PickTabData {
function parseRawTab(context: Context, item: RawPickTabItem): PickTabData {
const isSystemPeriod: boolean = item.type === 'system_period';
const strategyItem: RawStrategyItem = (
isSystemPeriod ? item.system_strategy : item.custom_strategy
@@ -30,7 +30,7 @@ function parseRawTab(item: RawPickTabItem): PickTabData {
const strategyDetail: RawStrategyDetail = (
isSystemPeriod ? strategyItem.system_strategy : strategyItem.custom_strategy
) ?? EMPTY_RAW_STRATEGY_DETAIL;
const resData: ResData = getResData(strategyItem);
const resData: ResData = getResData(context, strategyItem);
const allItems: PickContractItem[] =
getTableList(resData.list, resData.resultValueList);
const strategy: PickStrategy = {
@@ -57,10 +57,10 @@ function parseRawTab(item: RawPickTabItem): PickTabData {
return tabData;
}
function parseRawTabs(rawTabs: RawPickTabItem[]): PickTabData[] {
function parseRawTabs(context: Context, rawTabs: RawPickTabItem[]): PickTabData[] {
return rawTabs
.slice(0, MAX_TABS)
.map((item: RawPickTabItem): PickTabData => parseRawTab(item));
.map((item: RawPickTabItem): PickTabData => parseRawTab(context, item));
}
export class AiPickDataFetcher {
@@ -77,7 +77,7 @@ export class AiPickDataFetcher {
return FirstPageCardsConfigLoader.getConfig()?.aiPick;
}
async fetchCardData(): Promise<PickTabData[]> {
async fetchCardData(context: Context): Promise<PickTabData[]> {
const cardConfig: AllCardsCard | undefined = this.fetchCardConfig();
const modData: ModDataItem | undefined = cardConfig?.mod_data[0];
const configuredUrl: string = modData?.url ?? '';
@@ -105,7 +105,7 @@ export class AiPickDataFetcher {
if (responseCode !== 0 || result.data === undefined) {
throw new Error('response code: ' + responseCode);
}
return parseRawTabs(result.data);
return parseRawTabs(context, result.data);
} catch (requestError) {
const errorInfo: Error = requestError as Error;
HXLog.e('AiPickDataFetcher', 'fetchCardData error: ' + errorInfo.message);
@@ -1,21 +0,0 @@
// 市场排名使用的 4106 行情字段 ID。
export class TableConstants {
static readonly DATA_ID_CODE_4: number = 4; // 合约代码
static readonly DATA_ID_PRE_PRICE: number = 6; // 昨收价
static readonly DATA_ID_OPEN_PRICE: number = 7; // 今日开盘价
static readonly DATA_ID_PRICE: number = 10; // 最新价
static readonly DATA_ID_TURNOVER: number = 19; // 成交额
static readonly DATA_ID_NAME: number = 55; // 合约名称
static readonly DATA_ID_JSJ: number = 66; // 昨日结算价
static readonly DATA_ID_CHG_SPEED_5MIN: number = 34325; // 5 分钟涨跌速
static readonly DATA_ID_INCRE_POSIT: number = 34355; // 日增仓
static readonly DATA_ID_ZF: number = 34818; // 涨跌幅
static readonly DATA_ID_CHG_SPEED_1MIN: number = 34874; // 1 分钟涨跌速
static readonly DATA_ID_CHG_SPEED_10MIN: number = 34875; // 10 分钟涨跌速
static readonly DATA_ID_CHG_SPEED_15MIN: number = 34876; // 15 分钟涨跌速
static readonly DATA_ID_ZF_YTD: number = 34877; // 涨跌幅(昨结算价基准)
static readonly DATA_ID_MARKET: number = 36103; // 市场 ID
private constructor() {
}
}
@@ -11,8 +11,8 @@ import {
CardData,
PickContractItem,
PickTabData,
} from '../../ai-pick/AiPickModels';
import { getUniqueContracts } from '../../ai-pick/AiPickUtils';
} from '../model/AiPickModels';
import { getUniqueContracts } from '../../util/AiPickUtils';
const FRAME_ID = 2201;
const PAGE_ID = 4106;
@@ -1,5 +1,5 @@
import { AbsRowData, RowData, TableData } from '@b2b/hq_table';
import { TableConstants as BaseTableConstants, TableRequestClient } from '@b2c/lib_baseui';
import { TableConstants as BaseTableConstants, TableConstants, TableRequestClient } from '@b2c/lib_baseui';
import { RequestHelper, StuffTableStruct } from '@kernel/lib_communication';
import {
QuoteCustomSettingManager,
@@ -12,12 +12,12 @@ import {
RankItem,
RecommendFuturesItem,
TabMetric,
} from '../../market-ranking/MarketRankingModels';
} from '../model/MarketRankingModels';
import {
PERIOD_RANGES,
TAB_METRICS,
} from '../../market-ranking/MarketRankingConstant';
import { TableConstants } from '../../market-ranking/TableConstants';
} from '../../constants/MarketRankingConstant';
import { XTableConstants } from '../../constants/MarketRankingTableConstants';
const FRAME_ID = 2201;
const PAGE_ID = 4106;
@@ -90,10 +90,10 @@ class MarketRankingTableRequestClient extends TableRequestClient {
};
item.price = this.getNumber(row, TableConstants.DATA_ID_PRICE);
item.price_chg = this.getNumber(row, TableConstants.DATA_ID_ZF);
if (this.sortId === TableConstants.DATA_ID_TURNOVER) {
item.turnover = this.getNumber(row, TableConstants.DATA_ID_TURNOVER);
} else if (this.sortId === TableConstants.DATA_ID_INCRE_POSIT) {
item.incre_posit = this.getNumber(row, TableConstants.DATA_ID_INCRE_POSIT);
if (this.sortId === XTableConstants.DATA_ID_TURNOVER) {
item.turnover = this.getNumber(row, XTableConstants.DATA_ID_TURNOVER);
} else if (this.sortId === TableConstants.DATA_ID_RZC) {
item.incre_posit = this.getNumber(row, TableConstants.DATA_ID_RZC);
} else if (this.sortId !== TableConstants.DATA_ID_ZF) {
item.chg_speed = this.getNumber(row, this.sortId);
}
@@ -1,14 +1,14 @@
import { http } from '@kit.NetworkKit';
import { HXLog } from 'biz_common';
import { buildHeader } from '../util/Header';
import { FirstPageDebugUtil } from '../util/FirstPageDebugUtil';
import { FirstPageCardsConfigLoader } from '../node/datacenter/FirstPageCardsConfigLoader';
import { AllCardsCard } from '../node/model/AiDiagnosisNodeModel';
import { buildHeader } from '../../util/Header';
import { FirstPageDebugUtil } from '../../util/FirstPageDebugUtil';
import { FirstPageCardsConfigLoader } from './FirstPageCardsConfigLoader';
import { AllCardsCard } from '../model/AiDiagnosisNodeModel';
import {
RecommendFuturesItem,
RecommendFuturesResponse,
} from './MarketRankingModels';
import { PERIOD_RANGES, TAB_METRICS } from './MarketRankingConstant';
} from '../model/MarketRankingModels';
import { PERIOD_RANGES, TAB_METRICS } from '../../constants/MarketRankingConstant';
export class MarketRankingDataFetcher {
private static readonly instance: MarketRankingDataFetcher = new MarketRankingDataFetcher();
@@ -1,23 +1,23 @@
import { emitter } from '@kit.BasicServicesKit';
import { enableDarkMode } from '@kernel/theme_manager';
import { EmitterConstants, GlobalContext, jumpToQuote } from 'biz_common';
import { AiPickDataFetcher } from './AiPickDataFetcher';
import { AiPickHqRequestClient } from '../node/clients/AiPickHqRequestClient';
import { AiPickDataFetcher } from '../../datacenter/AiPickDataFetcher';
import { AiPickHqRequestClient } from '../clients/AiPickHqRequestClient';
import {
CardData,
PickContractItem,
PickStrategy,
PickTabData,
} from './AiPickModels';
} from '../model/AiPickModels';
import {
cellColor,
cellValue,
formatColName,
getUniqueContracts,
} from './AiPickUtils';
import { AllCardsCard } from '../node/model/AiDiagnosisNodeModel';
import { RouterUtil } from '../util/RouterUtil';
import { getResourceString } from '../util/ResourceUtil';
} from '../../util/AiPickUtils';
import { AllCardsCard } from '../model/AiDiagnosisNodeModel';
import { RouterUtil } from '../../util/RouterUtil';
import { getResourceString } from '../../util/ResourceUtil';
interface StrategyDescParams {
tabIdx: number;
@@ -168,7 +168,7 @@ export struct AiPickNodeComponent {
}
try {
const tabs: PickTabData[] =
await AiPickDataFetcher.getInstance().fetchCardData();
await AiPickDataFetcher.getInstance().fetchCardData(getContext());
if (!this.isCurrentDataRequest(requestVersion)) {
return;
}
@@ -4,19 +4,19 @@ import {
MetricId,
PeriodRange,
RankItem, RecommendFuturesItem, TabMetric,
} from './MarketRankingModels';
import { MarketRankingDataFetcher } from './MarketRankingDataFetcher';
} from '../model/MarketRankingModels';
import { MarketRankingDataFetcher } from '../datacenter/MarketRankingDataFetcher';
import {
cardDataToContracts,
contractsToPlaceholderCardData,
} from './MarketRankingDataMapper';
import { MarketRankingHqRequestClient } from '../node/clients/MarketRankingHqRequestClient';
import { formatGreatNumber, formatPercent, riseFallColor } from '../common/NumberFormat';
import { AllCardsCard } from '../node/model/AiDiagnosisNodeModel';
import { PERIOD_RANGES, TAB_METRICS } from './MarketRankingConstant';
} from '../../util/MarketRankingDataMapper';
import { MarketRankingHqRequestClient } from '../clients/MarketRankingHqRequestClient';
import { formatGreatNumber, formatPercent, riseFallColor } from '../../util/NumberFormat';
import { AllCardsCard } from '../model/AiDiagnosisNodeModel';
import { PERIOD_RANGES, TAB_METRICS } from '../../constants/MarketRankingConstant';
import { enableDarkMode } from '@kernel/theme_manager';
import { EmitterConstants, GlobalContext, jumpToQuote, PreferenceService } from 'biz_common';
import { RouterUtil } from '../util/RouterUtil';
import { RouterUtil } from '../../util/RouterUtil';
const NORMAL_SIZE = 3;
const MAX_SIZE = 5;
@@ -17,7 +17,7 @@ import { FistPageSelfCodeGridItemView } from '../../views/FistPageSelfCodeGridIt
import { HXUtils, TableConstants } from '@b2c/lib_baseui';
import { QuoteCustomSettingManager, StandardPriceType } from 'biz_quote';
//TableRowBGView TableConstants
//TableRowBGView XTableConstants
/**
* 每页显示item数量3
@@ -7,14 +7,15 @@ import {
RawFieldItem,
RawResultItem,
RawStrategyItem,
} from './AiPickModels';
import { BLACK_LIST, MAX_DOUBLE_KEYS, MAX_SHOW_KEYS } from './AiPickConstant';
} from '../node/model/AiPickModels';
import { BLACK_LIST, MAX_DOUBLE_KEYS, MAX_SHOW_KEYS } from '../constants/AiPickConstant';
import {
formatGreatNumber,
formatPercent,
formatPrice,
riseFallColor,
} from '../common/NumberFormat';
} from './NumberFormat';
import { getResourceString } from './ResourceUtil';
const EMPTY_EXTRA_FIELDS: Record<string, string> = {};
@@ -25,10 +26,11 @@ export interface ResData {
list: RawDetailItem[];
}
export function filterFieldKey(key: string): boolean {
export function filterFieldKey(context: Context, key: string): boolean {
const blackList = BLACK_LIST.map(value => getResourceString(context, value))
const extBlackList: string[] =
BLACK_LIST.map((value: string): string => `期货@${value}`);
const inBlack: boolean = BLACK_LIST.includes(key) || extBlackList.includes(key);
blackList.map((value: ResourceStr): string => `期货@${value}`);
const inBlack: boolean = blackList.includes(key) || extBlackList.includes(key);
const isChangeField: boolean =
key.startsWith('涨跌幅[') || key.startsWith('期货@涨跌幅[');
return !inBlack && !isChangeField;
@@ -39,6 +41,13 @@ export function formatBigData(value: number | string): string {
if (Number.isNaN(numericValue)) {
return `${value}`;
}
const formattedValue: number = Number(numericValue.toFixed(3));
const absoluteValue: number = Math.abs(formattedValue);
if (absoluteValue < 1e4) {
return `${formattedValue}`;
}
return formatGreatNumber(numericValue);
}
@@ -67,13 +76,13 @@ export function getResultValueList(
});
}
export function getResData(strategyItem: RawStrategyItem): ResData {
export function getResData(context: Context, strategyItem: RawStrategyItem): ResData {
const rawFieldList: RawFieldItem[] = strategyItem.field_list ?? [];
const resultList: RawResultItem[] = strategyItem.origin_result_list ?? [];
const list: RawDetailItem[] = strategyItem.detail_list ?? [];
const doubleList: RawFieldItem[] = rawFieldList.filter(
(field: RawFieldItem): boolean =>
field.type === 'DOUBLE' && filterFieldKey(field.key),
field.type === 'DOUBLE' && filterFieldKey(context, field.key),
);
const doubleListKeys: string[] =
doubleList.map((field: RawFieldItem): string => field.key);
@@ -113,12 +122,12 @@ export function getTableList(
export function getUniqueContracts(cardData: CardData): PickContractItem[] {
const contracts: PickContractItem[] = [];
const contractKeys: string[] = [];
const contractKeys: Set<string> = new Set();
cardData.tabs.forEach((tab: PickTabData): void => {
tab.items.forEach((item: PickContractItem): void => {
const contractKey: string = `${item.contract}_${item.market}`;
if (!contractKeys.includes(contractKey)) {
contractKeys.push(contractKey);
if (!contractKeys.has(contractKey)) {
contractKeys.add(contractKey);
contracts.push(item);
}
});
@@ -2,7 +2,7 @@ import {
CardData,
RankItem,
RecommendFuturesItem,
} from './MarketRankingModels';
} from '../node/model/MarketRankingModels';
export function cardDataToContracts(cardData: CardData): RecommendFuturesItem[] {
return cardData.tableList.map((item: RankItem): RecommendFuturesItem => ({
@@ -119,6 +119,42 @@
"name": "solid_grey_900",
"value": "#3B3B3B"
},
{
"name": "commodity_options_expire_label_color",
"value": "#CCA670"
},
{
"name": "hotlist_rank_bg_1",
"value": "#ff2436"
},
{
"name": "hotlist_rank_bg_2",
"value": "#ff661a"
},
{
"name": "hotlist_rank_bg_3",
"value": "#ff9500"
},
{
"name": "hotlist_red",
"value": "#ff2436"
},
{
"name": "hotlist_orange",
"value": "#ff661a"
},
{
"name": "hotlist_blue",
"value": "#3366ff"
},
{
"name": "hotlist_acid_blue",
"value": "#14ccbd"
},
{
"name": "hotlist_green",
"value": "#07ab4b"
},
{
"name": "hotlist_purple",
"value": "#b341d9"
@@ -307,6 +307,39 @@
{
"name": "card_explain_confirm",
"value": "我知道了"
},
{
"name": "ai_pick_contract_code",
"value": "合约代码"
},
{
"name": "ai_pick_contract_nickname",
"value": "合约简称"
},
{
"name": "ai_pick_close_price",
"value": "收盘价"
},
{
"name": "ai_pick_latest_price",
"value": "最新价"
}, {
"name": "ai_pick_change_percent",
"value": "涨跌幅"
},{
"name": "ai_pick_code",
"value": "code"
},
{
"name": "ai_pick_market_id",
"value": "market_id"
},{
"name": "ai_pick_market_code",
"value": "market_code"
},
{
"name": "ai_pick_latest_change_percent",
"value": "最新涨跌幅"
}
]
}