Просмотр исходного кода

解决团队用户后台统计接口的权限问题。

wilhelm wong 2 месяцев назад
Родитель
Сommit
2cfefa5439

+ 1 - 1
src/controllers/income-records.controller.ts

@@ -77,7 +77,7 @@ export class IncomeRecordsController {
       if (user.role === UserRole.TEAM) {
       if (user.role === UserRole.TEAM) {
         const team = await this.teamService.findByUserId(user.id)
         const team = await this.teamService.findByUserId(user.id)
         if (team) {
         if (team) {
-          request.query.agentId = team.id
+          request.query.agentId = team.userId
         }
         }
       } else if (user.role === UserRole.PROMOTER) {
       } else if (user.role === UserRole.PROMOTER) {
         request.query.userId = user.id
         request.query.userId = user.id

+ 44 - 2
src/controllers/team-domain.controller.ts

@@ -148,8 +148,29 @@ export class TeamDomainController {
 
 
   async getDailyStatistics(request: FastifyRequest<{ Querystring: { domain: string } }>, reply: FastifyReply) {
   async getDailyStatistics(request: FastifyRequest<{ Querystring: { domain: string } }>, reply: FastifyReply) {
     try {
     try {
+      const user = request.user
+      if (!user) {
+        return reply.code(403).send({ message: '用户未登录' })
+      }
+
       const { domain } = request.query
       const { domain } = request.query
-      const result = await this.teamDomainService.getDailyStatistics(domain)
+      let result = await this.teamDomainService.getDailyStatistics(domain)
+
+      // 如果是团队用户,只返回该团队的域名统计
+      if (user.role === UserRole.TEAM) {
+        const team = await this.teamService.findByUserId(user.id)
+        if (team) {
+          // 获取该团队的所有域名
+          const teamDomains = await this.teamDomainService.findByTeamId(team.id)
+          const teamDomainIds = teamDomains.map(d => d.id)
+          
+          // 过滤结果,只保留该团队的域名统计
+          result = result.filter(stat => teamDomainIds.includes(stat.id))
+        } else {
+          result = []
+        }
+      }
+
       return reply.send(result)
       return reply.send(result)
     } catch (error) {
     } catch (error) {
       return reply.code(500).send({ message: '获取每日统计数据失败' })
       return reply.code(500).send({ message: '获取每日统计数据失败' })
@@ -158,8 +179,29 @@ export class TeamDomainController {
 
 
   async getAllStatistics(request: FastifyRequest<{ Querystring: { domain: string } }>, reply: FastifyReply) {
   async getAllStatistics(request: FastifyRequest<{ Querystring: { domain: string } }>, reply: FastifyReply) {
     try {
     try {
+      const user = request.user
+      if (!user) {
+        return reply.code(403).send({ message: '用户未登录' })
+      }
+
       const { domain } = request.query
       const { domain } = request.query
-      const result = await this.teamDomainService.getAllStatistics(domain)
+      let result = await this.teamDomainService.getAllStatistics(domain)
+
+      // 如果是团队用户,只返回该团队的域名统计
+      if (user.role === UserRole.TEAM) {
+        const team = await this.teamService.findByUserId(user.id)
+        if (team) {
+          // 获取该团队的所有域名
+          const teamDomains = await this.teamDomainService.findByTeamId(team.id)
+          const teamDomainIds = teamDomains.map(d => d.id)
+          
+          // 过滤结果,只保留该团队的域名统计
+          result = result.filter(stat => teamDomainIds.includes(stat.id))
+        } else {
+          result = []
+        }
+      }
+
       return reply.send(result)
       return reply.send(result)
     } catch (error) {
     } catch (error) {
       return reply.code(500).send({ message: '获取总统计数据失败' })
       return reply.code(500).send({ message: '获取总统计数据失败' })

+ 2 - 2
src/routes/team-domain.routes.ts

@@ -64,14 +64,14 @@ export default async function teamDomainRoutes(fastify: FastifyInstance) {
   // 统计各个域名下今日新增用户数以及收入
   // 统计各个域名下今日新增用户数以及收入
   fastify.get<{ Querystring: { domain: string } }>(
   fastify.get<{ Querystring: { domain: string } }>(
     '/statistics/daily',
     '/statistics/daily',
-    { onRequest: [authenticate, hasAnyRole(UserRole.ADMIN)] },
+    { onRequest: [authenticate, hasAnyRole(UserRole.ADMIN, UserRole.TEAM)] },
     teamDomainController.getDailyStatistics.bind(teamDomainController)
     teamDomainController.getDailyStatistics.bind(teamDomainController)
   )
   )
 
 
   // 统计各个域名下所有新增用户数以及收入
   // 统计各个域名下所有新增用户数以及收入
   fastify.get<{ Querystring: { domain: string } }>(
   fastify.get<{ Querystring: { domain: string } }>(
     '/statistics/all',
     '/statistics/all',
-    { onRequest: [authenticate, hasAnyRole(UserRole.ADMIN)] },
+    { onRequest: [authenticate, hasAnyRole(UserRole.ADMIN, UserRole.TEAM)] },
     teamDomainController.getAllStatistics.bind(teamDomainController)
     teamDomainController.getAllStatistics.bind(teamDomainController)
   )
   )
 
 

+ 33 - 30
src/services/team.service.ts

@@ -150,9 +150,10 @@ export class TeamService {
     const todayEnd = new Date()
     const todayEnd = new Date()
     todayEnd.setUTCHours(23, 59, 59, 999)
     todayEnd.setUTCHours(23, 59, 59, 999)
 
 
-    // 获取所有团队的 userId 列表,并添加默认的 agentId 0
+    // 获取所有团队的 userId 列表
     const teamUserIds = teams.map(team => team.userId)
     const teamUserIds = teams.map(team => team.userId)
-    const allUserIds = [...teamUserIds, 0] // 添加默认的 agentId 0
+    // 只有在管理员查看时才添加默认的 agentId 0
+    const allUserIds = userId ? teamUserIds : [...teamUserIds, 0]
     
     
     // 获取所有团队的 ID 列表,用于查询会员数据
     // 获取所有团队的 ID 列表,用于查询会员数据
     const teamIds = teams.map(team => team.id)
     const teamIds = teams.map(team => team.id)
@@ -330,34 +331,36 @@ export class TeamService {
       })
       })
     })
     })
 
 
-    // 添加默认团队数据(agentId 为 0)
-    const defaultTotalRevenue = totalRevenueMap.get(0) || 0
-    const defaultTodayRevenue = todayRevenueMap.get(0) || 0
-    const defaultTotalSales = totalSalesMap.get(0) || 0
-    const defaultTodaySales = todaySalesMap.get(0) || 0
-    const defaultTodayDAU = todayDAUMap.get(0) || 0
-    const defaultTodayNewUsers = todayNewUsersMap.get(0) || 0
-    const defaultTotalUsers = totalUsersMap.get(0) || 0
-
-    statistics.totalRevenue += defaultTotalRevenue
-    statistics.todayRevenue += defaultTodayRevenue
-    statistics.totalSales += defaultTotalSales
-    statistics.todaySales += defaultTodaySales
-    statistics.todayDAU += defaultTodayDAU
-    statistics.todayNewUsers += defaultTodayNewUsers
-
-    // 将默认团队数据添加到列表最后
-    statistics.allTeams.push({
-      id: 0, // 使用 0 作为默认团队的 ID
-      name: '默认',
-      totalRevenue: Number(defaultTotalRevenue.toFixed(5)),
-      todayRevenue: Number(defaultTodayRevenue.toFixed(5)),
-      totalSales: Number(defaultTotalSales.toFixed(5)),
-      todaySales: Number(defaultTodaySales.toFixed(5)),
-      todayDAU: Number(defaultTodayDAU),
-      todayNewUsers: Number(defaultTodayNewUsers),
-      totalUsers: Number(defaultTotalUsers)
-    })
+    // 只有在管理员查看时才添加默认团队数据(agentId 为 0)
+    if (!userId) {
+      const defaultTotalRevenue = totalRevenueMap.get(0) || 0
+      const defaultTodayRevenue = todayRevenueMap.get(0) || 0
+      const defaultTotalSales = totalSalesMap.get(0) || 0
+      const defaultTodaySales = todaySalesMap.get(0) || 0
+      const defaultTodayDAU = todayDAUMap.get(0) || 0
+      const defaultTodayNewUsers = todayNewUsersMap.get(0) || 0
+      const defaultTotalUsers = totalUsersMap.get(0) || 0
+
+      statistics.totalRevenue += defaultTotalRevenue
+      statistics.todayRevenue += defaultTodayRevenue
+      statistics.totalSales += defaultTotalSales
+      statistics.todaySales += defaultTodaySales
+      statistics.todayDAU += defaultTodayDAU
+      statistics.todayNewUsers += defaultTodayNewUsers
+
+      // 将默认团队数据添加到列表最后
+      statistics.allTeams.push({
+        id: 0, // 使用 0 作为默认团队的 ID
+        name: '默认',
+        totalRevenue: Number(defaultTotalRevenue.toFixed(5)),
+        todayRevenue: Number(defaultTodayRevenue.toFixed(5)),
+        totalSales: Number(defaultTotalSales.toFixed(5)),
+        todaySales: Number(defaultTodaySales.toFixed(5)),
+        todayDAU: Number(defaultTodayDAU),
+        todayNewUsers: Number(defaultTodayNewUsers),
+        totalUsers: Number(defaultTotalUsers)
+      })
+    }
 
 
     statistics.averageCommissionRate = teams.length > 0 ? Number((totalCommissionRate / teams.length).toFixed(2)) : 0
     statistics.averageCommissionRate = teams.length > 0 ? Number((totalCommissionRate / teams.length).toFixed(2)) : 0