优化下单接口
This commit is contained in:
parent
e8ca3c6684
commit
26ef177e8e
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user