Commit Graph

195 Commits

Author SHA1 Message Date
f8b4b65ced 新增: 算法全局参数菜单项 2026-04-09 17:55:59 +08:00
caa7adb27c 新增: 非机动车违停告警类型和VLM复核提示词 2026-04-09 10:00:56 +08:00
46fdb51767 优化:日报卡片副标题改为简洁文案,不再展示具体位置名 2026-04-08 10:25:33 +08:00
abebb7138b 优化:日报卡片文本防溢出 — 高发设备改top1+6字截断,副标题限20字 2026-04-08 09:59:43 +08:00
404510538d 调整:日报卡片跳转路径改为 /pages-ops/work-order/index 2026-04-08 09:47:28 +08:00
6ffcc79277 重构(test): test_work_order_real 改用 constants 统一定义 2026-04-07 14:05:37 +08:00
5f2d18b8fb 重构(notify_dispatch): ALARM_TYPE_NAMES 改为直接从 constants 导入 2026-04-07 14:03:42 +08:00
bddf28136e 重构(vlm_service): 重命名为 VLM_TYPE_NAMES 避免与 constants 命名冲突 2026-04-07 14:03:08 +08:00
3b20a1ef14 重构(yudao_alert): 核心告警类型名从 constants 派生 2026-04-07 13:56:50 +08:00
4d679cec6e 重构(yudao_aiot_alarm): 核心告警类型名从 constants 派生,扩展类型保留 2026-04-07 13:55:45 +08:00
3974820ada 重构(alarm_event_service): 状态字符串改用 AlarmStatus/HandleStatus 枚举 2026-04-07 13:06:45 +08:00
8446bab921 重构(alarm_event_service): 默认告警等级改用 constants 统一定义 2026-04-07 12:35:59 +08:00
72fc77a0ed 重构(work_order_api): status/type/level 映射改用 constants 统一定义 2026-04-07 11:57:39 +08:00
15d7d8cbff 重构(report_generator): TYPE/LEVEL/STATUS_NAMES 改用 constants 统一定义 2026-04-07 11:56:30 +08:00
d8c36cb7b1 重构(wechat_service): ALARM_TYPE_NAMES/LEVEL_NAMES 改用 constants 统一定义 2026-04-07 11:48:45 +08:00
5309b5a7ce 重构:建立术语注册中心 constants.py(阶段一)
新建 app/constants.py 作为全局术语单一真相源,包含:
- AlarmType/AlarmStatus/HandleStatus/OrderStatus/CleaningType 枚举
- 所有中文映射字典(ALARM_TYPE_NAMES 等)
- 芋道前端兼容状态映射
- 告警等级、优先级、保洁类型等常量
- ORDER_OPEN_STATUSES 未完成状态集合

已替换 daily_report_service.py 和 order_query.py 中的重复定义。
其余文件(wechat_service/vlm_service/yudao_*等)待下一阶段替换。
2026-04-07 11:29:44 +08:00
2ba8535869 修复:小程序路径改为pages/index/index 2026-04-03 18:09:33 +08:00
7c7246b4dc 优化:日报卡片底部添加「点击查看详情」跳转小程序 2026-04-03 18:02:04 +08:00
07dfa5560e 修复:日报卡片小程序AppID更正为wxb3dc42bb3017c3f2 2026-04-03 17:50:16 +08:00
9eec1bf42b 优化:日报卡片点击跳转到企微小程序 2026-04-03 17:27:40 +08:00
ec5501fa3b 优化:日报卡片打磨细节
- 高发设备/告警热点只取 top2,名称超8字截断,防止文字溢出
- 已完成和待处理合并为一行,减少行数更紧凑
- 待处理为0时显示「 全部清零」,有遗留才显示遗留数
- 误报率非0时才显示,0%不占位
- 副标题:清零时正面鼓励,有超时时⚠提醒
- 底部新增「查看详情」跳转链接
2026-04-03 16:48:29 +08:00
ecc5065c71 功能:日报支持群机器人Webhook模板卡片推送
通过群机器人 Webhook 发送 text_notice 模板卡片,视觉效果
远超纯 markdown:大号数字突出核心指标,键值对整齐排列。

新增:
- WECHAT_GROUP_ROBOT_KEY 配置(群机器人 Webhook key)
- send_webhook_template_card 方法
- _build_template_card 构建 text_notice 卡片
  - emphasis_content: 昨日新增大号数字
  - horizontal_content_list: 安保/保洁、已完成、待处理、
    首响/完结、告警热点、高发设备(最多6条)
  - sub_title_text: 需关注项或「运营良好」
  - card_action: 点击跳转详情页

