rwadurian/backend/services/reward-service/prisma/migrations/20241204000000_init/migration.sql

118 lines
5.1 KiB
SQL

-- CreateTable: reward_ledger_entries (聚合根1 - 行为表, append-only)
CREATE TABLE "reward_ledger_entries" (
"entry_id" BIGSERIAL NOT NULL,
"user_id" BIGINT NOT NULL,
"source_order_id" BIGINT NOT NULL,
"source_user_id" BIGINT NOT NULL,
"right_type" VARCHAR(50) NOT NULL,
"usdt_amount" DECIMAL(20,8) NOT NULL,
"hashpower_amount" DECIMAL(20,8) NOT NULL DEFAULT 0,
"reward_status" VARCHAR(20) NOT NULL DEFAULT 'PENDING',
"created_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"expire_at" TIMESTAMP(3),
"claimed_at" TIMESTAMP(3),
"settled_at" TIMESTAMP(3),
"expired_at" TIMESTAMP(3),
"memo" VARCHAR(500),
CONSTRAINT "reward_ledger_entries_pkey" PRIMARY KEY ("entry_id")
);
-- CreateTable: reward_summaries (聚合根2 - 状态表)
CREATE TABLE "reward_summaries" (
"summary_id" BIGSERIAL NOT NULL,
"user_id" BIGINT NOT NULL,
"pending_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"pending_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"pending_expire_at" TIMESTAMP(3),
"settleable_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"settleable_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"settled_total_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"settled_total_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"expired_total_usdt" DECIMAL(20,8) NOT NULL DEFAULT 0,
"expired_total_hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
"last_update_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "reward_summaries_pkey" PRIMARY KEY ("summary_id")
);
-- CreateTable: right_definitions (配置表)
CREATE TABLE "right_definitions" (
"definition_id" BIGSERIAL NOT NULL,
"right_type" VARCHAR(50) NOT NULL,
"usdt_per_tree" DECIMAL(20,8) NOT NULL,
"hashpower_percent" DECIMAL(5,2) NOT NULL DEFAULT 0,
"payable_to" VARCHAR(50) NOT NULL,
"rule_description" TEXT,
"is_enabled" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "right_definitions_pkey" PRIMARY KEY ("definition_id")
);
-- CreateTable: settlement_records (行为表)
CREATE TABLE "settlement_records" (
"settlement_id" BIGSERIAL NOT NULL,
"user_id" BIGINT NOT NULL,
"usdt_amount" DECIMAL(20,8) NOT NULL,
"hashpower_amount" DECIMAL(20,8) NOT NULL,
"settle_currency" VARCHAR(10) NOT NULL,
"received_amount" DECIMAL(20,8) NOT NULL,
"swap_tx_hash" VARCHAR(100),
"swap_rate" DECIMAL(20,8),
"status" VARCHAR(20) NOT NULL DEFAULT 'PENDING',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"completed_at" TIMESTAMP(3),
"reward_entry_ids" BIGINT[],
CONSTRAINT "settlement_records_pkey" PRIMARY KEY ("settlement_id")
);
-- CreateTable: reward_events (行为表, append-only)
CREATE TABLE "reward_events" (
"event_id" BIGSERIAL NOT NULL,
"event_type" VARCHAR(50) NOT NULL,
"aggregate_id" VARCHAR(100) NOT NULL,
"aggregate_type" VARCHAR(50) NOT NULL,
"event_data" JSONB NOT NULL,
"user_id" BIGINT,
"occurred_at" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"version" INTEGER NOT NULL DEFAULT 1,
CONSTRAINT "reward_events_pkey" PRIMARY KEY ("event_id")
);
-- CreateIndex: reward_ledger_entries indexes
CREATE INDEX "idx_user_status" ON "reward_ledger_entries"("user_id", "reward_status");
CREATE INDEX "idx_user_created" ON "reward_ledger_entries"("user_id", "created_at" DESC);
CREATE INDEX "idx_source_order" ON "reward_ledger_entries"("source_order_id");
CREATE INDEX "idx_source_user" ON "reward_ledger_entries"("source_user_id");
CREATE INDEX "idx_right_type" ON "reward_ledger_entries"("right_type");
CREATE INDEX "idx_status" ON "reward_ledger_entries"("reward_status");
CREATE INDEX "idx_expire" ON "reward_ledger_entries"("expire_at");
CREATE INDEX "idx_created" ON "reward_ledger_entries"("created_at");
-- CreateIndex: reward_summaries indexes
CREATE UNIQUE INDEX "reward_summaries_user_id_key" ON "reward_summaries"("user_id");
CREATE INDEX "idx_summary_user" ON "reward_summaries"("user_id");
CREATE INDEX "idx_settleable_desc" ON "reward_summaries"("settleable_usdt" DESC);
CREATE INDEX "idx_pending_expire" ON "reward_summaries"("pending_expire_at");
-- CreateIndex: right_definitions indexes
CREATE UNIQUE INDEX "right_definitions_right_type_key" ON "right_definitions"("right_type");
CREATE INDEX "idx_def_right_type" ON "right_definitions"("right_type");
CREATE INDEX "idx_def_enabled" ON "right_definitions"("is_enabled");
-- CreateIndex: settlement_records indexes
CREATE INDEX "idx_settlement_user" ON "settlement_records"("user_id");
CREATE INDEX "idx_settlement_status" ON "settlement_records"("status");
CREATE INDEX "idx_settlement_created" ON "settlement_records"("created_at");
-- CreateIndex: reward_events indexes
CREATE INDEX "idx_reward_event_aggregate" ON "reward_events"("aggregate_type", "aggregate_id");
CREATE INDEX "idx_reward_event_type" ON "reward_events"("event_type");
CREATE INDEX "idx_reward_event_user" ON "reward_events"("user_id");
CREATE INDEX "idx_reward_event_occurred" ON "reward_events"("occurred_at");