update pay ui
This commit is contained in:
@@ -41,6 +41,9 @@ export const useMarketData = (
|
||||
const [minuteData, setMinuteData] = useState<MinuteData | null>(null);
|
||||
const [minuteLoading, setMinuteLoading] = useState(false);
|
||||
|
||||
// 涨幅分析懒加载状态
|
||||
const [analysisLoading, setAnalysisLoading] = useState(false);
|
||||
|
||||
// 记录是否已完成首次加载
|
||||
const isInitializedRef = useRef(false);
|
||||
// 记录上一次的 stockCode,用于判断是否需要重新加载所有数据
|
||||
@@ -49,15 +52,50 @@ export const useMarketData = (
|
||||
const prevPeriodRef = useRef(period);
|
||||
|
||||
/**
|
||||
* 加载所有市场数据
|
||||
* 加载涨幅分析数据(懒加载)
|
||||
* 需要 tradeData 来建立日期索引映射
|
||||
*/
|
||||
const loadRiseAnalysis = useCallback(async (tradeDataForMapping: TradeDayData[]) => {
|
||||
if (!stockCode || tradeDataForMapping.length === 0) return;
|
||||
|
||||
logger.debug('useMarketData', '开始懒加载涨幅分析', { stockCode });
|
||||
setAnalysisLoading(true);
|
||||
|
||||
try {
|
||||
const riseAnalysisRes = await marketService.getRiseAnalysis(stockCode);
|
||||
|
||||
if (riseAnalysisRes.success && riseAnalysisRes.data) {
|
||||
const tempAnalysisMap: Record<number, RiseAnalysis> = {};
|
||||
riseAnalysisRes.data.forEach((analysis) => {
|
||||
const dateIndex = tradeDataForMapping.findIndex(
|
||||
(item) => item.date.substring(0, 10) === analysis.trade_date
|
||||
);
|
||||
if (dateIndex !== -1) {
|
||||
tempAnalysisMap[dateIndex] = analysis;
|
||||
}
|
||||
});
|
||||
setAnalysisMap(tempAnalysisMap);
|
||||
logger.info('useMarketData', '涨幅分析加载成功', { stockCode, count: Object.keys(tempAnalysisMap).length });
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('useMarketData', 'loadRiseAnalysis', error, { stockCode });
|
||||
} finally {
|
||||
setAnalysisLoading(false);
|
||||
}
|
||||
}, [stockCode]);
|
||||
|
||||
/**
|
||||
* 加载所有市场数据(涨幅分析延迟加载)
|
||||
*/
|
||||
const loadMarketData = useCallback(async () => {
|
||||
if (!stockCode) return;
|
||||
|
||||
logger.debug('useMarketData', '开始加载市场数据', { stockCode, period });
|
||||
setLoading(true);
|
||||
setAnalysisMap({}); // 清空旧的分析数据
|
||||
|
||||
try {
|
||||
// 先加载核心数据(不含涨幅分析)
|
||||
const [
|
||||
summaryRes,
|
||||
tradeRes,
|
||||
@@ -65,7 +103,6 @@ export const useMarketData = (
|
||||
bigDealRes,
|
||||
unusualRes,
|
||||
pledgeRes,
|
||||
riseAnalysisRes,
|
||||
] = await Promise.all([
|
||||
marketService.getMarketSummary(stockCode),
|
||||
marketService.getTradeData(stockCode, period),
|
||||
@@ -73,7 +110,6 @@ export const useMarketData = (
|
||||
marketService.getBigDealData(stockCode, 30),
|
||||
marketService.getUnusualData(stockCode, 30),
|
||||
marketService.getPledgeData(stockCode),
|
||||
marketService.getRiseAnalysis(stockCode),
|
||||
]);
|
||||
|
||||
// 设置概览数据
|
||||
@@ -82,8 +118,10 @@ export const useMarketData = (
|
||||
}
|
||||
|
||||
// 设置交易数据
|
||||
let loadedTradeData: TradeDayData[] = [];
|
||||
if (tradeRes.success) {
|
||||
setTradeData(tradeRes.data);
|
||||
loadedTradeData = tradeRes.data;
|
||||
setTradeData(loadedTradeData);
|
||||
}
|
||||
|
||||
// 设置融资融券数据
|
||||
@@ -106,31 +144,18 @@ export const useMarketData = (
|
||||
setPledgeData(pledgeRes.data);
|
||||
}
|
||||
|
||||
// 设置涨幅分析数据并创建映射
|
||||
if (riseAnalysisRes.success) {
|
||||
const tempAnalysisMap: Record<number, RiseAnalysis> = {};
|
||||
|
||||
if (tradeRes.success && tradeRes.data && riseAnalysisRes.data) {
|
||||
riseAnalysisRes.data.forEach((analysis) => {
|
||||
const dateIndex = tradeRes.data.findIndex(
|
||||
(item) => item.date.substring(0, 10) === analysis.trade_date
|
||||
);
|
||||
if (dateIndex !== -1) {
|
||||
tempAnalysisMap[dateIndex] = analysis;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
setAnalysisMap(tempAnalysisMap);
|
||||
}
|
||||
|
||||
logger.info('useMarketData', '市场数据加载成功', { stockCode });
|
||||
|
||||
// 核心数据加载完成后,异步加载涨幅分析(不阻塞界面)
|
||||
if (loadedTradeData.length > 0) {
|
||||
loadRiseAnalysis(loadedTradeData);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('useMarketData', 'loadMarketData', error, { stockCode, period });
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [stockCode, period]);
|
||||
}, [stockCode, period, loadRiseAnalysis]);
|
||||
|
||||
/**
|
||||
* 加载分钟K线数据
|
||||
@@ -168,7 +193,7 @@ export const useMarketData = (
|
||||
}, [stockCode]);
|
||||
|
||||
/**
|
||||
* 单独刷新日K线数据(只刷新交易数据和涨幅分析)
|
||||
* 单独刷新日K线数据(涨幅分析懒加载)
|
||||
* 用于切换时间周期时,避免重新加载所有数据
|
||||
*/
|
||||
const refreshTradeData = useCallback(async () => {
|
||||
@@ -176,40 +201,31 @@ export const useMarketData = (
|
||||
|
||||
logger.debug('useMarketData', '刷新日K线数据', { stockCode, period });
|
||||
setTradeLoading(true);
|
||||
setAnalysisMap({}); // 清空旧的分析数据
|
||||
|
||||
try {
|
||||
// 并行获取交易数据和涨幅分析
|
||||
const [tradeRes, riseAnalysisRes] = await Promise.all([
|
||||
marketService.getTradeData(stockCode, period),
|
||||
marketService.getRiseAnalysis(stockCode),
|
||||
]);
|
||||
// 先加载交易数据
|
||||
const tradeRes = await marketService.getTradeData(stockCode, period);
|
||||
|
||||
// 更新交易数据
|
||||
let loadedTradeData: TradeDayData[] = [];
|
||||
if (tradeRes.success && tradeRes.data) {
|
||||
setTradeData(tradeRes.data);
|
||||
|
||||
// 重建涨幅分析映射
|
||||
if (riseAnalysisRes.success && riseAnalysisRes.data) {
|
||||
const tempAnalysisMap: Record<number, RiseAnalysis> = {};
|
||||
riseAnalysisRes.data.forEach((analysis) => {
|
||||
const dateIndex = tradeRes.data.findIndex(
|
||||
(item) => item.date.substring(0, 10) === analysis.trade_date
|
||||
);
|
||||
if (dateIndex !== -1) {
|
||||
tempAnalysisMap[dateIndex] = analysis;
|
||||
}
|
||||
});
|
||||
setAnalysisMap(tempAnalysisMap);
|
||||
}
|
||||
loadedTradeData = tradeRes.data;
|
||||
setTradeData(loadedTradeData);
|
||||
}
|
||||
|
||||
logger.info('useMarketData', '日K线数据刷新成功', { stockCode, period });
|
||||
|
||||
// K线数据加载完成后,异步加载涨幅分析(不阻塞界面)
|
||||
if (loadedTradeData.length > 0) {
|
||||
loadRiseAnalysis(loadedTradeData);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('useMarketData', 'refreshTradeData', error, { stockCode, period });
|
||||
} finally {
|
||||
setTradeLoading(false);
|
||||
}
|
||||
}, [stockCode, period]);
|
||||
}, [stockCode, period, loadRiseAnalysis]);
|
||||
|
||||
/**
|
||||
* 刷新所有数据
|
||||
@@ -253,6 +269,7 @@ export const useMarketData = (
|
||||
minuteData,
|
||||
minuteLoading,
|
||||
analysisMap,
|
||||
analysisLoading,
|
||||
refetch,
|
||||
loadMinuteData,
|
||||
refreshTradeData,
|
||||
|
||||
@@ -366,6 +366,7 @@ export interface UseMarketDataReturn {
|
||||
minuteData: MinuteData | null;
|
||||
minuteLoading: boolean;
|
||||
analysisMap: Record<number, RiseAnalysis>;
|
||||
analysisLoading: boolean;
|
||||
refetch: () => Promise<void>;
|
||||
loadMinuteData: () => Promise<void>;
|
||||
refreshTradeData: () => Promise<void>;
|
||||
|
||||
Reference in New Issue
Block a user