fix(contribution): 修复T2/T3补发记录缺少treeCount和baseContribution
补发奖励时从SyncedAdoption查询原始认种数据, 确保补发记录包含正确的棵数和基础贡献值。 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
e4c320970f
commit
390cc3131d
|
|
@ -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<string, { treeCount: number; baseContribution: ContributionAmount }>();
|
||||
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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue