316 lines
13 KiB
Markdown
316 lines
13 KiB
Markdown
|
|
# AI 告警平台架构设计
|
||
|
|
|
||
|
|
## 一、目标架构
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
|
|
│ 告警平台 (FastAPI) │
|
||
|
|
├─────────────────────────────────────────────────────────────────────────────┤
|
||
|
|
│ │
|
||
|
|
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐│
|
||
|
|
│ │ MQTT 订阅服务 │ │ REST API 服务 │ │ WebSocket 推送服务 ││
|
||
|
|
│ │ edge/alert/# │ │ /api/v1/... │ │ /ws/alerts ││
|
||
|
|
│ └────────┬─────────┘ └────────┬─────────┘ └────────────▲─────────────┘│
|
||
|
|
│ │ │ │ │
|
||
|
|
│ └──────────────────────┼──────────────────────────┘ │
|
||
|
|
│ ▼ │
|
||
|
|
│ ┌───────────────────────────────────────────────────────────────────────┐ │
|
||
|
|
│ │ 核心业务层 │ │
|
||
|
|
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
|
||
|
|
│ │ │ 告警服务 │ │ 工单服务 │ │ 设备服务 │ │ 通知服务 │ │ │
|
||
|
|
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
|
||
|
|
│ └───────────────────────────────────────────────────────────────────────┘ │
|
||
|
|
│ │ │
|
||
|
|
│ ▼ │
|
||
|
|
│ ┌───────────────────────────────────────────────────────────────────────┐ │
|
||
|
|
│ │ 数据层 │ │
|
||
|
|
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
|
||
|
|
│ │ │ SQLite/ │ │ 图片存储 │ │ Redis缓存 │ │ │
|
||
|
|
│ │ │ MySQL │ │ (本地/OSS) │ │ (可选) │ │ │
|
||
|
|
│ │ └────────────┘ └────────────┘ └────────────┘ │ │
|
||
|
|
│ └───────────────────────────────────────────────────────────────────────┘ │
|
||
|
|
└─────────────────────────────────────────────────────────────────────────────┘
|
||
|
|
▲ │
|
||
|
|
│ MQTT (边缘端上报) │ WebSocket (前端展示)
|
||
|
|
│ ▼
|
||
|
|
┌─────────┴───────────┐ ┌────────────────────────┐
|
||
|
|
│ ai_edge 边缘端 │ │ 前端 (Vue/React) │
|
||
|
|
│ - YOLO推理 │ │ - 告警列表 │
|
||
|
|
│ - 算法判断 │ │ - 工单管理 │
|
||
|
|
│ - MQTT上报 │ │ - 设备监控 │
|
||
|
|
└─────────────────────┘ └────────────────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
## 二、数据模型
|
||
|
|
|
||
|
|
### 2.1 告警表 (alerts) - 已有,增强
|
||
|
|
|
||
|
|
```sql
|
||
|
|
alerts (
|
||
|
|
id BIGINT PRIMARY KEY,
|
||
|
|
alert_no VARCHAR(32) UNIQUE, -- 告警编号
|
||
|
|
|
||
|
|
-- 来源信息
|
||
|
|
camera_id VARCHAR(64) NOT NULL, -- 摄像头ID
|
||
|
|
roi_id VARCHAR(64), -- ROI区域ID
|
||
|
|
bind_id VARCHAR(64), -- 绑定ID
|
||
|
|
device_id VARCHAR(64), -- 边缘设备ID
|
||
|
|
|
||
|
|
-- 告警内容
|
||
|
|
alert_type VARCHAR(64) NOT NULL, -- leave_post/intrusion/crowd
|
||
|
|
algorithm VARCHAR(128), -- 算法名称
|
||
|
|
confidence INTEGER, -- 置信度 0-100
|
||
|
|
duration_minutes INTEGER, -- 持续时长
|
||
|
|
trigger_time DATETIME NOT NULL, -- 触发时间
|
||
|
|
message TEXT, -- 告警消息
|
||
|
|
bbox JSON, -- 检测框坐标
|
||
|
|
|
||
|
|
-- 截图
|
||
|
|
snapshot_url VARCHAR(512), -- 图片URL
|
||
|
|
snapshot_path VARCHAR(512), -- 本地路径
|
||
|
|
|
||
|
|
-- 处理状态
|
||
|
|
status ENUM('pending','confirmed','ignored','resolved','dispatched'),
|
||
|
|
level ENUM('low','medium','high','critical'),
|
||
|
|
handle_remark TEXT,
|
||
|
|
handled_by VARCHAR(64),
|
||
|
|
handled_at DATETIME,
|
||
|
|
|
||
|
|
-- AI分析
|
||
|
|
ai_analysis JSON,
|
||
|
|
|
||
|
|
-- 关联工单
|
||
|
|
work_order_id BIGINT, -- 关联的工单ID
|
||
|
|
|
||
|
|
-- 时间戳
|
||
|
|
created_at DATETIME,
|
||
|
|
updated_at DATETIME,
|
||
|
|
|
||
|
|
INDEX idx_camera (camera_id),
|
||
|
|
INDEX idx_status (status),
|
||
|
|
INDEX idx_trigger_time (trigger_time)
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2.2 工单表 (work_orders) - 新增
|
||
|
|
|
||
|
|
```sql
|
||
|
|
work_orders (
|
||
|
|
id BIGINT PRIMARY KEY,
|
||
|
|
order_no VARCHAR(32) UNIQUE, -- 工单编号
|
||
|
|
|
||
|
|
-- 关联告警
|
||
|
|
alert_id BIGINT, -- 关联告警ID
|
||
|
|
alert_no VARCHAR(32), -- 告警编号(冗余)
|
||
|
|
|
||
|
|
-- 工单内容
|
||
|
|
title VARCHAR(255) NOT NULL, -- 工单标题
|
||
|
|
description TEXT, -- 问题描述
|
||
|
|
priority ENUM('low','medium','high','urgent'),
|
||
|
|
|
||
|
|
-- 派发信息
|
||
|
|
assignee_id VARCHAR(64), -- 处理人ID
|
||
|
|
assignee_name VARCHAR(64), -- 处理人姓名
|
||
|
|
department VARCHAR(64), -- 处理部门
|
||
|
|
|
||
|
|
-- 状态流转
|
||
|
|
status ENUM('created','assigned','processing','completed','closed'),
|
||
|
|
|
||
|
|
-- 处理结果
|
||
|
|
result TEXT, -- 处理结果
|
||
|
|
attachments JSON, -- 附件列表
|
||
|
|
|
||
|
|
-- 时间
|
||
|
|
deadline DATETIME, -- 截止时间
|
||
|
|
assigned_at DATETIME, -- 派发时间
|
||
|
|
started_at DATETIME, -- 开始处理时间
|
||
|
|
completed_at DATETIME, -- 完成时间
|
||
|
|
created_at DATETIME,
|
||
|
|
updated_at DATETIME,
|
||
|
|
|
||
|
|
INDEX idx_alert (alert_id),
|
||
|
|
INDEX idx_status (status),
|
||
|
|
INDEX idx_assignee (assignee_id)
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2.3 边缘设备表 (edge_devices) - 新增
|
||
|
|
|
||
|
|
```sql
|
||
|
|
edge_devices (
|
||
|
|
id BIGINT PRIMARY KEY,
|
||
|
|
device_id VARCHAR(64) UNIQUE, -- 设备唯一ID
|
||
|
|
device_name VARCHAR(128), -- 设备名称
|
||
|
|
|
||
|
|
-- 状态
|
||
|
|
status ENUM('online','offline','error'),
|
||
|
|
last_heartbeat DATETIME, -- 最后心跳时间
|
||
|
|
|
||
|
|
-- 运行信息
|
||
|
|
uptime_seconds BIGINT, -- 运行时长
|
||
|
|
frames_processed BIGINT, -- 处理帧数
|
||
|
|
alerts_generated BIGINT, -- 生成告警数
|
||
|
|
|
||
|
|
-- 配置
|
||
|
|
ip_address VARCHAR(45), -- 设备IP
|
||
|
|
stream_count INTEGER, -- 视频流数量
|
||
|
|
config_version VARCHAR(32), -- 配置版本
|
||
|
|
|
||
|
|
-- 扩展
|
||
|
|
extra_info JSON, -- 其他信息
|
||
|
|
|
||
|
|
created_at DATETIME,
|
||
|
|
updated_at DATETIME,
|
||
|
|
|
||
|
|
INDEX idx_status (status)
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 三、API 设计
|
||
|
|
|
||
|
|
### 3.1 告警 API (已有,扩展)
|
||
|
|
|
||
|
|
```
|
||
|
|
POST /api/v1/alerts # 创建告警 (HTTP方式)
|
||
|
|
GET /api/v1/alerts # 告警列表 (分页、筛选)
|
||
|
|
GET /api/v1/alerts/{id} # 告警详情
|
||
|
|
PUT /api/v1/alerts/{id}/handle # 处理告警
|
||
|
|
DELETE /api/v1/alerts/{id} # 删除告警
|
||
|
|
GET /api/v1/alerts/statistics # 统计数据
|
||
|
|
POST /api/v1/alerts/{id}/dispatch # 派发工单 (新增)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.2 工单 API (新增)
|
||
|
|
|
||
|
|
```
|
||
|
|
POST /api/v1/work-orders # 创建工单
|
||
|
|
GET /api/v1/work-orders # 工单列表
|
||
|
|
GET /api/v1/work-orders/{id} # 工单详情
|
||
|
|
PUT /api/v1/work-orders/{id} # 更新工单
|
||
|
|
PUT /api/v1/work-orders/{id}/assign # 派发工单
|
||
|
|
PUT /api/v1/work-orders/{id}/start # 开始处理
|
||
|
|
PUT /api/v1/work-orders/{id}/complete # 完成工单
|
||
|
|
GET /api/v1/work-orders/statistics # 工单统计
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.3 设备 API (新增)
|
||
|
|
|
||
|
|
```
|
||
|
|
GET /api/v1/devices # 设备列表
|
||
|
|
GET /api/v1/devices/{id} # 设备详情
|
||
|
|
GET /api/v1/devices/{id}/alerts # 设备告警列表
|
||
|
|
GET /api/v1/devices/statistics # 设备统计
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.4 WebSocket (新增)
|
||
|
|
|
||
|
|
```
|
||
|
|
WS /ws/alerts # 实时告警推送
|
||
|
|
- event: new_alert # 新告警
|
||
|
|
- event: alert_updated # 告警更新
|
||
|
|
- event: device_status # 设备状态变更
|
||
|
|
```
|
||
|
|
|
||
|
|
## 四、MQTT 主题设计
|
||
|
|
|
||
|
|
与 ai_edge 对齐:
|
||
|
|
|
||
|
|
```
|
||
|
|
edge/alert/{camera_id}/{roi_id} # 告警消息
|
||
|
|
edge/alert/heartbeat/{device_id} # 心跳消息
|
||
|
|
```
|
||
|
|
|
||
|
|
消息格式:
|
||
|
|
|
||
|
|
```json
|
||
|
|
// 告警消息
|
||
|
|
{
|
||
|
|
"alert_id": "uuid",
|
||
|
|
"camera_id": "cam_001",
|
||
|
|
"roi_id": "roi_001",
|
||
|
|
"alert_type": "leave_post",
|
||
|
|
"target_class": "person",
|
||
|
|
"confidence": 0.95,
|
||
|
|
"bbox": [100, 200, 300, 400],
|
||
|
|
"message": "检测到离岗",
|
||
|
|
"timestamp": "2026-02-05T10:00:00",
|
||
|
|
"duration_minutes": 5.5
|
||
|
|
}
|
||
|
|
|
||
|
|
// 心跳消息
|
||
|
|
{
|
||
|
|
"device_id": "edge_001",
|
||
|
|
"status": {
|
||
|
|
"running": true,
|
||
|
|
"uptime_seconds": 3600,
|
||
|
|
"frames_processed": 10000,
|
||
|
|
"alerts_generated": 5,
|
||
|
|
"stream_stats": {}
|
||
|
|
},
|
||
|
|
"timestamp": "2026-02-05T10:00:00"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 五、项目结构
|
||
|
|
|
||
|
|
```
|
||
|
|
service/
|
||
|
|
├── app/
|
||
|
|
│ ├── __init__.py
|
||
|
|
│ ├── main.py # FastAPI 入口
|
||
|
|
│ ├── config.py # 配置管理
|
||
|
|
│ ├── models.py # 数据模型 (SQLAlchemy)
|
||
|
|
│ ├── schemas.py # 请求/响应模型 (Pydantic)
|
||
|
|
│ │
|
||
|
|
│ ├── api/ # API 路由 (新结构)
|
||
|
|
│ │ ├── __init__.py
|
||
|
|
│ │ ├── alerts.py # 告警 API
|
||
|
|
│ │ ├── work_orders.py # 工单 API
|
||
|
|
│ │ ├── devices.py # 设备 API
|
||
|
|
│ │ └── websocket.py # WebSocket
|
||
|
|
│ │
|
||
|
|
│ ├── services/ # 业务服务
|
||
|
|
│ │ ├── __init__.py
|
||
|
|
│ │ ├── alert_service.py # 告警服务
|
||
|
|
│ │ ├── work_order_service.py # 工单服务 (新增)
|
||
|
|
│ │ ├── device_service.py # 设备服务 (新增)
|
||
|
|
│ │ ├── mqtt_service.py # MQTT 订阅服务 (新增)
|
||
|
|
│ │ ├── notification_service.py # 通知服务 (新增)
|
||
|
|
│ │ ├── oss_storage.py # 图片存储
|
||
|
|
│ │ └── ai_analyzer.py # AI 分析
|
||
|
|
│ │
|
||
|
|
│ └── utils/
|
||
|
|
│ ├── __init__.py
|
||
|
|
│ └── logger.py
|
||
|
|
│
|
||
|
|
├── data/ # 数据目录
|
||
|
|
├── uploads/ # 上传文件
|
||
|
|
├── logs/ # 日志
|
||
|
|
├── requirements.txt
|
||
|
|
├── .env
|
||
|
|
└── README.md
|
||
|
|
```
|
||
|
|
|
||
|
|
## 六、实施步骤
|
||
|
|
|
||
|
|
### Phase 1: 打通核心链路 (优先)
|
||
|
|
1. ✅ 评估现有项目
|
||
|
|
2. 新增 MQTT 订阅服务
|
||
|
|
3. 新增 WebSocket 推送
|
||
|
|
4. 端到端联调测试
|
||
|
|
|
||
|
|
### Phase 2: 工单功能
|
||
|
|
5. 工单数据模型
|
||
|
|
6. 工单 CRUD API
|
||
|
|
7. 告警关联工单
|
||
|
|
|
||
|
|
### Phase 3: 设备监控
|
||
|
|
8. 设备数据模型
|
||
|
|
9. 心跳监控
|
||
|
|
10. 设备状态 API
|
||
|
|
|
||
|
|
### Phase 4: 优化增强
|
||
|
|
11. 通知服务 (邮件/企微/钉钉)
|
||
|
|
12. 权限控制
|
||
|
|
13. 性能优化
|