增加计算订单价格的接口

This commit is contained in:
aaron 2025-01-05 11:43:52 +08:00
parent 2fde433561
commit 6ca1bc0ef3
3 changed files with 71 additions and 6 deletions

View File

@ -7,7 +7,9 @@ from app.models.order import (
OrderCreate,
OrderInfo,
OrderPackageInfo,
generate_order_id
generate_order_id,
OrderPriceCalculateRequest,
OrderPriceInfo
)
from app.models.database import get_db
from app.api.deps import get_current_user
@ -15,6 +17,7 @@ from app.models.user import UserDB
from app.core.response import success_response, error_response, ResponseModel
from app.models.coupon import UserCouponDB, CouponStatus
from datetime import datetime, timezone
from app.core.config import settings
router = APIRouter()
@ -132,4 +135,50 @@ async def get_user_orders(
ShippingOrderDB.create_time.desc()
).offset(skip).limit(limit).all()
return success_response(data=[OrderInfo.model_validate(o) for o in orders])
return success_response(data=[OrderInfo.model_validate(o) for o in orders])
@router.post("/calculate-price", response_model=ResponseModel)
async def calculate_order_price(
request: OrderPriceCalculateRequest,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""计算订单价格"""
package_count = len(request.packages)
# 计算原始金额
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
used_coupon_id = None
# 查询用户所有可用的优惠券
available_coupons = db.query(UserCouponDB).filter(
UserCouponDB.user_id == current_user.userid,
UserCouponDB.status == CouponStatus.UNUSED
).order_by(
UserCouponDB.coupon_amount.desc() # 优先使用面额大的优惠券
).all()
# 选择最优惠的券
if available_coupons:
user_coupon = available_coupons[0] # 取面额最大的优惠券
coupon_discount = user_coupon.coupon_amount
used_coupon_id = user_coupon.id
# 计算最终金额
final_amount = max(0, original_amount - coupon_discount)
price_info = OrderPriceInfo(
package_count=package_count,
original_amount=original_amount,
coupon_discount_amount=coupon_discount,
coupon_id=used_coupon_id,
final_amount=final_amount
)
return success_response(data=price_info)

View File

@ -6,7 +6,11 @@ class Settings(BaseSettings):
API_V1_STR: str = "/api/v1"
PROJECT_NAME: str = "FastAPI 项目"
# 订单价格配置
ORDER_BASE_PRICE: float = 3.0 # 基础费用
ORDER_EXTRA_PACKAGE_PRICE: float = 0.5 # 额外包裹费用
ORDER_EXTRA_PACKAGE_THRESHOLD: int = 5 # 额外收费阈值
# JWT 配置
SECRET_KEY: str = "your-secret-key-here"
ACCESS_TOKEN_EXPIRE_MINUTES: Optional[int] = None # None 表示永不过期

View File

@ -67,6 +67,18 @@ class OrderPackageInfo(BaseModel):
def generate_order_id() -> str:
"""生成订单号:日期+时间戳"""
now = datetime.now()
date_str = now.strftime('%Y%m%d')
timestamp = int(now.timestamp() * 1000)
return f"{date_str}{timestamp}"
# 生成8位日期 + 6位序号共14位
date_str = now.strftime('%Y%m%d') # 8位日期
# 生成6位序号毫秒级时间戳后6位
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
coupon_discount_amount: float
coupon_id: Optional[int] = None
final_amount: float