diff --git a/backend/services/mining-admin-service/src/application/services/system-accounts.service.ts b/backend/services/mining-admin-service/src/application/services/system-accounts.service.ts index 8bfab135..c6dc494e 100644 --- a/backend/services/mining-admin-service/src/application/services/system-accounts.service.ts +++ b/backend/services/mining-admin-service/src/application/services/system-accounts.service.ts @@ -66,86 +66,73 @@ export class SystemAccountsService { /** * 获取系统账户列表 - * 从 CDC 同步的钱包系统账户表读取数据,并合并挖矿数据 - * - * 数据匹配逻辑: - * 1. 钱包账户的 code 格式为 "CITY-440100"、"PROVINCE-440000" 等 - * 2. 算力/挖矿账户的 accountType 格式为 "CITY_440100"、"PROVINCE_440000" 等 - * 3. 需要从 code 提取区域代码,然后构建组合键进行匹配 + * 以 synced_system_contributions 为主要数据源,显示所有省市账户 + * 同时关联钱包数据和挖矿数据 */ async getSystemAccounts() { - // 从 CDC 同步的 SyncedWalletSystemAccount 表获取数据 - const syncedAccounts = await this.prisma.syncedWalletSystemAccount.findMany({ - orderBy: { accountType: 'asc' }, + // 从 CDC 同步的 SyncedSystemContribution 获取算力数据(主要数据源) + const syncedContributions = await this.prisma.syncedSystemContribution.findMany({ + orderBy: [{ accountType: 'asc' }, { regionCode: 'asc' }], }); - // 从 CDC 同步的 SyncedSystemContribution 获取算力数据 - const syncedContributions = - await this.prisma.syncedSystemContribution.findMany(); + // 从 CDC 同步的 SyncedWalletSystemAccount 表获取钱包数据 + const syncedWalletAccounts = await this.prisma.syncedWalletSystemAccount.findMany(); // 从 mining-service 获取挖矿数据 const miningDataMap = await this.fetchMiningServiceSystemAccounts(); - // 构建算力数据映射 - 使用 accountType:regionCode 格式 - const contributionMap = new Map(); - for (const contrib of syncedContributions) { + // 构建钱包数据映射 + const walletMap = new Map(); + for (const wallet of syncedWalletAccounts) { + // 钱包账户的 code 格式为 "CITY-440100"、"PROVINCE-440000" 等 + if (wallet.code) { + const regionCode = this.extractRegionCodeFromCode(wallet.code); + if (regionCode) { + const key = `${wallet.accountType}:${regionCode}`; + walletMap.set(key, wallet); + } + } + // 同时用 accountType 作为 key(用于 OPERATION、HEADQUARTERS 等) + walletMap.set(wallet.accountType, wallet); + } + + // 构建返回数据 - 以算力账户为主 + const accounts = syncedContributions.map((contrib) => { const key = contrib.regionCode ? `${contrib.accountType}:${contrib.regionCode}` : contrib.accountType; - contributionMap.set(key, contrib); - } - // 构建返回数据 - const accounts = syncedAccounts.map((account) => { - // 尝试匹配算力数据 - let contrib = null; - let miningData = null; - - // 1. 尝试用 accountType:regionCode 匹配(针对省市账户) - if (account.code) { - // 从 code 提取区域代码(如 "CITY-440100" -> "440100") - const regionCode = this.extractRegionCodeFromCode(account.code); - if (regionCode) { - // 使用 accountType:regionCode 格式(如 CITY:440100) - const matchKey = `${account.accountType}:${regionCode}`; - contrib = contributionMap.get(matchKey); - miningData = miningDataMap.get(matchKey); - } - } - - // 2. 回退到直接 accountType 匹配(汇总账户,如 OPERATION, HEADQUARTERS) - if (!contrib) { - contrib = contributionMap.get(account.accountType); - } - if (!miningData) { - miningData = miningDataMap.get(account.accountType); - } + const wallet = walletMap.get(key) || walletMap.get(contrib.accountType); + const miningData = miningDataMap.get(key) || miningDataMap.get(contrib.accountType); return { - id: account.originalId, - accountType: account.accountType, - name: account.name, - code: account.code, - provinceId: account.provinceId, - cityId: account.cityId, - shareBalance: account.shareBalance.toString(), - usdtBalance: account.usdtBalance.toString(), - greenPointBalance: account.greenPointBalance.toString(), - frozenShare: account.frozenShare.toString(), - frozenUsdt: account.frozenUsdt.toString(), - totalInflow: account.totalInflow.toString(), - totalOutflow: account.totalOutflow.toString(), - blockchainAddress: account.blockchainAddress, - isActive: account.isActive, - contributionBalance: contrib?.contributionBalance?.toString() || '0', - contributionNeverExpires: contrib?.contributionNeverExpires || false, + id: contrib.id, + accountType: contrib.accountType, + regionCode: contrib.regionCode, + name: contrib.name, + code: wallet?.code || null, + provinceId: wallet?.provinceId || null, + cityId: wallet?.cityId || null, + // 钱包余额(如果有钱包账户) + shareBalance: wallet?.shareBalance?.toString() || '0', + usdtBalance: wallet?.usdtBalance?.toString() || '0', + greenPointBalance: wallet?.greenPointBalance?.toString() || '0', + frozenShare: wallet?.frozenShare?.toString() || '0', + frozenUsdt: wallet?.frozenUsdt?.toString() || '0', + totalInflow: wallet?.totalInflow?.toString() || '0', + totalOutflow: wallet?.totalOutflow?.toString() || '0', + blockchainAddress: wallet?.blockchainAddress || null, + isActive: wallet?.isActive ?? true, + // 算力数据 + contributionBalance: contrib.contributionBalance?.toString() || '0', + contributionNeverExpires: contrib.contributionNeverExpires || false, // 挖矿数据 totalMined: miningData?.totalMined || '0', availableBalance: miningData?.availableBalance || '0', miningContribution: miningData?.totalContribution || '0', miningLastSyncedAt: miningData?.lastSyncedAt || null, - syncedAt: account.syncedAt, - source: 'cdc', + syncedAt: contrib.syncedAt, + source: 'contribution', }; });