CREATE TABLE IF NOT EXISTS membership_plans ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, code VARCHAR(30) NOT NULL, name VARCHAR(50) NOT NULL, level TINYINT UNSIGNED NOT NULL, duration_days INT UNSIGNED NOT NULL, price_cent INT UNSIGNED NOT NULL, original_price_cent INT UNSIGNED NOT NULL, status TINYINT UNSIGNED NOT NULL DEFAULT 1, sort_order INT 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), PRIMARY KEY (id), UNIQUE KEY uk_plan_code (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS benefit_definitions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, benefit_key VARCHAR(50) NOT NULL, name VARCHAR(100) NOT NULL, value_type VARCHAR(20) NOT NULL, description VARCHAR(255) NOT NULL DEFAULT '', PRIMARY KEY (id), UNIQUE KEY uk_benefit_key (benefit_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS plan_benefits ( plan_id BIGINT UNSIGNED NOT NULL, benefit_id BIGINT UNSIGNED NOT NULL, benefit_value VARCHAR(255) NOT NULL, PRIMARY KEY (plan_id, benefit_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS subscriptions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, plan_id BIGINT UNSIGNED NOT NULL, source VARCHAR(30) NOT NULL, status TINYINT UNSIGNED NOT NULL DEFAULT 1, started_at DATETIME(3) NOT NULL, expires_at DATETIME(3) NOT NULL, auto_renew TINYINT(1) 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), PRIMARY KEY (id), KEY idx_sub_user_expire (user_id, expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_entitlements ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, benefit_key VARCHAR(50) NOT NULL, benefit_value VARCHAR(255) NOT NULL, source_type VARCHAR(30) NOT NULL, source_id BIGINT UNSIGNED NOT NULL, started_at DATETIME(3) NOT NULL, expires_at DATETIME(3) NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_entitlement_user_key (user_id, benefit_key, expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS orders ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, order_no VARCHAR(40) NOT NULL, user_id BIGINT UNSIGNED NOT NULL, product_type VARCHAR(30) NOT NULL, product_id BIGINT UNSIGNED NOT NULL, amount_cent INT UNSIGNED NOT NULL, currency CHAR(3) NOT NULL DEFAULT 'CNY', status VARCHAR(20) NOT NULL DEFAULT 'CREATED', channel VARCHAR(30) NOT NULL DEFAULT '', paid_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), PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_order_user_created (user_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;