add AI pick card

This commit is contained in:
clz
2026-07-27 17:22:29 +08:00
parent 30d9154086
commit 10dc2787df
14 changed files with 1453 additions and 5 deletions
+122
View File
@@ -0,0 +1,122 @@
import { http } from '@kit.NetworkKit';
import { GlobalContext, HXLog } from 'biz_common';
import { buildHeader } from '../util/Header';
import { FirstPageCardsConfigLoader } from '../node/datacenter/FirstPageCardsConfigLoader';
import { AllCardsCard, ModDataItem } from '../node/model/AiDiagnosisNodeModel';
import {
PickContractItem,
PickStrategy,
PickTabData,
RawPickResponse,
RawPickTabItem,
RawStrategyDetail,
RawStrategyItem,
} from './AiPickModels';
import { getResData, getTableList, ResData } from './AiPickUtils';
import { MAX_ITEMS, MAX_TABS, MAX_TAGS } from './AiPickConstant';
const EMPTY_RAW_STRATEGY_ITEM: RawStrategyItem = {};
const EMPTY_RAW_STRATEGY_DETAIL: RawStrategyDetail = {
id: '',
strategy_name: '',
strategy_type: '',
};
function parseRawTab(item: RawPickTabItem): PickTabData {
const isSystemPeriod: boolean = item.type === 'system_period';
const strategyItem: RawStrategyItem = (
isSystemPeriod ? item.system_strategy : item.custom_strategy
) ?? EMPTY_RAW_STRATEGY_ITEM;
const strategyDetail: RawStrategyDetail = (
isSystemPeriod ? strategyItem.system_strategy : strategyItem.custom_strategy
) ?? EMPTY_RAW_STRATEGY_DETAIL;
const resData: ResData = getResData(strategyItem);
const allItems: PickContractItem[] =
getTableList(resData.list, resData.resultValueList);
const strategy: PickStrategy = {
id: strategyDetail.id,
name: strategyDetail.strategy_name,
detail: strategyDetail.user_question || strategyDetail.content || '',
type: strategyDetail.strategy_type || 'custom_strategy',
periodType: item.type,
tagList: (strategyDetail.tag_list ??
[GlobalContext.get().resourceManager
.getStringSync($r('app.string.ai_pick_custom_tag'))])
.slice(0, MAX_TAGS),
imgs: isSystemPeriod
? [strategyDetail.white_img ?? '', strategyDetail.black_img ?? '']
: [],
count: strategyItem.detail_count ?? 0,
};
const tabData: PickTabData = {
strategy: strategy,
items: allItems.slice(0, MAX_ITEMS),
keysList: resData.showKeyList,
fieldList: resData.fieldList,
};
return tabData;
}
function parseRawTabs(rawTabs: RawPickTabItem[]): PickTabData[] {
return rawTabs
.slice(0, MAX_TABS)
.map((item: RawPickTabItem): PickTabData => parseRawTab(item));
}
export class AiPickDataFetcher {
private static readonly instance: AiPickDataFetcher = new AiPickDataFetcher();
private constructor() {
}
static getInstance(): AiPickDataFetcher {
return AiPickDataFetcher.instance;
}
fetchCardConfig(): AllCardsCard | undefined {
return FirstPageCardsConfigLoader.getConfig()?.aiPick;
}
async fetchCardData(): Promise<PickTabData[]> {
const cardConfig: AllCardsCard | undefined = this.fetchCardConfig();
const modData: ModDataItem | undefined = cardConfig?.mod_data[0];
const configuredUrl: string = modData?.url ?? '';
if (configuredUrl === '') {
return [];
}
const requestOptions: http.HttpRequestOptions = {
method: http.RequestMethod.GET,
header: buildHeader(),
connectTimeout: 60000,
readTimeout: 60000,
};
const httpRequest: http.HttpRequest = http.createHttp();
try {
const requestUrl: string = this.buildRequestUrl(configuredUrl, Date.now());
const response: http.HttpResponse =
await httpRequest.request(requestUrl, requestOptions);
if (response.responseCode !== http.ResponseCode.OK) {
throw new Error('request failed: ' + response.responseCode);
}
const responseText: string = response.result as string;
const result: RawPickResponse = JSON.parse(responseText) as RawPickResponse;
const responseCode: number = result.code ?? result.status_code ?? 0;
if (responseCode !== 0 || result.data === undefined) {
throw new Error('response code: ' + responseCode);
}
return parseRawTabs(result.data);
} catch (requestError) {
const errorInfo: Error = requestError as Error;
HXLog.e('AiPickDataFetcher', 'fetchCardData error: ' + errorInfo.message);
throw new Error(errorInfo.message);
} finally {
httpRequest.destroy();
}
}
private buildRequestUrl(configuredUrl: string, timestamp: number): string {
const separator: string = configuredUrl.includes('?') ? '&' : '?';
return `${configuredUrl}${separator}_=${timestamp}`;
}
}