Przeglądaj źródła

新增统计字段。

wilhelm wong 2 miesięcy temu
rodzic
commit
7565fe12c4

+ 49 - 4
src/services/income-records.service.ts

@@ -1,14 +1,17 @@
 import { Repository, Between, Like } from 'typeorm'
 import { FastifyInstance } from 'fastify'
 import { IncomeRecords, IncomeType, OrderType } from '../entities/income-records.entity'
+import { Member } from '../entities/member.entity'
 import { PaginationResponse } from '../dto/common.dto'
 import { CreateIncomeRecordBody, UpdateIncomeRecordBody, ListIncomeRecordsQuery } from '../dto/income-records.dto'
 
 export class IncomeRecordsService {
   private incomeRecordsRepository: Repository<IncomeRecords>
+  private memberRepository: Repository<Member>
 
   constructor(app: FastifyInstance) {
     this.incomeRecordsRepository = app.dataSource.getRepository(IncomeRecords)
+    this.memberRepository = app.dataSource.getRepository(Member)
   }
 
   async create(data: CreateIncomeRecordBody): Promise<IncomeRecords> {
@@ -180,6 +183,10 @@ export class IncomeRecordsService {
     total: number[]
     totalTip: number[]
     totalCommission: number[]
+    totalSales: number[]
+    todaySales: number[]
+    todayDAU: number[]
+    todayNewUsers: number[]
   }> {
     if (!startDate || !endDate) {
       throw new Error('开始时间和结束时间都是必须的')
@@ -219,7 +226,8 @@ export class IncomeRecordsService {
         'DATE_FORMAT(record.createdAt, "%Y-%m-%d") as date',
         'SUM(IF(record.incomeType = :tipType, record.incomeAmount, 0)) as tipAmount',
         'SUM(IF(record.incomeType = :commissionType, record.incomeAmount, 0)) as commissionAmount',
-        'SUM(record.incomeAmount) as totalAmount'
+        'SUM(record.incomeAmount) as totalAmount',
+        'SUM(record.orderPrice) as totalSales'
       ])
       .where('record.createdAt >= :start', { start })
       .andWhere('record.createdAt <= :end', { end })
@@ -244,7 +252,7 @@ export class IncomeRecordsService {
     const agentIds = [...new Set(agentStats.map(stat => stat.agentId))].sort((a, b) => a - b)
 
     // 构建代理商数据映射
-    const agentDataMap = new Map<number, Map<string, { tip: number; commission: number; total: number }>>()
+    const agentDataMap = new Map<number, Map<string, { tip: number; commission: number; total: number; sales: number }>>()
 
     // 初始化所有代理商的数据结构
     agentIds.forEach(id => {
@@ -258,12 +266,14 @@ export class IncomeRecordsService {
       const tipAmount = Number(stat.tipAmount) || 0
       const commissionAmount = Number(stat.commissionAmount) || 0
       const totalAmount = Number(stat.totalAmount) || 0
+      const salesAmount = Number(stat.totalSales) || 0
 
       const dateMap = agentDataMap.get(agentId)!
       dateMap.set(date, {
         tip: tipAmount,
         commission: commissionAmount,
-        total: totalAmount
+        total: totalAmount,
+        sales: salesAmount
       })
     })
 
@@ -304,11 +314,46 @@ export class IncomeRecordsService {
       return Number(dayTotal.toFixed(5))
     })
 
+    const totalSales = dates.map(date => {
+      let dayTotal = 0
+      agentIds.forEach(agentId => {
+        const dateMap = agentDataMap.get(agentId)!
+        const dayStats = dateMap.get(date)
+        if (dayStats) {
+          dayTotal += dayStats.sales
+        }
+      })
+      return Number(dayTotal.toFixed(5))
+    })
+
+    // 计算今日售卖金额(取最后一天的数据)
+    const todaySales = totalSales.length > 0 ? [totalSales[totalSales.length - 1]] : [0]
+
+    // 查询今日日活统计(基于会员的lastLoginAt字段)
+    const todayDAU = await this.memberRepository
+      .createQueryBuilder('member')
+      .select('COUNT(DISTINCT member.userId) as dau')
+      .where('member.lastLoginAt >= :today', { today: start })
+      .andWhere('member.lastLoginAt <= :todayEnd', { todayEnd: end })
+      .getRawOne()
+
+    // 查询今日新增用户统计(基于会员的createdAt字段)
+    const todayNewUsers = await this.memberRepository
+      .createQueryBuilder('member')
+      .select('COUNT(member.id) as newUsers')
+      .where('member.createdAt >= :today', { today: start })
+      .andWhere('member.createdAt <= :todayEnd', { todayEnd: end })
+      .getRawOne()
+
     return {
       dates,
       total,
       totalTip,
-      totalCommission
+      totalCommission,
+      totalSales,
+      todaySales,
+      todayDAU: [Number(todayDAU?.dau) || 0],
+      todayNewUsers: [Number(todayNewUsers?.newUsers) || 0]
     }
   }
 }

+ 117 - 9
src/services/team-domain.service.ts

@@ -202,12 +202,12 @@ export class TeamDomainService {
     return groupedData
   }
 
-  async getDailyStatistics(domain?: string): Promise<{ id: number; domain: string; todayNewUsers: number; todayIncome: number }[]> {
-    // 获取今天的开始和结束时间
+  async getDailyStatistics(domain?: string): Promise<{ id: number; domain: string; todayNewUsers: number; todayIncome: number; todayActiveUsers: number; totalIncome: number; totalSales: number; todaySales: number }[]> {
+    // 获取今天的开始和结束时间(使用UTC时区)
     const today = new Date()
-    today.setHours(0, 0, 0, 0)
+    today.setUTCHours(0, 0, 0, 0)
     const tomorrow = new Date(today)
-    tomorrow.setDate(tomorrow.getDate() + 1)
+    tomorrow.setUTCDate(tomorrow.getUTCDate() + 1)
 
     // 构建查询条件
     const whereCondition: any = {}
@@ -220,7 +220,7 @@ export class TeamDomainService {
       where: whereCondition
     })
 
-    const results: { id: number; domain: string; todayNewUsers: number; todayIncome: number }[] = []
+    const results: { id: number; domain: string; todayNewUsers: number; todayIncome: number; todayActiveUsers: number; totalIncome: number; totalSales: number; todaySales: number }[] = []
 
     for (const teamDomain of teamDomains) {
       // 统计今日新增用户数
@@ -231,6 +231,14 @@ export class TeamDomainService {
         }
       })
 
+      // 统计今日活跃用户数(基于lastLoginAt字段)
+      const todayActiveUsers = await this.memberRepository.count({
+        where: {
+          domainId: teamDomain.id,
+          lastLoginAt: Between(today, tomorrow)
+        }
+      })
+
       // 统计今日收入
       const todayIncomeRecords = await this.incomeRecordsRepository
         .createQueryBuilder('record')
@@ -245,18 +253,60 @@ export class TeamDomainService {
 
       const todayIncome = todayIncomeRecords?.totalIncome ? parseFloat(todayIncomeRecords.totalIncome) : 0
 
+      // 统计历史总收入
+      const totalIncomeRecords = await this.incomeRecordsRepository
+        .createQueryBuilder('record')
+        .innerJoin('member', 'm', 'm.userId = record.userId')
+        .select('SUM(CAST(record.incomeAmount AS DECIMAL(10,5)))', 'totalIncome')
+        .where('m.domainId = :domainId', { domainId: teamDomain.id })
+        .andWhere('record.delFlag = :delFlag', { delFlag: false })
+        .andWhere('record.status = :status', { status: true })
+        .getRawOne()
+
+      const totalIncome = totalIncomeRecords?.totalIncome ? parseFloat(totalIncomeRecords.totalIncome) : 0
+
+      // 统计历史总销售额
+      const totalSalesRecords = await this.incomeRecordsRepository
+        .createQueryBuilder('record')
+        .innerJoin('member', 'm', 'm.userId = record.userId')
+        .select('SUM(CAST(record.orderPrice AS DECIMAL(10,5)))', 'totalSales')
+        .where('m.domainId = :domainId', { domainId: teamDomain.id })
+        .andWhere('record.delFlag = :delFlag', { delFlag: false })
+        .andWhere('record.status = :status', { status: true })
+        .getRawOne()
+
+      const totalSales = totalSalesRecords?.totalSales ? parseFloat(totalSalesRecords.totalSales) : 0
+
+      // 统计今日销售额
+      const todaySalesRecords = await this.incomeRecordsRepository
+        .createQueryBuilder('record')
+        .innerJoin('member', 'm', 'm.userId = record.userId')
+        .select('SUM(CAST(record.orderPrice AS DECIMAL(10,5)))', 'totalSales')
+        .where('m.domainId = :domainId', { domainId: teamDomain.id })
+        .andWhere('record.createdAt >= :startDate', { startDate: today })
+        .andWhere('record.createdAt < :endDate', { endDate: tomorrow })
+        .andWhere('record.delFlag = :delFlag', { delFlag: false })
+        .andWhere('record.status = :status', { status: true })
+        .getRawOne()
+
+      const todaySales = todaySalesRecords?.totalSales ? parseFloat(todaySalesRecords.totalSales) : 0
+
       results.push({
         id: teamDomain.id,
         domain: teamDomain.domain,
         todayNewUsers,
-        todayIncome
+        todayIncome,
+        todayActiveUsers,
+        totalIncome,
+        totalSales,
+        todaySales
       })
     }
 
     return results
   }
 
-  async getAllStatistics(domain?: string): Promise<{ id: number; domain: string; totalNewUsers: number; totalIncome: number }[]> {
+  async getAllStatistics(domain?: string): Promise<{ id: number; domain: string; totalNewUsers: number; totalIncome: number; todayActiveUsers: number; todayIncome: number; totalSales: number; todaySales: number }[]> {
     // 构建查询条件
     const whereCondition: any = {}
     if (domain) {
@@ -268,7 +318,13 @@ export class TeamDomainService {
       where: whereCondition
     })
 
-    const results: { id: number; domain: string; totalNewUsers: number; totalIncome: number }[] = []
+    // 获取今天的开始和结束时间(使用UTC时区)
+    const today = new Date()
+    today.setUTCHours(0, 0, 0, 0)
+    const tomorrow = new Date(today)
+    tomorrow.setUTCDate(tomorrow.getUTCDate() + 1)
+
+    const results: { id: number; domain: string; totalNewUsers: number; totalIncome: number; todayActiveUsers: number; todayIncome: number; totalSales: number; todaySales: number }[] = []
 
     for (const teamDomain of teamDomains) {
       // 统计总新增用户数
@@ -278,6 +334,14 @@ export class TeamDomainService {
         }
       })
 
+      // 统计今日活跃用户数(基于lastLoginAt字段)
+      const todayActiveUsers = await this.memberRepository.count({
+        where: {
+          domainId: teamDomain.id,
+          lastLoginAt: Between(today, tomorrow)
+        }
+      })
+
       // 统计总收入
       const totalIncomeRecords = await this.incomeRecordsRepository
         .createQueryBuilder('record')
@@ -290,11 +354,55 @@ export class TeamDomainService {
 
       const totalIncome = totalIncomeRecords?.totalIncome ? parseFloat(totalIncomeRecords.totalIncome) : 0
 
+      // 统计今日收入
+      const todayIncomeRecords = await this.incomeRecordsRepository
+        .createQueryBuilder('record')
+        .innerJoin('member', 'm', 'm.userId = record.userId')
+        .select('SUM(CAST(record.incomeAmount AS DECIMAL(10,5)))', 'totalIncome')
+        .where('m.domainId = :domainId', { domainId: teamDomain.id })
+        .andWhere('record.createdAt >= :startDate', { startDate: today })
+        .andWhere('record.createdAt < :endDate', { endDate: tomorrow })
+        .andWhere('record.delFlag = :delFlag', { delFlag: false })
+        .andWhere('record.status = :status', { status: true })
+        .getRawOne()
+
+      const todayIncome = todayIncomeRecords?.totalIncome ? parseFloat(todayIncomeRecords.totalIncome) : 0
+
+      // 统计历史总销售额
+      const totalSalesRecords = await this.incomeRecordsRepository
+        .createQueryBuilder('record')
+        .innerJoin('member', 'm', 'm.userId = record.userId')
+        .select('SUM(CAST(record.orderPrice AS DECIMAL(10,5)))', 'totalSales')
+        .where('m.domainId = :domainId', { domainId: teamDomain.id })
+        .andWhere('record.delFlag = :delFlag', { delFlag: false })
+        .andWhere('record.status = :status', { status: true })
+        .getRawOne()
+
+      const totalSales = totalSalesRecords?.totalSales ? parseFloat(totalSalesRecords.totalSales) : 0
+
+      // 统计今日销售额
+      const todaySalesRecords = await this.incomeRecordsRepository
+        .createQueryBuilder('record')
+        .innerJoin('member', 'm', 'm.userId = record.userId')
+        .select('SUM(CAST(record.orderPrice AS DECIMAL(10,5)))', 'totalSales')
+        .where('m.domainId = :domainId', { domainId: teamDomain.id })
+        .andWhere('record.createdAt >= :startDate', { startDate: today })
+        .andWhere('record.createdAt < :endDate', { endDate: tomorrow })
+        .andWhere('record.delFlag = :delFlag', { delFlag: false })
+        .andWhere('record.status = :status', { status: true })
+        .getRawOne()
+
+      const todaySales = todaySalesRecords?.totalSales ? parseFloat(todaySalesRecords.totalSales) : 0
+
       results.push({
         id: teamDomain.id,
         domain: teamDomain.domain,
         totalNewUsers,
-        totalIncome
+        totalIncome,
+        todayActiveUsers,
+        todayIncome,
+        totalSales,
+        todaySales
       })
     }
 

+ 162 - 14
src/services/team-members.service.ts

@@ -1,6 +1,8 @@
 import { Repository, Like } from 'typeorm'
 import { FastifyInstance } from 'fastify'
 import { TeamMembers } from '../entities/team-members.entity'
+import { IncomeRecords } from '../entities/income-records.entity'
+import { Member } from '../entities/member.entity'
 import { PaginationResponse } from '../dto/common.dto'
 import { CreateTeamMembersBody, UpdateTeamMembersBody, ListTeamMembersQuery } from '../dto/team-members.dto'
 import { UserService } from './user.service'
@@ -8,10 +10,14 @@ import { UserRole } from '../entities/user.entity'
 
 export class TeamMembersService {
   private teamMembersRepository: Repository<TeamMembers>
+  private incomeRecordsRepository: Repository<IncomeRecords>
+  private memberRepository: Repository<Member>
   private userService: UserService
 
   constructor(app: FastifyInstance) {
     this.teamMembersRepository = app.dataSource.getRepository(TeamMembers)
+    this.incomeRecordsRepository = app.dataSource.getRepository(IncomeRecords)
+    this.memberRepository = app.dataSource.getRepository(Member)
     this.userService = new UserService(app)
   }
 
@@ -102,34 +108,176 @@ export class TeamMembersService {
     totalMembers: number
     totalRevenue: number
     todayRevenue: number
-    topMembers: Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number }>
+    totalSales: number
+    todaySales: number
+    todayDAU: number
+    todayNewUsers: number
+    topMembers: Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number; totalSales: number; todaySales: number; todayDAU: number; todayNewUsers: number }>
   }> {
     const members = await this.teamMembersRepository.find({
-      select: ['id', 'name', 'totalRevenue', 'todayRevenue']
+      select: ['id', 'name', 'totalRevenue', 'todayRevenue', 'userId']
+    })
+
+    // 获取今天的开始时间(使用UTC时区)
+    const today = new Date()
+    today.setUTCHours(0, 0, 0, 0)
+    const todayEnd = new Date()
+    todayEnd.setUTCHours(23, 59, 59, 999)
+
+    // 获取所有成员的userId列表
+    const memberUserIds = members.map(member => member.userId).filter(id => id !== null)
+
+    // 查询所有成员的总收入统计
+    const totalRevenueStats = memberUserIds.length > 0
+      ? await this.incomeRecordsRepository
+          .createQueryBuilder('record')
+          .select(['record.userId as userId', 'SUM(record.incomeAmount) as totalRevenue'])
+          .where('record.delFlag = :delFlag', { delFlag: false })
+          .andWhere('record.status = :status', { status: true })
+          .andWhere('record.userId IN (:...memberUserIds)', { memberUserIds })
+          .groupBy('record.userId')
+          .getRawMany()
+      : []
+
+    // 查询所有成员的今日收入统计
+    const todayRevenueStats = memberUserIds.length > 0
+      ? await this.incomeRecordsRepository
+          .createQueryBuilder('record')
+          .select(['record.userId as userId', 'SUM(record.incomeAmount) as todayRevenue'])
+          .where('record.delFlag = :delFlag', { delFlag: false })
+          .andWhere('record.status = :status', { status: true })
+          .andWhere('record.createdAt >= :today', { today })
+          .andWhere('record.createdAt <= :todayEnd', { todayEnd })
+          .andWhere('record.userId IN (:...memberUserIds)', { memberUserIds })
+          .groupBy('record.userId')
+          .getRawMany()
+      : []
+
+    // 查询所有成员的总售卖金额统计
+    const totalSalesStats = memberUserIds.length > 0
+      ? await this.incomeRecordsRepository
+          .createQueryBuilder('record')
+          .select(['record.userId as userId', 'SUM(record.orderPrice) as totalSales'])
+          .where('record.delFlag = :delFlag', { delFlag: false })
+          .andWhere('record.status = :status', { status: true })
+          .andWhere('record.userId IN (:...memberUserIds)', { memberUserIds })
+          .groupBy('record.userId')
+          .getRawMany()
+      : []
+
+    // 查询所有成员的今日售卖金额统计
+    const todaySalesStats = memberUserIds.length > 0
+      ? await this.incomeRecordsRepository
+          .createQueryBuilder('record')
+          .select(['record.userId as userId', 'SUM(record.orderPrice) as todaySales'])
+          .where('record.delFlag = :delFlag', { delFlag: false })
+          .andWhere('record.status = :status', { status: true })
+          .andWhere('record.createdAt >= :today', { today })
+          .andWhere('record.createdAt <= :todayEnd', { todayEnd })
+          .andWhere('record.userId IN (:...memberUserIds)', { memberUserIds })
+          .groupBy('record.userId')
+          .getRawMany()
+      : []
+
+    // 查询今日日活统计(基于会员的lastLoginAt字段)
+    const todayDAUStats = memberUserIds.length > 0
+      ? await this.memberRepository
+          .createQueryBuilder('member')
+          .select(['member.userId as userId', 'COUNT(DISTINCT member.id) as dau'])
+          .where('member.lastLoginAt >= :today', { today })
+          .andWhere('member.lastLoginAt <= :todayEnd', { todayEnd })
+          .andWhere('member.userId IN (:...memberUserIds)', { memberUserIds })
+          .groupBy('member.userId')
+          .getRawMany()
+      : []
+
+    // 查询今日新增用户统计(基于会员的createdAt字段)
+    const todayNewUsersStats = memberUserIds.length > 0
+      ? await this.memberRepository
+          .createQueryBuilder('member')
+          .select(['member.userId as userId', 'COUNT(member.id) as newUsers'])
+          .where('member.createdAt >= :today', { today })
+          .andWhere('member.createdAt <= :todayEnd', { todayEnd })
+          .andWhere('member.userId IN (:...memberUserIds)', { memberUserIds })
+          .groupBy('member.userId')
+          .getRawMany()
+      : []
+
+    // 构建统计数据映射
+    const totalRevenueMap = new Map<number, number>()
+    const todayRevenueMap = new Map<number, number>()
+    const totalSalesMap = new Map<number, number>()
+    const todaySalesMap = new Map<number, number>()
+    const todayDAUMap = new Map<number, number>()
+    const todayNewUsersMap = new Map<number, number>()
+
+    totalRevenueStats.forEach(stat => {
+      totalRevenueMap.set(stat.userId, Number(stat.totalRevenue) || 0)
+    })
+
+    todayRevenueStats.forEach(stat => {
+      todayRevenueMap.set(stat.userId, Number(stat.todayRevenue) || 0)
+    })
+
+    totalSalesStats.forEach(stat => {
+      totalSalesMap.set(stat.userId, Number(stat.totalSales) || 0)
+    })
+
+    todaySalesStats.forEach(stat => {
+      todaySalesMap.set(stat.userId, Number(stat.todaySales) || 0)
+    })
+
+    todayDAUStats.forEach((stat: any) => {
+      todayDAUMap.set(stat.userId, Number(stat.dau) || 0)
+    })
+
+    todayNewUsersStats.forEach((stat: any) => {
+      todayNewUsersMap.set(stat.userId, Number(stat.newUsers) || 0)
     })
 
     const statistics = {
       totalMembers: members.length,
       totalRevenue: 0,
       todayRevenue: 0,
-      topMembers: [] as Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number }>
+      totalSales: 0,
+      todaySales: 0,
+      todayDAU: 0,
+      todayNewUsers: 0,
+      topMembers: [] as Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number; totalSales: number; todaySales: number; todayDAU: number; todayNewUsers: number }>
     }
 
