feat: restore source parity and harden agent runtime
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user