feat(contribution): 认种处理后自动发布全网进度事件

- 每次认种分配完成后发布 NetworkProgressUpdatedEvent
- mining-service 通过 Kafka 实时接收全网理论算力更新
- 定时同步改为每5分钟一次,作为兜底方案

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-16 04:46:12 -08:00
parent 23bb8baa9c
commit bb75ff19a4
2 changed files with 36 additions and 2 deletions

View File

@ -113,6 +113,39 @@ export class ContributionCalculationService {
`teamBonus=${result.teamBonusRecords.length}, ` +
`unallocated=${result.unallocatedContributions.length}`,
);
// 发布全网进度更新事件(用于 mining-service 同步全网理论算力)
await this.publishNetworkProgressEvent();
}
/**
*
*/
private async publishNetworkProgressEvent(): Promise<void> {
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);
}
}
/**

View File

@ -118,9 +118,10 @@ export class MiningScheduler implements OnModuleInit {
}
/**
*
* 5 Kafka
* Kafka
*/
@Cron(CronExpression.EVERY_MINUTE)
@Cron(CronExpression.EVERY_5_MINUTES)
async syncNetworkData(): Promise<void> {
const lockValue = await this.redis.acquireLock('mining:network-sync:lock', 30);
if (!lockValue) {