From 5cff606e8712765efb1839c0658940bf5fc2b632 Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 12 Jan 2026 03:11:19 -0800 Subject: [PATCH] =?UTF-8?q?feat(mining-admin-service):=20=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E7=94=A8=E6=88=B7=E8=AF=A6=E6=83=85API=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getUserDetail 添加以下字段: - nickname: 昵称 - referral: 推荐人信息 (referrerAccountSequence, referrerNickname, depth) - adoption: 认种统计 (personalAdoptionCount, directReferralAdoptions, teamAdoptions) - team: 团队统计 (directReferralCount, teamMemberCount) - 从 synced_referrals 表获取推荐关系 - 从 synced_adoptions 表统计认种数量 - 通过 ancestorPath 计算团队成员和团队认种 Co-Authored-By: Claude Opus 4.5 --- .../src/application/services/users.service.ts | 117 +++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/backend/services/mining-admin-service/src/application/services/users.service.ts b/backend/services/mining-admin-service/src/application/services/users.service.ts index 15411dfc..02112a85 100644 --- a/backend/services/mining-admin-service/src/application/services/users.service.ts +++ b/backend/services/mining-admin-service/src/application/services/users.service.ts @@ -89,6 +89,7 @@ export class UsersService { contributionAccount: true, miningAccount: true, tradingAccount: true, + referral: true, }, }); @@ -96,7 +97,87 @@ export class UsersService { throw new NotFoundException(`用户 ${accountSequence} 不存在`); } - return this.formatUserDetail(user); + // 获取个人认种数量(从 synced_adoptions 统计) + const personalAdoptionStats = await this.prisma.syncedAdoption.aggregate({ + where: { accountSequence }, + _sum: { treeCount: true }, + _count: { id: true }, + }); + + // 获取直推人数和直推认种数量 + const directReferrals = await this.prisma.syncedReferral.findMany({ + where: { referrerAccountSequence: accountSequence }, + select: { accountSequence: true }, + }); + const directReferralCount = directReferrals.length; + + // 获取直推认种数量 + let directReferralAdoptions = 0; + if (directReferrals.length > 0) { + const directAdoptionStats = await this.prisma.syncedAdoption.aggregate({ + where: { + accountSequence: { + in: directReferrals.map((r) => r.accountSequence), + }, + }, + _sum: { treeCount: true }, + }); + directReferralAdoptions = directAdoptionStats._sum.treeCount || 0; + } + + // 获取团队认种数量(通过 ancestorPath 包含当前用户的所有下级) + // 先获取当前用户的 originalUserId + const currentReferral = await this.prisma.syncedReferral.findUnique({ + where: { accountSequence }, + select: { originalUserId: true }, + }); + + let teamAdoptions = 0; + let teamMemberCount = 0; + if (currentReferral?.originalUserId) { + // 找出所有 ancestorPath 包含当前用户 originalUserId 的用户(即所有下级) + const teamMembers = await this.prisma.syncedReferral.findMany({ + where: { + ancestorPath: { + contains: currentReferral.originalUserId.toString(), + }, + }, + select: { accountSequence: true }, + }); + teamMemberCount = teamMembers.length; + + if (teamMembers.length > 0) { + const teamAdoptionStats = await this.prisma.syncedAdoption.aggregate({ + where: { + accountSequence: { + in: teamMembers.map((m) => m.accountSequence), + }, + }, + _sum: { treeCount: true }, + }); + teamAdoptions = teamAdoptionStats._sum.treeCount || 0; + } + } + + // 获取推荐人昵称 + let referrerNickname = null; + if (user.referral?.referrerAccountSequence) { + const referrer = await this.prisma.syncedUser.findUnique({ + where: { accountSequence: user.referral.referrerAccountSequence }, + select: { nickname: true, phone: true }, + }); + referrerNickname = referrer?.nickname || this.maskPhone(referrer?.phone || ''); + } + + return this.formatUserDetail(user, { + personalAdoptionCount: personalAdoptionStats._sum.treeCount || 0, + personalAdoptionOrders: personalAdoptionStats._count.id || 0, + directReferralCount, + directReferralAdoptions, + teamAdoptions, + teamMemberCount, + referrerNickname, + }); } /** @@ -382,16 +463,48 @@ export class UsersService { }; } - private formatUserDetail(user: any) { + private formatUserDetail( + user: any, + extra?: { + personalAdoptionCount: number; + personalAdoptionOrders: number; + directReferralCount: number; + directReferralAdoptions: number; + teamAdoptions: number; + teamMemberCount: number; + referrerNickname: string | null; + }, + ) { return { accountSequence: user.accountSequence, phone: user.phone, + nickname: user.nickname || null, status: user.status, kycStatus: user.kycStatus, realName: user.realName, isLegacyUser: user.isLegacyUser, createdAt: user.createdAt, syncedAt: user.syncedAt, + // 推荐关系 + referral: user.referral + ? { + referrerAccountSequence: user.referral.referrerAccountSequence, + referrerNickname: extra?.referrerNickname || null, + depth: user.referral.depth, + } + : null, + // 认种统计 + adoption: { + personalAdoptionCount: extra?.personalAdoptionCount || 0, + personalAdoptionOrders: extra?.personalAdoptionOrders || 0, + directReferralAdoptions: extra?.directReferralAdoptions || 0, + teamAdoptions: extra?.teamAdoptions || 0, + }, + // 团队统计 + team: { + directReferralCount: extra?.directReferralCount || 0, + teamMemberCount: extra?.teamMemberCount || 0, + }, contribution: user.contributionAccount ? { personalContribution: