6993ef4f2a
修复:群聊图片发送后延迟1秒再发文字,确保消息顺序正确
2026-03-19 10:01:46 +08:00
e14450edbc
优化:企微群聊通知从3条精简为2条 + 卡片跳转详情页
...
群聊通知改为:
1. image 截图(可点击放大查看)
2. markdown 告警详情 + @人员(不再重复发图)
私发卡片 card_action.url 改为跳转前端告警详情页
news 图文卡片去除默认企微官网链接
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 09:21:45 +08:00
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
3b64db7029
文档:告警数据看板设计方案
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 17:01:09 +08:00
b1dd75e7c8
文档:添加工单体系设计方案和数据库 Schema
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 16:41:02 +08:00
dd86da5bcd
功能:告警级别体系统一为 0紧急/1重要/2普通/3轻微
...
更新 API 接口、Schema 验证、报告生成、企微通知的级别映射,
与前端和边缘端保持一致。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 16:39:16 +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
c2c272c298
fix: response_code持久化到数据库 + 工单客户端加tenant-id
...
1. wechat_service: save/get_response_code 改为内存+数据库双写,
容器重启后边缘resolve仍能更新企微卡片
2. work_order_client: 请求头加 tenant-id,签名公式加 query_str 参数
3. config: WorkOrderConfig 新增 tenant_id 字段
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-13 13:37:34 +08:00
2a9bf7d575
fix: 卡片终态改用button.replace_name,不重绘整张卡片
...
- 终态更新改用 button.replace_name 方式,仅替换按钮文案为不可点击状态
- 原卡片告警信息保持不变,不再重绘整张卡片
- step2 处理中状态 desc_color 改为蓝色(1)表示进行中
- 边缘自动结单:用发送时保存的response_code直接更新卡片(72h有效)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-13 10:23:51 +08:00
f7a69892f6
fix: 注释工单对接代码,修复API响应解析和类型问题
...
- 工单创建/自动结单代码全部注释,待本地测试后启用
- 修复create_order响应解析:data直接是orderId,非嵌套对象
- 修复areaId类型:int(文档要求),非str
- 修复auto-complete orderId类型:int
- 两步卡片状态机和先到先得逻辑保留生效
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 18:20:30 +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
d2085f73be
fix: 群聊@人员改用markdown消息,解决他人看到原始userid问题
...
appchat text消息的<@userid>语法对非本人显示为原始文本,
改用markdown消息类型发送@提醒
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 14:37:52 +08:00
149e9da59b
fix: news图文消息url字段必填,添加默认值
...
企微appchat/send的news消息类型要求url必填,否则报errcode 41010
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 22:16:24 +08:00
dd1419303c
feat: 企微通知改为原生组合消息,移除H5页面
...
- 群聊:image截图 + news图文卡片 + @人员text 组合推送
- 个人:button_interaction模板卡片(前往处理/误报忽略)
- 新增媒体上传能力(upload_media),支持从COS URL下载后上传企微
- 新增群聊配置 WECHAT_GROUP_CHAT_ID
- 删除 alarm_detail.html H5页面及相关接口
- 清理 wechat_callback.py 移除旧的H5回调和群聊测试接口
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 17:43:58 +08:00
9c5c18fb65
fix: 更新卡片时补充 main_title 字段,修复 errcode 41016
...
企微更新模板卡片接口要求包含 main_title,否则报 missing title 错误。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 14:50:55 +08:00
c36488c6e6
feat: 企微卡片升级为原生按钮交互型模板卡片
...
1. wechat_service.py:
- send_alarm_card 从 textcard 升级为 button_interaction 模板卡片
- 卡片直接在对话框展示告警信息 + 操作按钮(前往处理/误报忽略)
- 新增 update_alarm_card 方法:点击按钮后更新卡片状态(按钮变灰)
- 保留群聊消息能力(create_group_chat/send_group_text)
2. wechat_callback.py:
- 回调支持 template_card_event 按钮点击事件
- 按钮点击自动更新告警状态(handle→HANDLING, ignore→IGNORED)
- 通过 response_code 更新卡片按钮为已处理状态
- H5 详情页 snapshot_url 增加 COS key→预签名URL 转换
- 新增群聊创建和群聊发卡片的测试接口
3. vlm_service.py:
- VLM 降级策略统一放行(所有类型 confirmed=True)
- 避免 VLM 不可用时离岗告警无法推送
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 14:36:58 +08:00
78e0076f4a
fix: 优化VLM提示词,输出更简洁,传入算法类型和区域名称
...
- prompt要求≤15字直接说结论,不再描述画面
- 加入算法类型中文名(离岗/周界入侵)让VLM更准确判断
- roi_name改为查询区域名称,不再传UUID
- 给出告警成立和误报的示例引导输出格式
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 10:32:50 +08:00
26f1512a1c
feat: 新建工单体系三表(security_work_order/security_user/work_order_log)
...
- SecurityWorkOrder: 安保工单表,关联alarm_event一对一,支持告警生成和手动创建
含派发人信息冗余(责任追溯)、告警合并索引
- SecurityUser: 安保人员表,含企微uid、角色、班组
- WorkOrderLog: 工单操作记录,追踪CREATE/DISPATCH/ACCEPT/FINISH/CLOSE
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 09:24:24 +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
10b25742f8
fix: 剩余服务文件时间统一为北京时间
...
- agent_dispatcher、alert_service、report_generator、
oss_storage、work_order_service 全部使用 beijing_now()
- 全局无遗留 UTC 时间调用
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 16:29:28 +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
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