update pay ui
This commit is contained in:
@@ -89,7 +89,7 @@ const ConceptStocksModal: React.FC<ConceptStocksModalProps> = ({
|
||||
const modalSize = useBreakpointValue({ base: 'xl', md: '4xl' }, { fallback: 'md' });
|
||||
const tableMaxH = useBreakpointValue({ base: '45vh', md: '60vh' }, { fallback: 'md' });
|
||||
|
||||
// 批量获取股票行情数据
|
||||
// 批量获取股票行情数据(使用批量接口,减少网络请求)
|
||||
const fetchStockMarketData = useCallback(async (stocks: StockInfo[]) => {
|
||||
if (!stocks || stocks.length === 0) return;
|
||||
|
||||
@@ -97,30 +97,34 @@ const ConceptStocksModal: React.FC<ConceptStocksModalProps> = ({
|
||||
const newMarketData: Record<string, MarketData> = {};
|
||||
|
||||
try {
|
||||
const batchSize = 5;
|
||||
for (let i = 0; i < stocks.length; i += batchSize) {
|
||||
const batch = stocks.slice(i, i + batchSize);
|
||||
const promises = batch.map(async (stock) => {
|
||||
const stockCode = getStockCode(stock);
|
||||
if (!stockCode) return null;
|
||||
const seccode = stockCode.substring(0, 6);
|
||||
try {
|
||||
const response = await marketService.getTradeData(seccode, 1);
|
||||
if (response.success && response.data?.length > 0) {
|
||||
const latestData = response.data[response.data.length - 1];
|
||||
return { stock_code: stockCode, ...latestData };
|
||||
}
|
||||
} catch (error) {
|
||||
logger.warn('ConceptStocksModal', '获取股票行情失败', { stockCode: seccode });
|
||||
}
|
||||
return null;
|
||||
});
|
||||
// 提取所有6位股票代码
|
||||
const stockCodeMap: Record<string, string> = {}; // seccode -> fullCode 映射
|
||||
const seccodes: string[] = [];
|
||||
|
||||
const results = await Promise.all(promises);
|
||||
results.forEach((result) => {
|
||||
if (result) newMarketData[result.stock_code] = result;
|
||||
stocks.forEach((stock) => {
|
||||
const stockCode = getStockCode(stock);
|
||||
if (stockCode) {
|
||||
const seccode = stockCode.substring(0, 6);
|
||||
stockCodeMap[seccode] = stockCode;
|
||||
seccodes.push(seccode);
|
||||
}
|
||||
});
|
||||
|
||||
if (seccodes.length === 0) return;
|
||||
|
||||
// 使用批量接口一次性获取所有数据
|
||||
const response = await marketService.getBatchTradeData(seccodes, 1);
|
||||
|
||||
if (response.success && response.data) {
|
||||
Object.entries(response.data).forEach(([seccode, stockData]: [string, any]) => {
|
||||
const fullCode = stockCodeMap[seccode];
|
||||
if (fullCode && stockData.data?.length > 0) {
|
||||
const latestData = stockData.data[stockData.data.length - 1];
|
||||
newMarketData[fullCode] = { stock_code: fullCode, ...latestData };
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
setStockMarketData(newMarketData);
|
||||
} catch (error) {
|
||||
logger.error('ConceptStocksModal', 'fetchStockMarketData', error);
|
||||
|
||||
@@ -65,6 +65,24 @@ export const marketService = {
|
||||
return await apiRequest(url);
|
||||
},
|
||||
|
||||
/**
|
||||
* 批量获取多只股票的交易数据(日K线)
|
||||
* @param {string[]} codes - 股票代码数组(6位代码)
|
||||
* @param {number} days - 获取天数,默认1
|
||||
* @param {string} end_date - 截止日期
|
||||
* @returns {Promise<{success: boolean, data: Object}>}
|
||||
*/
|
||||
getBatchTradeData: async (codes, days = 1, end_date = null) => {
|
||||
const body = { codes, days };
|
||||
if (end_date) {
|
||||
body.end_date = end_date;
|
||||
}
|
||||
return await apiRequest('/api/market/trade/batch', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(body)
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取融资融券数据
|
||||
* @param {string} seccode - 股票代码
|
||||
|
||||
@@ -644,43 +644,37 @@ const ConceptCenter = () => {
|
||||
window.open(htmlPath, '_blank');
|
||||
};
|
||||
|
||||
// 获取股票行情数据
|
||||
// 获取股票行情数据(使用批量接口,减少网络请求)
|
||||
const fetchStockMarketData = async (stocks) => {
|
||||
if (!stocks || stocks.length === 0) return;
|
||||
|
||||
|
||||
setLoadingStockData(true);
|
||||
const newMarketData = {};
|
||||
|
||||
|
||||
try {
|
||||
// 批量获取股票数据,每次处理5个股票以避免并发过多
|
||||
const batchSize = 5;
|
||||
for (let i = 0; i < stocks.length; i += batchSize) {
|
||||
const batch = stocks.slice(i, i + batchSize);
|
||||
const promises = batch.map(async (stock) => {
|
||||
if (!stock.stock_code) return null;
|
||||
|
||||
// 提取6位股票代码(去掉交易所后缀)
|
||||
// 提取所有6位股票代码
|
||||
const stockCodeMap = {}; // seccode -> fullCode 映射
|
||||
const seccodes = [];
|
||||
|
||||
stocks.forEach((stock) => {
|
||||
if (stock.stock_code) {
|
||||
const seccode = stock.stock_code.substring(0, 6);
|
||||
|
||||
try {
|
||||
const response = await marketService.getTradeData(seccode, 1);
|
||||
if (response.success && response.data && response.data.length > 0) {
|
||||
const latestData = response.data[response.data.length - 1];
|
||||
return {
|
||||
stock_code: stock.stock_code,
|
||||
...latestData
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
logger.warn('ConceptCenter', `获取股票行情数据失败`, { stockCode: seccode, error: error.message });
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
const batchResults = await Promise.all(promises);
|
||||
batchResults.forEach(result => {
|
||||
if (result) {
|
||||
newMarketData[result.stock_code] = result;
|
||||
stockCodeMap[seccode] = stock.stock_code;
|
||||
seccodes.push(seccode);
|
||||
}
|
||||
});
|
||||
|
||||
if (seccodes.length === 0) return;
|
||||
|
||||
// 使用批量接口一次性获取所有数据
|
||||
const response = await marketService.getBatchTradeData(seccodes, 1);
|
||||
|
||||
if (response.success && response.data) {
|
||||
Object.entries(response.data).forEach(([seccode, stockData]) => {
|
||||
const fullCode = stockCodeMap[seccode];
|
||||
if (fullCode && stockData.data?.length > 0) {
|
||||
const latestData = stockData.data[stockData.data.length - 1];
|
||||
newMarketData[fullCode] = { stock_code: fullCode, ...latestData };
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user