"""订单调整记录 CRUD""" from typing import Optional, List, Dict, Any from sqlalchemy.orm import Session from sqlalchemy import and_ from app.core.utils import generate_id from app.core.database import Base from app.crud.base import CRUDBase from app.models.models import BizOrderAdjust, BizOrderAdjustHis class OrderAdjustCRUD(CRUDBase[BizOrderAdjust]): """订单调整记录CRUD""" def __init__(self): super().__init__(BizOrderAdjust) def create_adjust( self, db: Session, order_id: str, order_item_id: str, adjust_type: str, before_quantity: float, after_quantity: float, before_amount: float, after_amount: float, reason: str, operator_id: str, operator_name: str, substitute_product_id: str = None, create_by: str = None, create_name: str = None ) -> BizOrderAdjust: """创建订单调整记录""" data = { "id": generate_id(), "order_id": order_id, "order_item_id": order_item_id, "adjust_type": adjust_type, "before_quantity": before_quantity, "after_quantity": after_quantity, "before_amount": before_amount, "after_amount": after_amount, "difference_amount": before_amount - after_amount, "reason": reason, "operator_id": operator_id, "operator_name": operator_name, "substitute_product_id": substitute_product_id, "create_by": create_by or operator_id, "create_name": create_name or operator_name } return self.create(db, data) def get_by_order(self, db: Session, order_id: str) -> List[BizOrderAdjust]: """获取订单的所有调整记录""" return db.query(self.model).filter( and_( self.model.order_id == order_id, self.model.is_del == 0 ) ).order_by(self.model.create_at.desc()).all() def get_by_order_item(self, db: Session, order_item_id: str) -> List[BizOrderAdjust]: """获取订单项的所有调整记录""" return db.query(self.model).filter( and_( self.model.order_item_id == order_item_id, self.model.is_del == 0 ) ).order_by(self.model.create_at.desc()).all() def get_total_adjust_amount(self, db: Session, order_id: str) -> float: """获取订单的总调整金额(负数表示退款)""" records = self.get_by_order(db, order_id) return sum(r.difference_amount or 0 for r in records) def get_list( self, db: Session, page: int = 1, pageSize: int = 10, keyword: Optional[str] = None, adjust_type: Optional[str] = None, start_date: Optional[str] = None, end_date: Optional[str] = None ) -> tuple: """获取订单调整列表(支持分页和搜索)""" query = db.query(self.model).filter(self.model.is_del == 0) # 关键词搜索(搜索订单号) if keyword: query = query.filter(self.model.order_id.like(f"%{keyword}%")) # 调整类型筛选 if adjust_type: query = query.filter(self.model.adjust_type == adjust_type) # 日期范围筛选 if start_date: query = query.filter(self.model.create_at >= start_date) if end_date: query = query.filter(self.model.create_at <= f"{end_date} 23:59:59") # 获取总数 total = query.count() # 分页 offset = (page - 1) * pageSize records = query.order_by(self.model.create_at.desc()).offset(offset).limit(pageSize).all() return records, total def create_adjust_history( self, db: Session, original_record: BizOrderAdjust, operator_id: str, operator_name: str ) -> BizOrderAdjustHis: """创建订单调整历史记录""" from app.crud.base import HistoryCRUD history_crud = HistoryCRUD(BizOrderAdjustHis) data = { "id": generate_id(), "order_id": original_record.order_id, "order_item_id": original_record.order_item_id, "adjust_type": original_record.adjust_type, "before_quantity": original_record.before_quantity, "after_quantity": original_record.after_quantity, "before_amount": original_record.before_amount, "after_amount": original_record.after_amount, "difference_amount": original_record.difference_amount, "reason": original_record.reason, "substitute_product_id": original_record.substitute_product_id, "operator_id": operator_id, "operator_name": operator_name, "create_by": original_record.create_by, "create_name": original_record.create_name } return history_crud.create(db, data) # 全局实例 order_adjust_crud = OrderAdjustCRUD()