fix(mining-admin): 以算力账户为主显示系统账户列表
修改 getSystemAccounts 方法: - 以 synced_system_contributions 为主要数据源 - 关联钱包数据和挖矿数据 - 显示所有省市算力账户(而不仅是有钱包的账户) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
86c8ede198
commit
cded4b2134
|
|
@ -66,86 +66,73 @@ export class SystemAccountsService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取系统账户列表
|
* 获取系统账户列表
|
||||||
* 从 CDC 同步的钱包系统账户表读取数据,并合并挖矿数据
|
* 以 synced_system_contributions 为主要数据源,显示所有省市账户
|
||||||
*
|
* 同时关联钱包数据和挖矿数据
|
||||||
* 数据匹配逻辑:
|
|
||||||
* 1. 钱包账户的 code 格式为 "CITY-440100"、"PROVINCE-440000" 等
|
|
||||||
* 2. 算力/挖矿账户的 accountType 格式为 "CITY_440100"、"PROVINCE_440000" 等
|
|
||||||
* 3. 需要从 code 提取区域代码,然后构建组合键进行匹配
|
|
||||||
*/
|
*/
|
||||||
async getSystemAccounts() {
|
async getSystemAccounts() {
|
||||||
// 从 CDC 同步的 SyncedWalletSystemAccount 表获取数据
|
// 从 CDC 同步的 SyncedSystemContribution 获取算力数据(主要数据源)
|
||||||
const syncedAccounts = await this.prisma.syncedWalletSystemAccount.findMany({
|
const syncedContributions = await this.prisma.syncedSystemContribution.findMany({
|
||||||
orderBy: { accountType: 'asc' },
|
orderBy: [{ accountType: 'asc' }, { regionCode: 'asc' }],
|
||||||
});
|
});
|
||||||
|
|
||||||
// 从 CDC 同步的 SyncedSystemContribution 获取算力数据
|
// 从 CDC 同步的 SyncedWalletSystemAccount 表获取钱包数据
|
||||||
const syncedContributions =
|
const syncedWalletAccounts = await this.prisma.syncedWalletSystemAccount.findMany();
|
||||||
await this.prisma.syncedSystemContribution.findMany();
|
|
||||||
|
|
||||||
// 从 mining-service 获取挖矿数据
|
// 从 mining-service 获取挖矿数据
|
||||||
const miningDataMap = await this.fetchMiningServiceSystemAccounts();
|
const miningDataMap = await this.fetchMiningServiceSystemAccounts();
|
||||||
|
|
||||||
// 构建算力数据映射 - 使用 accountType:regionCode 格式
|
// 构建钱包数据映射
|
||||||
const contributionMap = new Map<string, any>();
|
const walletMap = new Map<string, any>();
|
||||||
for (const contrib of syncedContributions) {
|
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
|
const key = contrib.regionCode
|
||||||
? `${contrib.accountType}:${contrib.regionCode}`
|
? `${contrib.accountType}:${contrib.regionCode}`
|
||||||
: contrib.accountType;
|
: contrib.accountType;
|
||||||
contributionMap.set(key, contrib);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构建返回数据
|
const wallet = walletMap.get(key) || walletMap.get(contrib.accountType);
|
||||||
const accounts = syncedAccounts.map((account) => {
|
const miningData = miningDataMap.get(key) || miningDataMap.get(contrib.accountType);
|
||||||
// 尝试匹配算力数据
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: account.originalId,
|
id: contrib.id,
|
||||||
accountType: account.accountType,
|
accountType: contrib.accountType,
|
||||||
name: account.name,
|
regionCode: contrib.regionCode,
|
||||||
code: account.code,
|
name: contrib.name,
|
||||||
provinceId: account.provinceId,
|
code: wallet?.code || null,
|
||||||
cityId: account.cityId,
|
provinceId: wallet?.provinceId || null,
|
||||||
shareBalance: account.shareBalance.toString(),
|
cityId: wallet?.cityId || null,
|
||||||
usdtBalance: account.usdtBalance.toString(),
|
// 钱包余额(如果有钱包账户)
|
||||||
greenPointBalance: account.greenPointBalance.toString(),
|
shareBalance: wallet?.shareBalance?.toString() || '0',
|
||||||
frozenShare: account.frozenShare.toString(),
|
usdtBalance: wallet?.usdtBalance?.toString() || '0',
|
||||||
frozenUsdt: account.frozenUsdt.toString(),
|
greenPointBalance: wallet?.greenPointBalance?.toString() || '0',
|
||||||
totalInflow: account.totalInflow.toString(),
|
frozenShare: wallet?.frozenShare?.toString() || '0',
|
||||||
totalOutflow: account.totalOutflow.toString(),
|
frozenUsdt: wallet?.frozenUsdt?.toString() || '0',
|
||||||
blockchainAddress: account.blockchainAddress,
|
totalInflow: wallet?.totalInflow?.toString() || '0',
|
||||||
isActive: account.isActive,
|
totalOutflow: wallet?.totalOutflow?.toString() || '0',
|
||||||
contributionBalance: contrib?.contributionBalance?.toString() || '0',
|
blockchainAddress: wallet?.blockchainAddress || null,
|
||||||
contributionNeverExpires: contrib?.contributionNeverExpires || false,
|
isActive: wallet?.isActive ?? true,
|
||||||
|
// 算力数据
|
||||||
|
contributionBalance: contrib.contributionBalance?.toString() || '0',
|
||||||
|
contributionNeverExpires: contrib.contributionNeverExpires || false,
|
||||||
// 挖矿数据
|
// 挖矿数据
|
||||||
totalMined: miningData?.totalMined || '0',
|
totalMined: miningData?.totalMined || '0',
|
||||||
availableBalance: miningData?.availableBalance || '0',
|
availableBalance: miningData?.availableBalance || '0',
|
||||||
miningContribution: miningData?.totalContribution || '0',
|
miningContribution: miningData?.totalContribution || '0',
|
||||||
miningLastSyncedAt: miningData?.lastSyncedAt || null,
|
miningLastSyncedAt: miningData?.lastSyncedAt || null,
|
||||||
syncedAt: account.syncedAt,
|
syncedAt: contrib.syncedAt,
|
||||||
source: 'cdc',
|
source: 'contribution',
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue