111 lines
3.1 KiB
TypeScript
111 lines
3.1 KiB
TypeScript
import { Controller, Get, Query, UseGuards } from '@nestjs/common';
|
||
import {
|
||
ApiTags,
|
||
ApiOperation,
|
||
ApiResponse,
|
||
ApiBearerAuth,
|
||
ApiQuery,
|
||
} from '@nestjs/swagger';
|
||
import { PlantingApplicationService, TrendPeriodType } from '../../application/services/planting-application.service';
|
||
import { JwtAuthGuard } from '../guards/jwt-auth.guard';
|
||
import { GlobalStatsResponseDto, TrendDataResponseDto } from '../dto/response/planting-stats.response';
|
||
|
||
/**
|
||
* 认种统计控制器
|
||
* 提供全局统计数据 API,数据直接从订单表聚合查询
|
||
*/
|
||
@ApiTags('认种统计')
|
||
@Controller('planting/stats')
|
||
export class PlantingStatsController {
|
||
constructor(
|
||
private readonly plantingService: PlantingApplicationService,
|
||
) {}
|
||
|
||
/**
|
||
* 获取全局认种统计(公开接口,无需认证)
|
||
* 此接口可用于验证 reporting-service 的统计数据准确性
|
||
*/
|
||
@Get('global')
|
||
@ApiOperation({
|
||
summary: '获取全局认种统计',
|
||
description: '从订单表实时聚合统计数据,可用于验证其他服务的统计准确性',
|
||
})
|
||
@ApiResponse({
|
||
status: 200,
|
||
description: '全局统计数据',
|
||
type: GlobalStatsResponseDto,
|
||
})
|
||
async getGlobalStats(): Promise<{ code: number; message: string; data: GlobalStatsResponseDto }> {
|
||
const stats = await this.plantingService.getGlobalStats();
|
||
|
||
return {
|
||
code: 0,
|
||
message: 'success',
|
||
data: stats,
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 获取全局认种统计(需要认证)
|
||
* 管理后台调用此接口
|
||
*/
|
||
@Get('admin/global')
|
||
@UseGuards(JwtAuthGuard)
|
||
@ApiBearerAuth()
|
||
@ApiOperation({
|
||
summary: '获取全局认种统计(管理员)',
|
||
description: '从订单表实时聚合统计数据,需要管理员权限',
|
||
})
|
||
@ApiResponse({
|
||
status: 200,
|
||
description: '全局统计数据',
|
||
type: GlobalStatsResponseDto,
|
||
})
|
||
async getAdminGlobalStats(): Promise<{ code: number; message: string; data: GlobalStatsResponseDto }> {
|
||
const stats = await this.plantingService.getGlobalStats();
|
||
|
||
return {
|
||
code: 0,
|
||
message: 'success',
|
||
data: stats,
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 获取认种趋势数据(公开接口)
|
||
* [2026-01-06] 新增
|
||
*/
|
||
@Get('trend')
|
||
@ApiOperation({
|
||
summary: '获取认种趋势数据',
|
||
description: '按时间维度聚合认种统计数据,用于绘制趋势图表',
|
||
})
|
||
@ApiQuery({
|
||
name: 'period',
|
||
required: false,
|
||
enum: ['day', 'week', 'month', 'quarter', 'year'],
|
||
description: '时间维度:day(最近30天)、week(最近12周)、month(最近12月)、quarter(最近8季度)、year(最近5年)',
|
||
})
|
||
@ApiResponse({
|
||
status: 200,
|
||
description: '趋势数据列表',
|
||
type: [TrendDataResponseDto],
|
||
})
|
||
async getTrendData(
|
||
@Query('period') period: TrendPeriodType = 'day',
|
||
): Promise<{ code: number; message: string; data: TrendDataResponseDto[] }> {
|
||
const validPeriods: TrendPeriodType[] = ['day', 'week', 'month', 'quarter', 'year'];
|
||
if (!validPeriods.includes(period)) {
|
||
period = 'day';
|
||
}
|
||
|
||
const data = await this.plantingService.getTrendData(period);
|
||
|
||
return {
|
||
code: 0,
|
||
message: 'success',
|
||
data,
|
||
};
|
||
}
|
||
}
|