package ledger import ( "strings" ) // RedPacketConfig 是后台红包配置的服务端事实,发送路径必须由 wallet-service 强校验。 type RedPacketConfig struct { AppCode string Enabled bool CountTiers []int32 AmountTiers []int64 DelayedOpenSeconds int32 ExpireSeconds int32 DailySendLimit int32 UpdatedByAdminID int64 RuleURL string CreatedAtMS int64 UpdatedAtMS int64 } // RedPacket 是红包资金池和状态的只读投影。 type RedPacket struct { AppCode string PacketID string CommandID string SenderUserID int64 RoomID string RegionID int64 PacketType string TotalAmount int64 PacketCount int32 RemainingAmount int64 RemainingCount int32 Status string OpenAtMS int64 ExpiresAtMS int64 CreatedAtMS int64 UpdatedAtMS int64 ClaimedByViewer bool ViewerClaimAmount int64 Claims []RedPacketClaim RefundAmount int64 RefundStatus string RefundedAtMS int64 } // RedPacketClaim 是单个用户抢红包的到账事实。 type RedPacketClaim struct { AppCode string ClaimID string CommandID string PacketID string UserID int64 Amount int64 WalletTransactionID string Status string FailureReason string CreatedAtMS int64 UpdatedAtMS int64 } type RedPacketCreateCommand struct { AppCode string CommandID string SenderUserID int64 RoomID string RegionID int64 PacketType string TotalAmount int64 PacketCount int32 } type RedPacketCreateReceipt struct { Packet RedPacket BalanceAfter int64 } type RedPacketClaimCommand struct { AppCode string CommandID string PacketID string UserID int64 } type RedPacketClaimReceipt struct { Claim RedPacketClaim Packet RedPacket BalanceAfter int64 } type RedPacketRefundReceipt struct { Packet RedPacket RefundedAmount int64 } type RedPacketQuery struct { AppCode string RoomID string SenderUserID int64 RegionID int64 PacketType string Status string ViewerUserID int64 StartAtMS int64 EndAtMS int64 Page int32 PageSize int32 } type RedPacketExpireResult struct { ExpiredCount int32 RefundedAmount int64 } func NormalizeRedPacketType(packetType string) string { switch strings.ToUpper(strings.TrimSpace(packetType)) { case "IMMEDIATE": return RedPacketTypeNormal case "DELAYED": return RedPacketTypeDelayed } switch strings.ToLower(strings.TrimSpace(packetType)) { case RedPacketTypeNormal: return RedPacketTypeNormal case RedPacketTypeDelayed: return RedPacketTypeDelayed default: return "" } } func NormalizeRedPacketStatus(status string) string { switch strings.ToLower(strings.TrimSpace(status)) { case RedPacketStatusWaitingOpen: return RedPacketStatusWaitingOpen case RedPacketStatusActive: return RedPacketStatusActive case RedPacketStatusFinished: return RedPacketStatusFinished case RedPacketStatusRefunded: return RedPacketStatusRefunded default: return "" } }