diff --git a/MeAgent/src/screens/StockDetail/StockDetailScreen.js b/MeAgent/src/screens/StockDetail/StockDetailScreen.js index 1a9928c4..40954836 100644 --- a/MeAgent/src/screens/StockDetail/StockDetailScreen.js +++ b/MeAgent/src/screens/StockDetail/StockDetailScreen.js @@ -14,7 +14,7 @@ import { PriceHeader, ChartTypeTabs, MinuteChart, - ProfessionalKlineChart, + KlineChart, OrderBook, RelatedInfoTabs, EventsPanel, @@ -62,6 +62,7 @@ const StockDetailScreen = () => { const [riseAnalysisData, setRiseAnalysisData] = useState([]); const [selectedAnalysis, setSelectedAnalysis] = useState(null); const [analysisModalOpen, setAnalysisModalOpen] = useState(false); + const [fallbackOrderBook, setFallbackOrderBook] = useState(null); // API 降级盘口数据 // Redux 状态 const currentStock = useSelector(selectCurrentStock); @@ -99,6 +100,21 @@ const StockDetailScreen = () => { return stockCode; }, [currentStock?.stock_name, stockName, stockCode]); + // 加载盘口数据(降级方案:WebSocket 无数据时从 API 获取) + const loadOrderBookFallback = useCallback(async () => { + if (!stockCode) return; + + try { + const result = await stockDetailService.getOrderBook(stockCode); + if (result.success && result.data) { + setFallbackOrderBook(result.data); + console.log('[StockDetailScreen] 降级盘口数据:', result.data.trade_time); + } + } catch (error) { + console.error('[StockDetailScreen] 加载降级盘口失败:', error); + } + }, [stockCode]); + // 加载涨幅分析数据 const loadRiseAnalysis = useCallback(async () => { if (!stockCode) return; @@ -143,8 +159,9 @@ const StockDetailScreen = () => { dispatch(clearCurrentStock()); // 重置为分时图 dispatch(setChartType('minute')); - // 清空本地状态(涨幅分析数据) + // 清空本地状态 setRiseAnalysisData([]); + setFallbackOrderBook(null); }, [dispatch, stockCode]); // 初始加载 @@ -152,6 +169,22 @@ const StockDetailScreen = () => { loadStockData(); }, [loadStockData]); + // 盘口数据降级:分时图模式下,WebSocket 3秒内无数据则从 API 获取 + useEffect(() => { + if (chartType !== 'minute') return; + + // 检查 WebSocket 是否有五档数据 + const hasWsOrderBook = realtimeQuote?.bid_prices?.length > 0 || realtimeQuote?.ask_prices?.length > 0; + + if (!hasWsOrderBook && !fallbackOrderBook) { + // 延迟 2 秒后加载降级数据,给 WebSocket 一点时间 + const timer = setTimeout(() => { + loadOrderBookFallback(); + }, 2000); + return () => clearTimeout(timer); + } + }, [chartType, realtimeQuote, fallbackOrderBook, loadOrderBookFallback]); + // 切换图表类型 const handleChartTypeChange = useCallback((type) => { dispatch(setChartType(type)); @@ -255,23 +288,25 @@ const StockDetailScreen = () => { loading={isChartLoading} /> ) : ( - )} - {/* 5档盘口 - 使用 WebSocket 实时推送的五档数据 */} + {/* 5档盘口 - 优先 WebSocket 实时数据,降级到 API 数据 */} {chartType === 'minute' && ( )}