修复:日报摄像头Top5显示代码而非名称

日报生成时直接读取IoT数据库的camera_name字段,该字段存的是
camera_code(如cam_2043d9aed65c),导致日报中摄像头名称
无法识别。

改为统一收集camera_id,通过camera_name_service批量调WVP API
解析真实名称,解析失败时降级使用camera_code。
This commit is contained in:
2026-04-02 09:34:50 +08:00
parent 88616f0940
commit 57df6a2704

View File

@@ -117,7 +117,7 @@ async def generate_daily_report() -> Optional[str]:
type_count = {"SECURITY": 0, "CLEAN": 0}
status_count = Counter()
alarm_type_count = Counter()
camera_counter = Counter()
camera_code_counter = Counter() # 先按 camera_code 统计
false_alarm_count = 0
response_times: List[float] = []
cleaning_type_count = Counter()
@@ -132,10 +132,10 @@ async def generate_daily_report() -> Optional[str]:
if sec_ext:
if sec_ext.alarm_type:
alarm_type_count[sec_ext.alarm_type] += 1
if sec_ext.camera_name:
camera_counter[sec_ext.camera_name] += 1
elif sec_ext.camera_id:
camera_counter[sec_ext.camera_id] += 1
# 统一用 camera_id即 camera_code做 key后续批量解析名称
cam_key = sec_ext.camera_id or sec_ext.camera_name
if cam_key:
camera_code_counter[cam_key] += 1
if sec_ext.false_alarm == 1:
false_alarm_count += 1
# 响应时长dispatched → confirmed
@@ -149,6 +149,20 @@ async def generate_daily_report() -> Optional[str]:
if clean_ext and clean_ext.cleaning_type:
cleaning_type_count[clean_ext.cleaning_type] += 1
# 批量解析摄像头名称camera_code → 真实名称)
camera_counter = Counter()
if camera_code_counter:
try:
from app.services.camera_name_service import get_camera_name_service
cam_svc = get_camera_name_service()
name_map = await cam_svc.get_display_names_batch(list(camera_code_counter.keys()))
for code, count in camera_code_counter.items():
display_name = name_map.get(code, code)
camera_counter[display_name] += count
except Exception as e:
logger.warning(f"摄像头名称解析失败,降级使用代码: {e}")
camera_counter = camera_code_counter
# 环比
if prev_total > 0:
change_pct = (yesterday_total - prev_total) / prev_total * 100