收口数据库初始化脚本

This commit is contained in:
yml
2026-05-25 22:31:50 +08:00
parent fcab660c67
commit 90ad866ecc
10 changed files with 49 additions and 99 deletions
+2
View File
@@ -80,6 +80,8 @@ docker compose -f docker-compose.dev.yml exec -T frontend npm run build
docker compose -f docker-compose.dev.yml exec -T backend npm run db:migrate
```
当前数据库脚本只保留新库初始化结构,不维护历史测试库的升级兼容;切换到这版前请重建开发库或重置 Docker volume。
## 环境变量
本地开发从根目录 `.env` 读取,模板为:
+1 -1
View File
@@ -68,7 +68,7 @@ npm test
- `src/services/fulfillment`:快手 Cloud 履约编排
- `src/services/admin`:后台读写、权限、配置管理
- `src/repositories`:数据库访问
- `src/db/migrations`数据库迁移
- `src/db/migrations`新库初始化脚本
## Docker 开发
@@ -68,6 +68,37 @@ CREATE TABLE IF NOT EXISTS sku_fulfillment_bindings (
CREATE INDEX IF NOT EXISTS idx_sku_fulfillment_bindings_lookup
ON sku_fulfillment_bindings(sku_code, provider, platform, shop_id, enabled, priority);
CREATE TABLE IF NOT EXISTS product_match_rules (
id BIGSERIAL PRIMARY KEY,
provider TEXT NOT NULL DEFAULT '',
platform TEXT NOT NULL DEFAULT '',
shop_id TEXT NOT NULL DEFAULT '',
external_item_id TEXT NOT NULL DEFAULT '',
external_sku_code TEXT NOT NULL DEFAULT '',
external_sku_name TEXT NOT NULL DEFAULT '',
external_sku_name_normalized TEXT NOT NULL DEFAULT '',
resolved_sku_code TEXT NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT TRUE,
priority INTEGER NOT NULL DEFAULT 100,
config_json JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_product_match_rules_unique
ON product_match_rules(
provider,
platform,
shop_id,
external_item_id,
external_sku_code,
external_sku_name_normalized,
resolved_sku_code
);
CREATE INDEX IF NOT EXISTS idx_product_match_rules_lookup
ON product_match_rules(provider, platform, shop_id, enabled, priority, id);
CREATE TABLE IF NOT EXISTS orders (
id BIGSERIAL PRIMARY KEY,
provider TEXT NOT NULL,
@@ -114,6 +145,7 @@ CREATE TABLE IF NOT EXISTS inventory_items (
source_type TEXT NOT NULL DEFAULT 'static_import',
status TEXT NOT NULL DEFAULT 'available',
invalid_reason TEXT NOT NULL DEFAULT '',
inventory_group_code TEXT NOT NULL DEFAULT '',
metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb,
consumed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL,
@@ -124,6 +156,20 @@ CREATE UNIQUE INDEX IF NOT EXISTS idx_inventory_items_unique_payload
ON inventory_items(sku_code, credential_type, md5(payload_json::text));
CREATE INDEX IF NOT EXISTS idx_inventory_items_pool
ON inventory_items(sku_code, credential_type, status, id);
CREATE INDEX IF NOT EXISTS idx_inventory_items_group_lookup
ON inventory_items(sku_code, credential_type, inventory_group_code, status, id);
CREATE TABLE IF NOT EXISTS admin_user_inventory_group_bindings (
id BIGSERIAL PRIMARY KEY,
admin_user_id BIGINT NOT NULL REFERENCES admin_users(id) ON DELETE CASCADE,
inventory_group_code TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
UNIQUE(admin_user_id, inventory_group_code)
);
CREATE INDEX IF NOT EXISTS idx_admin_user_inventory_group_bindings_user_id
ON admin_user_inventory_group_bindings(admin_user_id, inventory_group_code);
CREATE TABLE IF NOT EXISTS fulfillment_tasks (
id BIGSERIAL PRIMARY KEY,
@@ -1,30 +0,0 @@
CREATE TABLE IF NOT EXISTS product_match_rules (
id BIGSERIAL PRIMARY KEY,
provider TEXT NOT NULL DEFAULT '',
platform TEXT NOT NULL DEFAULT '',
shop_id TEXT NOT NULL DEFAULT '',
external_item_id TEXT NOT NULL DEFAULT '',
external_sku_code TEXT NOT NULL DEFAULT '',
external_sku_name TEXT NOT NULL DEFAULT '',
external_sku_name_normalized TEXT NOT NULL DEFAULT '',
resolved_sku_code TEXT NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT TRUE,
priority INTEGER NOT NULL DEFAULT 100,
config_json JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_product_match_rules_unique
ON product_match_rules(
provider,
platform,
shop_id,
external_item_id,
external_sku_code,
external_sku_name_normalized,
resolved_sku_code
);
CREATE INDEX IF NOT EXISTS idx_product_match_rules_lookup
ON product_match_rules(provider, platform, shop_id, enabled, priority, id);
@@ -1,17 +0,0 @@
ALTER TABLE inventory_items
ADD COLUMN IF NOT EXISTS inventory_group_code TEXT NOT NULL DEFAULT '';
CREATE INDEX IF NOT EXISTS idx_inventory_items_group_lookup
ON inventory_items(sku_code, credential_type, inventory_group_code, status, id);
CREATE TABLE IF NOT EXISTS admin_user_inventory_group_bindings (
id BIGSERIAL PRIMARY KEY,
admin_user_id BIGINT NOT NULL REFERENCES admin_users(id) ON DELETE CASCADE,
inventory_group_code TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
UNIQUE(admin_user_id, inventory_group_code)
);
CREATE INDEX IF NOT EXISTS idx_admin_user_inventory_group_bindings_user_id
ON admin_user_inventory_group_bindings(admin_user_id, inventory_group_code);
@@ -1 +0,0 @@
DROP TABLE IF EXISTS message_deliveries;
@@ -1,7 +0,0 @@
DO $$
BEGIN
IF to_regclass('public.tencent_browser_contexts') IS NOT NULL
AND to_regclass('public.task_runtime_contexts') IS NULL THEN
ALTER TABLE tencent_browser_contexts RENAME TO task_runtime_contexts;
END IF;
END $$;
@@ -1,7 +0,0 @@
DELETE FROM fulfillment_profiles
WHERE profile_key IN ('tencent_claim_redeem', 'tencent_claim_assisted')
AND NOT EXISTS (
SELECT 1
FROM fulfillment_tasks
WHERE fulfillment_tasks.profile_id = fulfillment_profiles.id
);
@@ -1,16 +0,0 @@
UPDATE inventory_items
SET credential_type = 'claim_code'
WHERE credential_type = 'tencent_code';
UPDATE fulfillment_profile_requirements
SET credential_type = 'claim_code'
WHERE credential_type = 'tencent_code';
UPDATE fulfillment_tasks
SET context_json = jsonb_set(
context_json,
'{primaryRequirement,credentialType}',
'"claim_code"'::jsonb,
false
)
WHERE context_json #>> '{primaryRequirement,credentialType}' = 'tencent_code';
@@ -1,20 +0,0 @@
DO $$
BEGIN
IF to_regclass('public.task_runtime_contexts') IS NOT NULL
AND EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'task_runtime_contexts'
AND column_name = 'browser_session_id'
)
AND NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'task_runtime_contexts'
AND column_name = 'runtime_session_id'
) THEN
ALTER TABLE task_runtime_contexts RENAME COLUMN browser_session_id TO runtime_session_id;
END IF;
END $$;