优化下单接口

This commit is contained in:
aaron 2025-01-11 23:25:45 +08:00
parent e8ca3c6684
commit 26ef177e8e
2 changed files with 41 additions and 18 deletions

View File

@ -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

View File

@ -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