feat(mining): 添加 perSecondEarning 到挖矿账户 API
- 后端:计算每秒收益 = (用户贡献 / 全网贡献) × 每秒分配量 - 前端:修正字段映射以匹配后端返回格式 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
33233901a9
commit
4f1f1f9eaf
|
|
@ -1,5 +1,6 @@
|
||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { MiningAccountRepository } from '../../infrastructure/persistence/repositories/mining-account.repository';
|
import { MiningAccountRepository } from '../../infrastructure/persistence/repositories/mining-account.repository';
|
||||||
|
import { MiningConfigRepository } from '../../infrastructure/persistence/repositories/mining-config.repository';
|
||||||
import { PrismaService } from '../../infrastructure/persistence/prisma/prisma.service';
|
import { PrismaService } from '../../infrastructure/persistence/prisma/prisma.service';
|
||||||
|
|
||||||
export interface MiningAccountDto {
|
export interface MiningAccountDto {
|
||||||
|
|
@ -9,6 +10,7 @@ export interface MiningAccountDto {
|
||||||
frozenBalance: string;
|
frozenBalance: string;
|
||||||
totalBalance: string;
|
totalBalance: string;
|
||||||
totalContribution: string;
|
totalContribution: string;
|
||||||
|
perSecondEarning: string; // 每秒收益 = (用户贡献 / 全网贡献) × 每秒分配量
|
||||||
lastSyncedAt: Date | null;
|
lastSyncedAt: Date | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -38,6 +40,7 @@ export interface MiningTransactionDto {
|
||||||
export class GetMiningAccountQuery {
|
export class GetMiningAccountQuery {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly accountRepository: MiningAccountRepository,
|
private readonly accountRepository: MiningAccountRepository,
|
||||||
|
private readonly configRepository: MiningConfigRepository,
|
||||||
private readonly prisma: PrismaService,
|
private readonly prisma: PrismaService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
|
@ -47,6 +50,24 @@ export class GetMiningAccountQuery {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 计算每秒收益 = (用户贡献 / 全网贡献) × 每秒分配量
|
||||||
|
let perSecondEarning = '0';
|
||||||
|
try {
|
||||||
|
const [config, totalContribution] = await Promise.all([
|
||||||
|
this.configRepository.getConfig(),
|
||||||
|
this.accountRepository.getTotalContribution(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (config && totalContribution.toNumber() > 0) {
|
||||||
|
const userContribution = account.totalContribution.toNumber();
|
||||||
|
const secondDistribution = config.secondDistribution.toNumber();
|
||||||
|
const ratio = userContribution / totalContribution.toNumber();
|
||||||
|
perSecondEarning = (ratio * secondDistribution).toFixed(8);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// 如果计算失败,返回 0
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
accountSequence: account.accountSequence,
|
accountSequence: account.accountSequence,
|
||||||
totalMined: account.totalMined.toString(),
|
totalMined: account.totalMined.toString(),
|
||||||
|
|
@ -54,6 +75,7 @@ export class GetMiningAccountQuery {
|
||||||
frozenBalance: account.frozenBalance.toString(),
|
frozenBalance: account.frozenBalance.toString(),
|
||||||
totalBalance: account.totalBalance.toString(),
|
totalBalance: account.totalBalance.toString(),
|
||||||
totalContribution: account.totalContribution.toString(),
|
totalContribution: account.totalContribution.toString(),
|
||||||
|
perSecondEarning,
|
||||||
lastSyncedAt: account.lastSyncedAt,
|
lastSyncedAt: account.lastSyncedAt,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,15 @@ class ShareAccountModel extends ShareAccount {
|
||||||
factory ShareAccountModel.fromJson(Map<String, dynamic> json) {
|
factory ShareAccountModel.fromJson(Map<String, dynamic> json) {
|
||||||
return ShareAccountModel(
|
return ShareAccountModel(
|
||||||
accountSequence: json['accountSequence']?.toString() ?? '',
|
accountSequence: json['accountSequence']?.toString() ?? '',
|
||||||
miningBalance: json['miningBalance']?.toString() ?? '0',
|
// 后端返回 availableBalance,映射到 miningBalance
|
||||||
tradingBalance: json['tradingBalance']?.toString() ?? '0',
|
miningBalance: json['availableBalance']?.toString() ?? json['miningBalance']?.toString() ?? '0',
|
||||||
|
// 后端返回 totalBalance,映射到 tradingBalance(可交易余额)
|
||||||
|
tradingBalance: json['totalBalance']?.toString() ?? json['tradingBalance']?.toString() ?? '0',
|
||||||
frozenBalance: json['frozenBalance']?.toString() ?? '0',
|
frozenBalance: json['frozenBalance']?.toString() ?? '0',
|
||||||
totalMined: json['totalMined']?.toString() ?? '0',
|
totalMined: json['totalMined']?.toString() ?? '0',
|
||||||
perSecondEarning: json['perSecondEarning']?.toString() ?? '0',
|
perSecondEarning: json['perSecondEarning']?.toString() ?? '0',
|
||||||
effectiveContribution: json['effectiveContribution']?.toString() ?? '0',
|
// 后端返回 totalContribution,映射到 effectiveContribution
|
||||||
|
effectiveContribution: json['totalContribution']?.toString() ?? json['effectiveContribution']?.toString() ?? '0',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue