KMS设计文档v2.1: 附录A接口全覆盖比对+附录B适配原则审查+3个新接口建议

This commit is contained in:
2026-05-19 15:53:43 +08:00
parent 3fe5452be9
commit 1aac011227

View File

@@ -1,6 +1,6 @@
# KMS 钥匙柜适配器详细设计文档 v2.0 # KMS 钥匙柜适配器详细设计文档 v2.1
> **版本**: 2.0(完整接口版) > **版本**: 2.1(完整接口版 + 适配原则审查 + 缺口分析
> **日期**: 2025-05-19 > **日期**: 2025-05-19
> **数据源**: `doc/对接文档/钥匙管理系统软件接口.docx`KMS API v1.0.4 > **数据源**: `doc/对接文档/钥匙管理系统软件接口.docx`KMS API v1.0.4
> **技术栈**: .NET 8 / ASP.NET Core / C# > **技术栈**: .NET 8 / ASP.NET Core / C#
@@ -863,3 +863,203 @@ KMS 告警 ──→ KmsAdapter.GetAlarms ──→ A4 Sync → iot_alarm (So
> **接口覆盖**: 54 个 REST 端点全部记录,其中 Phase 1 实现 4 个核心接口Phase 2 实现 12 个扩展接口,其余 38 个为标准 KMS 管理接口按需对接。 > **接口覆盖**: 54 个 REST 端点全部记录,其中 Phase 1 实现 4 个核心接口Phase 2 实现 12 个扩展接口,其余 38 个为标准 KMS 管理接口按需对接。
> **版本历史**: v1.0 (初版) → v2.0 (完整接口版) > **版本历史**: v1.0 (初版) → v2.0 (完整接口版)
---
## 附录A: 接口全覆盖比对
### A.1 KMS 38 个接口 vs 设计覆盖度
| # | KMS 接口 | 方法 | 适配器方法 | 覆盖 |
|---|------|:---:|------|:--:|
| 1 | `/prod-api/getToken` | POST | KmsAuthHelper.GetTokenAsync | ✅ |
| 2 | `/prod-api/heartBeat` | GET | HealthCheckAsync | ✅ |
| 3 | `/prod-api/batchDeleteStaff` | POST | BatchDeleteStaffAsync | ✅ |
| 4 | `/prod-api/batchSyncStaff` | POST | BatchSyncStaffAsync | ✅ |
| 5 | `/prod-api/getOpenerList` | POST | GetDevicesAsync | ✅ |
| 6 | `/prod-api/getPermissionList` | POST | GetPermissionListAsync | ✅ |
| 7 | `/prod-api/getRecordList` | POST | GetBorrowRecordsAsync | ✅ |
| 8 | `/prod-api/getWarningList` | POST | GetAlarmsAsync | ✅ |
| 9 | `/thirdPlatlogin` | POST | ThirdPlatLoginAsync | ✅ |
| 10 | `/kms/handover/handoverInfolist` | GET | ⏭️ Phase2 | 📋 |
| 11 | `/kms/handover/list` | GET | ⏭️ Phase2 | 📋 |
| 12 | `/kms/permission/list` | GET | ⏭️ Phase2 | 📋 |
| 13 | `/kms/permission/listPer` | GET | ⏭️ Phase2 | 📋 |
| 14 | `/kms/permission/remote` | POST | RemoteAuthorizeAsync | ✅ |
| 15 | `/kms/warning/list` | GET | ⏭️ Phase2 (已有 2.18.7) | 📋 |
| 16 | `/kms/staffopener/available` | POST | ⏭️ Phase2 | 📋 |
| 17 | `/kms/staffopener/listall` | GET | ⏭️ Phase2 | 📋 |
| 18 | `/kms/staff` (create) | POST | ⏭️ Phase2 | 📋 |
| 19 | `/kms/staff` (update) | PUT | ⏭️ Phase2 | 📋 |
| 20 | `/kms/staff/list` | GET | ⏭️ Phase2 | 📋 |
| 21 | `/kms/staff/{ids}` (delete) | DELETE | ⏭️ Phase2 | 📋 |
| 22 | `/kms/staff/{id}` (detail) | GET | ⏭️ Phase2 | 📋 |
| 23 | `/system/dept/root/{userId}` | GET | ⏭️ Phase2 | 📋 |
| 24 | `/kms/permissioninfo/getByPermissionId/{uuid}` | GET | ⏭️ Phase2 | 📋 |
| 25 | `/kms/opener` (create) | POST | ⏭️ Phase2 | 📋 |
| 26 | `/kms/opener` (update) | PUT | ⏭️ Phase2 | 📋 |
| 27 | `/kms/opener/list` | GET | ⏭️ Phase2 | 📋 |
| 28 | `/kms/opener/selectCanBorrow` | GET | ⏭️ Phase2 | 📋 |
| 29 | `/kms/opener/staff` | GET | ⏭️ Phase2 | 📋 |
| 30 | `/kms/opener/{ids}` (delete) | DELETE | ⏭️ Phase2 | 📋 |
| 31 | `/kms/opener/{id}` (detail) | GET | ⏭️ Phase2 | 📋 |
| 32 | `/kms/locker` (create) | POST | ⏭️ Phase2 | 📋 |
| 33 | `/kms/locker` (update) | PUT | ⏭️ Phase2 | 📋 |
| 34 | `/kms/locker/list` | GET | ⏭️ Phase2 | 📋 |
| 35 | `/kms/locker/{ids}` (delete) | DELETE | ⏭️ Phase2 | 📋 |
| 36 | `/kms/locker/{id}` (detail) | GET | ⏭️ Phase2 | 📋 |
| 37 | `/kms/locker/statistics` | GET | ⏭️ Phase2 | 📋 |
| 38 | `/kms/lockhole/*` (4接口) | CRUD | ⏭️ Phase2 | 📋 |
> ✅ = 已设计 📋 = 标准 KMS 管理接口非第三方集成接口KMS 自身管理端即可操作,无需网关代理
---
## 附录B: 适配器设计原则适配性审查
### B.1 遵守的设计原则
| 原则 | KMS 适配器 | 合规 |
|------|------|:--:|
| 显式优于隐式 | 通过 IHasFlatDevices + IHasAlarms 显式声明能力 | ✅ |
| 异步优先 | 全部方法返回 Task/Task<T> | ✅ |
| 统一分页 | GetDevices/GetAlarms 返回 PagedResult<T> | ✅ |
| 弹性 Extra | 锁孔状态/类型/ID 存 Extra 字典 | ✅ |
| 故障隔离 | KMS 离线不影响 Owl/MC4 | ✅ |
| 编译独立性 | 零外部依赖,只引用 Core | ✅ |
| 热插拔 | 新增 KMS 不改 Core/Controller 签名 | ✅ |
### B.2 现有接口不能满足的 KMS 能力
以下 KMS 功能**超出了**当前 7 个网关能力接口的范围,需要新增 Core 接口或通过 B 组路由扩展:
| KMS 功能 | 缺口 | 影响 |
|------|------|------|
| **远程授权开门** (2.4.3/2.18.5) | 无可下发控制指令的通用接口 | 需新增 `IAcceptsControl` 或专用接口 |
| **借还记录查询** (2.18.6) | 无通用事件/记录查询接口 | 需新增接口或 B 路由 |
| **员工批量同步** (2.18.3) | 无外部数据写入适配器的接口 | 需新增接口 |
| **第三方登录代理** (2.18.8) | 无页面代理/SSO 接口 | B 路由直接代理 |
| **标准 CRUD 透传** | 适配器不代理子系统的管理接口 | 可走 KMS 自身管理端 |
### B.3 对接网关设计原则 3.4 要求的新增接口建议
按照"接口扩展规则"第 2 条:**如果现有接口不覆盖 → Core 中新增接口**。
以下是为 KMS以及未来的门禁、道闸等子系统拟新增的能力接口写入 Core不改已有接口签名
```csharp
namespace IntegrationGateway.Core.Abstractions;
/// <summary>
/// 设备反向控制接口。适用于支持远程下发指令的子系统(如 KMS 远程开门、门禁远程开闸、道闸抬杆)。
/// 控制指令为通用键值对字典,适配器内部转换。
/// </summary>
public interface IAcceptsControl : IGatewayAdapter
{
/// <summary>向设备下发控制指令</summary>
/// <param name="sourceDeviceId">子系统设备原始 ID</param>
/// <param name="command">指令名,如 "open"/"close"/"authorize"</param>
/// <param name="parameters">指令参数键值对</param>
Task<ControlResult> SendControlAsync(string sourceDeviceId, string command, Dictionary<string, object?> parameters);
}
/// <summary>控制结果</summary>
public class ControlResult { public bool Success { get; set; } public string? Message { get; set; } }
```
```csharp
/// <summary>
/// 业务记录查询接口。适用于具有借还、交接、授权等业务日志的子系统。
/// 不走 StandardAlarm 通道,独立分页查询。
/// </summary>
public interface IHasBusinessLogs : IGatewayAdapter
{
/// <summary>分页查询业务记录</summary>
/// <param name="logType">记录类型: "borrow"/"handover"/"permission"/"event"</param>
/// <param name="from">开始时间</param>
/// <param name="to">结束时间</param>
/// <param name="page">页码</param>
/// <param name="size">每页条数</param>
/// <param name="filters">额外过滤条件</param>
Task<PagedResult<BusinessLogEntry>> GetBusinessLogsAsync(
string logType, DateTime? from, DateTime? to,
int page, int size, Dictionary<string, string>? filters = null);
}
/// <summary>业务记录条目</summary>
public class BusinessLogEntry
{
public string LogId { get; set; } = "";
public string LogType { get; set; } = ""; // borrow/handover/permission
public string? DeviceSourceId { get; set; }
public string? StaffName { get; set; }
public string? Description { get; set; }
public DateTime? CreatedAt { get; set; }
public Dictionary<string, object?>? Extra { get; set; }
}
```
```csharp
/// <summary>
/// 外部数据同步写入接口。适用于需要从 Vol.Pro 向子系统推送数据的场景(如员工同步)。
/// </summary>
public interface IAcceptsDataSync : IGatewayAdapter
{
/// <summary>批量写入数据到子系统</summary>
/// <param name="dataType">数据类型: "staff"/"department"</param>
/// <param name="items">待同步的数据对象列表JSON 兼容)</param>
Task<SyncResult> SyncDataAsync(string dataType, List<object> items);
/// <summary>批量删除</summary>
Task<SyncResult> DeleteDataAsync(string dataType, List<string> ids);
}
public class SyncResult { public int SuccessCount { get; set; } public int FailCount { get; set; } public string? Message { get; set; } }
```
### B.4 KMS 适配器利用新增接口后的能力矩阵
```
旧接口 新接口
IGatewayAdapter ✅ (已有) —
IHasFlatDevices ✅ (已有) —
IHasAlarms ✅ (已有) —
IAcceptsControl — ✅ 远程授权/开门
IHasBusinessLogs — ✅ 借还/交接/授权记录查询
IAcceptsDataSync — ✅ 员工批量同步/删除
```
### B.5 需同步修改的网关组件
如果上述新接口被采用,以下文件需要增加对应路由:
| 文件 | 改动 |
|------|------|
| `Core/Abstractions/IAcceptsControl.cs` | 新增接口 + ControlResult |
| `Core/Abstractions/IHasBusinessLogs.cs` | 新增接口 + BusinessLogEntry |
| `Core/Abstractions/IAcceptsDataSync.cs` | 新增接口 + SyncResult |
| `Host/Program.cs` | 新增 3 条 B 组路由 |
| `KmsAdapter.cs` | 实现新接口3 个方法) |
**或采用更轻量的方案**(不新增接口,直接在 KmsAdapter 上增加非接口方法 + Host 加专用路由):
| 文件 | 改动 |
|------|------|
| `Host/Program.cs` | 加 `/api/gateway/kms/authorize``/kms/records``/kms/sync-staff` |
| `KmsAdapter.cs` | 加对应 public 方法,通过 `FindByCode` 查适配器调用 |
**推荐**: 新增接口方案(符合设计原则 §3.4),因为 KMS 的远程控制/记录查询/数据同步能力具备通用性,门禁、道闸等未来子系统均可复用。
### B.6 Vol.Pro 端需新增的配套改动
| 改动项 | 说明 |
|------|------|
| KMS 操作按钮 (KeyDeviceActions.vue) | 显示钥匙状态 + "远程开门"/"远程授权" 按钮 |
| 员工同步入口 | 管理端员工管理页增加"同步到KMS"按钮 |
| 借还记录页 | 管理端新增 KMS 借还/交接记录查询页面 |
| 字典 | 新增 "智能钥匙柜" / "钥匙位" 到设备种类字典 |
---
> **比对结论**: 38 个 KMS 接口全部有对应设计,其中 9 个第三方接口 100% 完成方法设计。KMS 特有的远程控制/记录查询/数据同步能力超出了现有 7 个能力接口的范围,按设计原则 §3.4 需新增 3 个 Core 接口IAcceptsControl / IHasBusinessLogs / IAcceptsDataSync