diff --git a/backend/services/contribution-service/src/application/services/bonus-claim.service.ts b/backend/services/contribution-service/src/application/services/bonus-claim.service.ts index 7f812898..187e366a 100644 --- a/backend/services/contribution-service/src/application/services/bonus-claim.service.ts +++ b/backend/services/contribution-service/src/application/services/bonus-claim.service.ts @@ -4,6 +4,7 @@ import { ContributionAccountRepository } from '../../infrastructure/persistence/ import { ContributionRecordRepository } from '../../infrastructure/persistence/repositories/contribution-record.repository'; import { SystemAccountRepository } from '../../infrastructure/persistence/repositories/system-account.repository'; import { OutboxRepository } from '../../infrastructure/persistence/repositories/outbox.repository'; +import { SyncedDataRepository } from '../../infrastructure/persistence/repositories/synced-data.repository'; import { UnitOfWork } from '../../infrastructure/persistence/unit-of-work/unit-of-work'; import { ContributionRecordAggregate } from '../../domain/aggregates/contribution-record.aggregate'; import { ContributionSourceType } from '../../domain/aggregates/contribution-account.aggregate'; @@ -25,6 +26,7 @@ export class BonusClaimService { private readonly contributionRecordRepository: ContributionRecordRepository, private readonly systemAccountRepository: SystemAccountRepository, private readonly outboxRepository: OutboxRepository, + private readonly syncedDataRepository: SyncedDataRepository, private readonly unitOfWork: UnitOfWork, ) {} @@ -97,16 +99,39 @@ export class BonusClaimService { `Claiming ${pendingRecords.length} T${bonusTier} bonus records for ${accountSequence}`, ); - // 2. 创建贡献值记录 + // 2. 查询原始认种数据,获取 treeCount 和 baseContribution + const adoptionDataMap = new Map(); + for (const pending of pendingRecords) { + const adoptionIdStr = pending.sourceAdoptionId.toString(); + if (!adoptionDataMap.has(adoptionIdStr)) { + const adoption = await this.syncedDataRepository.findSyncedAdoptionByOriginalId(pending.sourceAdoptionId); + if (adoption) { + adoptionDataMap.set(adoptionIdStr, { + treeCount: adoption.treeCount, + baseContribution: new ContributionAmount(adoption.contributionPerTree), + }); + } else { + // 如果找不到原始认种数据,使用默认值并记录警告 + this.logger.warn(`Adoption not found for sourceAdoptionId: ${pending.sourceAdoptionId}, using default values`); + adoptionDataMap.set(adoptionIdStr, { + treeCount: 0, + baseContribution: new ContributionAmount(0), + }); + } + } + } + + // 3. 创建贡献值记录 const contributionRecords: ContributionRecordAggregate[] = []; for (const pending of pendingRecords) { + const adoptionData = adoptionDataMap.get(pending.sourceAdoptionId.toString())!; const record = new ContributionRecordAggregate({ accountSequence: accountSequence, sourceType: ContributionSourceType.TEAM_BONUS, sourceAdoptionId: pending.sourceAdoptionId, sourceAccountSequence: pending.sourceAccountSequence, - treeCount: 0, // 补发记录不记录树数 - baseContribution: new ContributionAmount(0), + treeCount: adoptionData.treeCount, + baseContribution: adoptionData.baseContribution, distributionRate: DistributionRate.BONUS_PER, bonusTier: bonusTier, amount: pending.amount, @@ -116,10 +141,10 @@ export class BonusClaimService { contributionRecords.push(record); } - // 3. 保存贡献值记录 + // 4. 保存贡献值记录 const savedRecords = await this.contributionRecordRepository.saveMany(contributionRecords); - // 4. 更新用户的贡献值账户 + // 5. 更新用户的贡献值账户 let totalAmount = new ContributionAmount(0); for (const pending of pendingRecords) { totalAmount = new ContributionAmount(totalAmount.value.plus(pending.amount.value)); @@ -133,11 +158,11 @@ export class BonusClaimService { bonusTier, ); - // 5. 标记待领取记录为已分配 + // 6. 标记待领取记录为已分配 const pendingIds = pendingRecords.map((r) => r.id); await this.unallocatedContributionRepository.claimBonusRecords(pendingIds, accountSequence); - // 6. 从 HEADQUARTERS 减少算力并删除明细记录 + // 7. 从 HEADQUARTERS 减少算力并删除明细记录 await this.systemAccountRepository.subtractContribution('HEADQUARTERS', null, totalAmount); for (const pending of pendingRecords) { await this.systemAccountRepository.deleteContributionRecordsByAdoption( @@ -148,7 +173,7 @@ export class BonusClaimService { ); } - // 7. 发布 HEADQUARTERS 账户更新事件 + // 8. 发布 HEADQUARTERS 账户更新事件 const headquartersAccount = await this.systemAccountRepository.findByTypeAndRegion('HEADQUARTERS', null); if (headquartersAccount) { const hqEvent = new SystemAccountSyncedEvent( @@ -166,7 +191,7 @@ export class BonusClaimService { }); } - // 8. 发布事件到 Kafka(通过 Outbox) + // 9. 发布事件到 Kafka(通过 Outbox) await this.publishBonusClaimEvents(accountSequence, savedRecords, pendingRecords); this.logger.log(