diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index 42aca35..c06acf9 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -35,12 +35,26 @@ async def create_shipping_order( # 生成订单号 orderid = generate_order_id() - # 计算优惠金额 + # 计算订单价格 + package_count = sum( + len(package.pickup_codes.split(',')) + for package in order.price_request.packages + if package.pickup_codes + ) + + # 计算原始金额 + original_amount = settings.ORDER_BASE_PRICE + if package_count > settings.ORDER_EXTRA_PACKAGE_THRESHOLD: + extra_packages = package_count - settings.ORDER_EXTRA_PACKAGE_THRESHOLD + original_amount += extra_packages * settings.ORDER_EXTRA_PACKAGE_PRICE + + # 计算优惠券折扣 coupon_discount = 0 - if order.coupon_id: + coupon_id = None + if order.price_request.coupon_id: # 查询用户优惠券 user_coupon = db.query(UserCouponDB).filter( - UserCouponDB.id == order.coupon_id, + UserCouponDB.id == order.price_request.coupon_id, UserCouponDB.user_id == current_user.userid, UserCouponDB.status == CouponStatus.UNUSED, UserCouponDB.expire_time > datetime.now(timezone.utc) @@ -50,27 +64,29 @@ async def create_shipping_order( return error_response(code=400, message="优惠券无效或已过期") coupon_discount = user_coupon.coupon_amount + coupon_id = user_coupon.id # 更新优惠券状态 user_coupon.status = CouponStatus.USED # 计算最终金额 - final_amount = max(0, order.original_amount - coupon_discount) + final_amount = max(0, 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, + package_count=package_count, + original_amount=original_amount, coupon_discount_amount=coupon_discount, - coupon_id=order.coupon_id, - final_amount=final_amount + coupon_id=coupon_id, + final_amount=final_amount, + delivery_method=order.delivery_method ) db.add(db_order) # 创建订单包裹 - for package in order.packages: + for package in order.price_request.packages: db_package = ShippingOrderPackageDB( orderid=orderid, station_id=package.station_id, @@ -147,7 +163,12 @@ async def calculate_order_price( current_user: UserDB = Depends(get_current_user) ): """计算订单价格""" - package_count = len(request.packages) + # 计算所有包裹中的取件码总数 + package_count = sum( + len(package.pickup_codes.split(',')) + for package in request.packages + if package.pickup_codes + ) # 计算原始金额 original_amount = settings.ORDER_BASE_PRICE diff --git a/app/models/order.py b/app/models/order.py index 473d044..89e3a63 100644 --- a/app/models/order.py +++ b/app/models/order.py @@ -49,13 +49,18 @@ class OrderPackage(BaseModel): station_id: int pickup_codes: str = Field(..., max_length=100) +# 先定义 OrderPriceCalculateRequest +class OrderPriceCalculateRequest(BaseModel): + packages: List[OrderPackage] + +# 然后再定义 OrderCreate class OrderCreate(BaseModel): addressid: int - package_count: int = Field(..., gt=0) - original_amount: float = Field(..., ge=0) - coupon_id: Optional[int] = None - packages: List[OrderPackage] - delivery_method: DeliveryMethod = Field(default=DeliveryMethod.DELIVERY_TO_DOOR) + price_request: OrderPriceCalculateRequest + delivery_method: DeliveryMethod = Field( + default=DeliveryMethod.DELIVERY_TO_DOOR, + description="配送方式:放在门口或投递到家" + ) class OrderInfo(BaseModel): orderid: str @@ -99,9 +104,6 @@ def generate_order_id() -> str: timestamp = str(int(now.timestamp() * 1000))[-6:] return f"{date_str}{timestamp}" -class OrderPriceCalculateRequest(BaseModel): - packages: List[OrderPackage] - class OrderPriceInfo(BaseModel): package_count: int original_amount: float