优化下单接口
This commit is contained in:
parent
e8ca3c6684
commit
26ef177e8e
@ -35,12 +35,26 @@ async def create_shipping_order(
|
|||||||
# 生成订单号
|
# 生成订单号
|
||||||
orderid = generate_order_id()
|
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
|
coupon_discount = 0
|
||||||
if order.coupon_id:
|
coupon_id = None
|
||||||
|
if order.price_request.coupon_id:
|
||||||
# 查询用户优惠券
|
# 查询用户优惠券
|
||||||
user_coupon = db.query(UserCouponDB).filter(
|
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.user_id == current_user.userid,
|
||||||
UserCouponDB.status == CouponStatus.UNUSED,
|
UserCouponDB.status == CouponStatus.UNUSED,
|
||||||
UserCouponDB.expire_time > datetime.now(timezone.utc)
|
UserCouponDB.expire_time > datetime.now(timezone.utc)
|
||||||
@ -50,27 +64,29 @@ async def create_shipping_order(
|
|||||||
return error_response(code=400, message="优惠券无效或已过期")
|
return error_response(code=400, message="优惠券无效或已过期")
|
||||||
|
|
||||||
coupon_discount = user_coupon.coupon_amount
|
coupon_discount = user_coupon.coupon_amount
|
||||||
|
coupon_id = user_coupon.id
|
||||||
# 更新优惠券状态
|
# 更新优惠券状态
|
||||||
user_coupon.status = CouponStatus.USED
|
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(
|
db_order = ShippingOrderDB(
|
||||||
orderid=orderid,
|
orderid=orderid,
|
||||||
userid=current_user.userid,
|
userid=current_user.userid,
|
||||||
addressid=order.addressid,
|
addressid=order.addressid,
|
||||||
package_count=order.package_count,
|
package_count=package_count,
|
||||||
original_amount=order.original_amount,
|
original_amount=original_amount,
|
||||||
coupon_discount_amount=coupon_discount,
|
coupon_discount_amount=coupon_discount,
|
||||||
coupon_id=order.coupon_id,
|
coupon_id=coupon_id,
|
||||||
final_amount=final_amount
|
final_amount=final_amount,
|
||||||
|
delivery_method=order.delivery_method
|
||||||
)
|
)
|
||||||
db.add(db_order)
|
db.add(db_order)
|
||||||
|
|
||||||
# 创建订单包裹
|
# 创建订单包裹
|
||||||
for package in order.packages:
|
for package in order.price_request.packages:
|
||||||
db_package = ShippingOrderPackageDB(
|
db_package = ShippingOrderPackageDB(
|
||||||
orderid=orderid,
|
orderid=orderid,
|
||||||
station_id=package.station_id,
|
station_id=package.station_id,
|
||||||
@ -147,7 +163,12 @@ async def calculate_order_price(
|
|||||||
current_user: UserDB = Depends(get_current_user)
|
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
|
original_amount = settings.ORDER_BASE_PRICE
|
||||||
|
|||||||
@ -49,13 +49,18 @@ class OrderPackage(BaseModel):
|
|||||||
station_id: int
|
station_id: int
|
||||||
pickup_codes: str = Field(..., max_length=100)
|
pickup_codes: str = Field(..., max_length=100)
|
||||||
|
|
||||||
|
# 先定义 OrderPriceCalculateRequest
|
||||||
|
class OrderPriceCalculateRequest(BaseModel):
|
||||||
|
packages: List[OrderPackage]
|
||||||
|
|
||||||
|
# 然后再定义 OrderCreate
|
||||||
class OrderCreate(BaseModel):
|
class OrderCreate(BaseModel):
|
||||||
addressid: int
|
addressid: int
|
||||||
package_count: int = Field(..., gt=0)
|
price_request: OrderPriceCalculateRequest
|
||||||
original_amount: float = Field(..., ge=0)
|
delivery_method: DeliveryMethod = Field(
|
||||||
coupon_id: Optional[int] = None
|
default=DeliveryMethod.DELIVERY_TO_DOOR,
|
||||||
packages: List[OrderPackage]
|
description="配送方式:放在门口或投递到家"
|
||||||
delivery_method: DeliveryMethod = Field(default=DeliveryMethod.DELIVERY_TO_DOOR)
|
)
|
||||||
|
|
||||||
class OrderInfo(BaseModel):
|
class OrderInfo(BaseModel):
|
||||||
orderid: str
|
orderid: str
|
||||||
@ -99,9 +104,6 @@ def generate_order_id() -> str:
|
|||||||
timestamp = str(int(now.timestamp() * 1000))[-6:]
|
timestamp = str(int(now.timestamp() * 1000))[-6:]
|
||||||
return f"{date_str}{timestamp}"
|
return f"{date_str}{timestamp}"
|
||||||
|
|
||||||
class OrderPriceCalculateRequest(BaseModel):
|
|
||||||
packages: List[OrderPackage]
|
|
||||||
|
|
||||||
class OrderPriceInfo(BaseModel):
|
class OrderPriceInfo(BaseModel):
|
||||||
package_count: int
|
package_count: int
|
||||||
original_amount: float
|
original_amount: float
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user