diff --git a/internal/service/invite/invite_test.go b/internal/service/invite/invite_test.go index 206f094..f33134e 100644 --- a/internal/service/invite/invite_test.go +++ b/internal/service/invite/invite_test.go @@ -368,7 +368,7 @@ func TestBindCodeAcceptsSnakeInviteCodeAndIsIdempotent(t *testing.T) { } } -func TestGetRankUsesLifetimeValidUserAndRewardStats(t *testing.T) { +func TestGetRankUsesLifetimeInviteAndRewardStats(t *testing.T) { service, db, cleanup := newTestInviteService(t, nil) defer cleanup() @@ -379,6 +379,8 @@ func TestGetRankUsesLifetimeValidUserAndRewardStats(t *testing.T) { &model.InviteCampaignRelation{ID: 3, SysOrigin: "LIKEI", InviterUserID: 20, InviteeUserID: 203, EligibleStatus: relationStatusEligible, BindTime: now, CreateTime: now, UpdateTime: now}, &model.InviteCampaignRelation{ID: 4, SysOrigin: "LIKEI", InviterUserID: 10, InviteeUserID: 101, EligibleStatus: relationStatusEligible, BindTime: now, CreateTime: now, UpdateTime: now}, &model.InviteCampaignRelation{ID: 5, SysOrigin: "LIKEI", InviterUserID: 10, InviteeUserID: 102, EligibleStatus: relationStatusBlocked, BindTime: now, CreateTime: now, UpdateTime: now}, + &model.InviteCampaignRelation{ID: 6, SysOrigin: "LIKEI", InviterUserID: 30, InviteeUserID: 301, EligibleStatus: relationStatusEligible, BindTime: now, CreateTime: now, UpdateTime: now}, + &model.InviteCampaignRelation{ID: 7, SysOrigin: "LIKEI", InviterUserID: 30, InviteeUserID: 302, EligibleStatus: relationStatusEligible, BindTime: now, CreateTime: now, UpdateTime: now}, &model.InviteCampaignInviteeProgress{ID: 101, RelationID: 1, SysOrigin: "LIKEI", InviterUserID: 20, InviteeUserID: 201, TotalRecharge: 80000, ValidUser: true, ValidTime: refTime(now), CreateTime: now, UpdateTime: now}, &model.InviteCampaignInviteeProgress{ID: 102, RelationID: 2, SysOrigin: "LIKEI", InviterUserID: 20, InviteeUserID: 202, TotalRecharge: 79999, ValidUser: false, CreateTime: now, UpdateTime: now}, &model.InviteCampaignInviteeProgress{ID: 103, RelationID: 3, SysOrigin: "LIKEI", InviterUserID: 20, InviteeUserID: 203, TotalRecharge: 80000, ValidUser: true, ValidTime: refTime(now), CreateTime: now, UpdateTime: now}, @@ -386,6 +388,7 @@ func TestGetRankUsesLifetimeValidUserAndRewardStats(t *testing.T) { &model.InviteCampaignInviteeProgress{ID: 105, RelationID: 5, SysOrigin: "LIKEI", InviterUserID: 10, InviteeUserID: 102, TotalRecharge: 80000, ValidUser: true, ValidTime: refTime(now), CreateTime: now, UpdateTime: now}, &model.UserBaseInfo{ID: 20, Account: "user20", UserNickname: "Mina", UserAvatar: "avatar-20", OriginSys: "LIKEI", CreateTime: now}, &model.UserBaseInfo{ID: 10, Account: "user10", UserNickname: "Lina", UserAvatar: "avatar-10", OriginSys: "LIKEI", CreateTime: now}, + &model.UserBaseInfo{ID: 30, Account: "user30", UserNickname: "Nora", UserAvatar: "avatar-30", OriginSys: "LIKEI", CreateTime: now}, &model.InviteCampaignRewardLog{ID: 11, SysOrigin: "LIKEI", InviterUserID: refInt64(20), TargetUserID: 20, BusinessKey: "r20-1", GoldAmount: 100, Status: rewardLogStatusSuccess, CreateTime: now, UpdateTime: now}, &model.InviteCampaignRewardLog{ID: 12, SysOrigin: "LIKEI", InviterUserID: refInt64(20), TargetUserID: 20, BusinessKey: "r20-2", GoldAmount: 200, Status: rewardLogStatusSuccess, CreateTime: now, UpdateTime: now}, &model.InviteCampaignRewardLog{ID: 13, SysOrigin: "LIKEI", InviterUserID: refInt64(10), TargetUserID: 10, BusinessKey: "r10-1", GoldAmount: 900, Status: rewardLogStatusSuccess, CreateTime: now, UpdateTime: now}, @@ -402,14 +405,17 @@ func TestGetRankUsesLifetimeValidUserAndRewardStats(t *testing.T) { if err != nil { t.Fatalf("GetRank() error = %v", err) } - if len(resp.Items) != 2 { - t.Fatalf("rank length = %d, want 2", len(resp.Items)) + if len(resp.Items) != 3 { + t.Fatalf("rank length = %d, want 3", len(resp.Items)) } - if got := resp.Items[0]; got.Rank != 1 || got.UserID != 20 || got.Nickname != "Mina" || got.InviteCount != 2 || got.RewardGoldCoins != 300 { - t.Fatalf("top rank = %+v, want user 20 count 2 reward 300", got) + if got := resp.Items[0]; got.Rank != 1 || got.UserID != 10 || got.Nickname != "Lina" || got.InviteCount != 1 || got.RewardGoldCoins != 900 { + t.Fatalf("top rank = %+v, want user 10 count 1 reward 900", got) } - if got := resp.Items[1]; got.Rank != 2 || got.UserID != 10 || got.InviteCount != 1 || got.RewardGoldCoins != 900 { - t.Fatalf("second rank = %+v, want user 10 count 1 reward 900", got) + if got := resp.Items[1]; got.Rank != 2 || got.UserID != 20 || got.InviteCount != 3 || got.RewardGoldCoins != 300 { + t.Fatalf("second rank = %+v, want user 20 count 3 reward 300", got) + } + if got := resp.Items[2]; got.Rank != 3 || got.UserID != 30 || got.Nickname != "Nora" || got.InviteCount != 2 || got.RewardGoldCoins != 0 { + t.Fatalf("third rank = %+v, want user 30 count 2 reward 0", got) } } diff --git a/internal/service/invite/rank.go b/internal/service/invite/rank.go index b613058..cb6962f 100644 --- a/internal/service/invite/rank.go +++ b/internal/service/invite/rank.go @@ -26,9 +26,8 @@ func (s *InviteService) GetRank(ctx context.Context, user AuthUser, limit int) ( COALESCE(reward_rank.reward_gold_coins, 0) AS reward_gold_coins FROM ( SELECT relation.inviter_user_id AS user_id, COUNT(1) AS invite_count - FROM invite_campaign_invitee_progress AS progress - INNER JOIN invite_campaign_relation AS relation ON relation.id = progress.relation_id - WHERE relation.sys_origin = ? AND relation.eligible_status = ? AND progress.valid_user = 1 + FROM invite_campaign_relation AS relation + WHERE relation.sys_origin = ? AND relation.eligible_status = ? GROUP BY relation.inviter_user_id ) invite_rank LEFT JOIN ( @@ -39,7 +38,7 @@ func (s *InviteService) GetRank(ctx context.Context, user AuthUser, limit int) ( ) reward_rank ON reward_rank.user_id = invite_rank.user_id LEFT JOIN user_base_info user_info ON user_info.id = invite_rank.user_id LEFT JOIN invite_code_mapping invite_code ON invite_code.user_id = invite_rank.user_id - ORDER BY invite_rank.invite_count DESC, reward_gold_coins DESC, invite_rank.user_id ASC + ORDER BY reward_gold_coins DESC, invite_rank.invite_count DESC, invite_rank.user_id ASC LIMIT ? `, user.SysOrigin, relationStatusEligible, user.SysOrigin, rewardLogStatusSuccess, limit).Scan(&rows).Error; err != nil { return nil, err