-- 产品全案素材类型 - 数据库迁移脚本 -- 执行前请先备份数据库! -- 1. Material 表新增字段 ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "task_no" TEXT; ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "task_status" TEXT; ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "task_fetched_at" TIMESTAMP(3); -- 创建唯一索引(如果不存在) CREATE UNIQUE INDEX IF NOT EXISTS "materials_task_no_key" ON "materials"("task_no") WHERE "task_no" IS NOT NULL; -- 创建普通索引 CREATE INDEX IF NOT EXISTS "materials_task_no_idx" ON "materials"("task_no"); CREATE INDEX IF NOT EXISTS "materials_task_status_idx" ON "materials"("task_status"); -- 2. DepartmentMaterialPermission 表新增字段 ALTER TABLE "department_material_permissions" ADD COLUMN IF NOT EXISTS "can_download_source" BOOLEAN NOT NULL DEFAULT false; -- 3. 创建 MaterialAsset 表 CREATE TABLE IF NOT EXISTS "material_assets" ( "id" TEXT NOT NULL, "material_id" TEXT NOT NULL, "asset_type" TEXT NOT NULL, "file_url" TEXT NOT NULL, "file_name" TEXT, "file_size" BIGINT NOT NULL DEFAULT 0, "sort_order" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "material_assets_pkey" PRIMARY KEY ("id") ); -- 创建索引 CREATE INDEX IF NOT EXISTS "material_assets_material_id_idx" ON "material_assets"("material_id"); CREATE INDEX IF NOT EXISTS "material_assets_asset_type_idx" ON "material_assets"("asset_type"); CREATE INDEX IF NOT EXISTS "material_assets_sort_order_idx" ON "material_assets"("sort_order"); -- 添加外键约束(如果不存在) DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.table_constraints WHERE constraint_schema = 'public' AND table_name = 'material_assets' AND constraint_name = 'material_assets_material_id_fkey' ) THEN ALTER TABLE "material_assets" ADD CONSTRAINT "material_assets_material_id_fkey" FOREIGN KEY ("material_id") REFERENCES "materials"("id") ON DELETE CASCADE ON UPDATE CASCADE; END IF; END $$; -- 4. 创建 ApiKey 表 CREATE TABLE IF NOT EXISTS "api_keys" ( "id" TEXT NOT NULL, "name" TEXT NOT NULL, "key" TEXT NOT NULL, "is_active" BOOLEAN NOT NULL DEFAULT true, "created_by" TEXT NOT NULL, "last_used_at" TIMESTAMP(3), "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "api_keys_pkey" PRIMARY KEY ("id") ); -- 创建唯一索引 CREATE UNIQUE INDEX IF NOT EXISTS "api_keys_key_key" ON "api_keys"("key"); CREATE INDEX IF NOT EXISTS "api_keys_key_idx" ON "api_keys"("key"); CREATE INDEX IF NOT EXISTS "api_keys_is_active_idx" ON "api_keys"("is_active"); -- 5. 创建 ApiCallLog 表 CREATE TABLE IF NOT EXISTS "api_call_logs" ( "id" TEXT NOT NULL, "api_key_id" TEXT NOT NULL, "endpoint" TEXT NOT NULL, "method" TEXT NOT NULL, "task_no" TEXT, "status_code" INTEGER NOT NULL, "duration" INTEGER NOT NULL, "ip_address" TEXT, "user_agent" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "api_call_logs_pkey" PRIMARY KEY ("id") ); -- 创建索引 CREATE INDEX IF NOT EXISTS "api_call_logs_api_key_id_idx" ON "api_call_logs"("api_key_id"); CREATE INDEX IF NOT EXISTS "api_call_logs_task_no_idx" ON "api_call_logs"("task_no"); CREATE INDEX IF NOT EXISTS "api_call_logs_created_at_idx" ON "api_call_logs"("created_at"); -- 添加外键约束(如果不存在) DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.table_constraints WHERE constraint_schema = 'public' AND table_name = 'api_call_logs' AND constraint_name = 'api_call_logs_api_key_id_fkey' ) THEN ALTER TABLE "api_call_logs" ADD CONSTRAINT "api_call_logs_api_key_id_fkey" FOREIGN KEY ("api_key_id") REFERENCES "api_keys"("id") ON DELETE CASCADE ON UPDATE CASCADE; END IF; END $$; -- 完成 SELECT '产品全案数据库迁移完成' as message;