修改音频保存逻辑,后续再完善,添加设备信息保存到数据库

This commit is contained in:
HycJack
2026-04-29 04:24:44 +08:00
parent b37f6fb9cd
commit 7d4ae15fb5
11 changed files with 397 additions and 9 deletions

View File

@@ -0,0 +1,107 @@
from collections.abc import Mapping
from datetime import time
from typing import Optional
from services.database_service_base import DatabaseServiceBase
from banban.dao.device_setting import DeviceSettingDAO
class DeviceSettingService(DatabaseServiceBase):
def __init__(self):
super().__init__(service_name="device_setting_service")
async def create_setting(
self,
device_id: str,
sleep_mode: int = 0,
disable_time_start: Optional[time] = None,
disable_time_end: Optional[time] = None,
timezone: str = "Asia/Shanghai",
power: Optional[int] = None,
volume: Optional[int] = None,
brightness: Optional[int] = None,
disable_weekdays: Optional[str] = None,
signal_strength: Optional[int] = None,
version_str: Optional[str] = None,
) -> int:
db_session = await self.get_session()
try:
dao = DeviceSettingDAO(db_session)
return await dao.create(
device_id=device_id,
sleep_mode=sleep_mode,
disable_time_start=disable_time_start,
disable_time_end=disable_time_end,
timezone=timezone,
power=power,
volume=volume,
brightness=brightness,
disable_weekdays=disable_weekdays,
signal_strength=signal_strength,
version_str=version_str,
)
finally:
await db_session.close()
async def get_setting_by_device_id(self, device_id: str) -> Optional[Mapping]:
db_session = await self.get_session()
try:
dao = DeviceSettingDAO(db_session)
return await dao.get_by_device_id(device_id=device_id)
finally:
await db_session.close()
async def update_setting(
self,
device_id: str,
sleep_mode: Optional[int] = None,
disable_time_start: Optional[time] = None,
disable_time_end: Optional[time] = None,
timezone: Optional[str] = None,
power: Optional[int] = None,
volume: Optional[int] = None,
brightness: Optional[int] = None,
disable_weekdays: Optional[str] = None,
signal_strength: Optional[int] = None,
version_str: Optional[str] = None,
) -> None:
db_session = await self.get_session()
try:
dao = DeviceSettingDAO(db_session)
await dao.update(
device_id=device_id,
sleep_mode=sleep_mode,
disable_time_start=disable_time_start,
disable_time_end=disable_time_end,
timezone=timezone,
volume=volume,
brightness=brightness,
disable_weekdays=disable_weekdays,
power=power,
signal_strength=signal_strength,
version_str=version_str,
)
finally:
await db_session.close()
async def delete_setting(self, device_id: str) -> None:
db_session = await self.get_session()
try:
dao = DeviceSettingDAO(db_session)
await dao.delete_by_device_id(device_id=device_id)
finally:
await db_session.close()
async def insert_or_update(self, device_id: str, power: int, volume: int, signal_strength: int, version_str: str) -> None:
try:
current_row = await self.get_setting_by_device_id(device_id=device_id)
if current_row:
await self.update_setting(device_id=device_id, power=power, volume=volume, signal_strength=signal_strength, version_str=version_str)
else:
await self.create_setting(device_id=device_id, power=power, volume=volume, signal_strength=signal_strength, version_str=version_str)
finally:
pass
# 创建全局 DeviceSettingService 实例
device_setting_service = DeviceSettingService()

View File

@@ -251,6 +251,55 @@ class ImService(DatabaseServiceBase):
finally:
await db_session.close()
'''
Todo 创建设备消息, 还不完善
'''
async def create_device_message(
self,
*,
device_id: str,
serial_number: str,
target_device_id: str,
audio_url: str,
):
db_session = await self.get_session()
try:
dao = ImDAO(db_session)
device_identity = await dao.authenticate_device_identity(
device_id=device_id,
serial_number=serial_number,
)
target_device_identity = await dao.get_device_by_id(device_id=target_device_id)
sender_child_row = await dao.assert_child_exists(child_id=device_identity.child_id)
receiver_child_row = await dao.assert_child_exists(child_id=target_device_identity.child_id)
conversation_id, idempotent = await dao.create_message(
conversation_type=PARENT_CHILD_CONVERSATION_TYPE,
participant_a_type=CHILD_PARTICIPANT_TYPE,
participant_a_id=str(device_identity.child_id),
participant_b_type=PARENT_PARTICIPANT_TYPE,
participant_b_id=str(receiver_child_row.child_id),
pair_key=f"{device_identity.child_id}:{target_device_identity.child_id}",
sender_type=CHILD_PARTICIPANT_TYPE,
sender_id=str(device_identity.child_id),
receiver_type=PARENT_PARTICIPANT_TYPE,
receiver_id=str(receiver_child_row.child_id),
sender_name_snapshot=sender_child_row["child_name"],
sender_avatar_snapshot=None,
receiver_name_snapshot=receiver_child_row["child_name"],
receiver_avatar_snapshot=None,
payload=None,
)
return device_identity
except Exception:
await db_session.rollback()
raise
finally:
await db_session.close()
# 创建全局 ImService 实例
im_service = ImService()

View File

@@ -4,7 +4,7 @@ from datetime import datetime
from typing import Any
from services.database_service_base import DatabaseServiceBase
from database.models import ChildLocationCurrent
try:
from banban.dao.location import LocationDAO, ParentDeviceAccess
from banban.schemas.location import DeviceLocationReportRequest
@@ -85,6 +85,18 @@ class LocationService(DatabaseServiceBase):
finally:
await db_session.close()
async def insert_or_update(self, device_id: str, location: ChildLocationCurrent) -> None:
db_session = await self.get_session()
try:
dao = LocationDAO(db_session)
current_row = await dao.get_device_current_location(device_id=device_id)
if current_row:
await dao.update(device_id=device_id, latitude=location.lat, longitude=location.lng)
# 更新成功加到历史记录表
else:
await dao.insert(device_id=device_id, latitude=location.lat, longitude=location.lng)
finally:
await db_session.close()
# 创建全局 LocationService 实例
location_service = LocationService()