372 lines
14 KiB
SQL
372 lines
14 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "RoleType" AS ENUM ('COMMUNITY', 'AUTH_PROVINCE_COMPANY', 'PROVINCE_COMPANY', 'AUTH_CITY_COMPANY', 'CITY_COMPANY');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "AuthorizationStatus" AS ENUM ('PENDING', 'AUTHORIZED', 'REVOKED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "AssessmentResult" AS ENUM ('NOT_ASSESSED', 'PASS', 'FAIL', 'BYPASSED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "MonthlyTargetType" AS ENUM ('NONE', 'FIXED', 'LADDER');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "RestrictionType" AS ENUM ('ACCOUNT_LIMIT', 'TOTAL_LIMIT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ApprovalStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "OperationType" AS ENUM ('GRANT_AUTHORIZATION', 'REVOKE_AUTHORIZATION', 'GRANT_BYPASS', 'EXEMPT_PERCENTAGE', 'MODIFY_CONFIG');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "RegionType" AS ENUM ('PROVINCE', 'CITY');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SystemAccountType" AS ENUM ('COST_ACCOUNT', 'OPERATION_ACCOUNT', 'HQ_COMMUNITY', 'RWAD_POOL_PENDING', 'SYSTEM_PROVINCE', 'SYSTEM_CITY');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SystemLedgerEntryType" AS ENUM ('PLANTING_ALLOCATION', 'REWARD_EXPIRED', 'TRANSFER_OUT', 'TRANSFER_IN', 'WITHDRAWAL', 'ADJUSTMENT');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "authorization_roles" (
|
|
"id" TEXT NOT NULL,
|
|
"user_id" TEXT NOT NULL,
|
|
"role_type" "RoleType" NOT NULL,
|
|
"region_code" TEXT NOT NULL,
|
|
"region_name" TEXT NOT NULL,
|
|
"status" "AuthorizationStatus" NOT NULL DEFAULT 'PENDING',
|
|
"display_title" TEXT NOT NULL,
|
|
"authorized_at" TIMESTAMP(3),
|
|
"authorized_by" TEXT,
|
|
"revoked_at" TIMESTAMP(3),
|
|
"revoked_by" TEXT,
|
|
"revoke_reason" TEXT,
|
|
"initial_target_tree_count" INTEGER NOT NULL,
|
|
"monthly_target_type" "MonthlyTargetType" NOT NULL,
|
|
"require_local_percentage" DECIMAL(5,2) NOT NULL DEFAULT 5.0,
|
|
"exempt_from_percentage_check" BOOLEAN NOT NULL DEFAULT false,
|
|
"benefit_active" BOOLEAN NOT NULL DEFAULT false,
|
|
"benefit_activated_at" TIMESTAMP(3),
|
|
"benefit_deactivated_at" TIMESTAMP(3),
|
|
"current_month_index" INTEGER NOT NULL DEFAULT 0,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "authorization_roles_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "monthly_assessments" (
|
|
"id" TEXT NOT NULL,
|
|
"authorization_id" TEXT NOT NULL,
|
|
"user_id" TEXT NOT NULL,
|
|
"role_type" "RoleType" NOT NULL,
|
|
"region_code" TEXT NOT NULL,
|
|
"assessment_month" TEXT NOT NULL,
|
|
"month_index" INTEGER NOT NULL,
|
|
"monthly_target" INTEGER NOT NULL,
|
|
"cumulative_target" INTEGER NOT NULL,
|
|
"monthly_completed" INTEGER NOT NULL DEFAULT 0,
|
|
"cumulative_completed" INTEGER NOT NULL DEFAULT 0,
|
|
"completed_at" TIMESTAMP(3),
|
|
"local_team_count" INTEGER NOT NULL DEFAULT 0,
|
|
"total_team_count" INTEGER NOT NULL DEFAULT 0,
|
|
"local_percentage" DECIMAL(5,2) NOT NULL DEFAULT 0,
|
|
"local_percentage_pass" BOOLEAN NOT NULL DEFAULT false,
|
|
"exceed_ratio" DECIMAL(10,4) NOT NULL DEFAULT 0,
|
|
"result" "AssessmentResult" NOT NULL DEFAULT 'NOT_ASSESSED',
|
|
"ranking_in_region" INTEGER,
|
|
"is_first_place" BOOLEAN NOT NULL DEFAULT false,
|
|
"is_bypassed" BOOLEAN NOT NULL DEFAULT false,
|
|
"bypassed_by" TEXT,
|
|
"bypassed_at" TIMESTAMP(3),
|
|
"assessed_at" TIMESTAMP(3),
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "monthly_assessments_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "monthly_bypasses" (
|
|
"id" TEXT NOT NULL,
|
|
"authorization_id" TEXT NOT NULL,
|
|
"user_id" TEXT NOT NULL,
|
|
"role_type" "RoleType" NOT NULL,
|
|
"bypass_month" TEXT NOT NULL,
|
|
"granted_by" TEXT NOT NULL,
|
|
"granted_at" TIMESTAMP(3) NOT NULL,
|
|
"reason" TEXT,
|
|
"approver1_id" TEXT NOT NULL,
|
|
"approver1_at" TIMESTAMP(3) NOT NULL,
|
|
"approver2_id" TEXT,
|
|
"approver2_at" TIMESTAMP(3),
|
|
"approver3_id" TEXT,
|
|
"approver3_at" TIMESTAMP(3),
|
|
"approval_status" "ApprovalStatus" NOT NULL DEFAULT 'PENDING',
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "monthly_bypasses_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ladder_target_configs" (
|
|
"id" TEXT NOT NULL,
|
|
"role_type" "RoleType" NOT NULL,
|
|
"month_index" INTEGER NOT NULL,
|
|
"monthly_target" INTEGER NOT NULL,
|
|
"cumulative_target" INTEGER NOT NULL,
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ladder_target_configs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "planting_restrictions" (
|
|
"id" TEXT NOT NULL,
|
|
"restriction_type" "RestrictionType" NOT NULL,
|
|
"account_limit_days" INTEGER,
|
|
"account_limit_count" INTEGER,
|
|
"total_limit_days" INTEGER,
|
|
"total_limit_count" INTEGER,
|
|
"current_total_count" INTEGER NOT NULL DEFAULT 0,
|
|
"start_at" TIMESTAMP(3) NOT NULL,
|
|
"end_at" TIMESTAMP(3) NOT NULL,
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"created_by" TEXT NOT NULL,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "planting_restrictions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "admin_approvals" (
|
|
"id" TEXT NOT NULL,
|
|
"operation_type" "OperationType" NOT NULL,
|
|
"target_id" TEXT NOT NULL,
|
|
"target_type" TEXT NOT NULL,
|
|
"request_data" JSONB NOT NULL,
|
|
"status" "ApprovalStatus" NOT NULL DEFAULT 'PENDING',
|
|
"requester_id" TEXT NOT NULL,
|
|
"approver1_id" TEXT,
|
|
"approver1_at" TIMESTAMP(3),
|
|
"approver2_id" TEXT,
|
|
"approver2_at" TIMESTAMP(3),
|
|
"approver3_id" TEXT,
|
|
"approver3_at" TIMESTAMP(3),
|
|
"completed_at" TIMESTAMP(3),
|
|
"rejected_by" TEXT,
|
|
"rejected_at" TIMESTAMP(3),
|
|
"reject_reason" TEXT,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "admin_approvals_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "authorization_audit_logs" (
|
|
"id" TEXT NOT NULL,
|
|
"operation_type" TEXT NOT NULL,
|
|
"target_user_id" TEXT NOT NULL,
|
|
"target_role_type" "RoleType",
|
|
"target_region_code" TEXT,
|
|
"operator_id" TEXT NOT NULL,
|
|
"operator_role" TEXT NOT NULL,
|
|
"before_state" JSONB,
|
|
"after_state" JSONB,
|
|
"ip_address" TEXT,
|
|
"user_agent" TEXT,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "authorization_audit_logs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "region_heat_maps" (
|
|
"id" TEXT NOT NULL,
|
|
"region_code" TEXT NOT NULL,
|
|
"region_name" TEXT NOT NULL,
|
|
"region_type" "RegionType" NOT NULL,
|
|
"total_plantings" INTEGER NOT NULL DEFAULT 0,
|
|
"monthly_plantings" INTEGER NOT NULL DEFAULT 0,
|
|
"weekly_plantings" INTEGER NOT NULL DEFAULT 0,
|
|
"daily_plantings" INTEGER NOT NULL DEFAULT 0,
|
|
"active_users" INTEGER NOT NULL DEFAULT 0,
|
|
"auth_company_count" INTEGER NOT NULL DEFAULT 0,
|
|
"heat_score" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "region_heat_maps_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "stickman_rankings" (
|
|
"id" TEXT NOT NULL,
|
|
"user_id" TEXT NOT NULL,
|
|
"authorization_id" TEXT NOT NULL,
|
|
"role_type" "RoleType" NOT NULL,
|
|
"region_code" TEXT NOT NULL,
|
|
"region_name" TEXT NOT NULL,
|
|
"nickname" TEXT NOT NULL,
|
|
"avatar_url" TEXT,
|
|
"current_month" TEXT NOT NULL,
|
|
"cumulative_completed" INTEGER NOT NULL,
|
|
"cumulative_target" INTEGER NOT NULL,
|
|
"progress_percentage" DECIMAL(5,2) NOT NULL,
|
|
"exceed_ratio" DECIMAL(10,4) NOT NULL,
|
|
"ranking" INTEGER NOT NULL,
|
|
"is_first_place" BOOLEAN NOT NULL,
|
|
"monthly_reward_usdt" DECIMAL(18,2) NOT NULL,
|
|
"monthly_reward_rwad" DECIMAL(18,8) NOT NULL,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "stickman_rankings_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "authorization_configs" (
|
|
"id" TEXT NOT NULL,
|
|
"config_key" TEXT NOT NULL,
|
|
"config_value" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "authorization_configs_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "system_accounts" (
|
|
"account_id" BIGSERIAL NOT NULL,
|
|
"account_type" "SystemAccountType" NOT NULL,
|
|
"region_code" VARCHAR(10),
|
|
"region_name" VARCHAR(50),
|
|
"wallet_address" VARCHAR(42),
|
|
"mpc_public_key" VARCHAR(130),
|
|
"usdt_balance" DECIMAL(20,8) NOT NULL DEFAULT 0,
|
|
"hashpower" DECIMAL(20,8) NOT NULL DEFAULT 0,
|
|
"total_received" DECIMAL(20,8) NOT NULL DEFAULT 0,
|
|
"total_transferred" DECIMAL(20,8) NOT NULL DEFAULT 0,
|
|
"status" VARCHAR(20) NOT NULL DEFAULT 'ACTIVE',
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "system_accounts_pkey" PRIMARY KEY ("account_id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "system_account_ledgers" (
|
|
"ledger_id" BIGSERIAL NOT NULL,
|
|
"account_id" BIGINT NOT NULL,
|
|
"entry_type" "SystemLedgerEntryType" NOT NULL,
|
|
"amount" DECIMAL(20,8) NOT NULL,
|
|
"balance_after" DECIMAL(20,8) NOT NULL,
|
|
"source_order_id" BIGINT,
|
|
"source_reward_id" BIGINT,
|
|
"tx_hash" VARCHAR(66),
|
|
"memo" VARCHAR(500),
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "system_account_ledgers_pkey" PRIMARY KEY ("ledger_id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "authorization_roles_user_id_idx" ON "authorization_roles"("user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "authorization_roles_role_type_region_code_idx" ON "authorization_roles"("role_type", "region_code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "authorization_roles_status_idx" ON "authorization_roles"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "authorization_roles_role_type_status_idx" ON "authorization_roles"("role_type", "status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "authorization_roles_user_id_role_type_region_code_key" ON "authorization_roles"("user_id", "role_type", "region_code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "monthly_assessments_user_id_assessment_month_idx" ON "monthly_assessments"("user_id", "assessment_month");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "monthly_assessments_role_type_region_code_assessment_month_idx" ON "monthly_assessments"("role_type", "region_code", "assessment_month");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "monthly_assessments_assessment_month_result_idx" ON "monthly_assessments"("assessment_month", "result");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "monthly_assessments_assessment_month_role_type_exceed_ratio_idx" ON "monthly_assessments"("assessment_month", "role_type", "exceed_ratio" DESC);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "monthly_assessments_authorization_id_assessment_month_key" ON "monthly_assessments"("authorization_id", "assessment_month");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "monthly_bypasses_user_id_bypass_month_idx" ON "monthly_bypasses"("user_id", "bypass_month");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "monthly_bypasses_authorization_id_bypass_month_key" ON "monthly_bypasses"("authorization_id", "bypass_month");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ladder_target_configs_role_type_month_index_key" ON "ladder_target_configs"("role_type", "month_index");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "admin_approvals_status_idx" ON "admin_approvals"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "admin_approvals_target_id_target_type_idx" ON "admin_approvals"("target_id", "target_type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "authorization_audit_logs_target_user_id_idx" ON "authorization_audit_logs"("target_user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "authorization_audit_logs_operator_id_idx" ON "authorization_audit_logs"("operator_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "authorization_audit_logs_created_at_idx" ON "authorization_audit_logs"("created_at");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "region_heat_maps_region_code_region_type_key" ON "region_heat_maps"("region_code", "region_type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "stickman_rankings_role_type_region_code_current_month_idx" ON "stickman_rankings"("role_type", "region_code", "current_month");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "stickman_rankings_authorization_id_current_month_key" ON "stickman_rankings"("authorization_id", "current_month");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "authorization_configs_config_key_key" ON "authorization_configs"("config_key");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_system_account_type" ON "system_accounts"("account_type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_system_wallet_address" ON "system_accounts"("wallet_address");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "system_accounts_account_type_region_code_key" ON "system_accounts"("account_type", "region_code");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_system_ledger_account_created" ON "system_account_ledgers"("account_id", "created_at" DESC);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_system_ledger_source_order" ON "system_account_ledgers"("source_order_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_system_ledger_tx_hash" ON "system_account_ledgers"("tx_hash");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "monthly_assessments" ADD CONSTRAINT "monthly_assessments_authorization_id_fkey" FOREIGN KEY ("authorization_id") REFERENCES "authorization_roles"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "monthly_bypasses" ADD CONSTRAINT "monthly_bypasses_authorization_id_fkey" FOREIGN KEY ("authorization_id") REFERENCES "authorization_roles"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "system_account_ledgers" ADD CONSTRAINT "system_account_ledgers_account_id_fkey" FOREIGN KEY ("account_id") REFERENCES "system_accounts"("account_id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|