186 lines
12 KiB
Go
186 lines
12 KiB
Go
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" }
|