add 告警和联调问题修改

This commit is contained in:
HycJack
2026-05-08 17:33:03 +08:00
parent 6eb548ab41
commit 46cc5272f3
8 changed files with 516 additions and 100 deletions

View File

@@ -1,10 +1,12 @@
from collections.abc import Mapping
from typing import Any, List
from datetime import time
from typing import Any, List, Literal
from services.database_service_base import DatabaseServiceBase
from fastapi import HTTPException
from banban.dao.device import DeviceDAO
from banban.service.device_setting import device_setting_service
class DeviceService(DatabaseServiceBase):
@@ -68,6 +70,51 @@ class DeviceService(DatabaseServiceBase):
raise HTTPException(status_code=503, detail="MQTT 服务未初始化")
return await service.send_volume_command(device_id, level)
async def set_sleep_schedule(
self,
*,
device_id: str,
user_id: int,
start: time,
end: time,
timezone: str,
) -> str:
await self.ensure_device_access(device_id=device_id, user_id=user_id)
from handlers.mqtt_handler import TalkingQMQTTService
service = await TalkingQMQTTService.get_instance()
if service is None:
raise HTTPException(status_code=503, detail="MQTT 服务未初始化")
start_text = start.strftime("%H:%M")
end_text = end.strftime("%H:%M")
msg_id = await service.send_sleep_schedule_command(device_id, start_text, end_text)
await device_setting_service.upsert_sleep_schedule(
device_id=device_id,
sleep_mode=1,
disable_time_start=start,
disable_time_end=end,
timezone=timezone,
)
return msg_id
async def set_remote_sleep_wake(
self,
*,
device_id: str,
user_id: int,
switch: Literal["on", "off"],
) -> str:
await self.ensure_device_access(device_id=device_id, user_id=user_id)
from handlers.mqtt_handler import TalkingQMQTTService
service = await TalkingQMQTTService.get_instance()
if service is None:
raise HTTPException(status_code=503, detail="MQTT 服务未初始化")
return await service.send_remote_sleep_wake_command(device_id, switch)
# 创建全局 DeviceService 实例
device_service = DeviceService()

View File

@@ -0,0 +1,47 @@
from collections.abc import Mapping
from typing import Any
from banban.dao.device_alarm import DeviceAlarmDAO
from services.database_service_base import DatabaseServiceBase
class DeviceAlarmService(DatabaseServiceBase):
def __init__(self):
super().__init__(service_name="device_alarm_service")
async def record_alarm_event(self, *, device_id: str, source_msg_id: str = "010") -> int | None:
db_session = await self.get_session()
try:
dao = DeviceAlarmDAO(db_session)
binding = await dao.get_active_binding_context(device_id=device_id)
if not binding:
return None
return await dao.create(
device_id=device_id,
owner_user_id=int(binding["owner_user_id"]) if binding.get("owner_user_id") is not None else None,
child_id=int(binding["child_id"]) if binding.get("child_id") is not None else None,
source_msg_id=source_msg_id,
)
finally:
await db_session.close()
async def list_device_alarms(
self,
*,
device_id: str,
owner_user_id: int,
limit: int,
) -> list[Mapping[str, Any]]:
db_session = await self.get_session()
try:
dao = DeviceAlarmDAO(db_session)
return await dao.list_by_device(
device_id=device_id,
owner_user_id=owner_user_id,
limit=limit,
)
finally:
await db_session.close()
device_alarm_service = DeviceAlarmService()

View File

@@ -93,7 +93,14 @@ class DeviceSettingService(DatabaseServiceBase):
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:
async def insert_or_update(
self,
device_id: str,
power: Optional[int],
volume: Optional[int],
signal_strength: Optional[int],
version_str: Optional[str],
) -> None:
try:
current_row = await self.get_setting_by_device_id(device_id=device_id)
if current_row:
@@ -103,5 +110,33 @@ class DeviceSettingService(DatabaseServiceBase):
finally:
pass
async def upsert_sleep_schedule(
self,
*,
device_id: str,
sleep_mode: int,
disable_time_start: time,
disable_time_end: time,
timezone: str,
) -> None:
current_row = await self.get_setting_by_device_id(device_id=device_id)
if current_row:
await self.update_setting(
device_id=device_id,
sleep_mode=sleep_mode,
disable_time_start=disable_time_start,
disable_time_end=disable_time_end,
timezone=timezone,
)
return
await self.create_setting(
device_id=device_id,
sleep_mode=sleep_mode,
disable_time_start=disable_time_start,
disable_time_end=disable_time_end,
timezone=timezone,
)
# 创建全局 DeviceSettingService 实例
device_setting_service = DeviceSettingService()
device_setting_service = DeviceSettingService()