237 lines
9.5 KiB
Plaintext
237 lines
9.5 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
// ============================================
|
|
// 龙虎榜排名表 (聚合根1)
|
|
// 存储各周期榜单的实际排名数据
|
|
// ============================================
|
|
model LeaderboardRanking {
|
|
id BigInt @id @default(autoincrement()) @map("ranking_id")
|
|
|
|
// === 榜单信息 ===
|
|
leaderboardType String @map("leaderboard_type") @db.VarChar(30) // DAILY/WEEKLY/MONTHLY
|
|
periodKey String @map("period_key") @db.VarChar(20) // 2024-01-15 / 2024-W03 / 2024-01
|
|
|
|
// === 用户信息 ===
|
|
userId BigInt @map("user_id")
|
|
isVirtual Boolean @default(false) @map("is_virtual") // 是否虚拟账户
|
|
|
|
// === 排名信息 ===
|
|
rankPosition Int @map("rank_position") // 实际排名
|
|
displayPosition Int @map("display_position") // 显示排名(含虚拟)
|
|
previousRank Int? @map("previous_rank") // 上次排名
|
|
|
|
// === 分值信息 ===
|
|
totalTeamPlanting Int @default(0) @map("total_team_planting") // 团队总认种
|
|
maxDirectTeamPlanting Int @default(0) @map("max_direct_team_planting") // 最大直推团队认种
|
|
effectiveScore Int @default(0) @map("effective_score") // 有效分值
|
|
|
|
// === 用户快照 ===
|
|
userSnapshot Json @map("user_snapshot") // { nickname, avatar, accountNo }
|
|
|
|
// === 时间戳 ===
|
|
periodStartAt DateTime @map("period_start_at")
|
|
periodEndAt DateTime @map("period_end_at")
|
|
calculatedAt DateTime @default(now()) @map("calculated_at")
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
|
|
@@unique([leaderboardType, periodKey, userId], name: "uk_type_period_user")
|
|
@@map("leaderboard_rankings")
|
|
@@index([leaderboardType, periodKey, displayPosition], name: "idx_display_rank")
|
|
@@index([leaderboardType, periodKey, effectiveScore(sort: Desc)], name: "idx_score")
|
|
@@index([userId], name: "idx_ranking_user")
|
|
@@index([periodKey], name: "idx_period")
|
|
@@index([isVirtual], name: "idx_virtual")
|
|
}
|
|
|
|
// ============================================
|
|
// 龙虎榜配置表 (聚合根2)
|
|
// 管理榜单开关、虚拟数量、显示设置
|
|
// ============================================
|
|
model LeaderboardConfig {
|
|
id BigInt @id @default(autoincrement()) @map("config_id")
|
|
configKey String @unique @map("config_key") @db.VarChar(50) // GLOBAL / DAILY / WEEKLY / MONTHLY
|
|
|
|
// === 榜单开关 ===
|
|
dailyEnabled Boolean @default(true) @map("daily_enabled")
|
|
weeklyEnabled Boolean @default(true) @map("weekly_enabled")
|
|
monthlyEnabled Boolean @default(true) @map("monthly_enabled")
|
|
|
|
// === 虚拟排名设置 ===
|
|
virtualRankingEnabled Boolean @default(false) @map("virtual_ranking_enabled")
|
|
virtualAccountCount Int @default(0) @map("virtual_account_count") // 虚拟账户数量
|
|
|
|
// === 显示设置 ===
|
|
displayLimit Int @default(30) @map("display_limit") // 前端显示数量
|
|
|
|
// === 刷新设置 ===
|
|
refreshIntervalMinutes Int @default(5) @map("refresh_interval_minutes")
|
|
|
|
// === 时间戳 ===
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
|
|
@@map("leaderboard_configs")
|
|
}
|
|
|
|
// ============================================
|
|
// 虚拟账户表
|
|
// 存储系统生成的虚拟排名账户
|
|
// ============================================
|
|
model VirtualAccount {
|
|
id BigInt @id @default(autoincrement()) @map("virtual_account_id")
|
|
|
|
// === 账户信息 ===
|
|
accountType String @map("account_type") @db.VarChar(30) // RANKING_VIRTUAL / SYSTEM_PROVINCE / SYSTEM_CITY / HEADQUARTERS
|
|
displayName String @map("display_name") @db.VarChar(100)
|
|
avatar String? @map("avatar") @db.VarChar(255)
|
|
|
|
// === 区域信息(省市公司用)===
|
|
provinceCode String? @map("province_code") @db.VarChar(10)
|
|
cityCode String? @map("city_code") @db.VarChar(10)
|
|
|
|
// === 虚拟分值范围(排名虚拟账户用)===
|
|
minScore Int? @map("min_score")
|
|
maxScore Int? @map("max_score")
|
|
currentScore Int @default(0) @map("current_score")
|
|
|
|
// === 账户余额(省市公司用)===
|
|
usdtBalance Decimal @default(0) @map("usdt_balance") @db.Decimal(20, 8)
|
|
hashpowerBalance Decimal @default(0) @map("hashpower_balance") @db.Decimal(20, 8)
|
|
|
|
// === 状态 ===
|
|
isActive Boolean @default(true) @map("is_active")
|
|
|
|
// === 时间戳 ===
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
updatedAt DateTime @updatedAt @map("updated_at")
|
|
|
|
@@map("virtual_accounts")
|
|
@@index([accountType], name: "idx_va_type")
|
|
@@index([provinceCode], name: "idx_va_province")
|
|
@@index([cityCode], name: "idx_va_city")
|
|
@@index([isActive], name: "idx_va_active")
|
|
}
|
|
|
|
// ============================================
|
|
// 虚拟排名条目表
|
|
// 每个周期的虚拟排名数据
|
|
// ============================================
|
|
model VirtualRankingEntry {
|
|
id BigInt @id @default(autoincrement()) @map("entry_id")
|
|
|
|
// === 关联虚拟账户 ===
|
|
virtualAccountId BigInt @map("virtual_account_id")
|
|
|
|
// === 榜单信息 ===
|
|
leaderboardType String @map("leaderboard_type") @db.VarChar(30)
|
|
periodKey String @map("period_key") @db.VarChar(20)
|
|
|
|
// === 排名信息 ===
|
|
displayPosition Int @map("display_position") // 占据的显示位置
|
|
generatedScore Int @map("generated_score") // 生成的分值
|
|
|
|
// === 显示信息 ===
|
|
displayName String @map("display_name") @db.VarChar(100)
|
|
avatar String? @map("avatar") @db.VarChar(255)
|
|
|
|
// === 时间戳 ===
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
|
|
@@unique([leaderboardType, periodKey, displayPosition], name: "uk_vr_type_period_pos")
|
|
@@map("virtual_ranking_entries")
|
|
@@index([virtualAccountId], name: "idx_vr_va")
|
|
@@index([leaderboardType, periodKey], name: "idx_vr_type_period")
|
|
}
|
|
|
|
// ============================================
|
|
// 榜单历史快照表
|
|
// 保存每个周期结束时的完整榜单数据
|
|
// ============================================
|
|
model LeaderboardSnapshot {
|
|
id BigInt @id @default(autoincrement()) @map("snapshot_id")
|
|
|
|
// === 榜单信息 ===
|
|
leaderboardType String @map("leaderboard_type") @db.VarChar(30)
|
|
periodKey String @map("period_key") @db.VarChar(20)
|
|
|
|
// === 快照数据 ===
|
|
rankingsData Json @map("rankings_data") // 完整排名数据
|
|
|
|
// === 统计信息 ===
|
|
totalParticipants Int @map("total_participants") // 参与人数
|
|
topScore Int @map("top_score") // 最高分
|
|
averageScore Int @map("average_score") // 平均分
|
|
|
|
// === 时间戳 ===
|
|
periodStartAt DateTime @map("period_start_at")
|
|
periodEndAt DateTime @map("period_end_at")
|
|
snapshotAt DateTime @default(now()) @map("snapshot_at")
|
|
|
|
@@unique([leaderboardType, periodKey], name: "uk_snapshot_type_period")
|
|
@@map("leaderboard_snapshots")
|
|
@@index([leaderboardType], name: "idx_snapshot_type")
|
|
@@index([periodKey], name: "idx_snapshot_period")
|
|
}
|
|
|
|
// ============================================
|
|
// 虚拟账户交易记录表
|
|
// 记录省市公司账户的资金变动
|
|
// ============================================
|
|
model VirtualAccountTransaction {
|
|
id BigInt @id @default(autoincrement()) @map("transaction_id")
|
|
virtualAccountId BigInt @map("virtual_account_id")
|
|
|
|
// === 交易信息 ===
|
|
transactionType String @map("transaction_type") @db.VarChar(30) // INCOME / EXPENSE
|
|
amount Decimal @map("amount") @db.Decimal(20, 8)
|
|
currency String @map("currency") @db.VarChar(10) // USDT / HASHPOWER
|
|
|
|
// === 来源信息 ===
|
|
sourceType String? @map("source_type") @db.VarChar(50) // PLANTING_REWARD / MANUAL
|
|
sourceId String? @map("source_id") @db.VarChar(100)
|
|
sourceUserId BigInt? @map("source_user_id")
|
|
|
|
// === 备注 ===
|
|
memo String? @map("memo") @db.VarChar(500)
|
|
|
|
// === 时间戳 ===
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
|
|
@@map("virtual_account_transactions")
|
|
@@index([virtualAccountId], name: "idx_vat_account")
|
|
@@index([transactionType], name: "idx_vat_type")
|
|
@@index([createdAt(sort: Desc)], name: "idx_vat_created")
|
|
}
|
|
|
|
// ============================================
|
|
// 龙虎榜事件表
|
|
// ============================================
|
|
model LeaderboardEvent {
|
|
id BigInt @id @default(autoincrement()) @map("event_id")
|
|
eventType String @map("event_type") @db.VarChar(50)
|
|
|
|
// 聚合根信息
|
|
aggregateId String @map("aggregate_id") @db.VarChar(100)
|
|
aggregateType String @map("aggregate_type") @db.VarChar(50)
|
|
|
|
// 事件数据
|
|
eventData Json @map("event_data")
|
|
|
|
// 元数据
|
|
userId BigInt? @map("user_id")
|
|
occurredAt DateTime @default(now()) @map("occurred_at") @db.Timestamp(6)
|
|
version Int @default(1) @map("version")
|
|
|
|
@@map("leaderboard_events")
|
|
@@index([aggregateType, aggregateId], name: "idx_lb_event_aggregate")
|
|
@@index([eventType], name: "idx_lb_event_type")
|
|
@@index([occurredAt], name: "idx_lb_event_occurred")
|
|
}
|