更新ios

This commit is contained in:
2026-01-18 18:02:19 +08:00
parent d5aebd3b3d
commit 1d24650fe4

View File

@@ -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}
/>
) : (
<ProfessionalKlineChart
<KlineChart
data={currentChartData}
type={chartType}
loading={isChartLoading}
riseAnalysisData={riseAnalysisData}
onAnalysisPress={handleAnalysisPress}
/>
)}
</Box>
{/* 5档盘口 - 使用 WebSocket 实时推送的五档数据 */}
{/* 5档盘口 - 优先 WebSocket 实时数据,降级到 API 数据 */}
{chartType === 'minute' && (
<OrderBook
askPrices={realtimeQuote?.ask_prices || orderBook.askPrices || []}
askVolumes={realtimeQuote?.ask_volumes || orderBook.askVolumes || []}
bidPrices={realtimeQuote?.bid_prices || orderBook.bidPrices || []}
bidVolumes={realtimeQuote?.bid_volumes || orderBook.bidVolumes || []}
preClose={realtimeQuote?.pre_close || quote.pre_close}
updateTime={realtimeQuote?.update_time}
askPrices={realtimeQuote?.ask_prices || fallbackOrderBook?.ask_prices || orderBook.askPrices || []}
askVolumes={realtimeQuote?.ask_volumes || fallbackOrderBook?.ask_volumes || orderBook.askVolumes || []}
bidPrices={realtimeQuote?.bid_prices || fallbackOrderBook?.bid_prices || orderBook.bidPrices || []}
bidVolumes={realtimeQuote?.bid_volumes || fallbackOrderBook?.bid_volumes || orderBook.bidVolumes || []}
preClose={realtimeQuote?.pre_close || fallbackOrderBook?.prev_close || quote.pre_close}
updateTime={realtimeQuote?.update_time || fallbackOrderBook?.trade_time}
isConnected={wsConnected}
/>
)}