package ledger import ( "strings" ) // VipRewardItem 是 VIP 资源组权益的轻量展示投影。 type VipRewardItem struct { ResourceID int64 ResourceCode string ResourceType string Name string Quantity int64 ExpiresAtMS int64 AssetURL string PreviewURL string AnimationURL string } // VipLevel 是可购买 VIP 等级配置。 type VipLevel struct { Level int32 Name string Status string PriceCoin int64 DurationMS int64 RewardResourceGroupID int64 RequiredRechargeCoinAmount int64 UserRechargeCoinAmount int64 RechargeGateRequired bool PurchaseLockedReason string RewardItems []VipRewardItem CanPurchase bool SortOrder int32 CreatedAtMS int64 UpdatedAtMS int64 } // UserVip 是用户当前会员状态。是否有效以 ExpiresAtMS 和当前时间判断。 type UserVip struct { UserID int64 Level int32 Name string Active bool StartedAtMS int64 ExpiresAtMS int64 UpdatedAtMS int64 } // PurchaseVipCommand 是 App 购买或升级 VIP 的账务命令。 type PurchaseVipCommand struct { AppCode string CommandID string UserID int64 Level int32 } // PurchaseVipReceipt 是购买 VIP 成功后的稳定回执。 type PurchaseVipReceipt struct { OrderID string TransactionID string Vip UserVip CoinSpent int64 CoinBalanceAfter int64 RewardItems []VipRewardItem } // GrantVipCommand 是活动或后台发放 VIP 的统一入口命令。 type GrantVipCommand struct { AppCode string CommandID string TargetUserID int64 Level int32 GrantSource string OperatorUserID int64 Reason string } // GrantVipReceipt 是赠送 VIP 成功后的稳定回执。 type GrantVipReceipt struct { TransactionID string Vip UserVip RewardItems []VipRewardItem } // AdminVipLevelCommand 是后台保存 VIP 等级配置的完整事实输入。 type AdminVipLevelCommand struct { Level int32 Name string Status string PriceCoin int64 DurationMS int64 RewardResourceGroupID int64 RequiredRechargeCoinAmount int64 SortOrder int32 } func NormalizeVipGrantSource(source string) string { switch strings.ToLower(strings.TrimSpace(source)) { case VipGrantSourcePurchase: return VipGrantSourcePurchase case VipGrantSourceActivity: return VipGrantSourceActivity case VipGrantSourceAdmin: return VipGrantSourceAdmin case VipGrantSourceManagerCenter: return VipGrantSourceManagerCenter default: return "" } }