diff --git a/app/services/daily_report_service.py b/app/services/daily_report_service.py index 1bd4bc8..6f96a8b 100644 --- a/app/services/daily_report_service.py +++ b/app/services/daily_report_service.py @@ -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