网关详细设计清单 + VolPro改造任务清单
This commit is contained in:
260
doc/设计文档/VolPro框架改造方案_任务清单.md
Normal file
260
doc/设计文档/VolPro框架改造方案_任务清单.md
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
# Vol.Pro 框架前后端改造 — 任务清单
|
||||||
|
|
||||||
|
> **基准文档**: VolPro框架改造方案 v1.0
|
||||||
|
> **分支**: phase/0-infrastructure
|
||||||
|
> **原则**: 所有改动在 Partial/extension 目录,严禁修改框架生成文件
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase V0: 数据库与代码生成(预计 0.5 天)
|
||||||
|
|
||||||
|
### V0.1 建表
|
||||||
|
- [ ] 在 SQL Server 执行 `doc/db_init.sql`,创建 6 张表:
|
||||||
|
- `gateway_nodes`(网关节点)
|
||||||
|
- `base_device`(统一设备主表,AdapterCode+SourceId 联合主键)
|
||||||
|
- `video_channel`(视频通道扩展)
|
||||||
|
- `video_record`(录像文件)
|
||||||
|
- `iot_alarm`(告警记录)
|
||||||
|
- `iot_devicedata`(数据归档)
|
||||||
|
|
||||||
|
### V0.2 字典初始化
|
||||||
|
- [ ] 在 Vol.Pro 管理端 → 字典管理,创建 8 组数据字典:
|
||||||
|
- 设备分组:视频设备/IoT设备/门禁设备/道闸设备/报警设备
|
||||||
|
- 设备种类:摄像机/硬盘录像机/温湿度变送器/空调控制器/...(18 项)
|
||||||
|
- 在线状态:在线/离线
|
||||||
|
- 启用状态:启用/禁用
|
||||||
|
- 是否父设备:是/否
|
||||||
|
- 是否控制点:只读/可写
|
||||||
|
- 告警等级:提示/普通/重要/紧急
|
||||||
|
- 告警状态:未确认/已确认/已结束
|
||||||
|
|
||||||
|
### V0.3 代码生成
|
||||||
|
- [ ] 在 Vol.Pro 代码生成器中选择 `device_manager` 数据源,生成 6 张表的全套代码:
|
||||||
|
- `VolPro.Entity/DomainModels/device_manager/` — 6 个 Entity
|
||||||
|
- `Warehouse/IRepositories/device_manager/` — 6 个 Repository 接口
|
||||||
|
- `Warehouse/Repositories/device_manager/` — 6 个 Repository 实现
|
||||||
|
- `Warehouse/IServices/device_manager/` — 6 个 Service 接口 + 6 个 Partial 接口
|
||||||
|
- `Warehouse/Services/device_manager/` — 6 个 Service 实现 + 6 个 Partial Service
|
||||||
|
- `VolPro.WebApi/Controllers/Warehouse/` — 6 个 Controller
|
||||||
|
|
||||||
|
### V0.4 配置主从表
|
||||||
|
- [ ] 代码生成器配置 base_device 的 DetailTable:
|
||||||
|
- 关联 video_channel(DeviceId=DeviceId)
|
||||||
|
- 关联 iot_devicedata(DeviceId=DeviceId)
|
||||||
|
- 关联 iot_alarm(DeviceId=DeviceId)
|
||||||
|
- [ ] 代码生成器配置 base_device 的 ParentId 自引用字段(ParentDeviceId)
|
||||||
|
|
||||||
|
### V0.5 构建验证
|
||||||
|
- [ ] VS 编译 Vol.Pro 解决方案,确认 0 错误
|
||||||
|
- [ ] 管理端访问 base_device 页面 → 框架默认主从表三 Tab 渲染正常
|
||||||
|
|
||||||
|
> **V0 提交点**: `PhaseV0_db_codegen — 6 张表建表 + 字典 + 代码生成完毕,框架默认页面可访问`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase V1: Entity 与 Service 扩展(预计 0.5 天)
|
||||||
|
|
||||||
|
### V1.1 Entity Partial
|
||||||
|
- [ ] 创建 `VolPro.Entity/DomainModels/device_manager/partial/base_device.cs`
|
||||||
|
- 添加导航属性:VideoChannel、Alarms、DeviceData
|
||||||
|
- 添加网关字段白名单常量 `GatewayFields`
|
||||||
|
- [ ] 创建 `VolPro.Entity/DomainModels/device_manager/partial/gateway_nodes.cs`
|
||||||
|
- 添加 `AdapterList` 属性(从 AdapterTypes 逗号分隔解析)
|
||||||
|
- [ ] 其他 4 个 Entity Partial 留空(框架生成即够用)
|
||||||
|
|
||||||
|
### V1.2 Service Partial — gateway_nodesService
|
||||||
|
- [ ] 编辑 `Warehouse/Services/device_manager/Partial/gateway_nodesService.cs`
|
||||||
|
- 注入 `Igateway_nodesRepository` + `IHttpContextAccessor`(`[ActivatorUtilitiesConstructor]`)
|
||||||
|
- 实现 `RegisterNodeAsync(nodeCode, token, adapterTypes, baseUrl)` — Upsert 逻辑
|
||||||
|
- 实现 `UpdateHeartbeatAsync(nodeCode, token)` — 更新心跳
|
||||||
|
- 实现 `SyncDevicesAsync(gatewayNodeId, List<StandardDevice>)` — 字段分治 + parentSourceId 映射
|
||||||
|
|
||||||
|
### V1.3 Service Partial — base_deviceService
|
||||||
|
- [ ] 编辑 `Warehouse/Services/device_manager/Partial/base_deviceService.cs`
|
||||||
|
- 注入 `Ibase_deviceRepository`
|
||||||
|
- 实现 `GetDevicesByGatewayNodeAsync(gatewayNodeId)` — 网关注册时返回设备列表
|
||||||
|
- 实现 `UpsertDeviceAsync(StandardDevice, gatewayNodeId, existingIds)` — 字段分治
|
||||||
|
|
||||||
|
### V1.4 Service Partial — iot_alarmService
|
||||||
|
- [ ] 编辑 `Warehouse/Services/device_manager/Partial/iot_alarmService.cs`
|
||||||
|
- 注入 `Iiot_alarmRepository`
|
||||||
|
- 实现 `UpsertAlarmAsync(StandardAlarm)` — SourceAlarmId 去重
|
||||||
|
|
||||||
|
### V1.5 构建验证
|
||||||
|
- [ ] VS 编译 → 0 错误
|
||||||
|
|
||||||
|
> **V1 提交点**: `PhaseV1_entity_service — Entity 导航属性 + Service 同步方法全部就绪`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase V2: Controller 扩展(预计 1 天)
|
||||||
|
|
||||||
|
### V2.1 gateway_nodesController — A1 网关注册
|
||||||
|
- [ ] 编辑 `Controllers/Warehouse/Partial/gateway_nodesController.cs`
|
||||||
|
- 添加 `[HttpPost, Route("/api/gateway/register"), AllowAnonymous]`
|
||||||
|
- 认证:NodeToken 验证
|
||||||
|
- Upsert:存在则更新 AdapterTypes/BaseUrl/IsOnline,不存在且 Token 有效则 Insert
|
||||||
|
- 返回:`{ nodeId, devices }` — 当前网关的顶层设备列表
|
||||||
|
|
||||||
|
### V2.2 gateway_nodesController — A2 心跳
|
||||||
|
- [ ] 添加 `[HttpPost, Route("/api/gateway/heartbeat"), AllowAnonymous]`
|
||||||
|
- 认证:NodeToken
|
||||||
|
- 更新:IsOnline="在线" + LastHeartbeat=now
|
||||||
|
- 返回:`{ status: "ok", serverTime }`
|
||||||
|
|
||||||
|
### V2.3 gateway_nodesController — A3 设备同步
|
||||||
|
- [ ] 添加 `[HttpPost, Route("/api/gateway/sync/devices"), AllowAnonymous]`
|
||||||
|
- 认证:NodeToken
|
||||||
|
- 批量查已有 DeviceId 映射表
|
||||||
|
- 遍历设备:字段分治写入(首次全量,后续仅网关字段)
|
||||||
|
- parentSourceId → ParentDeviceId 解析
|
||||||
|
- 返回:`{ added, updated, removed }`
|
||||||
|
|
||||||
|
### V2.4 gateway_nodesController — A4 告警同步
|
||||||
|
- [ ] 添加 `[HttpPost, Route("/api/gateway/sync/alarms"), AllowAnonymous]`
|
||||||
|
- 认证:NodeToken
|
||||||
|
- 批量查 deviceSourceId → DeviceId 映射
|
||||||
|
- SourceAlarmId 去重
|
||||||
|
- 写入 iot_alarm,State="未确认"
|
||||||
|
- 返回:`{ added }`
|
||||||
|
|
||||||
|
### V2.5 base_deviceController — 设备树
|
||||||
|
- [ ] 编辑 `Controllers/Warehouse/Partial/base_deviceController.cs`
|
||||||
|
- [ ] 添加 `[HttpGet, Route("/api/DeviceManager/GetRegionTree")]`
|
||||||
|
- 查询:warehouse_regions JOIN warehouse_devicepoint
|
||||||
|
- 构建树形结构(region → point,含 deviceCount)
|
||||||
|
- 返回:`[{ id, label, type, children, deviceCount }]`
|
||||||
|
- [ ] 添加 `[HttpGet, Route("/api/DeviceManager/GetDevicesByPoint")]`
|
||||||
|
- 查询:base_device WHERE PointId=pointId(含子设备递归)
|
||||||
|
- 分页返回:`{ items, total }`
|
||||||
|
|
||||||
|
### V2.6 权限配置
|
||||||
|
- [ ] A1-A4 接口加 `[AllowAnonymous]`(内部 Token 二次认证)
|
||||||
|
- [ ] GetRegionTree/GetDevicesByPoint 走框架 JWT 权限
|
||||||
|
|
||||||
|
### V2.7 构建验证
|
||||||
|
- [ ] VS 编译 → 0 错误
|
||||||
|
- [ ] Postman 测试 A1-A4(Mock Token)
|
||||||
|
- [ ] 管理端访问 GetRegionTree → 返回 JSON
|
||||||
|
|
||||||
|
> **V2 提交点**: `PhaseV2_controller — 6 个 API 全部就绪,A1-A4 AllowAnonymous,设备树可查`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase V3: 基础设施与定时任务(预计 0.5 天)
|
||||||
|
|
||||||
|
### V3.1 GatewayClient
|
||||||
|
- [ ] 创建 `Warehouse/Services/GatewayClient.cs`
|
||||||
|
- 实现 `TriggerFullSyncAsync(baseUrl, adapterTypes)` — 调网关 B3
|
||||||
|
- 实现 `GetRealtimeAsync(baseUrl, adapter, deviceId)` — 调网关 B4
|
||||||
|
- 实现 `ControlDeviceAsync(baseUrl, adapter, deviceId, pointIndex, value)` — 调网关 B5
|
||||||
|
|
||||||
|
### V3.2 Quartz Job — SyncDevicesJob
|
||||||
|
- [ ] 创建 `Warehouse/Services/SyncDevicesJob.cs`
|
||||||
|
- 实现 `IJob` 接口
|
||||||
|
- 遍历 `gateway_nodes WHERE IsOnline=在线 AND Enable=启用`
|
||||||
|
- 逐个调 `GatewayClient.TriggerFullSyncAsync`
|
||||||
|
|
||||||
|
### V3.3 Quartz Job — HeartbeatMonitorJob
|
||||||
|
- [ ] 创建 `Warehouse/Services/HeartbeatMonitorJob.cs`
|
||||||
|
- 扫描心跳超时 30s 的网关 → 标记离线
|
||||||
|
- 级联:`base_device WHERE GatewayNodeId=离线节点Id → IsOnline=离线`
|
||||||
|
|
||||||
|
### V3.4 Quartz Job — RealtimePollJob(Phase 2)
|
||||||
|
- [ ] 创建 `Warehouse/Services/RealtimePollJob.cs`(骨架,Phase 2 完善)
|
||||||
|
|
||||||
|
### V3.5 Startup.cs 注册
|
||||||
|
- [ ] 注册 `IHttpClientFactory`(Named: "VolPro")
|
||||||
|
- [ ] 注册 `GatewayClient` 为 Singleton
|
||||||
|
- [ ] 确认 Quartz Job 在管理端可配置(JobDataMap 传入 ServiceProvider)
|
||||||
|
|
||||||
|
### V3.6 Job 注册
|
||||||
|
- [ ] 在 Vol.Pro 管理端 → Quartz 管理 → 新建 3 个 Job:
|
||||||
|
- SyncDevicesJob:Cron "0 */5 * * * ?"
|
||||||
|
- HeartbeatMonitorJob:Cron "0/15 * * * * ?"
|
||||||
|
- RealtimePollJob:Cron "0/10 * * * * ?"
|
||||||
|
|
||||||
|
### V3.7 构建验证
|
||||||
|
- [ ] VS 编译 → 0 错误
|
||||||
|
- [ ] GatewayClient 可通过 Swagger 测试
|
||||||
|
|
||||||
|
> **V3 提交点**: `PhaseV3_infrastructure — GatewayClient + 3 Job + Startup 注册完毕`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase V4: 前端改造(预计 1.5 天)
|
||||||
|
|
||||||
|
### V4.1 目录创建
|
||||||
|
- [ ] 创建 `web.vite/src/views/warehouse/base_device/components/` 目录
|
||||||
|
- [ ] 创建 `web.vite/src/extension/warehouse/` 目录
|
||||||
|
- [ ] 创建 `web.vite/src/api/gateway.js` — 网关 B 组 API 封装
|
||||||
|
|
||||||
|
### V4.2 gateway.js API 封装
|
||||||
|
- [ ] `getStreamUrl(adapter, deviceId)` → GET 流地址
|
||||||
|
- [ ] `ptzControl(adapter, deviceId, direction)` → POST 云台控制
|
||||||
|
- [ ] `getRealtime(adapter, deviceId)` → GET 实时点值
|
||||||
|
- [ ] `controlDevice(adapter, deviceId, pointIndex, value)` → POST 控制
|
||||||
|
- [ ] `getAlarms(adapter, params)` → GET 告警列表
|
||||||
|
- [ ] `confirmAlarm(adapter, alarmId)` → POST 告警确认
|
||||||
|
|
||||||
|
### V4.3 视频操作组件
|
||||||
|
- [ ] 创建 `VideoDeviceActions.vue` — 按钮组(预览/云台/回放/快照/同步通道)
|
||||||
|
- [ ] 创建 `DeviceLivePreview.vue` — Jessibuca 播放器弹窗(<video> 回退)
|
||||||
|
- 调 `getStreamUrl` → 获取 WS-FLV/HLS 地址
|
||||||
|
- [ ] 创建 `PtzControlPanel.vue` — 方向键面板(↑↓←→+ZOOM+停止)
|
||||||
|
- mousedown 开始移动,mouseup 停止
|
||||||
|
|
||||||
|
### V4.4 IoT 操作组件
|
||||||
|
- [ ] 创建 `IoTDeviceActions.vue` — 按钮组(实时数据/控制/刷新/告警)
|
||||||
|
- [ ] 创建 `RealtimeDataPanel.vue` — 实时数值弹窗(5s 自动轮询 B4)
|
||||||
|
- [ ] 创建 `DeviceControlPanel.vue` — 控制写值面板(B5)
|
||||||
|
|
||||||
|
### V4.5 通用操作组件
|
||||||
|
- [ ] 创建 `DeviceEditDialog.vue` — 设备编辑弹窗(管理员字段)
|
||||||
|
- [ ] 创建 `MapBindingPanel.vue` — 地图模型绑定面板(模型ID/缩放/旋转)
|
||||||
|
|
||||||
|
### V4.6 未来组件(骨架)
|
||||||
|
- [ ] 创建 `AccessDeviceActions.vue` — 门禁按钮组(远程开门)
|
||||||
|
- [ ] 创建 `BarrierDeviceActions.vue` — 道闸按钮组(抬杆/落杆)
|
||||||
|
- [ ] 创建 `AlarmDeviceActions.vue` — 报警按钮组(告警/布防撤防)
|
||||||
|
|
||||||
|
### V4.7 扩展注入
|
||||||
|
- [ ] 创建 `web.vite/src/extension/warehouse/base_device.jsx`
|
||||||
|
- 注册操作列插槽 `col-action`
|
||||||
|
- 按 `row.deviceGroup` 动态渲染对应按钮组件
|
||||||
|
- 视频设备 → VideoDeviceActions
|
||||||
|
- IoT 设备 → IoTDeviceActions
|
||||||
|
- 其他 → 框架默认编辑/删除按钮
|
||||||
|
|
||||||
|
### V4.8 构建验证
|
||||||
|
- [ ] 前端 `npm run dev` 启动
|
||||||
|
- [ ] 访问 base_device 页面 → 操作列根据 DeviceGroup 显示不同按钮
|
||||||
|
- [ ] 点击"预览"→ 弹窗打开 → 获取流地址
|
||||||
|
|
||||||
|
> **V4 提交点**: `PhaseV4_frontend — 11 个组件 + extension 注入完成,操作列动态渲染`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase V5: 联调验证(需网关+子系统就绪,预计 1 天)
|
||||||
|
|
||||||
|
### V5.1 端到端同步
|
||||||
|
- [ ] 启动网关 → 调 A1 注册 → gateway_nodes 表新增记录
|
||||||
|
- [ ] 网关调 A3 上送设备 → base_device 表有新设备
|
||||||
|
- [ ] 管理端 base_device 页面 → 列表中显示新设备
|
||||||
|
|
||||||
|
### V5.2 视频操作
|
||||||
|
- [ ] 视频设备行 → 点击"实时预览" → 弹窗播放 Owl 视频流
|
||||||
|
- [ ] 视频设备行 → 云台方向键操作 → Owl PTZ 响应
|
||||||
|
|
||||||
|
### V5.3 IoT 操作
|
||||||
|
- [ ] IoT 设备行 → 点击"实时数据" → 显示 MC4.0 温湿度值
|
||||||
|
|
||||||
|
### V5.4 告警确认
|
||||||
|
- [ ] MC4.0 触发告警 → 网关 A4 上送 → iot_alarm 表新增
|
||||||
|
- [ ] 管理端确认告警 → 通过 B9 写回 MC4.0
|
||||||
|
|
||||||
|
> **V5 提交点**: `PhaseV5_integration — 端到端同步 + 视频操作 + IoT 数据 + 告警确认全链路跑通`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **总周期**: V0-V5 预计 5 个工作日(不含联调等待时间)
|
||||||
203
doc/设计文档/对接网关设计文档_任务清单.md
Normal file
203
doc/设计文档/对接网关设计文档_任务清单.md
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
# IntegrationGateway 对接网关详细设计 — 任务清单
|
||||||
|
|
||||||
|
> **基准文档**: 对接网关设计文档 v1.0
|
||||||
|
> **分支**: phase/0-infrastructure
|
||||||
|
> **原则**: 每阶段产出可编译、可提交的独立成果
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase G0: 项目骨架与核心抽象(预计 1 天)
|
||||||
|
|
||||||
|
### G0.1 解决方案与项目结构
|
||||||
|
- [ ] 创建 `gateway/IntegrationGateway.sln`(dotnet new sln)
|
||||||
|
- [ ] 创建 `src/IntegrationGateway.Core/` 类库项目(net8.0)
|
||||||
|
- [ ] 创建 `src/IntegrationGateway.Host/` Web 项目(net8.0, ASP.NET Core Minimal API)
|
||||||
|
- [ ] Host 引用 Core 项目
|
||||||
|
- [ ] 确认 `dotnet build` 0 错误
|
||||||
|
|
||||||
|
### G0.2 能力接口体系(7 个接口)
|
||||||
|
- [ ] 创建 `Core/Abstractions/IGatewayAdapter.cs` — 基础接口(AdapterCode/DisplayName/Capabilities/InitializeAsync/HealthCheckAsync)
|
||||||
|
- [ ] 创建 `Core/Abstractions/IHasOwnDeviceTree.cs` — 对象树接口
|
||||||
|
- [ ] 创建 `Core/Abstractions/IHasFlatDevices.cs` — 扁平设备列表接口
|
||||||
|
- [ ] 创建 `Core/Abstractions/IHasPoints.cs` — 实时点位值 + 控制接口
|
||||||
|
- [ ] 创建 `Core/Abstractions/IHasStreams.cs` — 视频流 + PTZ + 截图接口
|
||||||
|
- [ ] 创建 `Core/Abstractions/IHasAlarms.cs` — 告警查询 + 确认 + 结束接口
|
||||||
|
- [ ] 创建 `Core/Abstractions/IHasRecordings.cs` — 录像回放接口
|
||||||
|
- [ ] 创建 `Core/Abstractions/IAcceptsMetadataPush.cs` — 元数据回写接口
|
||||||
|
- [ ] 确认 `dotnet build` 0 错误
|
||||||
|
|
||||||
|
### G0.3 统一模型(10 个类)
|
||||||
|
- [ ] 创建 `Core/Models/StandardDevice.cs`
|
||||||
|
- [ ] 创建 `Core/Models/StandardAlarm.cs`
|
||||||
|
- [ ] 创建 `Core/Models/StandardRecording.cs`
|
||||||
|
- [ ] 创建 `Core/Models/DeviceTreeNode.cs`
|
||||||
|
- [ ] 创建 `Core/Models/PointValue.cs`
|
||||||
|
- [ ] 创建 `Core/Models/StreamUrls.cs`
|
||||||
|
- [ ] 创建 `Core/Models/PagedResult.cs`(泛型分页容器)
|
||||||
|
- [ ] 创建 `Core/Models/AdapterCapabilities.cs`
|
||||||
|
- [ ] 创建 `Core/Models/MetadataChangeSet.cs`
|
||||||
|
- [ ] 创建 `Core/Models/MetadataPushResult.cs`
|
||||||
|
- [ ] 确认 `dotnet build` 0 错误
|
||||||
|
|
||||||
|
### G0.4 基础设施(3 个类)
|
||||||
|
- [ ] 创建 `Core/Infrastructure/AdapterRegistry.cs` — 注册/查找/并行初始化
|
||||||
|
- [ ] 创建 `Core/Infrastructure/RateLimiter.cs` — 令牌桶限流器
|
||||||
|
- [ ] 创建 `Core/Infrastructure/GatewayClientFactory.cs` — Vol.Pro HTTP 客户端工厂
|
||||||
|
- [ ] 确认 `dotnet build` 0 错误
|
||||||
|
|
||||||
|
> **G0 提交点**: `PhaseG0_gateway_core — Core 项目编译通过,7 接口 + 10 模型 + 3 基础设施`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase G1: Host 宿主与路由注册(预计 0.5 天)
|
||||||
|
|
||||||
|
### G1.1 配置文件
|
||||||
|
- [ ] 创建 `appsettings.json` — Owl/MC4/Gateway 三段配置
|
||||||
|
- [ ] 配置验证:启动时检查必填项(VolProBaseUrl/NodeCode/NodeToken/Owl/MC4)
|
||||||
|
|
||||||
|
### G1.2 启动与注册
|
||||||
|
- [ ] 实现 `Program.cs` — IHttpClientFactory 注册("VolPro" 命名客户端)
|
||||||
|
- [ ] 实现适配器初始化(从配置读取生成 OwlAdapter/MC4Adapter 实例 → 注册到 AdapterRegistry)
|
||||||
|
- [ ] 实现并行初始化(`Task.WhenAll`,单个失败不影响其他)
|
||||||
|
|
||||||
|
### G1.3 B 组路由(14 个端点)
|
||||||
|
- [ ] `GET /api/gateway/health` — 返回所有适配器健康状态
|
||||||
|
- [ ] `GET /api/gateway/devices?adapter=&page=&size=&keyword=` — 扁平设备列表
|
||||||
|
- [ ] `GET /api/gateway/tree?adapter=` — 对象树
|
||||||
|
- [ ] `GET /api/gateway/streams/{adapter}/{deviceId}/live` — 实时流地址
|
||||||
|
- [ ] `GET /api/gateway/streams/{adapter}/{deviceId}/playback?start=&end=` — 回放地址
|
||||||
|
- [ ] `POST /api/gateway/streams/{adapter}/{deviceId}/snapshot` — 截图
|
||||||
|
- [ ] `POST /api/gateway/streams/{adapter}/{deviceId}/ptz` — 云台控制
|
||||||
|
- [ ] `GET /api/gateway/realtime/{adapter}/{deviceId}` — 实时点位值
|
||||||
|
- [ ] `POST /api/gateway/realtime/{adapter}/control` — 设备控制写值
|
||||||
|
- [ ] `GET /api/gateway/alarms/{adapter}?from=&to=&page=&size=` — 告警查询
|
||||||
|
- [ ] `POST /api/gateway/alarms/{adapter}/{alarmId}/confirm` — 告警确认
|
||||||
|
- [ ] `POST /api/gateway/alarms/{adapter}/{alarmId}/end` — 告警结束
|
||||||
|
- [ ] `GET /api/gateway/recordings/{adapter}/{deviceId}` — 录像列表
|
||||||
|
- [ ] `POST /api/gateway/devices/sync?adapter=` — 手动触发同步
|
||||||
|
- [ ] 确认 `dotnet build` 0 错误
|
||||||
|
|
||||||
|
### G1.4 错误处理中间件
|
||||||
|
- [ ] 统一错误响应格式:`{ error, message }`
|
||||||
|
- [ ] 适配器未找到 → 404 `ADAPTER_NOT_FOUND`
|
||||||
|
- [ ] 能力不支持 → 404 `CAPABILITY_NOT_SUPPORTED`
|
||||||
|
- [ ] 第三方超时 → 504 `UPSTREAM_TIMEOUT`
|
||||||
|
|
||||||
|
> **G1 提交点**: `PhaseG1_gateway_host — Host 编译通过,14 个路由骨架就绪,健康检查可响应`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase G2: OwlAdapter(预计 1 天)
|
||||||
|
|
||||||
|
### G2.1 项目创建
|
||||||
|
- [ ] 创建 `src/IntegrationGateway.Adapters.Owl/` 类库项目(net8.0)
|
||||||
|
- [ ] 引用 Core 项目
|
||||||
|
- [ ] Host 引用 Adapters.Owl
|
||||||
|
- [ ] 加入解决方案
|
||||||
|
|
||||||
|
### G2.2 OwlAuthHelper
|
||||||
|
- [ ] 实现 RSA 公钥获取 → 加密登录 → JWT Token 缓存
|
||||||
|
- [ ] Token 过期前自动刷新(懒刷新)
|
||||||
|
- [ ] 提供 `GetAuthenticatedClientAsync()` 方法
|
||||||
|
|
||||||
|
### G2.3 OwlAdapter 核心实现
|
||||||
|
- [ ] 实现 `IGatewayAdapter` — AdapterCode="Owl:main"
|
||||||
|
- [ ] 实现 `IHasFlatDevices` — `GetDevicesAsync` 分页 + `GetAllDevicesAsync` 全量
|
||||||
|
- [ ] 实现通道管理 — `GetChannelsAsync` + `GetAllChannelsAsync`
|
||||||
|
- [ ] 设备映射 — `OwlDevice → StandardDevice`, `OwlChannel → StandardDevice`
|
||||||
|
|
||||||
|
### G2.4 OwlAdapter 视频流实现
|
||||||
|
- [ ] 实现 `IHasStreams.GetLiveUrlAsync` — POST /channels/:id/play → StreamUrls
|
||||||
|
- [ ] 实现 `IHasStreams.GetPlaybackUrlAsync` — 构建 HLS VOD URL
|
||||||
|
- [ ] 实现 `IHasStreams.PtzControlAsync` — continuous + stop(仅方向键)
|
||||||
|
- [ ] 实现 `IHasStreams.GetSnapshotAsync` — POST /channels/:id/snapshot
|
||||||
|
|
||||||
|
### G2.5 OwlAdapter 录像与 Metadata
|
||||||
|
- [ ] 实现 `IHasRecordings.GetRecordingsAsync` — GET /recordings
|
||||||
|
- [ ] 实现 `IAcceptsMetadataPush.PushMetadataAsync` — PUT /devices/:id
|
||||||
|
|
||||||
|
### G2.6 HealthCheck
|
||||||
|
- [ ] 实现 `HealthCheckAsync` — 调 /health 端点
|
||||||
|
- [ ] Owl 认证失败 → HealthCheck = false
|
||||||
|
|
||||||
|
### G2.7 构建验证
|
||||||
|
- [ ] 确认 `dotnet build` 0 错误
|
||||||
|
- [ ] 确认 `POST /register` 返回 OwlAdapter 在适配器列表中
|
||||||
|
|
||||||
|
> **G2 提交点**: `PhaseG2_owl_adapter — OwlAdapter 编译通过,3 个接口实现完整(FlatDevices+Streams+Recordings+MetadataPush)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase G3: MC4Adapter(预计 1 天)
|
||||||
|
|
||||||
|
### G3.1 项目创建
|
||||||
|
- [ ] 创建 `src/IntegrationGateway.Adapters.MC4/` 类库项目(net8.0)
|
||||||
|
- [ ] 引用 Core 项目
|
||||||
|
- [ ] Host 引用 Adapters.MC4
|
||||||
|
- [ ] 加入解决方案
|
||||||
|
|
||||||
|
### G3.2 Mc4AuthHelper
|
||||||
|
- [ ] 实现 POST /api/central/auth/conf/get → Token 缓存(8 小时)
|
||||||
|
- [ ] 提供 `GetAuthenticatedClientAsync()` 方法(header["token"])
|
||||||
|
|
||||||
|
### G3.3 MC4Adapter 对象树
|
||||||
|
- [ ] 实现 `IGatewayAdapter` — AdapterCode="MC4:31ku"
|
||||||
|
- [ ] 实现 `IHasOwnDeviceTree.GetObjectTreeAsync` — POST /api/central/object/tree → DeviceTreeNode[]
|
||||||
|
- [ ] MC4 节点映射:`Mc4TreeNode → DeviceTreeNode`(Type=1区域/2设备)
|
||||||
|
|
||||||
|
### G3.4 MC4Adapter 实时数据
|
||||||
|
- [ ] 实现 `IHasPoints.GetRealtimeValuesAsync` — POST /api/central/device/point/value/get → PointValue[]
|
||||||
|
- [ ] 实现 `IHasPoints.GetMultiPointValuesAsync` — POST /api/central/point/multi/value/get
|
||||||
|
- [ ] 实现 `IHasPoints.SetPointValueAsync` — POST /api/central/point/value/set
|
||||||
|
|
||||||
|
### G3.5 MC4Adapter 告警
|
||||||
|
- [ ] 实现 `IHasAlarms.GetAlarmsAsync` — POST /api/central/alarm/query(skip/limit 转 page/size)
|
||||||
|
- [ ] 实现 `IHasAlarms.ConfirmAlarmAsync` — POST /api/central/alarm/confirm
|
||||||
|
- [ ] 实现 `IHasAlarms.EndAlarmAsync` — POST /api/central/alarm/end
|
||||||
|
- [ ] 告警去重:`SourceAlarmId` 唯一
|
||||||
|
|
||||||
|
### G3.6 限流与验证
|
||||||
|
- [ ] RateLimiter = new RateLimiter(2)(MC4.0 QPS 限制)
|
||||||
|
- [ ] 确认 `dotnet build` 0 错误
|
||||||
|
|
||||||
|
> **G3 提交点**: `PhaseG3_mc4_adapter — MC4Adapter 编译通过,3 个接口实现完整(OwnDeviceTree+Points+Alarms)`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase G4: 联调验证(需子系统就绪,预计 1 天)
|
||||||
|
|
||||||
|
### G4.1 Owl 联调
|
||||||
|
- [ ] 启动 Owl+ZLM → 网关 RSA 登录成功
|
||||||
|
- [ ] `GET /api/gateway/devices?adapter=Owl:main` → 返回设备列表
|
||||||
|
- [ ] `GET /api/gateway/streams/Owl:main/{channelId}/live` → 返回 WS-FLV 地址
|
||||||
|
- [ ] `POST /api/gateway/streams/Owl:main/{channelId}/ptz` → 云台响应
|
||||||
|
|
||||||
|
### G4.2 MC4.0 联调
|
||||||
|
- [ ] `GET /api/gateway/tree?adapter=MC4:31ku` → 返回对象树 JSON
|
||||||
|
- [ ] `GET /api/gateway/realtime/MC4:31ku/{deviceId}` → 返回点位值
|
||||||
|
- [ ] `GET /api/gateway/alarms/MC4:31ku` → 返回告警列表
|
||||||
|
|
||||||
|
### G4.3 故障隔离验证
|
||||||
|
- [ ] 停止 MC4.0 → `GET /health` 中 Owl=OK, MC4=FAIL
|
||||||
|
- [ ] Owl 设备查询仍正常返回
|
||||||
|
|
||||||
|
> **G4 提交点**: `PhaseG4_integration — 联调通过,健康检查报告真实状态`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase G5: 部署与文档(预计 0.5 天)
|
||||||
|
|
||||||
|
### G5.1 发布
|
||||||
|
- [ ] `dotnet publish` Release 模式
|
||||||
|
- [ ] Dockerfile 编写与构建
|
||||||
|
|
||||||
|
### G5.2 运维文档
|
||||||
|
- [ ] 启动脚本(单机/Docker)
|
||||||
|
- [ ] 配置说明(环境变量覆盖)
|
||||||
|
- [ ] 健康检查命令
|
||||||
|
|
||||||
|
> **G5 提交点**: `PhaseG5_deploy — 可发布的网关二进制 + 运维文档`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **总周期**: G0-G5 预计 4 个工作日(不含联调等待时间)
|
||||||
Reference in New Issue
Block a user