98 lines
4.2 KiB
Markdown
98 lines
4.2 KiB
Markdown
# 网关自动注册机制整改 — 任务清单
|
||
|
||
> **版本**: 1.0
|
||
> **日期**: 2026-06-03
|
||
> **基准**: `doc/设计文档/网关自动注册机制整改方案_v1.0.md` + `doc/设计文档/网关自动注册机制检查报告20260603.md`
|
||
> **原则**: 分阶段分步骤执行,每步骤完成编译复查后提交,不合并主分支
|
||
|
||
---
|
||
|
||
## 阶段 G1: Gateway 端修复(3 步骤)
|
||
|
||
### 步骤 G1.1 — 修复 BaseUrl 硬编码
|
||
|
||
- [ ] 编辑 `gateway/src/IntegrationGateway.Host/Program.cs`
|
||
- [ ] 将 `BaseUrl = $"http://localhost:..."` 改为读取 `gwCfg["SelfUrl"]`,不填降级 localhost
|
||
- [ ] 编辑 `gateway/src/IntegrationGateway.Host/appsettings.json`,Gateway 段新增 `"SelfUrl": null`
|
||
- [ ] `dotnet build gateway/IntegrationGateway.slnx` → 0 错误
|
||
- [ ] 复查:`BaseUrl` 不再硬编码 localhost,可从配置注入真实 IP
|
||
|
||
> **G1.1 提交点**: `Fix-G1.1: Gateway A1 BaseUrl 改为读取 SelfUrl 配置`
|
||
|
||
### 步骤 G1.2 — A1 注册后追加 A3 设备同步
|
||
|
||
- [ ] 编辑 `gateway/src/IntegrationGateway.Host/Program.cs`
|
||
- [ ] A1 注册成功后:遍历 `registry.All`,`IHasFlatDevices` → `GetDevicesAsync`,`IHasOwnDeviceTree` → `GetObjectTreeAsync` + 展平
|
||
- [ ] 新增 `FlattenTree` 辅助函数(MC4 对象树展平)
|
||
- [ ] 调 `clientFactory.SyncDevicesAsync(nodeCode, nodeToken, allDevices)`
|
||
- [ ] `dotnet build` → 0 错误
|
||
- [ ] 复查:A1 成功后立即执行 A3,注册完成时 Vol.Pro 已有设备数据
|
||
|
||
> **G1.2 提交点**: `Fix-G1.2: A1注册后立即A3同步全部适配器设备列表`
|
||
|
||
### 步骤 G1.3 — 启动 A2 心跳 + 自动重注册
|
||
|
||
- [ ] 编辑 `gateway/src/IntegrationGateway.Host/Program.cs`
|
||
- [ ] A1/A3 完成后启动 `Task.Run` 心跳循环
|
||
- [ ] `PeriodicTimer` 每 15s → `clientFactory.HeartbeatAsync`
|
||
- [ ] 连续失败 ≥ 3 次 → 触发 A1+A3 重注册
|
||
- [ ] 新增 `SyncAllDevicesAsync` 辅助函数(复用 A3 逻辑)
|
||
- [ ] `dotnet build` → 0 错误
|
||
- [ ] 复查:心跳成功重置 `failCount`,失败累积到 3 次自动恢复
|
||
|
||
> **G1.3 提交点**: `Fix-G1.3: A2心跳+自动重注册(连续3次失败触发A1+A3)`
|
||
|
||
---
|
||
|
||
## 阶段 G2: Vol.Pro 端修复(2 步骤)
|
||
|
||
### 步骤 G2.1 — RegisterNodeAsync 语法规范化
|
||
|
||
- [ ] 编辑 `api_sqlsugar/Warehouse/Services/device_manager/Partial/gateway_nodesService.cs`
|
||
- [ ] `RegisterNodeAsync`:`DbContext.Queryable.First()` → `FindAsIQueryable.FirstOrDefaultAsync()`
|
||
- [ ] `UpdateHeartbeatAsync`:同样替换
|
||
- [ ] `dotnet build api_sqlsugar/Warehouse` → 0 错误
|
||
- [ ] 复查:两个方法使用统一 Vol.Pro 查询语法,`.First()` 不抛异常
|
||
|
||
> **G2.1 提交点**: `Fix-G2.1: gateway_nodesService 统一 FindAsIQueryable 语法`
|
||
|
||
### 步骤 G2.2 — 标记 UpsertDeviceAsync 为废弃
|
||
|
||
- [ ] 编辑 `api_sqlsugar/Warehouse/Services/device_manager/Partial/base_deviceService.cs`
|
||
- [ ] `UpsertDeviceAsync` 加 `[Obsolete]` 标记 + 注释说明
|
||
- [ ] 检查接口文件 `Ibase_deviceService` 是否暴露此方法,同步标记
|
||
- [ ] `dotnet build` → 0 错误(允许 [Obsolete] 警告)
|
||
- [ ] 复查:重复逻辑已标记,新代码不会误用
|
||
|
||
> **G2.2 提交点**: `Fix-G2.2: base_deviceService.UpsertDeviceAsync 标记 [Obsolete]`
|
||
|
||
---
|
||
|
||
## 阶段 G3: 全量验证(1 步骤)
|
||
|
||
### 步骤 G3.1 — 全量编译 + 联调场景验证
|
||
|
||
- [ ] `dotnet build gateway/IntegrationGateway.slnx` → 0 错误
|
||
- [ ] `dotnet build api_sqlsugar/VolPro.WebApi` → 0 错误
|
||
- [ ] 网关启动 → 控制台输出 A1 注册 → A3 同步 N 台 → A2 心跳启动
|
||
- [ ] `gateway_nodes` 表有记录,`LastHeartbeat` 持续更新
|
||
- [ ] `base_device` 表有对应设备
|
||
- [ ] 网关先启动(Vol.Pro 未启动)→ 45 秒后自动恢复
|
||
- [ ] 复查:全链路 A1→A3→A2 闭环正常
|
||
|
||
> **G3.1 提交点**: `Fix-G3: 全量编译验证通过 注册机制闭环完成`
|
||
|
||
---
|
||
|
||
## 任务总览
|
||
|
||
| 阶段 | 步骤 | 文件 | 预计 |
|
||
|:---:|:---:|------|:---:|
|
||
| G1 | G1.1 BaseUrl 修复 | Program.cs + appsettings.json | 10min |
|
||
| G1 | G1.2 A3 设备同步 | Program.cs | 30min |
|
||
| G1 | G1.3 心跳+重注册 | Program.cs | 20min |
|
||
| G2 | G2.1 语法规范化 | gateway_nodesService.cs | 5min |
|
||
| G2 | G2.2 标记废弃方法 | base_deviceService.cs | 10min |
|
||
| G3 | G3.1 全量验证 | 全项目 | 15min |
|
||
| **合计** | **6 步骤** | **5 文件** | **~1.5h** |
|