a3797e7508
性能:看板数据合并为单次请求 + 摄像头名称缓存
...
- 新增 GET /alert/dashboard 聚合接口,一次返回全部看板数据
- 共用同一个 DB session 执行所有查询,减少连接开销
- 摄像头名称服务增加 5 分钟内存缓存,避免重复查询 WVP
- 设备Top10 和最近告警共用一次批量摄像头名称查询
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 17:31:18 +08:00
6d68e2d9c0
修复:平均响应时间排除 handled_at 早于 event_time 的异常数据
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 17:20:04 +08:00
67bd8881fa
功能:新增看板统计接口(趋势、设备Top、时段分布)
...
- GET /alert/trend?days=7 — 按天+按类型的告警趋势
- GET /alert/device-top?limit=10&days=7 — 告警最多设备排行
- GET /alert/hour-distribution?days=7 — 24小时告警分布
- 扩展 statistics 接口:增加 todayCount/yesterdayCount/pendingCount/
handledCount/avgResponseMinutes 字段
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 17:06:08 +08:00
44c5df7302
功能:area_id 存储 + 工单对接代码完善 + 心跳端点
...
- AlarmEvent 模型添加 area_id 字段
- create_from_edge_report 提取 ext_data.area_id 存储
- 心跳端点 POST /api/ai/device/heartbeat
- work_order_client: create_order 支持完整参数(description/priority/triggerSource/cameraId/imageUrl)
- notify_dispatch: 工单标题中文化、alarmType 中文映射、永久 COS URL、triggerSource 来源判断
- oss_storage: 新增 get_permanent_url 方法
- 工单创建测试脚本
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 16:05:05 +08:00
ab338a509c
功能:VLM提示词和告警级别支持车辆违停/拥堵算法
...
- vlm_service.py: 新增illegal_parking和vehicle_congestion VLM复核提示词模板
- alarm_event_service.py: 新增违停告警级别逻辑(按停留时长分级)和拥堵告警级别
- wechat_service.py: ALARM_TYPE_NAMES新增车辆违停/拥堵中文映射
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-16 16:54:48 +08:00
6cbf89a38b
feat: 两步卡片状态机 + 安保工单对接 + 先到先得结单
...
- 新增 work_order_client.py:SHA256签名的工单API客户端(创建/自动结单)
- 企微卡片改为两步交互:确认接单→[已处理完成/标记误报]→终态
- 告警通知后自动创建工单,orderId存入alarm_event_ext
- 边缘端resolve支持先到先得:终态不可被覆盖
- 边缘端resolve后异步触发工单自动结单+卡片终态更新
- 新增WorkOrderConfig配置项
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 16:34:54 +08:00
9143022ee8
fix: 区分误报(IGNORED)和自动结单(DONE)状态
...
- VLM误报和手动忽略的handle_status改为IGNORED
- 自动结单(resolve_alarm)检查IGNORED状态,不覆盖误报
- 前端忽略操作兼容转换时自动设置handleStatus=IGNORED
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 09:12:14 +08:00
766ee6a69a
fix: 统一所有服务时间为北京时间 + 处理/忽略时计算告警时长
...
- notify_dispatch: _mark_false_alarm 使用 beijing_now() + 计算 duration_ms
- alarm_event_service: handle_alarm 处理时自动计算 duration_ms 和 last_frame_time
- notification_service: datetime.utcnow() 替换为 beijing_now()
- device_service: datetime.now(timezone.utc) 替换为 beijing_now()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 16:27:30 +08:00
1585abf843
fix: alarm_event_service 时间统一为北京时间
...
- 所有 datetime.now(timezone.utc) 替换为 beijing_now()
- 保持与边缘端上报时间(北京时间)一致
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 16:25:31 +08:00
f81cc81ce6
refactor(service): 删除MQTT旧代码 + 修复边缘节点重复显示问题
...
**删除MQTT旧代码:**
- 删除 mqtt_service.py(已废弃的空壳)
- 从 config.py 删除 MQTTConfig 类和相关配置
- 从 schemas.py 删除 mqtt 字段
- 从 alert_service.py 删除 create_alert_from_mqtt 方法
- 告警上报已改为 HTTP + COS 方案,MQTT机制完全废弃
**修复边缘节点重复显示(方案A):**
- 清理 edge_devices 表历史数据(删除 edge_device_001、edge_inference_device)
- 禁用 DeviceService 的 handle_heartbeat 自动创建设备功能
- 边缘端未实现心跳机制,告警数从 alarm_event 表统计
- 运行时长、处理帧数字段设为 null(无心跳机制,不可用)
- 添加 count_alarms_by_edge_node 方法统计边缘节点告警数
**影响范围:**
- /admin-api/aiot/edge/device/page 接口返回数据调整
- /admin-api/aiot/edge/device/get 接口返回数据调整
- 确保不破坏现有功能(告警上报已改为HTTP)
2026-02-25 10:30:01 +08:00
3bac8be70e
fix(alarm): 添加intrusion_cleared自动关闭处理
...
- resolve_alarm方法支持intrusion_cleared类型
- 自动标记为CLOSED状态,备注"入侵消失自动关闭(持续无人180秒)"
- 与person_returned和non_work_time保持一致
2026-02-25 09:26:52 +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