import os import uuid from datetime import datetime import aiofiles import cv2 from sqlalchemy.ext.asyncio import AsyncSession from entity.alarm_record import AlarmRecordCreate, AlarmRecord from sqlmodel import select, delete from sqlalchemy import func class AlarmRecordService: def __init__(self, db: AsyncSession): self.db = db async def add_alarm(self, alarm_data:AlarmRecordCreate, alarm_np_img): async def save_alarm_file(): # 生成当前年月日作为目录路径 current_date = datetime.now().strftime('%Y-%m-%d') # 生成随机 UUID 作为文件名 file_name = f"{uuid.uuid4()}.jpeg" # 创建保存图片的完整路径 save_path = os.path.join('./storage/alarms', current_date, file_name) # 创建目录(如果不存在) os.makedirs(os.path.dirname(save_path), exist_ok=True) # 将 frame_data 转换为二进制数据(假设 frame_data 是一个 numpy 数组) _, encoded_image = cv2.imencode('.jpeg', alarm_np_img) image_data = encoded_image.tobytes() # 使用 aiofiles 进行异步写入 async with aiofiles.open(save_path, 'wb') as f: await f.write(image_data) return save_path # 异步保存图片文件 alarm_img_path = await save_alarm_file() # 创建并保存到数据库中 alarm_record = AlarmRecord.model_validate(alarm_data) alarm_record.alarm_image = alarm_img_path self.db.add(alarm_record) await self.db.commit() await self.db.refresh(alarm_record) return alarm_record async def delete_frame(self, max_alarm_id: int): statement = delete(AlarmRecord).where(AlarmRecord.id <= max_alarm_id) await self.db.execute(statement) await self.db.commit() return max_alarm_id async def select_max_id(self, latest_time): statement = select(func.max(AlarmRecord.id)).where(AlarmRecord.alarm_time < latest_time) result = await self.db.execute(statement) return result.scalar_one() or 0