rwadurian/backend/services/mining-admin-service/prisma/schema.prisma

741 lines
26 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// =============================================================================
// 管理员模块
// =============================================================================
model AdminUser {
id String @id @default(uuid())
username String @unique
password String // bcrypt hashed
name String
role String // SUPER_ADMIN, ADMIN, OPERATOR
status String @default("ACTIVE") // ACTIVE, DISABLED
lastLoginAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
auditLogs AuditLog[]
@@map("admin_users")
}
// =============================================================================
// 系统配置
// =============================================================================
model SystemConfig {
id String @id @default(uuid())
category String // MINING, TRADING, CONTRIBUTION, SYSTEM
key String
value String
description String?
isPublic Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([category, key])
@@map("system_configs")
}
// =============================================================================
// 系统账户(运营/省/市)
// =============================================================================
model SystemAccount {
id String @id @default(uuid())
accountType String @unique // OPERATION, PROVINCE, CITY, HEADQUARTERS
name String
description String?
totalContribution Decimal @db.Decimal(30, 8) @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("system_accounts")
}
// =============================================================================
// 初始化记录
// =============================================================================
model InitializationRecord {
id String @id @default(uuid())
type String // MINING_CONFIG, BLACK_HOLE, SYSTEM_ACCOUNTS, ACTIVATE_MINING
status String // PENDING, COMPLETED, FAILED
config Json
executedBy String
executedAt DateTime?
errorMessage String?
createdAt DateTime @default(now())
@@map("initialization_records")
}
// =============================================================================
// 审计日志
// =============================================================================
model AuditLog {
id String @id @default(uuid())
adminId String
action String // CREATE, UPDATE, DELETE, LOGIN, LOGOUT, INIT
resource String // CONFIG, USER, SYSTEM_ACCOUNT, MINING
resourceId String?
oldValue Json?
newValue Json?
ipAddress String?
userAgent String?
createdAt DateTime @default(now())
admin AdminUser @relation(fields: [adminId], references: [id])
@@index([adminId])
@@index([action])
@@index([resource])
@@index([createdAt(sort: Desc)])
@@map("audit_logs")
}
// =============================================================================
// 报表快照
// =============================================================================
model DailyReport {
id String @id @default(uuid())
reportDate DateTime @unique @db.Date
// 用户统计
totalUsers Int @default(0)
newUsers Int @default(0)
activeUsers Int @default(0)
// 认种统计
totalAdoptions Int @default(0)
newAdoptions Int @default(0)
totalTrees Int @default(0)
// 算力统计
totalContribution Decimal @db.Decimal(30, 8) @default(0)
contributionGrowth Decimal @db.Decimal(30, 8) @default(0)
// 挖矿统计
totalDistributed Decimal @db.Decimal(30, 8) @default(0)
totalBurned Decimal @db.Decimal(30, 8) @default(0)
// 交易统计
tradingVolume Decimal @db.Decimal(30, 8) @default(0)
tradingAmount Decimal @db.Decimal(30, 8) @default(0)
tradeCount Int @default(0)
// 价格
openPrice Decimal @db.Decimal(30, 18) @default(1)
closePrice Decimal @db.Decimal(30, 18) @default(1)
highPrice Decimal @db.Decimal(30, 18) @default(1)
lowPrice Decimal @db.Decimal(30, 18) @default(1)
createdAt DateTime @default(now())
@@map("daily_reports")
}
// =============================================================================
// CDC 同步表 - 用户数据 (from auth-service)
// =============================================================================
model SyncedUser {
id String @id @default(uuid())
originalUserId String @unique // auth-service 中的原始 ID
accountSequence String @unique // 账户序列号
phone String
status String // ACTIVE, DISABLED, DELETED
kycStatus String // PENDING, SUBMITTED, VERIFIED, REJECTED
realName String?
isLegacyUser Boolean @default(false) // 是否为 1.0 迁移用户
createdAt DateTime
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
// 关联同步表
contributionAccount SyncedContributionAccount?
miningAccount SyncedMiningAccount?
tradingAccount SyncedTradingAccount?
@@index([phone])
@@index([status])
@@index([kycStatus])
@@index([createdAt(sort: Desc)])
@@map("synced_users")
}
// =============================================================================
// CDC 同步表 - 算力账户 (from contribution-service)
// =============================================================================
model SyncedContributionAccount {
id String @id @default(uuid())
accountSequence String @unique
personalContribution Decimal @db.Decimal(30, 8) @default(0)
teamLevelContribution Decimal @db.Decimal(30, 8) @default(0)
teamBonusContribution Decimal @db.Decimal(30, 8) @default(0)
totalContribution Decimal @db.Decimal(30, 8) @default(0)
effectiveContribution Decimal @db.Decimal(30, 8) @default(0)
hasAdopted Boolean @default(false)
directReferralCount Int @default(0)
unlockedLevelDepth Int @default(0)
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
user SyncedUser @relation(fields: [accountSequence], references: [accountSequence])
@@map("synced_contribution_accounts")
}
// =============================================================================
// CDC 同步表 - 挖矿账户 (from mining-service)
// =============================================================================
model SyncedMiningAccount {
id String @id @default(uuid())
accountSequence String @unique
totalMined Decimal @db.Decimal(30, 8) @default(0)
availableBalance Decimal @db.Decimal(30, 8) @default(0)
frozenBalance Decimal @db.Decimal(30, 8) @default(0)
totalContribution Decimal @db.Decimal(30, 8) @default(0)
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
user SyncedUser @relation(fields: [accountSequence], references: [accountSequence])
@@map("synced_mining_accounts")
}
// =============================================================================
// CDC 同步表 - 交易账户 (from trading-service)
// =============================================================================
model SyncedTradingAccount {
id String @id @default(uuid())
accountSequence String @unique
shareBalance Decimal @db.Decimal(30, 8) @default(0)
cashBalance Decimal @db.Decimal(30, 8) @default(0)
frozenShares Decimal @db.Decimal(30, 8) @default(0)
frozenCash Decimal @db.Decimal(30, 8) @default(0)
totalBought Decimal @db.Decimal(30, 8) @default(0)
totalSold Decimal @db.Decimal(30, 8) @default(0)
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
user SyncedUser @relation(fields: [accountSequence], references: [accountSequence])
@@map("synced_trading_accounts")
}
// =============================================================================
// CDC 同步表 - 挖矿配置 (from mining-service)
// =============================================================================
model SyncedMiningConfig {
id String @id @default(uuid())
totalShares Decimal @db.Decimal(30, 8)
distributionPool Decimal @db.Decimal(30, 8)
remainingDistribution Decimal @db.Decimal(30, 8)
halvingPeriodYears Int
currentEra Int @default(1)
minuteDistribution Decimal @db.Decimal(30, 8)
isActive Boolean @default(false)
activatedAt DateTime?
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("synced_mining_configs")
}
// =============================================================================
// CDC 同步表 - 每日挖矿统计 (from mining-service)
// =============================================================================
model SyncedDailyMiningStat {
id String @id @default(uuid())
statDate DateTime @unique @db.Date
totalContribution Decimal @db.Decimal(30, 8) @default(0)
totalDistributed Decimal @db.Decimal(30, 8) @default(0)
totalBurned Decimal @db.Decimal(30, 8) @default(0)
participantCount Int @default(0)
avgContributionRate Decimal @db.Decimal(30, 18) @default(0)
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("synced_daily_mining_stats")
}
// =============================================================================
// CDC 同步表 - 日K线 (from trading-service)
// =============================================================================
model SyncedDayKLine {
id String @id @default(uuid())
klineDate DateTime @unique @db.Date
open Decimal @db.Decimal(30, 18)
high Decimal @db.Decimal(30, 18)
low Decimal @db.Decimal(30, 18)
close Decimal @db.Decimal(30, 18)
volume Decimal @db.Decimal(30, 8) @default(0)
amount Decimal @db.Decimal(30, 8) @default(0)
tradeCount Int @default(0)
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("synced_day_klines")
}
// =============================================================================
// CDC 同步表 - 流通池 (from trading-service)
// =============================================================================
model SyncedCirculationPool {
id String @id @default(uuid())
totalShares Decimal @db.Decimal(30, 8) @default(0)
totalCash Decimal @db.Decimal(30, 8) @default(0)
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("synced_circulation_pools")
}
// =============================================================================
// CDC 同步表 - 系统账户算力 (from contribution-service)
// =============================================================================
model SyncedSystemContribution {
id String @id @default(uuid())
accountType String @unique // OPERATION, PROVINCE, CITY, HEADQUARTERS
name String
contributionBalance Decimal @db.Decimal(30, 8) @default(0)
contributionNeverExpires Boolean @default(false)
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("synced_system_contributions")
}
// =============================================================================
// CDC 同步进度跟踪
// =============================================================================
model CdcSyncProgress {
id String @id @default(uuid())
sourceTopic String @unique
sourceService String // auth, contribution, mining, trading
lastOffset String? // Kafka offset
lastSequenceNum BigInt @default(0)
lastSyncedAt DateTime @default(now())
errorCount Int @default(0)
lastError String?
updatedAt DateTime @updatedAt
@@index([sourceService])
@@map("cdc_sync_progress")
}
// =============================================================================
// 已处理事件(幂等性)
// =============================================================================
model ProcessedEvent {
id String @id @default(uuid())
eventId String @unique
eventType String
sourceService String
processedAt DateTime @default(now())
@@index([sourceService])
@@index([processedAt])
@@map("processed_events")
}
// =============================================================================
// CDC 同步表 - 区域数据 (from mining-wallet-service)
// =============================================================================
model SyncedProvince {
id String @id @default(uuid())
originalId String @unique @map("original_id")
code String @unique
name String
status String @default("ACTIVE")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
cities SyncedCity[]
@@index([code])
@@map("synced_provinces")
}
model SyncedCity {
id String @id @default(uuid())
originalId String @unique @map("original_id")
provinceId String @map("province_id")
code String @unique
name String
status String @default("ACTIVE")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
province SyncedProvince @relation(fields: [provinceId], references: [originalId])
userMappings SyncedUserRegionMapping[]
@@index([provinceId])
@@index([code])
@@map("synced_cities")
}
model SyncedUserRegionMapping {
id String @id @default(uuid())
accountSequence String @unique @map("account_sequence")
cityId String @map("city_id")
assignedAt DateTime @map("assigned_at")
assignedBy String? @map("assigned_by")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
city SyncedCity @relation(fields: [cityId], references: [originalId])
@@index([cityId])
@@map("synced_user_region_mappings")
}
// =============================================================================
// CDC 同步表 - 钱包系统账户 (from mining-wallet-service)
// =============================================================================
model SyncedWalletSystemAccount {
id String @id @default(uuid())
originalId String @unique @map("original_id")
accountType String @map("account_type") // HEADQUARTERS, OPERATION, PROVINCE, CITY, FEE, HOT_WALLET, COLD_WALLET
name String
code String @unique
// 关联区域
provinceId String? @map("province_id")
cityId String? @map("city_id")
// 余额信息
shareBalance Decimal @default(0) @map("share_balance") @db.Decimal(30, 8)
usdtBalance Decimal @default(0) @map("usdt_balance") @db.Decimal(30, 8)
greenPointBalance Decimal @default(0) @map("green_point_balance") @db.Decimal(30, 8)
frozenShare Decimal @default(0) @map("frozen_share") @db.Decimal(30, 8)
frozenUsdt Decimal @default(0) @map("frozen_usdt") @db.Decimal(30, 8)
// 累计统计
totalInflow Decimal @default(0) @map("total_inflow") @db.Decimal(30, 8)
totalOutflow Decimal @default(0) @map("total_outflow") @db.Decimal(30, 8)
// 链上地址
blockchainAddress String? @map("blockchain_address")
isActive Boolean @default(true) @map("is_active")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([accountType])
@@index([provinceId])
@@index([cityId])
@@map("synced_wallet_system_accounts")
}
// =============================================================================
// CDC 同步表 - 池账户 (from mining-wallet-service)
// =============================================================================
model SyncedWalletPoolAccount {
id String @id @default(uuid())
originalId String @unique @map("original_id")
poolType String @unique @map("pool_type") // SHARE_POOL, BLACK_HOLE_POOL, CIRCULATION_POOL
name String
// 余额信息
balance Decimal @default(0) @db.Decimal(30, 8)
totalInflow Decimal @default(0) @map("total_inflow") @db.Decimal(30, 8)
totalOutflow Decimal @default(0) @map("total_outflow") @db.Decimal(30, 8)
// 黑洞池特有字段
targetBurn Decimal? @map("target_burn") @db.Decimal(30, 8)
remainingBurn Decimal? @map("remaining_burn") @db.Decimal(30, 8)
isActive Boolean @default(true) @map("is_active")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([poolType])
@@map("synced_wallet_pool_accounts")
}
// =============================================================================
// CDC 同步表 - 用户钱包 (from mining-wallet-service)
// =============================================================================
model SyncedUserWallet {
id String @id @default(uuid())
originalId String @unique @map("original_id")
accountSequence String @map("account_sequence")
walletType String @map("wallet_type") // CONTRIBUTION, TOKEN_STORAGE, GREEN_POINTS
// 余额信息
balance Decimal @default(0) @db.Decimal(30, 8)
frozenBalance Decimal @default(0) @map("frozen_balance") @db.Decimal(30, 8)
// 累计统计
totalInflow Decimal @default(0) @map("total_inflow") @db.Decimal(30, 8)
totalOutflow Decimal @default(0) @map("total_outflow") @db.Decimal(30, 8)
isActive Boolean @default(true) @map("is_active")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([accountSequence, walletType])
@@index([accountSequence])
@@index([walletType])
@@map("synced_user_wallets")
}
// =============================================================================
// CDC 同步表 - 提现请求 (from mining-wallet-service)
// =============================================================================
model SyncedWithdrawRequest {
id String @id @default(uuid())
originalId String @unique @map("original_id")
requestNo String @unique @map("request_no")
accountSequence String @map("account_sequence")
// 提现信息
assetType String @map("asset_type")
amount Decimal @db.Decimal(30, 8)
fee Decimal @default(0) @db.Decimal(30, 8)
netAmount Decimal @map("net_amount") @db.Decimal(30, 8)
// 目标地址
toAddress String @map("to_address")
// 状态
status String // PENDING, PROCESSING, CONFIRMING, COMPLETED, FAILED, CANCELLED
// 链上信息
txHash String? @map("tx_hash")
blockNumber BigInt? @map("block_number")
confirmations Int @default(0)
// 错误信息
errorMessage String? @map("error_message")
// 审核信息
approvedBy String? @map("approved_by")
approvedAt DateTime? @map("approved_at")
createdAt DateTime @map("created_at")
completedAt DateTime? @map("completed_at")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([accountSequence])
@@index([status])
@@index([txHash])
@@index([createdAt(sort: Desc)])
@@map("synced_withdraw_requests")
}
// =============================================================================
// CDC 同步表 - 充值记录 (from mining-wallet-service)
// =============================================================================
model SyncedDepositRecord {
id String @id @default(uuid())
originalId String @unique @map("original_id")
txHash String @unique @map("tx_hash")
// 来源信息
fromAddress String @map("from_address")
toAddress String @map("to_address")
// 充值信息
assetType String @map("asset_type")
amount Decimal @db.Decimal(30, 8)
// 链上信息
blockNumber BigInt @map("block_number")
confirmations Int @default(0)
// 匹配的用户
matchedAccountSeq String? @map("matched_account_seq")
isProcessed Boolean @default(false) @map("is_processed")
processedAt DateTime? @map("processed_at")
createdAt DateTime @map("created_at")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([fromAddress])
@@index([toAddress])
@@index([matchedAccountSeq])
@@index([isProcessed])
@@map("synced_deposit_records")
}
// =============================================================================
// CDC 同步表 - DEX Swap 记录 (from mining-wallet-service)
// =============================================================================
model SyncedDexSwapRecord {
id String @id @default(uuid())
originalId String @unique @map("original_id")
swapNo String @unique @map("swap_no")
accountSequence String @map("account_sequence")
// Swap 信息
fromAsset String @map("from_asset")
toAsset String @map("to_asset")
fromAmount Decimal @map("from_amount") @db.Decimal(30, 8)
toAmount Decimal @map("to_amount") @db.Decimal(30, 8)
exchangeRate Decimal @map("exchange_rate") @db.Decimal(30, 18)
// 滑点/手续费
slippage Decimal @default(0) @db.Decimal(10, 4)
fee Decimal @default(0) @db.Decimal(30, 8)
// 状态
status String // PENDING, PROCESSING, CONFIRMING, COMPLETED, FAILED, CANCELLED
// 链上信息
txHash String? @map("tx_hash")
blockNumber BigInt? @map("block_number")
errorMessage String? @map("error_message")
createdAt DateTime @map("created_at")
completedAt DateTime? @map("completed_at")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([accountSequence])
@@index([status])
@@index([txHash])
@@map("synced_dex_swap_records")
}
// =============================================================================
// CDC 同步表 - 区块链地址绑定 (from mining-wallet-service)
// =============================================================================
model SyncedBlockchainAddressBinding {
id String @id @default(uuid())
originalId String @unique @map("original_id")
accountSequence String @unique @map("account_sequence")
// KAVA 地址
kavaAddress String @unique @map("kava_address")
// 验证信息
isVerified Boolean @default(false) @map("is_verified")
verifiedAt DateTime? @map("verified_at")
verificationTxHash String? @map("verification_tx_hash")
createdAt DateTime @map("created_at")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([kavaAddress])
@@map("synced_blockchain_address_bindings")
}
// =============================================================================
// CDC 同步表 - 黑洞合约 (from mining-wallet-service)
// =============================================================================
model SyncedBlackHoleContract {
id String @id @default(uuid())
originalId String @unique @map("original_id")
contractAddress String @unique @map("contract_address")
name String
// 累计销毁
totalBurned Decimal @default(0) @map("total_burned") @db.Decimal(30, 8)
targetBurn Decimal @map("target_burn") @db.Decimal(30, 8)
remainingBurn Decimal @map("remaining_burn") @db.Decimal(30, 8)
isActive Boolean @default(true) @map("is_active")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("synced_black_hole_contracts")
}
// =============================================================================
// CDC 同步表 - 销毁到黑洞记录 (from mining-wallet-service)
// =============================================================================
model SyncedBurnToBlackHoleRecord {
id String @id @default(uuid())
originalId String @unique @map("original_id")
blackHoleId String @map("black_hole_id")
// 销毁信息
amount Decimal @db.Decimal(30, 8)
// 来源
sourceType String @map("source_type") // USER, SYSTEM_ACCOUNT, POOL, BLOCKCHAIN, EXTERNAL
sourceAccountSeq String? @map("source_account_seq")
sourceUserId String? @map("source_user_id")
sourcePoolType String? @map("source_pool_type")
// 链上信息
txHash String? @map("tx_hash")
blockNumber BigInt? @map("block_number")
// 备注
memo String? @db.Text
createdAt DateTime @map("created_at")
syncedAt DateTime @default(now())
@@index([blackHoleId])
@@index([sourceAccountSeq])
@@index([txHash])
@@index([createdAt(sort: Desc)])
@@map("synced_burn_to_black_hole_records")
}
// =============================================================================
// CDC 同步表 - 手续费配置 (from mining-wallet-service)
// =============================================================================
model SyncedFeeConfig {
id String @id @default(uuid())
originalId String @unique @map("original_id")
feeType String @unique @map("fee_type") // WITHDRAW, TRADE, SWAP, TRANSFER
// 费率配置
feeRate Decimal @map("fee_rate") @db.Decimal(10, 6)
minFee Decimal @map("min_fee") @db.Decimal(30, 8)
maxFee Decimal? @map("max_fee") @db.Decimal(30, 8)
// 分配比例
headquartersRate Decimal @map("headquarters_rate") @db.Decimal(10, 6)
operationRate Decimal @map("operation_rate") @db.Decimal(10, 6)
provinceRate Decimal @map("province_rate") @db.Decimal(10, 6)
cityRate Decimal @map("city_rate") @db.Decimal(10, 6)
isActive Boolean @default(true) @map("is_active")
syncedAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("synced_fee_configs")
}