order_adjust.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. """订单调整记录 CRUD"""
  2. from typing import Optional, List, Dict, Any
  3. from sqlalchemy.orm import Session
  4. from sqlalchemy import and_
  5. from app.core.utils import generate_id
  6. from app.core.database import Base
  7. from app.crud.base import CRUDBase
  8. from app.models.models import BizOrderAdjust, BizOrderAdjustHis
  9. class OrderAdjustCRUD(CRUDBase[BizOrderAdjust]):
  10. """订单调整记录CRUD"""
  11. def __init__(self):
  12. super().__init__(BizOrderAdjust)
  13. def create_adjust(
  14. self,
  15. db: Session,
  16. order_id: str,
  17. order_item_id: str,
  18. adjust_type: str,
  19. before_quantity: float,
  20. after_quantity: float,
  21. before_amount: float,
  22. after_amount: float,
  23. reason: str,
  24. operator_id: str,
  25. operator_name: str,
  26. substitute_product_id: str = None,
  27. create_by: str = None,
  28. create_name: str = None
  29. ) -> BizOrderAdjust:
  30. """创建订单调整记录"""
  31. data = {
  32. "id": generate_id(),
  33. "order_id": order_id,
  34. "order_item_id": order_item_id,
  35. "adjust_type": adjust_type,
  36. "before_quantity": before_quantity,
  37. "after_quantity": after_quantity,
  38. "before_amount": before_amount,
  39. "after_amount": after_amount,
  40. "difference_amount": before_amount - after_amount,
  41. "reason": reason,
  42. "operator_id": operator_id,
  43. "operator_name": operator_name,
  44. "substitute_product_id": substitute_product_id,
  45. "create_by": create_by or operator_id,
  46. "create_name": create_name or operator_name
  47. }
  48. return self.create(db, data)
  49. def get_by_order(self, db: Session, order_id: str) -> List[BizOrderAdjust]:
  50. """获取订单的所有调整记录"""
  51. return db.query(self.model).filter(
  52. and_(
  53. self.model.order_id == order_id,
  54. self.model.is_del == 0
  55. )
  56. ).order_by(self.model.create_at.desc()).all()
  57. def get_by_order_item(self, db: Session, order_item_id: str) -> List[BizOrderAdjust]:
  58. """获取订单项的所有调整记录"""
  59. return db.query(self.model).filter(
  60. and_(
  61. self.model.order_item_id == order_item_id,
  62. self.model.is_del == 0
  63. )
  64. ).order_by(self.model.create_at.desc()).all()
  65. def get_total_adjust_amount(self, db: Session, order_id: str) -> float:
  66. """获取订单的总调整金额(负数表示退款)"""
  67. records = self.get_by_order(db, order_id)
  68. return sum(r.difference_amount or 0 for r in records)
  69. def get_list(
  70. self,
  71. db: Session,
  72. page: int = 1,
  73. pageSize: int = 10,
  74. keyword: Optional[str] = None,
  75. adjust_type: Optional[str] = None,
  76. start_date: Optional[str] = None,
  77. end_date: Optional[str] = None
  78. ) -> tuple:
  79. """获取订单调整列表(支持分页和搜索)"""
  80. query = db.query(self.model).filter(self.model.is_del == 0)
  81. # 关键词搜索(搜索订单号)
  82. if keyword:
  83. query = query.filter(self.model.order_id.like(f"%{keyword}%"))
  84. # 调整类型筛选
  85. if adjust_type:
  86. query = query.filter(self.model.adjust_type == adjust_type)
  87. # 日期范围筛选
  88. if start_date:
  89. query = query.filter(self.model.create_at >= start_date)
  90. if end_date:
  91. query = query.filter(self.model.create_at <= f"{end_date} 23:59:59")
  92. # 获取总数
  93. total = query.count()
  94. # 分页
  95. offset = (page - 1) * pageSize
  96. records = query.order_by(self.model.create_at.desc()).offset(offset).limit(pageSize).all()
  97. return records, total
  98. def create_adjust_history(
  99. self,
  100. db: Session,
  101. original_record: BizOrderAdjust,
  102. operator_id: str,
  103. operator_name: str
  104. ) -> BizOrderAdjustHis:
  105. """创建订单调整历史记录"""
  106. from app.crud.base import HistoryCRUD
  107. history_crud = HistoryCRUD(BizOrderAdjustHis)
  108. data = {
  109. "id": generate_id(),
  110. "order_id": original_record.order_id,
  111. "order_item_id": original_record.order_item_id,
  112. "adjust_type": original_record.adjust_type,
  113. "before_quantity": original_record.before_quantity,
  114. "after_quantity": original_record.after_quantity,
  115. "before_amount": original_record.before_amount,
  116. "after_amount": original_record.after_amount,
  117. "difference_amount": original_record.difference_amount,
  118. "reason": original_record.reason,
  119. "substitute_product_id": original_record.substitute_product_id,
  120. "operator_id": operator_id,
  121. "operator_name": operator_name,
  122. "create_by": original_record.create_by,
  123. "create_name": original_record.create_name
  124. }
  125. return history_crud.create(db, data)
  126. # 全局实例
  127. order_adjust_crud = OrderAdjustCRUD()