fix(contribution): 发布过期份额同步事件 + 管理后台/挖矿app状态显示

- contribution-service: swapContributionForMerge 作废旧份额记录后,
  立即发布 ContributionRecordSynced outbox 事件(isExpired=true),
  mining-admin-service 收到后 upsert syncedContributionRecord
- mining-admin-web: 算力记录状态列改为绿色"有效"/红色"无效"
- mining-app: 贡献值记录卡片始终显示有效/无效状态标签

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-28 11:35:55 -08:00
parent a904c8bd42
commit 724fb08be4
3 changed files with 50 additions and 14 deletions

View File

@ -725,6 +725,39 @@ export class PrePlantingContributionService {
`[PRE-PLANTING-MERGE] Expired ${expiredCount.count} portion records for merge ${mergeNo}`,
);
// 9b-sync: 查询已作废的记录并发布同步事件mining-admin-service 需要更新 isExpired 状态)
if (expiredCount.count > 0) {
const expiredRecords = await tx.contributionRecord.findMany({
where: { sourceAdoptionId: { in: portionSourceAdoptionIds }, isExpired: true },
});
const expiredEvents = expiredRecords.map((record) => {
const event = new ContributionRecordSyncedEvent(
record.id,
record.accountSequence,
record.sourceType,
record.sourceAdoptionId,
record.sourceAccountSequence,
record.treeCount,
record.baseContribution.toString(),
record.distributionRate.toString(),
record.levelDepth,
record.bonusTier,
record.amount.toString(),
record.effectiveDate,
record.expireDate,
true,
record.createdAt,
);
return {
aggregateType: ContributionRecordSyncedEvent.AGGREGATE_TYPE,
aggregateId: record.id.toString(),
eventType: ContributionRecordSyncedEvent.EVENT_TYPE,
payload: event.toPayload(),
};
});
await this.outboxRepository.saveMany(expiredEvents);
}
// 9c: 从认种人账户扣减旧个人算力personal_contribution - 和 effective_contribution -
if (parseFloat(expiredPersonalStr) > 0) {
await tx.contributionAccount.updateMany({

View File

@ -164,9 +164,9 @@ export function ContributionRecordsList({ accountSequence }: ContributionRecords
<TableCell className="text-sm">{formatDate(record.effectiveDate)}</TableCell>
<TableCell>
{record.isExpired ? (
<Badge variant="destructive"></Badge>
<Badge variant="destructive"></Badge>
) : (
<Badge variant="secondary"></Badge>
<Badge className="border-transparent bg-green-500 text-white hover:bg-green-500/80"></Badge>
)}
</TableCell>
</TableRow>

View File

@ -354,20 +354,23 @@ class _ContributionRecordsListPageState extends ConsumerState<ContributionRecord
),
//
if (record.isExpired) ...[
const SizedBox(height: 8),
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
decoration: BoxDecoration(
color: Colors.red.withOpacity(0.1),
color: record.isExpired
? Colors.red.withOpacity(0.1)
: Colors.green.withOpacity(0.1),
borderRadius: BorderRadius.circular(4),
),
child: const Text(
'已过期',
style: TextStyle(fontSize: 10, color: Colors.red),
child: Text(
record.isExpired ? '无效' : '有效',
style: TextStyle(
fontSize: 10,
color: record.isExpired ? Colors.red : Colors.green,
),
),
),
],
],
),
),