Newer
Older
safe-algo-pro / services / alarm_record_service.py
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


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