generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // ============================================ // 钱包账户表 (状态表) // ============================================ model WalletAccount { id BigInt @id @default(autoincrement()) @map("wallet_id") userId BigInt @unique @map("user_id") // USDT 余额 usdtAvailable Decimal @default(0) @map("usdt_available") @db.Decimal(20, 8) usdtFrozen Decimal @default(0) @map("usdt_frozen") @db.Decimal(20, 8) // DST 余额 dstAvailable Decimal @default(0) @map("dst_available") @db.Decimal(20, 8) dstFrozen Decimal @default(0) @map("dst_frozen") @db.Decimal(20, 8) // BNB 余额 bnbAvailable Decimal @default(0) @map("bnb_available") @db.Decimal(20, 8) bnbFrozen Decimal @default(0) @map("bnb_frozen") @db.Decimal(20, 8) // OG 余额 ogAvailable Decimal @default(0) @map("og_available") @db.Decimal(20, 8) ogFrozen Decimal @default(0) @map("og_frozen") @db.Decimal(20, 8) // RWAD 余额 rwadAvailable Decimal @default(0) @map("rwad_available") @db.Decimal(20, 8) rwadFrozen Decimal @default(0) @map("rwad_frozen") @db.Decimal(20, 8) // 算力 hashpower Decimal @default(0) @map("hashpower") @db.Decimal(20, 8) // 待领取收益 pendingUsdt Decimal @default(0) @map("pending_usdt") @db.Decimal(20, 8) pendingHashpower Decimal @default(0) @map("pending_hashpower") @db.Decimal(20, 8) pendingExpireAt DateTime? @map("pending_expire_at") // 可结算收益 settleableUsdt Decimal @default(0) @map("settleable_usdt") @db.Decimal(20, 8) settleableHashpower Decimal @default(0) @map("settleable_hashpower") @db.Decimal(20, 8) // 已结算总额 settledTotalUsdt Decimal @default(0) @map("settled_total_usdt") @db.Decimal(20, 8) settledTotalHashpower Decimal @default(0) @map("settled_total_hashpower") @db.Decimal(20, 8) // 已过期总额 expiredTotalUsdt Decimal @default(0) @map("expired_total_usdt") @db.Decimal(20, 8) expiredTotalHashpower Decimal @default(0) @map("expired_total_hashpower") @db.Decimal(20, 8) // 状态 status String @default("ACTIVE") @map("status") @db.VarChar(20) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("wallet_accounts") @@index([userId]) @@index([usdtAvailable(sort: Desc)]) @@index([hashpower(sort: Desc)]) @@index([status]) } // ============================================ // 账本流水表 (行为表, append-only) // ============================================ model LedgerEntry { id BigInt @id @default(autoincrement()) @map("entry_id") userId BigInt @map("user_id") // 流水类型 entryType String @map("entry_type") @db.VarChar(50) // 金额变动 (正数入账, 负数支出) amount Decimal @map("amount") @db.Decimal(20, 8) assetType String @map("asset_type") @db.VarChar(20) // 余额快照 (操作后余额) balanceAfter Decimal? @map("balance_after") @db.Decimal(20, 8) // 关联引用 refOrderId String? @map("ref_order_id") @db.VarChar(100) refTxHash String? @map("ref_tx_hash") @db.VarChar(100) // 备注 memo String? @map("memo") @db.VarChar(500) // 扩展数据 payloadJson Json? @map("payload_json") createdAt DateTime @default(now()) @map("created_at") @@map("wallet_ledger_entries") @@index([userId, createdAt(sort: Desc)]) @@index([entryType]) @@index([assetType]) @@index([refOrderId]) @@index([refTxHash]) @@index([createdAt]) } // ============================================ // 充值订单表 // ============================================ model DepositOrder { id BigInt @id @default(autoincrement()) @map("order_id") userId BigInt @map("user_id") // 充值信息 chainType String @map("chain_type") @db.VarChar(20) amount Decimal @map("amount") @db.Decimal(20, 8) txHash String @unique @map("tx_hash") @db.VarChar(100) // 状态 status String @default("PENDING") @map("status") @db.VarChar(20) confirmedAt DateTime? @map("confirmed_at") createdAt DateTime @default(now()) @map("created_at") @@map("deposit_orders") @@index([userId]) @@index([txHash]) @@index([status]) @@index([chainType]) } // ============================================ // 结算订单表 // ============================================ model SettlementOrder { id BigInt @id @default(autoincrement()) @map("order_id") userId BigInt @map("user_id") // 结算信息 usdtAmount Decimal @map("usdt_amount") @db.Decimal(20, 8) settleCurrency String @map("settle_currency") @db.VarChar(10) // SWAP 信息 swapTxHash String? @map("swap_tx_hash") @db.VarChar(100) receivedAmount Decimal? @map("received_amount") @db.Decimal(20, 8) // 状态 status String @default("PENDING") @map("status") @db.VarChar(20) settledAt DateTime? @map("settled_at") createdAt DateTime @default(now()) @map("created_at") @@map("settlement_orders") @@index([userId]) @@index([status]) @@index([settleCurrency]) @@index([createdAt]) }