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 nickname String? // 昵称 (from identity-service) 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? referral SyncedReferral? @@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) unlockedBonusTiers Int @default(0) syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt user SyncedUser @relation(fields: [accountSequence], references: [accountSequence]) @@map("synced_contribution_accounts") } // ============================================================================= // CDC 同步表 - 推荐关系 (from contribution-service) // ============================================================================= model SyncedReferral { id String @id @default(uuid()) accountSequence String @unique referrerAccountSequence String? // 推荐人账户序列号 referrerUserId BigInt? // 1.0 的 referrer_id originalUserId BigInt? // 1.0 的 user_id ancestorPath String? @db.Text // 祖先路径(逗号分隔的 user_id) depth Int @default(0) syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt user SyncedUser @relation(fields: [accountSequence], references: [accountSequence]) @@index([referrerAccountSequence]) @@index([depth]) @@map("synced_referrals") } // ============================================================================= // CDC 同步表 - 认种记录 (from contribution-service) // ============================================================================= model SyncedAdoption { id String @id @default(uuid()) originalAdoptionId BigInt @unique accountSequence String treeCount Int adoptionDate DateTime @db.Date status String? // 认种状态 contributionPerTree Decimal @db.Decimal(20, 10) syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([accountSequence]) @@index([adoptionDate]) @@map("synced_adoptions") } // ============================================================================= // CDC 同步表 - 算力记录明细 (from contribution-service) // ============================================================================= model SyncedContributionRecord { id String @id @default(uuid()) originalRecordId BigInt @unique // contribution-service 中的原始 ID accountSequence String // 获得算力的账户 // 来源信息 sourceType String // PERSONAL / TEAM_LEVEL / TEAM_BONUS sourceAdoptionId BigInt // 来源认种ID sourceAccountSequence String // 认种人账号 // 计算参数 treeCount Int // 认种棵数 baseContribution Decimal @db.Decimal(20, 10) // 基础贡献值/棵 distributionRate Decimal @db.Decimal(10, 6) // 分配比例 levelDepth Int? // 层级深度 (1-15) bonusTier Int? // 加成档位 (1-3) // 金额 amount Decimal @db.Decimal(30, 10) // 算力金额 // 有效期 effectiveDate DateTime @db.Date // 生效日期 expireDate DateTime @db.Date // 过期日期 isExpired Boolean @default(false) syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt createdAt DateTime // 原始记录创建时间 @@index([accountSequence]) @@index([sourceAccountSequence]) @@index([sourceAdoptionId]) @@index([sourceType]) @@index([createdAt(sort: Desc)]) @@map("synced_contribution_records") } // ============================================================================= // CDC 同步表 - 全网算力进度 (from contribution-service) // ============================================================================= model SyncedNetworkProgress { id String @id @default(uuid()) totalTreeCount Int @default(0) // 全网累计认种棵数 totalAdoptionOrders Int @default(0) // 全网累计认种订单数 totalAdoptedUsers Int @default(0) // 全网累计认种用户数 currentUnit Int @default(0) // 当前单位数 currentMultiplier Decimal @db.Decimal(10, 6) @default(1.0) // 当前系数 currentContributionPerTree Decimal @db.Decimal(20, 10) @default(22617) // 当前每棵树贡献值 nextUnitTreeCount Int @default(1000) // 下一个单位触发的棵数 syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("synced_network_progress") } // ============================================================================= // 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") }