fix(mining-admin): remove MINING_ENABLED status filter for adoption stats

The adoption stats were showing 0 because the synced_adoptions table
contains status values directly from 1.0 system (PAID, POOL_INJECTED, etc.)
rather than MINING_ENABLED. Since contribution-service doesn't update the
status after calculating contributions, we now count all synced adoptions.

Changes:
- Remove status filter in getAdoptionStatsForUsers
- Remove status filter in getUserDetail adoption queries
- Remove status filter in getUserAdoptionStats for referral tree
- Add order count display in user detail page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-13 01:21:01 -08:00
parent 2f3a0f3652
commit 65bd4f9b65
2 changed files with 24 additions and 15 deletions

View File

@ -111,12 +111,11 @@ export class UsersService {
if (accountSequences.length === 0) return result;
// 获取每个用户的个人认种数量和订单数(只统计 MINING_ENABLED 状态
// 获取每个用户的个人认种数量和订单数(统计所有已同步的认种记录
const personalAdoptions = await this.prisma.syncedAdoption.groupBy({
by: ['accountSequence'],
where: {
accountSequence: { in: accountSequences },
status: 'MINING_ENABLED',
},
_sum: { treeCount: true },
_count: { id: true },
@ -159,7 +158,6 @@ export class UsersService {
const teamAdoptionStats = await this.prisma.syncedAdoption.aggregate({
where: {
accountSequence: { in: teamMembers.map((m) => m.accountSequence) },
status: 'MINING_ENABLED',
},
_sum: { treeCount: true },
_count: { id: true },
@ -221,9 +219,9 @@ export class UsersService {
throw new NotFoundException(`用户 ${accountSequence} 不存在`);
}
// 获取个人认种数量(从 synced_adoptions 统计,只统计 MINING_ENABLED 状态
// 获取个人认种数量(从 synced_adoptions 统计
const personalAdoptionStats = await this.prisma.syncedAdoption.aggregate({
where: { accountSequence, status: 'MINING_ENABLED' },
where: { accountSequence },
_sum: { treeCount: true },
_count: { id: true },
});
@ -235,7 +233,7 @@ export class UsersService {
});
const directReferralCount = directReferrals.length;
// 获取直推认种数量(只统计 MINING_ENABLED 状态)
// 获取直推认种数量
let directReferralAdoptions = 0;
if (directReferrals.length > 0) {
const directAdoptionStats = await this.prisma.syncedAdoption.aggregate({
@ -243,7 +241,6 @@ export class UsersService {
accountSequence: {
in: directReferrals.map((r) => r.accountSequence),
},
status: 'MINING_ENABLED',
},
_sum: { treeCount: true },
});
@ -277,7 +274,6 @@ export class UsersService {
accountSequence: {
in: teamMembers.map((m) => m.accountSequence),
},
status: 'MINING_ENABLED',
},
_sum: { treeCount: true },
});
@ -579,14 +575,14 @@ export class UsersService {
}
/**
* MINING_ENABLED
*
*/
private async getUserAdoptionStats(
accountSequence: string,
): Promise<{ personal: number; team: number }> {
// 个人认种(只统计 MINING_ENABLED 状态)
// 个人认种
const personalStats = await this.prisma.syncedAdoption.aggregate({
where: { accountSequence, status: 'MINING_ENABLED' },
where: { accountSequence },
_sum: { treeCount: true },
});
@ -598,7 +594,7 @@ export class UsersService {
let teamCount = 0;
if (referral?.originalUserId) {
// 团队认种 = 所有下级的认种总和(只统计 MINING_ENABLED 状态)
// 团队认种 = 所有下级的认种总和
const teamMembers = await this.prisma.syncedReferral.findMany({
where: {
ancestorPath: { contains: referral.originalUserId.toString() },
@ -610,7 +606,6 @@ export class UsersService {
const teamStats = await this.prisma.syncedAdoption.aggregate({
where: {
accountSequence: { in: teamMembers.map((m) => m.accountSequence) },
status: 'MINING_ENABLED',
},
_sum: { treeCount: true },
});

View File

@ -145,13 +145,27 @@ export default function UserDetailPage() {
<p className="text-sm text-muted-foreground flex items-center gap-1">
<TreePine className="h-3 w-3 text-green-600" />
</p>
<p className="text-lg font-bold text-green-600">{formatNumber(user?.personalAdoptions ?? 0)}</p>
<p className="text-lg font-bold text-green-600">
{formatNumber(user?.personalAdoptions ?? 0)}
{(user?.personalAdoptionOrders ?? 0) > 0 && (
<span className="text-sm font-normal text-green-500 ml-1">
({user?.personalAdoptionOrders})
</span>
)}
</p>
</div>
<div className="p-3 bg-blue-50 dark:bg-blue-950 rounded-lg">
<p className="text-sm text-muted-foreground flex items-center gap-1">
<Users className="h-3 w-3 text-blue-600" />
</p>
<p className="text-lg font-bold text-blue-600">{formatNumber(user?.teamAdoptions ?? 0)}</p>
<p className="text-lg font-bold text-blue-600">
{formatNumber(user?.teamAdoptions ?? 0)}
{(user?.teamAdoptionOrders ?? 0) > 0 && (
<span className="text-sm font-normal text-blue-500 ml-1">
({user?.teamAdoptionOrders})
</span>
)}
</p>
</div>
<div className="p-3 bg-purple-50 dark:bg-purple-950 rounded-lg">
<p className="text-sm text-muted-foreground"></p>