Files
shanxia2.0/backend/app/models/order.py
T
2026-05-12 16:35:07 +08:00

167 lines
8.2 KiB
Python

"""订单相关模型"""
from datetime import datetime
from sqlalchemy import Boolean, Column, DateTime, Integer, String, Enum as SQLEnum, Numeric, Text, ForeignKey
from sqlalchemy.orm import relationship
from app.core.database import Base
import enum
class OrderStatus(str, enum.Enum):
"""订单主状态"""
PENDING_PAYMENT = "pending_payment" # 待支付
PENDING_CONFIRM = "pending_confirm" # 待客户确认收货
COMPLETED = "completed" # 已完结
CANCELLED = "cancelled" # 已取消
class PaymentMethod(str, enum.Enum):
"""支付方式"""
WECHAT = "wechat" # 微信支付
OFFLINE = "offline" # 线下结算
class Order(Base):
"""订单主表"""
__tablename__ = "orders"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
order_no = Column(String(50), unique=True, nullable=False, comment="订单编号")
region_id = Column(Integer, nullable=False, comment="区域ID")
client_id = Column(Integer, nullable=False, comment="客户ID")
price_list_id = Column(Integer, nullable=False, comment="使用的价格清单ID")
price_version = Column(Integer, nullable=False, comment="价格版本号")
status = Column(SQLEnum(OrderStatus), default=OrderStatus.PENDING_PAYMENT, comment="订单状态")
payment_method = Column(SQLEnum(PaymentMethod), nullable=True, comment="支付方式")
total_amount = Column(Numeric(12, 2), default=0, comment="订单总金额")
paid_amount = Column(Numeric(12, 2), default=0, comment="已付金额")
receivable_amount = Column(Numeric(12, 2), default=0, comment="应收金额")
refund_amount = Column(Numeric(12, 2), default=0, comment="退款金额")
contact_person = Column(String(100), nullable=True, comment="联系人")
contact_phone = Column(String(20), nullable=True, comment="联系电话")
delivery_address = Column(String(500), nullable=True, comment="配送地址")
cancel_reason = Column(String(500), nullable=True, comment="取消原因")
cancel_review_time = Column(DateTime, nullable=True, comment="取消审核时间")
cancel_reviewed_by = Column(Integer, nullable=True, comment="取消审核人ID")
cancel_review_note = Column(String(500), nullable=True, comment="取消审核备注")
completed_time = Column(DateTime, nullable=True, comment="完结时间")
completed_by = Column(Integer, nullable=True, comment="完结人ID")
remark = Column(Text, nullable=True, comment="订单备注")
payment_time = Column(DateTime, nullable=True, comment="支付时间")
delivery_assign_time = Column(DateTime, nullable=True, comment="配送分配时间")
created_at = Column(DateTime, default=datetime.utcnow, comment="创建时间")
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间")
# 关联
client = relationship("Client", back_populates="orders")
items = relationship("OrderItem", back_populates="order")
delivery_task = relationship("DeliveryTask", back_populates="order", uselist=False)
status_logs = relationship("OrderStatusLog", back_populates="order")
class OrderItem(Base):
"""订单项表"""
__tablename__ = "order_items"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
order_id = Column(Integer, nullable=False, comment="订单ID")
product_id = Column(Integer, nullable=False, comment="商品ID")
unit_id = Column(Integer, nullable=False, comment="单位ID")
quantity = Column(Numeric(12, 4), default=0, comment="数量")
unit_price = Column(Numeric(10, 2), nullable=False, comment="单价")
amount = Column(Numeric(12, 2), default=0, comment="金额")
delivered_quantity = Column(Numeric(12, 4), default=0, comment="已配送数量")
status = Column(String(20), default="normal", comment="项状态:normal-正常,reduced-已减量,deleted-已删除,substituted-已替代")
note = Column(String(500), nullable=True, comment="备注(如缺货原因)")
created_at = Column(DateTime, default=datetime.utcnow, comment="创建时间")
order = relationship("Order", back_populates="items")
product = relationship("Product", back_populates="order_items")
class OrderStatusLog(Base):
"""订单状态变更日志"""
__tablename__ = "order_status_logs"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
order_id = Column(Integer, nullable=False, comment="订单ID")
from_status = Column(String(30), nullable=True, comment="变更前状态")
to_status = Column(String(30), nullable=False, comment="变更后状态")
operator_id = Column(Integer, nullable=False, comment="操作人ID")
operator_role = Column(String(20), nullable=False, comment="操作人角色")
reason = Column(String(500), nullable=True, comment="变更原因")
note = Column(String(1000), nullable=True, comment="备注")
created_at = Column(DateTime, default=datetime.utcnow, comment="创建时间")
order = relationship("Order", back_populates="status_logs")
class DeliveryTask(Base):
"""配送任务表"""
__tablename__ = "delivery_tasks"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
task_no = Column(String(50), unique=True, nullable=False, comment="配送单编号")
order_id = Column(Integer, nullable=False, comment="订单ID")
region_id = Column(Integer, nullable=False, comment="区域ID")
supplier_id = Column(Integer, nullable=False, comment="供应商ID")
deliver_id = Column(Integer, nullable=True, comment="配送员ID")
status = Column(String(20), default="pending", comment="状态:pending-待取货,picking-取货中,delivering-配送中,completed-已完成,cancelled-已取消")
deliverer_status = Column(String(20), default="pending_pickup", comment="配送员状态: pending_pickup/delivering/delivered")
supplier_prepare_status = Column(String(20), default="pending_prepare", comment="供应商备货状态: pending_prepare/prepared/picked_up")
pickup_time = Column(DateTime, nullable=True, comment="取货时间")
pickup_remark = Column(String(500), nullable=True, comment="取货备注")
pickup_image_url = Column(String(500), nullable=True, comment="取货凭证图片")
delivery_time = Column(DateTime, nullable=True, comment="送达时间")
delivery_remark = Column(String(500), nullable=True, comment="送达备注")
delivery_image_url = Column(String(500), nullable=True, comment="送达凭证图片")
expire_warning_sent = Column(Boolean, default=False, comment="是否已发送过期预警")
created_at = Column(DateTime, default=datetime.utcnow, comment="创建时间")
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间")
# 关联
order = relationship("Order", back_populates="delivery_task")
supplier = relationship("Supplier", back_populates="delivery_tasks")
deliver = relationship("Deliver", back_populates="delivery_tasks")
class Settlement(Base):
"""线下结算记录表"""
__tablename__ = "settlements"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
order_id = Column(Integer, nullable=False, comment="订单ID")
client_id = Column(Integer, nullable=False, comment="客户ID")
region_id = Column(Integer, nullable=False, comment="区域ID")
amount = Column(Numeric(12, 2), nullable=False, comment="结算金额")
settlement_method = Column(String(20), nullable=False, comment="结算方式:transfer-转账,cash-现金,other-其他")
settlement_time = Column(DateTime, nullable=True, comment="结算时间")
settlement_file_url = Column(String(500), nullable=True, comment="结算凭证文件URL")
settlement_note = Column(String(500), nullable=True, comment="结算备注")
status = Column(String(20), default="pending", comment="状态:pending-待确认,completed-已完成")
reviewed_by = Column(Integer, nullable=True, comment="审核人ID")
reviewed_time = Column(DateTime, nullable=True, comment="审核时间")
created_by = Column(Integer, nullable=False, comment="创建人ID")
created_at = Column(DateTime, default=datetime.utcnow, comment="创建时间")