/** * 财务全景组件 * 重构后的主组件,使用模块化结构 */ import React, { useState, ReactNode } from 'react'; import { Box, Container, VStack, HStack, Card, CardBody, CardHeader, Heading, Text, Badge, Select, IconButton, Alert, AlertIcon, Skeleton, Tabs, TabList, TabPanels, Tab, TabPanel, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalCloseButton, useDisclosure, Table, Thead, Tbody, Tr, Th, Td, TableContainer, Divider, Tooltip, } from '@chakra-ui/react'; import { RepeatIcon } from '@chakra-ui/icons'; import ReactECharts from 'echarts-for-react'; import { formatUtils } from '@services/financialService'; // 内部模块导入 import { useFinancialData } from './hooks'; import { COLORS } from './constants'; import { calculateYoYChange, getCellBackground, getMetricChartOption } from './utils'; import { StockInfoHeader, BalanceSheetTable, IncomeStatementTable, CashflowTable, FinancialMetricsTable, MainBusinessAnalysis, IndustryRankingView, StockComparison, ComparisonAnalysis, } from './components'; import type { FinancialPanoramaProps } from './types'; /** * 财务全景主组件 */ const FinancialPanorama: React.FC = ({ stockCode: propStockCode }) => { // 使用数据加载 Hook const { stockInfo, balanceSheet, incomeStatement, cashflow, financialMetrics, mainBusiness, forecast, industryRank, comparison, loading, error, refetch, currentStockCode, selectedPeriods, setSelectedPeriods, } = useFinancialData({ stockCode: propStockCode }); // UI 状态 const [activeTab, setActiveTab] = useState(0); const { isOpen, onOpen, onClose } = useDisclosure(); const [modalContent, setModalContent] = useState(null); // 颜色配置 const { bgColor, hoverBg, positiveColor, negativeColor, borderColor } = COLORS; // 点击指标行显示图表 const showMetricChart = ( metricName: string, metricKey: string, data: Array<{ period: string; [key: string]: unknown }>, dataPath: string ) => { const chartData = data .map((item) => { const value = dataPath.split('.').reduce((obj: unknown, key: string) => { if (obj && typeof obj === 'object') { return (obj as Record)[key]; } return undefined; }, item) as number | undefined; return { period: formatUtils.getReportType(item.period), date: item.period, value: value ?? 0, }; }) .reverse(); const option = getMetricChartOption(metricName, chartData); setModalContent( {chartData.map((item, idx) => { // 计算环比 const qoq = idx > 0 ? ((item.value - chartData[idx - 1].value) / Math.abs(chartData[idx - 1].value)) * 100 : null; // 计算同比 const currentDate = new Date(item.date); const lastYearItem = chartData.find((d) => { const date = new Date(d.date); return ( date.getFullYear() === currentDate.getFullYear() - 1 && date.getMonth() === currentDate.getMonth() ); }); const yoy = lastYearItem ? ((item.value - lastYearItem.value) / Math.abs(lastYearItem.value)) * 100 : null; return ( ); })}
报告期 数值 同比 环比
{item.period} {formatUtils.formatLargeNumber(item.value)} 0 ? positiveColor : yoy !== null && yoy < 0 ? negativeColor : 'gray.500' } > {yoy !== null ? `${yoy.toFixed(2)}%` : '-'} 0 ? positiveColor : qoq !== null && qoq < 0 ? negativeColor : 'gray.500' } > {qoq !== null ? `${qoq.toFixed(2)}%` : '-'}
); onOpen(); }; // 通用表格属性 const tableProps = { showMetricChart, calculateYoYChange, getCellBackground, positiveColor, negativeColor, bgColor, hoverBg, }; return ( {/* 时间选择器 */} 显示期数: } onClick={refetch} isLoading={loading} variant="outline" size="sm" aria-label="刷新数据" /> {/* 股票信息头部 */} {loading ? ( ) : ( )} {/* 主要内容区域 */} {!loading && stockInfo && ( 财务概览 资产负债表 利润表 现金流量表 财务指标 主营业务 行业排名 业绩预告 股票对比 {/* 财务概览 */} {/* 资产负债表 */} 资产负债表 显示最近{Math.min(balanceSheet.length, 8)}期 红涨绿跌 | 同比变化 提示:表格可横向滚动查看更多数据,点击行查看历史趋势 {/* 利润表 */} 利润表 显示最近{Math.min(incomeStatement.length, 8)}期 红涨绿跌 | 同比变化 提示:Q1、中报、Q3、年报数据为累计值,同比显示与去年同期对比 {/* 现金流量表 */} 现金流量表 显示最近{Math.min(cashflow.length, 8)}期 红涨绿跌 | 同比变化 提示:现金流数据为累计值,正值红色表示现金流入,负值绿色表示现金流出 {/* 财务指标 */} {/* 主营业务 */} {/* 行业排名 */} {/* 业绩预告 */} {forecast && ( {forecast.forecasts?.map((item, idx) => ( {item.forecast_type} 报告期: {item.report_date} {item.content} {item.reason && ( {item.reason} )} {item.change_range?.lower && ( 预计变动范围: {item.change_range.lower}% ~ {item.change_range.upper}% )} ))} )} {/* 股票对比 */} )} {/* 错误提示 */} {error && ( {error} )} {/* 弹出模态框 */} 指标详情 {modalContent} ); }; export default FinancialPanorama;