fix(FEAT-MO-001): 修复TDX数据完整性与状态展示

This commit is contained in:
2026-08-18 19:30:34 +08:00
parent ff8ada8316
commit 49f6be9c43
20 changed files with 557 additions and 113 deletions
@@ -112,28 +112,34 @@ export class MarketOverviewService {
}),
),
);
const snapshots = results.flatMap((result) =>
result.status === 'fulfilled' ? [result.value] : [],
);
if (!snapshots.length) {
const validSnapshots = results.flatMap((result) => {
if (result.status === 'rejected') return [];
return mapBreadthSnapshots([result.value]).validCount === 1 ? [result.value] : [];
});
const mapped = mapBreadthSnapshots(validSnapshots);
const unavailableMarkets = BREADTH_INDEXES.filter((_, index) => {
const result = results[index];
return (
!result ||
result.status === 'rejected' ||
mapBreadthSnapshots([result.value]).validCount === 0
);
}).map((item) => item.name);
if (!mapped.data) {
return {
...meta,
status: 'unavailable',
data: null,
warnings: [
this.toWarning(
results[0]?.status === 'rejected' ? results[0].reason : undefined,
'市场宽度',
),
],
warnings: [`市场宽度数据不可用:${unavailableMarkets.join('、')}`],
};
}
const status = snapshots.length === BREADTH_INDEXES.length ? 'fresh' : 'partial';
const status = mapped.validCount === BREADTH_INDEXES.length ? 'fresh' : 'partial';
return {
...meta,
status,
data: mapBreadthSnapshots(snapshots),
warnings: status === 'partial' ? ['部分市场指数未返回涨跌家数'] : [],
data: mapped.data,
warnings:
status === 'partial' ? [`部分市场涨跌家数不可用:${unavailableMarkets.join('、')}`] : [],
};
}
@@ -145,6 +151,14 @@ export class MarketOverviewService {
list_type: 1,
});
const definitions = catalog.Value.map(({ Code: code, Name: name }) => ({ code, name }));
if (!definitions.length) {
return {
...meta,
status: 'unavailable',
data: null,
warnings: ['一级行业目录为空'],
};
}
const result = await this.tdxClient.request<TdxMarketDataResult>('get_market_data', {
stock_list: definitions.map((item) => item.code),
count: 2,
@@ -187,10 +201,19 @@ export class MarketOverviewService {
dividend_type: 'none',
period: '1d',
});
const data = mapTurnoverTrend(result, TURNOVER_INDEXES);
if (!data)
const mapped = mapTurnoverTrend(result, TURNOVER_INDEXES);
if (!mapped.data)
return { ...meta, status: 'unavailable', data: null, warnings: ['成交额趋势数据不完整'] };
return { ...meta, status: 'fresh', data, warnings: [] };
const status = mapped.validMarketCount === TURNOVER_INDEXES.length ? 'fresh' : 'partial';
return {
...meta,
status,
data: mapped.data,
warnings:
status === 'partial'
? [`部分市场成交额不可用,当前汇总 ${mapped.validMarketCount} 个市场`]
: [],
};
} catch (error) {
return {
...meta,