Commit Graph

60 Commits

Author SHA1 Message Date
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
b1b96a3ebc fix: 统一数据库时间为北京时间(UTC+8)
- 新增 app/utils/timezone.py 提供 beijing_now() 工具函数
- models.py 所有表的 created_at/updated_at 默认值从 UTC 改为北京时间
- 解决 event_time(边缘端北京时间)与 handled_at(服务端UTC)差8小时的问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 16:23:05 +08:00
24c94ccfbe refactor: 移除企微Webhook机器人代码,修复VLM日志
- 删除 wechat_service.send_webhook_alarm 方法
- 删除 config.py 中 webhook_url 配置
- 简化 notify_dispatch 通知逻辑(仅保留应用消息)
- 修复 vlm_service 使用项目统一 logger
- 添加 VLM 调用 URL 调试日志

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 15:35:32 +08:00
0fbc1ca7a0 fix: VLM复核前将COS object key转为预签名URL
snapshot_url存储的是COS对象路径而非完整URL,
VLM无法直接访问,需先生成预签名URL。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 12:58:27 +08:00
d5550d8904 fix: VLM降级跳过时不再自动标记告警为误报
VLM调用失败(skipped=true)和VLM判定误报是两种情况,
降级跳过时保留告警原始状态,让人工处理。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 12:52:05 +08:00
840bb0e720 feat: 添加企微群机器人Webhook推送(无需IP白名单)
- wechat_service 新增 send_webhook_alarm 方法(markdown格式)
- notify_dispatch 优先使用Webhook,失败降级到应用消息
- config 新增 WECHAT_WEBHOOK_URL 配置项

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 12:31:55 +08:00
ce5272413b fix: 修复通知日志不可见问题
- notify_dispatch/agent_dispatcher 改用主logger(alert_platform)
- edge_compat 异常不再静默吞掉,输出错误日志

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 11:22:06 +08:00
7cc4f604d0 feat: 交互Agent + VLM优化 + 企微演示模式
- 新增交互Agent调度器(意图识别 + 工单/查询/报表/闲聊4个Handler)
- 新增工单服务、Excel报表生成器、企微消息加解密模块
- VLM提示词优化(角色设定、≤25字描述、布尔值优先输出)
- VLM降级策略(入侵默认放行、离岗默认拦截)
- 企微演示模式(WECHAT_TEST_UIDS兜底 + SERVICE_BASE_URL修复)
- 新增Agent回调路由和测试接口

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 10:42:32 +08:00
1d84456c0f feat: 重写H5告警详情页,实现状态感知的交互设计
- 待处理: 显示3个按钮(前往处理/已处理/误报忽略)
- 处理中: 显示2个按钮(已处理/误报忽略)
- 已处理/已忽略/自动关闭: 隐藏按钮,显示结果条
- 添加确认弹窗防止误操作
- 优化移动端显示(word-break, 圆角等)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 14:18:01 +08:00
5b00fd0464 feat: 添加告警详情H5页面,企微卡片点击可查看详情并操作
- 新增 H5 告警详情页面(截图+信息+3个操作按钮)
- 企微卡片"查看详情"跳转到 H5 页面
- 操作按钮改为:前往处理/已处理/误报忽略
- 新增 alarm_detail API 供 H5 页面获取告警+VLM分析数据
- 挂载 /static 目录提供 H5 页面访问
2026-03-06 13:43:55 +08:00
35386b8e6e feat: V1 VLM复核 + 企微通知 + 手动结单
- 新增3张通知路由表模型(notify_area, camera_area_binding, area_person_binding)
- 新增VLM复核服务,通过qwen3-vl-flash对告警截图二次确认
- 新增企微通知服务,告警确认后推送文本卡片给责任人
- 新增通知调度服务,编排VLM复核→查表路由→企微推送流水线
- 新增企微回调接口,支持手动结单/确认处理/标记误报
- 新增通知管理API,区域/摄像头绑定/人员绑定CRUD
- 告警上报主流程(edge_compat + yudao_aiot_alarm)接入异步通知
- 扩展配置项支持VLM和企微环境变量
- 添加openai==1.68.0依赖(通过DashScope兼容端点调用)
2026-03-06 13:35:40 +08:00
09e0dbbc38 docs: 添加 VLM 验证 + 企微通知 V1 实施计划
包含 9 个任务的详细实施计划:
- 数据库表设计(通知区域、摄像头绑定、人员绑定)
- VLM 视觉验证服务
- 企微通知服务
- 告警主流程集成
- 通知管理 API
2026-03-06 11:14:57 +08:00
b14ac9eea7 文档:更新 CLAUDE.md 反映生产环境部署
主要更新:
- 添加生产部署信息(容器名称、端口、部署位置)
- 更新 Docker 部署命令(反映真实的 vsp-service 容器)
- 数据库从 SQLite 改为腾讯云 MySQL
- 补充关键接口说明(边缘端上报、前端访问、WebSocket)
- 移除过时的 MQTT 相关说明
- 强调使用 python -m app.main 作为入口

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-05 16:26:27 +08:00
94ad8d8045 fix(aiot): COS 未启用时 get_url 返回空字符串而非裸 object_key
修复告警截图显示为损坏图片的根因:
- get_url() 保证返回值为 http(s) URL 或空字符串
- _init() 捕获 COS 初始化异常,优雅降级而非崩溃

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 14:21:11 +08:00
51dbad6794 fix: 告警列表500错误修复 + 摄像头查询容错 + COS认证重构
- 添加缺失的 import httpx(修复 _notify_ops_platform NameError)
- 摄像头批量查询加 try/except 容错,失败时降级使用 device_id
- 摄像头查询超时从 5 秒提升到 15 秒
- COS 存储重构:支持 CVM 角色认证 + 密钥认证双模式
- STS 接口改为返回提示(CVM 模式不支持 STS)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 13:33:28 +08:00
9cee0a2cac fix: 添加 pymysql 依赖 + Edge 兼容路由
- requirements.txt 添加 pymysql、cos-python-sdk-v5
- 新增 /api/ai/alert/edge/report 和 /edge/resolve 路由(无认证)
- 使 Edge 设备可直接上报到 FastAPI 服务

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 13:18:35 +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
a927388388 fix(alarm): 修复告警详情接口500错误
- 更新 get_alert 接口调用 _alarm_to_camel 的参数
- 使用 camera_info_map 替代 name_map
- 正确传递 camera_service 参数
2026-02-24 16:24:42 +08:00
0d27e98d09 feat(alarm): 统一使用stream编号作为摄像头ID
- 设备汇总和告警列表统一使用stream(012、008等)作为cameraId
- 支持camera_code格式:从WVP API查询获取stream
- 支持app/stream格式:直接解析提取stream部分
- 优化批量查询性能,使用camera_info_map减少重复查询
2026-02-24 14:49:36 +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
0c01e4c40d fix(alarm): 添加 cameraName 字段显示中文摄像头名称
问题:
- 告警列表"摄像头"列显示 cam_1f0e3dad9990(编号)
- 前端可能绑定了 cameraName 字段,但后端未返回

