滚动条样式更新
This commit is contained in:
105
app.py
105
app.py
@@ -7261,6 +7261,111 @@ def get_events_by_stocks():
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
|
||||
@app.route('/api/events/by-concept', methods=['POST'])
|
||||
def get_events_by_concept():
|
||||
"""
|
||||
通过概念名称获取关联的事件
|
||||
用于概念中心时间轴:直接通过 related_concepts 表查询,无需先获取股票列表
|
||||
|
||||
请求体:
|
||||
{
|
||||
"concept_name": "人工智能", # 概念名称
|
||||
"start_date": "2024-01-01", # 可选,开始日期
|
||||
"end_date": "2024-12-31", # 可选,结束日期
|
||||
"limit": 200 # 可选,限制返回数量,默认200
|
||||
}
|
||||
"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
concept_name = data.get('concept_name', '').strip()
|
||||
start_date_str = data.get('start_date')
|
||||
end_date_str = data.get('end_date')
|
||||
limit = data.get('limit', 200)
|
||||
|
||||
if not concept_name:
|
||||
return jsonify({'success': False, 'error': '缺少概念名称'}), 400
|
||||
|
||||
# 通过 RelatedConcepts 表查询关联的事件
|
||||
query = db.session.query(Event).join(
|
||||
RelatedConcepts, Event.id == RelatedConcepts.event_id
|
||||
).filter(
|
||||
RelatedConcepts.concept == concept_name
|
||||
)
|
||||
|
||||
# 日期过滤
|
||||
if start_date_str:
|
||||
try:
|
||||
start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
|
||||
query = query.filter(Event.start_time >= start_date)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
if end_date_str:
|
||||
try:
|
||||
end_date = datetime.strptime(end_date_str, '%Y-%m-%d')
|
||||
end_date = end_date.replace(hour=23, minute=59, second=59)
|
||||
query = query.filter(Event.start_time <= end_date)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
# 去重并排序
|
||||
query = query.distinct().order_by(Event.start_time.desc())
|
||||
|
||||
# 限制数量
|
||||
if limit:
|
||||
query = query.limit(limit)
|
||||
|
||||
events = query.all()
|
||||
|
||||
# 构建返回数据
|
||||
events_data = []
|
||||
for event in events:
|
||||
# 获取该事件关联的所有股票信息
|
||||
related_stocks_list = [
|
||||
{
|
||||
'stock_code': rs.stock_code,
|
||||
'stock_name': rs.stock_name,
|
||||
'sector': rs.sector
|
||||
}
|
||||
for rs in event.related_stocks
|
||||
]
|
||||
|
||||
# 获取该事件关联的所有概念(包括关联原因)
|
||||
related_concepts_list = [
|
||||
{
|
||||
'concept': rc.concept,
|
||||
'reason': rc.reason
|
||||
}
|
||||
for rc in event.related_concepts
|
||||
]
|
||||
|
||||
events_data.append({
|
||||
'id': event.id,
|
||||
'title': event.title,
|
||||
'description': event.description,
|
||||
'event_date': event.start_time.isoformat() if event.start_time else None,
|
||||
'published_time': event.start_time.strftime('%Y-%m-%d %H:%M:%S') if event.start_time else None,
|
||||
'source': 'event',
|
||||
'importance': event.importance,
|
||||
'view_count': event.view_count,
|
||||
'hot_score': event.hot_score,
|
||||
'related_stocks': related_stocks_list,
|
||||
'related_concepts': related_concepts_list,
|
||||
'event_type': event.event_type,
|
||||
'created_at': event.created_at.isoformat() if event.created_at else None
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': events_data,
|
||||
'total': len(events_data)
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
app.logger.error(f'[by-concept] 查询失败: {str(e)}')
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
|
||||
@app.route('/api/events/<int:event_id>/concepts', methods=['GET'])
|
||||
def get_related_concepts(event_id):
|
||||
"""获取相关概念列表(AI分析结果)"""
|
||||
|
||||
Reference in New Issue
Block a user