from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from typing import List from app.models.order import ( ShippingOrderDB, ShippingOrderPackageDB, OrderCreate, OrderInfo, OrderPackageInfo, generate_order_id ) from app.models.database import get_db from app.api.deps import get_current_user from app.models.user import UserDB from app.core.response import success_response, error_response, ResponseModel from app.models.coupon import UserCouponDB, CouponStatus from datetime import datetime, timezone router = APIRouter() @router.post("/", response_model=ResponseModel) async def create_shipping_order( order: OrderCreate, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """创建配送订单""" # 生成订单号 orderid = generate_order_id() # 计算优惠金额 coupon_discount = 0 if order.coupon_id: # 查询用户优惠券 user_coupon = db.query(UserCouponDB).filter( UserCouponDB.id == order.coupon_id, UserCouponDB.user_id == current_user.userid, UserCouponDB.status == CouponStatus.UNUSED, UserCouponDB.expire_time > datetime.now(timezone.utc) ).first() if not user_coupon: return error_response(code=400, message="优惠券无效或已过期") coupon_discount = user_coupon.coupon_amount # 更新优惠券状态 user_coupon.status = CouponStatus.USED # 计算最终金额 final_amount = max(0, order.original_amount - coupon_discount) # 创建订单 db_order = ShippingOrderDB( orderid=orderid, userid=current_user.userid, addressid=order.addressid, package_count=order.package_count, original_amount=order.original_amount, coupon_discount_amount=coupon_discount, coupon_id=order.coupon_id, final_amount=final_amount ) db.add(db_order) # 创建订单包裹 for package in order.packages: db_package = ShippingOrderPackageDB( orderid=orderid, station_id=package.station_id, pickup_codes=package.pickup_codes ) db.add(db_package) try: db.commit() db.refresh(db_order) # 查询包裹信息 packages = db.query(ShippingOrderPackageDB).filter( ShippingOrderPackageDB.orderid == orderid ).all() return success_response( message="订单创建成功", data={ "order": OrderInfo.model_validate(db_order), "packages": [OrderPackageInfo.model_validate(p) for p in packages] } ) except Exception as e: db.rollback() return error_response(code=500, message=f"订单创建失败: {str(e)}") @router.get("/{orderid}", response_model=ResponseModel) async def get_order( orderid: str, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """获取订单详情""" # 查询订单 order = db.query(ShippingOrderDB).filter( ShippingOrderDB.orderid == orderid, ShippingOrderDB.userid == current_user.userid ).first() if not order: return error_response(code=404, message="订单不存在") # 查询包裹信息 packages = db.query(ShippingOrderPackageDB).filter( ShippingOrderPackageDB.orderid == orderid ).all() return success_response(data={ "order": OrderInfo.model_validate(order), "packages": [OrderPackageInfo.model_validate(p) for p in packages] }) @router.get("/", response_model=ResponseModel) async def get_user_orders( skip: int = 0, limit: int = 10, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """获取用户的订单列表""" orders = db.query(ShippingOrderDB).filter( ShippingOrderDB.userid == current_user.userid ).order_by( ShippingOrderDB.create_time.desc() ).offset(skip).limit(limit).all() return success_response(data=[OrderInfo.model_validate(o) for o in orders])