订单详情返回配送信息

This commit is contained in:
aaron 2025-01-13 20:55:36 +08:00
parent 16f5fcf9d6
commit 1d10986d93

View File

@ -16,12 +16,15 @@ from app.models.order import (
) )
from app.models.database import get_db from app.models.database import get_db
from app.api.deps import get_current_user, get_deliveryman_user from app.api.deps import get_current_user, get_deliveryman_user
from app.models.user import UserDB from app.models.user import UserDB,UserRole
from app.core.response import success_response, error_response, ResponseModel from app.core.response import success_response, error_response, ResponseModel
from app.models.coupon import UserCouponDB, CouponStatus from app.models.coupon import UserCouponDB, CouponStatus
from datetime import datetime, timezone from datetime import datetime, timezone
from app.core.config import settings from app.core.config import settings
from app.models.address import AddressDB from app.models.address import AddressDB
from sqlalchemy.orm import joinedload
from app.models.community import CommunityDB
from app.models.community_building import CommunityBuildingDB
router = APIRouter() router = APIRouter()
@ -112,28 +115,70 @@ async def create_shipping_order(
return error_response(code=500, message=f"订单创建失败: {str(e)}") return error_response(code=500, message=f"订单创建失败: {str(e)}")
@router.get("/{orderid}", response_model=ResponseModel) @router.get("/{orderid}", response_model=ResponseModel)
async def get_order( async def get_order_detail(
orderid: str, orderid: str,
db: Session = Depends(get_db), db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user) current_user: UserDB = Depends(get_current_user)
): ):
"""获取订单详情""" """获取订单详情"""
# 查询订单 # 使用 join 查询获取订单和相关地址信息
order = db.query(ShippingOrderDB).filter( order = db.query(
ShippingOrderDB.orderid == orderid, ShippingOrderDB,
ShippingOrderDB.userid == current_user.userid AddressDB.name.label('address_name'),
AddressDB.phone.label('address_phone'),
AddressDB.address_detail.label('address_detail'),
CommunityBuildingDB.building_name.label('building_name'),
CommunityDB.name.label('community_name')
).join(
AddressDB,
ShippingOrderDB.addressid == AddressDB.id
).join(
CommunityBuildingDB,
AddressDB.community_building_id == CommunityBuildingDB.id
).join(
CommunityDB,
CommunityBuildingDB.community_id == CommunityDB.id
).filter(
ShippingOrderDB.orderid == orderid
).first() ).first()
if not order: if not order:
return error_response(code=404, message="订单不存在") return error_response(code=404, message="订单不存在")
# 检查权限
if order.ShippingOrderDB.userid != current_user.userid and UserRole.ADMIN not in current_user.roles:
return error_response(code=403, message="无权查看此订单")
# 查询包裹信息 # 查询包裹信息
packages = db.query(ShippingOrderPackageDB).filter( packages = db.query(ShippingOrderPackageDB).filter(
ShippingOrderPackageDB.orderid == orderid ShippingOrderPackageDB.orderid == orderid
).all() ).all()
# 构建响应数据
order_data = {
"orderid": order.ShippingOrderDB.orderid,
"userid": order.ShippingOrderDB.userid,
"addressid": order.ShippingOrderDB.addressid,
"package_count": order.ShippingOrderDB.package_count,
"original_amount": order.ShippingOrderDB.original_amount,
"coupon_discount_amount": order.ShippingOrderDB.coupon_discount_amount,
"coupon_id": order.ShippingOrderDB.coupon_id,
"final_amount": order.ShippingOrderDB.final_amount,
"status": order.ShippingOrderDB.status,
"complete_images": order.ShippingOrderDB.complete_images.split(",") if order.ShippingOrderDB.complete_images else None,
"create_time": order.ShippingOrderDB.create_time,
"delivery_method": order.ShippingOrderDB.delivery_method,
"deliveryman_user_id": order.ShippingOrderDB.deliveryman_user_id,
# 地址相关信息
"address_name": order.address_name,
"address_phone": order.address_phone,
"address_detail": order.address_detail,
"building_name": order.building_name,
"community_name": order.community_name
}
return success_response(data={ return success_response(data={
"order": OrderInfo.model_validate(order), "order": order_data,
"packages": [OrderPackageInfo.model_validate(p) for p in packages] "packages": [OrderPackageInfo.model_validate(p) for p in packages]
}) })