135 lines
4.1 KiB
Python
135 lines
4.1 KiB
Python
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]) |