Files
SecMPS/doc/整合方案/SecMPS_整合项目实施手册_v2.0.md
2026-05-15 23:22:48 +08:00

291 lines
9.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SecMPS 整合项目实施手册
> **版本**: v2.0
> **日期**: 2026-05-15
> **基于**: SecMPS_最终整合方案_v2.0.md
> **工期**: 18-20 个工作日
---
## 前置检查清单Day 0
| # | 检查项 | 验证方式 | 阻塞阶段 |
|---|--------|----------|----------|
| 1 | Owl+ZLM 部署运行 | 浏览器访问 Owl 管理端,确认可登录 | Phase 1 |
| 2 | 至少1台 GB28181 设备注册到 Owl | Owl 管理端 `/devices` 有数据 | Phase 1 |
| 3 | MC4.0 网关可访问 | `curl http://mc4_ip:3000/api/central/auth/conf/get` | Phase 2 |
| 4 | MC4.0 有设备接入 | 调对象树接口有 type=2 节点 | Phase 2 |
| 5 | Vol.Pro 代码生成器可用 | 新建测试表→运行生成器→确认生成 | Phase 0 |
| 6 | MySQL 有建表权限 | 直接执行 CREATE TABLE | Phase 0 |
| 7 | Node.js >= 20.19 | `node -v` | Phase 3 |
---
## Phase 0基础设施搭建Day 1-2
### Day 1 — Gateway 骨架 + 数据库
**任务 1.1 — 创建 Gateway 解决方案**
```
dotnet new sln -n IntegrationGateway
dotnet new webapi -n IntegrationGateway.Host -f net8.0
dotnet new classlib -n IntegrationGateway.Core -f net8.0
```
**验证**: `dotnet build` 成功。
**任务 1.2 — Core 层接口**
创建 `Abstractions/`7个接口文件`Models/`8个模型文件`Infrastructure/`AdapterRegistry/TokenManager/RateLimiter
**验证**: `dotnet build` 成功。编写单元测试:注册 mock 适配器,验证 Get() 返回非 null。
**任务 1.3 — Host 层 Controller**
创建 HealthController (`GET /api/gateway/health`)、DevicesController、PointsController、StreamsController、AlarmsController、SyncController。
**验证**: 启动 Host`GET /api/gateway/health` 返回 200。
**任务 1.4 — 数据库建表8张**
按顺序执行 DDLBase_Device → Device_Video_Ext → Video_Channel → Video_Record → Device_IoT_Ext → IoT_DevicePoint → IoT_DeviceData → IoT_Alarm。
**验证**:
```
SELECT COUNT(*) FROM Base_Device; → 0
SHOW INDEX FROM Base_Device WHERE Key_name LIKE '%Adapter%'; → 唯一索引存在
```
**任务 1.5 — 运行代码生成器**
对8张表运行 Vol.Pro 代码生成器。
**验证**: 管理端可看到8个新菜单分别能正常 CRUD。
### Day 2 — Vol.Pro 侧 GatewayClient
**任务 2.1 — GatewayClient.cs**
实现 `IGatewayClient : IDependency`,封装对 Gateway 的 HTTP 调用。`appsettings.json` 添加 `"Gateway": {"BaseUrl": "http://localhost:5100"}`
**验证**: 注入 IGatewayClient调用 HealthCheckAsync() 返回 true。
**任务 2.2 — DeviceManagerController.cs**
创建 `Controllers/Warehouse/Partial/DeviceManagerController.cs`
- `GET GetRegionTree` — 区域树+设备数量
- `GET GetDevicesByRegion?regionId=` — 设备列表含子设备
- `PUT {deviceId}` — 更新设备含地图绑定
**验证**: Postman 调 `GET /api/DeviceManager/GetRegionTree` 返回 JSON。
**任务 2.3 — SyncDevicesJobQuartz**
```csharp
public class SyncDevicesJob : IJob {
public async Task Execute(IJobExecutionContext ctx) {
var gw = ctx.GetService<IGatewayClient>();
var r = await gw.SyncDevicesAsync("mc4");
}
}
```
**验证**: Quartz 管理面板看到已注册 Job。
---
## Phase 1Owl 适配器 + 视频设备页Day 3-6
### Day 3 — OwlAdapter
**任务 3.1**: 创建 `IntegrationGateway.Adapters.Owl` 项目。
**任务 3.2**: 实现 OwlAdapter`IHasFlatDevices + IHasStreams + IAcceptsMetadataPush`)。
**验证Postman 调 Gateway**:
```
GET /api/gateway/health → {"owl": true}
GET /api/gateway/devices?adapter=owl&page=1 → 返回 Owl 设备列表
GET /api/gateway/streams/owl/{channelId}/live → 返回 WS-FLV 地址
```
**任务 3.3**: 端到端同步。调 `GET /api/gateway/devices/sync?adapter=owl`,查库 `SELECT * FROM Base_Device WHERE AdapterCode='owl'`,确认设备入库。
### Day 4 — 管理端设备页面框架
**任务 4.1**: 创建 `web.vite/src/views/warehouse/DeviceManager/` 目录。
**任务 4.2**: `index.vue` — 左右分栏布局(`el-container``el-aside` 280px + `el-main`)。
**任务 4.3**: `RegionTree.vue` — 调 `GetRegionTree`,渲染 `el-tree`,点击 emit `select(regionId)`
**任务 4.4**: `DeviceTable.vue` — 调 `GetDevicesByRegion``el-table``tree-props` 展开子设备。
**验证**: 浏览器访问 `/device-manager`,左侧区域树+右侧设备表可用。
### Day 5 — 视频操作按钮 + 播放器
**任务 5.1**: `VideoDeviceActions.vue` — 实时预览/云台控制/查看回放 按钮。
**任务 5.2**: 安装 Jessibuca创建 `DeviceLivePreview.vue` 弹窗+播放器。
**验证**: 点视频设备的「实时预览」→ 弹窗播放画面。
**任务 5.3**: 云台控制面板 — 方向键+停止,调 Gateway PTZ 接口。
**验证**: 点方向键 → 摄像机转动。
### Day 6 — 视频联调 + 边界测试
| 测试 | 预期 |
|------|------|
| 设备同步 | 表格数据刷新,不重复 |
| 实时预览 | Jessibuca 播放正常 |
| 云台控制 | 摄像机转动 |
| 多路播放(4路) | 不卡顿 |
| 离线设备 | 状态显示「离线」 |
| 框架隔离 | 重跑生成器DeviceManager/ 文件未丢失 |
---
## Phase 2MC4.0 适配器 + IoT 管理Day 7-11
### Day 7 — Mc4Adapter
创建 `IntegrationGateway.Adapters.MC4`,实现 `IHasOwnDeviceTree + IHasPoints + IHasAlarms`
**验证Postman 调 Gateway**:
```
GET /api/gateway/health → {"mc4": true}
GET /api/gateway/devices/sync?adapter=mc4 → 同步报告
GET /api/gateway/realtime/mc4/{deviceId} → 点位值数组
POST /api/gateway/realtime/mc4/control {id,index,value} → 200
GET /api/gateway/alarms/mc4?from=...&to=... → 告警列表
POST /api/gateway/alarms/mc4/{id}/confirm → 确认成功
```
### Day 8 — 区域自动匹配 + 全量同步
实现 SyncEngine.ProcessTreeNodetype=1 节点 → MatchOrCreateRegiontype=2 节点 → UpsertDevice。
**验证**: 同步后 `warehouse_regions` 有 MC4.0 区域,`Base_Device.RegionId` 正确。
### Day 9 — IoT 操作按钮 + 实时数据
**任务 9.1**: `IoTDeviceActions.vue` — 实时数据/设备控制/告警记录 按钮。
**任务 9.2**: 实时数据弹窗 — 点位名称/当前值/单位/更新时间/控制控件。
**任务 9.3**: 设备控制 — 开关 `el-switch`,模拟量 `el-input-number`
**验证**: 拖动滑块 → 设备实际值改变。
### Day 10 — 告警管理 + 地图绑定
**任务 10.1**: 编辑弹窗增加「告警记录」tab。
**任务 10.2**: `MapBindingPanel.vue` — MapModelId 选择、缩放/旋转、经纬度。
**验证**: 编辑设备 → 地图绑定 → 保存 → 值持久化。
### Day 11 — SignalR Hub + Quartz 轮询
**任务 11.1**: `IoTDataHub.cs` — SubscribeDevice/SubscribeAlarms。
**任务 11.2**: `RealtimePollJob.cs` (5s) + `AlarmPollJob.cs` (10s)。
**验证**: warehouse 端 SignalR 连接收到实时数据和告警推送。
---
## Phase 3warehouse 端 + 全链路联调Day 12-17
### Day 12-13 — 视频播放器集成
- Live.vue: 假数据→真实 API + Jessibuca
- History.vue: 对接回放 APIHLS 播放
- VideoWall.vue: 9 路 WS-FLV
**验证**: Live/History/VideoWall 全功能可用。
### Day 14-15 — IoT 面板
- 实时数据看板SignalR 订阅每5秒更新
- 控制面板:开关/滑块,调控制 API
- 告警面板:实时弹窗+声音
**验证**: warehouse IoT 功能可用。
### Day 16-17 — 全链路联调
| 链路 | 预期 |
|------|------|
| 设备同步→入库 | Base_Device 有数据 |
| 区域树→el-tree | 层级正确 |
| 实时预览→播放 | 画面正常 |
| 云台→摄像机转动 | 方向正确 |
| 实时数据→面板 | 值更新 |
| 设备控制→设备响应 | 值改变 |
| 告警触发→弹窗 | <15秒 |
| 告警确认→MC4.0 | 状态变更 |
**性能指标**: 9路视频墙≥15fps100设备轮询<3s500设备同步<30s。
---
## Phase 4验证 + 缓冲Day 18-20
### Day 18 — 代码隔离验证
1. 重跑代码生成器(对 Base_Device
2. 检查 Partial/、extension/、DeviceManager/ 目录文件未覆盖
3. 检查生成文件已更新(新字段在编辑表单中出现)
### Day 19 — 异常场景
| 场景 | 预期 |
|------|------|
| Owl 宕机 | 不影响 MC4.0 同步 |
| MC4.0 宕机 | 页面不崩溃 |
| Gateway 宕机 | 前端错误提示 |
| Token 过期 | 自动刷新 |
| 并发同步 | 互不干扰 |
### Day 20 — 文档收尾
- [ ] API 文档Swagger
- [ ] 部署手册更新
- [ ] 组件使用说明
- [ ] 已知问题修复
---
## 附录:每日检查清单
```
□ 所有新增 C# 服务实现 IDependency
□ Controller 写在 Partial/ 目录
□ 前端扩展在 extension/ 目录
□ 未修改自动生成文件
□ MC4.0 调用经 RateLimiter
□ Owl Token 使用 TokenManager 缓存
□ 实时数据未写入 IoT_DeviceData
□ dotnet build 零错误
```
## 附录:端口分配
| 服务 | 端口 |
|------|------|
| IntegrationGateway | 5100 |
| VolPro.WebApi | 9100 |
| web.vite | 9000 |
| warehouse | 9200 |
| Owl | 80 |
| MC4.0 | 3000 |
---
> **文档结束**