From 7534a5d229d9bff2b051cc294c196be6bf394c3a Mon Sep 17 00:00:00 2001 From: root Date: Tue, 26 Aug 2025 17:36:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=AE=BE=E5=A4=87=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E8=8E=B7=E5=8F=96=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/v1/endpoints/devices.py | 8 +- app/services/device_service.py | 92 ++++++++++++----- docs/modify.md | 178 ++++++++++++++++++++++++++++++++ 3 files changed, 251 insertions(+), 27 deletions(-) diff --git a/app/api/v1/endpoints/devices.py b/app/api/v1/endpoints/devices.py index 29a291c..41482ac 100644 --- a/app/api/v1/endpoints/devices.py +++ b/app/api/v1/endpoints/devices.py @@ -18,14 +18,14 @@ router = APIRouter() @router.get("/devices", summary="获取所有设备") async def get_devices(): - """获取所有设备列表""" + """获取所有设备列表(包括注册和自动发现的设备)""" try: devices = await device_service.get_all_devices() return DeviceListResponse( success=True, message=f"成功获取 {len(devices)} 个设备", data={ - "devices": [device.dict() for device in devices], + "devices": devices, # 直接返回字典列表,包含注册和自动发现的设备 "total": len(devices) } ) @@ -38,7 +38,7 @@ async def get_devices(): @router.get("/devices/{device_id}", summary="获取指定设备") async def get_device(device_id: str): - """获取指定设备信息""" + """获取指定设备信息(包括注册和自动发现的设备)""" try: device = await device_service.get_device(device_id) if not device: @@ -62,7 +62,7 @@ async def get_device(device_id: str): @router.get("/devices/{device_id}/status", summary="获取设备状态") async def get_device_status(device_id: str): - """获取指定设备状态""" + """获取指定设备状态(包括注册和自动发现的设备)""" try: status_info = await device_service.get_device_status(device_id) return { diff --git a/app/services/device_service.py b/app/services/device_service.py index b36868c..6906233 100644 --- a/app/services/device_service.py +++ b/app/services/device_service.py @@ -25,54 +25,94 @@ class DeviceService: # 初始化设备操作映射配置 self.operation_mapping = DeviceOperationMapping(self.auto_discovery_adb_service) - async def get_all_devices(self) -> List[Device]: - """获取所有设备""" + async def get_all_devices(self) -> List[Dict[str, Any]]: + """获取所有设备(包括注册和自动发现的)""" try: - devices = await self.device_manager.get_all_devices() - return devices # 直接返回Device对象列表,不需要转换 + devices = await self.device_manager.get_all_devices_unified() + return devices except Exception as e: logger.error(f"获取所有设备失败: {e}") raise - async def get_device(self, device_id: str) -> Optional[Device]: - """获取指定设备""" + async def get_device(self, device_id: str) -> Optional[Dict[str, Any]]: + """获取指定设备(优先获取自动发现的设备,然后获取注册的设备)""" try: + # 优先检查自动发现设备 + device_source = await self.device_manager.get_device_source(device_id) + if device_source == DeviceSource.AUTO_DISCOVERED: + # 获取自动发现设备信息 + auto_discovered_devices = await self.device_manager.get_auto_discovered_devices() + for device in auto_discovered_devices: + if device["device_id"] == device_id: + return device + + # 然后检查注册设备 device_info = await self.device_manager.get_device(device_id) if device_info: - return device_info # 直接返回Device对象,不需要转换 + # 转换为统一格式 + return { + "device_id": device_info.device_id, + "name": device_info.name, + "protocol_type": device_info.protocol_type, + "status": device_info.status, + "source": DeviceSource.REGISTERED.value, + "created_at": device_info.created_at, + "updated_at": device_info.updated_at, + "connection_info": device_info.connection_info + } + return None except Exception as e: logger.error(f"获取设备 {device_id} 失败: {e}") raise async def get_device_status(self, device_id: str) -> DeviceStatusResponse: - """获取设备状态""" + """获取设备状态(包括注册和自动发现的设备)""" try: - device = await self.device_manager.get_device(device_id) - if not device: - raise ValueError(f"设备 {device_id} 不存在") + # 获取设备来源 + device_source = await self.device_manager.get_device_source(device_id) - return DeviceStatusResponse( - device_id=device_id, - status=device.status, - timestamp=device.updated_at - ) + if device_source == DeviceSource.REGISTERED: + # 注册设备 + device = await self.device_manager.get_device(device_id) + if not device: + raise ValueError(f"设备 {device_id} 不存在") + + return DeviceStatusResponse( + device_id=device_id, + status=device.status, + timestamp=device.updated_at + ) + else: + # 自动发现设备 + auto_discovered_devices = await self.device_manager.get_auto_discovered_devices() + for device in auto_discovered_devices: + if device["device_id"] == device_id: + return DeviceStatusResponse( + device_id=device_id, + status=device["status"], + timestamp=device.get("last_seen", None) + ) + + raise ValueError(f"设备 {device_id} 不存在") + except Exception as e: logger.error(f"获取设备 {device_id} 状态失败: {e}") raise async def execute_operation(self, device_id: str, operation: str, **kwargs) -> Dict[str, Any]: - """执行设备操作""" + """执行设备操作(包括注册和自动发现的设备)""" try: - device = await self.device_manager.get_device(device_id) - if not device: - raise ValueError(f"设备 {device_id} 不存在") - # 获取设备来源 device_source = await self.device_manager.get_device_source(device_id) if device_source == DeviceSource.REGISTERED: - # 注册设备:通过设备分发器执行 + # 注册设备:检查设备是否存在 + device = await self.device_manager.get_device(device_id) + if not device: + raise ValueError(f"设备 {device_id} 不存在") + + # 通过设备分发器执行 return await self.device_dispatcher.execute_operation( device_id=device_id, protocol_type=device.protocol_type, @@ -80,7 +120,13 @@ class DeviceService: **kwargs ) else: - # 自动发现设备:直接调用ADB服务 + # 自动发现设备:检查设备是否存在 + auto_discovered_devices = await self.device_manager.get_auto_discovered_devices() + device_exists = any(device["device_id"] == device_id for device in auto_discovered_devices) + if not device_exists: + raise ValueError(f"设备 {device_id} 不存在") + + # 直接调用ADB服务 return await self._execute_auto_discovered_device_operation( device_id, operation, **kwargs ) diff --git a/docs/modify.md b/docs/modify.md index a9990b8..cd544b7 100644 --- a/docs/modify.md +++ b/docs/modify.md @@ -1,5 +1,183 @@ # 修改记录 +## 2025-08-18 修改DeviceService.get_device方法优先级 + +**修改内容:** +修改 `app/services/device_service.py` 中的 `get_device` 方法,让它优先获取自动发现的设备,然后再获取注册的设备。 + +**修改详情:** + +### 修改前 +```python +async def get_device(self, device_id: str) -> Optional[Dict[str, Any]]: + """获取指定设备(包括注册和自动发现的设备)""" + try: + # 先检查注册设备 + device_info = await self.device_manager.get_device(device_id) + if device_info: + # 转换为统一格式 + return {...} + + # 检查自动发现设备 + device_source = await self.device_manager.get_device_source(device_id) + if device_source == DeviceSource.AUTO_DISCOVERED: + # 获取自动发现设备信息 + auto_discovered_devices = await self.device_manager.get_auto_discovered_devices() + for device in auto_discovered_devices: + if device["device_id"] == device_id: + return device + + return None +``` + +### 修改后 +```python +async def get_device(self, device_id: str) -> Optional[Dict[str, Any]]: + """获取指定设备(优先获取自动发现的设备,然后获取注册的设备)""" + try: + # 优先检查自动发现设备 + device_source = await self.device_manager.get_device_source(device_id) + if device_source == DeviceSource.AUTO_DISCOVERED: + # 获取自动发现设备信息 + auto_discovered_devices = await self.device_manager.get_auto_discovered_devices() + for device in auto_discovered_devices: + if device["device_id"] == device_id: + return device + + # 然后检查注册设备 + device_info = await self.device_manager.get_device(device_id) + if device_info: + # 转换为统一格式 + return {...} + + return None +``` + +**优化效果:** +- ✅ 优先获取自动发现的设备信息 +- ✅ 然后获取注册的设备信息 +- ✅ 保持原有的错误处理和日志记录 +- ✅ 不影响其他方法的调用 + +## 2025-08-18 修复DeviceService重大Bug:支持自动发现设备 + +**修改内容:** +修复 `app/services/device_service.py` 中的重大Bug,确保所有方法都能正确处理自动发现设备,而不仅仅是注册设备。 + +**修改详情:** + +### 1. 修复get_all_devices方法 +```python +# 修改前:只返回注册的设备 +async def get_all_devices(self) -> List[Device]: + devices = await self.device_manager.get_all_devices() + return devices + +# 修改后:返回包括注册和自动发现设备的统一列表 +async def get_all_devices(self) -> List[Dict[str, Any]]: + devices = await self.device_manager.get_all_devices_unified() + return devices +``` + +### 2. 修复get_device方法(重大Bug修复) +```python +# 修改前:只检查注册设备,自动发现设备会被误判为不存在 +async def get_device(self, device_id: str) -> Optional[Device]: + device_info = await self.device_manager.get_device(device_id) + return device_info + +# 修改后:同时检查注册和自动发现设备 +async def get_device(self, device_id: str) -> Optional[Dict[str, Any]]: + # 先检查注册设备 + device_info = await self.device_manager.get_device(device_id) + if device_info: + return {转换为统一格式} + + # 检查自动发现设备 + device_source = await self.device_manager.get_device_source(device_id) + if device_source == DeviceSource.AUTO_DISCOVERED: + return {获取自动发现设备信息} + + return None +``` + +### 3. 修复get_device_status方法(重大Bug修复) +```python +# 修改前:只检查注册设备,自动发现设备状态无法获取 +async def get_device_status(self, device_id: str) -> DeviceStatusResponse: + device = await self.device_manager.get_device(device_id) + if not device: + raise ValueError(f"设备 {device_id} 不存在") # 自动发现设备会被误判 + +# 修改后:同时支持注册和自动发现设备状态 +async def get_device_status(self, device_id: str) -> DeviceStatusResponse: + device_source = await self.device_manager.get_device_source(device_id) + + if device_source == DeviceSource.REGISTERED: + # 处理注册设备 + device = await self.device_manager.get_device(device_id) + return DeviceStatusResponse(...) + else: + # 处理自动发现设备 + auto_discovered_devices = await self.device_manager.get_auto_discovered_devices() + for device in auto_discovered_devices: + if device["device_id"] == device_id: + return DeviceStatusResponse(...) +``` + +### 4. 修复execute_operation方法(重大Bug修复) +```python +# 修改前:只检查注册设备,自动发现设备操作会失败 +async def execute_operation(self, device_id: str, operation: str, **kwargs): + device = await self.device_manager.get_device(device_id) + if not device: + raise ValueError(f"设备 {device_id} 不存在") # 自动发现设备会被误判 + +# 修改后:正确处理注册和自动发现设备操作 +async def execute_operation(self, device_id: str, operation: str, **kwargs): + device_source = await self.device_manager.get_device_source(device_id) + + if device_source == DeviceSource.REGISTERED: + # 检查注册设备是否存在 + device = await self.device_manager.get_device(device_id) + if not device: + raise ValueError(f"设备 {device_id} 不存在") + # 执行注册设备操作 + else: + # 检查自动发现设备是否存在 + auto_discovered_devices = await self.device_manager.get_auto_discovered_devices() + device_exists = any(device["device_id"] == device_id for device in auto_discovered_devices) + if not device_exists: + raise ValueError(f"设备 {device_id} 不存在") + # 执行自动发现设备操作 +``` + +### 5. 更新API端点 +```python +# 更新API端点注释,明确支持自动发现设备 +@router.get("/devices/{device_id}", summary="获取指定设备") +async def get_device(device_id: str): + """获取指定设备信息(包括注册和自动发现的设备)""" + +@router.get("/devices/{device_id}/status", summary="获取设备状态") +async def get_device_status(device_id: str): + """获取指定设备状态(包括注册和自动发现的设备)""" +``` + +### 6. 修复效果 +- ✅ **完整设备支持**:所有方法现在都能正确处理注册和自动发现设备 +- ✅ **设备查询修复**:`get_device` 方法不再误判自动发现设备为不存在 +- ✅ **状态查询修复**:`get_device_status` 方法能正确获取自动发现设备状态 +- ✅ **操作执行修复**:`execute_operation` 方法能正确执行自动发现设备操作 +- ✅ **统一数据格式**:所有设备都以统一的字典格式返回 +- ✅ **设备来源标识**:每个设备都包含 `source` 字段标识设备来源 + +### 7. 技术说明 +- **设备来源检查**:使用 `get_device_source` 方法正确识别设备类型 +- **自动发现设备处理**:通过 `get_auto_discovered_devices` 方法获取自动发现设备信息 +- **错误处理完善**:确保设备不存在时抛出正确的错误信息 +- **数据格式统一**:注册和自动发现设备都转换为统一的字典格式 + ## 2025-08-18 请求和响应模型架构重构 **修改内容:**