ALTER TABLE orders ADD COLUMN currency VARCHAR(10) NOT NULL DEFAULT 'CNY', ADD COLUMN provider VARCHAR(30) NOT NULL DEFAULT '', ADD COLUMN provider_amount VARCHAR(32) NOT NULL DEFAULT '', ADD COLUMN provider_order_id VARCHAR(128) NOT NULL DEFAULT '', ADD COLUMN provider_transaction_id VARCHAR(128) NOT NULL DEFAULT '', ADD COLUMN customer_email VARCHAR(254) NOT NULL DEFAULT '', ADD COLUMN report_id VARCHAR(64) NOT NULL DEFAULT '', ADD COLUMN access_code VARCHAR(20) NULL, ADD COLUMN checkout_url VARCHAR(1024) NOT NULL DEFAULT ''; CREATE INDEX idx_orders_provider ON orders(provider); CREATE INDEX idx_orders_provider_order_id ON orders(provider_order_id); CREATE INDEX idx_orders_provider_transaction_id ON orders(provider_transaction_id); CREATE INDEX idx_orders_customer_email ON orders(customer_email); CREATE INDEX idx_orders_report_id ON orders(report_id); CREATE UNIQUE INDEX idx_orders_access_code ON orders(access_code); CREATE TABLE report_products ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, code VARCHAR(40) NOT NULL UNIQUE, name VARCHAR(100) NOT NULL, description VARCHAR(255) NOT NULL DEFAULT '', stripe_amount INT NOT NULL, stripe_currency VARCHAR(10) NOT NULL, binance_amount VARCHAR(32) NOT NULL, binance_currency VARCHAR(10) NOT NULL, status TINYINT NOT NULL DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE report_entitlements ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id BIGINT UNSIGNED NOT NULL, report_id VARCHAR(64) NOT NULL, order_id BIGINT UNSIGNED NOT NULL UNIQUE, status VARCHAR(20) NOT NULL DEFAULT 'active', granted_at TIMESTAMP NOT NULL, revoked_at TIMESTAMP NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY idx_user_report (user_id, report_id), INDEX idx_report_entitlements_user_id (user_id), INDEX idx_report_entitlements_report_id (report_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE report_snapshots ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id BIGINT UNSIGNED NOT NULL, report_id VARCHAR(64) NOT NULL, order_id BIGINT UNSIGNED NOT NULL UNIQUE, snapshot LONGTEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_report_snapshots_user_id (user_id), INDEX idx_report_snapshots_report_id (report_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE payment_events ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, provider VARCHAR(30) NOT NULL, provider_event_id VARCHAR(128) NOT NULL, event_type VARCHAR(80) NOT NULL, order_no VARCHAR(32) NOT NULL, payload_hash VARCHAR(64) NOT NULL, processed_at TIMESTAMP NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY idx_provider_event (provider, provider_event_id), INDEX idx_payment_events_order_no (order_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE email_login_codes ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, email VARCHAR(254) NOT NULL, code_hash VARCHAR(64) NOT NULL, attempts INT NOT NULL DEFAULT 0, expires_at TIMESTAMP NOT NULL, used_at TIMESTAMP NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_email_login_codes_email (email), INDEX idx_email_login_codes_expires_at (expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO report_products (code, name, description, stripe_amount, stripe_currency, binance_amount, binance_currency, status) VALUES ('bazi_full_report', '八字完整精批报告', '六大主题与十步大运完整解读', 499, 'USD', '5.00', 'USDT', 1) ON DUPLICATE KEY UPDATE name = VALUES(name), description = VALUES(description), stripe_amount = VALUES(stripe_amount), stripe_currency = VALUES(stripe_currency), binance_amount = VALUES(binance_amount), binance_currency = VALUES(binance_currency), status = VALUES(status);