| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- """商品分类CRUD"""
- from typing import Optional, List
- from sqlalchemy.orm import Session
- from sqlalchemy import and_
- from app.models.models import BasProductCategory, BasProductCategoryHis
- from app.crud.base import CRUDBase
- class CategoryCRUD(CRUDBase[BasProductCategory]):
- """商品分类CRUD操作"""
- def get_by_name(self, db: Session, name: str, parent_id: str = None) -> Optional[BasProductCategory]:
- """根据名称获取分类"""
- query = db.query(BasProductCategory).filter(
- and_(BasProductCategory.name == name, BasProductCategory.is_del == 0)
- )
- if parent_id:
- query = query.filter(BasProductCategory.parent_id == parent_id)
- else:
- query = query.filter(BasProductCategory.parent_id.is_(None))
- return query.first()
- def get_active_all(self, db: Session) -> List[BasProductCategory]:
- """获取所有启用的分类"""
- return db.query(BasProductCategory).filter(
- and_(BasProductCategory.is_del == 0, BasProductCategory.is_active == True)
- ).order_by(BasProductCategory.sort_order.asc()).all()
- def get_children(self, db: Session, parent_id: str) -> List[BasProductCategory]:
- """获取子分类"""
- return db.query(BasProductCategory).filter(
- and_(BasProductCategory.parent_id == parent_id, BasProductCategory.is_del == 0)
- ).order_by(BasProductCategory.sort_order.asc()).all()
- def get_tree(self, db: Session) -> List[dict]:
- """获取分类树"""
- all_categories = self.get_active_all(db)
- return self._build_tree(all_categories, None)
- def _build_tree(self, categories: List[BasProductCategory], parent_id: str = None) -> List[dict]:
- """构建树形结构"""
- tree = []
- for cat in categories:
- if cat.parent_id == parent_id:
- pc = getattr(cat, "price_coefficient", None)
- node = {
- "id": cat.id,
- "name": cat.name,
- "parentId": cat.parent_id,
- "sortOrder": cat.sort_order,
- "priceCoefficient": float(pc) if pc is not None else 0.0,
- "isActive": cat.is_active,
- "children": self._build_tree(categories, cat.id)
- }
- tree.append(node)
- return tree
- def update_with_history(self, db: Session, id: str, obj_in: dict, updater: dict = None) -> Optional[BasProductCategory]:
- """更新分类并记录历史"""
- original = self.get(db, id)
- if not original:
- return None
- pc_hist = getattr(original, "price_coefficient", None)
- his_data = {
- "id": original.id,
- "name": original.name,
- "image_url": getattr(original, "image_url", None),
- "parent_id": original.parent_id,
- "sort_order": original.sort_order,
- "price_coefficient": pc_hist if pc_hist is not None else 0,
- "is_active": original.is_active,
- "create_at": original.create_at,
- "create_by": original.create_by,
- "create_name": original.create_name,
- "update_at": original.update_at,
- "update_by": original.update_by,
- }
- his = BasProductCategoryHis(**his_data)
- db.add(his)
- return self.update(db, id, obj_in, updater)
- def soft_delete_with_history(self, db: Session, id: str) -> bool:
- """删除分类并记录历史"""
- original = self.get(db, id)
- if not original:
- return False
- pc_hist = getattr(original, "price_coefficient", None)
- his_data = {
- "id": original.id,
- "name": original.name,
- "image_url": getattr(original, "image_url", None),
- "parent_id": original.parent_id,
- "sort_order": original.sort_order,
- "price_coefficient": pc_hist if pc_hist is not None else 0,
- "is_active": original.is_active,
- "create_at": original.create_at,
- "create_by": original.create_by,
- "create_name": original.create_name,
- "update_at": original.update_at,
- "update_by": original.update_by,
- }
- his = BasProductCategoryHis(**his_data)
- db.add(his)
- return self.delete(db, id)
- category_crud = CategoryCRUD(BasProductCategory)
|