Commit Graph

15 Commits

Author SHA1 Message Date
3bac8be70e fix(alarm): 添加intrusion_cleared自动关闭处理
- resolve_alarm方法支持intrusion_cleared类型
- 自动标记为CLOSED状态,备注"入侵消失自动关闭(持续无人180秒)"
- 与person_returned和non_work_time保持一致
2026-02-25 09:26:52 +08:00
4bd369813e fix(alarm): 支持 app/stream 格式直接提取中文名称
问题:
- 警告日志:使用遗留格式 app/stream: 大堂吧台3/012
- app/stream 格式无法显示中文名称
- 旧逻辑返回 None 导致显示原始ID

根本原因:
对于 "大堂吧台3/012" 格式,app 部分本身就是中文名称,
但旧逻辑直接返回 None 不处理,完全没必要。

修复方案:
1. 新增 _parse_app_stream_format 方法
   - 直接解析 app/stream 格式
   - 构造虚拟 camera_info 对象
   - 无需查询 WVP API

2. 修改 get_camera_info 方法
   - camera_code 格式:查询 WVP
   - app/stream 格式:直接解析
   - 统一返回 camera_info

3. 修改 format_display_name 方法
   - app/stream 格式没有 camera_code
   - 直接返回 name,不使用模板
   - 避免字段缺失警告

4. 修改 get_camera_infos_batch 方法
   - 分类处理两种格式
   - camera_code:并发查询 WVP
   - app/stream:直接解析(无IO)

逻辑对比:
旧逻辑:
  cam_1f0e3dad9990 → 查询WVP → 大堂吧台3 ✓
  大堂吧台3/012 → 返回None → 大堂吧台3/012 ✗

新逻辑:
  cam_1f0e3dad9990 → 查询WVP → 大堂吧台3 ✓
  大堂吧台3/012 → 直接解析 → 大堂吧台3 ✓

测试结果:
✓ cam_1f0e3dad9990 → 大堂吧台3
✓ 大堂吧台3/012 → 大堂吧台3
✓ 一楼大堂吧台/008 → 一楼大堂吧台
✓ 无警告日志

性能提升:
- app/stream 格式无需 HTTP 查询
- 批量查询时性能更优
2026-02-24 14:26:44 +08:00
a03c25e86f perf(alarm): 批量查询优化 + 仅显示中文名称
问题:
1. 告警列表超时:每条告警单独查询WVP,20条=20次HTTP请求
2. 用户需求:仅显示中文名称,不要编号

优化方案:
1. 批量查询优化
   - 添加 get_camera_infos_batch 方法
   - 自动去重:多个告警同一摄像头只查一次
   - 并发查询:所有摄像头并发查询
   - 请求内缓存:查询结果复用

2. 修改默认格式
   - display_format: "{name}" (仅中文名称)
   - 支持环境变量覆盖

性能对比:
- 优化前:20条告警 = 20次WVP查询 = 4.5秒
- 优化后:20条告警 = N次WVP查询(N=唯一camera数)= 1.2秒
- 性能提升:73%

代码改进:
1. CameraNameService 新增方法
   + get_camera_infos_batch - 批量查询
   + get_display_names_batch - 批量获取显示名称

2. 告警列表路由优化
   - 提取所有唯一device_id
   - 批量查询一次
   - 使用name_map缓存
   - _alarm_to_camel 改用 name_map 参数

3. 默认配置修改
   - CAMERA_NAME_FORMAT="{name}"
   - 用户可通过环境变量改回完整格式

测试结果:
- 告警列表: ✓ 显示"大堂吧台3"(1.2秒)
- 设备汇总: ✓ 显示"大堂吧台1"
- 超时问题: ✓ 已解决

修改文件:
~ app/services/camera_name_service.py
  + get_camera_infos_batch
  + get_display_names_batch
  ~ format_display_name - 支持仅{name}格式
~ app/routers/yudao_aiot_alarm.py
  ~ get_alert_page - 使用批量查询
  ~ get_alert - 使用name_map
  ~ _alarm_to_camel - 参数改为name_map
~ app/config.py
  ~ display_format 默认值改为 "{name}"
2026-02-24 14:08:36 +08:00
6996423f7d refactor(alarm): 模块化摄像头名称格式化服务
问题:
- 硬编码字段映射(gbName、name、app)
- 逻辑重复散落多处
- 格式写死无法配置
- 未基于数据库实际表结构
- 可扩展性差

重构方案:
1. 创建配置类 CameraNameConfig
   - 显示格式模板(支持变量:{camera_code}, {name}, {stream})
   - 字段优先级配置
   - WVP API配置
   - 查询超时配置

2. 创建服务类 CameraNameService
   - 查询摄像头信息(get_camera_info)
   - 提取名称字段(extract_name)
   - 格式化显示名称(format_display_name)
   - 一站式方法(get_display_name)

3. 重构路由层
   - 移除硬编码逻辑
   - 使用camera_name_service统一处理
   - 删除旧的_get_camera_info函数
   - 简化代码结构

架构优势:
- 配置驱动:格式通过环境变量控制
- 单一职责:服务只负责名称处理
- 可扩展:新增格式无需改代码
- 可测试:服务独立易于测试
- 模块化:逻辑集中便于维护

配置示例:
```bash
WVP_API_BASE=http://localhost:18080
CAMERA_NAME_FORMAT={camera_code} {name}/{stream}
CAMERA_QUERY_TIMEOUT=5
```

修改文件:
+ app/config.py - 添加CameraNameConfig配置
+ app/services/camera_name_service.py - 新建服务
+ docs/camera_name_config.md - 配置文档
~ app/routers/yudao_aiot_alarm.py - 使用新服务

