|
|
|
@ -2,6 +2,75 @@ |
|
|
|
|
|
|
|
## 2024年修改记录 |
|
|
|
|
|
|
|
### 修复CreateTerminalDeviceCommandHandler中的空引用警告和并发问题 |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
`X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommandHandler.cs` |
|
|
|
|
|
|
|
#### 修改内容: |
|
|
|
|
|
|
|
1. **问题描述**: |
|
|
|
- 在第95行出现可能的空引用警告 |
|
|
|
- `deviceInfoResult.ErrorMessages` 可能为 null,但 `CreateFailure(List<string> errorMessages)` 方法期望非空参数 |
|
|
|
- 设备编码生成逻辑存在并发问题:多个请求可能生成相同的设备编码 |
|
|
|
|
|
|
|
2. **解决方案**: |
|
|
|
- 使用空合并操作符 `??` 提供默认值 |
|
|
|
- 使用空断言操作符 `!` 处理已知非空的Data属性 |
|
|
|
- 重构设备编码生成逻辑,添加重试机制和并发处理 |
|
|
|
- 将原来的 `GenerateDeviceCodeAsync` 和编码检查逻辑合并为 `GenerateUniqueDeviceCodeAsync` |
|
|
|
|
|
|
|
3. **修改代码**: |
|
|
|
```csharp |
|
|
|
// 修改前 - 空引用问题 |
|
|
|
return OperationResult<CreateTerminalDeviceResponse>.CreateFailure(deviceInfoResult.ErrorMessages); |
|
|
|
|
|
|
|
// 修改后 - 空引用问题 |
|
|
|
return OperationResult<CreateTerminalDeviceResponse>.CreateFailure(deviceInfoResult.ErrorMessages ?? new List<string> { "获取设备信息失败" }); |
|
|
|
|
|
|
|
// 修改前 - Data空引用问题 |
|
|
|
var serialNumber = deviceInfoResult.Data.SerialNumber; |
|
|
|
var deviceType = deviceInfoResult.Data.DeviceType; |
|
|
|
|
|
|
|
// 修改后 - Data空引用问题 |
|
|
|
var serialNumber = deviceInfoResult.Data!.SerialNumber; |
|
|
|
var deviceType = deviceInfoResult.Data!.DeviceType; |
|
|
|
|
|
|
|
// 修改前 - 并发问题 |
|
|
|
var deviceCode = await GenerateDeviceCodeAsync(serialNumber, cancellationToken); |
|
|
|
if (await _deviceRepository.DeviceCodeExistsAsync(deviceCode, cancellationToken)) |
|
|
|
{ |
|
|
|
return OperationResult<CreateTerminalDeviceResponse>.CreateFailure($"终端设备编码 {deviceCode} 已存在"); |
|
|
|
} |
|
|
|
|
|
|
|
// 修改后 - 并发问题 |
|
|
|
var deviceCode = await GenerateUniqueDeviceCodeAsync(cancellationToken); |
|
|
|
``` |
|
|
|
|
|
|
|
4. **新的GenerateUniqueDeviceCodeAsync方法特性**: |
|
|
|
- 使用短UUID(8位)生成简洁的设备编码 |
|
|
|
- 格式:`TERM-{8位短UUID}`,如 `TERM-a1b2c3d4` |
|
|
|
- 极低的冲突概率,理论上几乎不可能重复 |
|
|
|
- 如果发生冲突,自动添加时间戳后缀(6位数字) |
|
|
|
- 简洁高效的实现,无需复杂的重试逻辑 |
|
|
|
- 无需序列号参数,使用纯UUID生成方式 |
|
|
|
- 完整的日志记录,便于调试和监控 |
|
|
|
|
|
|
|
5. **技术细节**: |
|
|
|
- 使用 `??` 空合并操作符处理可能的 null 值 |
|
|
|
- 提供有意义的默认错误消息 |
|
|
|
- 使用 `Guid.NewGuid().ToString("N").Substring(0, 8)` 生成8位短UUID |
|
|
|
- 使用 `DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() % 1000000` 生成6位时间戳后缀 |
|
|
|
- 保持代码的简洁性和高效性 |
|
|
|
|
|
|
|
#### 修改时间: |
|
|
|
2024年 |
|
|
|
|
|
|
|
#### 修改原因: |
|
|
|
解决编译警告,确保代码的健壮性,避免运行时出现空引用异常。同时解决高并发场景下设备编码重复的问题,提高系统的可靠性和稳定性。 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
### ADB操作和AT操作控制器实现 |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
@ -1154,4 +1223,560 @@ |
|
|
|
- ✅ 控制器已完善,参考ProtocolVersionsController模式 |
|
|
|
- ✅ 统一的错误处理和日志记录 |
|
|
|
- ✅ 符合DDD和CQRS架构模式 |
|
|
|
- ✅ 支持完整的CRUD操作 |
|
|
|
- ✅ 支持完整的CRUD操作 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
## 2025-01-13 TerminalDevice 添加设备类型枚举 |
|
|
|
|
|
|
|
### 修改文件 |
|
|
|
1. `X1.Domain/Entities/Terminal/TerminalDeviceType.cs` - 新增设备类型枚举 |
|
|
|
2. `X1.Domain/Entities/Terminal/TerminalDevice.cs` - 添加设备类型属性 |
|
|
|
3. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDevices/GetTerminalDevicesResponse.cs` - 更新DTO |
|
|
|
4. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDevices/GetTerminalDevicesQueryHandler.cs` - 更新映射 |
|
|
|
5. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDeviceById/GetTerminalDeviceByIdResponse.cs` - 更新响应 |
|
|
|
6. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDeviceById/GetTerminalDeviceByIdQueryHandler.cs` - 更新映射 |
|
|
|
7. `X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommand.cs` - 添加设备类型参数 |
|
|
|
8. `X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceResponse.cs` - 更新响应 |
|
|
|
9. `X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommandHandler.cs` - 更新处理逻辑 |
|
|
|
10. `X1.Application/Features/TerminalDevices/Commands/UpdateTerminalDevice/UpdateTerminalDeviceCommand.cs` - 添加设备类型参数 |
|
|
|
11. `X1.Application/Features/TerminalDevices/Commands/UpdateTerminalDevice/UpdateTerminalDeviceResponse.cs` - 更新响应 |
|
|
|
12. `X1.Application/Features/TerminalDevices/Commands/UpdateTerminalDevice/UpdateTerminalDeviceCommandHandler.cs` - 更新处理逻辑 |
|
|
|
13. `X1.Infrastructure/Context/AppDbContext.cs` - 添加TerminalDevice DbSet |
|
|
|
14. `X1.Infrastructure/Configurations/Terminal/TerminalDeviceConfiguration.cs` - 新增数据库配置 |
|
|
|
|
|
|
|
### 修改内容 |
|
|
|
|
|
|
|
1. **设备类型枚举创建**: |
|
|
|
- 创建了 `TerminalDeviceType` 枚举 |
|
|
|
- 包含 `Windows = 1` 和 `Linux = 2` 两个选项 |
|
|
|
- 用于区分终端设备的操作系统类型 |
|
|
|
|
|
|
|
2. **TerminalDevice实体更新**: |
|
|
|
- 添加了 `DeviceType` 属性,类型为 `TerminalDeviceType` |
|
|
|
- 默认值为 `TerminalDeviceType.Windows` |
|
|
|
- 更新了 `Create` 和 `Update` 方法,添加设备类型参数 |
|
|
|
- 在数据库中以整数形式存储枚举值 |
|
|
|
|
|
|
|
3. **Application层更新**: |
|
|
|
- **DTO和响应类**:所有相关的DTO和响应类都添加了 `DeviceType` 字段 |
|
|
|
- **查询处理器**:更新了映射逻辑,将枚举值转换为字符串 |
|
|
|
- **命令类**:添加了设备类型参数,默认值为 "Windows" |
|
|
|
- **命令处理器**:添加了枚举解析逻辑和验证 |
|
|
|
|
|
|
|
4. **数据库配置**: |
|
|
|
- 在 `AppDbContext` 中添加了 `TerminalDevices` DbSet |
|
|
|
- 创建了 `TerminalDeviceConfiguration` 配置类 |
|
|
|
- 配置了设备类型字段的数据库映射(使用整数存储) |
|
|
|
- 添加了相关的索引和约束 |
|
|
|
|
|
|
|
5. **技术特性**: |
|
|
|
- 使用枚举确保类型安全 |
|
|
|
- 在数据库中存储为整数,提高性能 |
|
|
|
- 在API中返回字符串,便于前端使用 |
|
|
|
- 完整的验证和错误处理 |
|
|
|
- 向后兼容,现有数据默认为Windows类型 |
|
|
|
|
|
|
|
6. **设计原则**: |
|
|
|
- 遵循DDD原则,使用枚举表示领域概念 |
|
|
|
- 保持与现有架构的一致性 |
|
|
|
- 提供完整的CRUD操作支持 |
|
|
|
- 确保数据完整性和类型安全 |
|
|
|
|
|
|
|
### 完成状态 |
|
|
|
- ✅ 设备类型枚举创建完成 |
|
|
|
- ✅ TerminalDevice实体更新完成 |
|
|
|
- ✅ Application层所有相关文件更新完成 |
|
|
|
- ✅ 数据库配置完成 |
|
|
|
- ✅ 类型安全和验证逻辑完整 |
|
|
|
- ✅ 向后兼容性确保完成 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
## 2025-01-13 TerminalDevice 数据库表命名规范修正 |
|
|
|
|
|
|
|
### 修改文件 |
|
|
|
`X1.Infrastructure/Configurations/Terminal/TerminalDeviceConfiguration.cs` |
|
|
|
|
|
|
|
### 修改内容 |
|
|
|
|
|
|
|
1. **问题描述**: |
|
|
|
- 原表名 `"TerminalDevices"` 不符合项目的命名规范 |
|
|
|
- 项目要求使用 `tb_` 前缀并且都是小写 |
|
|
|
|
|
|
|
2. **修正方案**: |
|
|
|
- 将表名从 `"TerminalDevices"` 修改为 `"tb_terminal_devices"` |
|
|
|
- 符合项目的命名规范:`tb_` 前缀 + 全小写 + 下划线分隔 |
|
|
|
|
|
|
|
3. **具体修改**: |
|
|
|
```csharp |
|
|
|
// 修改前 |
|
|
|
builder.ToTable("TerminalDevices"); |
|
|
|
|
|
|
|
// 修改后 |
|
|
|
builder.ToTable("tb_terminal_devices"); |
|
|
|
``` |
|
|
|
|
|
|
|
4. **命名规范说明**: |
|
|
|
- `tb_`:表名前缀,表示这是一个数据库表 |
|
|
|
- `terminal_devices`:实体名称的小写形式,使用下划线分隔单词 |
|
|
|
- 符合项目的统一命名约定 |
|
|
|
|
|
|
|
### 完成状态 |
|
|
|
- ✅ 表名修正完成 |
|
|
|
- ✅ 符合项目命名规范 |
|
|
|
- ✅ 与现有数据库表命名保持一致 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
## 2025-01-13 TerminalDevice 命令字段限制修改 |
|
|
|
|
|
|
|
### 修改文件 |
|
|
|
1. `X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommand.cs` |
|
|
|
2. `X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommandHandler.cs` |
|
|
|
3. `X1.Application/Features/TerminalDevices/Commands/UpdateTerminalDevice/UpdateTerminalDeviceCommand.cs` |
|
|
|
4. `X1.Application/Features/TerminalDevices/Commands/UpdateTerminalDevice/UpdateTerminalDeviceCommandHandler.cs` |
|
|
|
5. `X1.Domain/Entities/Terminal/TerminalDevice.cs` |
|
|
|
|
|
|
|
### 修改内容 |
|
|
|
|
|
|
|
1. **CreateTerminalDeviceCommand 修改**: |
|
|
|
- **移除字段**:删除了 `DeviceType` 字段,不再由用户填写 |
|
|
|
- **自动检测**:设备类型由系统根据设备连接信息自动检测 |
|
|
|
- **业务逻辑**:系统会尝试获取设备系统信息来判断是Windows还是Linux |
|
|
|
|
|
|
|
2. **CreateTerminalDeviceCommandHandler 修改**: |
|
|
|
- **自动检测逻辑**:添加了 `DetectDeviceTypeAsync` 方法 |
|
|
|
- **系统信息检测**:通过 `GetDeviceSystemInfoAsync` 获取设备系统信息 |
|
|
|
- **智能判断**:根据系统信息中的关键词判断设备类型 |
|
|
|
- **默认处理**:如果无法检测,默认使用Windows类型 |
|
|
|
- **错误处理**:完整的异常处理和日志记录 |
|
|
|
|
|
|
|
3. **UpdateTerminalDeviceCommand 修改**: |
|
|
|
- **字段限制**:只保留 `DeviceId`、`Description` 和 `IsEnabled` 字段 |
|
|
|
- **移除字段**:删除了 `DeviceName`、`IpAddress`、`AgentPort`、`DeviceType` 字段 |
|
|
|
- **业务逻辑**:只允许修改设备描述和启用状态,保护核心配置信息 |
|
|
|
|
|
|
|
4. **UpdateTerminalDeviceCommandHandler 修改**: |
|
|
|
- **更新逻辑**:只更新允许修改的字段(描述和启用状态) |
|
|
|
- **验证简化**:移除了对已删除字段的验证 |
|
|
|
- **方法调用**:使用专门的 `UpdateDescription` 和 `Enable/Disable` 方法 |
|
|
|
- **审计信息**:正确更新审计信息 |
|
|
|
|
|
|
|
5. **TerminalDevice 实体修改**: |
|
|
|
- **新增方法**:添加了 `UpdateDescription` 方法用于更新描述 |
|
|
|
- **新增方法**:添加了 `UpdateAuditInfo` 方法用于更新审计信息 |
|
|
|
- **封装性**:保持实体的封装性,通过方法修改状态 |
|
|
|
|
|
|
|
6. **技术特性**: |
|
|
|
- **自动检测**:设备类型自动检测,无需用户干预 |
|
|
|
- **字段保护**:核心配置字段不允许修改,确保数据安全 |
|
|
|
- **业务逻辑**:符合实际业务需求,只允许修改非关键信息 |
|
|
|
- **错误处理**:完整的异常处理和日志记录 |
|
|
|
|
|
|
|
### 完成状态 |
|
|
|
- ✅ CreateTerminalDeviceCommand 设备类型字段移除完成 |
|
|
|
- ✅ 自动设备类型检测逻辑实现完成 |
|
|
|
- ✅ UpdateTerminalDeviceCommand 字段限制完成 |
|
|
|
- ✅ 命令处理器逻辑更新完成 |
|
|
|
- ✅ TerminalDevice 实体方法扩展完成 |
|
|
|
- ✅ 业务逻辑安全性确保完成 |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
## 2025-01-13 TerminalDevice DTO 序列号字段移除 |
|
|
|
|
|
|
|
### 修改文件 |
|
|
|
1. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDevices/GetTerminalDevicesResponse.cs` |
|
|
|
2. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDevices/GetTerminalDevicesQueryHandler.cs` |
|
|
|
3. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDeviceById/GetTerminalDeviceByIdResponse.cs` |
|
|
|
4. `X1.Application/Features/TerminalDevices/Queries/GetTerminalDeviceById/GetTerminalDeviceByIdQueryHandler.cs` |
|
|
|
|
|
|
|
### 修改内容 |
|
|
|
|
|
|
|
1. **GetTerminalDevicesResponse.cs 修改**: |
|
|
|
- **移除字段**:从 `TerminalDeviceDto` 中删除了 `SerialNumber` 字段 |
|
|
|
- **安全考虑**:序列号是敏感信息,不应该在列表中显示 |
|
|
|
- **数据保护**:保护设备序列号信息不被泄露 |
|
|
|
|
|
|
|
2. **GetTerminalDevicesQueryHandler.cs 修改**: |
|
|
|
- **映射移除**:移除了对 `SerialNumber` 字段的映射 |
|
|
|
- **数据过滤**:确保列表查询不返回序列号信息 |
|
|
|
- **性能优化**:减少不必要的数据传输 |
|
|
|
|
|
|
|
3. **GetTerminalDeviceByIdResponse.cs 修改**: |
|
|
|
- **移除字段**:从详情响应中删除了 `SerialNumber` 字段 |
|
|
|
- **一致性**:与列表查询保持一致,都不显示序列号 |
|
|
|
- **安全策略**:统一的安全策略,保护敏感信息 |
|
|
|
|
|
|
|
4. **GetTerminalDeviceByIdQueryHandler.cs 修改**: |
|
|
|
- **映射移除**:移除了对 `SerialNumber` 字段的映射 |
|
|
|
- **详情保护**:即使是在详情查询中也不显示序列号 |
|
|
|
- **数据安全**:确保序列号信息不被任何API端点泄露 |
|
|
|
|
|
|
|
5. **安全特性**: |
|
|
|
- **信息保护**:序列号作为设备唯一标识,属于敏感信息 |
|
|
|
- **访问控制**:通过API层面控制敏感信息的访问 |
|
|
|
- **数据最小化**:只返回必要的设备信息 |
|
|
|
- **隐私保护**:符合数据隐私保护原则 |
|
|
|
|
|
|
|
### 完成状态 |
|
|
|
- ✅ GetTerminalDevicesResponse 序列号字段移除完成 |
|
|
|
- ✅ GetTerminalDevicesQueryHandler 映射移除完成 |
|
|
|
- ✅ GetTerminalDeviceByIdResponse 序列号字段移除完成 |
|
|
|
- ✅ GetTerminalDeviceByIdQueryHandler 映射移除完成 |
|
|
|
- ✅ 数据安全保护策略实施完成 |
|
|
|
|
|
|
|
### TestTerminalRequestClient GetDeviceSerialNumberAsync 方法完善 |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
1. `X1.Domain/ThirdPartyDeviceHttpClient/Models/MachineCodeResponse.cs` - 新增机器码响应模型 |
|
|
|
2. `X1.DynamicClientCore/Service/TestTerminalRequestClient.cs` - 完善GetDeviceSerialNumberAsync方法 |
|
|
|
|
|
|
|
#### 修改内容: |
|
|
|
|
|
|
|
1. **功能描述**: |
|
|
|
- 完善了 `TestTerminalRequestClient` 的 `GetDeviceSerialNumberAsync` 方法 |
|
|
|
- 实现了调用机器码API获取设备序列号的功能 |
|
|
|
- 创建了对应的响应模型来匹配API返回的数据结构 |
|
|
|
|
|
|
|
2. **新增响应模型**: |
|
|
|
- **MachineCodeResponse**:机器码响应模型 |
|
|
|
- `Success`:是否成功 |
|
|
|
- `Message`:响应消息 |
|
|
|
- `Data`:响应数据 |
|
|
|
- **MachineCodeData**:机器码数据 |
|
|
|
- `MachineCode`:机器码(设备序列号) |
|
|
|
- `SystemType`:系统类型 |
|
|
|
|
|
|
|
3. **API调用实现**: |
|
|
|
- **端点**:`/api/v1/system/machine-code` |
|
|
|
- **服务名称**:`test-terminal` |
|
|
|
- **HTTP方法**:GET |
|
|
|
- **响应处理**:完整的成功/失败状态检查 |
|
|
|
|
|
|
|
4. **技术特性**: |
|
|
|
- **异步操作**:使用 `async/await` 模式 |
|
|
|
- **错误处理**:完整的异常捕获和日志记录 |
|
|
|
- **参数验证**:检查响应数据的有效性 |
|
|
|
- **日志记录**:详细的操作日志,包括开始、成功、失败信息 |
|
|
|
- **资源清理**:确保异常情况下的资源正确释放 |
|
|
|
|
|
|
|
5. **业务逻辑**: |
|
|
|
- 调用机器码API获取设备序列号 |
|
|
|
- 验证API响应的成功状态 |
|
|
|
- 提取机器码作为设备序列号返回 |
|
|
|
- 记录系统类型信息用于调试 |
|
|
|
- 失败时返回空字符串 |
|
|
|
|
|
|
|
6. **响应格式匹配**: |
|
|
|
```json |
|
|
|
{ |
|
|
|
"success": true, |
|
|
|
"message": "机器码获取成功", |
|
|
|
"data": { |
|
|
|
"machine_code": "03000200-0400-0500-0006-000700080009", |
|
|
|
"system_type": "windows" |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
7. **设计原则**: |
|
|
|
- 遵循现有架构模式 |
|
|
|
- 完整的错误处理和日志记录 |
|
|
|
- 使用依赖注入管理依赖关系 |
|
|
|
- 支持取消令牌和异步操作 |
|
|
|
- 统一的响应格式处理 |
|
|
|
|
|
|
|
#### 修改时间: |
|
|
|
2025年1月13日 |
|
|
|
|
|
|
|
#### 修改原因: |
|
|
|
需要完善 `TestTerminalRequestClient` 的 `GetDeviceSerialNumberAsync` 方法,实现从指定API端点获取设备机器码的功能,为终端设备管理提供真实的设备序列号获取能力。 |
|
|
|
|
|
|
|
### MachineCodeResponse 重构为 TestTerminalResponse |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
1. `X1.Domain/ThirdPartyDeviceHttpClient/Models/MachineCodeResponse.cs` - 重构响应模型 |
|
|
|
2. `X1.DynamicClientCore/Service/TestTerminalRequestClient.cs` - 更新使用新的响应模型 |
|
|
|
|
|
|
|
#### 修改内容: |
|
|
|
|
|
|
|
1. **功能描述**: |
|
|
|
- 将 `MachineCodeResponse` 重构为更通用的 `TestTerminalResponse` |
|
|
|
- 使测试终端相关的所有API都可以使用这个响应实体 |
|
|
|
- 直接删除向后兼容的 `MachineCodeResponse` 类,简化代码结构 |
|
|
|
|
|
|
|
2. **响应模型重构**: |
|
|
|
- **TestTerminalResponse<T>**:泛型版本,支持任意数据类型 |
|
|
|
- `Success`:是否成功 |
|
|
|
- `Message`:响应消息 |
|
|
|
- `Data`:泛型响应数据 |
|
|
|
- **TestTerminalResponse**:非泛型版本,默认使用 `MachineCodeData` |
|
|
|
- **MachineCodeResponse**:已删除,不再提供向后兼容 |
|
|
|
|
|
|
|
3. **数据模型**: |
|
|
|
- **MachineCodeData**:机器码数据模型 |
|
|
|
- `MachineCode`:机器码(设备序列号) |
|
|
|
- `SystemType`:系统类型 |
|
|
|
|
|
|
|
4. **技术特性**: |
|
|
|
- **泛型设计**:支持任意数据类型的响应 |
|
|
|
- **简化结构**:删除不必要的向后兼容类 |
|
|
|
- **类型安全**:使用泛型确保编译时类型检查 |
|
|
|
- **可扩展性**:未来可以轻松添加新的数据类型 |
|
|
|
|
|
|
|
5. **使用示例**: |
|
|
|
```csharp |
|
|
|
// 使用泛型版本(推荐) |
|
|
|
var response = await _dynamicHttpClient.GetAsync<TestTerminalResponse<MachineCodeData>>( |
|
|
|
serviceName, endpoint, options, cancellationToken); |
|
|
|
|
|
|
|
// 使用非泛型版本(简化) |
|
|
|
var response = await _dynamicHttpClient.GetAsync<TestTerminalResponse>( |
|
|
|
serviceName, endpoint, options, cancellationToken); |
|
|
|
``` |
|
|
|
|
|
|
|
6. **设计原则**: |
|
|
|
- **单一职责**:专注于测试终端响应格式 |
|
|
|
- **开闭原则**:对扩展开放,对修改封闭 |
|
|
|
- **简洁性**:删除不必要的向后兼容代码 |
|
|
|
- **类型安全**:编译时类型检查 |
|
|
|
|
|
|
|
7. **未来扩展**: |
|
|
|
- 可以轻松添加新的数据类型,如设备状态、网络配置等 |
|
|
|
- 所有测试终端API都可以使用统一的响应格式 |
|
|
|
- 支持不同的业务场景和数据需求 |
|
|
|
|
|
|
|
#### 修改时间: |
|
|
|
2025年1月13日 |
|
|
|
|
|
|
|
#### 修改原因: |
|
|
|
需要将机器码响应模型重构为更通用的测试终端响应模型,使所有测试终端相关的API都可以使用统一的响应格式,提高代码的可复用性和类型安全性。删除不必要的向后兼容代码,简化代码结构。 |
|
|
|
|
|
|
|
### TestTerminalRequestClient 添加 GetMachineCodeDataAsync 方法 |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
`X1.DynamicClientCore/Service/TestTerminalRequestClient.cs` - 添加获取完整机器码数据的方法 |
|
|
|
|
|
|
|
#### 修改内容: |
|
|
|
|
|
|
|
1. **功能描述**: |
|
|
|
- 添加了 `GetMachineCodeDataAsync` 方法,返回完整的 `MachineCodeData` 对象 |
|
|
|
- 重构了 `GetDeviceSerialNumberAsync` 方法,使其调用新的方法 |
|
|
|
- 保持接口兼容性的同时,提供更丰富的数据返回 |
|
|
|
|
|
|
|
2. **新增方法**: |
|
|
|
- **GetMachineCodeDataAsync**:获取完整的机器码数据 |
|
|
|
- 返回类型:`Task<MachineCodeData?>` |
|
|
|
- 包含机器码和系统类型信息 |
|
|
|
- 完整的错误处理和日志记录 |
|
|
|
|
|
|
|
3. **方法重构**: |
|
|
|
- **GetDeviceSerialNumberAsync**:重构为调用 `GetMachineCodeDataAsync` |
|
|
|
- 保持原有接口兼容性 |
|
|
|
- 只返回机器码字符串 |
|
|
|
- 简化了实现逻辑 |
|
|
|
|
|
|
|
4. **技术特性**: |
|
|
|
- **代码复用**:避免重复的API调用逻辑 |
|
|
|
- **类型安全**:返回强类型的 `MachineCodeData` 对象 |
|
|
|
- **错误处理**:统一的异常处理和日志记录 |
|
|
|
- **向后兼容**:保持原有接口不变 |
|
|
|
|
|
|
|
5. **使用示例**: |
|
|
|
```csharp |
|
|
|
// 获取完整机器码数据(推荐) |
|
|
|
var machineCodeData = await client.GetMachineCodeDataAsync(instrumentNumber); |
|
|
|
if (machineCodeData != null) |
|
|
|
{ |
|
|
|
var machineCode = machineCodeData.MachineCode; |
|
|
|
var systemType = machineCodeData.SystemType; |
|
|
|
} |
|
|
|
|
|
|
|
// 获取机器码字符串(兼容原有接口) |
|
|
|
var serialNumber = await client.GetDeviceSerialNumberAsync(instrumentNumber); |
|
|
|
``` |
|
|
|
|
|
|
|
6. **设计原则**: |
|
|
|
- **单一职责**:每个方法专注于特定功能 |
|
|
|
- **代码复用**:避免重复的API调用逻辑 |
|
|
|
- **向后兼容**:保持原有接口不变 |
|
|
|
- **类型安全**:提供强类型的数据返回 |
|
|
|
|
|
|
|
7. **业务价值**: |
|
|
|
- 提供更丰富的设备信息(机器码 + 系统类型) |
|
|
|
- 支持更复杂的业务逻辑处理 |
|
|
|
- 保持与现有代码的兼容性 |
|
|
|
- 提高代码的可维护性 |
|
|
|
|
|
|
|
#### 修改时间: |
|
|
|
2025年1月13日 |
|
|
|
|
|
|
|
#### 修改原因: |
|
|
|
需要提供获取完整机器码数据的功能,包括机器码和系统类型信息,同时保持与现有接口的兼容性,为测试终端管理提供更丰富的数据支持。 |
|
|
|
|
|
|
|
### TestTerminalRequestClient 最终优化 |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
1. `X1.Domain/ThirdPartyDeviceHttpClient/ITerminal/IBaseTerminalClient.cs` - 更新接口定义 |
|
|
|
2. `X1.DynamicClientCore/Service/TestTerminalRequestClient.cs` - 优化实现和注释 |
|
|
|
|
|
|
|
#### 修改内容: |
|
|
|
|
|
|
|
1. **接口定义优化**: |
|
|
|
- 将 `GetDeviceSerialNumberAsync` 方法返回类型从 `Task<string>` 改为 `Task<MachineCodeData?>` |
|
|
|
- 参数名从 `instrumentNumber` 改为 `terminalId` |
|
|
|
- 更新方法注释,明确返回测试终端机器码数据 |
|
|
|
|
|
|
|
2. **实现优化**: |
|
|
|
- 移除重复的 `GetMachineCodeDataAsync` 方法 |
|
|
|
- 直接使用 `GetDeviceSerialNumberAsync` 返回 `MachineCodeData` 对象 |
|
|
|
- 使用 `terminalId` 作为服务名称,而不是硬编码的 "test-terminal" |
|
|
|
- 添加完整的XML注释,包含参数说明、返回值说明、异常说明和备注 |
|
|
|
|
|
|
|
3. **技术特性**: |
|
|
|
- **简化设计**:移除重复方法,统一使用一个方法 |
|
|
|
- **正确命名**:使用 `terminalId` 作为服务名称 |
|
|
|
- **完整注释**:提供详细的XML文档注释 |
|
|
|
- **类型安全**:返回强类型的 `MachineCodeData` 对象 |
|
|
|
|
|
|
|
4. **XML注释内容**: |
|
|
|
- 参数说明:明确 `terminalId` 用作服务名称 |
|
|
|
- 返回值说明:详细描述返回的数据结构 |
|
|
|
- 异常说明:列出可能抛出的异常类型 |
|
|
|
- 备注说明:解释方法的工作原理和API调用细节 |
|
|
|
|
|
|
|
5. **使用示例**: |
|
|
|
```csharp |
|
|
|
// 获取测试终端机器码数据 |
|
|
|
var machineCodeData = await client.GetDeviceSerialNumberAsync("terminal-001"); |
|
|
|
if (machineCodeData != null) |
|
|
|
{ |
|
|
|
var machineCode = machineCodeData.MachineCode; |
|
|
|
var systemType = machineCodeData.SystemType; |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
6. **设计原则**: |
|
|
|
- **单一职责**:一个方法专注于获取机器码数据 |
|
|
|
- **正确命名**:参数名和方法名符合业务语义 |
|
|
|
- **完整文档**:提供详细的XML注释 |
|
|
|
- **类型安全**:使用强类型返回数据 |
|
|
|
|
|
|
|
#### 修改时间: |
|
|
|
2025年1月13日 |
|
|
|
|
|
|
|
#### 修改原因: |
|
|
|
优化TestTerminalRequestClient的设计,简化方法结构,修正命名规范,使用正确的服务名称,并提供完整的XML文档注释,提高代码的可读性和可维护性。 |
|
|
|
|
|
|
|
### CreateTerminalDeviceCommandHandler 设备类型检测优化 |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
`X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommandHandler.cs` - 优化设备类型检测逻辑 |
|
|
|
|
|
|
|
#### 修改内容: |
|
|
|
|
|
|
|
1. **依赖注入修复**: |
|
|
|
- 将 `IBaseInstrumentClient` 替换为 `IBaseTerminalClient` |
|
|
|
- 更新字段名从 `_instrumentClient` 到 `_terminalClient` |
|
|
|
- 添加正确的using语句引用 |
|
|
|
|
|
|
|
2. **设备类型检测优化**: |
|
|
|
- 实现真实的设备类型检测逻辑 |
|
|
|
- 通过调用 `GetDeviceSerialNumberAsync` 获取系统类型信息 |
|
|
|
- 根据系统类型字符串智能判断设备类型 |
|
|
|
- 支持Linux和Windows系统的识别 |
|
|
|
|
|
|
|
3. **系统类型识别逻辑**: |
|
|
|
- **Linux系统识别**:linux、ubuntu、centos、debian、fedora、redhat、suse、unix |
|
|
|
- **Windows系统识别**:windows、win、nt |
|
|
|
- **默认处理**:未知系统类型默认使用Windows |
|
|
|
|
|
|
|
4. **技术特性**: |
|
|
|
- **真实检测**:基于API返回的系统类型信息进行检测 |
|
|
|
- **智能识别**:支持多种Linux发行版和Windows版本 |
|
|
|
- **错误处理**:检测失败时使用默认类型 |
|
|
|
- **资源管理**:自动清理临时服务端点 |
|
|
|
|
|
|
|
5. **方法调用修复**: |
|
|
|
- 更新 `GetDeviceSerialNumberAsync` 方法调用 |
|
|
|
- 处理返回的 `MachineCodeData` 对象 |
|
|
|
- 提取 `MachineCode` 和 `SystemType` 信息 |
|
|
|
- 完整的null检查和异常处理 |
|
|
|
|
|
|
|
6. **日志记录优化**: |
|
|
|
- 记录设备类型检测过程 |
|
|
|
- 记录系统类型和检测结果 |
|
|
|
- 记录检测失败的原因 |
|
|
|
- 详细的调试信息 |
|
|
|
|
|
|
|
7. **使用示例**: |
|
|
|
```csharp |
|
|
|
// 设备类型检测流程 |
|
|
|
var deviceType = await DetectDeviceTypeByPortsAsync(request, serviceEndpoint, cancellationToken); |
|
|
|
// 根据API返回的系统类型自动判断是Windows还是Linux |
|
|
|
``` |
|
|
|
|
|
|
|
#### 修改时间: |
|
|
|
2025年1月13日 |
|
|
|
|
|
|
|
#### 修改原因: |
|
|
|
需要实现真实的设备类型检测功能,通过API获取的系统类型信息智能判断设备是Windows还是Linux系统,提高设备管理的准确性和自动化程度。 |
|
|
|
|
|
|
|
### CreateTerminalDeviceCommandHandler API调用优化 |
|
|
|
|
|
|
|
#### 修改文件: |
|
|
|
`X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommandHandler.cs` - 优化API调用逻辑 |
|
|
|
|
|
|
|
#### 修改内容: |
|
|
|
|
|
|
|
1. **API调用优化**: |
|
|
|
- 合并序列号获取和设备类型检测为一次API调用 |
|
|
|
- 移除重复的 `DetectDeviceTypeByPortsAsync` 方法 |
|
|
|
- 创建 `DeviceInfo` 数据传输对象,包含序列号和设备类型 |
|
|
|
|
|
|
|
2. **新增DeviceInfo类**: |
|
|
|
- `SerialNumber`:设备序列号 |
|
|
|
- `DeviceType`:设备类型(Windows/Linux) |
|
|
|
- 用于封装API返回的完整设备信息 |
|
|
|
|
|
|
|
3. **方法重构**: |
|
|
|
- `GetDeviceSerialNumberAsync` → `GetDeviceInfoAsync` |
|
|
|
- 在一次API调用中同时获取序列号和系统类型 |
|
|
|
- 根据系统类型自动判断设备类型 |
|
|
|
- 返回包含完整信息的 `DeviceInfo` 对象 |
|
|
|
|
|
|
|
4. **技术特性**: |
|
|
|
- **性能优化**:减少API调用次数,从2次减少到1次 |
|
|
|
- **数据完整性**:确保序列号和系统类型信息的一致性 |
|
|
|
- **错误处理**:统一的错误处理和资源清理 |
|
|
|
- **类型安全**:使用强类型的 `DeviceInfo` 对象 |
|
|
|
|
|
|
|
5. **工作流程优化**: |
|
|
|
``` |
|
|
|
原流程:获取序列号 → 检测设备类型(重复API调用) |
|
|
|
新流程:获取设备信息(一次API调用,包含序列号和系统类型) |
|
|
|
``` |
|
|
|
|
|
|
|
6. **代码简化**: |
|
|
|
- 移除重复的API调用逻辑 |
|
|
|
- 简化主处理流程 |
|
|
|
- 统一的资源管理和错误处理 |
|
|
|
|
|
|
|
7. **使用示例**: |
|
|
|
```csharp |
|
|
|
// 一次API调用获取完整设备信息 |
|
|
|
var deviceInfoResult = await GetDeviceInfoAsync(request, serviceEndpoint, cancellationToken); |
|
|
|
if (deviceInfoResult.IsSuccess) |
|
|
|
{ |
|
|
|
var serialNumber = deviceInfoResult.Data.SerialNumber; |
|
|
|
var deviceType = deviceInfoResult.Data.DeviceType; |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
#### 修改时间: |
|
|
|
2025年1月13日 |
|
|
|
|
|
|
|
#### 修改原因: |
|
|
|
优化API调用逻辑,避免重复的API请求,提高性能并确保数据一致性。将序列号获取和设备类型检测合并为一次API调用,简化代码结构并提升用户体验。 |