From d89adaf19a23dccc1fdeaa142a0e7c3c81169cac Mon Sep 17 00:00:00 2001 From: richarjiang Date: Thu, 16 Oct 2025 17:17:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(diet-records):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=90=A5=E5=85=BB=E6=88=90=E5=88=86=E5=88=86=E6=9E=90=E5=85=8D?= =?UTF-8?q?=E8=B4=B9=E4=BD=BF=E7=94=A8=E6=AC=A1=E6=95=B0=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在营养成分分析功能中添加免费使用次数检查和扣减机制,非VIP用户免费次数用尽时将无法使用该功能。分析成功后自动扣减用户免费次数,确保资源合理使用。 --- src/diet-records/diet-records.controller.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/diet-records/diet-records.controller.ts b/src/diet-records/diet-records.controller.ts index 6dbb231..847d224 100644 --- a/src/diet-records/diet-records.controller.ts +++ b/src/diet-records/diet-records.controller.ts @@ -23,6 +23,7 @@ import { NutritionAnalysisRecordsResponseDto, GetNutritionAnalysisRecordsQueryDt import { JwtAuthGuard } from '../common/guards/jwt-auth.guard'; import { CurrentUser } from '../common/decorators/current-user.decorator'; import { AccessTokenPayload } from '../users/services/apple-auth.service'; +import { UsersService } from '../users/users.service'; @ApiTags('diet-records') @Controller('diet-records') @@ -32,6 +33,7 @@ export class DietRecordsController { constructor( private readonly dietRecordsService: DietRecordsService, private readonly nutritionAnalysisService: NutritionAnalysisService, + private readonly usersService: UsersService, ) { } /** @@ -190,13 +192,30 @@ export class DietRecordsController { } try { + // 检查用户免费使用次数 + const userUsageCount = await this.usersService.getUserUsageCount(user.sub); + + // 如果用户不是VIP且免费次数不足,返回错误 + if (userUsageCount <= 0) { + this.logger.warn(`营养成分表分析失败 - 用户ID: ${user.sub}, 免费次数不足`); + return NutritionAnalysisResponseDto.createError('免费使用次数已用完,请开通会员获取更多使用次数'); + } + // 传递用户ID以便保存分析记录 const result = await this.nutritionAnalysisService.analyzeNutritionImage(requestDto.imageUrl, user.sub); this.logger.log(`营养成分表分析完成 - 用户ID: ${user.sub}, 成功: ${result.success}, 营养素数量: ${result.data.length}`); - // 转换旧的响应格式到新的通用格式 + // 如果分析成功,扣减用户免费使用次数 if (result.success) { + try { + await this.usersService.deductUserUsageCount(user.sub, 1); + this.logger.log(`营养成分表分析成功,已扣减用户免费次数 - 用户ID: ${user.sub}, 剩余次数: ${userUsageCount - 1}`); + } catch (deductError) { + this.logger.error(`扣减用户免费次数失败 - 用户ID: ${user.sub}, 错误: ${deductError instanceof Error ? deductError.message : String(deductError)}`); + // 不影响主流程,继续返回成功结果 + } + return NutritionAnalysisResponseDto.createSuccess(result.data, result.message || '分析成功'); } else { return NutritionAnalysisResponseDto.createError(result.message || '分析失败');