diff --git a/src/views/Community/components/HeroPanel.js b/src/views/Community/components/HeroPanel.js
index 63753f4f..9e084b36 100644
--- a/src/views/Community/components/HeroPanel.js
+++ b/src/views/Community/components/HeroPanel.js
@@ -51,7 +51,6 @@ import { eventService } from '@services/eventService';
import { getApiBase } from '@utils/apiConfig';
import ReactMarkdown from 'react-markdown';
import dayjs from 'dayjs';
-import RelatedStocksSection from '@components/EventDetailPanel/RelatedStocksSection';
const { TabPane } = Tabs;
const { Text: AntText } = Typography;
@@ -415,6 +414,9 @@ const DetailModal = ({ isOpen, onClose, selectedDate, ztDetail, events, loading
const [selectedEventStocks, setSelectedEventStocks] = useState([]);
const [selectedEventTime, setSelectedEventTime] = useState(null);
const [selectedEventTitle, setSelectedEventTitle] = useState('');
+ const [stockQuotes, setStockQuotes] = useState({});
+ const [stockQuotesLoading, setStockQuotesLoading] = useState(false);
+ const [expandedReasons, setExpandedReasons] = useState({});
// 板块数据处理 - 必须在条件返回之前调用所有hooks
const sectorList = useMemo(() => {
@@ -473,6 +475,235 @@ const DetailModal = ({ isOpen, onClose, selectedDate, ztDetail, events, loading
setDetailDrawerVisible(true);
};
+ // 获取六位股票代码(去掉后缀)
+ const getSixDigitCode = (code) => {
+ if (!code) return code;
+ return code.split('.')[0];
+ };
+
+ // 加载股票行情
+ const loadStockQuotes = async (stocks) => {
+ if (!stocks || stocks.length === 0) return;
+ setStockQuotesLoading(true);
+ const quotes = {};
+
+ for (const stock of stocks) {
+ const code = getSixDigitCode(stock.code);
+ try {
+ const response = await fetch(`${getApiBase()}/api/market/trade/${code}?days=1`);
+ if (response.ok) {
+ const data = await response.json();
+ if (data.success && data.data && data.data.length > 0) {
+ const latest = data.data[data.data.length - 1];
+ quotes[stock.code] = {
+ price: latest.close,
+ change: latest.change_amount,
+ changePercent: latest.change_percent
+ };
+ }
+ }
+ } catch (err) {
+ console.error('加载股票行情失败:', code, err);
+ }
+ }
+
+ setStockQuotes(quotes);
+ setStockQuotesLoading(false);
+ };
+
+ // 显示相关股票
+ const showRelatedStocks = (stocks, eventTime, eventTitle) => {
+ if (!stocks || stocks.length === 0) return;
+
+ // 归一化股票数据格式
+ const normalizedStocks = stocks.map(stock => {
+ if (typeof stock === 'object' && !Array.isArray(stock)) {
+ return {
+ code: stock.code || stock.stock_code || '',
+ name: stock.name || stock.stock_name || '',
+ description: stock.description || stock.relation_desc || '',
+ score: stock.score || 0,
+ report: stock.report || null,
+ };
+ }
+ if (Array.isArray(stock)) {
+ return {
+ code: stock[0] || '',
+ name: stock[1] || '',
+ description: stock[2] || '',
+ score: stock[3] || 0,
+ report: null,
+ };
+ }
+ return null;
+ }).filter(Boolean);
+
+ // 按相关度排序
+ const sortedStocks = normalizedStocks.sort((a, b) => (b.score || 0) - (a.score || 0));
+
+ setSelectedEventStocks(sortedStocks);
+ setSelectedEventTime(eventTime);
+ setSelectedEventTitle(eventTitle);
+ setStocksDrawerVisible(true);
+ setExpandedReasons({});
+ loadStockQuotes(sortedStocks);
+ };
+
+ // 相关股票表格列定义(和投资日历保持一致)
+ const stockColumns = [
+ {
+ title: '代码',
+ dataIndex: 'code',
+ key: 'code',
+ width: 90,
+ render: (code) => {
+ const sixDigitCode = getSixDigitCode(code);
+ return (
+
+ {sixDigitCode}
+
+ );
+ }
+ },
+ {
+ title: '名称',
+ dataIndex: 'name',
+ key: 'name',
+ width: 100,
+ render: (name, record) => {
+ const sixDigitCode = getSixDigitCode(record.code);
+ return (
+
+