address.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. """地址CRUD"""
  2. from typing import Optional, List, Tuple
  3. from sqlalchemy.orm import Session
  4. from sqlalchemy import and_
  5. from app.models.models import BasAddress, BasAddressHis
  6. from app.crud.base import CRUDBase
  7. class AddressCRUD(CRUDBase[BasAddress]):
  8. """地址CRUD操作"""
  9. def get_by_user(self, db: Session, user_id: str) -> List[BasAddress]:
  10. """获取用户的所有地址"""
  11. return db.query(BasAddress).filter(
  12. and_(BasAddress.user_id == user_id, BasAddress.is_del == 0)
  13. ).order_by(BasAddress.is_default.desc(), BasAddress.create_at.desc()).all()
  14. def get_by_user_paged(
  15. self, db: Session, user_id: str, skip: int = 0, limit: int = 20
  16. ) -> Tuple[List[BasAddress], int]:
  17. """分页获取用户地址(默认优先、再按创建时间倒序)"""
  18. q = db.query(BasAddress).filter(
  19. and_(BasAddress.user_id == user_id, BasAddress.is_del == 0)
  20. )
  21. total = q.count()
  22. rows = (
  23. q.order_by(BasAddress.is_default.desc(), BasAddress.create_at.desc())
  24. .offset(skip)
  25. .limit(limit)
  26. .all()
  27. )
  28. return rows, total
  29. def get_by_user_and_type(self, db: Session, user_id: str, address_type: str) -> List[BasAddress]:
  30. """获取用户指定类型的地址"""
  31. return db.query(BasAddress).filter(
  32. and_(BasAddress.user_id == user_id, BasAddress.address_type == address_type, BasAddress.is_del == 0)
  33. ).order_by(BasAddress.is_default.desc(), BasAddress.create_at.desc()).all()
  34. def get_default(self, db: Session, user_id: str, address_type: str = None) -> Optional[BasAddress]:
  35. """获取用户默认地址"""
  36. query = db.query(BasAddress).filter(
  37. and_(BasAddress.user_id == user_id, BasAddress.is_default == True, BasAddress.is_del == 0)
  38. )
  39. if address_type:
  40. query = query.filter(BasAddress.address_type == address_type)
  41. return query.first()
  42. def set_default(self, db: Session, user_id: str, address_id: str) -> bool:
  43. """设置默认地址"""
  44. # 先取消所有默认地址
  45. db.query(BasAddress).filter(
  46. and_(BasAddress.user_id == user_id, BasAddress.is_default == True)
  47. ).update({"is_default": False})
  48. # 设置新的默认地址
  49. address = self.get(db, address_id)
  50. if address and address.user_id == user_id:
  51. address.is_default = True
  52. db.commit()
  53. return True
  54. return False
  55. def update_with_history(self, db: Session, id: str, obj_in: dict, updater: dict = None) -> Optional[BasAddress]:
  56. """更新地址并记录历史"""
  57. original = self.get(db, id)
  58. if not original:
  59. return None
  60. his_data = {
  61. "id": original.id,
  62. "user_id": original.user_id,
  63. "address_type": original.address_type,
  64. "contact_person": original.contact_person,
  65. "contact_phone": original.contact_phone,
  66. "province": original.province,
  67. "city": original.city,
  68. "district": original.district,
  69. "detail_address": original.detail_address,
  70. "is_default": original.is_default,
  71. "create_at": original.create_at,
  72. "create_by": original.create_by,
  73. "create_name": original.create_name,
  74. "update_at": original.update_at,
  75. "update_by": original.update_by,
  76. }
  77. his = BasAddressHis(**his_data)
  78. db.add(his)
  79. return self.update(db, id, obj_in, updater)
  80. def soft_delete_with_history(self, db: Session, id: str) -> bool:
  81. """删除地址并记录历史"""
  82. original = self.get(db, id)
  83. if not original:
  84. return False
  85. his_data = {
  86. "id": original.id,
  87. "user_id": original.user_id,
  88. "address_type": original.address_type,
  89. "contact_person": original.contact_person,
  90. "contact_phone": original.contact_phone,
  91. "province": original.province,
  92. "city": original.city,
  93. "district": original.district,
  94. "detail_address": original.detail_address,
  95. "is_default": original.is_default,
  96. "create_at": original.create_at,
  97. "create_by": original.create_by,
  98. "create_name": original.create_name,
  99. "update_at": original.update_at,
  100. "update_by": original.update_by,
  101. }
  102. his = BasAddressHis(**his_data)
  103. db.add(his)
  104. return self.delete(db, id)
  105. address_crud = AddressCRUD(BasAddress)