优化下单接口

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() 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

View File

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