-    members.forEach(member => {
-      statistics.totalRevenue += Number(member.totalRevenue)
-      statistics.todayRevenue += Number(member.todayRevenue)
+    // 构建成员列表并计算总计
+    const memberStats = members.map(member => {
+      const memberTotalRevenue = totalRevenueMap.get(member.userId) || 0
+      const memberTodayRevenue = todayRevenueMap.get(member.userId) || 0
+      const memberTotalSales = totalSalesMap.get(member.userId) || 0
+      const memberTodaySales = todaySalesMap.get(member.userId) || 0
+      const memberTodayDAU = todayDAUMap.get(member.userId) || 0
+      const memberTodayNewUsers = todayNewUsersMap.get(member.userId) || 0
+
+      statistics.totalRevenue += memberTotalRevenue
+      statistics.todayRevenue += memberTodayRevenue
+      statistics.totalSales += memberTotalSales
+      statistics.todaySales += memberTodaySales
+      statistics.todayDAU += memberTodayDAU
+      statistics.todayNewUsers += memberTodayNewUsers
+
+      return {
+        id: member.id,
+        name: member.name,
+        totalRevenue: Number(memberTotalRevenue.toFixed(5)),
+        todayRevenue: Number(memberTodayRevenue.toFixed(5)),
+        totalSales: Number(memberTotalSales.toFixed(5)),
+        todaySales: Number(memberTodaySales.toFixed(5)),
+        todayDAU: Number(memberTodayDAU),
+        todayNewUsers: Number(memberTodayNewUsers)
+      }
     })
 
     // 获取收入前5的成员
-    statistics.topMembers = members
-      .sort((a, b) => Number(b.totalRevenue) - Number(a.totalRevenue))
+    statistics.topMembers = memberStats
+      .sort((a, b) => b.totalRevenue - a.totalRevenue)
       .slice(0, 5)
-      .map(member => ({
-        id: member.id,
-        name: member.name,
-        totalRevenue: Number(member.totalRevenue),
-        todayRevenue: Number(member.todayRevenue)
-      }))
 
     return statistics
   }

+ 120 - 7
src/services/team.service.ts

@@ -2,6 +2,8 @@ import { Repository, Like } from 'typeorm'
 import { FastifyInstance } from 'fastify'
 import { Team } from '../entities/team.entity'
 import { IncomeRecords, IncomeType } from '../entities/income-records.entity'
+import { Member } from '../entities/member.entity'
+import { User } from '../entities/user.entity'
 import { PaginationResponse } from '../dto/common.dto'
 import { CreateTeamBody, UpdateTeamBody, ListTeamQuery } from '../dto/team.dto'
 import { UserService } from './user.service'
@@ -12,12 +14,16 @@ import * as randomstring from 'randomstring'
 export class TeamService {
   private teamRepository: Repository<Team>
   private incomeRecordsRepository: Repository<IncomeRecords>
+  private memberRepository: Repository<Member>
+  private userRepository: Repository<User>
   private userService: UserService
   private sysConfigService: SysConfigService
 
   constructor(app: FastifyInstance) {
     this.teamRepository = app.dataSource.getRepository(Team)
     this.incomeRecordsRepository = app.dataSource.getRepository(IncomeRecords)
+    this.memberRepository = app.dataSource.getRepository(Member)
+    this.userRepository = app.dataSource.getRepository(User)
     this.userService = new UserService(app)
     this.sysConfigService = new SysConfigService(app)
   }
@@ -122,8 +128,12 @@ export class TeamService {
     totalTeams: number
     totalRevenue: number
     todayRevenue: number
+    totalSales: number
+    todaySales: number
+    todayDAU: number
+    todayNewUsers: number
     averageCommissionRate: number
-    allTeams: Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number }>
+    allTeams: Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number; totalSales: number; todaySales: number; todayDAU: number; todayNewUsers: number }>
   }> {
     // 根据 userId 参数决定查询范围
     const whereCondition = userId ? { userId } : {}
@@ -134,15 +144,18 @@ export class TeamService {
       select: ['id', 'name', 'userId', 'commissionRate']
     })
 
