import asyncio from typing import Dict, Optional import time from sqlalchemy import select, update, insert from database.models import DeviceConfig from services.database_service_base import DatabaseServiceBase from utils.logger import session_logger class DeviceVolumeManager(DatabaseServiceBase): def __init__(self): super().__init__(service_name="device_volume") self.device_volumes: Dict[str, int] = {} # 缓存设备音量 self.lock = asyncio.Lock() self._db_initialized = False self.default_volume = 70 # 默认音量值 async def get_volume(self, device_id: str) -> int: """获取设备音量设置""" await self._init_database() if device_id in self.device_volumes: return self.device_volumes[device_id] db_session = await self.get_session() try: query = select(DeviceConfig).where(DeviceConfig.device_id == device_id) result = await db_session.execute(query) config = result.scalars().first() if config and hasattr(config, "volume") and config.volume is not None: volume = config.volume else: volume = self.default_volume self.device_volumes[device_id] = volume return volume except Exception as e: session_logger.error(device_id, "volume", f"获取音量信息失败: {str(e)}") return self.default_volume # 出错时返回默认值 finally: await db_session.close() async def set_volume(self, device_id: str, volume: int) -> bool: """设置设备音量并保存到数据库""" if volume < 0 or volume > 100: raise ValueError("音量值必须在0-100范围内") await self._init_database() self.device_volumes[device_id] = volume db_session = await self.get_session() try: query = select(DeviceConfig).where(DeviceConfig.device_id == device_id) result = await db_session.execute(query) config = result.scalars().first() if config: update_stmt = ( update(DeviceConfig) .where(DeviceConfig.device_id == device_id) .values(volume=volume) ) await db_session.execute(update_stmt) else: from config import settings insert_stmt = insert(DeviceConfig).values( device_id=device_id, selected_role_key=settings.selected_role_key, volume=volume, last_update_time=time.time() ) await db_session.execute(insert_stmt) await db_session.commit() session_logger.info(device_id, "volume", f"设备音量已更新为 {volume}") return True except Exception as e: await db_session.rollback() session_logger.error(device_id, "volume", f"更新音量配置失败: {str(e)}") raise finally: await db_session.close() device_volume_manager = DeviceVolumeManager()