Files
2026-06-20 14:26:29 +08:00

54 lines
2.2 KiB
SQL

-- 托管余额系统
-- 允许满足条件的用户自行托管节点并获得收益
-- 枚举类型
CREATE TYPE "HostingBalanceType" AS ENUM ('income', 'unfreeze', 'withdraw');
CREATE TYPE "WithdrawalStatus" AS ENUM ('pending', 'approved', 'rejected', 'completed');
CREATE TYPE "WithdrawalTarget" AS ENUM ('balance', 'usdt');
-- 在 users 表添加托管余额字段
ALTER TABLE "users" ADD COLUMN "hosting_balance" DECIMAL(10, 2) NOT NULL DEFAULT 0;
-- 托管余额变动日志表
CREATE TABLE "hosting_balance_logs" (
"id" SERIAL NOT NULL,
"user_id" INTEGER NOT NULL,
"type" "HostingBalanceType" NOT NULL,
"amount" DECIMAL(10, 2) NOT NULL,
"frozen" BOOLEAN NOT NULL DEFAULT true,
"unfreeze_at" TIMESTAMP(3),
"related_id" INTEGER,
"remark" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "hosting_balance_logs_pkey" PRIMARY KEY ("id")
);
-- 托管余额提现记录表
CREATE TABLE "hosting_withdrawals" (
"id" SERIAL NOT NULL,
"user_id" INTEGER NOT NULL,
"amount" DECIMAL(10, 2) NOT NULL,
"fee_rate" DECIMAL(5, 4) NOT NULL,
"fee_amount" DECIMAL(10, 2) NOT NULL,
"actual_amount" DECIMAL(10, 2) NOT NULL,
"target" "WithdrawalTarget" NOT NULL,
"usdt_address" TEXT,
"status" "WithdrawalStatus" NOT NULL DEFAULT 'pending',
"reject_reason" TEXT,
"processed_at" TIMESTAMP(3),
"processed_by" INTEGER,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "hosting_withdrawals_pkey" PRIMARY KEY ("id")
);
-- 索引
CREATE INDEX "hosting_balance_logs_user_id_frozen_idx" ON "hosting_balance_logs"("user_id", "frozen");
CREATE INDEX "hosting_balance_logs_unfreeze_at_idx" ON "hosting_balance_logs"("unfreeze_at");
CREATE INDEX "hosting_withdrawals_user_id_status_idx" ON "hosting_withdrawals"("user_id", "status");
-- 外键约束
ALTER TABLE "hosting_balance_logs" ADD CONSTRAINT "hosting_balance_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "hosting_withdrawals" ADD CONSTRAINT "hosting_withdrawals_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;