13 KiB
KMS 钥匙柜适配器 — 任务清单
基准文档:
doc/设计文档/KMS钥匙柜适配器详细设计文档.mdv2.1 分支: gateway-dev 原则: 严格按照设计文档执行,严禁无中生有。网关/Vol.Pro 改动放倒数第二步,联调放最后。
Phase K0: 项目骨架(预计 15min)
K0.1 创建适配器项目
- 在
gateway/src/下执行dotnet new classlib -n IntegrationGateway.Adapters.Kms -f net8.0 - 删除自动生成的
Class1.cs - 添加项目引用:
dotnet add reference ../IntegrationGateway.Core/IntegrationGateway.Core.csproj - 将项目加入解决方案:
dotnet sln add
K0.2 Host 引用适配器
dotnet add Host reference Adapters.Kms
K0.3 编译验证
dotnet build→ 0 错误
K0 提交点:
PhaseK0_scaffold — Kms适配器项目骨架就绪
Phase K1: KmsModels — 数据模型(预计 1h)
K1.1 认证模型
- 创建
KmsModels.cs - 添加
KmsTokenResponse { Code, Token, Msg }
K1.2 第三方接口响应模型(2.18.X)
KmsOpenerListResponse { Code, Msg, Rows }KmsLocker { LockerId, LockerName, LockerCode, LockholeList }KmsLockhole { LockholeSort, OpenerId, OpenerName, OpenerType, OpenerState }KmsWarningListResponse { Code, Msg, Total, Rows }KmsWarning { Uuid, LockerName, LockholeSort, OpenerName, Type, WarningTime, Remark, StaffName }KmsRecordListResponse { Code, Msg, Total, Rows }KmsRecord { Uuid, LockerName, LockholeSort, OpenerName, StaffName, BorrowTime, ReturnTime, Type }
K1.3 标准接口响应模型(2.3-2.17)
KmsHandoverInfo— 交接记录KmsPermissionListResponse+KmsPermission— 授权记录KmsStaffListResponse+KmsStaff— 员工KmsLockerListResponse+KmsLockerInfo— 柜体KmsLockholeListResponse+KmsLockholeInfo— 锁孔KmsOpenerListResponse2+KmsOpenerInfo— 钥匙KmsStaffOpenerListResponse+KmsStaffOpener— 员工可借KmsRemotePermissionRequest— 远程授权请求(联调时确认字段)
K1.4 编译验证
dotnet build→ 0 错误(DTO 引用 Core 的StandardDevice/StandardAlarm等确认无编译错误)
K1 提交点:
PhaseK1_models — KmsModels.cs 完整定义全部 15 个 DTO
Phase K2: KmsAuthHelper — 认证(预计 30min)
K2.1 创建 KmsAuthHelper.cs
- 构造函数:接收
HttpClient,baseUrl,clientId,clientSecret - 属性:
_token(string?),_tokenExpiry(DateTime) - 依赖:
System.Text.Json,System.Net.Http.Json
K2.2 GetTokenAsync
- POST
/prod-api/getToken?clientId=xx&clientSecret=yy - 检查
resp.EnsureSuccessStatusCode() - 反序列化
KmsTokenResponse - 校验
Code == 200 - 缓存 Token,过期时间 =
UtcNow.AddMinutes(25)(30 分钟效期,5 分钟余量)
K2.3 GetAuthenticatedClientAsync
- 调用
GetTokenAsync() - 创建新
HttpClient,BaseAddress = _baseUrl - 设置 Header
Authorization: Bearer {token} - 返回 client
K2.4 Invalidate
_token = null强制下次重新获取
K2.5 编译验证
dotnet build→ 0 错误
K2 提交点:
PhaseK2_auth — KmsAuthHelper Bearer Token 认证就绪
Phase K3: KmsAdapter 核心方法(预计 1.5h)
K3.1 类定义与构造函数
public class KmsAdapter : IHasFlatDevices, IHasAlarms- 字段:
_http,_auth(KmsAuthHelper),_limiter(RateLimiter(5)) - 属性:
AdapterCode,DisplayName,Capabilities { HasFlatDevices=true, HasAlarms=true } - 构造函数:注入
httpClient,baseUrl,clientId,clientSecret
K3.2 InitializeAsync
await _auth.GetTokenAsync()
K3.3 HealthCheckAsync(2.18.1)
- POST
/prod-api/heartBeat(空 body{}) - 返回
resp.IsSuccessStatusCode - 异常捕获返回 false
K3.4 GetDevicesAsync(2.18.4 — 柜体+锁孔 → StandardDevice)
await _limiter.WaitAsync()- POST
/prod-api/getOpenerList(body{}) - 反序列化
KmsOpenerListResponse - 遍历
Rows:- 每个
KmsLocker→MapLockerToDevice(父设备,SourceId=locker_{LockerId}) - 每个
KmsLockhole→MapLockholeToDevice(子设备,ParentSourceId=locker_{LockerId})
- 每个
- IsOnline 判断:
OpenerState == "在位"→ true - Extra 字典:
{ openerId, openerType, openerState }/{ lockerCode, lockholeCount } - 返回
PagedResult<StandardDevice>
K3.5 GetAlarmsAsync(2.18.7 — 告警列表 → StandardAlarm)
await _limiter.WaitAsync()- POST
/prod-api/getWarningList(body{}) - 反序列化
KmsWarningListResponse - 映射:
AlarmId=uuid,Title="{lockerName} 锁孔{lockholeSort}: {openerName}",Status=Type==1?"未确认":"已结束",Level="普通" - 返回
PagedResult<StandardAlarm>
K3.6 ConfirmAlarmAsync / EndAlarmAsync
ConfirmAlarmAsync: POST/prod-api/kms/warning/confirm/{alarmId}EndAlarmAsync: 留空实现(KMS 第三方接口不提供结束告警)
K3.7 编译验证
dotnet build→ 0 错误
K3 提交点:
PhaseK3_adapter_core — KmsAdapter 核心4方法就绪(HealthCheck/GetDevices/GetAlarms/Confirm)
Phase K4: KmsAdapter 扩展方法(预计 1h)
K4.1 GetBorrowRecordsAsync(2.18.6)
- POST
/prod-api/getRecordList - 参数:
from,toDateTime?(联调时确认请求体格式) - 返回
PagedResult<KmsRecord>
K4.2 GetPermissionListAsync(2.18.5)
- POST
/prod-api/getPermissionList - 参数:
from,toDateTime? - 返回
PagedResult<KmsPermission>
K4.3 BatchSyncStaffAsync(2.18.3)
- POST
/prod-api/batchSyncStaff - 请求体:
new { staff = staffList } resp.EnsureSuccessStatusCode()
K4.4 BatchDeleteStaffAsync(2.18.2)
- POST
/prod-api/batchDeleteStaff - 请求体:
List<string>(staffUuid 数组) resp.EnsureSuccessStatusCode()
K4.5 RemoteAuthorizeAsync(2.4.3)
- POST
/prod-api/kms/permission/remote - 请求体:
KmsRemotePermissionRequest(联调确认字段)
K4.6 ThirdPlatLoginAsync(2.18.8)
- POST
/thirdPlatlogin?username={username} - 处理 302 重定向:返回
Locationheader 或响应体 - 超时设置 15s
K4.7 编译验证
dotnet build→ 0 错误
K4 提交点:
PhaseK4_adapter_ext — 6个扩展方法全部就绪(记录/同步/授权/登录)
Phase K5: 配置与注册(预计 15min)
K5.1 KmsConfig POCO
- 在
Program.cs同级新增KmsConfig类 - 属性:
InstanceName?,BaseUrl,ClientId,ClientSecret
K5.2 appsettings.json
- 新增
KMS数组配置段 - 配置项:
InstanceName,BaseUrl,ClientId,ClientSecret
K5.3 Program.cs 注册
var kmsList = app.Configuration.GetSection("KMS").Get<List<KmsConfig>>() ?? new();- foreach 注册
KmsAdapter("KMS:{InstanceName}", http, baseUrl, clientId, clientSecret) - 适配器编码加入
adapterTypes拼接
K5.4 编译验证
dotnet build→ 0 错误
K5 提交点:
PhaseK5_config — KMS多实例配置+Program.cs注册就绪
Phase K6: 编译与自测(预计 15min)
K6.1 全量编译
dotnet build→ 0 错误(确认 KMS 适配器不引入外部依赖)
K6.2 启动测试
dotnet run启动网关- 检查控制台输出:
[Gateway] N 个适配器已注册: Owl:main,MC4:31ku,KMS:main - 确认 KMS 初始化失败时打印错误但不阻塞
K6 提交点:
PhaseK6_build — 网关全量编译通过 KMS适配器热加载不阻塞启动
Phase K7: 网关核心与 Host 扩展(预计 1.5h)⚠️ 倒数第二步
说明: 此阶段按设计文档附录 B 新增 Core 能力接口 + B 组路由,遵循网关设计原则 §3.4。
K7.1 新增 IAcceptsControl 接口
- 创建
Core/Abstractions/IAcceptsControl.cs - 方法:
Task<ControlResult> SendControlAsync(sourceDeviceId, command, parameters) - 新增
Core/Models/ControlResult.cs:{ Success, Message }
K7.2 新增 IHasBusinessLogs 接口
- 创建
Core/Abstractions/IHasBusinessLogs.cs - 方法:
Task<PagedResult<BusinessLogEntry>> GetBusinessLogsAsync(logType, from, to, page, size, filters) - 新增
Core/Models/BusinessLogEntry.cs:{ LogId, LogType, DeviceSourceId, StaffName, Description, CreatedAt, Extra }
K7.3 新增 IAcceptsDataSync 接口
- 创建
Core/Abstractions/IAcceptsDataSync.cs - 方法:
Task<SyncResult> SyncDataAsync(dataType, items) - 方法:
Task<SyncResult> DeleteDataAsync(dataType, ids) - 新增
Core/Models/SyncResult.cs:{ SuccessCount, FailCount, Message }
K7.4 KmsAdapter 实现新接口
KmsAdapter增加: IAcceptsControl, IHasBusinessLogs, IAcceptsDataSyncSendControlAsync:调RemoteAuthorizeAsync,command="open" 时调/kms/permission/remoteGetBusinessLogsAsync:按 logType 分发到GetBorrowRecordsAsync/GetPermissionListAsync/ 交接记录SyncDataAsync:dataType="staff" 时调BatchSyncStaffAsyncDeleteDataAsync:dataType="staff" 时调BatchDeleteStaffAsync
K7.5 Program.cs 新增 B 组路由
POST /api/gateway/control/{adapter}—IAcceptsControl.SendControlAsyncGET /api/gateway/logs/{adapter}—IHasBusinessLogs.GetBusinessLogsAsyncPOST /api/gateway/sync/{adapter}—IAcceptsDataSync.SyncDataAsyncDELETE /api/gateway/sync/{adapter}—IAcceptsDataSync.DeleteDataAsync
K7.6 编译验证
dotnet build→ 0 错误
K7 提交点:
PhaseK7_gateway — 3个新Core接口+4条B路由+KmsAdapter多接口实现
Phase K8: Vol.Pro 管理端配套(预计 1h)⚠️ 倒数第二步
K8.1 数据字典补充
- 管理端 → 字典管理 → 设备种类新增:"智能钥匙柜" / "钥匙位"
K8.2 前端操作列扩展
- 编辑
web.vite/src/views/warehouse/device_manager/base_device.vue onInited的 render 函数中增加DeviceGroup==='门禁设备'分支- 显示 "开门" 按钮(调用网关 B8)
- 显示 "权限" 下拉菜单(永久授权/临时授权/取消授权)
K8.3 前端 API 调用
fetch()调网关http://localhost:5100/api/gateway/control/KMS:main- 请求体:
{ sourceDeviceId, command: "open", parameters: { openerId, staffId } }
K8.4 编译验证
npm run dev→ 无编译错误
K8 提交点:
PhaseK8_volpro — 字典+前端操作按钮就绪
Phase K9: 联调验证(预计 3h)⚠️ 最后
前置条件: KMS 服务端可访问,已分配 clientId/clientSecret
K9.1 认证联调
- 网关启动 → KmsAdapter.InitializeAsync 成功获取 Token
- Token 过期自动刷新验证
- 错误 clientSecret → 网关控制台打印初始化失败日志
K9.2 设备同步联调(2.18.4)
/api/gateway/health返回 KMS 适配器在线/api/gateway/devices?adapter=KMS:main返回柜体+锁孔设备树- 管理端 base_device 列表显示 KMS 设备(AdapterCode=KMS:main)
K9.3 告警同步联调(2.18.7)
/api/gateway/alarms/KMS:main返回告警列表- 管理端 iot_alarm 表有记录
K9.4 远程控制联调(2.4.3)
/api/gateway/control/KMS:main→ 远程开门 → KMS 端锁孔门开
K9.5 记录查询联调(2.18.6)
/api/gateway/logs/KMS:main?logType=borrow返回借还记录
K9.6 员工同步联调(2.18.3)
/api/gateway/sync/KMS:main→ 批量同步员工成功
K9.7 异常场景
- KMS 服务离线 →
/api/gateway/health中 KMS 返回 unhealthy - KMS 恢复 → 下次心跳自动变 healthy
- 并发请求超过 5 QPS → 限流生效不崩溃
K9.8 验收
- 网关 + Vol.Pro + KMS 三端数据一致
- 管理端可查看 KMS 设备树、告警
- 前端可远程开门
K9 提交点:
PhaseK9_integration — 全链路联调通过
任务总览
| Phase | 内容 | 文件数 | 预计 |
|---|---|---|---|
| K0 | 项目骨架 | 2 | 15min |
| K1 | KmsModels 全部 DTO | 1 | 1h |
| K2 | KmsAuthHelper | 1 | 30min |
| K3 | KmsAdapter 核心方法 | 1 | 1.5h |
| K4 | KmsAdapter 扩展方法 | 1 | 1h |
| K5 | 配置与注册 | 3 | 15min |
| K6 | 编译自测 | — | 15min |
| K7 | 网关 Core + Host 扩展 | 6 | 1.5h |
| K8 | Vol.Pro 管理端配套 | 2 | 1h |
| K9 | 联调验证 | — | 3h |
| 合计 | — | 17 | ~10h |
版本: 1.0 / 2025-05-19 / 严格按照
KMS钥匙柜适配器详细设计文档.mdv2.1 制订