From bb75ff19a4f2e3df0434a273eaccc34f9293e3ea Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 16 Jan 2026 04:46:12 -0800 Subject: [PATCH] =?UTF-8?q?feat(contribution):=20=E8=AE=A4=E7=A7=8D?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=90=8E=E8=87=AA=E5=8A=A8=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E5=85=A8=E7=BD=91=E8=BF=9B=E5=BA=A6=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 每次认种分配完成后发布 NetworkProgressUpdatedEvent - mining-service 通过 Kafka 实时接收全网理论算力更新 - 定时同步改为每5分钟一次,作为兜底方案 Co-Authored-By: Claude Opus 4.5 --- .../contribution-calculation.service.ts | 33 +++++++++++++++++++ .../schedulers/mining.scheduler.ts | 5 +-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/backend/services/contribution-service/src/application/services/contribution-calculation.service.ts b/backend/services/contribution-service/src/application/services/contribution-calculation.service.ts index ebe028a4..d21899ca 100644 --- a/backend/services/contribution-service/src/application/services/contribution-calculation.service.ts +++ b/backend/services/contribution-service/src/application/services/contribution-calculation.service.ts @@ -113,6 +113,39 @@ export class ContributionCalculationService { `teamBonus=${result.teamBonusRecords.length}, ` + `unallocated=${result.unallocatedContributions.length}`, ); + + // 发布全网进度更新事件(用于 mining-service 同步全网理论算力) + await this.publishNetworkProgressEvent(); + } + + /** + * 发布全网进度更新事件 + */ + private async publishNetworkProgressEvent(): Promise { + try { + const progress = await this.contributionRateService.getNetworkProgress(); + + const event = new NetworkProgressUpdatedEvent( + progress.totalTreeCount, + progress.totalAdoptionOrders, + progress.totalAdoptedUsers, + progress.currentUnit, + progress.currentMultiplier.toString(), + progress.currentContributionPerTree.toString(), + progress.nextUnitTreeCount, + ); + + await this.outboxRepository.save({ + aggregateType: NetworkProgressUpdatedEvent.AGGREGATE_TYPE, + aggregateId: 'network', + eventType: NetworkProgressUpdatedEvent.EVENT_TYPE, + payload: event.toPayload(), + }); + + this.logger.debug(`Published NetworkProgressUpdatedEvent: trees=${progress.totalTreeCount}`); + } catch (error) { + this.logger.error('Failed to publish NetworkProgressUpdatedEvent', error); + } } /** diff --git a/backend/services/mining-service/src/application/schedulers/mining.scheduler.ts b/backend/services/mining-service/src/application/schedulers/mining.scheduler.ts index a393fbee..b3003018 100644 --- a/backend/services/mining-service/src/application/schedulers/mining.scheduler.ts +++ b/backend/services/mining-service/src/application/schedulers/mining.scheduler.ts @@ -118,9 +118,10 @@ export class MiningScheduler implements OnModuleInit { } /** - * 每分钟同步全网数据(系统账户算力、全网理论算力) + * 每5分钟同步全网数据(兜底方案,防止 Kafka 事件丢失) + * 正常情况下由 Kafka 事件驱动实时同步 */ - @Cron(CronExpression.EVERY_MINUTE) + @Cron(CronExpression.EVERY_5_MINUTES) async syncNetworkData(): Promise { const lockValue = await this.redis.acquireLock('mining:network-sync:lock', 30); if (!lockValue) {