From d972150a808dbe10258d27af2d3f0a93dc3862d3 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Wed, 4 Feb 2026 16:57:36 +0800 Subject: [PATCH] update pay promo --- src/components/ConceptStocksModal/index.tsx | 54 ++++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/components/ConceptStocksModal/index.tsx b/src/components/ConceptStocksModal/index.tsx index 0b53b308..2d6d1e05 100644 --- a/src/components/ConceptStocksModal/index.tsx +++ b/src/components/ConceptStocksModal/index.tsx @@ -23,7 +23,7 @@ import { useBreakpointValue, } from '@chakra-ui/react'; import { Table2 } from 'lucide-react'; -import marketService from '@services/marketService'; +import { getApiBase } from '@utils/apiConfig'; import { logger } from '@utils/logger'; // 股票信息类型 - 兼容新旧API格式 @@ -89,7 +89,7 @@ const ConceptStocksModal: React.FC = ({ 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,32 +97,50 @@ const ConceptStocksModal: React.FC = ({ const newMarketData: Record = {}; try { - // 提取所有6位股票代码 - const stockCodeMap: Record = {}; // seccode -> fullCode 映射 - const seccodes: string[] = []; + // 构建完整的股票代码列表(带后缀,如 000001.SZ) + const codes: string[] = []; + const codeToFullCode: Record = {}; // API返回的code -> 原始fullCode 映射 stocks.forEach((stock) => { const stockCode = getStockCode(stock); if (stockCode) { - const seccode = stockCode.substring(0, 6); - stockCodeMap[seccode] = stockCode; - seccodes.push(seccode); + // stockCode 格式可能是 "000001.SZ" 或 "000001" + let fullCode = stockCode; + if (!stockCode.includes('.')) { + // 根据代码判断交易所 + const seccode = stockCode.substring(0, 6); + if (seccode.startsWith('6')) { + fullCode = `${seccode}.SH`; + } else { + fullCode = `${seccode}.SZ`; + } + } + codes.push(fullCode); + codeToFullCode[fullCode] = stockCode; } }); - if (seccodes.length === 0) return; + if (codes.length === 0) return; - // 使用批量接口一次性获取所有数据 - const response = await marketService.getBatchTradeData(seccodes, 1); + // 调用实时行情接口 + const response = await fetch(`${getApiBase()}/api/flex-screen/quotes`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ codes, include_order_book: false }), + }); - 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 }; - } + const result = await response.json(); + + if (result.success && result.data) { + Object.entries(result.data).forEach(([code, quoteData]: [string, any]) => { + const originalCode = codeToFullCode[code] || code; + newMarketData[originalCode] = { + stock_code: originalCode, + close: quoteData.last_px, + change_percent: quoteData.change_pct, + }; }); + logger.info('ConceptStocksModal', `获取实时行情成功`, { source: result.source, count: Object.keys(result.data).length }); } setStockMarketData(newMarketData);