fix(FinancialPanorama): 修复Mock数据结构 + 移除业绩预告Tab
- financial.js: 修复字段名 code→stock_code, name→stock_name - financial.js: 财务报表改为嵌套结构匹配类型定义 - 移除业绩预告Tab(迁移至DynamicTracking)
This commit is contained in:
@@ -10,59 +10,252 @@ export const generateFinancialData = (stockCode) => {
|
|||||||
|
|
||||||
// 股票基本信息
|
// 股票基本信息
|
||||||
stockInfo: {
|
stockInfo: {
|
||||||
code: stockCode,
|
stock_code: stockCode,
|
||||||
name: stockCode === '000001' ? '平安银行' : '示例公司',
|
stock_name: stockCode === '000001' ? '平安银行' : '示例公司',
|
||||||
industry: stockCode === '000001' ? '银行' : '制造业',
|
industry: stockCode === '000001' ? '银行' : '制造业',
|
||||||
list_date: '1991-04-03',
|
list_date: '1991-04-03',
|
||||||
market: 'SZ'
|
market: 'SZ',
|
||||||
|
// 关键指标
|
||||||
|
key_metrics: {
|
||||||
|
eps: 2.72,
|
||||||
|
roe: 16.23,
|
||||||
|
gross_margin: 71.92,
|
||||||
|
net_margin: 32.56,
|
||||||
|
roa: 1.05
|
||||||
|
},
|
||||||
|
// 增长率
|
||||||
|
growth_rates: {
|
||||||
|
revenue_growth: 8.2,
|
||||||
|
profit_growth: 12.5,
|
||||||
|
asset_growth: 5.6,
|
||||||
|
equity_growth: 6.8
|
||||||
|
},
|
||||||
|
// 财务概要
|
||||||
|
financial_summary: {
|
||||||
|
revenue: 162350,
|
||||||
|
net_profit: 52860,
|
||||||
|
total_assets: 5024560,
|
||||||
|
total_liabilities: 4698880
|
||||||
|
},
|
||||||
|
// 最新业绩预告
|
||||||
|
latest_forecast: {
|
||||||
|
forecast_type: '预增',
|
||||||
|
content: '预计全年净利润同比增长10%-17%'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 资产负债表
|
// 资产负债表 - 嵌套结构
|
||||||
balanceSheet: periods.map((period, i) => ({
|
balanceSheet: periods.map((period, i) => ({
|
||||||
period,
|
period,
|
||||||
total_assets: 5024560 - i * 50000, // 百万元
|
assets: {
|
||||||
total_liabilities: 4698880 - i * 48000,
|
current_assets: {
|
||||||
shareholders_equity: 325680 - i * 2000,
|
cash: 856780 - i * 10000,
|
||||||
current_assets: 2512300 - i * 25000,
|
trading_financial_assets: 234560 - i * 5000,
|
||||||
non_current_assets: 2512260 - i * 25000,
|
notes_receivable: 12340 - i * 200,
|
||||||
current_liabilities: 3456780 - i * 35000,
|
accounts_receivable: 45670 - i * 1000,
|
||||||
non_current_liabilities: 1242100 - i * 13000
|
prepayments: 8900 - i * 100,
|
||||||
|
other_receivables: 23450 - i * 500,
|
||||||
|
inventory: 156780 - i * 3000,
|
||||||
|
contract_assets: 34560 - i * 800,
|
||||||
|
other_current_assets: 67890 - i * 1500,
|
||||||
|
total: 2512300 - i * 25000
|
||||||
|
},
|
||||||
|
non_current_assets: {
|
||||||
|
long_term_equity_investments: 234560 - i * 5000,
|
||||||
|
investment_property: 45670 - i * 1000,
|
||||||
|
fixed_assets: 678900 - i * 15000,
|
||||||
|
construction_in_progress: 123450 - i * 3000,
|
||||||
|
right_of_use_assets: 34560 - i * 800,
|
||||||
|
intangible_assets: 89012 - i * 2000,
|
||||||
|
goodwill: 45670 - i * 1000,
|
||||||
|
deferred_tax_assets: 12340 - i * 300,
|
||||||
|
other_non_current_assets: 67890 - i * 1500,
|
||||||
|
total: 2512260 - i * 25000
|
||||||
|
},
|
||||||
|
total: 5024560 - i * 50000
|
||||||
|
},
|
||||||
|
liabilities: {
|
||||||
|
current_liabilities: {
|
||||||
|
short_term_borrowings: 456780 - i * 10000,
|
||||||
|
notes_payable: 23450 - i * 500,
|
||||||
|
accounts_payable: 234560 - i * 5000,
|
||||||
|
advance_receipts: 12340 - i * 300,
|
||||||
|
contract_liabilities: 34560 - i * 800,
|
||||||
|
employee_compensation_payable: 45670 - i * 1000,
|
||||||
|
taxes_payable: 23450 - i * 500,
|
||||||
|
other_payables: 78900 - i * 1500,
|
||||||
|
non_current_liabilities_due_within_one_year: 89012 - i * 2000,
|
||||||
|
total: 3456780 - i * 35000
|
||||||
|
},
|
||||||
|
non_current_liabilities: {
|
||||||
|
long_term_borrowings: 678900 - i * 15000,
|
||||||
|
bonds_payable: 234560 - i * 5000,
|
||||||
|
lease_liabilities: 45670 - i * 1000,
|
||||||
|
deferred_tax_liabilities: 12340 - i * 300,
|
||||||
|
other_non_current_liabilities: 89012 - i * 2000,
|
||||||
|
total: 1242100 - i * 13000
|
||||||
|
},
|
||||||
|
total: 4698880 - i * 48000
|
||||||
|
},
|
||||||
|
equity: {
|
||||||
|
share_capital: 19405,
|
||||||
|
capital_reserve: 89012 - i * 2000,
|
||||||
|
surplus_reserve: 45670 - i * 1000,
|
||||||
|
undistributed_profit: 156780 - i * 3000,
|
||||||
|
treasury_stock: 0,
|
||||||
|
other_comprehensive_income: 12340 - i * 300,
|
||||||
|
parent_company_equity: 315680 - i * 1800,
|
||||||
|
minority_interests: 10000 - i * 200,
|
||||||
|
total: 325680 - i * 2000
|
||||||
|
}
|
||||||
})),
|
})),
|
||||||
|
|
||||||
// 利润表
|
// 利润表 - 嵌套结构
|
||||||
incomeStatement: periods.map((period, i) => ({
|
incomeStatement: periods.map((period, i) => ({
|
||||||
period,
|
period,
|
||||||
revenue: 162350 - i * 4000, // 百万元
|
revenue: {
|
||||||
|
total_operating_revenue: 162350 - i * 4000,
|
||||||
|
operating_revenue: 158900 - i * 3900,
|
||||||
|
other_income: 3450 - i * 100
|
||||||
|
},
|
||||||
|
costs: {
|
||||||
|
total_operating_cost: 93900 - i * 2500,
|
||||||
operating_cost: 45620 - i * 1200,
|
operating_cost: 45620 - i * 1200,
|
||||||
gross_profit: 116730 - i * 2800,
|
taxes_and_surcharges: 4560 - i * 100,
|
||||||
|
selling_expenses: 12340 - i * 300,
|
||||||
|
admin_expenses: 15670 - i * 400,
|
||||||
|
rd_expenses: 8900 - i * 200,
|
||||||
|
financial_expenses: 6810 - i * 300,
|
||||||
|
interest_expense: 8900 - i * 200,
|
||||||
|
interest_income: 2090 - i * 50,
|
||||||
|
three_expenses_total: 34820 - i * 1000,
|
||||||
|
four_expenses_total: 43720 - i * 1200,
|
||||||
|
asset_impairment_loss: 1200 - i * 50,
|
||||||
|
credit_impairment_loss: 2340 - i * 100
|
||||||
|
},
|
||||||
|
other_gains: {
|
||||||
|
fair_value_change: 1230 - i * 50,
|
||||||
|
investment_income: 3450 - i * 100,
|
||||||
|
investment_income_from_associates: 890 - i * 20,
|
||||||
|
exchange_income: 560 - i * 10,
|
||||||
|
asset_disposal_income: 340 - i * 10
|
||||||
|
},
|
||||||
|
profit: {
|
||||||
operating_profit: 68450 - i * 1500,
|
operating_profit: 68450 - i * 1500,
|
||||||
|
total_profit: 69500 - i * 1500,
|
||||||
|
income_tax_expense: 16640 - i * 300,
|
||||||
net_profit: 52860 - i * 1200,
|
net_profit: 52860 - i * 1200,
|
||||||
eps: 2.72 - i * 0.06
|
parent_net_profit: 51200 - i * 1150,
|
||||||
|
minority_profit: 1660 - i * 50,
|
||||||
|
continuing_operations_net_profit: 52860 - i * 1200,
|
||||||
|
discontinued_operations_net_profit: 0
|
||||||
|
},
|
||||||
|
non_operating: {
|
||||||
|
non_operating_income: 1050 - i * 20,
|
||||||
|
non_operating_expenses: 450 - i * 10
|
||||||
|
},
|
||||||
|
per_share: {
|
||||||
|
basic_eps: 2.72 - i * 0.06,
|
||||||
|
diluted_eps: 2.70 - i * 0.06
|
||||||
|
},
|
||||||
|
comprehensive_income: {
|
||||||
|
other_comprehensive_income: 890 - i * 20,
|
||||||
|
total_comprehensive_income: 53750 - i * 1220,
|
||||||
|
parent_comprehensive_income: 52050 - i * 1170,
|
||||||
|
minority_comprehensive_income: 1700 - i * 50
|
||||||
|
}
|
||||||
})),
|
})),
|
||||||
|
|
||||||
// 现金流量表
|
// 现金流量表 - 嵌套结构
|
||||||
cashflow: periods.map((period, i) => ({
|
cashflow: periods.map((period, i) => ({
|
||||||
period,
|
period,
|
||||||
operating_cashflow: 125600 - i * 3000, // 百万元
|
operating_activities: {
|
||||||
investing_cashflow: -45300 - i * 1000,
|
inflow: {
|
||||||
financing_cashflow: -38200 + i * 500,
|
cash_from_sales: 178500 - i * 4500
|
||||||
net_cashflow: 42100 - i * 1500,
|
},
|
||||||
cash_ending: 456780 - i * 10000
|
outflow: {
|
||||||
|
cash_for_goods: 52900 - i * 1500
|
||||||
|
},
|
||||||
|
net_flow: 125600 - i * 3000
|
||||||
|
},
|
||||||
|
investment_activities: {
|
||||||
|
net_flow: -45300 - i * 1000
|
||||||
|
},
|
||||||
|
financing_activities: {
|
||||||
|
net_flow: -38200 + i * 500
|
||||||
|
},
|
||||||
|
cash_changes: {
|
||||||
|
net_increase: 42100 - i * 1500,
|
||||||
|
ending_balance: 456780 - i * 10000
|
||||||
|
},
|
||||||
|
key_metrics: {
|
||||||
|
free_cash_flow: 80300 - i * 2000
|
||||||
|
}
|
||||||
})),
|
})),
|
||||||
|
|
||||||
// 财务指标
|
// 财务指标 - 嵌套结构
|
||||||
financialMetrics: periods.map((period, i) => ({
|
financialMetrics: periods.map((period, i) => ({
|
||||||
period,
|
period,
|
||||||
roe: 16.23 - i * 0.3, // %
|
profitability: {
|
||||||
|
roe: 16.23 - i * 0.3,
|
||||||
|
roe_deducted: 15.89 - i * 0.3,
|
||||||
|
roe_weighted: 16.45 - i * 0.3,
|
||||||
roa: 1.05 - i * 0.02,
|
roa: 1.05 - i * 0.02,
|
||||||
gross_margin: 71.92 - i * 0.5,
|
gross_margin: 71.92 - i * 0.5,
|
||||||
net_margin: 32.56 - i * 0.3,
|
net_profit_margin: 32.56 - i * 0.3,
|
||||||
|
operating_profit_margin: 42.16 - i * 0.4,
|
||||||
|
cost_profit_ratio: 115.8 - i * 1.2,
|
||||||
|
ebit: 86140 - i * 1800
|
||||||
|
},
|
||||||
|
per_share_metrics: {
|
||||||
|
eps: 2.72 - i * 0.06,
|
||||||
|
basic_eps: 2.72 - i * 0.06,
|
||||||
|
diluted_eps: 2.70 - i * 0.06,
|
||||||
|
deducted_eps: 2.65 - i * 0.06,
|
||||||
|
bvps: 16.78 - i * 0.1,
|
||||||
|
operating_cash_flow_ps: 6.47 - i * 0.15,
|
||||||
|
capital_reserve_ps: 4.59 - i * 0.1,
|
||||||
|
undistributed_profit_ps: 8.08 - i * 0.15
|
||||||
|
},
|
||||||
|
growth: {
|
||||||
|
revenue_growth: 8.2 - i * 0.5,
|
||||||
|
net_profit_growth: 12.5 - i * 0.8,
|
||||||
|
deducted_profit_growth: 11.8 - i * 0.7,
|
||||||
|
parent_profit_growth: 12.3 - i * 0.75,
|
||||||
|
operating_cash_flow_growth: 15.6 - i * 1.0,
|
||||||
|
total_asset_growth: 5.6 - i * 0.3,
|
||||||
|
equity_growth: 6.8 - i * 0.4,
|
||||||
|
fixed_asset_growth: 4.2 - i * 0.2
|
||||||
|
},
|
||||||
|
operational_efficiency: {
|
||||||
|
total_asset_turnover: 0.41 - i * 0.01,
|
||||||
|
fixed_asset_turnover: 2.35 - i * 0.05,
|
||||||
|
current_asset_turnover: 0.82 - i * 0.02,
|
||||||
|
receivable_turnover: 12.5 - i * 0.3,
|
||||||
|
receivable_days: 29.2 + i * 0.7,
|
||||||
|
inventory_turnover: 0, // 银行无库存
|
||||||
|
inventory_days: 0,
|
||||||
|
working_capital_turnover: 1.68 - i * 0.04
|
||||||
|
},
|
||||||
|
solvency: {
|
||||||
current_ratio: 0.73 + i * 0.01,
|
current_ratio: 0.73 + i * 0.01,
|
||||||
quick_ratio: 0.71 + i * 0.01,
|
quick_ratio: 0.71 + i * 0.01,
|
||||||
debt_ratio: 93.52 + i * 0.05,
|
cash_ratio: 0.25 + i * 0.005,
|
||||||
asset_turnover: 0.41 - i * 0.01,
|
conservative_quick_ratio: 0.68 + i * 0.01,
|
||||||
inventory_turnover: 0, // 银行无库存
|
asset_liability_ratio: 93.52 + i * 0.05,
|
||||||
receivable_turnover: 0 // 银行特殊
|
interest_coverage: 8.56 - i * 0.2,
|
||||||
|
cash_to_maturity_debt_ratio: 0.45 - i * 0.01,
|
||||||
|
tangible_asset_debt_ratio: 94.12 + i * 0.05
|
||||||
|
},
|
||||||
|
expense_ratios: {
|
||||||
|
selling_expense_ratio: 7.60 + i * 0.1,
|
||||||
|
admin_expense_ratio: 9.65 + i * 0.1,
|
||||||
|
financial_expense_ratio: 4.19 + i * 0.1,
|
||||||
|
rd_expense_ratio: 5.48 + i * 0.1,
|
||||||
|
three_expense_ratio: 21.44 + i * 0.3,
|
||||||
|
four_expense_ratio: 26.92 + i * 0.4,
|
||||||
|
cost_ratio: 28.10 + i * 0.2
|
||||||
|
}
|
||||||
})),
|
})),
|
||||||
|
|
||||||
// 主营业务
|
// 主营业务
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export const IndustryRankingView: React.FC<IndustryRankingViewProps> = ({
|
|||||||
bgColor,
|
bgColor,
|
||||||
borderColor,
|
borderColor,
|
||||||
}) => {
|
}) => {
|
||||||
if (!industryRank || industryRank.length === 0) {
|
if (!industryRank || !Array.isArray(industryRank) || industryRank.length === 0) {
|
||||||
return (
|
return (
|
||||||
<Card>
|
<Card>
|
||||||
<CardBody>
|
<CardBody>
|
||||||
|
|||||||
@@ -57,8 +57,6 @@ import {
|
|||||||
CashflowTable,
|
CashflowTable,
|
||||||
FinancialMetricsTable,
|
FinancialMetricsTable,
|
||||||
MainBusinessAnalysis,
|
MainBusinessAnalysis,
|
||||||
IndustryRankingView,
|
|
||||||
StockComparison,
|
|
||||||
ComparisonAnalysis,
|
ComparisonAnalysis,
|
||||||
} from './components';
|
} from './components';
|
||||||
import type { FinancialPanoramaProps } from './types';
|
import type { FinancialPanoramaProps } from './types';
|
||||||
@@ -267,9 +265,6 @@ const FinancialPanorama: React.FC<FinancialPanoramaProps> = ({ stockCode: propSt
|
|||||||
<Tab>现金流量表</Tab>
|
<Tab>现金流量表</Tab>
|
||||||
<Tab>财务指标</Tab>
|
<Tab>财务指标</Tab>
|
||||||
<Tab>主营业务</Tab>
|
<Tab>主营业务</Tab>
|
||||||
<Tab>行业排名</Tab>
|
|
||||||
<Tab>业绩预告</Tab>
|
|
||||||
<Tab>股票对比</Tab>
|
|
||||||
</TabList>
|
</TabList>
|
||||||
|
|
||||||
<TabPanels>
|
<TabPanels>
|
||||||
@@ -371,59 +366,6 @@ const FinancialPanorama: React.FC<FinancialPanoramaProps> = ({ stockCode: propSt
|
|||||||
<TabPanel>
|
<TabPanel>
|
||||||
<MainBusinessAnalysis mainBusiness={mainBusiness} />
|
<MainBusinessAnalysis mainBusiness={mainBusiness} />
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
|
|
||||||
{/* 行业排名 */}
|
|
||||||
<TabPanel>
|
|
||||||
<IndustryRankingView
|
|
||||||
industryRank={industryRank}
|
|
||||||
bgColor={bgColor}
|
|
||||||
borderColor={borderColor}
|
|
||||||
/>
|
|
||||||
</TabPanel>
|
|
||||||
|
|
||||||
{/* 业绩预告 */}
|
|
||||||
<TabPanel>
|
|
||||||
{forecast && (
|
|
||||||
<VStack spacing={4} align="stretch">
|
|
||||||
{forecast.forecasts?.map((item, idx) => (
|
|
||||||
<Card key={idx}>
|
|
||||||
<CardBody>
|
|
||||||
<HStack justify="space-between" mb={2}>
|
|
||||||
<Badge colorScheme="blue">{item.forecast_type}</Badge>
|
|
||||||
<Text fontSize="sm" color="gray.500">
|
|
||||||
报告期: {item.report_date}
|
|
||||||
</Text>
|
|
||||||
</HStack>
|
|
||||||
<Text mb={2}>{item.content}</Text>
|
|
||||||
{item.reason && (
|
|
||||||
<Text fontSize="sm" color="gray.600">
|
|
||||||
{item.reason}
|
|
||||||
</Text>
|
|
||||||
)}
|
|
||||||
{item.change_range?.lower && (
|
|
||||||
<HStack mt={2}>
|
|
||||||
<Text fontSize="sm">预计变动范围:</Text>
|
|
||||||
<Badge colorScheme="green">
|
|
||||||
{item.change_range.lower}% ~ {item.change_range.upper}%
|
|
||||||
</Badge>
|
|
||||||
</HStack>
|
|
||||||
)}
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</VStack>
|
|
||||||
)}
|
|
||||||
</TabPanel>
|
|
||||||
|
|
||||||
{/* 股票对比 */}
|
|
||||||
<TabPanel>
|
|
||||||
<StockComparison
|
|
||||||
currentStock={currentStockCode}
|
|
||||||
stockInfo={stockInfo}
|
|
||||||
positiveColor={positiveColor}
|
|
||||||
negativeColor={negativeColor}
|
|
||||||
/>
|
|
||||||
</TabPanel>
|
|
||||||
</TabPanels>
|
</TabPanels>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user