expense_item.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from sqlalchemy.orm import Session
  2. from app.models.expense_item import ExpenseItem
  3. from app.services.base import CrudService
  4. class ExpenseItemService:
  5. @staticmethod
  6. def get_by_id(db: Session, id: int) -> ExpenseItem | None:
  7. return CrudService.get_by_id(ExpenseItem, db, id)
  8. @staticmethod
  9. def get_paged(db: Session, page: int, page_size: int, filters: list | None = None):
  10. return CrudService.get_paged(ExpenseItem, db, page, page_size, filters)
  11. @staticmethod
  12. def create(db: Session, obj_in: dict) -> ExpenseItem:
  13. return CrudService.create(ExpenseItem, db, obj_in)
  14. @staticmethod
  15. def update(db: Session, id: int, obj_in: dict) -> ExpenseItem | None:
  16. return CrudService.update(ExpenseItem, db, id, obj_in)
  17. @staticmethod
  18. def soft_delete(db: Session, id: int) -> bool:
  19. return CrudService.soft_delete(ExpenseItem, db, id)
  20. @staticmethod
  21. def get_item_tree(db: Session) -> list[ExpenseItem]:
  22. items = (
  23. db.query(ExpenseItem)
  24. .filter(ExpenseItem.del_flag == 0)
  25. .order_by(ExpenseItem.sort_order)
  26. .all()
  27. )
  28. return ExpenseItemService._build_tree(items)
  29. @staticmethod
  30. def _build_tree(items: list[ExpenseItem]) -> list[ExpenseItem]:
  31. item_map = {item.id: item for item in items}
  32. roots: list[ExpenseItem] = []
  33. for item in items:
  34. if not item.parent_id or item.parent_id == 0:
  35. roots.append(item)
  36. else:
  37. parent = item_map.get(item.parent_id)
  38. if parent:
  39. if not hasattr(parent, "children") or parent.children is None:
  40. parent.children = []
  41. parent.children.append(item)
  42. for item in items:
  43. if hasattr(item, "children") and item.children:
  44. item.child_count = len(item.children)
  45. else:
  46. item.child_count = 0
  47. return roots