#!/usr/bin/python # -*- coding: utf-8 -*- # @version : 1.0 # @Create Time : 2025/04/03 10:30 # @File : crud.py # @IDE : PyCharm # @desc : 数据访问层 from sqlalchemy.ext.asyncio import AsyncSession from core.crud import DalBase from . import schemas, models from utils.random_utils import random_str from utils import os_utils as os from application.settings import detect_url from utils.huawei_obs import MyObs from utils import status from core.exception import CustomException from fastapi import UploadFile class ProjectDetectDal(DalBase): def __init__(self, db: AsyncSession): super(ProjectDetectDal, self).__init__() self.db = db self.model = models.ProjectDetect self.schema = schemas.ProjectDetectOut async def check_name(self, name: str,project_id: int) -> bool: """ 校验推理集合名称 """ count = self.get_count( v_where=[models.ProjectDetect.project_id == project_id, models.ProjectDetect.detect_name == name]) return count > 0 async def add_detect(self, data: schemas.ProjectDetectIn): """ 新增集合 """ detect = models.ProjectDetect(**data.model_dump()) detect.detect_no = random_str(6) detect.detect_version = 0 detect.detect_status = '0' url = os.create_folder(detect_url, detect.detect_no, 'images') detect.folder_url = url await self.create_data(data) return detect async def delete_detects(self, ids: list[int]): """ 删除集合数据+文件夹的文件夹+每次推理日志的文件 """ for id_ in ids: detect_info = await self.get_data(data_id=id_) if detect_info.file_type != 'rtsp': os.delete_paths(detect_info.folder_url) logs = await ProjectDetectLogDal(self.db).get_datas(v_where=[models.ProjectDetectLog.detect_id == ids]) for log in logs: os.delete_paths(log.folder_url) await self.delete_datas(ids=ids, v_soft=False) class ProjectDetectFileDal(DalBase): def __init__(self, db: AsyncSession): super(ProjectDetectFileDal, self).__init__() self.db = db self.model = models.ProjectDetectFile self.schema = schemas.ProjectDetectFileOut async def file_count(self, detect_id: int) -> int: count = self.get_count(v_where=[models.ProjectDetectFile.detect_id == detect_id]) return count async def add_file(self, detect: models.ProjectDetect, files: list[UploadFile]): images = [] obs = MyObs() for file in files: image = models.ProjectDetectFile() image.detect_id = detect.id image.file_name = file.filename # 保存原图 path = os.save_images(detect.folder_url, file=file) image.image_url = path # 上传到obs object_key = detect.detect_no + '/' + file.filename success, key, url = obs.put_file(object_key=object_key, file_path=path) if success: image.object_key = object_key image.thumb_image_url = url else: raise CustomException("obs上传失败", code=status.HTTP_ERROR) images.append(image) await self.create_datas(images) async def delete_files(self, ids: list[int]): file_urls = [] object_keys = [] for id_ in ids: file = self.get_data(data_id=id_) if file: file_urls.append(file.file_url) object_keys.append(file.object_key) os.delete_paths(file_urls) MyObs().del_objects(object_keys) await self.delete_datas(ids, v_soft=False) class ProjectDetectLogDal(DalBase): def __init__(self, db: AsyncSession): super(ProjectDetectLogDal, self).__init__() self.db = db self.model = models.ProjectDetectLog self.schema = schemas.ProjectDetectLogSimpleOut class ProjectDetectLogFileDal(DalBase): def __init__(self, db: AsyncSession): super(ProjectDetectLogFileDal, self).__init__() self.db = db self.model = models.ProjectDetectLogFile self.schema = schemas.ProjectDetectLogFileOut