refactor(migrations): 合并各服务的 migration 文件为单个 0001_init

将各服务的多个 migration 文件合并到单一的初始化 migration 中:
- contribution-service: 3→1 (含 region 支持)
- mining-service: 4→1 (含 second 分配和 region 支持)
- mining-admin-service: 4→1 (含 region 和算力明细同步)
- auth-service: 2→1 (含 CDC 幂等)
- trading-service: 9→1 (含销毁系统/做市商/C2C)
- mining-wallet-service: 2→1 (含 SHARE_POOL 拆分)

所有迁移统一使用 TEXT 类型(非 VARCHAR)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-20 20:34:56 -08:00
parent 9c816266ac
commit 81b2e7a4c2
24 changed files with 591 additions and 968 deletions

View File

@ -1,7 +1,6 @@
-- ============================================================================ -- ============================================================================
-- auth-service 初始化 migration -- auth-service 初始化 migration
-- 合并自: 20260111000000_init, 20260111083500_allow_nullable_phone_password, -- 合并自: 0001_init, 0002_add_transactional_idempotency
-- 20260112110000_add_nickname_to_synced_legacy_users
-- ============================================================================ -- ============================================================================
-- CreateEnum -- CreateEnum
@ -241,3 +240,26 @@ ALTER TABLE "sms_logs" ADD CONSTRAINT "sms_logs_user_id_fkey" FOREIGN KEY ("user
-- AddForeignKey -- AddForeignKey
ALTER TABLE "login_logs" ADD CONSTRAINT "login_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE "login_logs" ADD CONSTRAINT "login_logs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- ============================================================================
-- 事务性幂等消费支持 (从 0002_add_transactional_idempotency 合并)
-- 用于 1.0 -> 2.0 CDC 同步的 100% exactly-once 语义
-- ============================================================================
-- CreateTable
CREATE TABLE "processed_cdc_events" (
"id" BIGSERIAL NOT NULL,
"source_topic" TEXT NOT NULL,
"offset" BIGINT NOT NULL,
"table_name" TEXT NOT NULL,
"operation" TEXT NOT NULL,
"processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "processed_cdc_events_pkey" PRIMARY KEY ("id")
);
-- CreateIndex (复合唯一索引保证幂等性)
CREATE UNIQUE INDEX "processed_cdc_events_source_topic_offset_key" ON "processed_cdc_events"("source_topic", "offset");
-- CreateIndex (时间索引用于清理旧数据)
CREATE INDEX "processed_cdc_events_processed_at_idx" ON "processed_cdc_events"("processed_at");

View File

@ -1,25 +0,0 @@
-- ============================================================================
-- 添加事务性幂等消费支持
-- 用于 1.0 -> 2.0 CDC 同步的 100% exactly-once 语义
-- ============================================================================
-- 创建 processed_cdc_events 表(用于 CDC 事件幂等)
-- 唯一键: (source_topic, offset) - Kafka topic 名称 + 消息偏移量
-- 用于保证每个 CDC 事件只处理一次exactly-once 语义)
CREATE TABLE IF NOT EXISTS "processed_cdc_events" (
"id" BIGSERIAL NOT NULL,
"source_topic" VARCHAR(200) NOT NULL, -- Kafka topic 名称(如 cdc.identity.public.user_accounts
"offset" BIGINT NOT NULL, -- Kafka 消息偏移量(在 partition 内唯一)
"table_name" VARCHAR(100) NOT NULL, -- 源表名
"operation" VARCHAR(10) NOT NULL, -- CDC 操作类型: c(create), u(update), d(delete), r(snapshot read)
"processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "processed_cdc_events_pkey" PRIMARY KEY ("id")
);
-- 复合唯一索引:(source_topic, offset) 保证幂等性
-- 注意:这不是数据库自增 ID而是 Kafka 消息的唯一标识
CREATE UNIQUE INDEX "processed_cdc_events_source_topic_offset_key" ON "processed_cdc_events"("source_topic", "offset");
-- 时间索引用于清理旧数据
CREATE INDEX "processed_cdc_events_processed_at_idx" ON "processed_cdc_events"("processed_at");

View File

@ -1,7 +1,6 @@
-- ============================================================================ -- ============================================================================
-- contribution-service 初始化 migration -- contribution-service 初始化 migration
-- 合并自: 20260111000000_init, 20260111100000_add_referral_user_ids, -- 合并自: 0001_init, 0002_add_transactional_idempotency, 20250120000001_add_region_to_system_accounts
-- 20260112020000_fix_status_varchar_length, 20260112200000_add_adoption_province_city
-- ============================================================================ -- ============================================================================
-- ============================================ -- ============================================
@ -223,13 +222,15 @@ CREATE INDEX "unallocated_contributions_unalloc_type_idx" ON "unallocated_contri
CREATE INDEX "unallocated_contributions_status_idx" ON "unallocated_contributions"("status"); CREATE INDEX "unallocated_contributions_status_idx" ON "unallocated_contributions"("status");
-- ============================================ -- ============================================
-- 6. 系统账户表 -- 6. 系统账户表 (支持按省市细分)
-- ============================================ -- ============================================
CREATE TABLE "system_accounts" ( CREATE TABLE "system_accounts" (
"id" BIGSERIAL NOT NULL, "id" BIGSERIAL NOT NULL,
"account_type" VARCHAR(20) NOT NULL, "account_type" TEXT NOT NULL,
"name" VARCHAR(100) NOT NULL, "base_type" TEXT NOT NULL,
"region_code" TEXT,
"name" TEXT NOT NULL,
"contribution_balance" DECIMAL(30,10) NOT NULL DEFAULT 0, "contribution_balance" DECIMAL(30,10) NOT NULL DEFAULT 0,
"contribution_never_expires" BOOLEAN NOT NULL DEFAULT false, "contribution_never_expires" BOOLEAN NOT NULL DEFAULT false,
"version" INTEGER NOT NULL DEFAULT 1, "version" INTEGER NOT NULL DEFAULT 1,
@ -240,6 +241,8 @@ CREATE TABLE "system_accounts" (
); );
CREATE UNIQUE INDEX "system_accounts_account_type_key" ON "system_accounts"("account_type"); CREATE UNIQUE INDEX "system_accounts_account_type_key" ON "system_accounts"("account_type");
CREATE INDEX "system_accounts_base_type_idx" ON "system_accounts"("base_type");
CREATE INDEX "system_accounts_region_code_idx" ON "system_accounts"("region_code");
CREATE TABLE "system_contribution_records" ( CREATE TABLE "system_contribution_records" (
"id" BIGSERIAL NOT NULL, "id" BIGSERIAL NOT NULL,
@ -327,20 +330,36 @@ CREATE TABLE "cdc_sync_progress" (
CREATE UNIQUE INDEX "cdc_sync_progress_source_topic_key" ON "cdc_sync_progress"("source_topic"); CREATE UNIQUE INDEX "cdc_sync_progress_source_topic_key" ON "cdc_sync_progress"("source_topic");
-- 2.0 服务间 Outbox 事件幂等表
CREATE TABLE "processed_events" ( CREATE TABLE "processed_events" (
"id" BIGSERIAL NOT NULL, "id" BIGSERIAL NOT NULL,
"event_id" VARCHAR(100) NOT NULL, "event_id" VARCHAR(100) NOT NULL,
"event_type" VARCHAR(50) NOT NULL, "event_type" VARCHAR(50) NOT NULL,
"source_service" VARCHAR(50), "source_service" VARCHAR(100) NOT NULL,
"processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "processed_events_pkey" PRIMARY KEY ("id") CONSTRAINT "processed_events_pkey" PRIMARY KEY ("id")
); );
CREATE UNIQUE INDEX "processed_events_event_id_key" ON "processed_events"("event_id"); CREATE UNIQUE INDEX "processed_events_source_service_event_id_key" ON "processed_events"("source_service", "event_id");
CREATE INDEX "processed_events_event_type_idx" ON "processed_events"("event_type"); CREATE INDEX "processed_events_event_type_idx" ON "processed_events"("event_type");
CREATE INDEX "processed_events_processed_at_idx" ON "processed_events"("processed_at"); CREATE INDEX "processed_events_processed_at_idx" ON "processed_events"("processed_at");
-- 1.0 CDC 事件幂等表
CREATE TABLE "processed_cdc_events" (
"id" BIGSERIAL NOT NULL,
"source_topic" VARCHAR(200) NOT NULL,
"offset" BIGINT NOT NULL,
"table_name" VARCHAR(100) NOT NULL,
"operation" VARCHAR(10) NOT NULL,
"processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "processed_cdc_events_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "processed_cdc_events_source_topic_offset_key" ON "processed_cdc_events"("source_topic", "offset");
CREATE INDEX "processed_cdc_events_processed_at_idx" ON "processed_cdc_events"("processed_at");
-- ============================================ -- ============================================
-- 9. 配置表 -- 9. 配置表
-- ============================================ -- ============================================

View File

@ -1,45 +0,0 @@
-- ============================================================================
-- 添加事务性幂等消费支持
-- 用于 1.0 -> 2.0 CDC 同步的 100% exactly-once 语义
-- ============================================================================
-- 1. 创建 processed_cdc_events 表(用于 CDC 事件幂等)
-- 唯一键: (source_topic, offset) - Kafka topic 名称 + 消息偏移量
-- 用于保证每个 CDC 事件只处理一次exactly-once 语义)
CREATE TABLE IF NOT EXISTS "processed_cdc_events" (
"id" BIGSERIAL NOT NULL,
"source_topic" VARCHAR(200) NOT NULL, -- Kafka topic 名称(如 cdc.identity.public.user_accounts
"offset" BIGINT NOT NULL, -- Kafka 消息偏移量(在 partition 内唯一)
"table_name" VARCHAR(100) NOT NULL, -- 源表名
"operation" VARCHAR(10) NOT NULL, -- CDC 操作类型: c(create), u(update), d(delete), r(snapshot read)
"processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "processed_cdc_events_pkey" PRIMARY KEY ("id")
);
-- 复合唯一索引:(source_topic, offset) 保证幂等性
-- 注意:这不是数据库自增 ID而是 Kafka 消息的唯一标识
CREATE UNIQUE INDEX "processed_cdc_events_source_topic_offset_key" ON "processed_cdc_events"("source_topic", "offset");
-- 时间索引用于清理旧数据
CREATE INDEX "processed_cdc_events_processed_at_idx" ON "processed_cdc_events"("processed_at");
-- 2. 修复 processed_events 表(用于 2.0 服务间 Outbox 事件幂等)
-- 唯一键: (source_service, event_id) - 服务名 + outbox 表的 ID
-- 不同服务的 outbox ID 可能相同,所以需要组合服务名作为复合唯一键
-- 2.1 修改 source_service 列:扩展长度 50->100且设为 NOT NULL
-- 先为已有 NULL 值设置默认值
UPDATE "processed_events" SET "source_service" = 'unknown' WHERE "source_service" IS NULL;
-- 修改列类型和约束
ALTER TABLE "processed_events"
ALTER COLUMN "source_service" SET NOT NULL,
ALTER COLUMN "source_service" TYPE VARCHAR(100);
-- 2.2 删除旧的单字段唯一索引
DROP INDEX IF EXISTS "processed_events_event_id_key";
-- 2.3 创建新的复合唯一索引
-- 索引名使用蛇形命名以与列名保持一致
CREATE UNIQUE INDEX IF NOT EXISTS "processed_events_source_service_event_id_key" ON "processed_events"("source_service", "event_id");

View File

@ -1,16 +0,0 @@
-- 系统账户按省市细分: 添加 base_type 和 region_code 字段
-- 将 accountType 从简单枚举改为组合键(如 PROVINCE_440000, CITY_440100
-- 1. 添加新字段 (使用 TEXT 类型与 Prisma String 一致)
ALTER TABLE "system_accounts" ADD COLUMN "base_type" TEXT;
ALTER TABLE "system_accounts" ADD COLUMN "region_code" TEXT;
-- 2. 设置现有数据的 base_type与 account_type 相同)
UPDATE "system_accounts" SET "base_type" = "account_type" WHERE "base_type" IS NULL;
-- 3. 将 base_type 设置为非空
ALTER TABLE "system_accounts" ALTER COLUMN "base_type" SET NOT NULL;
-- 4. 创建索引Prisma 默认命名格式: {table}_{field}_idx
CREATE INDEX IF NOT EXISTS "system_accounts_base_type_idx" ON "system_accounts"("base_type");
CREATE INDEX IF NOT EXISTS "system_accounts_region_code_idx" ON "system_accounts"("region_code");

View File

@ -1,8 +1,8 @@
-- ============================================================================ -- ============================================================================
-- mining-admin-service 初始化 migration -- mining-admin-service 初始化 migration
-- 合并自: 20260111000000_init, 20260112110000_add_referral_adoption_nickname, -- 合并自: 0001_init, 0002_fix_processed_event_composite_key,
-- 20260112150000_add_unlocked_bonus_tiers, 20260112200000_add_contribution_records_network_progress, -- 20250120000001_add_region_to_synced_system_contributions,
-- 20260113000000_use_prisma_relation_mode, 20260113100000_add_distribution_summary -- 20250120000002_add_synced_system_contribution_records
-- 注意: 使用 Prisma relationMode = "prisma"不在数据库层创建FK约束 -- 注意: 使用 Prisma relationMode = "prisma"不在数据库层创建FK约束
-- ============================================================================ -- ============================================================================
@ -306,6 +306,8 @@ CREATE TABLE "synced_circulation_pools" (
CREATE TABLE "synced_system_contributions" ( CREATE TABLE "synced_system_contributions" (
"id" TEXT NOT NULL, "id" TEXT NOT NULL,
"accountType" TEXT NOT NULL, "accountType" TEXT NOT NULL,
"base_type" TEXT NOT NULL DEFAULT '',
"region_code" TEXT,
"name" TEXT NOT NULL, "name" TEXT NOT NULL,
"contributionBalance" DECIMAL(30,8) NOT NULL DEFAULT 0, "contributionBalance" DECIMAL(30,8) NOT NULL DEFAULT 0,
"contributionNeverExpires" BOOLEAN NOT NULL DEFAULT false, "contributionNeverExpires" BOOLEAN NOT NULL DEFAULT false,
@ -690,17 +692,18 @@ CREATE UNIQUE INDEX "synced_day_klines_klineDate_key" ON "synced_day_klines"("kl
-- CreateIndex -- CreateIndex
CREATE UNIQUE INDEX "synced_system_contributions_accountType_key" ON "synced_system_contributions"("accountType"); CREATE UNIQUE INDEX "synced_system_contributions_accountType_key" ON "synced_system_contributions"("accountType");
-- CreateIndex (base_type 和 region_code 索引)
CREATE INDEX "synced_system_contributions_base_type_idx" ON "synced_system_contributions"("base_type");
CREATE INDEX "synced_system_contributions_region_code_idx" ON "synced_system_contributions"("region_code");
-- CreateIndex -- CreateIndex
CREATE UNIQUE INDEX "cdc_sync_progress_sourceTopic_key" ON "cdc_sync_progress"("sourceTopic"); CREATE UNIQUE INDEX "cdc_sync_progress_sourceTopic_key" ON "cdc_sync_progress"("sourceTopic");
-- CreateIndex -- CreateIndex
CREATE INDEX "cdc_sync_progress_sourceService_idx" ON "cdc_sync_progress"("sourceService"); CREATE INDEX "cdc_sync_progress_sourceService_idx" ON "cdc_sync_progress"("sourceService");
-- CreateIndex -- CreateIndex (使用复合唯一键替代单独的 eventId 唯一约束)
CREATE UNIQUE INDEX "processed_events_eventId_key" ON "processed_events"("eventId"); CREATE UNIQUE INDEX "processed_events_sourceService_eventId_key" ON "processed_events"("sourceService", "eventId");
-- CreateIndex
CREATE INDEX "processed_events_sourceService_idx" ON "processed_events"("sourceService");
-- CreateIndex -- CreateIndex
CREATE INDEX "processed_events_processedAt_idx" ON "processed_events"("processedAt"); CREATE INDEX "processed_events_processedAt_idx" ON "processed_events"("processedAt");
@ -860,3 +863,34 @@ CREATE UNIQUE INDEX "synced_fee_configs_fee_type_key" ON "synced_fee_configs"("f
-- AddForeignKey (保留 admin 相关的外键) -- AddForeignKey (保留 admin 相关的外键)
ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_adminId_fkey" FOREIGN KEY ("adminId") REFERENCES "admin_users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_adminId_fkey" FOREIGN KEY ("adminId") REFERENCES "admin_users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ============================================================================
-- 系统账户算力明细同步表
-- 用于存储从 contribution-service 同步的系统账户算力来源明细
-- ============================================================================
-- CreateTable
CREATE TABLE "synced_system_contribution_records" (
"id" TEXT NOT NULL,
"original_record_id" BIGINT NOT NULL,
"system_account_type" TEXT NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" TEXT NOT NULL,
"distribution_rate" DECIMAL(10,6) NOT NULL,
"amount" DECIMAL(30,10) NOT NULL,
"effective_date" DATE NOT NULL,
"expire_date" DATE,
"is_expired" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) NOT NULL,
"syncedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "synced_system_contribution_records_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "synced_system_contribution_records_original_record_id_key" ON "synced_system_contribution_records"("original_record_id");
CREATE INDEX "synced_system_contribution_records_system_account_type_idx" ON "synced_system_contribution_records"("system_account_type");
CREATE INDEX "synced_system_contribution_records_source_adoption_id_idx" ON "synced_system_contribution_records"("source_adoption_id");
CREATE INDEX "synced_system_contribution_records_source_account_sequence_idx" ON "synced_system_contribution_records"("source_account_sequence");
CREATE INDEX "synced_system_contribution_records_created_at_idx" ON "synced_system_contribution_records"("created_at" DESC);

View File

@ -1,26 +0,0 @@
-- ============================================================================
-- 修复 processed_events 表的幂等键
-- 用于 2.0 服务间 Outbox 事件的 100% exactly-once 语义
-- ============================================================================
--
-- 问题: 原来使用 eventId 作为唯一键,但不同服务的 outbox ID 可能相同
-- 解决: 使用 (sourceService, eventId) 作为复合唯一键
--
-- 唯一键说明:
-- - sourceService: 发送事件的服务名(如 "auth-service", "contribution-service"
-- - eventId: 发送方 outbox 表的自增 ID非 UUID而是数据库自增主键
-- - 组合后在全局唯一,可用于精确追踪事件来源
-- ============================================================================
-- 先清空已有数据(因为之前的数据可能有冲突)
TRUNCATE TABLE "processed_events";
-- 删除旧的唯一索引(仅 eventId
DROP INDEX IF EXISTS "processed_events_eventId_key";
-- 删除旧的 sourceService 普通索引
DROP INDEX IF EXISTS "processed_events_sourceService_idx";
-- 创建新的复合唯一索引:(sourceService, eventId)
-- 这个组合保证跨服务的唯一性
CREATE UNIQUE INDEX "processed_events_sourceService_eventId_key" ON "processed_events"("sourceService", "eventId");

View File

@ -1,19 +0,0 @@
-- 同步的系统账户算力表按省市细分: 添加 base_type 和 region_code 字段
-- 支持组合键(如 PROVINCE_440000, CITY_440100
-- 1. 添加新字段 (使用 TEXT 类型与 Prisma String 一致)
ALTER TABLE "synced_system_contributions" ADD COLUMN "base_type" TEXT NOT NULL DEFAULT '';
ALTER TABLE "synced_system_contributions" ADD COLUMN "region_code" TEXT;
-- 2. 设置现有数据的 base_type根据 account_type 提取)
UPDATE "synced_system_contributions"
SET "base_type" = CASE
WHEN "account_type" LIKE 'PROVINCE_%' THEN 'PROVINCE'
WHEN "account_type" LIKE 'CITY_%' THEN 'CITY'
ELSE "account_type"
END
WHERE "base_type" = '';
-- 3. 创建索引Prisma 默认命名格式: {table}_{field}_idx
CREATE INDEX IF NOT EXISTS "synced_system_contributions_base_type_idx" ON "synced_system_contributions"("base_type");
CREATE INDEX IF NOT EXISTS "synced_system_contributions_region_code_idx" ON "synced_system_contributions"("region_code");

View File

@ -1,30 +0,0 @@
-- 添加系统账户算力明细同步表
-- 用于存储从 contribution-service 同步的系统账户算力来源明细
-- 1. 创建 synced_system_contribution_records 表
CREATE TABLE IF NOT EXISTS "synced_system_contribution_records" (
"id" TEXT NOT NULL,
"original_record_id" BIGINT NOT NULL,
"system_account_type" TEXT NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" TEXT NOT NULL,
"distribution_rate" DECIMAL(10,6) NOT NULL,
"amount" DECIMAL(30,10) NOT NULL,
"effective_date" DATE NOT NULL,
"expire_date" DATE,
"is_expired" BOOLEAN NOT NULL DEFAULT false,
"created_at" TIMESTAMP(3) NOT NULL,
"syncedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "synced_system_contribution_records_pkey" PRIMARY KEY ("id")
);
-- 2. 创建唯一索引原始记录ID唯一
CREATE UNIQUE INDEX IF NOT EXISTS "synced_system_contribution_records_original_record_id_key" ON "synced_system_contribution_records"("original_record_id");
-- 3. 创建查询索引
CREATE INDEX IF NOT EXISTS "synced_system_contribution_records_system_account_type_idx" ON "synced_system_contribution_records"("system_account_type");
CREATE INDEX IF NOT EXISTS "synced_system_contribution_records_source_adoption_id_idx" ON "synced_system_contribution_records"("source_adoption_id");
CREATE INDEX IF NOT EXISTS "synced_system_contribution_records_source_account_sequence_idx" ON "synced_system_contribution_records"("source_account_sequence");
CREATE INDEX IF NOT EXISTS "synced_system_contribution_records_created_at_idx" ON "synced_system_contribution_records"("created_at" DESC);

View File

@ -1,6 +1,7 @@
-- ============================================================================ -- ============================================================================
-- mining-service 初始化 migration -- mining-service 初始化 migration
-- 合并自: 20260111000000_init (只有一个,无需合并) -- 合并自: 0001_init, 0002_minute_to_second, 0003_add_system_accounts_and_pending_mining,
-- 20250120000001_add_region_to_system_mining_accounts
-- ============================================================================ -- ============================================================================
-- CreateEnum -- CreateEnum
@ -21,7 +22,11 @@ CREATE TABLE "mining_configs" (
"halvingPeriodYears" INTEGER NOT NULL DEFAULT 2, "halvingPeriodYears" INTEGER NOT NULL DEFAULT 2,
"currentEra" INTEGER NOT NULL DEFAULT 1, "currentEra" INTEGER NOT NULL DEFAULT 1,
"eraStartDate" TIMESTAMP(3) NOT NULL, "eraStartDate" TIMESTAMP(3) NOT NULL,
"minuteDistribution" DECIMAL(30,18) NOT NULL, "secondDistribution" DECIMAL(30,18) NOT NULL,
"network_total_contribution" DECIMAL(30, 8) NOT NULL DEFAULT 0,
"total_tree_count" INTEGER NOT NULL DEFAULT 0,
"contribution_per_tree" DECIMAL(20, 10) NOT NULL DEFAULT 22617,
"network_last_synced_at" TIMESTAMP(3),
"isActive" BOOLEAN NOT NULL DEFAULT false, "isActive" BOOLEAN NOT NULL DEFAULT false,
"activatedAt" TIMESTAMP(3), "activatedAt" TIMESTAMP(3),
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
@ -38,7 +43,7 @@ CREATE TABLE "mining_eras" (
"endDate" TIMESTAMP(3), "endDate" TIMESTAMP(3),
"initialDistribution" DECIMAL(30,8) NOT NULL, "initialDistribution" DECIMAL(30,8) NOT NULL,
"totalDistributed" DECIMAL(30,8) NOT NULL DEFAULT 0, "totalDistributed" DECIMAL(30,8) NOT NULL DEFAULT 0,
"minuteDistribution" DECIMAL(30,18) NOT NULL, "secondDistribution" DECIMAL(30,18) NOT NULL,
"isActive" BOOLEAN NOT NULL DEFAULT true, "isActive" BOOLEAN NOT NULL DEFAULT true,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
@ -67,7 +72,7 @@ CREATE TABLE "mining_records" (
"miningMinute" TIMESTAMP(3) NOT NULL, "miningMinute" TIMESTAMP(3) NOT NULL,
"contributionRatio" DECIMAL(30,18) NOT NULL, "contributionRatio" DECIMAL(30,18) NOT NULL,
"totalContribution" DECIMAL(30,8) NOT NULL, "totalContribution" DECIMAL(30,8) NOT NULL,
"minuteDistribution" DECIMAL(30,18) NOT NULL, "secondDistribution" DECIMAL(30,18) NOT NULL,
"minedAmount" DECIMAL(30,18) NOT NULL, "minedAmount" DECIMAL(30,18) NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
@ -94,6 +99,91 @@ CREATE TABLE "mining_transactions" (
CONSTRAINT "mining_transactions_pkey" PRIMARY KEY ("id") CONSTRAINT "mining_transactions_pkey" PRIMARY KEY ("id")
); );
-- CreateTable: 系统挖矿账户 (直接使用 TEXT 组合键)
CREATE TABLE "system_mining_accounts" (
"id" TEXT NOT NULL,
"account_type" TEXT NOT NULL,
"base_type" TEXT NOT NULL,
"region_code" TEXT,
"name" TEXT NOT NULL,
"totalMined" DECIMAL(30, 8) NOT NULL DEFAULT 0,
"availableBalance" DECIMAL(30, 8) NOT NULL DEFAULT 0,
"totalContribution" DECIMAL(30, 8) NOT NULL DEFAULT 0,
"last_synced_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "system_mining_accounts_pkey" PRIMARY KEY ("id")
);
-- CreateTable: 系统账户挖矿记录
CREATE TABLE "system_mining_records" (
"id" TEXT NOT NULL,
"account_type" TEXT NOT NULL,
"mining_minute" TIMESTAMP(3) NOT NULL,
"contribution_ratio" DECIMAL(30, 18) NOT NULL,
"total_contribution" DECIMAL(30, 8) NOT NULL,
"second_distribution" DECIMAL(30, 18) NOT NULL,
"mined_amount" DECIMAL(30, 18) NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "system_mining_records_pkey" PRIMARY KEY ("id")
);
-- CreateTable: 系统账户交易流水
CREATE TABLE "system_mining_transactions" (
"id" TEXT NOT NULL,
"account_type" TEXT NOT NULL,
"type" TEXT NOT NULL,
"amount" DECIMAL(30, 8) NOT NULL,
"balance_before" DECIMAL(30, 8) NOT NULL,
"balance_after" DECIMAL(30, 8) NOT NULL,
"reference_id" TEXT,
"reference_type" TEXT,
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "system_mining_transactions_pkey" PRIMARY KEY ("id")
);
-- CreateTable: 待解锁算力挖矿
CREATE TABLE "pending_contribution_mining" (
"id" BIGSERIAL NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" VARCHAR(20) NOT NULL,
"would_be_account_sequence" VARCHAR(20),
"contribution_type" VARCHAR(30) NOT NULL,
"amount" DECIMAL(30, 10) NOT NULL,
"reason" VARCHAR(200),
"effective_date" DATE NOT NULL,
"expire_date" DATE NOT NULL,
"is_expired" BOOLEAN NOT NULL DEFAULT false,
"last_synced_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "pending_contribution_mining_pkey" PRIMARY KEY ("id")
);
-- CreateTable: 待解锁算力挖矿记录
CREATE TABLE "pending_mining_records" (
"id" BIGSERIAL NOT NULL,
"pending_contribution_id" BIGINT NOT NULL,
"mining_minute" TIMESTAMP(3) NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" VARCHAR(20) NOT NULL,
"would_be_account_sequence" VARCHAR(20),
"contribution_type" VARCHAR(30) NOT NULL,
"contribution_amount" DECIMAL(30, 10) NOT NULL,
"network_total_contribution" DECIMAL(30, 10) NOT NULL,
"contribution_ratio" DECIMAL(30, 18) NOT NULL,
"second_distribution" DECIMAL(30, 18) NOT NULL,
"mined_amount" DECIMAL(30, 18) NOT NULL,
"allocated_to" VARCHAR(20) NOT NULL DEFAULT 'HEADQUARTERS',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "pending_mining_records_pkey" PRIMARY KEY ("id")
);
-- CreateTable -- CreateTable
CREATE TABLE "mining_reward_allocations" ( CREATE TABLE "mining_reward_allocations" (
"id" BIGSERIAL NOT NULL, "id" BIGSERIAL NOT NULL,
@ -316,6 +406,33 @@ CREATE INDEX "mining_transactions_counterparty_account_seq_idx" ON "mining_trans
-- CreateIndex -- CreateIndex
CREATE INDEX "mining_transactions_counterparty_user_id_idx" ON "mining_transactions"("counterparty_user_id"); CREATE INDEX "mining_transactions_counterparty_user_id_idx" ON "mining_transactions"("counterparty_user_id");
-- CreateIndex: system_mining_accounts
CREATE UNIQUE INDEX "system_mining_accounts_account_type_key" ON "system_mining_accounts"("account_type");
CREATE INDEX "system_mining_accounts_totalContribution_idx" ON "system_mining_accounts"("totalContribution" DESC);
CREATE INDEX "system_mining_accounts_base_type_idx" ON "system_mining_accounts"("base_type");
CREATE INDEX "system_mining_accounts_region_code_idx" ON "system_mining_accounts"("region_code");
-- CreateIndex: system_mining_records
CREATE UNIQUE INDEX "system_mining_records_account_type_mining_minute_key" ON "system_mining_records"("account_type", "mining_minute");
CREATE INDEX "system_mining_records_mining_minute_idx" ON "system_mining_records"("mining_minute");
-- CreateIndex: system_mining_transactions
CREATE INDEX "system_mining_transactions_account_type_created_at_idx" ON "system_mining_transactions"("account_type", "created_at" DESC);
-- CreateIndex: pending_contribution_mining
CREATE UNIQUE INDEX "pending_contribution_mining_source_adoption_id_would_be_acco_key"
ON "pending_contribution_mining"("source_adoption_id", "would_be_account_sequence", "contribution_type");
CREATE INDEX "pending_contribution_mining_would_be_account_sequence_idx" ON "pending_contribution_mining"("would_be_account_sequence");
CREATE INDEX "pending_contribution_mining_contribution_type_idx" ON "pending_contribution_mining"("contribution_type");
CREATE INDEX "pending_contribution_mining_is_expired_idx" ON "pending_contribution_mining"("is_expired");
-- CreateIndex: pending_mining_records
CREATE UNIQUE INDEX "pending_mining_records_pending_contribution_id_mining_minute_key"
ON "pending_mining_records"("pending_contribution_id", "mining_minute");
CREATE INDEX "pending_mining_records_mining_minute_idx" ON "pending_mining_records"("mining_minute");
CREATE INDEX "pending_mining_records_source_account_sequence_idx" ON "pending_mining_records"("source_account_sequence");
CREATE INDEX "pending_mining_records_would_be_account_sequence_idx" ON "pending_mining_records"("would_be_account_sequence");
-- CreateIndex -- CreateIndex
CREATE INDEX "mining_reward_allocations_mining_date_idx" ON "mining_reward_allocations"("mining_date"); CREATE INDEX "mining_reward_allocations_mining_date_idx" ON "mining_reward_allocations"("mining_date");
@ -415,8 +532,29 @@ ALTER TABLE "mining_records" ADD CONSTRAINT "mining_records_accountSequence_fkey
-- AddForeignKey -- AddForeignKey
ALTER TABLE "mining_transactions" ADD CONSTRAINT "mining_transactions_accountSequence_fkey" FOREIGN KEY ("accountSequence") REFERENCES "mining_accounts"("accountSequence") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "mining_transactions" ADD CONSTRAINT "mining_transactions_accountSequence_fkey" FOREIGN KEY ("accountSequence") REFERENCES "mining_accounts"("accountSequence") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey: system_mining_records
ALTER TABLE "system_mining_records" ADD CONSTRAINT "system_mining_records_account_type_fkey"
FOREIGN KEY ("account_type") REFERENCES "system_mining_accounts"("account_type") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey: system_mining_transactions
ALTER TABLE "system_mining_transactions" ADD CONSTRAINT "system_mining_transactions_account_type_fkey"
FOREIGN KEY ("account_type") REFERENCES "system_mining_accounts"("account_type") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey: pending_mining_records
ALTER TABLE "pending_mining_records" ADD CONSTRAINT "pending_mining_records_pending_contribution_id_fkey"
FOREIGN KEY ("pending_contribution_id") REFERENCES "pending_contribution_mining"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey -- AddForeignKey
ALTER TABLE "burn_records" ADD CONSTRAINT "burn_records_blackHoleId_fkey" FOREIGN KEY ("blackHoleId") REFERENCES "black_holes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "burn_records" ADD CONSTRAINT "burn_records_blackHoleId_fkey" FOREIGN KEY ("blackHoleId") REFERENCES "black_holes"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey -- AddForeignKey
ALTER TABLE "pool_transactions" ADD CONSTRAINT "pool_transactions_pool_account_id_fkey" FOREIGN KEY ("pool_account_id") REFERENCES "pool_accounts"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "pool_transactions" ADD CONSTRAINT "pool_transactions_pool_account_id_fkey" FOREIGN KEY ("pool_account_id") REFERENCES "pool_accounts"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- 初始化系统账户
INSERT INTO "system_mining_accounts" ("id", "account_type", "base_type", "name", "totalMined", "availableBalance", "totalContribution", "updated_at")
VALUES
(gen_random_uuid(), 'OPERATION', 'OPERATION', '运营账户', 0, 0, 0, NOW()),
(gen_random_uuid(), 'PROVINCE', 'PROVINCE', '省公司账户', 0, 0, 0, NOW()),
(gen_random_uuid(), 'CITY', 'CITY', '市公司账户', 0, 0, 0, NOW()),
(gen_random_uuid(), 'HEADQUARTERS', 'HEADQUARTERS', '总部账户', 0, 0, 0, NOW())
ON CONFLICT ("account_type") DO NOTHING;

View File

@ -1,13 +0,0 @@
-- ============================================================================
-- 将 minuteDistribution 改为 secondDistribution
-- 支持每秒挖矿分配
-- ============================================================================
-- 重命名 mining_configs 表的列
ALTER TABLE "mining_configs" RENAME COLUMN "minuteDistribution" TO "secondDistribution";
-- 重命名 mining_eras 表的列
ALTER TABLE "mining_eras" RENAME COLUMN "minuteDistribution" TO "secondDistribution";
-- 重命名 mining_records 表的列
ALTER TABLE "mining_records" RENAME COLUMN "minuteDistribution" TO "secondDistribution";

View File

@ -1,238 +0,0 @@
-- ============================================================================
-- 添加系统账户和待解锁算力挖矿功能
-- 1. MiningConfig 添加全网理论算力字段
-- 2. 系统账户(运营/省/市/总部)挖矿
-- 3. 待解锁算力挖矿记录
-- 4. 挖矿收益分配明细
-- ============================================================================
-- ==================== MiningConfig 添加全网理论算力字段 ====================
ALTER TABLE "mining_configs" ADD COLUMN IF NOT EXISTS "network_total_contribution" DECIMAL(30, 8) NOT NULL DEFAULT 0;
ALTER TABLE "mining_configs" ADD COLUMN IF NOT EXISTS "total_tree_count" INTEGER NOT NULL DEFAULT 0;
ALTER TABLE "mining_configs" ADD COLUMN IF NOT EXISTS "contribution_per_tree" DECIMAL(20, 10) NOT NULL DEFAULT 22617;
ALTER TABLE "mining_configs" ADD COLUMN IF NOT EXISTS "network_last_synced_at" TIMESTAMP(3);
-- ==================== 系统账户类型枚举 ====================
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'SystemAccountType') THEN
CREATE TYPE "SystemAccountType" AS ENUM ('OPERATION', 'PROVINCE', 'CITY', 'HEADQUARTERS');
END IF;
END$$;
-- ==================== 系统挖矿账户 ====================
CREATE TABLE IF NOT EXISTS "system_mining_accounts" (
"id" TEXT NOT NULL,
"account_type" "SystemAccountType" NOT NULL,
"name" VARCHAR(100) NOT NULL,
"totalMined" DECIMAL(30, 8) NOT NULL DEFAULT 0,
"availableBalance" DECIMAL(30, 8) NOT NULL DEFAULT 0,
"totalContribution" DECIMAL(30, 8) NOT NULL DEFAULT 0,
"last_synced_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "system_mining_accounts_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "system_mining_accounts_account_type_key" ON "system_mining_accounts"("account_type");
CREATE INDEX IF NOT EXISTS "system_mining_accounts_totalContribution_idx" ON "system_mining_accounts"("totalContribution" DESC);
-- ==================== 系统账户挖矿记录 ====================
CREATE TABLE IF NOT EXISTS "system_mining_records" (
"id" TEXT NOT NULL,
"account_type" "SystemAccountType" NOT NULL,
"mining_minute" TIMESTAMP(3) NOT NULL,
"contribution_ratio" DECIMAL(30, 18) NOT NULL,
"total_contribution" DECIMAL(30, 8) NOT NULL,
"second_distribution" DECIMAL(30, 18) NOT NULL,
"mined_amount" DECIMAL(30, 18) NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "system_mining_records_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "system_mining_records_account_type_mining_minute_key" ON "system_mining_records"("account_type", "mining_minute");
CREATE INDEX IF NOT EXISTS "system_mining_records_mining_minute_idx" ON "system_mining_records"("mining_minute");
ALTER TABLE "system_mining_records" DROP CONSTRAINT IF EXISTS "system_mining_records_account_type_fkey";
ALTER TABLE "system_mining_records" ADD CONSTRAINT "system_mining_records_account_type_fkey"
FOREIGN KEY ("account_type") REFERENCES "system_mining_accounts"("account_type") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ==================== 系统账户交易流水 ====================
CREATE TABLE IF NOT EXISTS "system_mining_transactions" (
"id" TEXT NOT NULL,
"account_type" "SystemAccountType" NOT NULL,
"type" TEXT NOT NULL,
"amount" DECIMAL(30, 8) NOT NULL,
"balance_before" DECIMAL(30, 8) NOT NULL,
"balance_after" DECIMAL(30, 8) NOT NULL,
"reference_id" TEXT,
"reference_type" TEXT,
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "system_mining_transactions_pkey" PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "system_mining_transactions_account_type_created_at_idx" ON "system_mining_transactions"("account_type", "created_at" DESC);
ALTER TABLE "system_mining_transactions" DROP CONSTRAINT IF EXISTS "system_mining_transactions_account_type_fkey";
ALTER TABLE "system_mining_transactions" ADD CONSTRAINT "system_mining_transactions_account_type_fkey"
FOREIGN KEY ("account_type") REFERENCES "system_mining_accounts"("account_type") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ==================== 待解锁算力挖矿 ====================
CREATE TABLE IF NOT EXISTS "pending_contribution_mining" (
"id" BIGSERIAL NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" VARCHAR(20) NOT NULL,
"would_be_account_sequence" VARCHAR(20),
"contribution_type" VARCHAR(30) NOT NULL,
"amount" DECIMAL(30, 10) NOT NULL,
"reason" VARCHAR(200),
"effective_date" DATE NOT NULL,
"expire_date" DATE NOT NULL,
"is_expired" BOOLEAN NOT NULL DEFAULT false,
"last_synced_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "pending_contribution_mining_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "pending_contribution_mining_source_adoption_id_would_be_acco_key"
ON "pending_contribution_mining"("source_adoption_id", "would_be_account_sequence", "contribution_type");
CREATE INDEX IF NOT EXISTS "pending_contribution_mining_would_be_account_sequence_idx" ON "pending_contribution_mining"("would_be_account_sequence");
CREATE INDEX IF NOT EXISTS "pending_contribution_mining_contribution_type_idx" ON "pending_contribution_mining"("contribution_type");
CREATE INDEX IF NOT EXISTS "pending_contribution_mining_is_expired_idx" ON "pending_contribution_mining"("is_expired");
-- ==================== 待解锁算力挖矿记录 ====================
CREATE TABLE IF NOT EXISTS "pending_mining_records" (
"id" BIGSERIAL NOT NULL,
"pending_contribution_id" BIGINT NOT NULL,
"mining_minute" TIMESTAMP(3) NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" VARCHAR(20) NOT NULL,
"would_be_account_sequence" VARCHAR(20),
"contribution_type" VARCHAR(30) NOT NULL,
"contribution_amount" DECIMAL(30, 10) NOT NULL,
"network_total_contribution" DECIMAL(30, 10) NOT NULL,
"contribution_ratio" DECIMAL(30, 18) NOT NULL,
"second_distribution" DECIMAL(30, 18) NOT NULL,
"mined_amount" DECIMAL(30, 18) NOT NULL,
"allocated_to" VARCHAR(20) NOT NULL DEFAULT 'HEADQUARTERS',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "pending_mining_records_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "pending_mining_records_pending_contribution_id_mining_minute_key"
ON "pending_mining_records"("pending_contribution_id", "mining_minute");
CREATE INDEX IF NOT EXISTS "pending_mining_records_mining_minute_idx" ON "pending_mining_records"("mining_minute");
CREATE INDEX IF NOT EXISTS "pending_mining_records_source_account_sequence_idx" ON "pending_mining_records"("source_account_sequence");
CREATE INDEX IF NOT EXISTS "pending_mining_records_would_be_account_sequence_idx" ON "pending_mining_records"("would_be_account_sequence");
ALTER TABLE "pending_mining_records" DROP CONSTRAINT IF EXISTS "pending_mining_records_pending_contribution_id_fkey";
ALTER TABLE "pending_mining_records" ADD CONSTRAINT "pending_mining_records_pending_contribution_id_fkey"
FOREIGN KEY ("pending_contribution_id") REFERENCES "pending_contribution_mining"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ==================== 挖矿收益分配明细 ====================
CREATE TABLE IF NOT EXISTS "mining_reward_allocations" (
"id" BIGSERIAL NOT NULL,
"mining_date" DATE NOT NULL,
"contribution_record_id" BIGINT NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" VARCHAR(20) NOT NULL,
"owner_account_sequence" VARCHAR(20) NOT NULL,
"contribution_type" VARCHAR(30) NOT NULL,
"contribution_amount" DECIMAL(30, 10) NOT NULL,
"network_total_contribution" DECIMAL(30, 10) NOT NULL,
"contribution_ratio" DECIMAL(30, 18) NOT NULL,
"daily_mining_pool" DECIMAL(30, 10) NOT NULL,
"reward_amount" DECIMAL(30, 10) NOT NULL,
"allocation_status" VARCHAR(20) NOT NULL,
"is_unlocked" BOOLEAN NOT NULL,
"allocated_to_account_sequence" VARCHAR(20),
"allocated_to_system_account" VARCHAR(20),
"unlocked_reason" VARCHAR(200),
"owner_has_adopted" BOOLEAN NOT NULL,
"owner_direct_referral_count" INTEGER NOT NULL,
"owner_unlocked_level_depth" INTEGER NOT NULL,
"owner_unlocked_bonus_tiers" INTEGER NOT NULL,
"remark" VARCHAR(500),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "mining_reward_allocations_pkey" PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "mining_reward_allocations_mining_date_idx" ON "mining_reward_allocations"("mining_date");
CREATE INDEX IF NOT EXISTS "mining_reward_allocations_owner_account_sequence_mining_date_idx" ON "mining_reward_allocations"("owner_account_sequence", "mining_date");
CREATE INDEX IF NOT EXISTS "mining_reward_allocations_source_account_sequence_idx" ON "mining_reward_allocations"("source_account_sequence");
CREATE INDEX IF NOT EXISTS "mining_reward_allocations_source_adoption_id_idx" ON "mining_reward_allocations"("source_adoption_id");
CREATE INDEX IF NOT EXISTS "mining_reward_allocations_allocation_status_idx" ON "mining_reward_allocations"("allocation_status");
CREATE INDEX IF NOT EXISTS "mining_reward_allocations_contribution_record_id_idx" ON "mining_reward_allocations"("contribution_record_id");
-- ==================== 每日挖矿收益汇总 ====================
CREATE TABLE IF NOT EXISTS "daily_mining_reward_summaries" (
"id" BIGSERIAL NOT NULL,
"mining_date" DATE NOT NULL,
"account_sequence" VARCHAR(20) NOT NULL,
"unlocked_reward" DECIMAL(30, 10) NOT NULL DEFAULT 0,
"pending_reward_to_hq" DECIMAL(30, 10) NOT NULL DEFAULT 0,
"personal_reward" DECIMAL(30, 10) NOT NULL DEFAULT 0,
"level_reward" DECIMAL(30, 10) NOT NULL DEFAULT 0,
"bonus_reward" DECIMAL(30, 10) NOT NULL DEFAULT 0,
"pending_level_to_hq" DECIMAL(30, 10) NOT NULL DEFAULT 0,
"pending_bonus_to_hq" DECIMAL(30, 10) NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "daily_mining_reward_summaries_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "daily_mining_reward_summaries_mining_date_account_sequence_key"
ON "daily_mining_reward_summaries"("mining_date", "account_sequence");
CREATE INDEX IF NOT EXISTS "daily_mining_reward_summaries_mining_date_idx" ON "daily_mining_reward_summaries"("mining_date");
CREATE INDEX IF NOT EXISTS "daily_mining_reward_summaries_account_sequence_idx" ON "daily_mining_reward_summaries"("account_sequence");
-- ==================== 总部待解锁收益明细 ====================
CREATE TABLE IF NOT EXISTS "headquarters_pending_rewards" (
"id" BIGSERIAL NOT NULL,
"mining_date" DATE NOT NULL,
"would_be_account_sequence" VARCHAR(20) NOT NULL,
"source_adoption_id" BIGINT NOT NULL,
"source_account_sequence" VARCHAR(20) NOT NULL,
"contribution_record_id" BIGINT NOT NULL,
"contribution_type" VARCHAR(30) NOT NULL,
"contribution_amount" DECIMAL(30, 10) NOT NULL,
"reward_amount" DECIMAL(30, 10) NOT NULL,
"reason" VARCHAR(200) NOT NULL,
"owner_has_adopted" BOOLEAN NOT NULL,
"owner_direct_referral_count" INTEGER NOT NULL,
"required_condition" VARCHAR(100) NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "headquarters_pending_rewards_pkey" PRIMARY KEY ("id")
);
CREATE INDEX IF NOT EXISTS "headquarters_pending_rewards_mining_date_idx" ON "headquarters_pending_rewards"("mining_date");
CREATE INDEX IF NOT EXISTS "headquarters_pending_rewards_would_be_account_sequence_idx" ON "headquarters_pending_rewards"("would_be_account_sequence");
CREATE INDEX IF NOT EXISTS "headquarters_pending_rewards_source_adoption_id_idx" ON "headquarters_pending_rewards"("source_adoption_id");
-- ==================== 初始化系统账户 ====================
INSERT INTO "system_mining_accounts" ("id", "account_type", "name", "totalMined", "availableBalance", "totalContribution", "updated_at")
VALUES
(gen_random_uuid(), 'OPERATION', '运营账户', 0, 0, 0, NOW()),
(gen_random_uuid(), 'PROVINCE', '省公司账户', 0, 0, 0, NOW()),
(gen_random_uuid(), 'CITY', '市公司账户', 0, 0, 0, NOW()),
(gen_random_uuid(), 'HEADQUARTERS', '总部账户', 0, 0, 0, NOW())
ON CONFLICT ("account_type") DO NOTHING;

View File

@ -1,93 +0,0 @@
-- 系统挖矿账户按省市细分: 移除枚举类型,改用字符串组合键
-- 将 accountType 从枚举改为字符串(如 PROVINCE_440000, CITY_440100
-- ============================================================
-- 步骤 1: 删除现有外键约束(如果存在)
-- ============================================================
ALTER TABLE "system_mining_records" DROP CONSTRAINT IF EXISTS "system_mining_records_account_type_fkey";
ALTER TABLE "system_mining_transactions" DROP CONSTRAINT IF EXISTS "system_mining_transactions_account_type_fkey";
-- ============================================================
-- 步骤 2: 修改 system_mining_accounts 主表
-- ============================================================
-- 2.1 添加新列 (使用 TEXT 类型与 Prisma String 一致)
ALTER TABLE "system_mining_accounts" ADD COLUMN "account_type_new" TEXT;
ALTER TABLE "system_mining_accounts" ADD COLUMN "base_type" TEXT;
ALTER TABLE "system_mining_accounts" ADD COLUMN "region_code" TEXT;
-- 2.2 迁移数据:将枚举值转为字符串
UPDATE "system_mining_accounts"
SET "account_type_new" = "account_type"::TEXT,
"base_type" = "account_type"::TEXT
WHERE "account_type_new" IS NULL;
-- 2.3 删除旧的唯一约束和列
DROP INDEX IF EXISTS "system_mining_accounts_account_type_key";
ALTER TABLE "system_mining_accounts" DROP COLUMN "account_type";
-- 2.4 重命名新列
ALTER TABLE "system_mining_accounts" RENAME COLUMN "account_type_new" TO "account_type";
-- 2.5 添加非空约束和唯一约束
ALTER TABLE "system_mining_accounts" ALTER COLUMN "account_type" SET NOT NULL;
ALTER TABLE "system_mining_accounts" ALTER COLUMN "base_type" SET NOT NULL;
CREATE UNIQUE INDEX "system_mining_accounts_account_type_key" ON "system_mining_accounts"("account_type");
-- 2.6 创建索引Prisma 默认命名格式: {table}_{field}_idx
CREATE INDEX IF NOT EXISTS "system_mining_accounts_base_type_idx" ON "system_mining_accounts"("base_type");
CREATE INDEX IF NOT EXISTS "system_mining_accounts_region_code_idx" ON "system_mining_accounts"("region_code");
-- ============================================================
-- 步骤 3: 修改 system_mining_records 表
-- ============================================================
-- 3.1 添加新列并迁移数据 (使用 TEXT)
ALTER TABLE "system_mining_records" ADD COLUMN "account_type_new" TEXT;
UPDATE "system_mining_records" SET "account_type_new" = "account_type"::TEXT;
-- 3.2 删除旧的唯一索引和列
DROP INDEX IF EXISTS "system_mining_records_account_type_mining_minute_key";
ALTER TABLE "system_mining_records" DROP COLUMN "account_type";
-- 3.3 重命名新列并添加约束
ALTER TABLE "system_mining_records" RENAME COLUMN "account_type_new" TO "account_type";
ALTER TABLE "system_mining_records" ALTER COLUMN "account_type" SET NOT NULL;
-- 3.4 重建复合唯一索引
CREATE UNIQUE INDEX "system_mining_records_account_type_mining_minute_key" ON "system_mining_records"("account_type", "mining_minute");
-- 3.5 重建外键约束
ALTER TABLE "system_mining_records"
ADD CONSTRAINT "system_mining_records_account_type_fkey"
FOREIGN KEY ("account_type") REFERENCES "system_mining_accounts"("account_type")
ON DELETE RESTRICT ON UPDATE CASCADE;
-- ============================================================
-- 步骤 4: 修改 system_mining_transactions 表
-- ============================================================
-- 4.1 添加新列并迁移数据 (使用 TEXT)
ALTER TABLE "system_mining_transactions" ADD COLUMN "account_type_new" TEXT;
UPDATE "system_mining_transactions" SET "account_type_new" = "account_type"::TEXT;
-- 4.2 删除旧列
ALTER TABLE "system_mining_transactions" DROP COLUMN "account_type";
-- 4.3 重命名新列并添加约束
ALTER TABLE "system_mining_transactions" RENAME COLUMN "account_type_new" TO "account_type";
ALTER TABLE "system_mining_transactions" ALTER COLUMN "account_type" SET NOT NULL;
-- 4.4 重建索引Prisma 默认命名格式: {table}_{field(s)}_idx
CREATE INDEX IF NOT EXISTS "system_mining_transactions_account_type_createdAt_idx" ON "system_mining_transactions"("account_type", "created_at" DESC);
-- 4.5 重建外键约束
ALTER TABLE "system_mining_transactions"
ADD CONSTRAINT "system_mining_transactions_account_type_fkey"
FOREIGN KEY ("account_type") REFERENCES "system_mining_accounts"("account_type")
ON DELETE RESTRICT ON UPDATE CASCADE;
-- ============================================================
-- 步骤 5: 清理旧的枚举类型(如果不再使用)
-- ============================================================
-- DROP TYPE IF EXISTS "SystemAccountType";

View File

@ -1,7 +1,6 @@
-- ============================================================================ -- ============================================================================
-- mining-wallet-service 初始化 migration -- mining-wallet-service 初始化 migration
-- 合并自: 20260111000000_init, 20260112180000_add_contribution_balance, -- 合并自: 0001_init, 0002_split_share_pool
-- 20260112220000_remove_blockchain_tables
-- 注意: 区块链相关表已移除 -- 注意: 区块链相关表已移除
-- ============================================================================ -- ============================================================================
@ -9,7 +8,8 @@
CREATE TYPE "SystemAccountType" AS ENUM ('HEADQUARTERS', 'OPERATION', 'PROVINCE', 'CITY', 'FEE', 'HOT_WALLET', 'COLD_WALLET'); CREATE TYPE "SystemAccountType" AS ENUM ('HEADQUARTERS', 'OPERATION', 'PROVINCE', 'CITY', 'FEE', 'HOT_WALLET', 'COLD_WALLET');
-- CreateEnum -- CreateEnum
CREATE TYPE "PoolAccountType" AS ENUM ('SHARE_POOL', 'BLACK_HOLE_POOL', 'CIRCULATION_POOL'); -- 注意: SHARE_POOL 已拆分为 SHARE_POOL_A (100亿销毁) 和 SHARE_POOL_B (200万挖矿)
CREATE TYPE "PoolAccountType" AS ENUM ('SHARE_POOL', 'SHARE_POOL_A', 'SHARE_POOL_B', 'BLACK_HOLE_POOL', 'CIRCULATION_POOL');
-- CreateEnum -- CreateEnum
CREATE TYPE "UserWalletType" AS ENUM ('CONTRIBUTION', 'TOKEN_STORAGE', 'GREEN_POINTS'); CREATE TYPE "UserWalletType" AS ENUM ('CONTRIBUTION', 'TOKEN_STORAGE', 'GREEN_POINTS');

View File

@ -1,14 +0,0 @@
-- ============================================================================
-- 拆分积分股池: SHARE_POOL -> SHARE_POOL_A + SHARE_POOL_B
-- SHARE_POOL_A: 100亿 (10,000,000,000) - 用于销毁
-- SHARE_POOL_B: 200万 (2,000,000) - 用于挖矿分配
-- 总计: 100.02亿 (10,002,000,000)
-- ============================================================================
-- 1. 添加新的枚举值
ALTER TYPE "PoolAccountType" ADD VALUE IF NOT EXISTS 'SHARE_POOL_A';
ALTER TYPE "PoolAccountType" ADD VALUE IF NOT EXISTS 'SHARE_POOL_B';
-- 2. 如果存在旧的 SHARE_POOL 记录,需要手动迁移数据后删除
-- 注意: PostgreSQL 不支持直接删除枚举值,如果需要删除旧值需要重建枚举
-- 这里只添加新值,旧的 SHARE_POOL 保留兼容

View File

@ -1,6 +1,9 @@
-- ============================================================================ -- ============================================================================
-- trading-service 初始化 migration -- trading-service 初始化 migration
-- 合并自: 20260111000000_init (只有一个,无需合并) -- 合并自: 0001_init, 0002_add_trading_burn_system, 0003_add_processed_events,
-- 0004_add_buy_enabled, 0005_add_market_maker_and_order_source,
-- 0006_add_market_maker_depth, 0007_add_trade_fee, 0008_add_c2c_orders,
-- 0009_add_original_quantity
-- ============================================================================ -- ============================================================================
-- CreateEnum -- CreateEnum
@ -35,6 +38,11 @@ CREATE TABLE "orders" (
"remainingQuantity" DECIMAL(30,8) NOT NULL, "remainingQuantity" DECIMAL(30,8) NOT NULL,
"averagePrice" DECIMAL(30,18) NOT NULL DEFAULT 0, "averagePrice" DECIMAL(30,18) NOT NULL DEFAULT 0,
"totalAmount" DECIMAL(30,8) NOT NULL DEFAULT 0, "totalAmount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"burn_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"burn_multiplier" DECIMAL(30,18) NOT NULL DEFAULT 0,
"effective_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"source" TEXT NOT NULL DEFAULT 'USER',
"source_label" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL, "updatedAt" TIMESTAMP(3) NOT NULL,
"cancelledAt" TIMESTAMP(3), "cancelledAt" TIMESTAMP(3),
@ -53,7 +61,13 @@ CREATE TABLE "trades" (
"seller_sequence" TEXT NOT NULL, "seller_sequence" TEXT NOT NULL,
"price" DECIMAL(30,18) NOT NULL, "price" DECIMAL(30,18) NOT NULL,
"quantity" DECIMAL(30,8) NOT NULL, "quantity" DECIMAL(30,8) NOT NULL,
"original_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"amount" DECIMAL(30,8) NOT NULL, "amount" DECIMAL(30,8) NOT NULL,
"burn_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"effective_qty" DECIMAL(30,8) NOT NULL DEFAULT 0,
"fee" DECIMAL(30,8) NOT NULL DEFAULT 0,
"buyer_source" TEXT NOT NULL DEFAULT 'USER',
"seller_source" TEXT NOT NULL DEFAULT 'USER',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "trades_pkey" PRIMARY KEY ("id") CONSTRAINT "trades_pkey" PRIMARY KEY ("id")
@ -225,6 +239,9 @@ CREATE INDEX "orders_type_status_price_idx" ON "orders"("type", "status", "price
-- CreateIndex -- CreateIndex
CREATE INDEX "orders_createdAt_idx" ON "orders"("createdAt" DESC); CREATE INDEX "orders_createdAt_idx" ON "orders"("createdAt" DESC);
-- CreateIndex
CREATE INDEX "orders_source_idx" ON "orders"("source");
-- CreateIndex -- CreateIndex
CREATE UNIQUE INDEX "trades_tradeNo_key" ON "trades"("tradeNo"); CREATE UNIQUE INDEX "trades_tradeNo_key" ON "trades"("tradeNo");
@ -237,6 +254,12 @@ CREATE INDEX "trades_seller_sequence_idx" ON "trades"("seller_sequence");
-- CreateIndex -- CreateIndex
CREATE INDEX "trades_created_at_idx" ON "trades"("created_at" DESC); CREATE INDEX "trades_created_at_idx" ON "trades"("created_at" DESC);
-- CreateIndex
CREATE INDEX "trades_buyer_source_idx" ON "trades"("buyer_source");
-- CreateIndex
CREATE INDEX "trades_seller_source_idx" ON "trades"("seller_source");
-- CreateIndex -- CreateIndex
CREATE INDEX "trading_transactions_accountSequence_createdAt_idx" ON "trading_transactions"("accountSequence", "createdAt" DESC); CREATE INDEX "trading_transactions_accountSequence_createdAt_idx" ON "trading_transactions"("accountSequence", "createdAt" DESC);
@ -314,3 +337,333 @@ ALTER TABLE "trading_transactions" ADD CONSTRAINT "trading_transactions_accountS
-- AddForeignKey -- AddForeignKey
ALTER TABLE "circulation_pool_transactions" ADD CONSTRAINT "circulation_pool_transactions_pool_id_fkey" FOREIGN KEY ("pool_id") REFERENCES "circulation_pools"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "circulation_pool_transactions" ADD CONSTRAINT "circulation_pool_transactions_pool_id_fkey" FOREIGN KEY ("pool_id") REFERENCES "circulation_pools"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ============================================================================
-- 交易配置和销毁系统 (从 0002_add_trading_burn_system 合并)
-- ============================================================================
-- CreateTable
CREATE TABLE "trading_configs" (
"id" TEXT NOT NULL,
"total_shares" DECIMAL(30,8) NOT NULL DEFAULT 10002000000,
"burn_target" DECIMAL(30,8) NOT NULL DEFAULT 10000000000,
"burn_period_minutes" INTEGER NOT NULL DEFAULT 2102400,
"minute_burn_rate" DECIMAL(30,18) NOT NULL DEFAULT 4756.468797564687,
"is_active" BOOLEAN NOT NULL DEFAULT false,
"buy_enabled" BOOLEAN NOT NULL DEFAULT false,
"depth_enabled" BOOLEAN NOT NULL DEFAULT false,
"activated_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "trading_configs_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "black_holes" (
"id" TEXT NOT NULL,
"total_burned" DECIMAL(30,8) NOT NULL DEFAULT 0,
"target_burn" DECIMAL(30,8) NOT NULL,
"remaining_burn" DECIMAL(30,8) NOT NULL,
"last_burn_minute" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "black_holes_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "burn_records" (
"id" TEXT NOT NULL,
"black_hole_id" TEXT NOT NULL,
"burn_minute" TIMESTAMP(3) NOT NULL,
"burn_amount" DECIMAL(30,18) NOT NULL,
"remaining_target" DECIMAL(30,8) NOT NULL,
"source_type" TEXT,
"source_account_seq" TEXT,
"source_order_no" TEXT,
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "burn_records_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "burn_records_burn_minute_idx" ON "burn_records"("burn_minute");
CREATE INDEX "burn_records_source_account_seq_idx" ON "burn_records"("source_account_seq");
CREATE INDEX "burn_records_source_order_no_idx" ON "burn_records"("source_order_no");
CREATE INDEX "burn_records_source_type_idx" ON "burn_records"("source_type");
-- AddForeignKey
ALTER TABLE "burn_records" ADD CONSTRAINT "burn_records_black_hole_id_fkey" FOREIGN KEY ("black_hole_id") REFERENCES "black_holes"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- CreateTable
CREATE TABLE "share_pools" (
"id" TEXT NOT NULL,
"green_points" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_inflow" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_outflow" DECIMAL(30,8) NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "share_pools_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "share_pool_transactions" (
"id" TEXT NOT NULL,
"pool_id" TEXT NOT NULL,
"type" TEXT NOT NULL,
"amount" DECIMAL(30,8) NOT NULL,
"balance_before" DECIMAL(30,8) NOT NULL,
"balance_after" DECIMAL(30,8) NOT NULL,
"reference_id" TEXT,
"reference_type" TEXT,
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "share_pool_transactions_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "share_pool_transactions_pool_id_created_at_idx" ON "share_pool_transactions"("pool_id", "created_at" DESC);
-- AddForeignKey
ALTER TABLE "share_pool_transactions" ADD CONSTRAINT "share_pool_transactions_pool_id_fkey" FOREIGN KEY ("pool_id") REFERENCES "share_pools"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- CreateTable
CREATE TABLE "price_snapshots" (
"id" TEXT NOT NULL,
"snapshot_time" TIMESTAMP(3) NOT NULL,
"price" DECIMAL(30,18) NOT NULL,
"green_points" DECIMAL(30,8) NOT NULL,
"black_hole_amount" DECIMAL(30,8) NOT NULL,
"circulation_pool" DECIMAL(30,8) NOT NULL,
"effective_denominator" DECIMAL(30,8) NOT NULL,
"minute_burn_rate" DECIMAL(30,18) NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "price_snapshots_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "price_snapshots_snapshot_time_key" ON "price_snapshots"("snapshot_time");
CREATE INDEX "price_snapshots_snapshot_time_idx" ON "price_snapshots"("snapshot_time" DESC);
-- ============================================================================
-- 事件幂等处理 (从 0003_add_processed_events 合并)
-- ============================================================================
-- CreateTable
CREATE TABLE "processed_events" (
"id" TEXT NOT NULL,
"event_id" TEXT NOT NULL,
"event_type" TEXT NOT NULL,
"source_service" TEXT NOT NULL,
"processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "processed_events_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "processed_events_event_id_key" ON "processed_events"("event_id");
CREATE INDEX "processed_events_event_id_idx" ON "processed_events"("event_id");
CREATE INDEX "processed_events_processed_at_idx" ON "processed_events"("processed_at");
-- ============================================================================
-- 做市商系统 (从 0005_add_market_maker_and_order_source 合并)
-- ============================================================================
-- CreateTable
CREATE TABLE "market_maker_configs" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"account_sequence" TEXT NOT NULL,
"cash_balance" DECIMAL(30,8) NOT NULL DEFAULT 0,
"share_balance" DECIMAL(30,8) NOT NULL DEFAULT 0,
"frozen_cash" DECIMAL(30,8) NOT NULL DEFAULT 0,
"frozen_shares" DECIMAL(30,8) NOT NULL DEFAULT 0,
"max_buy_ratio" DECIMAL(10,4) NOT NULL DEFAULT 0.05,
"min_interval_ms" INTEGER NOT NULL DEFAULT 1000,
"max_interval_ms" INTEGER NOT NULL DEFAULT 4000,
"price_strategy" TEXT NOT NULL DEFAULT 'TAKER',
"discount_rate" DECIMAL(10,4) NOT NULL DEFAULT 1.0,
"is_active" BOOLEAN NOT NULL DEFAULT false,
"last_run_at" TIMESTAMP(3),
"total_buy_count" INTEGER NOT NULL DEFAULT 0,
"total_buy_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_buy_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_sell_count" INTEGER NOT NULL DEFAULT 0,
"total_sell_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_sell_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"maker_enabled" BOOLEAN NOT NULL DEFAULT false,
"bid_enabled" BOOLEAN NOT NULL DEFAULT true,
"bid_levels" INTEGER NOT NULL DEFAULT 5,
"bid_spread" DECIMAL(10,4) NOT NULL DEFAULT 0.01,
"bid_level_spacing" DECIMAL(10,4) NOT NULL DEFAULT 0.005,
"bid_quantity_per_level" DECIMAL(30,8) NOT NULL DEFAULT 1000,
"ask_enabled" BOOLEAN NOT NULL DEFAULT true,
"ask_levels" INTEGER NOT NULL DEFAULT 5,
"ask_spread" DECIMAL(10,4) NOT NULL DEFAULT 0.01,
"ask_level_spacing" DECIMAL(10,4) NOT NULL DEFAULT 0.005,
"ask_quantity_per_level" DECIMAL(30,8) NOT NULL DEFAULT 1000,
"refresh_interval_ms" INTEGER NOT NULL DEFAULT 60000,
"last_refresh_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "market_maker_configs_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "market_maker_configs_name_key" ON "market_maker_configs"("name");
CREATE UNIQUE INDEX "market_maker_configs_account_sequence_key" ON "market_maker_configs"("account_sequence");
-- CreateTable
CREATE TABLE "market_maker_ledgers" (
"id" TEXT NOT NULL,
"market_maker_id" TEXT NOT NULL,
"type" TEXT NOT NULL,
"asset_type" TEXT NOT NULL,
"amount" DECIMAL(30,8) NOT NULL,
"balance_before" DECIMAL(30,8) NOT NULL,
"balance_after" DECIMAL(30,8) NOT NULL,
"trade_id" TEXT,
"trade_no" TEXT,
"order_id" TEXT,
"order_no" TEXT,
"counterparty_seq" TEXT,
"counterparty_id" TEXT,
"price" DECIMAL(30,18),
"quantity" DECIMAL(30,8),
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "market_maker_ledgers_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "market_maker_ledgers_market_maker_id_created_at_idx" ON "market_maker_ledgers"("market_maker_id", "created_at" DESC);
CREATE INDEX "market_maker_ledgers_type_idx" ON "market_maker_ledgers"("type");
CREATE INDEX "market_maker_ledgers_trade_no_idx" ON "market_maker_ledgers"("trade_no");
CREATE INDEX "market_maker_ledgers_order_no_idx" ON "market_maker_ledgers"("order_no");
CREATE INDEX "market_maker_ledgers_counterparty_seq_idx" ON "market_maker_ledgers"("counterparty_seq");
CREATE INDEX "market_maker_ledgers_created_at_idx" ON "market_maker_ledgers"("created_at" DESC);
-- AddForeignKey
ALTER TABLE "market_maker_ledgers" ADD CONSTRAINT "market_maker_ledgers_market_maker_id_fkey" FOREIGN KEY ("market_maker_id") REFERENCES "market_maker_configs"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- CreateTable
CREATE TABLE "market_maker_daily_stats" (
"id" TEXT NOT NULL,
"market_maker_id" TEXT NOT NULL,
"date" DATE NOT NULL,
"buy_count" INTEGER NOT NULL DEFAULT 0,
"buy_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"buy_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"avg_buy_price" DECIMAL(30,18) NOT NULL DEFAULT 0,
"sell_count" INTEGER NOT NULL DEFAULT 0,
"sell_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"sell_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"avg_sell_price" DECIMAL(30,18) NOT NULL DEFAULT 0,
"realized_pnl" DECIMAL(30,8) NOT NULL DEFAULT 0,
"cash_balance_end" DECIMAL(30,8) NOT NULL DEFAULT 0,
"share_balance_end" DECIMAL(30,8) NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "market_maker_daily_stats_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "market_maker_daily_stats_market_maker_id_date_key" ON "market_maker_daily_stats"("market_maker_id", "date");
CREATE INDEX "market_maker_daily_stats_market_maker_id_date_idx" ON "market_maker_daily_stats"("market_maker_id", "date" DESC);
-- CreateTable
CREATE TABLE "market_maker_orders" (
"id" TEXT NOT NULL,
"market_maker_id" TEXT NOT NULL,
"order_id" TEXT NOT NULL,
"order_no" TEXT NOT NULL,
"side" TEXT NOT NULL,
"level" INTEGER NOT NULL,
"price" DECIMAL(30,18) NOT NULL,
"quantity" DECIMAL(30,8) NOT NULL,
"remaining_qty" DECIMAL(30,8) NOT NULL,
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "market_maker_orders_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "market_maker_orders_order_id_key" ON "market_maker_orders"("order_id");
CREATE UNIQUE INDEX "market_maker_orders_order_no_key" ON "market_maker_orders"("order_no");
CREATE INDEX "market_maker_orders_market_maker_id_side_status_idx" ON "market_maker_orders"("market_maker_id", "side", "status");
CREATE INDEX "market_maker_orders_status_idx" ON "market_maker_orders"("status");
-- AddForeignKey
ALTER TABLE "market_maker_orders" ADD CONSTRAINT "market_maker_orders_market_maker_id_fkey" FOREIGN KEY ("market_maker_id") REFERENCES "market_maker_configs"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ============================================================================
-- C2C 交易系统 (从 0008_add_c2c_orders 合并)
-- ============================================================================
-- CreateEnum
CREATE TYPE "C2cOrderType" AS ENUM ('BUY', 'SELL');
-- CreateEnum
CREATE TYPE "C2cOrderStatus" AS ENUM ('PENDING', 'MATCHED', 'PAID', 'COMPLETED', 'CANCELLED', 'EXPIRED');
-- CreateEnum
CREATE TYPE "C2cPaymentMethod" AS ENUM ('ALIPAY', 'WECHAT', 'BANK');
-- CreateTable
CREATE TABLE "c2c_orders" (
"id" TEXT NOT NULL,
"order_no" TEXT NOT NULL,
"type" "C2cOrderType" NOT NULL,
"status" "C2cOrderStatus" NOT NULL DEFAULT 'PENDING',
"maker_account_sequence" TEXT NOT NULL,
"maker_user_id" TEXT,
"maker_phone" TEXT,
"maker_nickname" TEXT,
"taker_account_sequence" TEXT,
"taker_user_id" TEXT,
"taker_phone" TEXT,
"taker_nickname" TEXT,
"price" DECIMAL(30,18) NOT NULL,
"quantity" DECIMAL(30,8) NOT NULL,
"total_amount" DECIMAL(30,8) NOT NULL,
"min_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"max_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"payment_method" "C2cPaymentMethod",
"payment_account" TEXT,
"payment_qr_code" TEXT,
"payment_real_name" TEXT,
"remark" TEXT,
"payment_timeout_minutes" INTEGER NOT NULL DEFAULT 15,
"confirm_timeout_minutes" INTEGER NOT NULL DEFAULT 60,
"payment_deadline" TIMESTAMP(3),
"confirm_deadline" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
"matched_at" TIMESTAMP(3),
"paid_at" TIMESTAMP(3),
"completed_at" TIMESTAMP(3),
"cancelled_at" TIMESTAMP(3),
"expired_at" TIMESTAMP(3),
CONSTRAINT "c2c_orders_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "c2c_orders_order_no_key" ON "c2c_orders"("order_no");
CREATE INDEX "c2c_orders_status_idx" ON "c2c_orders"("status");
CREATE INDEX "c2c_orders_type_status_idx" ON "c2c_orders"("type", "status");
CREATE INDEX "c2c_orders_maker_account_sequence_idx" ON "c2c_orders"("maker_account_sequence");
CREATE INDEX "c2c_orders_taker_account_sequence_idx" ON "c2c_orders"("taker_account_sequence");
CREATE INDEX "c2c_orders_created_at_idx" ON "c2c_orders"("created_at" DESC);
CREATE INDEX "c2c_orders_payment_deadline_idx" ON "c2c_orders"("payment_deadline");
CREATE INDEX "c2c_orders_confirm_deadline_idx" ON "c2c_orders"("confirm_deadline");

View File

@ -1,139 +0,0 @@
-- ============================================================================
-- trading-service 添加交易销毁系统
-- 包含:交易配置、黑洞账户、积分股池、价格快照、订单销毁字段
-- ============================================================================
-- ==================== 交易配置表 ====================
-- CreateTable
CREATE TABLE "trading_configs" (
"id" TEXT NOT NULL,
"total_shares" DECIMAL(30,8) NOT NULL DEFAULT 10002000000,
"burn_target" DECIMAL(30,8) NOT NULL DEFAULT 10000000000,
"burn_period_minutes" INTEGER NOT NULL DEFAULT 2102400,
"minute_burn_rate" DECIMAL(30,18) NOT NULL DEFAULT 4756.468797564687,
"is_active" BOOLEAN NOT NULL DEFAULT false,
"activated_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "trading_configs_pkey" PRIMARY KEY ("id")
);
-- ==================== 黑洞账户(销毁池)====================
-- CreateTable
CREATE TABLE "black_holes" (
"id" TEXT NOT NULL,
"total_burned" DECIMAL(30,8) NOT NULL DEFAULT 0,
"target_burn" DECIMAL(30,8) NOT NULL,
"remaining_burn" DECIMAL(30,8) NOT NULL,
"last_burn_minute" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "black_holes_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "burn_records" (
"id" TEXT NOT NULL,
"black_hole_id" TEXT NOT NULL,
"burn_minute" TIMESTAMP(3) NOT NULL,
"burn_amount" DECIMAL(30,18) NOT NULL,
"remaining_target" DECIMAL(30,8) NOT NULL,
"source_type" TEXT,
"source_account_seq" TEXT,
"source_order_no" TEXT,
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "burn_records_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "burn_records_burn_minute_idx" ON "burn_records"("burn_minute");
-- CreateIndex
CREATE INDEX "burn_records_source_account_seq_idx" ON "burn_records"("source_account_seq");
-- CreateIndex
CREATE INDEX "burn_records_source_order_no_idx" ON "burn_records"("source_order_no");
-- CreateIndex
CREATE INDEX "burn_records_source_type_idx" ON "burn_records"("source_type");
-- AddForeignKey
ALTER TABLE "burn_records" ADD CONSTRAINT "burn_records_black_hole_id_fkey" FOREIGN KEY ("black_hole_id") REFERENCES "black_holes"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ==================== 积分股池(绿积分池)====================
-- CreateTable
CREATE TABLE "share_pools" (
"id" TEXT NOT NULL,
"green_points" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_inflow" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_outflow" DECIMAL(30,8) NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "share_pools_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "share_pool_transactions" (
"id" TEXT NOT NULL,
"pool_id" TEXT NOT NULL,
"type" TEXT NOT NULL,
"amount" DECIMAL(30,8) NOT NULL,
"balance_before" DECIMAL(30,8) NOT NULL,
"balance_after" DECIMAL(30,8) NOT NULL,
"reference_id" TEXT,
"reference_type" TEXT,
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "share_pool_transactions_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "share_pool_transactions_pool_id_created_at_idx" ON "share_pool_transactions"("pool_id", "created_at" DESC);
-- AddForeignKey
ALTER TABLE "share_pool_transactions" ADD CONSTRAINT "share_pool_transactions_pool_id_fkey" FOREIGN KEY ("pool_id") REFERENCES "share_pools"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- ==================== 价格快照 ====================
-- CreateTable
CREATE TABLE "price_snapshots" (
"id" TEXT NOT NULL,
"snapshot_time" TIMESTAMP(3) NOT NULL,
"price" DECIMAL(30,18) NOT NULL,
"green_points" DECIMAL(30,8) NOT NULL,
"black_hole_amount" DECIMAL(30,8) NOT NULL,
"circulation_pool" DECIMAL(30,8) NOT NULL,
"effective_denominator" DECIMAL(30,8) NOT NULL,
"minute_burn_rate" DECIMAL(30,18) NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "price_snapshots_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "price_snapshots_snapshot_time_key" ON "price_snapshots"("snapshot_time");
-- CreateIndex
CREATE INDEX "price_snapshots_snapshot_time_idx" ON "price_snapshots"("snapshot_time" DESC);
-- ==================== 订单表添加销毁相关字段 ====================
-- AlterTable: 添加销毁相关字段到 orders 表
ALTER TABLE "orders" ADD COLUMN "burn_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0;
ALTER TABLE "orders" ADD COLUMN "burn_multiplier" DECIMAL(30,18) NOT NULL DEFAULT 0;
ALTER TABLE "orders" ADD COLUMN "effective_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0;
-- ==================== 成交记录表添加销毁相关字段 ====================
-- 添加销毁相关字段到 trades 表
ALTER TABLE "trades" ADD COLUMN "burn_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0;
ALTER TABLE "trades" ADD COLUMN "effective_qty" DECIMAL(30,8) NOT NULL DEFAULT 0;

View File

@ -1,23 +0,0 @@
-- ============================================================================
-- trading-service 添加已处理事件表(幂等性支持)
-- ============================================================================
-- CreateTable
CREATE TABLE "processed_events" (
"id" TEXT NOT NULL,
"event_id" TEXT NOT NULL,
"event_type" TEXT NOT NULL,
"source_service" TEXT NOT NULL,
"processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "processed_events_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "processed_events_event_id_key" ON "processed_events"("event_id");
-- CreateIndex
CREATE INDEX "processed_events_event_id_idx" ON "processed_events"("event_id");
-- CreateIndex
CREATE INDEX "processed_events_processed_at_idx" ON "processed_events"("processed_at");

View File

@ -1,6 +0,0 @@
-- ============================================================================
-- trading-service 添加买入功能开关
-- ============================================================================
-- AlterTable: 添加买入功能开关字段到 trading_configs 表
ALTER TABLE "trading_configs" ADD COLUMN "buy_enabled" BOOLEAN NOT NULL DEFAULT false;

View File

@ -1,98 +0,0 @@
-- 订单来源字段
ALTER TABLE "orders" ADD COLUMN "source" TEXT NOT NULL DEFAULT 'USER';
ALTER TABLE "orders" ADD COLUMN "source_label" TEXT;
CREATE INDEX "orders_source_idx" ON "orders"("source");
-- 成交记录来源字段
ALTER TABLE "trades" ADD COLUMN "buyer_source" TEXT NOT NULL DEFAULT 'USER';
ALTER TABLE "trades" ADD COLUMN "seller_source" TEXT NOT NULL DEFAULT 'USER';
CREATE INDEX "trades_buyer_source_idx" ON "trades"("buyer_source");
CREATE INDEX "trades_seller_source_idx" ON "trades"("seller_source");
-- 做市商配置表
CREATE TABLE "market_maker_configs" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"account_sequence" TEXT NOT NULL,
"cash_balance" DECIMAL(30,8) NOT NULL DEFAULT 0,
"share_balance" DECIMAL(30,8) NOT NULL DEFAULT 0,
"frozen_cash" DECIMAL(30,8) NOT NULL DEFAULT 0,
"frozen_shares" DECIMAL(30,8) NOT NULL DEFAULT 0,
"max_buy_ratio" DECIMAL(10,4) NOT NULL DEFAULT 0.05,
"min_interval_ms" INTEGER NOT NULL DEFAULT 1000,
"max_interval_ms" INTEGER NOT NULL DEFAULT 4000,
"price_strategy" TEXT NOT NULL DEFAULT 'TAKER',
"discount_rate" DECIMAL(10,4) NOT NULL DEFAULT 1.0,
"is_active" BOOLEAN NOT NULL DEFAULT false,
"last_run_at" TIMESTAMP(3),
"total_buy_count" INTEGER NOT NULL DEFAULT 0,
"total_buy_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_buy_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_sell_count" INTEGER NOT NULL DEFAULT 0,
"total_sell_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"total_sell_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "market_maker_configs_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "market_maker_configs_name_key" ON "market_maker_configs"("name");
CREATE UNIQUE INDEX "market_maker_configs_account_sequence_key" ON "market_maker_configs"("account_sequence");
-- 做市商分类账表
CREATE TABLE "market_maker_ledgers" (
"id" TEXT NOT NULL,
"market_maker_id" TEXT NOT NULL,
"type" TEXT NOT NULL,
"asset_type" TEXT NOT NULL,
"amount" DECIMAL(30,8) NOT NULL,
"balance_before" DECIMAL(30,8) NOT NULL,
"balance_after" DECIMAL(30,8) NOT NULL,
"trade_id" TEXT,
"trade_no" TEXT,
"order_id" TEXT,
"order_no" TEXT,
"counterparty_seq" TEXT,
"counterparty_id" TEXT,
"price" DECIMAL(30,18),
"quantity" DECIMAL(30,8),
"memo" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "market_maker_ledgers_pkey" PRIMARY KEY ("id")
);
CREATE INDEX "market_maker_ledgers_market_maker_id_created_at_idx" ON "market_maker_ledgers"("market_maker_id", "created_at" DESC);
CREATE INDEX "market_maker_ledgers_type_idx" ON "market_maker_ledgers"("type");
CREATE INDEX "market_maker_ledgers_trade_no_idx" ON "market_maker_ledgers"("trade_no");
CREATE INDEX "market_maker_ledgers_order_no_idx" ON "market_maker_ledgers"("order_no");
CREATE INDEX "market_maker_ledgers_counterparty_seq_idx" ON "market_maker_ledgers"("counterparty_seq");
CREATE INDEX "market_maker_ledgers_created_at_idx" ON "market_maker_ledgers"("created_at" DESC);
ALTER TABLE "market_maker_ledgers" ADD CONSTRAINT "market_maker_ledgers_market_maker_id_fkey" FOREIGN KEY ("market_maker_id") REFERENCES "market_maker_configs"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- 做市商日统计表
CREATE TABLE "market_maker_daily_stats" (
"id" TEXT NOT NULL,
"market_maker_id" TEXT NOT NULL,
"date" DATE NOT NULL,
"buy_count" INTEGER NOT NULL DEFAULT 0,
"buy_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"buy_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"avg_buy_price" DECIMAL(30,18) NOT NULL DEFAULT 0,
"sell_count" INTEGER NOT NULL DEFAULT 0,
"sell_quantity" DECIMAL(30,8) NOT NULL DEFAULT 0,
"sell_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"avg_sell_price" DECIMAL(30,18) NOT NULL DEFAULT 0,
"realized_pnl" DECIMAL(30,8) NOT NULL DEFAULT 0,
"cash_balance_end" DECIMAL(30,8) NOT NULL DEFAULT 0,
"share_balance_end" DECIMAL(30,8) NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "market_maker_daily_stats_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "market_maker_daily_stats_market_maker_id_date_key" ON "market_maker_daily_stats"("market_maker_id", "date");
CREATE INDEX "market_maker_daily_stats_market_maker_id_date_idx" ON "market_maker_daily_stats"("market_maker_id", "date" DESC);

View File

@ -1,75 +0,0 @@
-- ============================================================================
-- trading-service 添加做市商双边深度功能
-- 包含:深度开关、做市商双边挂单配置、做市商挂单记录表
-- ============================================================================
-- ==================== TradingConfig 添加深度开关 ====================
-- 添加深度显示开关
ALTER TABLE "trading_configs" ADD COLUMN IF NOT EXISTS "depth_enabled" BOOLEAN NOT NULL DEFAULT false;
-- ==================== MarketMakerConfig 添加双边挂单配置 ====================
-- 挂单模式开关
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "maker_enabled" BOOLEAN NOT NULL DEFAULT false;
-- 买单挂单配置
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "bid_enabled" BOOLEAN NOT NULL DEFAULT true;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "bid_levels" INTEGER NOT NULL DEFAULT 5;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "bid_spread" DECIMAL(10, 4) NOT NULL DEFAULT 0.01;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "bid_level_spacing" DECIMAL(10, 4) NOT NULL DEFAULT 0.005;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "bid_quantity_per_level" DECIMAL(30, 8) NOT NULL DEFAULT 1000;
-- 卖单挂单配置
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "ask_enabled" BOOLEAN NOT NULL DEFAULT true;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "ask_levels" INTEGER NOT NULL DEFAULT 5;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "ask_spread" DECIMAL(10, 4) NOT NULL DEFAULT 0.01;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "ask_level_spacing" DECIMAL(10, 4) NOT NULL DEFAULT 0.005;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "ask_quantity_per_level" DECIMAL(30, 8) NOT NULL DEFAULT 1000;
-- 挂单刷新配置
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "refresh_interval_ms" INTEGER NOT NULL DEFAULT 60000;
ALTER TABLE "market_maker_configs" ADD COLUMN IF NOT EXISTS "last_refresh_at" TIMESTAMP(3);
-- ==================== 做市商挂单记录表 ====================
-- CreateTable
CREATE TABLE IF NOT EXISTS "market_maker_orders" (
"id" TEXT NOT NULL,
"market_maker_id" TEXT NOT NULL,
"order_id" TEXT NOT NULL,
"order_no" TEXT NOT NULL,
"side" TEXT NOT NULL,
"level" INTEGER NOT NULL,
"price" DECIMAL(30, 18) NOT NULL,
"quantity" DECIMAL(30, 8) NOT NULL,
"remaining_qty" DECIMAL(30, 8) NOT NULL,
"status" TEXT NOT NULL DEFAULT 'ACTIVE',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "market_maker_orders_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX IF NOT EXISTS "market_maker_orders_order_id_key" ON "market_maker_orders"("order_id");
-- CreateIndex
CREATE UNIQUE INDEX IF NOT EXISTS "market_maker_orders_order_no_key" ON "market_maker_orders"("order_no");
-- CreateIndex
CREATE INDEX IF NOT EXISTS "market_maker_orders_market_maker_id_side_status_idx" ON "market_maker_orders"("market_maker_id", "side", "status");
-- CreateIndex
CREATE INDEX IF NOT EXISTS "market_maker_orders_status_idx" ON "market_maker_orders"("status");
-- AddForeignKey (only if not exists)
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint WHERE conname = 'market_maker_orders_market_maker_id_fkey'
) THEN
ALTER TABLE "market_maker_orders" ADD CONSTRAINT "market_maker_orders_market_maker_id_fkey"
FOREIGN KEY ("market_maker_id") REFERENCES "market_maker_configs"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
END IF;
END $$;

View File

@ -1,10 +0,0 @@
-- ============================================================================
-- trading-service 添加交易手续费字段
-- 10%交易手续费进入积分股池(greenPoints)
-- ============================================================================
-- 添加手续费字段到 trades 表
ALTER TABLE "trades" ADD COLUMN IF NOT EXISTS "fee" DECIMAL(30, 8) NOT NULL DEFAULT 0;
-- 添加注释
COMMENT ON COLUMN "trades"."fee" IS '交易手续费10%进入积分股池)';

View File

@ -1,71 +0,0 @@
-- CreateEnum
CREATE TYPE "C2cOrderType" AS ENUM ('BUY', 'SELL');
-- CreateEnum
CREATE TYPE "C2cOrderStatus" AS ENUM ('PENDING', 'MATCHED', 'PAID', 'COMPLETED', 'CANCELLED', 'EXPIRED');
-- CreateEnum
CREATE TYPE "C2cPaymentMethod" AS ENUM ('ALIPAY', 'WECHAT', 'BANK');
-- CreateTable
CREATE TABLE "c2c_orders" (
"id" TEXT NOT NULL,
"order_no" TEXT NOT NULL,
"type" "C2cOrderType" NOT NULL,
"status" "C2cOrderStatus" NOT NULL DEFAULT 'PENDING',
"maker_account_sequence" TEXT NOT NULL,
"maker_user_id" TEXT,
"maker_phone" TEXT,
"maker_nickname" TEXT,
"taker_account_sequence" TEXT,
"taker_user_id" TEXT,
"taker_phone" TEXT,
"taker_nickname" TEXT,
"price" DECIMAL(30,18) NOT NULL,
"quantity" DECIMAL(30,8) NOT NULL,
"total_amount" DECIMAL(30,8) NOT NULL,
"min_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"max_amount" DECIMAL(30,8) NOT NULL DEFAULT 0,
"payment_method" "C2cPaymentMethod",
"payment_account" TEXT,
"payment_qr_code" TEXT,
"payment_real_name" TEXT,
"remark" TEXT,
"payment_timeout_minutes" INTEGER NOT NULL DEFAULT 15,
"confirm_timeout_minutes" INTEGER NOT NULL DEFAULT 60,
"payment_deadline" TIMESTAMP(3),
"confirm_deadline" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
"matched_at" TIMESTAMP(3),
"paid_at" TIMESTAMP(3),
"completed_at" TIMESTAMP(3),
"cancelled_at" TIMESTAMP(3),
"expired_at" TIMESTAMP(3),
CONSTRAINT "c2c_orders_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "c2c_orders_order_no_key" ON "c2c_orders"("order_no");
-- CreateIndex
CREATE INDEX "c2c_orders_status_idx" ON "c2c_orders"("status");
-- CreateIndex
CREATE INDEX "c2c_orders_type_status_idx" ON "c2c_orders"("type", "status");
-- CreateIndex
CREATE INDEX "c2c_orders_maker_account_sequence_idx" ON "c2c_orders"("maker_account_sequence");
-- CreateIndex
CREATE INDEX "c2c_orders_taker_account_sequence_idx" ON "c2c_orders"("taker_account_sequence");
-- CreateIndex
CREATE INDEX "c2c_orders_created_at_idx" ON "c2c_orders"("created_at" DESC);
-- CreateIndex
CREATE INDEX "c2c_orders_payment_deadline_idx" ON "c2c_orders"("payment_deadline");
-- CreateIndex
CREATE INDEX "c2c_orders_confirm_deadline_idx" ON "c2c_orders"("confirm_deadline");

View File

@ -1,2 +0,0 @@
-- Add original_quantity column to trades table
ALTER TABLE "trades" ADD COLUMN IF NOT EXISTS "original_quantity" DECIMAL(30, 8) NOT NULL DEFAULT 0;