From 27a8911b7f71da8f1b5988a2db288180e9d60648 Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 17 Dec 2025 16:05:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(service):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E6=9C=8D=E5=8A=A1=E4=BB=A3=E7=A0=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E4=B8=8E=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加详细中文注释,明确用户配额校验、VIP权限判断及流式响应处理逻辑,提升可维护性。 --- .../yolo/keyborad/service/impl/ChatServiceImpl.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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);