fix(wallet): skip rebate task without tenant config

This commit is contained in:
zhx 2026-07-14 11:01:36 +08:00
parent 2d925fb68f
commit 1506ceb7e8
2 changed files with 20 additions and 1 deletions

View File

@ -14,6 +14,20 @@ import (
"hyapp/services/wallet-service/internal/testutil/mysqltest" "hyapp/services/wallet-service/internal/testutil/mysqltest"
) )
func TestVipDailyCoinRebateMissingProgramIsNoOp(t *testing.T) {
repository := mysqltest.NewRepository(t)
service := walletservice.New(repository)
taskDay := time.Now().UTC().Format("2006-01-02")
result, err := service.ProcessVipDailyCoinRebateBatch(
appcode.WithContext(context.Background(), "huwaa"),
ledger.ProcessVipDailyCoinRebateBatchCommand{AppCode: "huwaa", TaskDay: taskDay, BatchSize: 100},
)
if err != nil || result.HasMore || result.CreatedCount != 0 || result.ScannedCount != 0 {
t.Fatalf("missing VIP program must be an empty successful batch: result=%+v err=%v", result, err)
}
}
// TestVipDailyCoinRebateUTCWindowSnapshotAndClaim 覆盖返现最关键的不可变边界: // TestVipDailyCoinRebateUTCWindowSnapshotAndClaim 覆盖返现最关键的不可变边界:
// UTC 日切资格、run 配置快照、分页重放、App 隔离、available outbox 和并发领取仅入账一次。 // UTC 日切资格、run 配置快照、分页重放、App 隔离、available outbox 和并发领取仅入账一次。
func TestVipDailyCoinRebateUTCWindowSnapshotAndClaim(t *testing.T) { func TestVipDailyCoinRebateUTCWindowSnapshotAndClaim(t *testing.T) {

View File

@ -76,7 +76,12 @@ func (r *Repository) ProcessVipDailyCoinRebateBatch(ctx context.Context, command
// 避免两个不存在键的 gap lock 互相等待,并保证金额与 config_version 来自同一快照。 // 避免两个不存在键的 gap lock 互相等待,并保证金额与 config_version 来自同一快照。
program, lockErr := r.queryVipProgramConfig(ctx, tx.QueryRowContext(ctx, vipProgramSelectSQL()+` FOR UPDATE`, command.AppCode)) program, lockErr := r.queryVipProgramConfig(ctx, tx.QueryRowContext(ctx, vipProgramSelectSQL()+` FOR UPDATE`, command.AppCode))
if errors.Is(lockErr, sql.ErrNoRows) { if errors.Is(lockErr, sql.ErrNoRows) {
return ledger.ProcessVipDailyCoinRebateBatchResult{}, xerr.New(xerr.NotFound, "vip program config not found") // 租户注册表驱动的 cron 会覆盖所有启用 App未配置 VIP 的租户没有返现工作,
// 应按空批次结束,而不是每分钟制造不可重试的 NotFound 告警。
if err := tx.Commit(); err != nil {
return ledger.ProcessVipDailyCoinRebateBatchResult{}, err
}
return ledger.ProcessVipDailyCoinRebateBatchResult{}, nil
} }
if lockErr != nil { if lockErr != nil {
return ledger.ProcessVipDailyCoinRebateBatchResult{}, lockErr return ledger.ProcessVipDailyCoinRebateBatchResult{}, lockErr