fix(wallet-service): 修复待领取奖励显示和结算触发问题
Bug 1: allocateToUserWallet 同步更新 wallet_accounts.pending_usdt - 写入 pending_rewards 表时同步调用 wallet.addPendingReward() - 修复前端待领取金额显示为 0 的问题 Bug 2: Kafka 事件类型匹配兼容 planting-service 格式 - 支持 eventName 字段解析 (planting-service 使用) - 支持 data 字段解析 (planting-service 使用) - 新增 PlantingOrderPaid 事件类型支持 - 修复用户认种后待领取无法转换为可结算的问题 其他: 定时任务频率改为每分钟一次 (测试用途) 🤖 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
e4389a5733
commit
28864e6160
|
|
@ -5,7 +5,7 @@ import { WalletApplicationService } from '@/application/services';
|
|||
/**
|
||||
* 过期奖励处理定时任务
|
||||
*
|
||||
* 每小时执行一次,处理已过期的待领取奖励:
|
||||
* 每分钟执行一次,处理已过期的待领取奖励:
|
||||
* 1. 扫描 pending_rewards 表中 status=PENDING 且 expire_at < now 的记录
|
||||
* 2. 标记为 EXPIRED
|
||||
* 3. 将过期金额转移到总部社区账户 (S0000000001)
|
||||
|
|
@ -19,9 +19,9 @@ export class ExpiredRewardsScheduler {
|
|||
) {}
|
||||
|
||||
/**
|
||||
* 每小时执行一次过期奖励处理
|
||||
* 每分钟执行一次过期奖励处理
|
||||
*/
|
||||
@Cron(CronExpression.EVERY_HOUR)
|
||||
@Cron(CronExpression.EVERY_MINUTE)
|
||||
async handleExpiredRewards(): Promise<void> {
|
||||
this.logger.log('Starting expired rewards processing job...');
|
||||
|
||||
|
|
|
|||
|
|
@ -668,6 +668,10 @@ export class WalletApplicationService {
|
|||
});
|
||||
await this.pendingRewardRepo.save(pendingReward);
|
||||
|
||||
// 同步更新 wallet_accounts 表的 pending_usdt 字段
|
||||
wallet.addPendingReward(amount, Hashpower.create(0), expireAt, orderId);
|
||||
await this.walletRepo.save(wallet);
|
||||
|
||||
// 记录流水
|
||||
const ledgerEntry = LedgerEntry.create({
|
||||
accountSequence: wallet.accountSequence,
|
||||
|
|
|
|||
|
|
@ -111,14 +111,17 @@ export class PlantingEventConsumerService implements OnModuleInit, OnModuleDestr
|
|||
this.logger.debug(`[RECEIVE] Raw message: ${value.substring(0, 500)}...`);
|
||||
|
||||
const parsed = JSON.parse(value);
|
||||
const eventType = parsed.eventType || parsed.type;
|
||||
const payload = parsed.payload || parsed;
|
||||
// 兼容多种事件格式: eventType, type, eventName
|
||||
const eventType = parsed.eventType || parsed.type || parsed.eventName;
|
||||
// 兼容多种数据格式: payload, data, 或直接在根级别
|
||||
const payload = parsed.payload || parsed.data || parsed;
|
||||
|
||||
this.logger.log(`[RECEIVE] Event type: ${eventType}`);
|
||||
|
||||
// 监听认种创建事件 - 用户认种后,结算其所有待领取奖励
|
||||
if (eventType === 'planting.planting.created' || eventType === 'PlantingOrderCreated') {
|
||||
this.logger.log(`[HANDLE] Processing PlantingCreated event`);
|
||||
// 监听认种支付完成事件 - 用户认种后,结算其所有待领取奖励
|
||||
// 支持: PlantingOrderPaid, PlantingOrderCreated, planting.planting.created
|
||||
if (eventType === 'PlantingOrderPaid' || eventType === 'planting.planting.created' || eventType === 'PlantingOrderCreated') {
|
||||
this.logger.log(`[HANDLE] Processing PlantingPaid event`);
|
||||
this.logger.log(`[HANDLE] orderNo: ${payload.orderNo}`);
|
||||
this.logger.log(`[HANDLE] accountSequence: ${payload.accountSequence}`);
|
||||
this.logger.log(`[HANDLE] userId: ${payload.userId}`);
|
||||
|
|
|
|||
Loading…
Reference in New Issue