滚动条样式更新
This commit is contained in:
@@ -392,50 +392,25 @@ const ConceptTimelineModal = ({
|
||||
})
|
||||
);
|
||||
|
||||
// 获取新闻(通过股票代码聚合关联事件)
|
||||
// 新逻辑:每个概念有关联的股票,通过 related_stock 表聚合所有股票的关联新闻/事件
|
||||
// 获取新闻(通过概念名称直接查询关联事件)
|
||||
// 新逻辑:直接通过 related_concepts 表查询,无需先获取股票列表
|
||||
const fetchNews = async () => {
|
||||
try {
|
||||
// 提取股票代码列表
|
||||
let stockCodes = (stocks || [])
|
||||
.map(s => s.code || s.stock_code)
|
||||
.filter(Boolean);
|
||||
|
||||
// 如果 stocks 为空但有 conceptId,尝试从概念详情接口获取股票列表
|
||||
if (stockCodes.length === 0 && conceptId) {
|
||||
logger.info('ConceptTimelineModal', '股票列表为空,尝试从概念详情接口获取', { conceptId, conceptName });
|
||||
try {
|
||||
const detailRes = await fetch(`${API_BASE_URL}/concept/${encodeURIComponent(conceptId)}`);
|
||||
if (detailRes.ok) {
|
||||
const detailData = await detailRes.json();
|
||||
const detailStocks = detailData.stocks || [];
|
||||
stockCodes = detailStocks
|
||||
.map(s => s.code || s.stock_code)
|
||||
.filter(Boolean);
|
||||
logger.info('ConceptTimelineModal', `从概念详情获取到 ${stockCodes.length} 只股票`, { conceptId });
|
||||
} else {
|
||||
logger.warn('ConceptTimelineModal', '获取概念详情失败', { conceptId, status: detailRes.status });
|
||||
}
|
||||
} catch (detailErr) {
|
||||
logger.error('ConceptTimelineModal', '获取概念详情异常', detailErr, { conceptId });
|
||||
}
|
||||
}
|
||||
|
||||
if (stockCodes.length === 0) {
|
||||
logger.warn('ConceptTimelineModal', '概念没有关联股票,无法获取新闻', { conceptName });
|
||||
if (!conceptName) {
|
||||
logger.warn('ConceptTimelineModal', '缺少概念名称,无法获取新闻');
|
||||
return [];
|
||||
}
|
||||
|
||||
logger.info('ConceptTimelineModal', `通过 ${stockCodes.length} 只股票获取关联新闻`, { conceptName, stockCodes: stockCodes.slice(0, 5) });
|
||||
logger.info('ConceptTimelineModal', `通过概念名称获取关联事件`, { conceptName });
|
||||
|
||||
// 调用后端新 API 获取股票关联的事件
|
||||
const res = await fetch(`${MAIN_API_URL}/api/events/by-stocks`, {
|
||||
// 调用后端 API 通过概念名称直接获取关联事件
|
||||
const res = await fetch(`${MAIN_API_URL}/api/events/by-concept`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
stock_codes: stockCodes,
|
||||
concept_name: conceptName,
|
||||
start_date: startDateStr,
|
||||
end_date: endDateStr,
|
||||
limit: 200
|
||||
@@ -445,14 +420,14 @@ const ConceptTimelineModal = ({
|
||||
|
||||
if (!res.ok) {
|
||||
const text = await res.text();
|
||||
logger.error('ConceptTimelineModal', 'fetchTimelineData - Events by Stocks API', new Error(`HTTP ${res.status}`), { conceptName, status: res.status, response: text.substring(0, 200) });
|
||||
logger.error('ConceptTimelineModal', 'fetchTimelineData - Events by Concept API', new Error(`HTTP ${res.status}`), { conceptName, status: res.status, response: text.substring(0, 200) });
|
||||
return [];
|
||||
}
|
||||
|
||||
const result = await res.json();
|
||||
|
||||
if (!result.success) {
|
||||
logger.warn('ConceptTimelineModal', '获取股票关联事件失败', { conceptName, error: result.error });
|
||||
logger.warn('ConceptTimelineModal', '获取概念关联事件失败', { conceptName, error: result.error });
|
||||
return [];
|
||||
}
|
||||
|
||||
@@ -465,13 +440,14 @@ const ConceptTimelineModal = ({
|
||||
published_time: event.event_date || event.created_at,
|
||||
source: 'event', // 标记为事件来源
|
||||
url: null, // 事件没有外链
|
||||
related_stocks: event.related_stocks || [] // 保留关联股票信息
|
||||
related_stocks: event.related_stocks || [], // 保留关联股票信息
|
||||
related_concepts: event.related_concepts || [] // 保留关联概念信息
|
||||
}));
|
||||
|
||||
logger.info('ConceptTimelineModal', `获取到 ${newsArray.length} 条股票关联事件`, { conceptName });
|
||||
logger.info('ConceptTimelineModal', `获取到 ${newsArray.length} 条概念关联事件`, { conceptName });
|
||||
return newsArray;
|
||||
} catch (err) {
|
||||
logger.error('ConceptTimelineModal', 'fetchTimelineData - Events by Stocks API', err, { conceptName });
|
||||
logger.error('ConceptTimelineModal', 'fetchTimelineData - Events by Concept API', err, { conceptName });
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user