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' && (
)}