Spaces:
Sleeping
Sleeping
| 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'; | |
| () | |
| export class AdminService { | |
| constructor( | |
| (Course) | |
| private courseRepository: Repository<Course>, | |
| (Order) | |
| private orderRepository: Repository<Order>, | |
| ) {} | |
| async createCourse(createCourseDto: CreateCourseDto) { | |
| const course = this.courseRepository.create(createCourseDto); | |
| return this.courseRepository.save(course); | |
| } | |
| async updateCourse(id: number, updateData: Partial<CreateCourseDto>) { | |
| 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(); | |
| } | |
| } | |