原因分析:
- _alarm_to_camel 只更新了 deviceName 字段
- 前端表格"摄像头"列绑定的是 cameraName 字段
- cameraId 保持原始ID(用于查询过滤)

解决方案:
添加 cameraName 字段,值为中文名称

字段说明:
- cameraId: cam_1f0e3dad9990(原始ID,用于查询)
- cameraName: 大堂吧台3(中文名称,用于显示)
- deviceName: 大堂吧台3(中文名称,兼容字段)

测试结果:
✓ cameraId: cam_1f0e3dad9990
✓ cameraName: 大堂吧台3
✓ deviceName: 大堂吧台3

前端现在应该能正确显示中文摄像头名称了。
2026-02-24 14:22:50 +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
ea599ed999 refactor(alarm): 统一摄像头名称显示格式
变更:
- 统一格式为:camera_code 摄像头名称/stream
- 示例:cam_c51ce410c124 大堂吧台1/008

修改内容:
1. 告警列表页面 (_alarm_to_camel)
   - 提取 cameraCode、摄像头名称、stream
   - 组合为统一格式

2. 设备汇总页面 (get_device_summary_page)
   - 使用相同的统一格式逻辑
   - 保证两个页面显示一致

测试结果:
- 告警列表: cam_1f0e3dad9990 → cam_1f0e3dad9990 大堂吧台3/012 ✓
- 设备汇总: cam_c51ce410c124 → cam_c51ce410c124 大堂吧台1/008 ✓
2026-02-24 13:51:23 +08:00
ea20175616 fix(alarm): 修复告警列表和汇总显示 camera_code 问题
问题:
- 告警列表和汇总页面显示 camera_code(例如 cam_1f0e3dad9990)而不是中文摄像头名称
- _get_camera_info 函数过早检查 token 导致查询失败