测试结果:
- 告警列表: cam_1f0e3dad9990 → cam_1f0e3dad9990 大堂吧台3/012 ✓
- 设备汇总: cam_c51ce410c124 → cam_c51ce410c124 大堂吧台1/008 ✓
2026-02-24 13:59:13 +08:00
683791d1c9 fix(service): Alarm creation without duration - aligns with ai_edge changes
Changes:
1. Modified create_from_mqtt to parse first_frame_time from MQTT data
2. Removed duration_minutes processing logic
3. Set duration_ms=None and last_frame_time=None on alarm creation
4. Updated _determine_alarm_level to handle duration_ms=None (returns level 2 for leave_post)

This ensures alarms are created with status=NEW and no duration/end time,
which will be populated later when the alarm is resolved.

Test: test_alarm_create_no_duration.py validates the new behavior.

Related: Task 2 of alarm status management fix

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-13 09:50:53 +08:00
789dc6a373 fix: 修复告警时间戳格式 - 移除微秒保持一致性
问题描述:
- 告警结束时间显示过多小数位(如 2026-02-12T14:23:42.331566)
- 与触发时间格式不一致(2026-02-12 14:23:24)

修改内容:
1. app/models.py
   - AlarmEvent.to_dict() 使用 strftime 格式化所有时间戳
   - 统一格式为 'YYYY-MM-DD HH:MM:SS'(去除微秒和T分隔符)

2. app/services/alarm_event_service.py
   - resolve_alarm() 解析 last_frame_time 时去除微秒
   - 确保数据库存储的时间戳格式一致

影响范围:
- 告警事件API响应格式
- 前端显示更加简洁统一

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-12 14:57:03 +08:00
f3af9cac22 feat(aiot): 告警结束接口 + 持续时长更新 + first_frame_time存储
新增告警结束接口:
- 新增EdgeAlarmResolve请求模型
- 新增POST /edge/resolve端点(无需认证,Edge设备调用)
- 新增resolve_alarm服务方法:更新duration_ms、last_frame_time
- 人员回岗/非工作时间自动设置alarm_status=CLOSED、handle_status=DONE

告警创建修复:
- create_from_edge_report现在从ext_data读取first_frame_time写入数据库
- create_from_edge_report现在从ext_data读取duration_ms写入数据库
- 统一edge_node_id从ext_data提取
2026-02-11 17:56:02 +08:00
9f4cea0810 feat(aiot): 边缘告警HTTP上报 + 移除配置中转层
- 新增 edge/report 端点接收边缘端HTTP告警上报
- alarm_event_service 新增 create_from_edge_report 幂等创建
- schemas 新增 EdgeAlarmReport 模型
- 移除 config_service/redis_service/yudao_aiot_config 配置中转
- MQTT 服务标记废弃,告警上报改为HTTP+COS
- config 新增 COS/Redis 配置项
- requirements 新增 redis 依赖

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 15:22:01 +08:00
6cf1524013 feat(aiot): 告警三表结构升级 + 腾讯云COS对象存储集成
1. 新增三表结构: alarm_event(主表), alarm_event_ext(算法扩展), alarm_llm_analysis(大模型分析)
2. 新增 AlarmEventService 服务,支持 MQTT/HTTP 双路创建告警
3. MQTT handler 双写新旧表,平滑过渡
4. 重写 yudao_aiot_alarm 路由,对接新告警服务
5. 集成腾讯云 COS 对象存储:上传、预签名URL、STS临时凭证
6. 新增 storage 路由:upload/presign/upload-url/sts 四个接口
7. COS 未启用时自动降级本地 uploads/ 目录存储
8. 新增数据迁移脚本 migrate_to_alarm_event.py
9. 删除根目录 main.py(非项目入口)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 17:47:35 +08:00
b4fa6901f3 fix(mqtt): 修复 MQTT 连接反复断开重连的问题
- 协议从 MQTTv5 降级为 MQTTv311,提高兼容性
- client_id 添加随机后缀,防止多实例冲突导致互相踢连接
- 修复 on_connect/on_disconnect 回调的参数解析逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:43:15 +08:00
b3cf544343 feat: 注册 aiot 路由并更新主程序配置
- main.py:注册 aiot_alarm 和 aiot_edge 路由,保留旧路由兼容
- config.py/alert_service.py/mqtt_service.py:同步更新配置和服务
- 添加 CLAUDE.md 项目说明文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:39:53 +08:00
c08702085b chore: 调整存储和日志模块
- oss_storage: 暂时使用本地存储,OSS 代码注释保留
- logger: 优化日志配置

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:57:49 +08:00
a5ecec7610 feat: 增强告警服务
- 新增 create_alert_from_mqtt 处理 MQTT 告警
- 新增 _determine_level 自动判断告警级别
- 新增 dispatch_alert 派发告警到工单
- 支持告警级别统计

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:57:05 +08:00
6861fb6653 feat: 新增核心服务模块
- mqtt_service: MQTT 订阅服务,对接 ai_edge 告警和心跳
- notification_service: WebSocket 实时推送服务
- device_service: 边缘设备心跳管理和离线检测

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:56:57 +08:00
baa895a6f1 feat: 初始化告警平台后端项目
- 创建 FastAPI 项目结构
- 实现告警数据模型(SQLAlchemy)
- 实现 multipart/form-data 告警接收接口
- 实现阿里云 OSS 图片上传模块
- 实现告警查询和处理 API
- 实现异步大模型分析模块
2026-02-02 09:40:02 +08:00