Commit Graph

109 Commits

Author SHA1 Message Date
2dccb75dcb 功能:启用 work_order_client 初始化,从 .env 读取工单配置 2026-03-23 11:46:49 +08:00
9eca44d862 功能:work_order_client 新增 confirm/submit/false_alarm 方法
对接 IoT 平台 5 个开放接口的完整客户端。
2026-03-23 11:44:51 +08:00
08167378be 文档:工单引擎对接+H5详情页实施计划v2
基于IoT平台完整5接口(create/confirm/submit/false-alarm/auto-complete),
采用方案A严格模式(IoT回调后再更新告警+卡片)。
2026-03-23 11:41:45 +08:00
c813112a85 文档:工单处理H5页面+工单引擎对接实施计划 2026-03-23 11:08:09 +08:00
e31f974a72 修复:CameraNameService支持CAM大写前缀的camera_code查询 2026-03-20 22:56:45 +08:00
d39091c35f 功能:支持skip_vlm参数跳过VLM复核直接推送企微通知 2026-03-20 22:53:54 +08:00
101a99616e 修复:图片分析prompt增加离岗识别 + 创建工单支持直接带位置
1. IMAGE_ANALYZE_PROMPT 增加"岗位无人值守"等异常类型
2. create_work_order 意图支持直接提取 location,有位置则跳过追问
3. 减少图片+文字同时发送时的消息顺序混乱
2026-03-20 14:11:36 +08:00
a79c829d3e 修复:list_alarm 中文参数映射,VLM 传中文类型/状态时自动转换为英文编码 2026-03-20 13:57:27 +08:00
bcb625782c 修复:f-string 中文引号语法错误导致启动失败 2026-03-20 13:50:06 +08:00
266bda1512 功能:Agent 新增 list_alarm 意图,支持展示具体告警列表
- query_alarm:统计概况(多少条、按类型分布)
- list_alarm:具体列表(类型+摄像头+状态+时间,最多10条)
- 支持按状态过滤(如"未处理的告警有哪些")
- 超过10条提示导出报表
2026-03-20 11:36:33 +08:00
1fb00f8a30 修复:意图查询时丢弃 VLM 编造的回复,只返回真实数据
VLM 会先编一个假答案再附加意图标记,导致用户看到矛盾的信息。
现在检测到意图标记后直接执行真实查询,不拼接 VLM 的回复。
2026-03-20 11:32:42 +08:00
5ccfe7752f 修复:Agent 对话体验优化
1. System Prompt 优化:不再把无关闲聊强行关联工单
2. waiting_location 状态机加位置判断:
   - 用户回复像位置信息 → 创建工单
   - 用户回复问句/闲聊 → 退出状态机回到正常对话
3. 新增 _looks_like_location() 方法判断文本是否像位置
2026-03-20 11:31:41 +08:00
dfc34a5e7f 修复:notify_dispatch 硬编码 VLM 模型名改用 settings.vlm.model 2026-03-20 11:16:08 +08:00
1753f66bd9 功能:企微回调支持图片消息,路由到 Agent 图片分析
收到图片先回复"正在分析",异步调 VLM 分析后主动回复结果。
2026-03-20 11:14:37 +08:00
f87222e6fb 功能:AgentDispatcher 多模态重写
- 统一使用 VLM 模型处理文字+图片
- 多轮对话上下文(SessionManager)
- 图片分析上报:VLM 分析 → 追问位置 → 创建工单
- 结单图片分析:VLM 确认异常消除 → 自动结单
- 意图识别嵌入对话回复中,不再单独调用
- 所有模型配置走 settings,无硬编码
2026-03-20 11:10:54 +08:00
67f6af638a 功能:WeChatService 新增 download_media 方法,下载企微临时素材 2026-03-20 11:05:12 +08:00
d44fc410bb 功能:AgentConfig 统一为 VLM 多模态模型
去掉 llm_model/llm_base_url/llm_api_key,统一使用 vlm 前缀。
默认模型 qwen3-vl-flash-2026-01-22,通过 AGENT_VLM_MODEL 环境变量配置。
2026-03-20 11:04:08 +08:00
0d790d9992 功能:新增会话记忆管理器,支持多轮对话状态机
每用户独立会话,10轮对话上限,10分钟TTL自动过期。
状态机:idle/waiting_location/waiting_confirm/waiting_close_photo
2026-03-20 11:01:13 +08:00
0d93e5f1ec 文档:企微交互 Agent 多模态升级实施计划 2026-03-20 10:58:25 +08:00
7e729d3841 修复:企微通知摄像头名称从 WVP 查询,不再显示 cam_xxx 编码 2026-03-19 14:44:39 +08:00
b1b2d78aa3 修复:区域查询地址独立于工单配置,支持 IOT_PLATFORM_URL 环境变量
区域名称查询不再依赖 WORK_ORDER_BASE_URL,
优先使用 IOT_PLATFORM_URL,降级用工单地址。
2026-03-19 14:36:30 +08:00
bd24165c58 修复:区域名称缓存加 5 分钟 TTL,改名后自动生效 2026-03-19 14:18:29 +08:00
26ae14f37c 功能:CameraNameService 优先使用 cameraName 字段显示摄像头名称
format_display_name 优先取 camera_name(用户自定义),
没有则降级到原有的 gbName/app 提取逻辑。
2026-03-19 11:35:23 +08:00
03082a5934 优化:企微通知时间只显示 MM-DD HH:MM,去掉年份和秒 2026-03-19 11:13:02 +08:00
aaf175b129 修复:告警通知显示真实区域名称,从 IoT 平台查询 area_id 对应的 areaName
- edge_compat 上报时传入 area_id 到通知流水线
- notify_dispatch 优先从 IoT 平台 API 查区域名(带缓存+token缓存)
- 演示模式下如果已有真实区域名则不覆盖为"演示区域"
2026-03-19 11:08:33 +08:00
2765525cbc 安全:.env.example 补充工单对接、WVP 地址、群聊 ID 等配置项 2026-03-19 10:35:18 +08:00
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