From ab5d42fb650cc874ecb8598d1414750508dd84b0 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sat, 15 Feb 2025 16:23:23 +0800 Subject: [PATCH] update --- app/api/endpoints/address.py | 28 +++++- app/api/endpoints/order.py | 180 +++++++++++++---------------------- app/models/address.py | 6 +- app/models/order.py | 30 ++++-- 4 files changed, 117 insertions(+), 127 deletions(-) diff --git a/app/api/endpoints/address.py b/app/api/endpoints/address.py index d327c9b..f298e7a 100644 --- a/app/api/endpoints/address.py +++ b/app/api/endpoints/address.py @@ -8,7 +8,7 @@ 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.community_building import CommunityBuildingDB router = APIRouter() @router.post("", response_model=ResponseModel) @@ -26,10 +26,22 @@ async def create_address( ) ).update({"is_default": False}) + # 查询社区名字和楼栋名字 + community = db.query(CommunityDB).filter( + CommunityDB.id == address.community_id + ).first() + + community_building = db.query(CommunityBuildingDB).filter( + CommunityBuildingDB.id == address.community_building_id + ).first() + db_address = AddressDB( user_id=current_user.userid, + community_name=community.name, + community_building_name=community_building.building_name, **address.model_dump() ) + db.add(db_address) db.commit() db.refresh(db_address) @@ -80,7 +92,9 @@ async def update_address( if not db_address: return error_response(code=404, message="地址不存在") + update_data = address.model_dump(exclude_unset=True) + if update_data.get("is_default"): db.query(AddressDB).filter( and_( @@ -91,6 +105,18 @@ async def update_address( for key, value in update_data.items(): setattr(db_address, key, value) + + # 查询社区名字和楼栋名字 + community = db.query(CommunityDB).filter( + CommunityDB.id == address.community_id + ).first() + + community_building = db.query(CommunityBuildingDB).filter( + CommunityBuildingDB.id == address.community_building_id + ).first() + + db_address.community_name = community.name + db_address.community_building_name = community_building.building_name db.commit() db.refresh(db_address) diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index 3499b36..74cbfc6 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -29,6 +29,7 @@ from app.models.community_building import CommunityBuildingDB from app.models.station import StationDB from app.models.point import PointRecordDB, PointRecordType from app.core.utils import CommonUtils +import logging router = APIRouter() @@ -126,7 +127,7 @@ async def pre_order( return success_response(data=price_info) @router.post("", response_model=ResponseModel) -async def create_shipping_order( +async def create_order( order: OrderCreate, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) @@ -159,11 +160,21 @@ async def create_shipping_order( # 更新优惠券状态 user_coupon.status = CouponStatus.USED + # 查询地址信息 + address = db.query(AddressDB).filter( + AddressDB.id == order.addressid + ).first() + # 创建订单 db_order = ShippingOrderDB( orderid=orderid, userid=current_user.userid, - addressid=order.addressid, + address_customer_name=address.name, + address_customer_phone=address.phone, + address_customer_gender=address.gender, + address_community_name=address.community_name, + address_community_building_name=address.community_building_name, + address_detail=address.address_detail, package_count=price_info.package_count, original_amount=original_amount, coupon_discount_amount=coupon_discount, @@ -177,9 +188,15 @@ async def create_shipping_order( # 创建订单包裹 for package in order.price_request.packages: + + station = db.query(StationDB).filter( + StationDB.id == package.station_id + ).first() + db_package = ShippingOrderPackageDB( orderid=orderid, station_id=package.station_id, + station_name=station.name, pickup_codes=package.pickup_codes ) db.add(db_package) @@ -237,21 +254,7 @@ async def get_order_detail( """获取订单详情""" # 使用 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 + ShippingOrderDB ).filter( ShippingOrderDB.orderid == orderid ).first() @@ -260,7 +263,7 @@ async def get_order_detail( return error_response(code=404, message="订单不存在") # 检查权限 - if order.ShippingOrderDB.userid != current_user.userid and UserRole.ADMIN not in current_user.roles: + if order.userid != current_user.userid and UserRole.ADMIN not in current_user.roles: return error_response(code=403, message="无权查看此订单") # 查询包裹信息,包含驿站名称 @@ -275,15 +278,15 @@ async def get_order_detail( ).all() # 如果有配送员 id,则获取配送员信息 - if order.ShippingOrderDB.deliveryman_user_id: + if order.deliveryman_user_id: deliveryman_user = db.query(UserDB).filter( - UserDB.userid == order.ShippingOrderDB.deliveryman_user_id + UserDB.userid == order.deliveryman_user_id ).first() deliveryman_user_name = deliveryman_user.nickname deliveryman_user_avatar = deliveryman_user.optimized_avatar deliveryman_user_phone = deliveryman_user.phone delivery_count = db.query(ShippingOrderDB).filter( - ShippingOrderDB.deliveryman_user_id == order.ShippingOrderDB.deliveryman_user_id, + ShippingOrderDB.deliveryman_user_id == order.deliveryman_user_id, ShippingOrderDB.status == OrderStatus.COMPLETED ).count() else: @@ -294,29 +297,28 @@ async def get_order_detail( # 构建响应数据 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, + "orderid": order.orderid, + "userid": order.userid, + "package_count": order.package_count, + "original_amount": order.original_amount, + "coupon_discount_amount": order.coupon_discount_amount, + "coupon_id": order.coupon_id, + "final_amount": order.final_amount, + "status": order.status, + "complete_images": order.complete_images.split(",") if order.complete_images else None, + "create_time": order.create_time, + "delivery_method": order.delivery_method, + "deliveryman_user_id": order.deliveryman_user_id, "deliveryman_nickname": deliveryman_user_name, "deliveryman_avatar": deliveryman_user_avatar, "deliveryman_phone": deliveryman_user_phone, "delivery_count": delivery_count, # 地址相关信息 - "address_name": order.address_name, - "address_phone": order.address_phone, + "address_name": order.address_customer_name, + "address_phone": order.address_customer_phone, "address_detail": order.address_detail, - "building_name": order.building_name, - "community_name": order.community_name + "building_name": order.address_community_building_name, + "community_name": order.address_community_name } # 构建包裹信息,包含驿站名称 @@ -344,21 +346,9 @@ async def get_user_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 + ShippingOrderDB ).filter( ShippingOrderDB.userid == current_user.userid ) @@ -376,24 +366,20 @@ async def get_user_orders( ).offset(skip).limit(limit).all() orders = [] - for order, address, building, community in results: + for order in results: # 查询订单包裹信息 packages = db.query( - ShippingOrderPackageDB, - StationDB.name.label('station_name') - ).join( - StationDB, - ShippingOrderPackageDB.station_id == StationDB.id + ShippingOrderPackageDB ).filter( ShippingOrderPackageDB.orderid == order.orderid ).all() # 格式化包裹信息 package_list = [{ - "id": package.ShippingOrderPackageDB.id, - "station_id": package.ShippingOrderPackageDB.station_id, + "id": package.id, + "station_id": package.station_id, "station_name": package.station_name, - "pickup_codes": package.ShippingOrderPackageDB.pickup_codes + "pickup_codes": package.pickup_codes } for package in packages] orders.append({ @@ -409,15 +395,11 @@ async def get_user_orders( "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 + "name": order.address_customer_name, + "phone": order.address_customer_phone, + "community_name": order.address_community_name, + "building_name": order.address_community_building_name, + "address_detail": order.address_detail } }) @@ -502,21 +484,7 @@ async def get_deliveryman_orders( """获取配送员订单列表""" # 基础查询 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( - CommunityDB.id == deliveryman.community_id + ShippingOrderDB ) # 状态筛选 @@ -566,15 +534,11 @@ async def get_deliveryman_orders( "delivery_method": order.delivery_method, "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 + "name": order.address_customer_name, + "phone": order.address_customer_phone, + "community_name": order.address_community_name, + "building_name": order.address_community_building_name, + "address_detail": order.address_detail } }) @@ -793,19 +757,7 @@ async def get_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 + ShippingOrderDB ) # 添加用户ID过滤 @@ -862,15 +814,11 @@ async def get_orders( "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 + "name": order.address_customer_name, + "phone": order.address_customer_phone, + "community_name": order.address_community_name, + "building_name": order.address_community_building_name, + "address_detail": order.address_detail } }) diff --git a/app/models/address.py b/app/models/address.py index bff59b7..4f3aaec 100644 --- a/app/models/address.py +++ b/app/models/address.py @@ -12,6 +12,7 @@ class AddressDB(Base): id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(Integer, ForeignKey("users.userid"), index=True) community_id = Column(Integer, index=True) + community_name = Column(String(100), nullable=True) community_building_id = Column(Integer, ForeignKey("community_buildings.id"), nullable=True) community_building_name = Column(String(100), nullable=True) address_detail = Column(String(200)) @@ -26,17 +27,15 @@ class AddressDB(Base): class AddressCreate(BaseModel): community_id: int community_building_id: Optional[int] = None - community_building_name: Optional[str] = Field(None, max_length=100) address_detail: str = Field(..., max_length=200) name: str = Field(..., max_length=50) phone: str = Field(..., pattern="^1[3-9]\d{9}$") gender: Gender = Gender.UNKNOWN - is_default: bool = False + is_default: bool = True class AddressUpdate(BaseModel): community_id: Optional[int] = None community_building_id: Optional[int] = None - community_building_name: Optional[str] = Field(None, max_length=100) address_detail: Optional[str] = Field(None, max_length=200) name: Optional[str] = Field(None, max_length=50) phone: Optional[str] = Field(None, pattern="^1[3-9]\d{9}$") @@ -46,6 +45,7 @@ class AddressUpdate(BaseModel): class AddressInfo(BaseModel): id: int community_id: int + community_name:Optional[str] community_name: Optional[str] = None community_building_id: Optional[int] community_building_name: Optional[str] diff --git a/app/models/order.py b/app/models/order.py index a723702..c20c57e 100644 --- a/app/models/order.py +++ b/app/models/order.py @@ -5,6 +5,7 @@ from sqlalchemy.sql import func from pydantic import BaseModel, Field from .database import Base import enum +from app.models.user import Gender from app.core.imageprocessor import process_image, ImageFormat class OrderStatus(str, enum.Enum): @@ -25,7 +26,18 @@ class ShippingOrderDB(Base): orderid = Column(String(32), primary_key=True) userid = Column(Integer, ForeignKey("users.userid"), index=True) - addressid = Column(Integer, ForeignKey("delivery_addresses.id"), index=True) + + + # 配送地址信息 + address_customer_name = Column(String(50), nullable=False, default='') # 客户名称快照 + address_customer_phone = Column(String(11), nullable=False, default='') # 客户电话快照 + address_customer_gender = Column(Enum(Gender), nullable=False, default=Gender.UNKNOWN) # 客户性别快照 + address_community_name = Column(String(50), nullable=False, default='') # 小区名称快照 + address_community_building_name = Column(String(50), nullable=False, default='') # 楼栋名称快照 + address_detail = Column(String(100), nullable=False, default='') # 详细地址快照 + + + delivery_method = Column(Enum(DeliveryMethod), nullable=False) package_count = Column(Integer, nullable=False) original_amount = Column(Float, nullable=False) coupon_discount_amount = Column(Float, default=0) @@ -36,11 +48,6 @@ class ShippingOrderDB(Base): cancel_reason = Column(String(200), nullable=True) # 取消原因 complete_images = Column(String(1000), nullable=True) # 完成订单的图片URL,多个URL用逗号分隔 create_time = Column(DateTime(timezone=True), server_default=func.now()) - delivery_method = Column( - Enum(DeliveryMethod), - nullable=False, - default=DeliveryMethod.DELIVERY_AT_DOORSTEP - ) deliveryman_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True) cancel_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True) pay_status = Column(Boolean, default=False) # 支付状态 @@ -60,6 +67,7 @@ class ShippingOrderPackageDB(Base): id = Column(Integer, primary_key=True, autoincrement=True) orderid = Column(String(32), ForeignKey("shipping_orders.orderid"), index=True) station_id = Column(Integer, ForeignKey("stations.id"), index=True) + station_name = Column(String(50), nullable=False) pickup_codes = Column(String(100), nullable=False) create_time = Column(DateTime(timezone=True), server_default=func.now()) @@ -84,7 +92,14 @@ class OrderCreate(BaseModel): class OrderInfo(BaseModel): orderid: str userid: int - addressid: int + + address_customer_name: str + address_customer_phone: str + address_community_name: str + address_community_building_name: str + address_detail: str + address_customer_gender: Gender + package_count: int original_amount: float coupon_discount_amount: float @@ -113,6 +128,7 @@ class OrderPackageInfo(BaseModel): id: int orderid: str station_id: int + station_name: str pickup_codes: str create_time: datetime