feat(diet-records): 新增营养成分分析记录功能
- 添加营养成分分析记录数据模型和数据库集成 - 实现分析记录保存功能,支持成功和失败状态记录 - 新增获取用户营养成分分析记录的API接口 - 支持按日期范围、状态等条件筛选查询 - 提供分页查询功能,优化大数据量场景性能
This commit is contained in:
@@ -19,6 +19,7 @@ import { NutritionAnalysisService } from './services/nutrition-analysis.service'
|
||||
import { CreateDietRecordDto, UpdateDietRecordDto, GetDietHistoryQueryDto, DietRecordResponseDto, DietHistoryResponseDto, NutritionSummaryDto, FoodRecognitionRequestDto, FoodRecognitionResponseDto, FoodRecognitionToDietRecordsResponseDto } from '../users/dto/diet-record.dto';
|
||||
import { NutritionAnalysisResponseDto } from './dto/nutrition-analysis.dto';
|
||||
import { NutritionAnalysisRequestDto } from './dto/nutrition-analysis-request.dto';
|
||||
import { NutritionAnalysisRecordsResponseDto, GetNutritionAnalysisRecordsQueryDto, NutritionAnalysisRecordDto } from './dto/nutrition-analysis-record.dto';
|
||||
import { JwtAuthGuard } from '../common/guards/jwt-auth.guard';
|
||||
import { CurrentUser } from '../common/decorators/current-user.decorator';
|
||||
import { AccessTokenPayload } from '../users/services/apple-auth.service';
|
||||
@@ -189,7 +190,8 @@ export class DietRecordsController {
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await this.nutritionAnalysisService.analyzeNutritionImage(requestDto.imageUrl);
|
||||
// 传递用户ID以便保存分析记录
|
||||
const result = await this.nutritionAnalysisService.analyzeNutritionImage(requestDto.imageUrl, user.sub);
|
||||
|
||||
this.logger.log(`营养成分表分析完成 - 用户ID: ${user.sub}, 成功: ${result.success}, 营养素数量: ${result.data.length}`);
|
||||
|
||||
@@ -204,4 +206,53 @@ export class DietRecordsController {
|
||||
return NutritionAnalysisResponseDto.createError('营养成分表分析失败,请稍后重试');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取营养成分分析记录
|
||||
*/
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@Get('nutrition-analysis-records')
|
||||
@HttpCode(HttpStatus.OK)
|
||||
@ApiOperation({ summary: '获取营养成分分析记录' })
|
||||
@ApiQuery({ name: 'startDate', required: false, description: '开始日期' })
|
||||
@ApiQuery({ name: 'endDate', required: false, description: '结束日期' })
|
||||
@ApiQuery({ name: 'status', required: false, description: '分析状态' })
|
||||
@ApiQuery({ name: 'page', required: false, description: '页码' })
|
||||
@ApiQuery({ name: 'limit', required: false, description: '每页数量' })
|
||||
@ApiResponse({ status: 200, description: '成功获取营养成分分析记录', type: NutritionAnalysisRecordsResponseDto })
|
||||
async getNutritionAnalysisRecords(
|
||||
@Query() query: GetNutritionAnalysisRecordsQueryDto,
|
||||
@CurrentUser() user: AccessTokenPayload,
|
||||
): Promise<NutritionAnalysisRecordsResponseDto> {
|
||||
this.logger.log(`获取营养成分分析记录 - 用户ID: ${user.sub}`);
|
||||
|
||||
try {
|
||||
const result = await this.nutritionAnalysisService.getAnalysisRecords(user.sub, query);
|
||||
|
||||
// 转换为DTO格式
|
||||
const recordDtos: NutritionAnalysisRecordDto[] = result.records.map(record => ({
|
||||
id: record.id,
|
||||
userId: record.userId,
|
||||
imageUrl: record.imageUrl,
|
||||
analysisResult: record.analysisResult,
|
||||
status: record.status || '',
|
||||
message: record.message || '',
|
||||
aiProvider: record.aiProvider || '',
|
||||
aiModel: record.aiModel || '',
|
||||
nutritionCount: record.nutritionCount || 0,
|
||||
createdAt: record.createdAt,
|
||||
updatedAt: record.updatedAt,
|
||||
}));
|
||||
|
||||
return NutritionAnalysisRecordsResponseDto.createSuccess(
|
||||
recordDtos,
|
||||
result.total,
|
||||
result.page,
|
||||
result.limit
|
||||
);
|
||||
} catch (error) {
|
||||
this.logger.error(`获取营养成分分析记录失败 - 用户ID: ${user.sub}, 错误: ${error instanceof Error ? error.message : String(error)}`);
|
||||
return NutritionAnalysisRecordsResponseDto.createError('获取营养成分分析记录失败,请稍后重试');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user