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) {