feat(mining): 添加 perSecondEarning 到挖矿账户 API

- 后端:计算每秒收益 = (用户贡献 / 全网贡献) × 每秒分配量
- 前端:修正字段映射以匹配后端返回格式

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-17 22:56:19 -08:00
parent 33233901a9
commit 4f1f1f9eaf
2 changed files with 28 additions and 3 deletions

View File

@ -1,5 +1,6 @@
import { Injectable } from '@nestjs/common';
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';
export interface MiningAccountDto {
@ -9,6 +10,7 @@ export interface MiningAccountDto {
frozenBalance: string;
totalBalance: string;
totalContribution: string;
perSecondEarning: string; // 每秒收益 = (用户贡献 / 全网贡献) × 每秒分配量
lastSyncedAt: Date | null;
}
@ -38,6 +40,7 @@ export interface MiningTransactionDto {
export class GetMiningAccountQuery {
constructor(
private readonly accountRepository: MiningAccountRepository,
private readonly configRepository: MiningConfigRepository,
private readonly prisma: PrismaService,
) {}
@ -47,6 +50,24 @@ export class GetMiningAccountQuery {
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 {
accountSequence: account.accountSequence,
totalMined: account.totalMined.toString(),
@ -54,6 +75,7 @@ export class GetMiningAccountQuery {
frozenBalance: account.frozenBalance.toString(),
totalBalance: account.totalBalance.toString(),
totalContribution: account.totalContribution.toString(),
perSecondEarning,
lastSyncedAt: account.lastSyncedAt,
};
}

View File

@ -14,12 +14,15 @@ class ShareAccountModel extends ShareAccount {
factory ShareAccountModel.fromJson(Map<String, dynamic> json) {
return ShareAccountModel(
accountSequence: json['accountSequence']?.toString() ?? '',
miningBalance: json['miningBalance']?.toString() ?? '0',
tradingBalance: json['tradingBalance']?.toString() ?? '0',
// availableBalance miningBalance
miningBalance: json['availableBalance']?.toString() ?? json['miningBalance']?.toString() ?? '0',
// totalBalance tradingBalance
tradingBalance: json['totalBalance']?.toString() ?? json['tradingBalance']?.toString() ?? '0',
frozenBalance: json['frozenBalance']?.toString() ?? '0',
totalMined: json['totalMined']?.toString() ?? '0',
perSecondEarning: json['perSecondEarning']?.toString() ?? '0',
effectiveContribution: json['effectiveContribution']?.toString() ?? '0',
// totalContribution effectiveContribution
effectiveContribution: json['totalContribution']?.toString() ?? json['effectiveContribution']?.toString() ?? '0',
);
}