增加计算订单价格的接口
This commit is contained in:
parent
2fde433561
commit
6ca1bc0ef3
@ -7,7 +7,9 @@ from app.models.order import (
|
|||||||
OrderCreate,
|
OrderCreate,
|
||||||
OrderInfo,
|
OrderInfo,
|
||||||
OrderPackageInfo,
|
OrderPackageInfo,
|
||||||
generate_order_id
|
generate_order_id,
|
||||||
|
OrderPriceCalculateRequest,
|
||||||
|
OrderPriceInfo
|
||||||
)
|
)
|
||||||
from app.models.database import get_db
|
from app.models.database import get_db
|
||||||
from app.api.deps import get_current_user
|
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.core.response import success_response, error_response, ResponseModel
|
||||||
from app.models.coupon import UserCouponDB, CouponStatus
|
from app.models.coupon import UserCouponDB, CouponStatus
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
from app.core.config import settings
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@ -133,3 +136,49 @@ async def get_user_orders(
|
|||||||
).offset(skip).limit(limit).all()
|
).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)
|
||||||
@ -6,6 +6,10 @@ class Settings(BaseSettings):
|
|||||||
API_V1_STR: str = "/api/v1"
|
API_V1_STR: str = "/api/v1"
|
||||||
PROJECT_NAME: str = "FastAPI 项目"
|
PROJECT_NAME: str = "FastAPI 项目"
|
||||||
|
|
||||||
|
# 订单价格配置
|
||||||
|
ORDER_BASE_PRICE: float = 3.0 # 基础费用
|
||||||
|
ORDER_EXTRA_PACKAGE_PRICE: float = 0.5 # 额外包裹费用
|
||||||
|
ORDER_EXTRA_PACKAGE_THRESHOLD: int = 5 # 额外收费阈值
|
||||||
|
|
||||||
# JWT 配置
|
# JWT 配置
|
||||||
SECRET_KEY: str = "your-secret-key-here"
|
SECRET_KEY: str = "your-secret-key-here"
|
||||||
|
|||||||
@ -67,6 +67,18 @@ class OrderPackageInfo(BaseModel):
|
|||||||
def generate_order_id() -> str:
|
def generate_order_id() -> str:
|
||||||
"""生成订单号:日期+时间戳"""
|
"""生成订单号:日期+时间戳"""
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
date_str = now.strftime('%Y%m%d')
|
# 生成8位日期 + 6位序号,共14位
|
||||||
timestamp = int(now.timestamp() * 1000)
|
date_str = now.strftime('%Y%m%d') # 8位日期
|
||||||
|
# 生成6位序号(毫秒级时间戳后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):
|
||||||
|
package_count: int
|
||||||
|
original_amount: float
|
||||||
|
coupon_discount_amount: float
|
||||||
|
coupon_id: Optional[int] = None
|
||||||
|
final_amount: float
|
||||||
Loading…
Reference in New Issue
Block a user