feat(users): 新增围度分析报表接口

- 添加 dayjs 依赖用于日期处理
- 新增 GetBodyMeasurementAnalysisDto 和 GetBodyMeasurementAnalysisResponseDto
- 支持按周、月、年三种时间范围统计围度变化趋势
- 实现最近数据点匹配算法,返回各围度类型最接近时间点的测量值
This commit is contained in:
richarjiang
2025-09-24 17:51:57 +08:00
parent e2fcb1c428
commit c9eda4577f
5 changed files with 635 additions and 406 deletions

View File

@@ -34,7 +34,7 @@ import { AppStoreServerNotificationDto, ProcessNotificationResponseDto } from '.
import { RestorePurchaseDto, RestorePurchaseResponseDto } from './dto/restore-purchase.dto';
import { GetUserActivityHistoryResponseDto } from './dto/user-activity.dto';
import { UpdateWeightRecordDto, WeightRecordResponseDto, DeleteWeightRecordResponseDto } from './dto/weight-record.dto';
import { UpdateBodyMeasurementDto, UpdateBodyMeasurementResponseDto, GetBodyMeasurementHistoryResponseDto } from './dto/body-measurement.dto';
import { UpdateBodyMeasurementDto, UpdateBodyMeasurementResponseDto, GetBodyMeasurementHistoryResponseDto, GetBodyMeasurementAnalysisDto, GetBodyMeasurementAnalysisResponseDto } from './dto/body-measurement.dto';
import { Public } from '../common/decorators/public.decorator';
import { CurrentUser } from '../common/decorators/current-user.decorator';
@@ -378,4 +378,26 @@ export class UsersController {
return this.usersService.getBodyMeasurementHistory(user.sub, measurementType as any);
}
/**
* 获取用户围度分析报表
*/
@UseGuards(JwtAuthGuard)
@Get('body-measurements/analysis')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: '获取用户围度分析报表' })
@ApiQuery({
name: 'period',
required: true,
description: '时间范围 (week: 按周, month: 按月, year: 按年)',
enum: ['week', 'month', 'year']
})
@ApiResponse({ status: 200, description: '成功获取围度分析报表', type: GetBodyMeasurementAnalysisResponseDto })
async getBodyMeasurementAnalysis(
@CurrentUser() user: AccessTokenPayload,
@Query('period') period: 'week' | 'month' | 'year',
): Promise<GetBodyMeasurementAnalysisResponseDto> {
this.logger.log(`获取用户围度分析报表 - 用户ID: ${user.sub}, 时间范围: ${period}`);
return this.usersService.getBodyMeasurementAnalysis(user.sub, period);
}
}