diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index 71c0c6a..0630303 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -16,12 +16,15 @@ from app.models.order import ( ) from app.models.database import get_db 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.models.coupon import UserCouponDB, CouponStatus from datetime import datetime, timezone from app.core.config import settings 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() @@ -112,28 +115,70 @@ async def create_shipping_order( return error_response(code=500, message=f"订单创建失败: {str(e)}") @router.get("/{orderid}", response_model=ResponseModel) -async def get_order( +async def get_order_detail( 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 + # 使用 join 查询获取订单和相关地址信息 + order = db.query( + ShippingOrderDB, + 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() if not order: 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( ShippingOrderPackageDB.orderid == orderid ).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={ - "order": OrderInfo.model_validate(order), + "order": order_data, "packages": [OrderPackageInfo.model_validate(p) for p in packages] })