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