34 KiB
修改记录
2024年修改记录
ADB操作和AT操作控制器实现
修改文件:
X1.Presentation/Controllers/AdbOperationsController.csX1.Presentation/Controllers/AtOperationsController.csX1.Infrastructure/DependencyInjection.cs
修改内容:
-
功能描述:
- 创建了
AdbOperationsController控制器,用于管理ADB操作 - 创建了
AtOperationsController控制器,用于管理AT操作 - 参考
TerminalDevicesController的实现结构和设计模式 - 提供完整的RESTful API接口
- 创建了
-
AdbOperationsController特性:
- 路由:
/api/adb-operations - 支持完整的CRUD操作:GET、POST、PUT、DELETE
- 提供列表查询(支持分页和搜索)
- 提供详情查询、创建、更新、删除功能
- 完整的日志记录和错误处理
- 路由:
-
AtOperationsController特性:
- 路由:
/api/at-operations - 支持完整的CRUD操作:GET、POST、PUT、DELETE
- 提供列表查询(支持分页、搜索和设备ID过滤)
- 提供详情查询、创建、更新、删除功能
- 完整的日志记录和错误处理
- 路由:
-
API端点:
- GET /api/adb-operations:获取ADB操作列表
- GET /api/adb-operations/{id}:获取ADB操作详情
- POST /api/adb-operations:创建ADB操作
- PUT /api/adb-operations/{id}:更新ADB操作
- DELETE /api/adb-operations/{id}:删除ADB操作
- GET /api/at-operations:获取AT操作列表
- GET /api/at-operations/{id}:获取AT操作详情
- POST /api/at-operations:创建AT操作
- PUT /api/at-operations/{id}:更新AT操作
- DELETE /api/at-operations/{id}:删除AT操作
-
技术特性:
- 继承自
ApiController基类 - 使用MediatR进行命令和查询处理
- 支持授权认证([Authorize]特性)
- 统一的响应格式(OperationResult)
- 详细的日志记录和错误处理
- 参数验证和ID匹配检查
- 继承自
-
依赖注入配置:
- 在
X1.Infrastructure/DependencyInjection.cs中添加了终端设备相关仓储的注册 - 注册了
ITerminalDeviceRepository、IAdbOperationRepository、IAtOperationRepository及其实现类 - 添加了相应的 using 语句引用终端设备相关的命名空间
- 确保控制器能够正确注入所需的仓储服务
- 在
-
设计原则:
- 遵循RESTful API设计规范
- 统一的错误处理和响应格式
- 完整的日志记录支持
- 与现有架构保持一致
- 支持异步操作
修改时间:
2024年
修改原因:
为ADB操作和AT操作提供完整的Web API控制器,支持终端设备管理系统的前端界面操作,提供标准的RESTful API接口。
AT操作仓储实现
修改文件:
X1.Infrastructure/Repositories/Terminal/AtOperationRepository.cs
修改内容:
-
功能描述:
- 创建了
AtOperationRepository实现类 - 实现了
IAtOperationRepository接口的所有方法 - 参考
AdbOperationRepository的实现方式 - 提供完整的AT操作数据访问功能
- 创建了
-
实现特性:
- 继承自
BaseRepository<AtOperation> - 使用CQRS模式,分离命令和查询操作
- 支持异步操作和取消令牌
- 提供完整的CRUD操作方法
- 支持搜索、分页、统计等功能
- 继承自
-
主要方法:
AddOperationAsync():添加AT操作UpdateOperation():更新AT操作DeleteOperationAsync():删除AT操作GetAllOperationsAsync():获取所有AT操作GetOperationByIdAsync():根据ID获取AT操作GetOperationsByDeviceIdAsync():根据设备ID获取AT操作SearchOperationsAsync():搜索AT操作(支持关键词搜索)SearchOperationsAsync():搜索AT操作(分页版本)ExistsAsync():检查AT操作是否存在GetOperationCountAsync():获取操作总数GetOperationByCommandAsync():根据命令内容获取操作CommandExistsAsync():检查命令是否已存在GetDeviceOperationStatsAsync():获取设备操作统计
-
搜索功能:
- 支持按命令内容、描述、设备ID、端口进行关键词搜索
- 提供分页搜索功能,支持排序和分页
- 搜索结果按ID降序排列
-
统计功能:
- 提供设备操作统计功能
- 按设备ID分组统计操作数量
- 返回字典格式的统计结果
-
设计原则:
- 遵循仓储模式设计
- 使用依赖注入管理依赖关系
- 提供完整的日志记录支持
- 支持异步操作和取消令牌
- 与现有架构保持一致
修改时间:
2024年
修改原因:
需要实现 IAtOperationRepository 接口,为AT操作提供完整的数据访问功能,支持串口通信的AT命令管理。
终端设备实体创建
修改文件:
X1.Domain/Entities/Device/TerminalDevice.csX1.Domain/Repositories/Device/ITerminalDeviceRepository.csX1.Infrastructure/Repositories/Device/TerminalDeviceRepository.csX1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/X1.Application/Features/TerminalDevices/Commands/UpdateTerminalDevice/X1.Application/Features/TerminalDevices/Commands/DeleteTerminalDevice/X1.Application/Features/TerminalDevices/Queries/GetTerminalDevices/X1.Application/Features/TerminalDevices/Queries/GetTerminalDeviceById/
修改内容:
-
功能描述:
- 创建了新的终端设备实体类
TerminalDevice - 主要用于支持ADB终端设备管理
- 基于
CellularDevice结构但去掉了ProtocolVersions和Runtime属性 - 创建了完整的仓储体系和Features层
- 创建了新的终端设备实体类
-
实体特性:
- 继承自
AuditableEntity,支持审计功能 - 包含设备基本信息:名称、序列号、设备编码、描述
- 包含网络配置:Agent端口、IP地址
- 支持设备状态管理:启用/禁用
- 提供完整的CRUD操作方法
- 继承自
-
主要属性:
Name:设备名称(必填,最大100字符)SerialNumber:设备序列号(必填,最大50字符)DeviceCode:设备编码(必填,最大50字符)Description:设备描述(最大500字符)AgentPort:Agent端口(必填)IpAddress:IP地址(必填,最大45字符)IsEnabled:是否启用(默认true)
-
业务方法:
Create():静态工厂方法,用于创建新的终端设备Update():更新设备信息Enable():启用设备Disable():禁用设备
-
仓储接口:
ITerminalDeviceRepository:终端设备仓储接口- 继承自
IBaseRepository<TerminalDevice> - 提供完整的CRUD操作方法
- 支持搜索、分页、存在性检查等功能
- 去掉了与运行时状态相关的方法
-
仓储实现:
TerminalDeviceRepository:终端设备仓储实现类- 继承自
BaseRepository<TerminalDevice> - 实现所有仓储接口方法
- 支持高性能查询和分页操作
- 提供设备基本信息查询功能
-
Features层:
- 命令(Commands):
CreateTerminalDevice:创建终端设备UpdateTerminalDevice:更新终端设备DeleteTerminalDevice:删除终端设备
- 查询(Queries):
GetTerminalDevices:获取终端设备列表(支持分页和搜索)GetTerminalDeviceById:根据ID获取终端设备详情
- 特性:
- 使用MediatR实现CQRS模式
- 完整的参数验证和错误处理
- 用户认证和权限验证
- 详细的日志记录
- 统一的响应格式
- 正确的泛型类型参数使用(OperationResult)
- 命令(Commands):
-
设计原则:
- 遵循DDD(领域驱动设计)原则
- 使用私有构造函数确保通过工厂方法创建实例
- 属性使用私有setter确保封装性
- 提供完整的业务操作方法
- 采用CQRS模式分离命令和查询操作
- 遵循Clean Architecture架构模式
修改时间:
2024年
修改原因:
需要创建一个专门用于管理ADB终端设备的完整体系,包括实体类、仓储接口和实现类、以及完整的Features层,与蜂窝设备保持相似的结构但去掉不需要的协议版本和运行时状态关联。
协议日志表格右键菜单功能
修改文件:
X1.WebUI/src/components/protocol-logs/ProtocolLogsTable.tsx
修改内容:
-
功能描述:
- 为协议日志表格添加了右键菜单功能
- 支持选择背景颜色和字体颜色
- 提供清空样式功能
-
新增功能:
- 右键菜单触发:在表格行上右键点击可打开菜单
- 背景颜色选择:提供7种浅色背景选项(浅红、浅橙、浅黄、浅绿、浅蓝、浅紫、浅灰)
- 字体颜色选择:提供8种字体颜色选项(黑、红、橙、黄、绿、蓝、紫、灰)
- 清空样式:一键清除当前行的所有自定义样式
-
技术实现:
- 添加了
RowStyle接口定义行样式结构 - 使用
useState管理行样式状态rowStyles - 实现了右键菜单状态管理
contextMenu - 添加了颜色选项配置数组
- 实现了样式设置和清空的相关函数
- 添加了
-
UI设计:
- 使用网格布局展示颜色选择器
- 背景颜色显示为彩色方块
- 字体颜色显示为带字母A的彩色方块
- 添加了悬停效果和过渡动画
- 使用图标区分不同功能区域
-
交互体验:
- 右键菜单在鼠标位置显示
- 点击外部自动关闭菜单
- 颜色选择器支持悬停预览
- 样式变更即时生效
-
代码结构:
// 行样式接口 interface RowStyle { backgroundColor?: string; color?: string; } // 右键菜单状态 const [contextMenu, setContextMenu] = useState<{ visible: boolean; x: number; y: number; rowId: string; }>(); // 行样式状态 const [rowStyles, setRowStyles] = useState<Record<string, RowStyle>>({});
修改时间:
2024年
修改原因:
增强协议日志表格的交互功能,允许用户通过右键菜单自定义行的背景颜色和字体颜色,提升数据可视化和用户体验。
协议日志表格高度适配性优化
修改文件:
X1.WebUI/src/components/protocol-logs/ProtocolLogsTable.tsx
修改内容:
-
问题描述:
- 原代码使用固定的
max-h-[600px]高度设置 - 导致在不同屏幕尺寸下无法良好适配
- 在小屏幕设备上可能出现显示问题
- 原代码使用固定的
-
解决方案:
- 将固定高度
max-h-[600px]替换为响应式高度设置 - 使用
calc()函数结合视口高度(vh)进行动态计算 - 添加最小高度限制确保在小屏幕上的可用性
- 将固定高度
-
具体修改:
// 修改前 <div className="max-h-[600px] overflow-auto"> // 修改后 <div className="h-[calc(100vh-400px)] min-h-[300px] max-h-[calc(100vh-200px)] overflow-auto"> -
新高度设置说明:
h-[calc(100vh-400px)]:设置表格高度为视口高度减去400px(为页面其他元素预留空间)min-h-[300px]:设置最小高度为300px,确保在小屏幕上仍有足够的显示空间max-h-[calc(100vh-200px)]:设置最大高度为视口高度减去200px,防止在大屏幕上占用过多空间overflow-auto:保持原有的滚动功能
-
优势:
- 响应式设计:能够根据不同的屏幕尺寸自动调整
- 更好的用户体验:在各种设备上都能提供合适的显示效果
- 保持功能完整性:滚动功能和其他交互特性保持不变
修改时间:
2024年
修改原因:
解决协议日志表格在不同屏幕尺寸下的适配性问题,提升用户体验。
协议日志仓储修改
修改文件:
X1.Domain/Repositories/Logging/IProtocolLogRepository.csX1.Infrastructure/Repositories/Logging/ProtocolLogRepository.cs
修改内容:
-
保留现有方法:
- 保留了
GetByDeviceWithFiltersAsync方法,该方法用于根据设备代码和运行时状态获取协议日志
- 保留了
-
新增方法:
- 在接口
IProtocolLogRepository中添加了GetProtocolLogsNotInActiveRuntimesAsync方法 - 在实现类
ProtocolLogRepository中实现了该方法
- 在接口
-
新方法特性:
- 方法名:
GetProtocolLogsNotInActiveRuntimesAsync - 功能:获取不在活跃运行时状态中的协议日志
- 参数:与
GetByDeviceWithFiltersAsync保持一致deviceCode:设备代码runtimeCodes:运行时代码集合startTimestamp:开始时间戳endTimestamp:结束时间戳layerTypes:协议层类型数组runtimeStatuses:运行时状态过滤orderByDescending:是否按时间戳降序排序cancellationToken:取消令牌
- 返回类型:
IEnumerable<ProtocolLogListDto>
- 方法名:
-
SQL查询逻辑:
- 基于用户提供的SQL查询
- 动态查询逻辑:根据
runtimeStatuses参数动态决定使用EXISTS还是NOT EXISTS- 当
runtimeStatuses包含值 1 时,使用EXISTS包含活跃运行时状态(RuntimeStatus = 1)的记录 - 当
runtimeStatuses不包含值 1 时,使用NOT EXISTS排除活跃运行时状态(RuntimeStatus = 1)的记录
- 当
- 支持所有与
GetByDeviceWithFiltersAsync相同的过滤条件 - 高性能查询,不包含
MessageDetailJson字段
-
动态查询逻辑示例:
当 runtimeStatuses 包含值 1 时(使用 EXISTS):
SELECT pl."Id", pl."MessageId", pl."LayerType", pl."CellID", pl."IMSI", pl."Direction", pl."UEID", pl."PLMN", pl."TimeMs", pl."Timestamp", pl."Info", pl."Message", pl."DeviceCode", pl."RuntimeCode" FROM "tb_protocol_logs" pl WHERE EXISTS ( SELECT 1 FROM "tb_cellular_device_runtimes" t WHERE t."RuntimeStatus" = 1 AND t."RuntimeCode" = pl."RuntimeCode" )当 runtimeStatuses 不包含值 1 时(使用 NOT EXISTS):
SELECT pl."Id", pl."MessageId", pl."LayerType", pl."CellID", pl."IMSI", pl."Direction", pl."UEID", pl."PLMN", pl."TimeMs", pl."Timestamp", pl."Info", pl."Message", pl."DeviceCode", pl."RuntimeCode" FROM "tb_protocol_logs" pl WHERE NOT EXISTS ( SELECT 1 FROM "tb_cellular_device_runtimes" t WHERE t."RuntimeStatus" = 1 AND t."RuntimeCode" = pl."RuntimeCode" )
修改时间:
2024年
修改原因:
用户需要一个新的方法来获取不在活跃运行时状态中的协议日志,同时保持与现有 GetByDeviceWithFiltersAsync 方法相同的参数和过滤条件。
终端设备序列号获取方式修改
修改文件:
X1.Application/Features/TerminalDevices/Commands/CreateTerminalDevice/CreateTerminalDeviceCommandHandler.cs
修改内容:
-
功能描述:
- 将终端设备创建时的序列号生成方式从本地生成改为从设备获取真实序列号
- 参考
CreateDeviceCommandHandler的实现方式 - 添加了设备连接和序列号获取功能
-
主要修改:
- 依赖注入:添加了
IBaseInstrumentClient和IServiceEndpointManager依赖 - 序列号获取:替换了本地生成序列号的逻辑,改为从设备获取真实序列号
- 设备编号生成:修改了设备编号生成逻辑,使用序列号作为后缀
- 错误处理:增强了错误处理和日志记录
- 依赖注入:添加了
-
新增方法:
CreateServiceEndpoint():创建服务端点配置GetDeviceSerialNumberAsync():从设备获取序列号CalculateRequiredDigits():计算设备编号位数
-
修改的方法:
GenerateDeviceCodeAsync():修改为接受序列号参数,生成格式为TERM-000-SN的设备编号
-
技术实现:
- 使用动态HTTP客户端连接设备
- 临时创建服务端点进行序列号获取
- 获取成功后清理临时端点
- 完整的异常处理和资源清理
-
设备编号格式:
- 新格式:
TERM-000-SN、TERM-001-SN、TERM-002-SN等 - 动态位数:根据设备总数自动调整位数(至少3位)
- 包含真实序列号:确保设备编号的唯一性和可追溯性
- 新格式:
修改时间:
2024年
修改原因:
需要从终端设备获取真实的序列号,而不是本地生成,以确保设备信息的准确性和唯一性。参考蜂窝设备的实现方式,提供一致的设备管理体验。
终端设备控制器创建
修改文件:
X1.Presentation/Controllers/TerminalDevicesController.cs
修改内容:
-
功能描述:
- 创建了新的终端设备管理控制器
TerminalDevicesController - 参考
DevicesController的实现结构和设计模式 - 提供完整的终端设备CRUD操作API接口
- 创建了新的终端设备管理控制器
-
控制器特性:
- 继承自
ApiController基类 - 使用MediatR进行命令和查询处理
- 支持用户认证和授权
- 完整的日志记录和错误处理
- 统一的响应格式
- 继承自
-
API端点:
- GET /api/terminal-devices:获取终端设备列表(支持分页和搜索)
- GET /api/terminal-devices/{id}:根据ID获取终端设备详情
- POST /api/terminal-devices:创建新的终端设备
- PUT /api/terminal-devices/{id}:更新终端设备信息
- DELETE /api/terminal-devices/{id}:删除终端设备
-
技术实现:
- 使用CQRS模式分离命令和查询操作
- 统一的OperationResult响应格式
- 详细的日志记录,包括操作开始、成功和失败信息
- 参数验证和错误处理
- ID匹配验证确保数据一致性
-
日志记录:
- 操作开始日志:记录操作类型和关键参数
- 成功日志:记录操作结果和影响的数据量
- 失败日志:记录错误信息和失败原因
- 使用结构化日志记录,便于监控和调试
-
安全特性:
- 使用
[Authorize]特性确保用户认证 - 继承自
ApiController获得统一的错误处理 - 参数验证防止恶意输入
- 使用
修改时间:
2024年
修改原因:
需要为终端设备管理提供完整的Web API接口,参考现有的DevicesController实现,确保API设计的一致性和完整性。
终端设备控制器构造函数调用修复
修改文件:
X1.Presentation/Controllers/TerminalDevicesController.cs
修改内容:
-
问题描述:
GetTerminalDeviceByIdQuery和DeleteTerminalDeviceCommand类没有接受参数的构造函数- 这些类使用属性来接收参数,而不是构造函数参数
- 控制器中直接使用构造函数传递参数导致编译错误
-
修复方案:
- 修改
GetById方法中的查询对象创建方式 - 修改
Delete方法中的命令对象创建方式 - 使用对象初始化器语法设置属性值
- 修改
-
具体修改:
// 修改前 var result = await mediator.Send(new GetTerminalDeviceByIdQuery(id)); var result = await mediator.Send(new DeleteTerminalDeviceCommand(id)); // 修改后 var query = new GetTerminalDeviceByIdQuery { DeviceId = id }; var result = await mediator.Send(query); var command = new DeleteTerminalDeviceCommand { DeviceId = id }; var result = await mediator.Send(command); -
技术说明:
- 这些类遵循MediatR的标准模式,使用属性而不是构造函数参数
- 使用对象初始化器语法更清晰地表达意图
- 保持了代码的可读性和一致性
修改时间:
2024年
修改原因:
修复控制器中查询和命令对象的创建方式,确保与MediatR模式保持一致,解决编译错误。
ADB操作实体创建
修改文件:
X1.Domain/Entities/Terminal/AdbOperation.csX1.Domain/Repositories/Terminal/IAdbOperationRepository.cs
修改内容:
-
功能描述:
- 创建了新的ADB操作实体类
AdbOperation - 主要用于管理ADB命令操作
- 继承自
Entity基类,不包含审计功能 - 创建了完整的仓储接口
- 创建了新的ADB操作实体类
-
实体特性:
- 继承自
Entity,提供基础实体功能 - 包含ADB命令信息:命令内容、描述、路径
- 支持路径配置:绝对路径或相对路径
- 支持启用/禁用状态管理
- 提供完整的CRUD操作方法
- 继承自
-
主要属性:
Command:执行的ADB命令(必填)Description:ADB操作的描述(必填)Path:命令执行时所依赖的路径(必填)UseAbsolutePath:是否启用绝对路径(默认false)IsEnabled:是否启用(默认true)
-
业务方法:
Create():静态工厂方法,用于创建新的ADB操作Update():更新操作信息ToggleAbsolutePath():切换绝对路径设置Enable():启用操作Disable():禁用操作
-
仓储接口:
IAdbOperationRepository:ADB操作仓储接口- 继承自
IBaseRepository<AdbOperation> - 提供完整的CRUD操作方法
- 支持搜索、分页、存在性检查等功能
- 支持根据命令内容查询和检查重复
-
设计原则:
- 遵循DDD(领域驱动设计)原则
- 使用私有构造函数确保通过工厂方法创建实例
- 属性使用私有setter确保封装性
- 提供完整的业务操作方法
- 遵循Clean Architecture架构模式
修改时间:
2024年
修改原因:
需要创建一个专门用于管理ADB操作的实体类,支持ADB命令的存储、配置和管理,为终端设备管理提供ADB操作支持。
终端设备文件结构重组
修改文件:
X1.Domain/Entities/Terminal/AdbOperation.csX1.Domain/Entities/Terminal/TerminalDevice.csX1.Domain/Repositories/Terminal/IAdbOperationRepository.csX1.Domain/Repositories/Terminal/ITerminalDeviceRepository.cs
修改内容:
-
文件结构重组:
- 创建了新的
Terminal文件夹,专门用于终端设备相关的实体和仓储 - 将
AdbOperation和TerminalDevice实体从Device文件夹移动到Terminal文件夹 - 将相关的仓储接口也移动到
Terminal文件夹
- 创建了新的
-
命名空间更新:
AdbOperation实体:CellularManagement.Domain.Entities.TerminalTerminalDevice实体:CellularManagement.Domain.Entities.TerminalIAdbOperationRepository接口:CellularManagement.Domain.Repositories.TerminalITerminalDeviceRepository接口:CellularManagement.Domain.Repositories.Terminal
-
架构设计优化:
- 将终端设备相关功能与蜂窝设备(仪表)功能分离
- 终端设备:主要用于ADB操作和终端管理
- 蜂窝设备:主要用于仪表和协议管理
- 更清晰的领域边界和职责分离
-
删除的旧文件:
X1.Domain/Entities/Device/AdbOperation.csX1.Domain/Entities/Device/TerminalDevice.csX1.Domain/Repositories/Device/IAdbOperationRepository.csX1.Domain/Repositories/Device/ITerminalDeviceRepository.cs
修改时间:
2024年
修改原因:
为了更好地组织代码结构,将终端设备相关功能与蜂窝设备功能分离,创建独立的Terminal文件夹,使架构更加清晰和合理。
终端设备仓储实现创建
修改文件:
X1.Infrastructure/Repositories/Terminal/TerminalDeviceRepository.csX1.Infrastructure/Repositories/Terminal/AdbOperationRepository.cs
修改内容:
-
终端设备仓储实现:
- 创建了
TerminalDeviceRepository实现类 - 继承自
BaseRepository<TerminalDevice> - 实现
ITerminalDeviceRepository接口的所有方法 - 提供完整的CRUD操作和查询功能
- 创建了
-
ADB操作仓储实现:
- 创建了
AdbOperationRepository实现类 - 继承自
BaseRepository<AdbOperation> - 实现
IAdbOperationRepository接口的所有方法 - 提供ADB操作的完整管理功能
- 创建了
-
主要功能:
- 终端设备管理:
- 添加、更新、删除终端设备
- 根据ID、序列号查询设备
- 支持关键词搜索和分页查询
- 检查设备存在性和重复性
- 获取设备基本信息和统计
- ADB操作管理:
- 添加、更新、删除ADB操作
- 根据ID、命令内容查询操作
- 支持关键词搜索和分页查询
- 检查操作存在性和命令重复性
- 获取操作统计信息
- 终端设备管理:
-
技术特性:
- 使用CQRS模式分离命令和查询操作
- 支持异步操作和取消令牌
- 完整的日志记录
- 高性能查询和分页
- 统一的错误处理
-
删除的旧文件:
X1.Infrastructure/Repositories/Device/TerminalDeviceRepository.cs
修改时间:
2024年
修改原因:
完成终端设备仓储的完整实现,为终端设备管理和ADB操作提供完整的数据访问层支持。
ADB操作仓储类型修复
修改文件:
X1.Domain/Repositories/Terminal/IAdbOperationRepository.csX1.Infrastructure/Repositories/Terminal/AdbOperationRepository.cs
修改内容:
-
类型错误修复:
- 修复了
AdbOperation实体ID类型不匹配的问题 - 将
int类型改为string类型,与Entity基类保持一致
- 修复了
-
修复的方法:
DeleteOperationAsync(int id)→DeleteOperationAsync(string id)GetOperationByIdAsync(int id)→GetOperationByIdAsync(string id)ExistsAsync(int id)→ExistsAsync(string id)
-
修复范围:
- 仓储接口
IAdbOperationRepository中的方法签名 - 仓储实现
AdbOperationRepository中的方法实现 - 确保与
Entity基类的Id属性类型一致
- 仓储接口
-
技术说明:
Entity基类的Id属性为string类型- 所有继承自
Entity的实体都应该使用string类型的ID - 修复了编译错误:"运算符"=="无法应用于"string"和"int"类型的操作数"
修改时间:
2024年
修改原因:
修复ADB操作仓储中的类型错误,确保ID类型与Entity基类保持一致,解决编译错误。
ADB操作实体等待时间字段添加
修改文件:
X1.Domain/Entities/Terminal/AdbOperation.cs
修改内容:
-
新增字段:
- 添加了
WaitTimeMs属性,用于存储执行命令完需要等待的时间(毫秒) - 默认值为 0,表示不需要等待
- 添加了
-
字段特性:
- 类型:
int(毫秒) - 默认值:0
- 私有setter确保封装性
- 支持负数验证
- 类型:
-
方法更新:
- Create方法:添加了
waitTimeMs参数(默认值为0) - Update方法:添加了
waitTimeMs参数 - SetWaitTime方法:新增专门用于设置等待时间的方法
- Create方法:添加了
-
验证逻辑:
- 在
Create和Update方法中添加了等待时间验证 - 确保等待时间不能为负数
- 抛出
ArgumentException异常处理无效输入
- 在
-
业务场景:
- 支持ADB命令执行后的等待时间配置
- 适用于需要等待设备响应的场景
- 提高命令执行的可靠性和稳定性
-
设计原则:
- 保持与现有代码风格一致
- 遵循DDD原则,通过业务方法修改状态
- 提供完整的参数验证和错误处理
修改时间:
2024年
修改原因:
为ADB操作实体添加等待时间字段,支持命令执行后的等待配置,提高ADB操作的灵活性和可靠性。
AT操作实体创建
修改文件:
X1.Domain/Entities/Terminal/AtOperation.csX1.Domain/Repositories/Terminal/IAtOperationRepository.cs
修改内容:
-
功能描述:
- 创建了新的AT操作实体类
AtOperation - 专门用于处理通过串口连接的设备的AT命令操作
- 继承自
Entity基类,不包含审计功能 - 创建了完整的仓储接口
- 创建了新的AT操作实体类
-
实体特性:
- 继承自
Entity,提供基础实体功能 - 包含串口通信配置:端口、波特率、数据位、校验位、停止位
- 支持AT命令管理:命令内容、参数、超时时间
- 支持启用/禁用状态管理
- 提供完整的CRUD操作方法
- 继承自
-
主要属性:
DeviceId:设备ID(必填)Port:串口端口(必填)BaudRate:波特率(默认115200)DataBits:数据位(默认8)Parity:校验位(默认NONE)StopBits:停止位(默认1)Command:AT命令内容(必填)Parameters:命令参数(JSON格式)Timeout:超时时间(默认30秒)Description:操作描述(必填)IsEnabled:是否启用(默认true)
-
业务方法:
Create():静态工厂方法,用于创建新的AT操作Update():更新操作信息Enable():启用操作Disable():禁用操作SetTimeout():设置超时时间SetBaudRate():设置波特率
-
验证逻辑:
- 设备ID、端口、命令、描述不能为空
- 波特率必须大于0
- 数据位必须在5-8之间
- 校验位必须是NONE、EVEN或ODD
- 停止位必须是1、1.5或2
- 超时时间必须大于0
-
仓储接口:
IAtOperationRepository:AT操作仓储接口- 继承自
IBaseRepository<AtOperation> - 提供完整的CRUD操作方法
- 支持搜索、分页、存在性检查等功能
- 支持根据设备ID查询操作
- 支持根据命令内容查询和检查重复
- 提供设备操作统计功能
-
设计原则:
- 遵循DDD(领域驱动设计)原则
- 使用私有构造函数确保通过工厂方法创建实例
- 属性使用私有setter确保封装性
- 提供完整的业务操作方法
- 遵循Clean Architecture架构模式
- 专注于串口通信的核心功能,简化设计
修改时间:
2024年
修改原因:
需要创建一个专门用于管理AT操作的实体类,支持串口通信的AT命令存储、配置和管理,为终端设备管理提供AT操作支持。
AT操作和ADB操作Features层实现
修改文件:
X1.Application/Features/TerminalDevices/Commands/CreateAtOperation/X1.Application/Features/TerminalDevices/Commands/UpdateAtOperation/X1.Application/Features/TerminalDevices/Commands/DeleteAtOperation/X1.Application/Features/TerminalDevices/Queries/GetAtOperations/X1.Application/Features/TerminalDevices/Queries/GetAtOperationById/X1.Application/Features/TerminalDevices/Commands/CreateAdbOperation/X1.Application/Features/TerminalDevices/Commands/UpdateAdbOperation/X1.Application/Features/TerminalDevices/Commands/DeleteAdbOperation/X1.Application/Features/TerminalDevices/Queries/GetAdbOperations/X1.Application/Features/TerminalDevices/Queries/GetAdbOperationById/
修改内容:
-
AT操作Features层:
- Commands(命令):
CreateAtOperation:创建AT操作,支持串口通信配置UpdateAtOperation:更新AT操作信息DeleteAtOperation:删除AT操作
- Queries(查询):
GetAtOperations:获取AT操作列表(支持分页和搜索)GetAtOperationById:根据ID获取AT操作详情
- Commands(命令):
-
ADB操作Features层:
- Commands(命令):
CreateAdbOperation:创建ADB操作,支持命令和路径配置UpdateAdbOperation:更新ADB操作信息DeleteAdbOperation:删除ADB操作
- Queries(查询):
GetAdbOperations:获取ADB操作列表(支持分页和搜索)GetAdbOperationById:根据ID获取ADB操作详情
- Commands(命令):
-
技术特性:
- 使用MediatR实现CQRS模式
- 完整的参数验证和错误处理
- 详细的日志记录
- 统一的响应格式(OperationResult)
- 支持异步操作和取消令牌
- 完整的CRUD操作支持
-
AT操作特性:
- 支持串口通信配置:端口、波特率、数据位、校验位、停止位
- 支持AT命令管理:命令内容、参数、超时时间
- 支持启用/禁用状态管理
- 支持设备ID关联
-
ADB操作特性:
- 支持ADB命令管理:命令内容、描述、路径
- 支持路径配置:绝对路径或相对路径
- 支持启用/禁用状态管理
- 支持等待时间配置
-
设计原则:
- 遵循DDD(领域驱动设计)原则
- 采用CQRS模式分离命令和查询操作
- 遵循Clean Architecture架构模式
- 统一的错误处理和日志记录
- 完整的业务逻辑验证
修改时间:
2024年
修改原因:
为AT操作和ADB操作实现完整的Features层,提供标准的CRUD操作和查询功能,支持终端设备管理系统的完整功能。
2025-01-12 BackendServiceManager 迁移
迁移内容
将 X1.Application.BackendServiceManager 完全迁移到 X1.BackendServices.BackendServiceManager
迁移的文件
IServiceScopeExecutor.cs- 服务作用域执行器接口ServiceScopeExecutor.cs- 服务作用域执行器实现OperationResult.cs- 操作结果包装类ProtocolChannelManager.cs- 协议通道管理器DeviceManagementService.cs- 设备管理后台服务
修改的文件
X1.BackendServices/DependencyInjection.cs- 添加依赖注入配置X1.BackendServices/X1.BackendServices.csproj- 添加项目引用和包引用X1.Application/DependencyInjection.cs- 移除 BackendServiceManager 相关注册X1.WebAPI/Program.cs- 添加对 X1.BackendServices 的依赖注入X1.WebAPI/X1.WebAPI.csproj- 添加对 X1.BackendServices 的项目引用
命名空间变更
- 从
X1.Application.BackendServiceManager改为X1.BackendServices.BackendServiceManager
验证结果
- ✅ 编译成功,无错误
- ✅ 所有依赖关系已正确更新
- ✅ 服务注册已正确配置
完成状态
- ✅ 已成功删除
X1.Application/BackendServiceManager目录 - ✅ 项目编译正常,无错误
- ✅ 迁移完成,所有功能正常工作