更新Company页面的UI为FUI风格
This commit is contained in:
115
app.py
115
app.py
@@ -10995,18 +10995,18 @@ def get_hot_events():
|
||||
@app.route('/api/events/mainline', methods=['GET'])
|
||||
def get_events_by_mainline():
|
||||
"""
|
||||
获取按主线(lv2概念)分组的事件列表
|
||||
获取按主线(lv1/lv2/lv3概念)分组的事件列表
|
||||
|
||||
逻辑:
|
||||
1. 根据筛选条件获取事件列表
|
||||
2. 通过 related_concepts 表关联概念
|
||||
3. 调用 concept-api/hierarchy 获取概念的 lv2 归属
|
||||
4. 按 lv2 分组返回
|
||||
3. 调用 concept-api/hierarchy 获取概念的层级归属
|
||||
4. 按指定层级分组返回
|
||||
|
||||
参数:
|
||||
- recent_days: 近N天(默认7天)
|
||||
- importance: 重要性筛选(S,A,B,C 或 all)
|
||||
- limit: 每个主线最多返回多少事件(默认20)
|
||||
- group_by: 分组方式 (lv1/lv2/lv3/具体概念ID如L2_AI_INFRA),默认lv2
|
||||
|
||||
返回:
|
||||
{
|
||||
@@ -11023,7 +11023,9 @@ def get_events_by_mainline():
|
||||
...
|
||||
],
|
||||
"total_events": 100,
|
||||
"ungrouped_count": 5
|
||||
"ungrouped_count": 5,
|
||||
"group_by": "lv2",
|
||||
"hierarchy_options": {...} // 层级选项供前端下拉框使用
|
||||
}
|
||||
}
|
||||
"""
|
||||
@@ -11036,13 +11038,15 @@ def get_events_by_mainline():
|
||||
# 获取请求参数
|
||||
recent_days = request.args.get('recent_days', 7, type=int)
|
||||
importance = request.args.get('importance', 'all')
|
||||
group_by = request.args.get('group_by', 'lv2') # lv1/lv2/lv3 或具体ID
|
||||
|
||||
# 计算日期范围
|
||||
since_date = datetime.now() - timedelta(days=recent_days)
|
||||
|
||||
# ==================== 1. 获取概念层级映射 ====================
|
||||
# 调用 concept-api 获取层级结构
|
||||
concept_hierarchy_map = {} # { concept_name: { lv1, lv2, lv1_id, lv2_id } }
|
||||
concept_hierarchy_map = {} # { concept_name: { lv1, lv2, lv3, lv1_id, lv2_id, lv3_id } }
|
||||
hierarchy_options = {'lv1': [], 'lv2': [], 'lv3': []} # 层级选项供前端下拉框使用
|
||||
|
||||
try:
|
||||
# 从本地文件读取概念层级结构
|
||||
@@ -11053,19 +11057,48 @@ def get_events_by_mainline():
|
||||
hierarchy_data = json.load(f)
|
||||
hierarchy_list = hierarchy_data.get('hierarchy', [])
|
||||
|
||||
# 构建概念名称 -> lv2 映射
|
||||
# 构建概念名称 -> 完整层级映射 + 层级选项
|
||||
# 结构: L1 -> L2 -> L3 -> concepts (concepts 只在 L3 层)
|
||||
# JSON 字段名: lv1, lv1_id, lv2, lv2_id (不是 name/id)
|
||||
for lv1 in hierarchy_list:
|
||||
lv1_name = lv1.get('lv1', '')
|
||||
lv1_id = lv1.get('lv1_id', '')
|
||||
|
||||
# 添加 lv1 选项
|
||||
if lv1_id and lv1_name:
|
||||
hierarchy_options['lv1'].append({
|
||||
'id': lv1_id,
|
||||
'name': lv1_name
|
||||
})
|
||||
|
||||
for lv2 in lv1.get('children', []) or []:
|
||||
lv2_name = lv2.get('lv2', '')
|
||||
lv2_id = lv2.get('lv2_id', '')
|
||||
|
||||
# 添加 lv2 选项
|
||||
if lv2_id and lv2_name:
|
||||
hierarchy_options['lv2'].append({
|
||||
'id': lv2_id,
|
||||
'name': lv2_name,
|
||||
'lv1_id': lv1_id,
|
||||
'lv1_name': lv1_name
|
||||
})
|
||||
|
||||
# L3 层包含 concepts
|
||||
for lv3 in lv2.get('children', []) or []:
|
||||
lv3_name = lv3.get('lv3', '')
|
||||
lv3_id = lv3.get('lv3_id', '')
|
||||
|
||||
# 添加 lv3 选项
|
||||
if lv3_id and lv3_name:
|
||||
hierarchy_options['lv3'].append({
|
||||
'id': lv3_id,
|
||||
'name': lv3_name,
|
||||
'lv2_id': lv2_id,
|
||||
'lv2_name': lv2_name,
|
||||
'lv1_id': lv1_id,
|
||||
'lv1_name': lv1_name
|
||||
})
|
||||
|
||||
for concept in lv3.get('concepts', []) or []:
|
||||
concept_name = concept if isinstance(concept, str) else concept.get('name', '')
|
||||
if concept_name:
|
||||
@@ -11073,10 +11106,12 @@ def get_events_by_mainline():
|
||||
'lv1': lv1_name,
|
||||
'lv1_id': lv1_id,
|
||||
'lv2': lv2_name,
|
||||
'lv2_id': lv2_id
|
||||
'lv2_id': lv2_id,
|
||||
'lv3': lv3_name,
|
||||
'lv3_id': lv3_id
|
||||
}
|
||||
|
||||
app.logger.info(f'[mainline] 加载概念层级映射: {len(concept_hierarchy_map)} 个概念')
|
||||
app.logger.info(f'[mainline] 加载概念层级映射: {len(concept_hierarchy_map)} 个概念, lv1: {len(hierarchy_options["lv1"])}, lv2: {len(hierarchy_options["lv2"])}, lv3: {len(hierarchy_options["lv3"])}')
|
||||
except Exception as e:
|
||||
app.logger.warning(f'[mainline] 获取概念层级失败: {e}')
|
||||
|
||||
@@ -11175,15 +11210,32 @@ def get_events_by_mainline():
|
||||
|
||||
return None
|
||||
|
||||
# 判断分组方式
|
||||
is_specific_id = group_by.startswith('L1_') or group_by.startswith('L2_') or group_by.startswith('L3_')
|
||||
|
||||
for event in events:
|
||||
concepts = event_concepts_map.get(event.id, [])
|
||||
|
||||
# 找出该事件所属的所有 lv2
|
||||
event_lv2s = set()
|
||||
# 找出该事件所属的层级信息
|
||||
event_groups = set() # 存储 (group_id, group_name, parent_info) 元组
|
||||
for concept in concepts:
|
||||
hierarchy = find_concept_hierarchy(concept)
|
||||
if hierarchy:
|
||||
event_lv2s.add((hierarchy['lv2_id'], hierarchy['lv2'], hierarchy['lv1']))
|
||||
if is_specific_id:
|
||||
# 筛选特定概念ID
|
||||
if group_by.startswith('L1_') and hierarchy['lv1_id'] == group_by:
|
||||
event_groups.add((hierarchy['lv2_id'], hierarchy['lv2'], hierarchy['lv1'], hierarchy.get('lv3', ''), hierarchy.get('lv3_id', '')))
|
||||
elif group_by.startswith('L2_') and hierarchy['lv2_id'] == group_by:
|
||||
event_groups.add((hierarchy.get('lv3_id', hierarchy['lv2_id']), hierarchy.get('lv3', hierarchy['lv2']), hierarchy['lv2'], hierarchy['lv1'], ''))
|
||||
elif group_by.startswith('L3_') and hierarchy.get('lv3_id') == group_by:
|
||||
event_groups.add((hierarchy['lv3_id'], hierarchy['lv3'], hierarchy['lv2'], hierarchy['lv1'], ''))
|
||||
elif group_by == 'lv1':
|
||||
event_groups.add((hierarchy['lv1_id'], hierarchy['lv1'], '', '', ''))
|
||||
elif group_by == 'lv3':
|
||||
if hierarchy.get('lv3_id'):
|
||||
event_groups.add((hierarchy['lv3_id'], hierarchy['lv3'], hierarchy['lv2'], hierarchy['lv1'], ''))
|
||||
else: # 默认 lv2
|
||||
event_groups.add((hierarchy['lv2_id'], hierarchy['lv2'], hierarchy['lv1'], '', ''))
|
||||
|
||||
# 事件数据
|
||||
event_data = {
|
||||
@@ -11202,17 +11254,28 @@ def get_events_by_mainline():
|
||||
}
|
||||
}
|
||||
|
||||
if event_lv2s:
|
||||
# 添加到每个相关的 lv2 分组
|
||||
for lv2_id, lv2_name, lv1_name in event_lv2s:
|
||||
if lv2_id not in mainline_groups:
|
||||
mainline_groups[lv2_id] = {
|
||||
'lv2_id': lv2_id,
|
||||
'lv2_name': lv2_name,
|
||||
'lv1_name': lv1_name,
|
||||
if event_groups:
|
||||
# 添加到每个相关的分组
|
||||
for group_info in event_groups:
|
||||
group_id = group_info[0]
|
||||
group_name = group_info[1]
|
||||
parent_name = group_info[2] if len(group_info) > 2 else ''
|
||||
grandparent_name = group_info[3] if len(group_info) > 3 else ''
|
||||
|
||||
if group_id not in mainline_groups:
|
||||
mainline_groups[group_id] = {
|
||||
'group_id': group_id,
|
||||
'group_name': group_name,
|
||||
'parent_name': parent_name,
|
||||
'grandparent_name': grandparent_name,
|
||||
# 兼容旧字段
|
||||
'lv2_id': group_id if group_by == 'lv2' or group_by.startswith('L1_') else None,
|
||||
'lv2_name': group_name if group_by == 'lv2' or group_by.startswith('L1_') else parent_name,
|
||||
'lv1_name': parent_name if group_by == 'lv2' else grandparent_name,
|
||||
'lv3_name': group_name if group_by == 'lv3' or group_by.startswith('L2_') else None,
|
||||
'events': []
|
||||
}
|
||||
mainline_groups[lv2_id]['events'].append(event_data)
|
||||
mainline_groups[group_id]['events'].append(event_data)
|
||||
else:
|
||||
ungrouped_events.append(event_data)
|
||||
|
||||
@@ -11248,7 +11311,7 @@ def get_events_by_mainline():
|
||||
|
||||
# ==================== 6. 整理返回数据 ====================
|
||||
mainlines = []
|
||||
for lv2_id, group in mainline_groups.items():
|
||||
for group_id, group in mainline_groups.items():
|
||||
# 按时间倒序排列(不限制数量)
|
||||
group['events'] = sorted(
|
||||
group['events'],
|
||||
@@ -11256,8 +11319,8 @@ def get_events_by_mainline():
|
||||
reverse=True
|
||||
)
|
||||
group['event_count'] = len(group['events'])
|
||||
# 添加涨跌幅数据
|
||||
lv2_name = group.get('lv2_name', '')
|
||||
# 添加涨跌幅数据(目前只支持 lv2)
|
||||
lv2_name = group.get('lv2_name', '') or group.get('group_name', '')
|
||||
if lv2_name in lv2_price_map:
|
||||
group['avg_change_pct'] = lv2_price_map[lv2_name]['avg_change_pct']
|
||||
group['price_date'] = lv2_price_map[lv2_name]['trade_date']
|
||||
@@ -11276,6 +11339,8 @@ def get_events_by_mainline():
|
||||
'total_events': len(events),
|
||||
'mainline_count': len(mainlines),
|
||||
'ungrouped_count': len(ungrouped_events),
|
||||
'group_by': group_by,
|
||||
'hierarchy_options': hierarchy_options,
|
||||
# 调试信息
|
||||
'_debug': {
|
||||
'hierarchy_count': len(concept_hierarchy_map),
|
||||
|
||||
Reference in New Issue
Block a user