92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
from fastapi import HTTPException
|
|
from ..db import get_connection
|
|
from ..utils.jwt_handler import verify_token
|
|
|
|
def validate_admin(token):
|
|
try:
|
|
payload = verify_token(token)
|
|
connection = get_connection()
|
|
cursor = connection.cursor(dictionary=True)
|
|
cursor.execute("SELECT user_type FROM users WHERE username = %s", (payload['sub'],))
|
|
user = cursor.fetchone()
|
|
if not user or user['user_type'] != 'admin':
|
|
raise HTTPException(status_code=403, detail="权限不足")
|
|
return True
|
|
except Exception as e:
|
|
raise HTTPException(status_code=401, detail=str(e))
|
|
|
|
def create_coupon_service(token: str, **coupon_data):
|
|
validate_admin(token)
|
|
connection = get_connection()
|
|
try:
|
|
cursor = connection.cursor()
|
|
valid_from = coupon_data['valid_from'].replace('T', ' ')
|
|
valid_to = coupon_data['valid_to'].replace('T', ' ')
|
|
|
|
cursor.execute("""
|
|
INSERT INTO coupons (
|
|
coupon_code, discount_type, discount_amount,
|
|
min_order_amount, valid_from, valid_to, quantity
|
|
) VALUES (%s, %s, %s, %s, %s, %s, %s)
|
|
""", (
|
|
coupon_data['coupon_code'],
|
|
coupon_data['discount_type'],
|
|
coupon_data['discount_amount'],
|
|
coupon_data.get('min_order_amount'),
|
|
valid_from,
|
|
valid_to,
|
|
coupon_data['quantity']
|
|
))
|
|
connection.commit()
|
|
return {"message": "优惠券创建成功"}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
def get_coupons_service(token: str):
|
|
validate_admin(token)
|
|
connection = get_connection()
|
|
cursor = connection.cursor(dictionary=True)
|
|
cursor.execute("SELECT * FROM coupons")
|
|
return cursor.fetchall()
|
|
|
|
def issue_coupon_service(token: str, coupon_id: int, user_id: int):
|
|
validate_admin(token)
|
|
connection = get_connection()
|
|
try:
|
|
cursor = connection.cursor(dictionary=True)
|
|
|
|
|
|
# 检查优惠券是否存在
|
|
|
|
cursor.execute("""
|
|
INSERT INTO user_coupons (user_id, coupon_id)
|
|
VALUES (%s, %s)
|
|
""", (user_id, coupon_id))
|
|
|
|
# 检查库存
|
|
cursor.execute("SELECT quantity FROM coupons WHERE coupon_id = %s", (coupon_id,))
|
|
coupon = cursor.fetchone()
|
|
if not coupon or coupon['quantity'] <= 0:
|
|
raise HTTPException(status_code=400, detail="优惠券库存不足")
|
|
|
|
# 减少库存
|
|
cursor.execute("""
|
|
UPDATE coupons SET quantity = quantity - 1
|
|
WHERE coupon_id = %s
|
|
""", (coupon_id,))
|
|
connection.commit()
|
|
return {"message": "优惠券发放成功"}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
def delete_coupon_service(token: str, coupon_id: int):
|
|
validate_admin(token)
|
|
connection = get_connection()
|
|
try:
|
|
cursor = connection.cursor()
|
|
cursor.execute("DELETE FROM coupons WHERE coupon_id = %s", (coupon_id,))
|
|
connection.commit()
|
|
return {"message": "优惠券删除成功"}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|