发送策略:优先 Webhook 模板卡片 → 降级 appchat markdown
2026-04-03 16:16:51 +08:00
8ff396641e 优化:日报面向领导视角重排版
- 去掉工单号等技术细节,超时项改为「位置(类型,已挂起X小时)」
- 待处理全部清零时显示绿色「全部清零」,有遗留时橙色警示
- 时长改为人话(8.0小时 而非 480分钟)
- 风险分布用「热点分布」,超时用「需关注」,措辞更汇报体
- 取消数等次要信息去掉,只保留领导关心的核心指标
2026-04-03 15:44:34 +08:00
af2b9bc996 优化:日报改回单条精排markdown,去掉textcard
textcard排版控制太弱,指标密集型日报挤成一坨。
改为单条markdown,分三个区块:
1. 核心数字(新增/完成/待处理/误报率)
2. 响应效率(首响/完结时长)
3. 风险分布(告警类型/区域/摄像头,仅有数据时展示)
4. 超时未处理(仅有遗留时展示)

去掉 textcard 和 news 相关代码,简化发送逻辑。
2026-04-03 15:26:46 +08:00
d6765f51f2 优化:日报改为单条文本卡片推送 2026-04-03 14:12:25 +08:00
30db9d8961 优化:日报升级为图文摘要加详情推送 2026-04-03 13:16:04 +08:00
bfcd3b9a35 修复:企微推送摄像头编码自动解析显示名称 2026-04-03 11:26:20 +08:00
533fe263e6 修复:Agent查询待处理工单始终为空
根因:list_orders 和 query_order_stats 默认按 create_time 过滤
今日范围,但待处理工单可能是昨天或更早创建的,导致全部漏掉。

修复内容:
1. 查询待处理状态工单时跳过时间范围过滤(skip_time_filter)
2. query_order_stats 额外返回 current_pending/current_assigned
   表示当前所有未完成工单数(不限时间)
3. _query_orders 新增 tenant_id 过滤(从配置读取)
4. 系统提示词增加查询技巧引导 Agent 正确使用 status 参数
2026-04-02 15:00:36 +08:00
57df6a2704 修复:日报摄像头Top5显示代码而非名称
日报生成时直接读取IoT数据库的camera_name字段,该字段存的是
camera_code(如cam_2043d9aed65c),导致日报中摄像头名称
无法识别。

改为统一收集camera_id,通过camera_name_service批量调WVP API
解析真实名称,解析失败时降级使用camera_code。
2026-04-02 09:34:50 +08:00
88616f0940 优化:处理结果图片提交流程复用已上传图片 2026-04-01 09:09:30 +08:00
37d80e6c8b 调整:无通知区域时使用演示区域兜底 2026-03-31 18:42:01 +08:00
70a2f5b504 修复:手动建单优先于工单处理结果图片上传 2026-03-31 18:22:27 +08:00
4e03938334 功能:交互Agent支持图片驱动的手动工单创建流程 2026-03-31 18:07:41 +08:00
95c58e8b3f 添加 mysql-connector-python 依赖(IoT数据库连接需要) 2026-03-31 15:28:05 +08:00
fa1a0b96c0 修复:IoT数据库连接支持mysql-connector-python驱动
腾讯云MySQL需要use_pure+ssl_disabled参数才能认证通过,
当URL使用mysqlconnector驱动时自动添加connect_args
2026-03-31 15:15:32 +08:00
cd1ccd6912 清理旧Agent工具文件
删除已被 order_query.py / order_action.py 替代的旧文件:
- alarm_query.py
- alarm_action.py
- order_tools.py
2026-03-31 10:51:34 +08:00
63a8d5a8f2 告警-工单解耦:企微交互+Agent全面切换到工单驱动
Part A: 数据层
- 新增 WechatCardState 模型(order_id ↔ alarm_id 映射 + response_code)
- 新建 models_iot.py(IoT 工单只读 ORM:ops_order + security_ext + clean_ext)
- config.py 新增 IOT_DATABASE_URL 配置

Part B: 企微解耦(alarm_id → order_id)
- wechat_service: response_code 存储迁移到 wechat_card_state,集中 helper
- 卡片发送/更新方法改用 order_id,按钮 key: confirm_{order_id}
- wechat_callback: 按钮解析改 order_id,反查 alarm_id(可空)
- wechat_notify_api: send-card/sync-status 以 orderId 为主键
- yudao_aiot_alarm: 卡片操作改用 order_id,删重复 helper

