From 406b951e534d417a1b21c55dc8556e4da9298818 Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Tue, 16 Dec 2025 14:52:06 +0800 Subject: [PATCH] =?UTF-8?q?refactor(TradeDataPanel):=20=E5=90=88=E5=B9=B6?= =?UTF-8?q?=20KLineChart=20=E5=92=8C=20MinuteKLineSection=20=E4=B8=BA=20KL?= =?UTF-8?q?ineModule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 KLineModule 组件,整合日K线和分钟K线功能 - 右上角 ButtonGroup 切换「日K」/「分钟」模式 - 刷新按钮置于切换按钮组前方 - 切换到分钟模式时自动加载数据 - 删除旧的 KLineChart.tsx 和 MinuteKLineSection.tsx - 更新 panels/index.ts 导出 - 更新 types.ts,合并类型定义为 KLineModuleProps 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../panels/TradeDataPanel/KLineChart.tsx | 43 ----- .../panels/TradeDataPanel/KLineModule.tsx | 168 ++++++++++++++++++ .../TradeDataPanel/MinuteKLineSection.tsx | 107 ----------- .../panels/TradeDataPanel/index.tsx | 23 +-- .../MarketDataView/components/panels/index.ts | 12 +- .../components/MarketDataView/types.ts | 19 +- 6 files changed, 185 insertions(+), 187 deletions(-) delete mode 100644 src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineChart.tsx create mode 100644 src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineModule.tsx delete mode 100644 src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/MinuteKLineSection.tsx diff --git a/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineChart.tsx b/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineChart.tsx deleted file mode 100644 index 0264d70b..00000000 --- a/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineChart.tsx +++ /dev/null @@ -1,43 +0,0 @@ -// src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineChart.tsx -// 日K线图组件 - -import React from 'react'; -import { Box, CardBody } from '@chakra-ui/react'; -import ReactECharts from 'echarts-for-react'; - -import ThemedCard from '../../ThemedCard'; -import { getKLineOption } from '../../../utils/chartOptions'; -import type { Theme, TradeDayData, RiseAnalysis } from '../../../types'; - -export interface KLineChartProps { - theme: Theme; - tradeData: TradeDayData[]; - analysisMap: Record; - onChartClick: (params: { seriesName?: string; data?: [number, number] }) => void; -} - -const KLineChart: React.FC = ({ - theme, - tradeData, - analysisMap, - onChartClick, -}) => { - return ( - - - {tradeData.length > 0 && ( - - - - )} - - - ); -}; - -export default KLineChart; diff --git a/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineModule.tsx b/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineModule.tsx new file mode 100644 index 00000000..a04f9889 --- /dev/null +++ b/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineModule.tsx @@ -0,0 +1,168 @@ +// src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/KLineModule.tsx +// K线模块 - 日K线/分钟K线切换展示 + +import React, { useState } from 'react'; +import { + Box, + Text, + VStack, + HStack, + Button, + ButtonGroup, + Badge, + Center, + Spinner, + CardBody, + CardHeader, + Heading, +} from '@chakra-ui/react'; +import { RepeatIcon } from '@chakra-ui/icons'; +import { BarChart2, Clock } from 'lucide-react'; +import ReactECharts from 'echarts-for-react'; + +import ThemedCard from '../../ThemedCard'; +import { getKLineOption, getMinuteKLineOption } from '../../../utils/chartOptions'; +import { MinuteStats, TradeAnalysis, EmptyState } from './atoms'; +import type { KLineModuleProps } from '../../../types'; + +// 重新导出类型供外部使用 +export type { KLineModuleProps } from '../../../types'; + +type ChartMode = 'daily' | 'minute'; + +const KLineModule: React.FC = ({ + theme, + tradeData, + minuteData, + minuteLoading, + analysisMap, + onLoadMinuteData, + onChartClick, +}) => { + const [mode, setMode] = useState('daily'); + const hasMinuteData = minuteData && minuteData.data && minuteData.data.length > 0; + + // 切换到分钟模式时自动加载数据 + const handleModeChange = (newMode: ChartMode) => { + setMode(newMode); + if (newMode === 'minute' && !hasMinuteData && !minuteLoading) { + onLoadMinuteData(); + } + }; + + return ( + + + + + + {mode === 'daily' ? '日K线图' : '分钟K线图'} + + {mode === 'minute' && minuteData?.trade_date && ( + + {minuteData.trade_date} + + )} + + + + {/* 分钟模式下的刷新按钮 */} + {mode === 'minute' && ( + + )} + + {/* 模式切换按钮组 */} + + + + + + + + + + {mode === 'daily' ? ( + // 日K线图 + tradeData.length > 0 ? ( + + + + ) : ( + + ) + ) : ( + // 分钟K线图 + minuteLoading ? ( +
+ + + + 加载分钟频数据中... + + +
+ ) : hasMinuteData ? ( + + + + + + + + ) : ( + + ) + )} +
+
+ ); +}; + +export default KLineModule; diff --git a/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/MinuteKLineSection.tsx b/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/MinuteKLineSection.tsx deleted file mode 100644 index 06cb6ae3..00000000 --- a/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/MinuteKLineSection.tsx +++ /dev/null @@ -1,107 +0,0 @@ -// src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/MinuteKLineSection.tsx -// 分钟K线数据区域组件 - -import React from 'react'; -import { - Box, - Text, - VStack, - HStack, - Button, - Badge, - Center, - Spinner, - CardBody, - CardHeader, - Icon, - Heading, -} from '@chakra-ui/react'; -import { TimeIcon, RepeatIcon } from '@chakra-ui/icons'; -import ReactECharts from 'echarts-for-react'; - -import ThemedCard from '../../ThemedCard'; -import { getMinuteKLineOption } from '../../../utils/chartOptions'; -import { MinuteStats, TradeAnalysis, EmptyState } from './atoms'; -import type { Theme, MinuteData } from '../../../types'; - -export interface MinuteKLineSectionProps { - theme: Theme; - minuteData: MinuteData | null; - loading: boolean; - onLoadMinuteData: () => void; -} - -const MinuteKLineSection: React.FC = ({ - theme, - minuteData, - loading, - onLoadMinuteData, -}) => { - const hasData = minuteData && minuteData.data && minuteData.data.length > 0; - - return ( - - - - - - - 当日分钟频数据 - - {minuteData?.trade_date && ( - - {minuteData.trade_date} - - )} - - - - - - - {loading ? ( -
- - - - 加载分钟频数据中... - - -
- ) : hasData ? ( - - - - - - - - ) : ( - - )} -
-
- ); -}; - -export default MinuteKLineSection; diff --git a/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/index.tsx b/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/index.tsx index c52fffcf..7e8e3fbc 100644 --- a/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/index.tsx +++ b/src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/index.tsx @@ -1,11 +1,10 @@ // src/views/Company/components/MarketDataView/components/panels/TradeDataPanel/index.tsx -// 交易数据面板 - K线图、分钟图、交易明细表格 +// 交易数据面板 - K线模块(日K/分钟切换)、交易明细表格 import React from 'react'; import { VStack } from '@chakra-ui/react'; -import KLineChart from './KLineChart'; -import MinuteKLineSection from './MinuteKLineSection'; +import KLineModule from './KLineModule'; import TradeTable from './TradeTable'; import type { Theme, TradeDayData, MinuteData, RiseAnalysis } from '../../../types'; @@ -30,18 +29,14 @@ const TradeDataPanel: React.FC = ({ }) => { return ( - - - @@ -52,7 +47,7 @@ const TradeDataPanel: React.FC = ({ export default TradeDataPanel; // 导出子组件供外部按需使用 -export { KLineChart, MinuteKLineSection, TradeTable }; -export type { KLineChartProps } from './KLineChart'; -export type { MinuteKLineSectionProps } from './MinuteKLineSection'; +export { default as KLineModule } from './KLineModule'; +export { default as TradeTable } from './TradeTable'; +export type { KLineModuleProps } from './KLineModule'; export type { TradeTableProps } from './TradeTable'; diff --git a/src/views/Company/components/MarketDataView/components/panels/index.ts b/src/views/Company/components/MarketDataView/components/panels/index.ts index 3cf06498..dce5f1be 100644 --- a/src/views/Company/components/MarketDataView/components/panels/index.ts +++ b/src/views/Company/components/MarketDataView/components/panels/index.ts @@ -15,13 +15,5 @@ export type { UnusualPanelProps } from './UnusualPanel'; export type { PledgePanelProps } from './PledgePanel'; // 导出 TradeDataPanel 子组件 -export { - KLineChart, - MinuteKLineSection, - TradeTable, -} from './TradeDataPanel'; -export type { - KLineChartProps, - MinuteKLineSectionProps, - TradeTableProps, -} from './TradeDataPanel'; +export { KLineModule, TradeTable } from './TradeDataPanel'; +export type { KLineModuleProps, TradeTableProps } from './TradeDataPanel'; diff --git a/src/views/Company/components/MarketDataView/types.ts b/src/views/Company/components/MarketDataView/types.ts index bdaa6fdf..cae6d6af 100644 --- a/src/views/Company/components/MarketDataView/types.ts +++ b/src/views/Company/components/MarketDataView/types.ts @@ -287,23 +287,16 @@ export interface TradeDataTabProps { } /** - * KLineChart 组件 Props + * KLineModule 组件 Props(日K/分钟K线切换模块) */ -export interface KLineChartProps { +export interface KLineModuleProps { theme: Theme; tradeData: TradeDayData[]; - analysisMap: Record; - onAnalysisClick: (analysis: RiseAnalysis) => void; -} - -/** - * MinuteKLineChart 组件 Props - */ -export interface MinuteKLineChartProps { - theme: Theme; minuteData: MinuteData | null; - loading: boolean; - onRefresh: () => void; + minuteLoading: boolean; + analysisMap: Record; + onLoadMinuteData: () => void; + onChartClick: (params: { seriesName?: string; data?: [number, number] }) => void; } /**