From 180e5ad05711aa44efcb4fae1d558933fe424394 Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 12 Jan 2026 04:59:51 -0800 Subject: [PATCH] =?UTF-8?q?feat(mining-admin):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=AE=97=E5=8A=9B=E6=9E=84=E6=88=90=E5=B1=95=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=A3=E9=94=81=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端添加 unlockedBonusTiers 字段同步 - 前端算力构成卡片展示层级解锁(L1-15)和团队奖励解锁(3档)状态 - 移除无用的系统运营/省级/市级字段 Co-Authored-By: Claude Opus 4.5 --- .../migration.sql | 2 + .../mining-admin-service/prisma/schema.prisma | 1 + .../services/initialization.service.ts | 2 + .../src/application/services/users.service.ts | 5 + .../infrastructure/kafka/cdc-sync.service.ts | 3 + .../users/[accountSequence]/page.tsx | 129 +++++++++++++++--- .../src/features/users/api/users.api.ts | 10 +- frontend/mining-admin-web/src/types/user.ts | 8 +- 8 files changed, 131 insertions(+), 29 deletions(-) create mode 100644 backend/services/mining-admin-service/prisma/migrations/20260112150000_add_unlocked_bonus_tiers/migration.sql diff --git a/backend/services/mining-admin-service/prisma/migrations/20260112150000_add_unlocked_bonus_tiers/migration.sql b/backend/services/mining-admin-service/prisma/migrations/20260112150000_add_unlocked_bonus_tiers/migration.sql new file mode 100644 index 00000000..6251801f --- /dev/null +++ b/backend/services/mining-admin-service/prisma/migrations/20260112150000_add_unlocked_bonus_tiers/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "synced_contribution_accounts" ADD COLUMN "unlockedBonusTiers" INTEGER NOT NULL DEFAULT 0; diff --git a/backend/services/mining-admin-service/prisma/schema.prisma b/backend/services/mining-admin-service/prisma/schema.prisma index c5aa58fc..f257b636 100644 --- a/backend/services/mining-admin-service/prisma/schema.prisma +++ b/backend/services/mining-admin-service/prisma/schema.prisma @@ -191,6 +191,7 @@ model SyncedContributionAccount { hasAdopted Boolean @default(false) directReferralCount Int @default(0) unlockedLevelDepth Int @default(0) + unlockedBonusTiers Int @default(0) syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/backend/services/mining-admin-service/src/application/services/initialization.service.ts b/backend/services/mining-admin-service/src/application/services/initialization.service.ts index 66a33147..b5e4ceb1 100644 --- a/backend/services/mining-admin-service/src/application/services/initialization.service.ts +++ b/backend/services/mining-admin-service/src/application/services/initialization.service.ts @@ -174,6 +174,7 @@ export class InitializationService { hasAdopted: account.hasAdopted || false, directReferralCount: account.directReferralAdoptedCount || 0, unlockedLevelDepth: account.unlockedLevelDepth || 0, + unlockedBonusTiers: account.unlockedBonusTiers || 0, }, update: { personalContribution: account.personalContribution, @@ -184,6 +185,7 @@ export class InitializationService { hasAdopted: account.hasAdopted, directReferralCount: account.directReferralAdoptedCount, unlockedLevelDepth: account.unlockedLevelDepth, + unlockedBonusTiers: account.unlockedBonusTiers, }, }); syncedCount++; 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 7894113f..257e77ee 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 @@ -325,6 +325,9 @@ export class UsersService { totalContribution: '0', effectiveContribution: '0', hasAdopted: false, + directReferralCount: 0, + unlockedLevelDepth: 0, + unlockedBonusTiers: 0, }, records: [], pagination: { page, pageSize, total: 0, totalPages: 0 }, @@ -342,6 +345,7 @@ export class UsersService { hasAdopted: contribution.hasAdopted, directReferralCount: contribution.directReferralCount, unlockedLevelDepth: contribution.unlockedLevelDepth, + unlockedBonusTiers: contribution.unlockedBonusTiers, }, // 详细流水需要从 contribution-service 获取 records: [], @@ -883,6 +887,7 @@ export class UsersService { hasAdopted: user.contributionAccount.hasAdopted, directReferralCount: user.contributionAccount.directReferralCount, unlockedLevelDepth: user.contributionAccount.unlockedLevelDepth, + unlockedBonusTiers: user.contributionAccount.unlockedBonusTiers, } : null, mining: user.miningAccount diff --git a/backend/services/mining-admin-service/src/infrastructure/kafka/cdc-sync.service.ts b/backend/services/mining-admin-service/src/infrastructure/kafka/cdc-sync.service.ts index 3bb80913..aaa113a5 100644 --- a/backend/services/mining-admin-service/src/infrastructure/kafka/cdc-sync.service.ts +++ b/backend/services/mining-admin-service/src/infrastructure/kafka/cdc-sync.service.ts @@ -447,6 +447,7 @@ export class CdcSyncService implements OnModuleInit { hasAdopted: payload.hasAdopted || false, directReferralCount: payload.directReferralAdoptedCount || 0, unlockedLevelDepth: payload.unlockedLevelDepth || 0, + unlockedBonusTiers: payload.unlockedBonusTiers || 0, }, update: { personalContribution: payload.personalContribution, @@ -457,6 +458,7 @@ export class CdcSyncService implements OnModuleInit { hasAdopted: payload.hasAdopted, directReferralCount: payload.directReferralAdoptedCount, unlockedLevelDepth: payload.unlockedLevelDepth, + unlockedBonusTiers: payload.unlockedBonusTiers, }, }); @@ -496,6 +498,7 @@ export class CdcSyncService implements OnModuleInit { hasAdopted: true, // 有算力计算说明已认种 directReferralCount: 0, unlockedLevelDepth: 0, + unlockedBonusTiers: 0, }, update: { // 增量更新个人算力 diff --git a/frontend/mining-admin-web/src/app/(dashboard)/users/[accountSequence]/page.tsx b/frontend/mining-admin-web/src/app/(dashboard)/users/[accountSequence]/page.tsx index 926a389a..5c4eeb33 100644 --- a/frontend/mining-admin-web/src/app/(dashboard)/users/[accountSequence]/page.tsx +++ b/frontend/mining-admin-web/src/app/(dashboard)/users/[accountSequence]/page.tsx @@ -175,35 +175,120 @@ export default function UserDetailPage() { 算力构成 - -
- 个人算力 - {formatDecimal(user?.contributions?.personal, 4)} + + {/* 个人算力 */} +
+ 个人算力 (70%) + {formatDecimal(user?.contributions?.personal, 4)}
-
- 系统运营 - {formatDecimal(user?.contributions?.systemOperation, 4)} + + {/* 层级算力 */} +
+
+ 层级算力 (7.5%) + {formatDecimal(user?.contributions?.teamLevel, 4)} +
+
+
+ {(user?.contributions?.unlockedLevelDepth ?? 0) >= 5 ? ( + + ) : ( + + )} + = 5 ? 'text-foreground' : 'text-muted-foreground'}`}> + L1-L5 {(user?.contributions?.unlockedLevelDepth ?? 0) >= 5 ? '已解锁' : '未解锁'} + + (直推≥1人认种) +
+
+ {(user?.contributions?.unlockedLevelDepth ?? 0) >= 10 ? ( + + ) : ( + + )} + = 10 ? 'text-foreground' : 'text-muted-foreground'}`}> + L6-L10 {(user?.contributions?.unlockedLevelDepth ?? 0) >= 10 ? '已解锁' : '未解锁'} + + (直推≥3人认种) +
+
+ {(user?.contributions?.unlockedLevelDepth ?? 0) >= 15 ? ( + + ) : ( + + )} + = 15 ? 'text-foreground' : 'text-muted-foreground'}`}> + L11-L15 {(user?.contributions?.unlockedLevelDepth ?? 0) >= 15 ? '已解锁' : '未解锁'} + + (直推≥5人认种) +
+
-
- 系统省级 - {formatDecimal(user?.contributions?.systemProvince, 4)} -
-
- 系统市级 - {formatDecimal(user?.contributions?.systemCity, 4)} -
-
- 团队层级 - {formatDecimal(user?.contributions?.teamLevel, 4)} -
-
- 团队奖励 - {formatDecimal(user?.contributions?.teamBonus, 4)} + + {/* 团队奖励 */} +
+
+ 团队奖励 (7.5%) + {formatDecimal(user?.contributions?.teamBonus, 4)} +
+
+
+ {(user?.contributions?.unlockedBonusTiers ?? 0) >= 1 ? ( + + ) : ( + + )} + = 1 ? 'text-foreground' : 'text-muted-foreground'}`}> + 第1档 2.5% {(user?.contributions?.unlockedBonusTiers ?? 0) >= 1 ? '已解锁' : '未解锁'} + + (自己认种) +
+
+ {(user?.contributions?.unlockedBonusTiers ?? 0) >= 2 ? ( + + ) : ( + + )} + = 2 ? 'text-foreground' : 'text-muted-foreground'}`}> + 第2档 2.5% {(user?.contributions?.unlockedBonusTiers ?? 0) >= 2 ? '已解锁' : '未解锁'} + + (直推≥2人认种) +
+
+ {(user?.contributions?.unlockedBonusTiers ?? 0) >= 3 ? ( + + ) : ( + + )} + = 3 ? 'text-foreground' : 'text-muted-foreground'}`}> + 第3档 2.5% {(user?.contributions?.unlockedBonusTiers ?? 0) >= 3 ? '已解锁' : '未解锁'} + + (直推≥4人认种) +
+
+ + {/* 有效算力 */}
有效算力 (贡献值) {formatDecimal(user?.effectiveContribution, 4)}
+ + {/* 解锁状态汇总 */} +
+
+ 直推认种人数 + {user?.contributions?.directReferralCount ?? 0} 人 +
+
+ 层级解锁深度 + {user?.contributions?.unlockedLevelDepth ?? 0} / 15 级 +
+
+ 奖励解锁档位 + {user?.contributions?.unlockedBonusTiers ?? 0} / 3 档 +
+
diff --git a/frontend/mining-admin-web/src/features/users/api/users.api.ts b/frontend/mining-admin-web/src/features/users/api/users.api.ts index 9af37bf6..cda456f0 100644 --- a/frontend/mining-admin-web/src/features/users/api/users.api.ts +++ b/frontend/mining-admin-web/src/features/users/api/users.api.ts @@ -54,15 +54,17 @@ function transformUserDetail(backendUser: any): UserDetail { // 认种数据 personalAdoptions: backendUser.adoption?.personalAdoptionCount || 0, teamAdoptions: backendUser.adoption?.teamAdoptions || 0, - // 算力明细 + // 算力明细及解锁状态 contributions: { personal: backendUser.contribution?.personalContribution || '0', - systemOperation: '0', - systemProvince: '0', - systemCity: '0', teamLevel: backendUser.contribution?.teamLevelContribution || '0', teamBonus: backendUser.contribution?.teamBonusContribution || '0', total: backendUser.contribution?.totalContribution || '0', + // 解锁状态 + hasAdopted: backendUser.contribution?.hasAdopted || false, + directReferralCount: backendUser.contribution?.directReferralCount || 0, + unlockedLevelDepth: backendUser.contribution?.unlockedLevelDepth || 0, + unlockedBonusTiers: backendUser.contribution?.unlockedBonusTiers || 0, }, kycStatus: backendUser.kycStatus, registeredAt: backendUser.createdAt, diff --git a/frontend/mining-admin-web/src/types/user.ts b/frontend/mining-admin-web/src/types/user.ts index ceb89c44..ba224a74 100644 --- a/frontend/mining-admin-web/src/types/user.ts +++ b/frontend/mining-admin-web/src/types/user.ts @@ -53,12 +53,14 @@ export interface UserDetail extends UserOverview { export interface ContributionBreakdown { personal: string; - systemOperation: string; - systemProvince: string; - systemCity: string; teamLevel: string; teamBonus: string; total: string; + // 解锁状态 + hasAdopted: boolean; + directReferralCount: number; + unlockedLevelDepth: number; // 0, 5, 10, 15 + unlockedBonusTiers: number; // 0, 1, 2, 3 } export interface ContributionRecord {