更新ios
This commit is contained in:
@@ -14,7 +14,7 @@ import {
|
|||||||
PriceHeader,
|
PriceHeader,
|
||||||
ChartTypeTabs,
|
ChartTypeTabs,
|
||||||
MinuteChart,
|
MinuteChart,
|
||||||
ProfessionalKlineChart,
|
KlineChart,
|
||||||
OrderBook,
|
OrderBook,
|
||||||
RelatedInfoTabs,
|
RelatedInfoTabs,
|
||||||
EventsPanel,
|
EventsPanel,
|
||||||
@@ -62,6 +62,7 @@ const StockDetailScreen = () => {
|
|||||||
const [riseAnalysisData, setRiseAnalysisData] = useState([]);
|
const [riseAnalysisData, setRiseAnalysisData] = useState([]);
|
||||||
const [selectedAnalysis, setSelectedAnalysis] = useState(null);
|
const [selectedAnalysis, setSelectedAnalysis] = useState(null);
|
||||||
const [analysisModalOpen, setAnalysisModalOpen] = useState(false);
|
const [analysisModalOpen, setAnalysisModalOpen] = useState(false);
|
||||||
|
const [fallbackOrderBook, setFallbackOrderBook] = useState(null); // API 降级盘口数据
|
||||||
|
|
||||||
// Redux 状态
|
// Redux 状态
|
||||||
const currentStock = useSelector(selectCurrentStock);
|
const currentStock = useSelector(selectCurrentStock);
|
||||||
@@ -99,6 +100,21 @@ const StockDetailScreen = () => {
|
|||||||
return stockCode;
|
return stockCode;
|
||||||
}, [currentStock?.stock_name, stockName, 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 () => {
|
const loadRiseAnalysis = useCallback(async () => {
|
||||||
if (!stockCode) return;
|
if (!stockCode) return;
|
||||||
@@ -143,8 +159,9 @@ const StockDetailScreen = () => {
|
|||||||
dispatch(clearCurrentStock());
|
dispatch(clearCurrentStock());
|
||||||
// 重置为分时图
|
// 重置为分时图
|
||||||
dispatch(setChartType('minute'));
|
dispatch(setChartType('minute'));
|
||||||
// 清空本地状态(涨幅分析数据)
|
// 清空本地状态
|
||||||
setRiseAnalysisData([]);
|
setRiseAnalysisData([]);
|
||||||
|
setFallbackOrderBook(null);
|
||||||
}, [dispatch, stockCode]);
|
}, [dispatch, stockCode]);
|
||||||
|
|
||||||
// 初始加载
|
// 初始加载
|
||||||
@@ -152,6 +169,22 @@ const StockDetailScreen = () => {
|
|||||||
loadStockData();
|
loadStockData();
|
||||||
}, [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) => {
|
const handleChartTypeChange = useCallback((type) => {
|
||||||
dispatch(setChartType(type));
|
dispatch(setChartType(type));
|
||||||
@@ -255,23 +288,25 @@ const StockDetailScreen = () => {
|
|||||||
loading={isChartLoading}
|
loading={isChartLoading}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<ProfessionalKlineChart
|
<KlineChart
|
||||||
data={currentChartData}
|
data={currentChartData}
|
||||||
type={chartType}
|
type={chartType}
|
||||||
loading={isChartLoading}
|
loading={isChartLoading}
|
||||||
|
riseAnalysisData={riseAnalysisData}
|
||||||
|
onAnalysisPress={handleAnalysisPress}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
{/* 5档盘口 - 使用 WebSocket 实时推送的五档数据 */}
|
{/* 5档盘口 - 优先 WebSocket 实时数据,降级到 API 数据 */}
|
||||||
{chartType === 'minute' && (
|
{chartType === 'minute' && (
|
||||||
<OrderBook
|
<OrderBook
|
||||||
askPrices={realtimeQuote?.ask_prices || orderBook.askPrices || []}
|
askPrices={realtimeQuote?.ask_prices || fallbackOrderBook?.ask_prices || orderBook.askPrices || []}
|
||||||
askVolumes={realtimeQuote?.ask_volumes || orderBook.askVolumes || []}
|
askVolumes={realtimeQuote?.ask_volumes || fallbackOrderBook?.ask_volumes || orderBook.askVolumes || []}
|
||||||
bidPrices={realtimeQuote?.bid_prices || orderBook.bidPrices || []}
|
bidPrices={realtimeQuote?.bid_prices || fallbackOrderBook?.bid_prices || orderBook.bidPrices || []}
|
||||||
bidVolumes={realtimeQuote?.bid_volumes || orderBook.bidVolumes || []}
|
bidVolumes={realtimeQuote?.bid_volumes || fallbackOrderBook?.bid_volumes || orderBook.bidVolumes || []}
|
||||||
preClose={realtimeQuote?.pre_close || quote.pre_close}
|
preClose={realtimeQuote?.pre_close || fallbackOrderBook?.prev_close || quote.pre_close}
|
||||||
updateTime={realtimeQuote?.update_time}
|
updateTime={realtimeQuote?.update_time || fallbackOrderBook?.trade_time}
|
||||||
isConnected={wsConnected}
|
isConnected={wsConnected}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user