683 lines
24 KiB
Plaintext
683 lines
24 KiB
Plaintext
// =============================================================================
|
||
// Mining Wallet Service - Prisma Schema
|
||
// 100% 独立于 1.0 系统,完全隔离的钱包管理服务
|
||
// =============================================================================
|
||
|
||
generator client {
|
||
provider = "prisma-client-js"
|
||
}
|
||
|
||
datasource db {
|
||
provider = "postgresql"
|
||
url = env("DATABASE_URL")
|
||
}
|
||
|
||
// =============================================================================
|
||
// 枚举定义
|
||
// =============================================================================
|
||
|
||
// 系统账户类型
|
||
enum SystemAccountType {
|
||
HEADQUARTERS // 总部账户
|
||
OPERATION // 运营账户
|
||
PROVINCE // 省级公司账户
|
||
CITY // 市级公司账户
|
||
FEE // 手续费账户
|
||
HOT_WALLET // 热钱包(KAVA链上)
|
||
COLD_WALLET // 冷钱包(离线存储)
|
||
}
|
||
|
||
// 池账户类型
|
||
enum PoolAccountType {
|
||
SHARE_POOL // 积分股池 - 总股池
|
||
BLACK_HOLE_POOL // 黑洞积分股池 - 销毁池
|
||
CIRCULATION_POOL // 流通积分股池 - 交易流通池
|
||
}
|
||
|
||
// 用户钱包账户类型
|
||
enum UserWalletType {
|
||
CONTRIBUTION // 算力账户(hashpower/contribution)
|
||
TOKEN_STORAGE // 积分股存储账户
|
||
GREEN_POINTS // 绿色积分账户
|
||
}
|
||
|
||
// 资产类型
|
||
enum AssetType {
|
||
SHARE // 积分股 (RWA Token)
|
||
USDT // USDT 稳定币
|
||
GREEN_POINT // 绿色积分
|
||
CONTRIBUTION // 算力值
|
||
}
|
||
|
||
// 交易类型
|
||
enum TransactionType {
|
||
// 挖矿相关
|
||
MINING_REWARD // 挖矿奖励
|
||
MINING_DISTRIBUTE // 挖矿分配
|
||
|
||
// 划转相关
|
||
TRANSFER_IN // 划入
|
||
TRANSFER_OUT // 划出
|
||
INTERNAL_TRANSFER // 内部划转
|
||
|
||
// 交易相关
|
||
TRADE_BUY // 买入
|
||
TRADE_SELL // 卖出
|
||
|
||
// 提现/充值
|
||
WITHDRAW // 提现到链上
|
||
DEPOSIT // 从链上充值
|
||
|
||
// 销毁
|
||
BURN // 销毁到黑洞
|
||
|
||
// 冻结/解冻
|
||
FREEZE // 冻结
|
||
UNFREEZE // 解冻
|
||
|
||
// 手续费
|
||
FEE_COLLECT // 收取手续费
|
||
FEE_DISTRIBUTE // 分发手续费
|
||
|
||
// 池操作
|
||
POOL_INJECT // 注入池
|
||
POOL_EXTRACT // 从池提取
|
||
|
||
// 系统调整
|
||
ADJUSTMENT // 系统调整
|
||
INITIAL_INJECT // 初始注入
|
||
}
|
||
|
||
// 交易对手方类型
|
||
enum CounterpartyType {
|
||
USER // 用户
|
||
SYSTEM_ACCOUNT // 系统账户
|
||
POOL // 池账户
|
||
BLOCKCHAIN // 区块链地址
|
||
EXTERNAL // 外部
|
||
}
|
||
|
||
// 提现状态
|
||
enum WithdrawStatus {
|
||
PENDING // 待处理
|
||
PROCESSING // 处理中
|
||
CONFIRMING // 链上确认中
|
||
COMPLETED // 已完成
|
||
FAILED // 失败
|
||
CANCELLED // 已取消
|
||
}
|
||
|
||
// Outbox 状态
|
||
enum OutboxStatus {
|
||
PENDING
|
||
PUBLISHED
|
||
FAILED
|
||
}
|
||
|
||
// =============================================================================
|
||
// 区域管理(100% 独立于 1.0)
|
||
// =============================================================================
|
||
|
||
// 省份
|
||
model Province {
|
||
id String @id @default(uuid())
|
||
code String @unique // 省份代码 e.g. "GD"
|
||
name String // 省份名称 e.g. "广东省"
|
||
status String @default("ACTIVE") // ACTIVE, DISABLED
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
cities City[]
|
||
systemAccounts SystemAccount[]
|
||
|
||
@@index([code])
|
||
@@map("provinces")
|
||
}
|
||
|
||
// 城市
|
||
model City {
|
||
id String @id @default(uuid())
|
||
provinceId String @map("province_id")
|
||
code String @unique // 城市代码 e.g. "SZ"
|
||
name String // 城市名称 e.g. "深圳市"
|
||
status String @default("ACTIVE") // ACTIVE, DISABLED
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
province Province @relation(fields: [provinceId], references: [id])
|
||
userMappings UserRegionMapping[]
|
||
systemAccounts SystemAccount[]
|
||
|
||
@@index([provinceId])
|
||
@@index([code])
|
||
@@map("cities")
|
||
}
|
||
|
||
// 用户区域映射(100% 独立于 1.0)
|
||
model UserRegionMapping {
|
||
id String @id @default(uuid())
|
||
accountSequence String @unique @map("account_sequence") // 用户账户序列号
|
||
cityId String @map("city_id")
|
||
assignedAt DateTime @default(now()) @map("assigned_at")
|
||
assignedBy String? @map("assigned_by") // 分配人(管理员ID)
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
city City @relation(fields: [cityId], references: [id])
|
||
|
||
@@index([cityId])
|
||
@@map("user_region_mappings")
|
||
}
|
||
|
||
// =============================================================================
|
||
// 系统账户(HQ、运营、省/市公司、手续费、热/冷钱包)
|
||
// =============================================================================
|
||
|
||
model SystemAccount {
|
||
id String @id @default(uuid())
|
||
accountType SystemAccountType @map("account_type")
|
||
name String // 账户名称
|
||
code String @unique // 账户代码 e.g. "HQ", "OP", "GD-SZ"
|
||
|
||
// 关联区域(省/市级公司账户使用)
|
||
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")
|
||
|
||
description String?
|
||
isActive Boolean @default(true) @map("is_active")
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
province Province? @relation(fields: [provinceId], references: [id])
|
||
city City? @relation(fields: [cityId], references: [id])
|
||
transactions SystemAccountTransaction[]
|
||
|
||
@@unique([accountType, provinceId, cityId])
|
||
@@index([accountType])
|
||
@@index([provinceId])
|
||
@@index([cityId])
|
||
@@map("system_accounts")
|
||
}
|
||
|
||
// 系统账户交易明细
|
||
model SystemAccountTransaction {
|
||
id String @id @default(uuid())
|
||
systemAccountId String @map("system_account_id")
|
||
transactionType TransactionType @map("transaction_type")
|
||
assetType AssetType @map("asset_type")
|
||
|
||
// 金额信息
|
||
amount Decimal @db.Decimal(30, 8)
|
||
balanceBefore Decimal @map("balance_before") @db.Decimal(30, 8)
|
||
balanceAfter Decimal @map("balance_after") @db.Decimal(30, 8)
|
||
|
||
// 交易对手方信息
|
||
counterpartyType CounterpartyType? @map("counterparty_type")
|
||
counterpartyAccountSeq String? @map("counterparty_account_seq")
|
||
counterpartyUserId String? @map("counterparty_user_id")
|
||
counterpartySystemId String? @map("counterparty_system_id")
|
||
counterpartyPoolType PoolAccountType? @map("counterparty_pool_type")
|
||
counterpartyAddress String? @map("counterparty_address")
|
||
|
||
// 关联信息
|
||
referenceId String? @map("reference_id")
|
||
referenceType String? @map("reference_type")
|
||
txHash String? @map("tx_hash")
|
||
|
||
// 详细备注(格式: "手续费收取自用户[U123456], 交易订单ORD20240110001")
|
||
memo String? @db.Text
|
||
metadata Json?
|
||
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
systemAccount SystemAccount @relation(fields: [systemAccountId], references: [id])
|
||
|
||
@@index([systemAccountId, createdAt(sort: Desc)])
|
||
@@index([transactionType])
|
||
@@index([counterpartyAccountSeq])
|
||
@@index([counterpartyUserId])
|
||
@@index([referenceId])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("system_account_transactions")
|
||
}
|
||
|
||
// =============================================================================
|
||
// 池账户(积分股池、黑洞池、流通池)
|
||
// =============================================================================
|
||
|
||
model PoolAccount {
|
||
id String @id @default(uuid())
|
||
poolType PoolAccountType @unique @map("pool_type")
|
||
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")
|
||
description String?
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
transactions PoolAccountTransaction[]
|
||
|
||
@@index([poolType])
|
||
@@map("pool_accounts")
|
||
}
|
||
|
||
// 池账户交易明细
|
||
model PoolAccountTransaction {
|
||
id String @id @default(uuid())
|
||
poolAccountId String @map("pool_account_id")
|
||
poolType PoolAccountType @map("pool_type")
|
||
transactionType TransactionType @map("transaction_type")
|
||
|
||
// 金额信息
|
||
amount Decimal @db.Decimal(30, 8)
|
||
balanceBefore Decimal @map("balance_before") @db.Decimal(30, 8)
|
||
balanceAfter Decimal @map("balance_after") @db.Decimal(30, 8)
|
||
|
||
// 交易对手方信息(关键:用户ID和账户序列号)
|
||
counterpartyType CounterpartyType? @map("counterparty_type")
|
||
counterpartyAccountSeq String? @map("counterparty_account_seq")
|
||
counterpartyUserId String? @map("counterparty_user_id")
|
||
counterpartySystemId String? @map("counterparty_system_id")
|
||
counterpartyPoolType PoolAccountType? @map("counterparty_pool_type")
|
||
counterpartyAddress String? @map("counterparty_address")
|
||
|
||
// 关联信息
|
||
referenceId String? @map("reference_id")
|
||
referenceType String? @map("reference_type")
|
||
txHash String? @map("tx_hash")
|
||
|
||
// 详细备注(格式: "挖矿分配给用户[U123456], 算力占比0.5%, 分钟2024-01-10 10:30")
|
||
memo String? @db.Text
|
||
metadata Json?
|
||
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
poolAccount PoolAccount @relation(fields: [poolAccountId], references: [id])
|
||
|
||
@@index([poolAccountId, createdAt(sort: Desc)])
|
||
@@index([poolType, transactionType])
|
||
@@index([counterpartyAccountSeq])
|
||
@@index([counterpartyUserId])
|
||
@@index([referenceId])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("pool_account_transactions")
|
||
}
|
||
|
||
// =============================================================================
|
||
// 用户钱包账户
|
||
// =============================================================================
|
||
|
||
// 用户钱包(每个用户有多个钱包类型)
|
||
model UserWallet {
|
||
id String @id @default(uuid())
|
||
accountSequence String @map("account_sequence")
|
||
walletType UserWalletType @map("wallet_type")
|
||
|
||
// 余额信息
|
||
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")
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
transactions UserWalletTransaction[]
|
||
|
||
@@unique([accountSequence, walletType])
|
||
@@index([accountSequence])
|
||
@@index([walletType])
|
||
@@map("user_wallets")
|
||
}
|
||
|
||
// 用户钱包交易明细
|
||
model UserWalletTransaction {
|
||
id String @id @default(uuid())
|
||
userWalletId String @map("user_wallet_id")
|
||
accountSequence String @map("account_sequence")
|
||
walletType UserWalletType @map("wallet_type")
|
||
transactionType TransactionType @map("transaction_type")
|
||
assetType AssetType @map("asset_type")
|
||
|
||
// 金额信息
|
||
amount Decimal @db.Decimal(30, 8)
|
||
balanceBefore Decimal @map("balance_before") @db.Decimal(30, 8)
|
||
balanceAfter Decimal @map("balance_after") @db.Decimal(30, 8)
|
||
|
||
// 交易对手方信息(关键:用户ID和账户序列号)
|
||
counterpartyType CounterpartyType? @map("counterparty_type")
|
||
counterpartyAccountSeq String? @map("counterparty_account_seq")
|
||
counterpartyUserId String? @map("counterparty_user_id")
|
||
counterpartySystemId String? @map("counterparty_system_id")
|
||
counterpartyPoolType PoolAccountType? @map("counterparty_pool_type")
|
||
counterpartyAddress String? @map("counterparty_address")
|
||
|
||
// 关联信息
|
||
referenceId String? @map("reference_id")
|
||
referenceType String? @map("reference_type")
|
||
txHash String? @map("tx_hash")
|
||
|
||
// 详细备注(格式: "划转到交易账户, 接收方用户[U789012]")
|
||
memo String? @db.Text
|
||
metadata Json?
|
||
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
userWallet UserWallet @relation(fields: [userWalletId], references: [id])
|
||
|
||
@@index([userWalletId, createdAt(sort: Desc)])
|
||
@@index([accountSequence, walletType])
|
||
@@index([transactionType])
|
||
@@index([counterpartyAccountSeq])
|
||
@@index([counterpartyUserId])
|
||
@@index([referenceId])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("user_wallet_transactions")
|
||
}
|
||
|
||
// =============================================================================
|
||
// KAVA 区块链集成
|
||
// =============================================================================
|
||
|
||
// 提现请求
|
||
model WithdrawRequest {
|
||
id String @id @default(uuid())
|
||
requestNo String @unique @map("request_no")
|
||
accountSequence String @map("account_sequence")
|
||
|
||
// 提现信息
|
||
assetType AssetType @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 WithdrawStatus @default(PENDING)
|
||
|
||
// 链上信息
|
||
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 @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
completedAt DateTime? @map("completed_at")
|
||
|
||
@@index([accountSequence])
|
||
@@index([status])
|
||
@@index([txHash])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("withdraw_requests")
|
||
}
|
||
|
||
// 充值记录(链上检测到的充值)
|
||
model DepositRecord {
|
||
id String @id @default(uuid())
|
||
txHash String @unique @map("tx_hash")
|
||
|
||
// 来源信息
|
||
fromAddress String @map("from_address")
|
||
toAddress String @map("to_address")
|
||
|
||
// 充值信息
|
||
assetType AssetType @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 @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
@@index([fromAddress])
|
||
@@index([toAddress])
|
||
@@index([matchedAccountSeq])
|
||
@@index([isProcessed])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("deposit_records")
|
||
}
|
||
|
||
// DEX Swap 记录
|
||
model DexSwapRecord {
|
||
id String @id @default(uuid())
|
||
swapNo String @unique @map("swap_no")
|
||
accountSequence String @map("account_sequence")
|
||
|
||
// Swap 信息
|
||
fromAsset AssetType @map("from_asset")
|
||
toAsset AssetType @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 WithdrawStatus @default(PENDING)
|
||
|
||
// 链上信息
|
||
txHash String? @map("tx_hash")
|
||
blockNumber BigInt? @map("block_number")
|
||
|
||
errorMessage String? @map("error_message")
|
||
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
completedAt DateTime? @map("completed_at")
|
||
|
||
@@index([accountSequence])
|
||
@@index([status])
|
||
@@index([txHash])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("dex_swap_records")
|
||
}
|
||
|
||
// 链上地址绑定
|
||
model BlockchainAddressBinding {
|
||
id String @id @default(uuid())
|
||
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 @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
@@index([kavaAddress])
|
||
@@map("blockchain_address_bindings")
|
||
}
|
||
|
||
// 黑洞合约(KAVA 链上销毁地址)
|
||
model BlackHoleContract {
|
||
id String @id @default(uuid())
|
||
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")
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
burnRecords BurnToBlackHoleRecord[]
|
||
|
||
@@map("black_hole_contracts")
|
||
}
|
||
|
||
// 销毁到黑洞的记录
|
||
model BurnToBlackHoleRecord {
|
||
id String @id @default(uuid())
|
||
blackHoleId String @map("black_hole_id")
|
||
|
||
// 销毁信息
|
||
amount Decimal @db.Decimal(30, 8)
|
||
|
||
// 来源
|
||
sourceType CounterpartyType @map("source_type")
|
||
sourceAccountSeq String? @map("source_account_seq")
|
||
sourceUserId String? @map("source_user_id")
|
||
sourcePoolType PoolAccountType? @map("source_pool_type")
|
||
|
||
// 链上信息
|
||
txHash String? @map("tx_hash")
|
||
blockNumber BigInt? @map("block_number")
|
||
|
||
// 备注
|
||
memo String? @db.Text
|
||
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
blackHole BlackHoleContract @relation(fields: [blackHoleId], references: [id])
|
||
|
||
@@index([blackHoleId])
|
||
@@index([sourceAccountSeq])
|
||
@@index([txHash])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("burn_to_black_hole_records")
|
||
}
|
||
|
||
// =============================================================================
|
||
// 手续费配置
|
||
// =============================================================================
|
||
|
||
model FeeConfig {
|
||
id String @id @default(uuid())
|
||
feeType String @unique @map("fee_type") // WITHDRAW, TRADE, SWAP, TRANSFER
|
||
|
||
// 费率配置
|
||
feeRate Decimal @map("fee_rate") @db.Decimal(10, 6) // 费率 e.g. 0.001 = 0.1%
|
||
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")
|
||
description String?
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
@@map("fee_configs")
|
||
}
|
||
|
||
// =============================================================================
|
||
// Outbox Pattern(事件发布)
|
||
// =============================================================================
|
||
|
||
model OutboxEvent {
|
||
id String @id @default(uuid())
|
||
aggregateType String @map("aggregate_type")
|
||
aggregateId String @map("aggregate_id")
|
||
eventType String @map("event_type")
|
||
payload Json
|
||
topic String @default("mining-wallet.events")
|
||
key String?
|
||
status OutboxStatus @default(PENDING)
|
||
retryCount Int @default(0) @map("retry_count")
|
||
maxRetries Int @default(10) @map("max_retries")
|
||
lastError String? @map("last_error")
|
||
publishedAt DateTime? @map("published_at")
|
||
nextRetryAt DateTime? @map("next_retry_at")
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
@@index([status])
|
||
@@index([nextRetryAt])
|
||
@@index([createdAt])
|
||
@@map("outbox_events")
|
||
}
|
||
|
||
// =============================================================================
|
||
// 已处理事件(幂等性)
|
||
// =============================================================================
|
||
|
||
model ProcessedEvent {
|
||
id String @id @default(uuid())
|
||
eventId String @unique @map("event_id")
|
||
eventType String @map("event_type")
|
||
sourceService String @map("source_service")
|
||
processedAt DateTime @default(now()) @map("processed_at")
|
||
|
||
@@index([sourceService])
|
||
@@index([processedAt])
|
||
@@map("processed_events")
|
||
}
|
||
|
||
// =============================================================================
|
||
// 审计日志
|
||
// =============================================================================
|
||
|
||
model AuditLog {
|
||
id String @id @default(uuid())
|
||
operatorId String @map("operator_id")
|
||
operatorType String @map("operator_type") // ADMIN, SYSTEM, USER
|
||
action String // CREATE, UPDATE, DELETE, TRANSFER, WITHDRAW, etc.
|
||
resource String // SYSTEM_ACCOUNT, USER_WALLET, POOL, etc.
|
||
resourceId String? @map("resource_id")
|
||
oldValue Json? @map("old_value")
|
||
newValue Json? @map("new_value")
|
||
ipAddress String? @map("ip_address")
|
||
userAgent String? @map("user_agent")
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
@@index([operatorId])
|
||
@@index([action])
|
||
@@index([resource])
|
||
@@index([createdAt(sort: Desc)])
|
||
@@map("audit_logs")
|
||
}
|