feat(M05-C): 完成团购验券与第三方直订

This commit is contained in:
Codex
2026-06-22 11:28:50 +08:00
parent 3ec74bb751
commit cda640baa0
17 changed files with 1654 additions and 13 deletions
@@ -0,0 +1,6 @@
DELETE FROM qipai_schema_migrations WHERE version = '2026062217';
DROP TABLE IF EXISTS qipai_direct_bookings;
DROP TABLE IF EXISTS qipai_group_redemptions;
DROP TABLE IF EXISTS qipai_group_vouchers;
DROP TABLE IF EXISTS qipai_third_party_mappings;
DROP TABLE IF EXISTS qipai_third_party_configs;
@@ -0,0 +1,118 @@
CREATE TABLE IF NOT EXISTS qipai_third_party_configs (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
store_id BIGINT UNSIGNED NULL,
provider VARCHAR(32) NOT NULL,
mode VARCHAR(16) NOT NULL DEFAULT 'MANUAL',
enabled TINYINT(1) NOT NULL DEFAULT 1,
credential_ref VARCHAR(255) NOT NULL DEFAULT '',
settings JSON NOT 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),
CONSTRAINT fk_qipai_third_party_config_tenant
FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
CONSTRAINT fk_qipai_third_party_config_store
FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
UNIQUE KEY uq_qipai_third_party_config_scope (tenant_id, provider, store_id),
KEY idx_qipai_third_party_config_resolution (tenant_id, provider, enabled, store_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS qipai_third_party_mappings (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
provider VARCHAR(32) NOT NULL,
resource_type VARCHAR(16) NOT NULL,
external_ref VARCHAR(128) NOT NULL,
local_resource_id BIGINT UNSIGNED NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
CONSTRAINT fk_qipai_third_party_mapping_tenant
FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
UNIQUE KEY uq_qipai_third_party_mapping_external
(tenant_id, provider, resource_type, external_ref),
KEY idx_qipai_third_party_mapping_local
(tenant_id, provider, resource_type, local_resource_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS qipai_group_vouchers (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
provider VARCHAR(32) NOT NULL,
voucher_hash CHAR(64) NOT NULL,
voucher_masked VARCHAR(64) NOT NULL,
external_product_id VARCHAR(128) NOT NULL DEFAULT '',
status VARCHAR(32) NOT NULL DEFAULT 'RECEIVED',
amount_cents INT UNSIGNED NOT NULL DEFAULT 0,
expires_at DATETIME(3) NULL,
redeemed_at DATETIME(3) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
CONSTRAINT fk_qipai_group_voucher_tenant
FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
UNIQUE KEY uq_qipai_group_voucher_hash (tenant_id, provider, voucher_hash),
KEY idx_qipai_group_voucher_status (tenant_id, provider, status, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS qipai_group_redemptions (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
voucher_id BIGINT UNSIGNED NOT NULL,
order_id BIGINT UNSIGNED NOT NULL,
store_id BIGINT UNSIGNED NOT NULL,
actor_id BIGINT UNSIGNED NULL,
redemption_mode VARCHAR(16) NOT NULL,
client_request_id VARCHAR(128) NOT NULL,
status VARCHAR(32) NOT NULL,
failure_code VARCHAR(64) NOT NULL DEFAULT '',
provider_response JSON NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
completed_at DATETIME(3) NULL,
CONSTRAINT fk_qipai_group_redemption_tenant
FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
CONSTRAINT fk_qipai_group_redemption_voucher
FOREIGN KEY (voucher_id) REFERENCES qipai_group_vouchers(id),
CONSTRAINT fk_qipai_group_redemption_order
FOREIGN KEY (order_id) REFERENCES qipai_orders(id),
CONSTRAINT fk_qipai_group_redemption_store
FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
UNIQUE KEY uq_qipai_group_redemption_request (tenant_id, client_request_id),
UNIQUE KEY uq_qipai_group_redemption_voucher (tenant_id, voucher_id),
KEY idx_qipai_group_redemption_status (tenant_id, status, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS qipai_direct_bookings (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
provider VARCHAR(32) NOT NULL,
event_id VARCHAR(128) NOT NULL,
external_booking_no VARCHAR(128) NOT NULL,
external_store_ref VARCHAR(128) NOT NULL,
external_room_ref VARCHAR(128) NOT NULL,
store_id BIGINT UNSIGNED NULL,
room_id BIGINT UNSIGNED NULL,
customer_ref_hash CHAR(64) NOT NULL DEFAULT '',
starts_at DATETIME(3) NOT NULL,
ends_at DATETIME(3) NOT NULL,
amount_cents INT UNSIGNED NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'PENDING_MAPPING',
order_id BIGINT UNSIGNED NULL,
claimed_user_id BIGINT UNSIGNED NULL,
payload JSON NOT NULL,
failure_code VARCHAR(64) NOT NULL DEFAULT '',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
claimed_at DATETIME(3) NULL,
CONSTRAINT fk_qipai_direct_booking_tenant
FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id),
CONSTRAINT fk_qipai_direct_booking_store
FOREIGN KEY (store_id) REFERENCES qipai_stores(id),
CONSTRAINT fk_qipai_direct_booking_room
FOREIGN KEY (room_id) REFERENCES qipai_rooms(id),
CONSTRAINT fk_qipai_direct_booking_order
FOREIGN KEY (order_id) REFERENCES qipai_orders(id),
UNIQUE KEY uq_qipai_direct_booking_event (tenant_id, provider, event_id),
UNIQUE KEY uq_qipai_direct_booking_no
(tenant_id, provider, external_booking_no),
KEY idx_qipai_direct_booking_status (tenant_id, provider, status, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT IGNORE INTO qipai_schema_migrations (version, name)
VALUES ('2026062217', 'm05c_third_party');
@@ -0,0 +1,23 @@
SELECT table_name FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name IN (
'qipai_third_party_configs', 'qipai_third_party_mappings',
'qipai_group_vouchers', 'qipai_group_redemptions', 'qipai_direct_bookings'
) ORDER BY table_name;
SELECT table_name, index_name FROM information_schema.statistics
WHERE table_schema = DATABASE()
AND ((table_name = 'qipai_group_vouchers'
AND index_name = 'uq_qipai_group_voucher_hash')
OR (table_name = 'qipai_group_redemptions'
AND index_name IN (
'uq_qipai_group_redemption_request', 'uq_qipai_group_redemption_voucher'
))
OR (table_name = 'qipai_direct_bookings'
AND index_name IN (
'uq_qipai_direct_booking_event', 'uq_qipai_direct_booking_no'
))
OR (table_name = 'qipai_third_party_mappings'
AND index_name = 'uq_qipai_third_party_mapping_external'))
GROUP BY table_name, index_name ORDER BY table_name, index_name;
SELECT version, name FROM qipai_schema_migrations WHERE version = '2026062217';