package model import "time" // YumiGameKingActivity 保存一次游戏王活动及其不可变统计口径。 type YumiGameKingActivity struct { ID int64 `gorm:"column:id;primaryKey"` ActivityCode string `gorm:"column:activity_code;size:64;uniqueIndex:uk_yumi_gk_activity_code"` ActivityName string `gorm:"column:activity_name;size:128"` ActivityDesc string `gorm:"column:activity_desc;size:1000"` SysOrigin string `gorm:"column:sys_origin;size:32;index:idx_yumi_gk_activity_window,priority:1"` Timezone string `gorm:"column:time_zone;size:64"` StartTime time.Time `gorm:"column:start_time;index:idx_yumi_gk_activity_window,priority:3"` EndTime time.Time `gorm:"column:end_time;index:idx_yumi_gk_activity_window,priority:4;index:idx_yumi_gk_activity_settle,priority:3"` SettlementDelayMinutes int `gorm:"column:settlement_delay_minutes"` SettlementTime time.Time `gorm:"column:settlement_time;index:idx_yumi_gk_activity_settle,priority:2"` CoinPerDraw int64 `gorm:"column:coin_per_draw"` RankingType string `gorm:"column:ranking_type;size:32"` RankingPeriod string `gorm:"column:ranking_period;size:32"` Enabled bool `gorm:"column:enabled;index:idx_yumi_gk_activity_window,priority:2"` SettlementStatus string `gorm:"column:settlement_status;size:32;index:idx_yumi_gk_activity_settle,priority:1"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingActivity) TableName() string { return "yumi_game_king_activity" } // YumiGameKingScopeLock 串行同租户启用窗口检查,避免并发创建不同活动时同时通过 overlap COUNT。 type YumiGameKingScopeLock struct { SysOrigin string `gorm:"column:sys_origin;size:32;primaryKey"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingScopeLock) TableName() string { return "yumi_game_king_scope_lock" } // YumiGameKingPrize 保存固定七个抽奖槽位;RewardItemsJSON 是启用前校验得到的展示快照。 type YumiGameKingPrize struct { ID int64 `gorm:"column:id;primaryKey"` ActivityID int64 `gorm:"column:activity_id;uniqueIndex:uk_yumi_gk_prize_position,priority:1;index:idx_yumi_gk_prize_enabled,priority:1"` PrizeName string `gorm:"column:prize_name;size:128"` PrizeImage string `gorm:"column:prize_image;size:500"` Weight int64 `gorm:"column:weight"` Stock int64 `gorm:"column:stock"` ResourceGroupID int64 `gorm:"column:resource_group_id"` RewardGroupName string `gorm:"column:reward_group_name;size:128"` RewardItemsJSON string `gorm:"column:reward_items_json;type:text"` Enabled bool `gorm:"column:enabled;index:idx_yumi_gk_prize_enabled,priority:2"` SortOrder int `gorm:"column:sort_order;uniqueIndex:uk_yumi_gk_prize_position,priority:2"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingPrize) TableName() string { return "yumi_game_king_prize" } // YumiGameKingRankReward 保存活动结束时固定六个连续名次奖励档。 type YumiGameKingRankReward struct { ID int64 `gorm:"column:id;primaryKey"` ActivityID int64 `gorm:"column:activity_id;uniqueIndex:uk_yumi_gk_rank_range,priority:1;index:idx_yumi_gk_rank_start,priority:1"` StartRank int `gorm:"column:start_rank;uniqueIndex:uk_yumi_gk_rank_range,priority:2;index:idx_yumi_gk_rank_start,priority:2"` EndRank int `gorm:"column:end_rank;uniqueIndex:uk_yumi_gk_rank_range,priority:3"` ResourceGroupID int64 `gorm:"column:resource_group_id"` RewardName string `gorm:"column:reward_name;size:128"` RewardItemsJSON string `gorm:"column:reward_items_json;type:text"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingRankReward) TableName() string { return "yumi_game_king_rank_reward" } // YumiGameKingConsumeLedger 是活动维度的幂等消费账本,实时事件和后台补数共用此边界。 type YumiGameKingConsumeLedger struct { ID int64 `gorm:"column:id;primaryKey"` ActivityID int64 `gorm:"column:activity_id;uniqueIndex:uk_yumi_gk_ledger_event,priority:1;index:idx_yumi_gk_ledger_user,priority:1"` EventID string `gorm:"column:event_id;size:128;uniqueIndex:uk_yumi_gk_ledger_event,priority:2"` UserID int64 `gorm:"column:user_id;index:idx_yumi_gk_ledger_user,priority:2"` SysOrigin string `gorm:"column:sys_origin;size:32"` Amount int64 `gorm:"column:amount"` EventTime time.Time `gorm:"column:event_time;index:idx_yumi_gk_ledger_user,priority:3"` PayloadJSON string `gorm:"column:payload_json;type:text"` CreateTime time.Time `gorm:"column:create_time"` } func (YumiGameKingConsumeLedger) TableName() string { return "yumi_game_king_consume_ledger" } // YumiGameKingBackfillState 持久化复合游标。调用方重启后从该水位继续,GC 不依赖 // webconsole/chatapp-cron 的内存 lastId 来判断历史事件是否已经确认。 type YumiGameKingBackfillState struct { ActivityID int64 `gorm:"column:activity_id;primaryKey"` LastOutboxID int64 `gorm:"column:last_outbox_id"` LastOccurredAt *time.Time `gorm:"column:last_occurred_at"` ScannedRows int64 `gorm:"column:scanned_rows"` AcceptedRows int64 `gorm:"column:accepted_rows"` Completed bool `gorm:"column:completed"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingBackfillState) TableName() string { return "yumi_game_king_backfill_state" } // YumiGameKingUser 保存榜单聚合和已使用抽奖次数,避免排行榜扫描消费账本。 type YumiGameKingUser struct { ActivityID int64 `gorm:"column:activity_id;primaryKey;index:idx_yumi_gk_user_rank,priority:1"` UserID int64 `gorm:"column:user_id;primaryKey;index:idx_yumi_gk_user_rank,priority:4,sort:asc"` TotalConsumed int64 `gorm:"column:total_consumed;index:idx_yumi_gk_user_rank,priority:2,sort:desc"` UsedChances int64 `gorm:"column:used_chances"` ConsumeReachedTime time.Time `gorm:"column:consume_reached_time;index:idx_yumi_gk_user_rank,priority:3,sort:asc"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingUser) TableName() string { return "yumi_game_king_user" } // YumiGameKingUserDaily 保存活动时区自然日聚合,DAILY 排行不扫描消费明细。 type YumiGameKingUserDaily struct { ActivityID int64 `gorm:"column:activity_id;primaryKey;index:idx_yumi_gk_daily_rank,priority:1"` StatDate time.Time `gorm:"column:stat_date;type:date;primaryKey;index:idx_yumi_gk_daily_rank,priority:2"` UserID int64 `gorm:"column:user_id;primaryKey;index:idx_yumi_gk_daily_rank,priority:5,sort:asc"` TotalConsumed int64 `gorm:"column:total_consumed;index:idx_yumi_gk_daily_rank,priority:3,sort:desc"` ConsumeReachedTime time.Time `gorm:"column:consume_reached_time;index:idx_yumi_gk_daily_rank,priority:4,sort:asc"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingUserDaily) TableName() string { return "yumi_game_king_user_daily" } // YumiGameKingDrawRecord 保存一次请求幂等的抽奖结果和整组奖励发放状态。 type YumiGameKingDrawRecord struct { ID int64 `gorm:"column:id;primaryKey"` ActivityID int64 `gorm:"column:activity_id;uniqueIndex:uk_yumi_gk_draw_request,priority:1;index:idx_yumi_gk_draw_user,priority:1;index:idx_yumi_gk_draw_manage,priority:1"` UserID int64 `gorm:"column:user_id;uniqueIndex:uk_yumi_gk_draw_request,priority:2;index:idx_yumi_gk_draw_user,priority:2"` RequestID string `gorm:"column:request_id;size:64;uniqueIndex:uk_yumi_gk_draw_request,priority:3"` PrizeID int64 `gorm:"column:prize_id"` PrizeName string `gorm:"column:prize_name;size:128"` PrizeImage string `gorm:"column:prize_image;size:500"` ResourceGroupID int64 `gorm:"column:resource_group_id"` DeliveryStatus string `gorm:"column:delivery_status;size:32;index:idx_yumi_gk_draw_manage,priority:2"` RetryCount int `gorm:"column:retry_count"` FailureReason string `gorm:"column:failure_reason;size:500"` DrawTime time.Time `gorm:"column:draw_time"` DeliverTime *time.Time `gorm:"column:deliver_time"` CreateTime time.Time `gorm:"column:create_time;index:idx_yumi_gk_draw_user,priority:3"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingDrawRecord) TableName() string { return "yumi_game_king_draw_record" } // YumiGameKingSettlementRecord 是活动结算时冻结的 Top30 排名和发奖状态。 type YumiGameKingSettlementRecord struct { ID int64 `gorm:"column:id;primaryKey"` ActivityID int64 `gorm:"column:activity_id;uniqueIndex:uk_yumi_gk_settle_user,priority:1;uniqueIndex:uk_yumi_gk_settle_rank,priority:1;index:idx_yumi_gk_settle_status,priority:1"` UserID int64 `gorm:"column:user_id;uniqueIndex:uk_yumi_gk_settle_user,priority:2"` RankNo int `gorm:"column:rank_no;uniqueIndex:uk_yumi_gk_settle_rank,priority:2"` TotalConsumed int64 `gorm:"column:total_consumed"` RankRewardID int64 `gorm:"column:rank_reward_id"` ResourceGroupID int64 `gorm:"column:resource_group_id"` BusinessNo string `gorm:"column:business_no;size:128;uniqueIndex:uk_yumi_gk_settle_business"` DeliveryStatus string `gorm:"column:delivery_status;size:32;index:idx_yumi_gk_settle_status,priority:2"` RetryCount int `gorm:"column:retry_count"` FailureReason string `gorm:"column:failure_reason;size:500"` DeliverTime *time.Time `gorm:"column:deliver_time"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time"` } func (YumiGameKingSettlementRecord) TableName() string { return "yumi_game_king_settlement_record" } // YumiGameKingDeliveryItem 把一次奖励组调用作为最小核账单元;UNKNOWN 不允许自动重试。 type YumiGameKingDeliveryItem struct { ID int64 `gorm:"column:id;primaryKey;index:idx_yumi_gk_delivery_status,priority:3"` OwnerType string `gorm:"column:owner_type;size:20;uniqueIndex:uk_yumi_gk_delivery_owner,priority:1"` OwnerID int64 `gorm:"column:owner_id;uniqueIndex:uk_yumi_gk_delivery_owner,priority:2"` ActivityID int64 `gorm:"column:activity_id;index:idx_yumi_gk_delivery_activity,priority:1"` UserID int64 `gorm:"column:user_id"` ResourceGroupID int64 `gorm:"column:resource_group_id"` DeliveryStatus string `gorm:"column:delivery_status;size:32;index:idx_yumi_gk_delivery_status,priority:1;index:idx_yumi_gk_delivery_activity,priority:2"` RetryCount int `gorm:"column:retry_count"` FailureReason string `gorm:"column:failure_reason;size:500"` DeliverTime *time.Time `gorm:"column:deliver_time"` CreateTime time.Time `gorm:"column:create_time"` UpdateTime time.Time `gorm:"column:update_time;index:idx_yumi_gk_delivery_status,priority:2"` } func (YumiGameKingDeliveryItem) TableName() string { return "yumi_game_king_delivery_item" }