修复:
1. 移除 camera_code 查询路径中不必要的 token 检查
   - /api/ai/camera/get 已加入白名单,不需要认证
   - 仅对 app/stream 格式保留 token 检查

2. 修复告警列表页面摄像头名称显示
   - 将 _alarm_to_camel 改为 async 函数
   - 添加摄像头名称查询逻辑(三级 fallback)
   - 使用 asyncio.gather 并发查询提升性能

3. 添加调试日志
   - 记录摄像头查询请求和响应
   - 便于排查问题

测试结果:
- 告警汇总: cam_1f0e3dad9990 → "大堂吧台3" ✓
- 告警列表: cam_1f0e3dad9990 → "大堂吧台3" ✓

相关文件:
- app/routers/yudao_aiot_alarm.py
2026-02-24 13:45:07 +08:00
4eaad734ba fix(aiot): 修复摄像头查询接口URL路径错误
问题:告警汇总页面仍显示camera_code而非中文名称
根因:service调用WVP接口使用了错误的URL路径
- 错误URL: /admin-api/aiot/device/camera/get(前端代理路径)
- 正确URL: /api/ai/camera/get(WVP实际接口路径)

说明:
- /admin-api/aiot/device/* 是前端vite代理路由
- service是后端服务,应直接调用WVP真实接口路径
- 该接口已加入认证白名单,移除headers认证

修复:
- 修改URL为 /api/ai/camera/get
- 移除无需的Authorization headers

影响文件:
- app/routers/yudao_aiot_alarm.py:375
2026-02-24 13:34:21 +08:00
903fefd71e fix(aiot): 修复告警汇总摄像头名称显示问题 - 三级fallback策略
问题:告警汇总页面显示camera_code(cam_1f0e3dad9990)而非中文名称

根因:从WVP查询摄像头信息后,使用了错误的fallback顺序
- 旧逻辑:优先app → name → device_id
- app字段通常等于camera_code,导致显示技术编号

修复:采用与WVP AiAlertMapper相同的三级fallback策略
1. gb_name去除"/"后缀(如果有)
2. name字段
3. app字段(最后才用)

影响文件:
- app/routers/yudao_aiot_alarm.py:247-268
2026-02-24 09:34:04 +08:00
8838905305 fix(aiot): 修复告警汇总应用名更新不同步问题
问题:应用名修改后,告警列表显示正确,但告警汇总仍显示旧名称
原因:device_id字段混用app/stream和camera_code格式,汇总直接显示device_id
影响:用户无法看到摄像头当前的实际应用名

修复内容:
- 告警汇总API实时查询WVP获取当前摄像头信息
- 支持camera_code格式查询(通过cameraCode参数)
- 支持app/stream格式查询(通过列表筛选)
- 查询失败时回退显示device_id

修复效果:
 应用名修改后告警汇总立即同步
 兼容两种device_id格式
 降级策略保证稳定性
2026-02-13 15:25:10 +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
cf41db2983 feat(aiot): 告警生成时异步上报运维平台
- 边缘告警入库后异步 POST 到运维平台 /admin-api/ops/alarm/receive
- 提前提取 ORM 字段避免异步执行时 session 关闭导致属性为空
- event_time 转为 ISO 字符串格式,修复时间显示为 1970 的问题
- 请求参数含 alarmId、alarmType、deviceId、eventTime、alarmLevel、notifyUserIds、tenantId

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 14:00:11 +08:00
0f5e3ebce2 feat(aiot): 本地截图回退访问 + 告警API前端兼容
- 挂载 Edge 截图目录为 /captures 静态文件(COS 不可用时回退)
- 挂载 /uploads 静态文件目录
- _alarm_to_camel 支持 local: 前缀转 /captures/ URL
- 告警分页/详情/处理/删除接口兼容前端旧字段名(id、cameraId、status 等)
- 设备告警汇总添加前端兼容别名(cameraId、pendingCount 等)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:56:15 +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
08e9d785eb fix(aiot): 删除实时视频菜单项
实时视频为 AIoT 自建功能,非芋道原生模块,直接删除菜单定义。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:40:50 +08:00
a8726cebed fix(aiot): 恢复实时视频菜单项并设置隐藏
恢复被误删的实时视频菜单定义,通过 visible=False 隐藏菜单,
保留路由和组件以备后续启用。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:20:32 +08:00
283f12e443 fix(aiot): 移除实时视频菜单项
从后端菜单定义中彻底删除实时视频菜单条目,
而非仅设置 visible=False,确保前端不再显示该菜单。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:17:41 +08:00
0f4ebde69f feat(aiot): 隐藏实时视频菜单
将实时视频菜单的 visible 设为 False,前端不再显示该菜单项,
但保留组件和路由定义以备后续启用。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:50:03 +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
5a2d887f1f feat(aiot): 添加 aiot/alarm 和 aiot/edge 芋道兼容路由
- 新增 yudao_aiot_alarm.py:/admin-api/aiot/alarm/* 告警管理路由
  包含分页查询、详情、处理、删除、统计、摄像头汇总
- 新增 yudao_aiot_edge.py:/admin-api/aiot/edge/* 边缘设备路由
  包含设备分页、详情、统计
- 复用现有 alert_service 和 device_service

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:39:39 +08:00
1ddc23e0d3 feat(yudao): 添加芋道兼容层和基础路由
- 新增 yudao_compat.py:芋道标准响应格式、权限校验
- 新增 yudao_auth.py:登录认证、权限信息、租户等系统接口
- 新增 yudao_alert.py:告警管理和摄像头汇总的芋道兼容路由
- 新增 routers/__init__.py:统一导出路由模块

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 16:38:54 +08:00
df9dcd6f01 docs: 更新 README,反映当前架构和功能
- 更新系统架构图(MQTT订阅 + WebSocket推送)
- 添加完整的 API 接口文档
- 添加 MQTT 消息格式说明
- 更新项目结构说明
- 添加与 wvp-platform 集成说明

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 14:48:33 +08:00
a6697331df docs: 添加 ai_edge 告警上报器参考代码
- 用于理解边缘端告警上报的数据格式
- 包含 MQTT 发布和 HTTP 回退逻辑

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:58:00 +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
885665ecf0 feat: 集成所有服务到主程序
- 使用 lifespan 管理服务生命周期
- 启动时自动连接 MQTT 并订阅告警主题
- 新增 WebSocket 端点 /ws/alerts
- 新增设备管理 API /api/v1/devices
- 新增 MQTT 状态 API /api/v1/mqtt/statistics
- 增强健康检查返回 MQTT 和 WebSocket 状态

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:57:25 +08:00
cd21d65b85 feat: 增强 Schema 定义
- AlertCreate/Response: 新增 bind_id/device_id/bbox/level
- 新增 DeviceResponse/DeviceListResponse
- 新增 DeviceStatisticsResponse
- HealthResponse: 新增 mqtt/websocket_connections

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:57:15 +08:00