feat(M01-B): 建立核心迁移与MySQL连接池
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
-- Roll back M01-B core schema baseline.
|
||||
-- This down migration is intended for empty development databases or pre-production rehearsals only.
|
||||
|
||||
DROP TABLE IF EXISTS qipai_legacy_table_mappings;
|
||||
DROP TABLE IF EXISTS qipai_audit_logs;
|
||||
DROP TABLE IF EXISTS qipai_devices;
|
||||
DROP TABLE IF EXISTS qipai_payments;
|
||||
DROP TABLE IF EXISTS qipai_orders;
|
||||
DROP TABLE IF EXISTS qipai_members;
|
||||
DROP TABLE IF EXISTS qipai_rooms;
|
||||
DROP TABLE IF EXISTS qipai_stores;
|
||||
DROP TABLE IF EXISTS qipai_tenants;
|
||||
DROP TABLE IF EXISTS qipai_schema_migrations;
|
||||
@@ -0,0 +1,184 @@
|
||||
-- M01-B core schema baseline.
|
||||
-- Time columns are stored as UTC DATETIME(3). Amount columns use integer cents.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_schema_migrations (
|
||||
version VARCHAR(32) NOT NULL PRIMARY KEY,
|
||||
name VARCHAR(128) NOT NULL,
|
||||
applied_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_tenants (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
code VARCHAR(64) NOT NULL,
|
||||
name VARCHAR(128) NOT NULL,
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
|
||||
timezone VARCHAR(64) NOT NULL DEFAULT 'Asia/Shanghai',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
deleted_at DATETIME(3) NULL,
|
||||
UNIQUE KEY uq_qipai_tenants_code (code),
|
||||
KEY idx_qipai_tenants_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_stores (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
legacy_store_id BIGINT UNSIGNED NULL,
|
||||
name VARCHAR(128) NOT NULL,
|
||||
address VARCHAR(255) NOT NULL DEFAULT '',
|
||||
contact_phone VARCHAR(32) NOT NULL DEFAULT '',
|
||||
timezone VARCHAR(64) NOT NULL DEFAULT 'Asia/Shanghai',
|
||||
business_status VARCHAR(32) NOT NULL DEFAULT 'OPEN',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
deleted_at DATETIME(3) NULL,
|
||||
CONSTRAINT fk_qipai_stores_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
|
||||
UNIQUE KEY uq_qipai_stores_tenant_legacy (tenant_id, legacy_store_id),
|
||||
KEY idx_qipai_stores_tenant_status (tenant_id, business_status),
|
||||
KEY idx_qipai_stores_deleted_at (deleted_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_rooms (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
store_id BIGINT UNSIGNED NOT NULL,
|
||||
legacy_room_id BIGINT UNSIGNED NULL,
|
||||
name VARCHAR(128) NOT NULL,
|
||||
room_no VARCHAR(64) NOT NULL,
|
||||
capacity INT UNSIGNED NOT NULL DEFAULT 4,
|
||||
base_price_cents INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'AVAILABLE',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
deleted_at DATETIME(3) NULL,
|
||||
CONSTRAINT fk_qipai_rooms_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
|
||||
CONSTRAINT fk_qipai_rooms_store FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
|
||||
UNIQUE KEY uq_qipai_rooms_store_no (tenant_id, store_id, room_no),
|
||||
UNIQUE KEY uq_qipai_rooms_tenant_legacy (tenant_id, legacy_room_id),
|
||||
KEY idx_qipai_rooms_tenant_status (tenant_id, status),
|
||||
KEY idx_qipai_rooms_deleted_at (deleted_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_members (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
legacy_member_id BIGINT UNSIGNED NULL,
|
||||
openid VARCHAR(128) NULL,
|
||||
unionid VARCHAR(128) NULL,
|
||||
nickname VARCHAR(128) NOT NULL DEFAULT '',
|
||||
phone VARCHAR(32) NOT NULL DEFAULT '',
|
||||
balance_cents INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
deleted_at DATETIME(3) NULL,
|
||||
CONSTRAINT fk_qipai_members_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
|
||||
UNIQUE KEY uq_qipai_members_tenant_openid (tenant_id, openid),
|
||||
UNIQUE KEY uq_qipai_members_tenant_legacy (tenant_id, legacy_member_id),
|
||||
KEY idx_qipai_members_tenant_phone (tenant_id, phone),
|
||||
KEY idx_qipai_members_deleted_at (deleted_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_orders (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
store_id BIGINT UNSIGNED NOT NULL,
|
||||
room_id BIGINT UNSIGNED NOT NULL,
|
||||
member_id BIGINT UNSIGNED NULL,
|
||||
legacy_order_id BIGINT UNSIGNED NULL,
|
||||
order_no VARCHAR(64) NOT NULL,
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'DRAFT',
|
||||
start_at DATETIME(3) NOT NULL,
|
||||
end_at DATETIME(3) NOT NULL,
|
||||
total_amount_cents INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
paid_amount_cents INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
deleted_at DATETIME(3) NULL,
|
||||
CONSTRAINT fk_qipai_orders_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
|
||||
CONSTRAINT fk_qipai_orders_store FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
|
||||
CONSTRAINT fk_qipai_orders_room FOREIGN KEY (room_id) REFERENCES qipai_rooms(id),
|
||||
CONSTRAINT fk_qipai_orders_member FOREIGN KEY (member_id) REFERENCES qipai_members(id),
|
||||
UNIQUE KEY uq_qipai_orders_tenant_order_no (tenant_id, order_no),
|
||||
UNIQUE KEY uq_qipai_orders_tenant_legacy (tenant_id, legacy_order_id),
|
||||
KEY idx_qipai_orders_room_time (tenant_id, room_id, start_at, end_at),
|
||||
KEY idx_qipai_orders_tenant_status (tenant_id, status),
|
||||
KEY idx_qipai_orders_deleted_at (deleted_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_payments (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
order_id BIGINT UNSIGNED NOT NULL,
|
||||
legacy_pay_order_id BIGINT UNSIGNED NULL,
|
||||
payment_no VARCHAR(64) NOT NULL,
|
||||
channel VARCHAR(32) NOT NULL DEFAULT 'WECHAT',
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'PENDING',
|
||||
amount_cents INT UNSIGNED NOT NULL,
|
||||
paid_at DATETIME(3) NULL,
|
||||
raw_notify JSON NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
deleted_at DATETIME(3) NULL,
|
||||
CONSTRAINT fk_qipai_payments_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
|
||||
CONSTRAINT fk_qipai_payments_order FOREIGN KEY (order_id) REFERENCES qipai_orders(id),
|
||||
UNIQUE KEY uq_qipai_payments_tenant_payment_no (tenant_id, payment_no),
|
||||
UNIQUE KEY uq_qipai_payments_tenant_legacy (tenant_id, legacy_pay_order_id),
|
||||
KEY idx_qipai_payments_tenant_status (tenant_id, status),
|
||||
KEY idx_qipai_payments_deleted_at (deleted_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_devices (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
store_id BIGINT UNSIGNED NOT NULL,
|
||||
room_id BIGINT UNSIGNED NULL,
|
||||
legacy_device_id BIGINT UNSIGNED NULL,
|
||||
device_id VARCHAR(64) NOT NULL,
|
||||
imei VARCHAR(64) NOT NULL DEFAULT '',
|
||||
device_type VARCHAR(32) NOT NULL,
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'OFFLINE',
|
||||
last_seen_at DATETIME(3) NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
deleted_at DATETIME(3) NULL,
|
||||
CONSTRAINT fk_qipai_devices_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
|
||||
CONSTRAINT fk_qipai_devices_store FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
|
||||
CONSTRAINT fk_qipai_devices_room FOREIGN KEY (room_id) REFERENCES qipai_rooms(id),
|
||||
UNIQUE KEY uq_qipai_devices_tenant_device (tenant_id, device_id),
|
||||
UNIQUE KEY uq_qipai_devices_tenant_legacy (tenant_id, legacy_device_id),
|
||||
KEY idx_qipai_devices_tenant_type_status (tenant_id, device_type, status),
|
||||
KEY idx_qipai_devices_deleted_at (deleted_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_audit_logs (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
actor_type VARCHAR(32) NOT NULL,
|
||||
actor_id BIGINT UNSIGNED NULL,
|
||||
action VARCHAR(128) NOT NULL,
|
||||
resource_type VARCHAR(64) NOT NULL,
|
||||
resource_id BIGINT UNSIGNED NULL,
|
||||
trace_id VARCHAR(128) NOT NULL,
|
||||
ip VARCHAR(64) NOT NULL DEFAULT '',
|
||||
user_agent VARCHAR(255) NOT NULL DEFAULT '',
|
||||
metadata JSON NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
CONSTRAINT fk_qipai_audit_logs_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
|
||||
KEY idx_qipai_audit_logs_tenant_time (tenant_id, created_at),
|
||||
KEY idx_qipai_audit_logs_trace_id (trace_id),
|
||||
KEY idx_qipai_audit_logs_resource (tenant_id, resource_type, resource_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qipai_legacy_table_mappings (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
legacy_table VARCHAR(128) NOT NULL,
|
||||
new_table VARCHAR(128) NOT NULL,
|
||||
strategy VARCHAR(32) NOT NULL,
|
||||
note VARCHAR(512) NOT NULL DEFAULT '',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
UNIQUE KEY uq_qipai_legacy_table_mappings_pair (legacy_table, new_table)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
INSERT IGNORE INTO qipai_schema_migrations (version, name)
|
||||
VALUES ('2026061601', 'm01b_core_schema');
|
||||
@@ -0,0 +1,37 @@
|
||||
-- Verify that the M01-B core schema baseline exists.
|
||||
|
||||
SELECT table_name
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name IN (
|
||||
'qipai_schema_migrations',
|
||||
'qipai_tenants',
|
||||
'qipai_stores',
|
||||
'qipai_rooms',
|
||||
'qipai_members',
|
||||
'qipai_orders',
|
||||
'qipai_payments',
|
||||
'qipai_devices',
|
||||
'qipai_audit_logs',
|
||||
'qipai_legacy_table_mappings'
|
||||
)
|
||||
ORDER BY table_name;
|
||||
|
||||
SELECT table_name, column_name
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name IN (
|
||||
'qipai_stores',
|
||||
'qipai_rooms',
|
||||
'qipai_members',
|
||||
'qipai_orders',
|
||||
'qipai_payments',
|
||||
'qipai_devices',
|
||||
'qipai_audit_logs'
|
||||
)
|
||||
AND column_name IN ('tenant_id', 'created_at', 'updated_at', 'deleted_at')
|
||||
ORDER BY table_name, column_name;
|
||||
|
||||
SELECT version, name
|
||||
FROM qipai_schema_migrations
|
||||
WHERE version = '2026061601';
|
||||
Reference in New Issue
Block a user