编辑代码

import uuid

class UserNotFoundError(Exception):
    pass

class InsufficientPointsError(Exception):
    pass

class VoucherNotFoundError(Exception):
    pass

class VoucherAlreadyUsedError(Exception):
    pass

class User:
    def __init__(self, user_id):
        self.user_id = user_id
        self.points = 0
        self.vouchers = []  # 存储代金券字典 {code, amount, is_used}

class PointsSystem:
    def __init__(self):
        self.users = {}  # user_id: User
    
    def add_user(self, user_id):
        if user_id not in self.users:
            self.users[user_id] = User(user_id)
    
    def get_user(self, user_id):
        if user_id not in self.users:
            raise UserNotFoundError(f"User {user_id} not found")
        return self.users[user_id]
    
    def add_points(self, user_id, points):
        user = self.get_user(user_id)
        user.points += points
    
    def deduct_points(self, user_id, points):
        user = self.get_user(user_id)
        if user.points < points:
            raise InsufficientPointsError(f"Insufficient points for user {user_id}")
        user.points -= points
    
    def redeem_voucher(self, user_id, voucher_amount):
        """兑换代金券(兑换比例:1元需要10积分)"""
        required_points = voucher_amount * 10
        self.deduct_points(user_id, required_points)
        
        voucher_code = str(uuid.uuid4())
        new_voucher = {
            "code": voucher_code,
            "amount": voucher_amount,
            "is_used": False
        }
        user = self.get_user(user_id)
        user.vouchers.append(new_voucher)
        return voucher_code
    
    def use_voucher(self, user_id, voucher_code):
        user = self.get_user(user_id)
        for voucher in user.vouchers:
            if voucher["code"] == voucher_code:
                if voucher["is_used"]:
                    raise VoucherAlreadyUsedError("Voucher already used")
                voucher["is_used"] = True
                return voucher["amount"]
        raise VoucherNotFoundError("Voucher not found")
    
    def get_available_points(self, user_id):
        return self.get_user(user_id).points
    
    def get_active_vouchers(self, user_id):
        user = self.get_user(user_id)
        return [v for v in user.vouchers if not v["is_used"]]

# 测试用例
if __name__ == "__main__":
    system = PointsSystem()
    
    # 创建用户
    user_id = "user_001"
    system.add_user(user_id)
    
    # 添加积分
    system.add_points(user_id, 500)
    print(f"当前积分: {system.get_available_points(user_id)}")  # 500
    
    # 兑换代金券(10元需要100积分)
    try:
        voucher_code = system.redeem_voucher(user_id, 10)
        print(f"兑换成功,券码: {voucher_code}")
        print(f"剩余积分: {system.get_available_points(user_id)}")  # 400
    except InsufficientPointsError as e:
        print(e)
    
    # 查看可用代金券
    print("可用代金券:")
    for v in system.get_active_vouchers(user_id):
        print(f"- {v['code']} ({v['amount']}元)")
    
    # 使用代金券
    try:
        amount = system.use_voucher(user_id, voucher_code)
        print(f"成功使用 {amount} 元代金券")
    except (VoucherNotFoundError, VoucherAlreadyUsedError) as e:
        print(e)
    
    # 尝试重复使用
    try:
        system.use_voucher(user_id, voucher_code)
    except VoucherAlreadyUsedError as e:
        print(e)  # Voucher already used
    
    # 尝试积分不足兑换
    try:
        system.redeem_voucher(user_id, 100)  # 需要1000积分
    except InsufficientPointsError as e:
        print(e)  # Insufficient points