fix(wallet): fix message format parsing in RewardEventConsumerController
The OutboxPublisherService sends payload fields directly at the message root level, not nested under a 'payload' property. Update the consumer to read fields directly from message instead of message.payload. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
1acb314e7b
commit
a1ca490ff4
|
|
@ -6,23 +6,24 @@ import Decimal from 'decimal.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 奖励事件消息结构
|
* 奖励事件消息结构
|
||||||
|
*
|
||||||
|
* 注意:OutboxPublisherService 发送的消息格式是将 payload 字段直接展开在顶层
|
||||||
|
* 所以 accountSequence 等字段直接在消息根级别
|
||||||
*/
|
*/
|
||||||
interface RewardSummaryUpdatedEvent {
|
interface RewardSummaryUpdatedEvent {
|
||||||
eventType: string;
|
// payload 字段直接展开在顶层
|
||||||
aggregateId: string;
|
accountSequence: string;
|
||||||
payload: {
|
userId: string;
|
||||||
accountSequence: string;
|
pendingUsdt: number;
|
||||||
userId: string;
|
pendingHashpower: number;
|
||||||
pendingUsdt: number;
|
pendingExpireAt: string | null;
|
||||||
pendingHashpower: number;
|
settleableUsdt: number;
|
||||||
pendingExpireAt: string | null;
|
settleableHashpower: number;
|
||||||
settleableUsdt: number;
|
settledTotalUsdt: number;
|
||||||
settleableHashpower: number;
|
settledTotalHashpower: number;
|
||||||
settledTotalUsdt: number;
|
expiredTotalUsdt: number;
|
||||||
settledTotalHashpower: number;
|
expiredTotalHashpower: number;
|
||||||
expiredTotalUsdt: number;
|
// outbox 元数据
|
||||||
expiredTotalHashpower: number;
|
|
||||||
};
|
|
||||||
_outbox?: {
|
_outbox?: {
|
||||||
id: string;
|
id: string;
|
||||||
aggregateId: string;
|
aggregateId: string;
|
||||||
|
|
@ -56,13 +57,15 @@ export class RewardEventConsumerController {
|
||||||
const partition = context.getPartition();
|
const partition = context.getPartition();
|
||||||
const offset = context.getMessage().offset;
|
const offset = context.getMessage().offset;
|
||||||
const outboxInfo = message._outbox;
|
const outboxInfo = message._outbox;
|
||||||
const eventId = outboxInfo?.aggregateId || message.aggregateId;
|
// eventId 和 eventType 来自 _outbox 元数据,或者使用 accountSequence 作为备用
|
||||||
const eventType = outboxInfo?.eventType || message.eventType;
|
const eventId = outboxInfo?.aggregateId || message.accountSequence;
|
||||||
|
const eventType = outboxInfo?.eventType || 'reward.summary.updated';
|
||||||
|
|
||||||
this.logger.log(
|
this.logger.log(
|
||||||
`[REWARD-EVENT] Received reward.summary.updated for ${eventId} ` +
|
`[REWARD-EVENT] Received reward.summary.updated for ${eventId} ` +
|
||||||
`[partition=${partition}, offset=${offset}]`,
|
`[partition=${partition}, offset=${offset}]`,
|
||||||
);
|
);
|
||||||
|
this.logger.debug(`[REWARD-EVENT] Message content: ${JSON.stringify(message)}`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 1. 幂等性检查
|
// 1. 幂等性检查
|
||||||
|
|
@ -85,23 +88,23 @@ export class RewardEventConsumerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 更新 wallet_accounts 表的 rewards 数据
|
// 2. 更新 wallet_accounts 表的 rewards 数据
|
||||||
const payload = message.payload;
|
// 注意:payload 字段直接展开在消息顶层
|
||||||
const accountSequence = BigInt(payload.accountSequence);
|
const accountSequence = BigInt(message.accountSequence);
|
||||||
|
|
||||||
await this.prisma.$transaction(async (tx) => {
|
await this.prisma.$transaction(async (tx) => {
|
||||||
// 更新钱包账户的奖励数据
|
// 更新钱包账户的奖励数据
|
||||||
await tx.walletAccount.update({
|
await tx.walletAccount.update({
|
||||||
where: { accountSequence },
|
where: { accountSequence },
|
||||||
data: {
|
data: {
|
||||||
pendingUsdt: new Decimal(payload.pendingUsdt),
|
pendingUsdt: new Decimal(message.pendingUsdt),
|
||||||
pendingHashpower: new Decimal(payload.pendingHashpower),
|
pendingHashpower: new Decimal(message.pendingHashpower),
|
||||||
pendingExpireAt: payload.pendingExpireAt ? new Date(payload.pendingExpireAt) : null,
|
pendingExpireAt: message.pendingExpireAt ? new Date(message.pendingExpireAt) : null,
|
||||||
settleableUsdt: new Decimal(payload.settleableUsdt),
|
settleableUsdt: new Decimal(message.settleableUsdt),
|
||||||
settleableHashpower: new Decimal(payload.settleableHashpower),
|
settleableHashpower: new Decimal(message.settleableHashpower),
|
||||||
settledTotalUsdt: new Decimal(payload.settledTotalUsdt),
|
settledTotalUsdt: new Decimal(message.settledTotalUsdt),
|
||||||
settledTotalHashpower: new Decimal(payload.settledTotalHashpower),
|
settledTotalHashpower: new Decimal(message.settledTotalHashpower),
|
||||||
expiredTotalUsdt: new Decimal(payload.expiredTotalUsdt),
|
expiredTotalUsdt: new Decimal(message.expiredTotalUsdt),
|
||||||
expiredTotalHashpower: new Decimal(payload.expiredTotalHashpower),
|
expiredTotalHashpower: new Decimal(message.expiredTotalHashpower),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -117,7 +120,7 @@ export class RewardEventConsumerController {
|
||||||
|
|
||||||
this.logger.log(
|
this.logger.log(
|
||||||
`[REWARD-EVENT] ✓ Updated rewards for accountSequence ${accountSequence}: ` +
|
`[REWARD-EVENT] ✓ Updated rewards for accountSequence ${accountSequence}: ` +
|
||||||
`settleable=${payload.settleableUsdt}, pending=${payload.pendingUsdt}`,
|
`settleable=${message.settleableUsdt}, pending=${message.pendingUsdt}`,
|
||||||
);
|
);
|
||||||
|
|
||||||
// 3. 发送确认
|
// 3. 发送确认
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue