diff --git a/src/main/java/com/yolo/keyborad/service/impl/ChatServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/ChatServiceImpl.java index ddcb0ef..eeef763 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/ChatServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/ChatServiceImpl.java @@ -112,15 +112,28 @@ public class ChatServiceImpl implements ChatService { } // ============ 3. 校验用户免费次数和VIP ============ + + // ============ 获取用户ID ============ Long userId = StpUtil.getLoginIdAsLong(); + + // ============ 查询用户配额信息 ============ KeyboardUserQuotaTotal quota = quotaTotalService.getById(userId); + // 判断是否有剩余免费次数 boolean hasFreeQuota = quota != null && quota.getUsedQuota() < quota.getTotalQuota(); + // 使用原子引用记录是否使用了免费次数(用于后续扣减) AtomicReference usedFreeQuota = new AtomicReference<>(hasFreeQuota); + // ============ 如果没有免费次数,校验VIP权限 ============ if (!hasFreeQuota) { + // 查询用户信息 KeyboardUser user = userService.getById(userId); + // 判断是否为有效VIP: + // 1. 用户存在 + // 2. VIP标识为true + // 3. VIP到期时间为空(永久VIP)或未过期 boolean isValidVip = user != null && user.getIsVip() != null && user.getIsVip() && (user.getVipExpiry() == null || user.getVipExpiry().after(new Date())); + // 如果既无免费次数又非VIP,则抛出异常 if (!isValidVip) { log.error("用户无免费次数且非VIP,用户ID: {}", userId); throw new BusinessException(ErrorCode.NO_QUOTA_AND_NOT_VIP);