-    // 获取今天的开始时间
+    // 获取今天的开始时间(使用UTC时区)
     const today = new Date()
-    today.setHours(0, 0, 0, 0)
+    today.setUTCHours(0, 0, 0, 0)
     const todayEnd = new Date()
-    todayEnd.setHours(23, 59, 59, 999)
+    todayEnd.setUTCHours(23, 59, 59, 999)
 
     // 获取所有团队的 userId 列表,并添加默认的 agentId 0
     const teamUserIds = teams.map(team => team.userId)
     const allUserIds = [...teamUserIds, 0] // 添加默认的 agentId 0
+    
+    // 获取所有团队的 ID 列表,用于查询会员数据
+    const teamIds = teams.map(team => team.id)
 
     // 查询所有团队的总收入统计(通过 userId 关联,包括默认的 agentId 0)
     const totalRevenueStats =
@@ -172,9 +185,65 @@ export class TeamService {
             .getRawMany()
         : []
 
+    // 查询所有团队的总售卖金额统计(通过 userId 关联,包括默认的 agentId 0)
+    const totalSalesStats =
+      allUserIds.length > 0
+        ? await this.incomeRecordsRepository
+            .createQueryBuilder('record')
+            .select(['record.agentId as userId', 'SUM(record.orderPrice) as totalSales'])
+            .where('record.delFlag = :delFlag', { delFlag: false })
+            .andWhere('record.status = :status', { status: true })
+            .andWhere('record.agentId IN (:...allUserIds)', { allUserIds })
+            .groupBy('record.agentId')
+            .getRawMany()
+        : []
+
+    // 查询所有团队的今日售卖金额统计(通过 userId 关联,包括默认的 agentId 0)
+    const todaySalesStats =
+      allUserIds.length > 0
+        ? await this.incomeRecordsRepository
+            .createQueryBuilder('record')
+            .select(['record.agentId as userId', 'SUM(record.orderPrice) as todaySales'])
+            .where('record.delFlag = :delFlag', { delFlag: false })
+            .andWhere('record.status = :status', { status: true })
+            .andWhere('record.createdAt >= :today', { today })
+            .andWhere('record.createdAt <= :todayEnd', { todayEnd })
+            .andWhere('record.agentId IN (:...allUserIds)', { allUserIds })
+            .groupBy('record.agentId')
+            .getRawMany()
+        : []
+
+    // 查询今日日活统计(基于会员的lastLoginAt字段)
+    const todayDAUStats = teamIds.length > 0
+      ? await this.memberRepository
+          .createQueryBuilder('member')
+          .select(['member.teamId as teamId', 'COUNT(DISTINCT member.userId) as dau'])
+          .where('member.lastLoginAt >= :today', { today })
+          .andWhere('member.lastLoginAt <= :todayEnd', { todayEnd })
+          .andWhere('member.teamId IN (:...teamIds)', { teamIds })
+          .groupBy('member.teamId')
+          .getRawMany()
+      : []
+
+    // 查询今日新增用户统计(基于会员的createdAt字段)
+    const todayNewUsersStats = teamIds.length > 0
+      ? await this.memberRepository
+          .createQueryBuilder('member')
+          .select(['member.teamId as teamId', 'COUNT(member.id) as newUsers'])
+          .where('member.createdAt >= :today', { today })
+          .andWhere('member.createdAt <= :todayEnd', { todayEnd })
+          .andWhere('member.teamId IN (:...teamIds)', { teamIds })
+          .groupBy('member.teamId')
+          .getRawMany()
+      : []
+
     // 构建统计数据映射(使用 userId 作为键)
     const totalRevenueMap = new Map<number, number>()
     const todayRevenueMap = new Map<number, number>()
+    const totalSalesMap = new Map<number, number>()
+    const todaySalesMap = new Map<number, number>()
+    const todayDAUMap = new Map<number, number>()
+    const todayNewUsersMap = new Map<number, number>()
 
     totalRevenueStats.forEach(stat => {
       totalRevenueMap.set(stat.userId, Number(stat.totalRevenue) || 0)
@@ -184,13 +253,33 @@ export class TeamService {
       todayRevenueMap.set(stat.userId, Number(stat.todayRevenue) || 0)
     })
 
+    totalSalesStats.forEach(stat => {
+      totalSalesMap.set(stat.userId, Number(stat.totalSales) || 0)
+    })
+
+    todaySalesStats.forEach(stat => {
+      todaySalesMap.set(stat.userId, Number(stat.todaySales) || 0)
+    })
+
+    todayDAUStats.forEach(stat => {
+      todayDAUMap.set(stat.teamId, Number(stat.dau) || 0)
+    })
+
+    todayNewUsersStats.forEach(stat => {
+      todayNewUsersMap.set(stat.teamId, Number(stat.newUsers) || 0)
+    })
+
     // 计算统计数据
     const statistics = {
       totalTeams: teams.length,
       totalRevenue: 0,
       todayRevenue: 0,
+      totalSales: 0,
+      todaySales: 0,
+      todayDAU: 0,
+      todayNewUsers: 0,
       averageCommissionRate: 0,
-      allTeams: [] as Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number }>
+      allTeams: [] as Array<{ id: number; name: string; totalRevenue: number; todayRevenue: number; totalSales: number; todaySales: number; todayDAU: number; todayNewUsers: number }>
     }
 
     let totalCommissionRate = 0
@@ -199,32 +288,56 @@ export class TeamService {
     teams.forEach(team => {
       const teamTotalRevenue = totalRevenueMap.get(team.userId) || 0
       const teamTodayRevenue = todayRevenueMap.get(team.userId) || 0
+      const teamTotalSales = totalSalesMap.get(team.userId) || 0
+      const teamTodaySales = todaySalesMap.get(team.userId) || 0
+      const teamTodayDAU = todayDAUMap.get(team.id) || 0
+      const teamTodayNewUsers = todayNewUsersMap.get(team.id) || 0
 
       statistics.totalRevenue += teamTotalRevenue
       statistics.todayRevenue += teamTodayRevenue
+      statistics.totalSales += teamTotalSales
+      statistics.todaySales += teamTodaySales
+      statistics.todayDAU += teamTodayDAU
+      statistics.todayNewUsers += teamTodayNewUsers
       totalCommissionRate += Number(team.commissionRate)
 
       statistics.allTeams.push({
         id: team.id,
         name: team.name,
         totalRevenue: Number(teamTotalRevenue.toFixed(5)),
-        todayRevenue: Number(teamTodayRevenue.toFixed(5))
+        todayRevenue: Number(teamTodayRevenue.toFixed(5)),
+        totalSales: Number(teamTotalSales.toFixed(5)),
+        todaySales: Number(teamTodaySales.toFixed(5)),
+        todayDAU: Number(teamTodayDAU),
+        todayNewUsers: Number(teamTodayNewUsers)
       })
     })
 
     // 添加默认团队数据(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
 
     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))
+      todayRevenue: Number(defaultTodayRevenue.toFixed(5)),
+      totalSales: Number(defaultTotalSales.toFixed(5)),
+      todaySales: Number(defaultTodaySales.toFixed(5)),
+      todayDAU: Number(defaultTodayDAU),
+      todayNewUsers: Number(defaultTodayNewUsers)
     })
 
     statistics.averageCommissionRate = teams.length > 0 ? Number((totalCommissionRate / teams.length).toFixed(2)) : 0