team.service.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import { Repository, Like } from 'typeorm'
  2. import { FastifyInstance } from 'fastify'
  3. import { Team } from '../entities/team.entity'
  4. import { PaginationResponse } from '../dto/common.dto'
  5. import { CreateTeamBody, UpdateTeamBody, ListTeamQuery } from '../dto/team.dto'
  6. import { UserService } from './user.service'
  7. import { UserRole } from '../entities/user.entity'
  8. export class TeamService {
  9. private teamRepository: Repository<Team>
  10. private userService: UserService
  11. constructor(app: FastifyInstance) {
  12. this.teamRepository = app.dataSource.getRepository(Team)
  13. this.userService = new UserService(app)
  14. }
  15. async create(data: CreateTeamBody, creatorId: number): Promise<Team> {
  16. const { password, ...teamData } = data
  17. const existingUser = await this.userService.findByName(teamData.name)
  18. if (existingUser) {
  19. throw new Error('团队已存在')
  20. }
  21. const userPassword = password || 'password123'
  22. const createdUser = await this.userService.create(userPassword, teamData.name, UserRole.TEAM, creatorId)
  23. const team = this.teamRepository.create({
  24. ...teamData,
  25. userId: createdUser.id
  26. })
  27. const savedTeam = await this.teamRepository.save(team)
  28. return savedTeam
  29. }
  30. async findById(id: number): Promise<Team> {
  31. return this.teamRepository.findOneOrFail({ where: { id } })
  32. }
  33. async findAll(query: ListTeamQuery): Promise<PaginationResponse<Team>> {
  34. const { page, size, id, name, userId } = query
  35. console.log(query)
  36. const where: any = {}
  37. if (id) {
  38. where.id = id
  39. }
  40. if (name) {
  41. where.name = Like(`%${name}%`)
  42. }
  43. if (userId) {
  44. where.userId = userId
  45. }
  46. const [teams, total] = await this.teamRepository.findAndCount({
  47. where,
  48. skip: (Number(page) || 0) * (Number(size) || 20),
  49. take: Number(size) || 20,
  50. order: { createdAt: 'DESC' }
  51. })
  52. return {
  53. content: teams,
  54. metadata: {
  55. total: Number(total),
  56. page: Number(page) || 0,
  57. size: Number(size) || 20
  58. }
  59. }
  60. }
  61. async update(data: UpdateTeamBody): Promise<Team> {
  62. const { id, ...updateData } = data
  63. await this.teamRepository.update(id, updateData)
  64. return this.findById(id)
  65. }
  66. async delete(id: number): Promise<void> {
  67. await this.teamRepository.delete(id)
  68. }
  69. async updateRevenue(id: number, amount: number, type: 'total' | 'today'): Promise<Team> {
  70. const team = await this.findById(id)
  71. if (type === 'total') {
  72. team.totalRevenue = Number(team.totalRevenue) + amount
  73. } else {
  74. team.todayRevenue = Number(team.todayRevenue) + amount
  75. }
  76. return this.teamRepository.save(team)
  77. }
  78. async getStatistics(): Promise<{
  79. totalTeams: number
  80. totalRevenue: number
  81. todayRevenue: number
  82. averageCommissionRate: number
  83. allTeams: Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number }>
  84. }> {
  85. const teams = await this.teamRepository.find({
  86. select: ['id', 'name', 'totalRevenue', 'todayRevenue', 'commissionRate']
  87. })
  88. const statistics = {
  89. totalTeams: teams.length,
  90. totalRevenue: 0,
  91. todayRevenue: 0,
  92. averageCommissionRate: 0,
  93. allTeams: [] as Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number }>
  94. }
  95. let totalCommissionRate = 0
  96. teams.forEach(team => {
  97. statistics.totalRevenue += Number(team.totalRevenue)
  98. statistics.todayRevenue += Number(team.todayRevenue)
  99. totalCommissionRate += Number(team.commissionRate)
  100. })
  101. statistics.averageCommissionRate = teams.length > 0 ? totalCommissionRate / teams.length : 0
  102. statistics.allTeams = teams
  103. .sort((a, b) => Number(b.totalRevenue) - Number(a.totalRevenue))
  104. .map(team => ({
  105. id: team.id,
  106. name: team.name,
  107. totalRevenue: Number(team.totalRevenue),
  108. todayRevenue: Number(team.todayRevenue)
  109. }))
  110. return statistics
  111. }
  112. async getTeamStatistics(userId: number): Promise<Team> {
  113. return this.teamRepository.findOneOrFail({ where: { userId } })
  114. }
  115. async getTeams(): Promise<Array<{ id: number; name: string; userId: number }>> {
  116. return await this.teamRepository.find({
  117. select: ['id', 'name', 'userId']
  118. })
  119. }
  120. async findByUserId(userId: number): Promise<{ id: number; name: string; userId: number }> {
  121. return this.teamRepository.findOneOrFail({ select: ['id', 'name', 'userId'], where: { userId } })
  122. }
  123. }