Part C: Agent 工具全面改为工单驱动
- 新建 order_query.py(查 IoT ops_order,支持安保+保洁工单)
- 新建 order_action.py(操作工单状态 + 提交处理结果)
- 更新 prompts.py 为工单助手
- 更新工具注册(__init__.py)

Part D: 日报改为工单驱动
- daily_report_service 从查 alarm_event 改为查 IoT ops_order + 扩展表
- 支持安保+保洁工单统计
2026-03-31 10:49:42 +08:00
93148fe85b 增强:工单创建增加重试机制(最多2次重试)
IoT ops 服务偶发 500 异常(auto_complete 后状态污染),
添加 3s/6s 间隔重试,避免暂时性故障导致工单丢失。
2026-03-31 09:37:33 +08:00
9513951b1b 修复:企微群聊不发送告警截图
根因:_get_presigned_url 对完整 COS 永久 URL 直接原样返回,
未重新生成预签名 URL,导致私有桶的图片下载失败(403)。

修复:
1. _get_presigned_url 增加 COS URL 识别,提取 object key 重新签名
2. 新增 _extract_cos_object_key 解析两种 COS URL 格式
3. send-card 增加截图诊断日志(追踪 IoT/DB 来源和最终 URL)
4. upload_media_from_url 增加下载/上传诊断日志
2026-03-30 14:30:01 +08:00
342fbd87b5 修复:告警列表状态筛选映射错误 — handled应映射CLOSED,新增processing映射CONFIRMED 2026-03-30 11:31:14 +08:00
afa463ac65 修复:send-card 群聊通知三个问题
1. 告警告警重复:用 alarm_type_code 映射而非 IoT 的 title
2. 摄像头未知:从告警表查 device_id 获取摄像头名称
3. 截图403:从告警表取 object key 生成预签名 URL(IoT 传的永久URL无签名)
2026-03-30 11:17:21 +08:00
961a387957 修复:resolve_alarm 添加 vehicle_left 和 congestion_cleared 状态处理
违停车辆离开和拥堵消散的 resolve 事件没有匹配到对应的状态分支,
导致告警只更新了 duration_ms 但 alarm_status 没改为 CLOSED。
2026-03-27 15:20:01 +08:00
3a62202406 修复:恢复 send-card 接口,dispatched 只记录日志不发企微 2026-03-27 14:11:03 +08:00
058fc0dbaf 优化:edge resolve 只调 IoT 自动结单,去掉降级卡片更新 2026-03-27 13:16:21 +08:00
e6fd316036 重构 sync-status 接口:按状态分流处理,删除 send-card 接口
- dispatched: 发企微群聊+私发卡片(不更新告警)
- confirmed: 仅更新卡片到第二步(不更新告警)
- 终态(completed/false_alarm/auto_resolved): 更新告警+卡片
- 删除 send-card 接口和 SendCardRequest 类(企微由 dispatched 触发)
2026-03-27 13:12:29 +08:00
e8e075efd6 重构通知调度:去掉企微直发,工单创建后改告警为 CONFIRMED
- 删除企微群聊组合消息和降级卡片发送逻辑
- 删除 get_wechat_service、event_time_str 格式化等相关代码
- 工单创建成功后调用 _set_alarm_confirmed 将告警改为 CONFIRMED/HANDLING
- 新增 _set_alarm_confirmed 辅助函数
- 企微通知改由 IoT 工单回调驱动
2026-03-27 12:53:40 +08:00
f96d692dd9 修复:EdgeAlarmReport 添加 area_id 字段,告警创建时优先从顶层取 area_id 2026-03-27 11:09:47 +08:00
e7c9ee126f 移除调试代码,清理 send-card/wechat_service 调试日志和端点 2026-03-26 13:39:20 +08:00
0bde8c03a4 修复企微服务热重载后丢失初始化的问题
get_wechat_service() 增加 _initialized 检查,
未初始化时自动调用 init(settings.wechat),
避免 uvicorn 热重载后单例重建但未 init 导致 enabled=False。
2026-03-26 13:24:58 +08:00
9370c2f2ec 修复日报定时任务 MySQL 连接断开问题(BrokenPipe)
添加 pool_recycle=1800 和 pool_pre_ping=True,
防止 MySQL 长时间空闲后连接被服务端关闭导致 BrokenPipeError。
2026-03-26 09:08:06 +08:00