import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Course } from '../entities/course.entity'; import { Order, OrderStatus, OrderType } from '../entities/order.entity'; import { CreateCourseDto } from './dto/create-course.dto'; @Injectable() export class AdminService { constructor( @InjectRepository(Course) private courseRepository: Repository, @InjectRepository(Order) private orderRepository: Repository, ) {} async createCourse(createCourseDto: CreateCourseDto) { const course = this.courseRepository.create(createCourseDto); return this.courseRepository.save(course); } async updateCourse(id: number, updateData: Partial) { await this.courseRepository.update(id, updateData); return this.courseRepository.findOne({ where: { id } }); } async deleteCourse(id: number) { await this.courseRepository.delete(id); } async getOrders() { return this.orderRepository.find({ relations: ['user', 'course'], order: { createdAt: 'DESC' }, }); } async getStatistics(startDate?: string, endDate?: string) { const query = this.orderRepository.createQueryBuilder('order') .select('order.orderType', 'orderType') .addSelect('SUM(order.amount)', 'total') .where('order.status = :status', { status: OrderStatus.PAID }); if (startDate) { query.andWhere('order.createdAt >= :startDate', { startDate: new Date(startDate) }); } if (endDate) { const end = new Date(endDate); end.setHours(23, 59, 59, 999); query.andWhere('order.createdAt <= :endDate', { endDate: end }); } const results = await query.groupBy('order.orderType').getRawMany(); const stats = { vipAmount: 0, donationAmount: 0, purchaseAmount: 0, }; results.forEach(row => { const total = Number(row.total) || 0; if (row.orderType === OrderType.VIP) { stats.vipAmount += total; } else if (row.orderType === OrderType.DONATION) { stats.donationAmount += total; } else if (row.orderType === OrderType.PURCHASE) { stats.purchaseAmount += total; } }); return stats; } async getStatisticsDetails(type: string, startDate?: string, endDate?: string) { const query = this.orderRepository.createQueryBuilder('order') .leftJoinAndSelect('order.user', 'user') .leftJoinAndSelect('order.course', 'course') .where('order.status = :status', { status: OrderStatus.PAID }); if (type && type !== 'all') { query.andWhere('order.orderType = :type', { type }); } if (startDate) { query.andWhere('order.createdAt >= :startDate', { startDate: new Date(startDate) }); } if (endDate) { const end = new Date(endDate); end.setHours(23, 59, 59, 999); query.andWhere('order.createdAt <= :endDate', { endDate: end }); } return query.orderBy('order.createdAt', 'DESC').getMany(); } }