fix(mining-admin): 以算力账户为主显示系统账户列表

修改 getSystemAccounts 方法:
- 以 synced_system_contributions 为主要数据源
- 关联钱包数据和挖矿数据
- 显示所有省市算力账户(而不仅是有钱包的账户)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-20 23:06:46 -08:00
parent 86c8ede198
commit cded4b2134
1 changed files with 48 additions and 61 deletions

View File

@ -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<string, any>();
for (const contrib of syncedContributions) {
// 构建钱包数据映射
const walletMap = new Map<string, any>();
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',
};
});