diff --git a/internal/service/weekstar/event.go b/internal/service/weekstar/event.go index 3d960b2..189b216 100644 --- a/internal/service/weekstar/event.go +++ b/internal/service/weekstar/event.go @@ -14,7 +14,7 @@ import ( // ProcessGiftEvent 按送礼事件发生时间归属配置,并把积分累加到对应周期实时榜。 func (s *WeekStarService) ProcessGiftEvent(ctx context.Context, event weekStarGiftEvent, rawPayload string) error { sysOrigin := s.normalizeSysOrigin(event.SysOrigin) - trackID := strings.TrimSpace(event.TrackID) + trackID := strings.TrimSpace(event.TrackID.String()) if trackID == "" || int64(event.SendUserID) <= 0 { return nil } @@ -154,7 +154,7 @@ func (e weekStarMessageEventEnvelope) bodyPayload() (string, bool, error) { } func (e weekStarGiftEvent) hasBusinessFields() bool { - return strings.TrimSpace(e.TrackID) != "" || + return strings.TrimSpace(e.TrackID.String()) != "" || int64(e.SendUserID) > 0 || int64(e.GiftConfig.ID) > 0 } diff --git a/internal/service/weekstar/page_test.go b/internal/service/weekstar/page_test.go index 611b814..13da0d7 100644 --- a/internal/service/weekstar/page_test.go +++ b/internal/service/weekstar/page_test.go @@ -190,7 +190,7 @@ func TestProcessGiftEventCountsConfiguredNonDefaultSysOrigin(t *testing.T) { } err := service.ProcessGiftEvent(ctx, weekStarGiftEvent{ - TrackID: "tarab-track-1", + TrackID: flexibleString("tarab-track-1"), SysOrigin: "TARAB", SendUserID: flexibleInt64(3001), Quantity: flexibleInt64(2), @@ -264,7 +264,7 @@ func TestProcessGiftPayloadUnwrapsJavaMessageEventEnvelope(t *testing.T) { } body, err := json.Marshal(map[string]any{ - "trackId": "2049831533035974657", + "trackId": int64(2049831533035974657), "sysOrigin": "LIKEI", "sendUserId": "2042274349343506434", "quantity": 4, diff --git a/internal/service/weekstar/types.go b/internal/service/weekstar/types.go index ace9e49..87e52a7 100644 --- a/internal/service/weekstar/types.go +++ b/internal/service/weekstar/types.go @@ -71,9 +71,35 @@ func (v flexibleInt64) MarshalJSON() ([]byte, error) { return json.Marshal(strconv.FormatInt(int64(v), 10)) } +// flexibleString 用于兼容 MQ 中字符串和数字混用的幂等 ID 字段。 +type flexibleString string + +// UnmarshalJSON 把 JSON 字符串或数字统一解析成字符串。 +func (v *flexibleString) UnmarshalJSON(data []byte) error { + raw := strings.TrimSpace(string(data)) + if raw == "" || raw == "null" { + *v = "" + return nil + } + if strings.HasPrefix(raw, "\"") && strings.HasSuffix(raw, "\"") { + var parsed string + if err := json.Unmarshal(data, &parsed); err != nil { + return err + } + *v = flexibleString(strings.TrimSpace(parsed)) + return nil + } + *v = flexibleString(raw) + return nil +} + +func (v flexibleString) String() string { + return string(v) +} + // weekStarGiftEvent 表示送礼 MQ 事件的核心字段。 type weekStarGiftEvent struct { - TrackID string `json:"trackId"` + TrackID flexibleString `json:"trackId"` SysOrigin string `json:"sysOrigin"` SendUserID flexibleInt64 `json:"sendUserId"` Quantity flexibleInt64 `json:"quantity"`