修复充值奖励

This commit is contained in:
hy001 2026-05-26 18:45:10 +08:00
parent f1b781e3be
commit 675f45bf44
4 changed files with 97 additions and 18 deletions

View File

@ -283,6 +283,9 @@ func claimDetailPayloads(
if detail.ResourceGroupID != nil { if detail.ResourceGroupID != nil {
items = rewardItems[*detail.ResourceGroupID] items = rewardItems[*detail.ResourceGroupID]
} }
if items == nil {
items = []RechargeRewardRewardItem{}
}
result = append(result, RechargeRewardLevelPayload{ result = append(result, RechargeRewardLevelPayload{
ID: detail.ActivityID, ID: detail.ActivityID,
Level: level, Level: level,
@ -313,6 +316,9 @@ func reachedRechargeRewardLevels(
if level.RewardGroupID != nil { if level.RewardGroupID != nil {
items = rewardItems[*level.RewardGroupID] items = rewardItems[*level.RewardGroupID]
} }
if items == nil {
items = []RechargeRewardRewardItem{}
}
result = append(result, RechargeRewardLevelPayload{ result = append(result, RechargeRewardLevelPayload{
ID: level.ID, ID: level.ID,
Level: level.Level, Level: level.Level,
@ -332,6 +338,10 @@ func reachedRechargeRewardLevels(
func rechargeRewardClaimedRewards(levels []RechargeRewardLevelPayload) []RechargeRewardClaimedRewardPayload { func rechargeRewardClaimedRewards(levels []RechargeRewardLevelPayload) []RechargeRewardClaimedRewardPayload {
result := make([]RechargeRewardClaimedRewardPayload, 0, len(levels)) result := make([]RechargeRewardClaimedRewardPayload, 0, len(levels))
for _, level := range levels { for _, level := range levels {
items := level.RewardItems
if items == nil {
items = []RechargeRewardRewardItem{}
}
result = append(result, RechargeRewardClaimedRewardPayload{ result = append(result, RechargeRewardClaimedRewardPayload{
Level: level.Level, Level: level.Level,
RechargeAmount: level.RechargeAmount, RechargeAmount: level.RechargeAmount,
@ -339,7 +349,7 @@ func rechargeRewardClaimedRewards(levels []RechargeRewardLevelPayload) []Recharg
RewardGold: level.RewardGold, RewardGold: level.RewardGold,
RewardGroupID: level.RewardGroupID, RewardGroupID: level.RewardGroupID,
RewardGroupName: level.RewardGroupName, RewardGroupName: level.RewardGroupName,
RewardItems: level.RewardItems, RewardItems: items,
}) })
} }
return result return result

View File

@ -2,7 +2,9 @@ package rechargereward
import ( import (
"context" "context"
"encoding/json"
"fmt" "fmt"
"strings"
"testing" "testing"
"time" "time"
@ -113,7 +115,7 @@ func TestSaveConfigUpsertsBySysOrigin(t *testing.T) {
} }
func TestGetHomeUsesJavaRechargeAndMarksLevels(t *testing.T) { func TestGetHomeUsesJavaRechargeAndMarksLevels(t *testing.T) {
groupID := int64(9001) groupID := int64(2056981527522242600)
java := rechargeRewardTestGateway{ java := rechargeRewardTestGateway{
total: map[int64][]integration.UserTotalRecharge{ total: map[int64][]integration.UserTotalRecharge{
42: { 42: {
@ -132,7 +134,14 @@ func TestGetHomeUsesJavaRechargeAndMarksLevels(t *testing.T) {
ID: integration.Int64Value(groupID), ID: integration.Int64Value(groupID),
Name: "Gift Box", Name: "Gift Box",
RewardConfigList: []integration.RewardGroupItem{ RewardConfigList: []integration.RewardGroupItem{
{ID: integration.Int64Value(1), Type: "PROP", Name: "Frame", Quantity: integration.Int64Value(1), Cover: "https://example.com/frame.png"}, {
ID: integration.Int64Value(1),
Type: "PROPS",
DetailType: "AVATAR_FRAME",
Name: "Frame",
Quantity: integration.Int64Value(1),
SourceURL: "https://example.com/frame.svga",
},
}, },
}, },
}, },
@ -196,6 +205,23 @@ INSERT INTO likei_wallet.user_freight_balance_running_water (accept_user_id, sys
if len(resp.LevelConfigs[0].RewardItems) != 1 || resp.LevelConfigs[0].RewardItems[0].Name != "Frame" { if len(resp.LevelConfigs[0].RewardItems) != 1 || resp.LevelConfigs[0].RewardItems[0].Name != "Frame" {
t.Fatalf("reward items = %+v", resp.LevelConfigs[0].RewardItems) t.Fatalf("reward items = %+v", resp.LevelConfigs[0].RewardItems)
} }
if got := resp.LevelConfigs[0].RewardItems[0]; got.Type != "AVATAR_FRAME" || got.Cover != "https://example.com/frame.svga" {
t.Fatalf("reward item display fields = %+v", got)
}
if resp.LevelConfigs[1].RewardItems == nil {
t.Fatalf("gold-only level RewardItems = nil, want empty slice")
}
encoded, err := json.Marshal(resp)
if err != nil {
t.Fatalf("marshal response: %v", err)
}
body := string(encoded)
if !strings.Contains(body, `"rewardGroupId":"2056981527522242600"`) {
t.Fatalf("encoded rewardGroupId is not a string: %s", body)
}
if strings.Contains(body, `"rewardItems":null`) {
t.Fatalf("encoded rewardItems contains null: %s", body)
}
} }
func TestPageClaimRecordsUsesActualReceiveRecords(t *testing.T) { func TestPageClaimRecordsUsesActualReceiveRecords(t *testing.T) {

View File

@ -47,6 +47,9 @@ func buildLevelPayloads(
if level.RewardGroupID != nil { if level.RewardGroupID != nil {
items = rewardItems[*level.RewardGroupID] items = rewardItems[*level.RewardGroupID]
} }
if items == nil {
items = []RechargeRewardRewardItem{}
}
payloads = append(payloads, RechargeRewardLevelPayload{ payloads = append(payloads, RechargeRewardLevelPayload{
ID: level.ID, ID: level.ID,
Level: level.Level, Level: level.Level,
@ -74,6 +77,9 @@ func buildAdminLevelPayloads(
if level.RewardGroupID != nil { if level.RewardGroupID != nil {
items = rewardItems[*level.RewardGroupID] items = rewardItems[*level.RewardGroupID]
} }
if items == nil {
items = []RechargeRewardRewardItem{}
}
payloads = append(payloads, RechargeRewardLevelPayload{ payloads = append(payloads, RechargeRewardLevelPayload{
ID: level.ID, ID: level.ID,
Level: level.Level, Level: level.Level,
@ -148,25 +154,62 @@ func (s *Service) loadRewardItemsMap(
for _, groupID := range groupIDs { for _, groupID := range groupIDs {
detail, err := s.java.GetRewardGroupDetail(ctx, groupID) detail, err := s.java.GetRewardGroupDetail(ctx, groupID)
if err != nil { if err != nil {
result[groupID] = []RechargeRewardRewardItem{}
continue continue
} }
items := make([]RechargeRewardRewardItem, 0, len(detail.RewardConfigList)) result[groupID] = rewardItemsFromGroup(detail)
for _, item := range detail.RewardConfigList {
items = append(items, RechargeRewardRewardItem{
ID: int64(item.ID),
Type: strings.TrimSpace(item.Type),
Name: strings.TrimSpace(item.Name),
Content: strings.TrimSpace(item.Content),
Quantity: int64(item.Quantity),
Cover: strings.TrimSpace(item.Cover),
Remark: strings.TrimSpace(item.Remark),
})
}
result[groupID] = items
} }
return result return result
} }
func rewardItemsFromGroup(detail integration.RewardGroupDetail) []RechargeRewardRewardItem {
items := make([]RechargeRewardRewardItem, 0, len(detail.RewardConfigList))
for _, item := range detail.RewardConfigList {
items = append(items, RechargeRewardRewardItem{
ID: int64(item.ID),
Type: rewardItemDisplayType(item),
Name: strings.TrimSpace(item.Name),
Content: strings.TrimSpace(item.Content),
Quantity: int64(item.Quantity),
Cover: firstNonEmpty(item.Cover, item.SourceURL),
Remark: strings.TrimSpace(item.Remark),
})
}
return items
}
func rewardItemDisplayType(item integration.RewardGroupItem) string {
itemType := strings.ToUpper(strings.TrimSpace(item.Type))
detailType := strings.ToUpper(strings.TrimSpace(item.DetailType))
if itemType == "PROPS" {
if detailType != "" && detailType != "PROPS" {
return detailType
}
if isVipRewardItem(item) {
return "NOBLE_VIP"
}
}
return itemType
}
func isVipRewardItem(item integration.RewardGroupItem) bool {
name := strings.ToUpper(strings.TrimSpace(item.Name))
remark := strings.ToUpper(strings.TrimSpace(item.Remark))
return strings.Contains(name, "VIP") ||
strings.Contains(name, "NOBLE") ||
strings.Contains(remark, "VIP") ||
strings.Contains(remark, "NOBLE")
}
func firstNonEmpty(values ...string) string {
for _, value := range values {
if trimmed := strings.TrimSpace(value); trimmed != "" {
return trimmed
}
}
return ""
}
func totalRechargeCents(entries []integration.UserTotalRecharge) int64 { func totalRechargeCents(entries []integration.UserTotalRecharge) int64 {
var total int64 var total int64
for _, entry := range entries { for _, entry := range entries {

View File

@ -75,7 +75,7 @@ type RechargeRewardLevelPayload struct {
RechargeAmount string `json:"rechargeAmount"` RechargeAmount string `json:"rechargeAmount"`
RechargeAmountCents int64 `json:"rechargeAmountCents"` RechargeAmountCents int64 `json:"rechargeAmountCents"`
RewardGold int64 `json:"rewardGold"` RewardGold int64 `json:"rewardGold"`
RewardGroupID *int64 `json:"rewardGroupId,omitempty"` RewardGroupID *int64 `json:"rewardGroupId,string,omitempty"`
RewardGroupName string `json:"rewardGroupName,omitempty"` RewardGroupName string `json:"rewardGroupName,omitempty"`
RewardItems []RechargeRewardRewardItem `json:"rewardItems"` RewardItems []RechargeRewardRewardItem `json:"rewardItems"`
Enabled bool `json:"enabled"` Enabled bool `json:"enabled"`
@ -175,7 +175,7 @@ type RechargeRewardClaimedRewardPayload struct {
RechargeAmount string `json:"rechargeAmount"` RechargeAmount string `json:"rechargeAmount"`
RechargeAmountCents int64 `json:"rechargeAmountCents"` RechargeAmountCents int64 `json:"rechargeAmountCents"`
RewardGold int64 `json:"rewardGold"` RewardGold int64 `json:"rewardGold"`
RewardGroupID *int64 `json:"rewardGroupId,omitempty"` RewardGroupID *int64 `json:"rewardGroupId,string,omitempty"`
RewardGroupName string `json:"rewardGroupName,omitempty"` RewardGroupName string `json:"rewardGroupName,omitempty"`
RewardItems []RechargeRewardRewardItem `json:"rewardItems"` RewardItems []RechargeRewardRewardItem `json:"rewardItems"`
} }