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 = []
class PointsSystem:
def __init__(self):
self.users = {}
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)}")
try:
voucher_code = system.redeem_voucher(user_id, 10)
print(f"兑换成功,券码: {voucher_code}")
print(f"剩余积分: {system.get_available_points(user_id)}")
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)
try:
system.redeem_voucher(user_id, 100)
except InsufficientPointsError as e:
print(e)