Files

101 lines
3.5 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
大屏素材服务
"""
import logging
from typing import List
from sqlalchemy import select, func, delete
from sqlalchemy.ext.asyncio import AsyncSession
from app.base_service import BaseService
from online_dev.screen_design.material_model import ScreenMaterialCategory, ScreenMaterial
from online_dev.screen_design.material_schema import (
MaterialCategoryCreateIn, MaterialCategoryUpdateIn,
MaterialCreateIn, MaterialUpdateIn,
)
logger = logging.getLogger(__name__)
class MaterialCategoryService(BaseService[ScreenMaterialCategory, MaterialCategoryCreateIn, MaterialCategoryUpdateIn]):
"""素材分类服务"""
model = ScreenMaterialCategory
@classmethod
async def get_all(cls, db: AsyncSession) -> List[ScreenMaterialCategory]:
"""获取所有素材分类"""
stmt = select(ScreenMaterialCategory).where(
ScreenMaterialCategory.is_deleted == False
).order_by(ScreenMaterialCategory.sort.asc(), ScreenMaterialCategory.sys_create_datetime.desc())
result = await db.execute(stmt)
return list(result.scalars().all())
@classmethod
async def check_code_exists(cls, db: AsyncSession, code: str, exclude_id: str = None) -> bool:
"""检查编码是否存在"""
stmt = select(ScreenMaterialCategory).where(
ScreenMaterialCategory.code == code,
ScreenMaterialCategory.is_deleted == False,
)
if exclude_id:
stmt = stmt.where(ScreenMaterialCategory.id != exclude_id)
result = await db.execute(stmt)
return result.scalar_one_or_none() is not None
@classmethod
async def get_material_count(cls, db: AsyncSession, category_id: str) -> int:
"""获取分类下的素材数量"""
stmt = select(func.count()).where(
ScreenMaterial.category_id == category_id,
ScreenMaterial.is_deleted == False,
)
result = await db.execute(stmt)
return result.scalar() or 0
@classmethod
async def delete_with_materials(cls, db: AsyncSession, category_id: str) -> bool:
"""删除分类及其下的所有素材"""
# 删除分类下的所有素材(硬删除)
await db.execute(
delete(ScreenMaterial).where(ScreenMaterial.category_id == category_id)
)
# 删除分类(硬删除)
await db.execute(
delete(ScreenMaterialCategory).where(ScreenMaterialCategory.id == category_id)
)
return True
class MaterialService(BaseService[ScreenMaterial, MaterialCreateIn, MaterialUpdateIn]):
"""素材服务"""
model = ScreenMaterial
@classmethod
async def get_list_by_category(
cls,
db: AsyncSession,
category_id: str = None,
) -> List[ScreenMaterial]:
"""获取素材列表"""
stmt = select(ScreenMaterial).where(ScreenMaterial.is_deleted == False)
if category_id:
stmt = stmt.where(ScreenMaterial.category_id == category_id)
stmt = stmt.order_by(ScreenMaterial.sort.asc(), ScreenMaterial.sys_create_datetime.desc())
result = await db.execute(stmt)
return list(result.scalars().all())
@classmethod
async def batch_delete(cls, db: AsyncSession, material_ids: List[str]) -> int:
"""批量删除素材(硬删除)"""
stmt = delete(ScreenMaterial).where(ScreenMaterial.id.in_(material_ids))
result = await db.execute(stmt)
return result.rowcount