From 67b04950cc227a3de5921e44164adf0079eb7ec9 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Tue, 28 Jan 2025 00:46:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20admin=20=E7=9A=84=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/order.py | 214 ++++++++++++++++++++++++++++++++++--- 1 file changed, 202 insertions(+), 12 deletions(-) diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index 78643fa..6f0ef8b 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -17,7 +17,7 @@ from app.models.order import ( OrderPriceResult ) 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, get_admin_user from app.models.user import UserDB,UserRole from app.core.response import success_response, error_response, ResponseModel from app.models.coupon import UserCouponDB, CouponStatus @@ -301,19 +301,98 @@ async def get_order_detail( @router.get("/user/list", response_model=ResponseModel) async def get_user_orders( + status: Optional[OrderStatus] = None, skip: int = 0, - limit: int = 10, + limit: int = 20, 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]) + """获取用户订单列表""" + try: + # 查询订单和地址信息 + query = db.query( + ShippingOrderDB, + AddressDB, + CommunityBuildingDB, + CommunityDB + ).join( + AddressDB, + ShippingOrderDB.addressid == AddressDB.id + ).join( + CommunityBuildingDB, + AddressDB.community_building_id == CommunityBuildingDB.id + ).join( + CommunityDB, + CommunityBuildingDB.community_id == CommunityDB.id + ).filter( + ShippingOrderDB.userid == current_user.userid + ) + + # 添加状态过滤 + if status: + query = query.filter(ShippingOrderDB.status == status) + + # 获取总数 + total = query.count() + + # 分页查询 + results = query.order_by( + ShippingOrderDB.create_time.desc() + ).offset(skip).limit(limit).all() + + orders = [] + for order, address, building, community in results: + # 查询订单包裹信息 + packages = db.query( + ShippingOrderPackageDB, + StationDB.name.label('station_name') + ).join( + StationDB, + ShippingOrderPackageDB.station_id == StationDB.id + ).filter( + ShippingOrderPackageDB.orderid == order.orderid + ).all() + + # 格式化包裹信息 + package_list = [{ + "id": package.ShippingOrderPackageDB.id, + "station_id": package.ShippingOrderPackageDB.station_id, + "station_name": package.station_name, + "pickup_codes": package.ShippingOrderPackageDB.pickup_codes + } for package in packages] + + orders.append({ + "orderid": order.orderid, + "userid": order.userid, + "status": order.status, + "package_count": order.package_count, + "create_time": order.create_time, + "delivery_method": order.delivery_method, + "original_amount": order.original_amount, + "coupon_discount_amount": order.coupon_discount_amount, + "point_discount_amount": order.point_discount_amount, + "final_amount": order.final_amount, + "packages": package_list, + "address": { + "id": address.id, + "name": address.name, + "phone": address.phone, + "community_id": community.id, + "community_name": community.name, + "building_id": building.id, + "building_name": building.building_name, + "building_number": building.building_number, + "address_detail": address.address_detail + } + }) + + return success_response(data={ + "total": total, + "items": orders + }) + + except Exception as e: + return error_response(code=500, message=f"获取订单列表失败: {str(e)}") @router.get("/deliveryman/list", response_model=ResponseModel) async def get_deliveryman_orders( @@ -384,6 +463,7 @@ async def get_deliveryman_orders( orders.append({ "orderid": order.orderid, + "userid": order.userid, "status": order.status, "package_count": order.package_count, "create_time": order.create_time, @@ -398,7 +478,6 @@ async def get_deliveryman_orders( "building_id": building.id, "building_name": building.building_name, "building_number": building.building_number, - "room_number": address.room_number, "address_detail": address.address_detail } }) @@ -574,4 +653,115 @@ async def pickup_order( ) except Exception as e: db.rollback() - return error_response(code=500, message=f"操作失败: {str(e)}") \ No newline at end of file + return error_response(code=500, message=f"操作失败: {str(e)}") + +@router.get("/admin/list", response_model=ResponseModel) +async def get_orders( + status: Optional[OrderStatus] = None, + user_id: Optional[int] = None, + order_id: Optional[str] = None, + skip: int = 0, + limit: int = 20, + db: Session = Depends(get_db), + admin_user: UserDB = Depends(get_admin_user) +): + """获取订单列表(管理员接口) + + Args: + status: 订单状态过滤 + user_id: 用户ID过滤 + order_id: 订单号过滤 + skip: 跳过记录数 + limit: 返回记录数 + """ + try: + # 构建基础查询 + query = db.query( + ShippingOrderDB, + AddressDB, + CommunityBuildingDB, + CommunityDB + ).join( + AddressDB, + ShippingOrderDB.addressid == AddressDB.id + ).join( + CommunityBuildingDB, + AddressDB.community_building_id == CommunityBuildingDB.id + ).join( + CommunityDB, + CommunityBuildingDB.community_id == CommunityDB.id + ) + + # 添加用户ID过滤 + if user_id: + query = query.filter(ShippingOrderDB.userid == user_id) + + # 添加状态过滤 + if status: + query = query.filter(ShippingOrderDB.status == status) + + # 添加订单号过滤 + if order_id: + query = query.filter(ShippingOrderDB.orderid == order_id) + + # 获取总数 + total = query.count() + + # 分页查询 + results = query.order_by( + ShippingOrderDB.create_time.desc() + ).offset(skip).limit(limit).all() + + orders = [] + for order, address, building, community in results: + # 查询订单包裹信息 + packages = db.query( + ShippingOrderPackageDB, + StationDB.name.label('station_name') + ).join( + StationDB, + ShippingOrderPackageDB.station_id == StationDB.id + ).filter( + ShippingOrderPackageDB.orderid == order.orderid + ).all() + + # 格式化包裹信息 + package_list = [{ + "id": package.ShippingOrderPackageDB.id, + "station_id": package.ShippingOrderPackageDB.station_id, + "station_name": package.station_name, + "pickup_codes": package.ShippingOrderPackageDB.pickup_codes + } for package in packages] + + orders.append({ + "orderid": order.orderid, + "userid": order.userid, + "status": order.status, + "package_count": order.package_count, + "create_time": order.create_time, + "delivery_method": order.delivery_method, + "original_amount": order.original_amount, + "coupon_discount_amount": order.coupon_discount_amount, + "point_discount_amount": order.point_discount_amount, + "final_amount": order.final_amount, + "packages": package_list, + "address": { + "id": address.id, + "name": address.name, + "phone": address.phone, + "community_id": community.id, + "community_name": community.name, + "building_id": building.id, + "building_name": building.building_name, + "building_number": building.building_number, + "address_detail": address.address_detail + } + }) + + return success_response(data={ + "total": total, + "items": orders + }) + + except Exception as e: + return error_response(code=500, message=f"获取订单列表失败: {str(e)}") \ No newline at end of file