@@ -3,13 +3,11 @@ import { Link, Spinner, Tab, TabList, Text, Badge, makeStyles, mergeClasses } fr
33import { EditRegular } from '@fluentui/react-icons'
44import { research } from '../api/client'
55import type {
6- FinancialSummaryData ,
76 ProfileInstitutionRating ,
87 ProfilePlateItem ,
98 StockDetailData ,
109 StockDividendItem ,
1110 StockMoneyFlowItem ,
12- StockNewsItem ,
1311 StockProfileData ,
1412 StockShareholderData ,
1513 WatchlistItem ,
@@ -37,7 +35,7 @@ import type { HoldingSnapshot } from './useFollowPortfolio'
3735import { opptrixTokens , opptrixCssVars } from '../theme/tokens'
3836import { ghostInteractive } from '../theme/mixins'
3937
40- type DetailTab = 'analysis' | 'chart' | 'trend' | 'basic' | 'company' | 'news' | 'f10'
38+ type DetailTab = 'analysis' | 'chart' | 'trend' | 'basic' | 'company'
4139
4240const CONTENT_PAD = '15px'
4341
@@ -482,35 +480,6 @@ function MetricSection({ title, children }: { title: string; children: ReactNode
482480 )
483481}
484482
485- function NewsPanel ( { items } : { items : StockNewsItem [ ] } ) {
486- const s = useStyles ( )
487- if ( ! items . length ) {
488- return < Text className = { s . emptyHint } > 暂无公告信息</ Text >
489- }
490- return (
491- < div className = { s . flatList } >
492- { items . map ( ( item , index ) => (
493- < div key = { listRowKey ( index , item . date , item . title , item . url ) } className = { s . annRow } >
494- < span className = { s . listDate } > { item . date || '—' } </ span >
495- { item . url ? (
496- < Link
497- className = { s . listTitle }
498- href = { item . url }
499- target = "_blank"
500- rel = "noreferrer"
501- onClick = { event => openExternalUrl ( item . url ! , event ) }
502- >
503- { item . title }
504- </ Link >
505- ) : (
506- < span className = { s . listTitle } > { item . title } </ span >
507- ) }
508- </ div >
509- ) ) }
510- </ div >
511- )
512- }
513-
514483function DividendPanel ( { items } : { items : StockDividendItem [ ] } ) {
515484 const s = useStyles ( )
516485 if ( ! items . length ) {
@@ -686,33 +655,6 @@ function InstitutionRatingPanel({ rating }: { rating: ProfileInstitutionRating }
686655 )
687656}
688657
689- function FinancialHistoryPanel ( { rows } : { rows : FinancialSummaryData [ ] } ) {
690- const s = useStyles ( )
691- if ( ! rows . length ) {
692- return < Text className = { s . emptyHint } > 暂无历史财务数据</ Text >
693- }
694- return (
695- < div className = { s . flatList } >
696- < div className = { s . tableHeadWide } >
697- < span className = { s . tableHeadCell } > 报告期</ span >
698- < span className = { s . tableHeadCell } > 类型</ span >
699- < span className = { s . tableHeadCell } > 营收</ span >
700- < span className = { s . tableHeadCell } > 净利</ span >
701- < span className = { s . tableHeadCell } > ROE</ span >
702- </ div >
703- { rows . slice ( 0 , 12 ) . map ( ( row , index ) => (
704- < div key = { listRowKey ( index , row . reportDate , row . reportType ) } className = { s . tableRowWide } >
705- < span className = { s . tableCell } > { row . reportDate || '—' } </ span >
706- < span className = { s . tableCell } > { row . reportType || '—' } </ span >
707- < span className = { s . tableCell } > { formatCompactNumber ( row . revenue ) } </ span >
708- < span className = { s . tableCell } > { formatCompactNumber ( row . netProfit ) } </ span >
709- < span className = { s . tableCell } > { row . roe != null ? `${ row . roe . toFixed ( 2 ) } %` : '—' } </ span >
710- </ div >
711- ) ) }
712- </ div >
713- )
714- }
715-
716658function StockDetailTab ( {
717659 stock,
718660 isHolding = false ,
@@ -814,7 +756,6 @@ function StockDetailTab({
814756
815757 const quote = detail . quote
816758 const profile = detail . profile
817- const financial = detail . financial
818759 const displayName = detail . name && detail . name !== detail . code
819760 ? detail . name
820761 : ( stock . name && stock . name !== stock . code ? stock . name : ( profile ?. name || profile ?. orgName || detail . code ) )
@@ -876,8 +817,6 @@ function StockDetailTab({
876817 < Tab value = "analysis" > 分析</ Tab >
877818 < Tab value = "basic" > 概况</ Tab >
878819 < Tab value = "company" > 公司</ Tab >
879- < Tab value = "news" > 公告</ Tab >
880- < Tab value = "f10" > 财务</ Tab >
881820 </ TabList >
882821 </ div >
883822
@@ -947,9 +886,6 @@ function StockDetailTab({
947886 < Metric label = "总市值" value = { formatCompactNumber ( profile ?. totalMarketCap ?? quote ?. marketCap ?? null ) } />
948887 < Metric label = "流通市值" value = { formatCompactNumber ( profile ?. circulatingMarketCap ?? null ) } />
949888 < Metric label = "所属行业" value = { formatIndustryLine ( profile , stock . industry ) } />
950- < Metric label = "EPS" value = { financial ?. eps != null ? financial . eps . toFixed ( 2 ) : '—' } />
951- < Metric label = "每股净资产" value = { financial ?. bps != null ? financial . bps . toFixed ( 2 ) : '—' } />
952- < Metric label = "报告类型" value = { financial ?. reportType ?? '—' } />
953889 </ div >
954890 </ MetricSection >
955891
@@ -975,23 +911,6 @@ function StockDetailTab({
975911 </ div >
976912 </ MetricSection >
977913 ) : null }
978-
979- { financial && (
980- < MetricSection title = "盈利能力" >
981- < div className = { s . metricGrid3 } >
982- < Metric label = "营收" value = { formatCompactNumber ( financial . revenue ) } />
983- < Metric label = "营收同比" value = { formatPct ( financial . revenueYoy ) } />
984- < Metric label = "净利润" value = { formatCompactNumber ( financial . netProfit ) } />
985- < Metric label = "净利同比" value = { formatPct ( financial . netProfitYoy ) } />
986- < Metric label = "ROE" value = { financial . roe != null ? `${ financial . roe . toFixed ( 2 ) } %` : '—' } />
987- < Metric label = "毛利率" value = { financial . grossMargin != null ? `${ financial . grossMargin . toFixed ( 2 ) } %` : '—' } />
988- < Metric label = "净利率" value = { financial . netMargin != null ? `${ financial . netMargin . toFixed ( 2 ) } %` : '—' } />
989- < Metric label = "资产负债率" value = { financial . debtRatio != null ? `${ financial . debtRatio . toFixed ( 2 ) } %` : '—' } />
990- < Metric label = "每股现金流" value = { financial . operatingCashFlow != null ? financial . operatingCashFlow . toFixed ( 2 ) : '—' } />
991- < Metric label = "报告期" value = { financial . reportDate || '—' } />
992- </ div >
993- </ MetricSection >
994- ) }
995914 </ div >
996915 </ div >
997916
@@ -1114,39 +1033,6 @@ function StockDetailTab({
11141033 < Text className = { s . prose } block > { profile . businessScope } </ Text >
11151034 </ MetricSection >
11161035 ) }
1117- </ div >
1118- </ div >
1119-
1120- < div className = { mergeClasses ( s . tabPanel , detailTab !== 'news' && s . tabPanelHidden ) } >
1121- < div className = { mergeClasses ( s . scrollPanel , 'opptrix-scroll' ) } >
1122- < NewsPanel items = { detail . news ?? [ ] } />
1123- </ div >
1124- </ div >
1125-
1126- < div className = { mergeClasses ( s . tabPanel , detailTab !== 'f10' && s . tabPanelHidden ) } >
1127- < div className = { mergeClasses ( s . scrollPanel , 'opptrix-scroll' ) } >
1128- { financial && (
1129- < MetricSection title = "最新财报摘要" >
1130- < div className = { s . metricGrid3 } >
1131- < Metric label = "营收" value = { formatCompactNumber ( financial . revenue ) } />
1132- < Metric label = "营收同比" value = { formatPct ( financial . revenueYoy ) } />
1133- < Metric label = "净利润" value = { formatCompactNumber ( financial . netProfit ) } />
1134- < Metric label = "净利同比" value = { formatPct ( financial . netProfitYoy ) } />
1135- < Metric label = "ROE" value = { financial . roe != null ? `${ financial . roe . toFixed ( 2 ) } %` : '—' } />
1136- < Metric label = "毛利率" value = { financial . grossMargin != null ? `${ financial . grossMargin . toFixed ( 2 ) } %` : '—' } />
1137- < Metric label = "净利率" value = { financial . netMargin != null ? `${ financial . netMargin . toFixed ( 2 ) } %` : '—' } />
1138- < Metric label = "资产负债率" value = { financial . debtRatio != null ? `${ financial . debtRatio . toFixed ( 2 ) } %` : '—' } />
1139- < Metric label = "每股现金流" value = { financial . operatingCashFlow != null ? financial . operatingCashFlow . toFixed ( 2 ) : '—' } />
1140- < Metric label = "每股净资产" value = { financial . bps != null ? financial . bps . toFixed ( 2 ) : '—' } />
1141- < Metric label = "EPS" value = { financial . eps != null ? financial . eps . toFixed ( 2 ) : '—' } />
1142- < Metric label = "报告期" value = { `${ financial . reportDate || '—' } ${ financial . reportType ?? '' } ` . trim ( ) } />
1143- </ div >
1144- </ MetricSection >
1145- ) }
1146-
1147- < MetricSection title = "财务历史" >
1148- < FinancialHistoryPanel rows = { detail . financialHistory ?? [ ] } />
1149- </ MetricSection >
11501036
11511037 < MetricSection title = "分红送转" >
11521038 < DividendPanel items = { detail . dividends ?? [ ] } />
0 commit comments