From 8b8d1f7d16b1e5da3f40dd6a1012f0e11ee8d009 Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 21 Jan 2026 21:17:00 -0800 Subject: [PATCH] =?UTF-8?q?Revert=20"fix(batch-mining):=20=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 4dcbe38309a30ac90601f0cbb8fca4096d33fcdf. --- .../services/batch-mining.service.ts | 80 ++++++++++++------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/backend/services/mining-service/src/application/services/batch-mining.service.ts b/backend/services/mining-service/src/application/services/batch-mining.service.ts index f5c8a585..50697f45 100644 --- a/backend/services/mining-service/src/application/services/batch-mining.service.ts +++ b/backend/services/mining-service/src/application/services/batch-mining.service.ts @@ -136,11 +136,11 @@ export class BatchMiningService { /** * 预览批量补发(计算但不执行) * - * 简化计算逻辑: - * - 每日产出 = 每秒分配量 × 86400 - * - 用户收益 = (用户算力 / 全网算力) × 每日产出 × 天数 - * - 用户占全网70%,所以全网算力 = 用户算力 / 0.7 - * - 公式验证: (1000000/365/2)*70%*74 = 70958.90411 + * 分阶段计算逻辑: + * - 阶段1(3天):只有批次1在挖,批次1独占全部产出 + * - 阶段2(2天):批次1+2一起挖,按算力比例分 + * - 阶段3(1天):批次1+2+3一起挖,按算力比例分 + * - 阶段4(剩余天数):所有批次一起挖到今天 */ async preview(items: BatchMiningItem[]): Promise { this.logger.log(`[preview] 开始预览批量补发, 共 ${items.length} 条数据`); @@ -170,8 +170,7 @@ export class BatchMiningService { } const secondDistribution = config.secondDistribution.value; - const dailyDistribution = secondDistribution.times(SECONDS_PER_DAY); - this.logger.log(`[preview] 每秒分配量: ${secondDistribution.toString()}, 每日分配量: ${dailyDistribution.toFixed(6)}`); + this.logger.log(`[preview] 每秒分配量: ${secondDistribution.toString()}`); // 按批次分组并排序 const batchGroups = this.groupByBatch(items); @@ -190,40 +189,61 @@ export class BatchMiningService { this.logger.log(`[preview] 批次${batchNum}算力: ${batchTotal.toFixed(2)}`); } - // 计算用户总算力和全网算力 - let totalUserContribution = new Decimal(0); - for (const contribution of batchContributions.values()) { - totalUserContribution = totalUserContribution.plus(contribution); - } - // 用户只占全网的70%(30%是系统、运营、层级、团队),所以全网算力 = 用户算力 / 0.7 - const networkContribution = totalUserContribution.dividedBy(USER_NETWORK_RATIO); - this.logger.log(`[preview] 用户总算力: ${totalUserContribution.toFixed(2)}, 全网算力(用户占70%): ${networkContribution.toFixed(2)}`); - - // 获取最大总挖矿天数 - let maxTotalMiningDays = 0; + // 计算每个用户的算力 + const userContributions = new Map(); for (const item of items) { - if (item.totalMiningDays && item.totalMiningDays > maxTotalMiningDays) { - maxTotalMiningDays = item.totalMiningDays; - } + userContributions.set(item.accountSequence, this.calculateUserContribution(item.treeCount)); } - this.logger.log(`[preview] 最大总挖矿天数: ${maxTotalMiningDays}`); - // 简化计算:所有用户按各自的总挖矿天数计算收益 - // 用户收益 = (用户算力 / 全网算力) × 每日产出 × 天数 + // 定义挖矿阶段 + // 阶段1: 批次1独挖3天 + // 阶段2: 批次1+2共挖2天 + // 阶段3: 批次1+2+3共挖1天 + // 阶段4: 所有批次共挖(剩余天数) + const phases = this.buildMiningPhases(items, sortedBatches, batchContributions); + this.logger.log(`[preview] 挖矿阶段: ${JSON.stringify(phases.map(p => ({ + phase: p.phaseNumber, + days: p.daysInPhase, + batches: p.participatingBatches, + networkContribution: p.networkContribution.toFixed(2) + })))}`); + + // 计算每个用户在各阶段的收益 const userAmounts = new Map(); for (const item of items) { - const userContribution = this.calculateUserContribution(item.treeCount); - const ratio = userContribution.dividedBy(networkContribution); - const days = item.totalMiningDays || maxTotalMiningDays; - const amount = dailyDistribution.times(ratio).times(days); - userAmounts.set(item.accountSequence, amount); - this.logger.debug(`[preview] 用户 ${item.accountSequence}: 算力=${userContribution.toFixed(2)}, 占比=${ratio.toFixed(6)}, 天数=${days}, 金额=${amount.toFixed(8)}`); + userAmounts.set(item.accountSequence, new Decimal(0)); + } + + for (const phase of phases) { + const dailyDistribution = secondDistribution.times(SECONDS_PER_DAY); + const phaseDistribution = dailyDistribution.times(phase.daysInPhase); + + for (const item of items) { + // 检查该用户的批次是否参与此阶段 + if (phase.participatingBatches.includes(item.batch)) { + const userContribution = userContributions.get(item.accountSequence)!; + const ratio = userContribution.dividedBy(phase.networkContribution); + const phaseAmount = phaseDistribution.times(ratio); + + const currentAmount = userAmounts.get(item.accountSequence)!; + userAmounts.set(item.accountSequence, currentAmount.plus(phaseAmount)); + } + } } // 构建返回结果 let grandTotalAmount = new Decimal(0); const batchResults: BatchMiningPreviewResult['batches'] = []; + // 计算累计全网算力(最终状态) + // 用户只占全网的70%(30%是系统、运营、层级、团队),所以全网算力 = 用户算力 / 0.7 + let totalUserContribution = new Decimal(0); + for (const contribution of batchContributions.values()) { + totalUserContribution = totalUserContribution.plus(contribution); + } + const finalNetworkContribution = totalUserContribution.dividedBy(USER_NETWORK_RATIO); + this.logger.log(`[preview] 用户总算力: ${totalUserContribution.toFixed(2)}, 全网算力(用户占70%): ${finalNetworkContribution.toFixed(2)}`); + for (const batchNum of sortedBatches) { const batchItems = batchGroups.get(batchNum)!; const batchContribution = batchContributions.get(batchNum)!;