SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE IF NOT EXISTS hyapp_wallet DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE hyapp_wallet; CREATE TABLE IF NOT EXISTS wallet_accounts ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', user_id BIGINT NOT NULL, asset_type VARCHAR(32) NOT NULL, available_amount BIGINT NOT NULL, frozen_amount BIGINT NOT NULL, version BIGINT NOT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, user_id, asset_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS wallet_transactions ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', transaction_id VARCHAR(96) NOT NULL, command_id VARCHAR(128) NOT NULL, biz_type VARCHAR(64) NOT NULL, status VARCHAR(32) NOT NULL, request_hash VARCHAR(128) NOT NULL, external_ref VARCHAR(128) NOT NULL DEFAULT '', metadata_json JSON NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, transaction_id), UNIQUE KEY uk_wallet_tx_command (app_code, command_id), KEY idx_wallet_tx_biz_time (app_code, biz_type, created_at_ms), KEY idx_wallet_tx_external_ref (app_code, external_ref) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS wallet_entries ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', entry_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, transaction_id VARCHAR(96) NOT NULL, user_id BIGINT NOT NULL, asset_type VARCHAR(32) NOT NULL, available_delta BIGINT NOT NULL, frozen_delta BIGINT NOT NULL, available_after BIGINT NOT NULL, frozen_after BIGINT NOT NULL, counterparty_user_id BIGINT NOT NULL DEFAULT 0, room_id VARCHAR(96) NOT NULL DEFAULT '', created_at_ms BIGINT NOT NULL, KEY idx_wallet_entries_user_time (app_code, user_id, created_at_ms), KEY idx_wallet_entries_tx (app_code, transaction_id), KEY idx_wallet_entries_asset_time (app_code, asset_type, created_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS wallet_outbox ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', event_id VARCHAR(128) NOT NULL, event_type VARCHAR(64) NOT NULL, transaction_id VARCHAR(96) NOT NULL, command_id VARCHAR(128) NOT NULL, user_id BIGINT NOT NULL, asset_type VARCHAR(32) NOT NULL, available_delta BIGINT NOT NULL, frozen_delta BIGINT NOT NULL, payload JSON NOT NULL, status VARCHAR(32) NOT NULL, retry_count INT NOT NULL DEFAULT 0, last_error TEXT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, event_id), KEY idx_wallet_outbox_pending (app_code, status, created_at_ms), KEY idx_wallet_outbox_tx (app_code, transaction_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS wallet_gift_prices ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', gift_id VARCHAR(96) NOT NULL, price_version VARCHAR(64) NOT NULL, status VARCHAR(32) NOT NULL, coin_price BIGINT NOT NULL, gift_point_amount BIGINT NOT NULL, heat_value BIGINT NOT NULL, effective_at_ms BIGINT NOT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, gift_id, price_version), KEY idx_wallet_gift_prices_effective (app_code, gift_id, status, effective_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS wallet_recharge_policies ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', policy_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, region_id BIGINT NOT NULL, policy_version VARCHAR(64) NOT NULL, status VARCHAR(32) NOT NULL, currency_code VARCHAR(3) NOT NULL DEFAULT 'USD', coin_amount BIGINT NOT NULL, usd_minor_amount BIGINT NOT NULL, effective_from_ms BIGINT NOT NULL, effective_to_ms BIGINT NULL, created_by_user_id BIGINT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, KEY idx_wallet_recharge_policies_active (app_code, region_id, status, effective_from_ms), UNIQUE KEY uk_wallet_recharge_policy_version (app_code, region_id, policy_version) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS wallet_recharge_records ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', transaction_id VARCHAR(96) NOT NULL, user_id BIGINT NOT NULL, seller_user_id BIGINT NOT NULL, seller_region_id BIGINT NOT NULL, target_region_id BIGINT NOT NULL, policy_id BIGINT NOT NULL, policy_version VARCHAR(64) NOT NULL, currency_code VARCHAR(3) NOT NULL, coin_amount BIGINT NOT NULL, usd_minor_amount BIGINT NOT NULL, exchange_coin_amount BIGINT NOT NULL, exchange_usd_minor_amount BIGINT NOT NULL, created_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, transaction_id), KEY idx_wallet_recharge_records_user_time (app_code, user_id, created_at_ms), KEY idx_wallet_recharge_records_seller_time (app_code, seller_user_id, created_at_ms), KEY idx_wallet_recharge_records_region_time (app_code, target_region_id, created_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS resources ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', resource_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, resource_code VARCHAR(96) NOT NULL, resource_type VARCHAR(32) NOT NULL, name VARCHAR(128) NOT NULL, status VARCHAR(32) NOT NULL, grantable BOOLEAN NOT NULL DEFAULT TRUE, grant_strategy VARCHAR(32) NOT NULL, wallet_asset_type VARCHAR(32) NOT NULL DEFAULT '', wallet_asset_amount BIGINT NOT NULL DEFAULT 0, usage_scope_json JSON NOT NULL, asset_url VARCHAR(512) NOT NULL DEFAULT '', preview_url VARCHAR(512) NOT NULL DEFAULT '', animation_url VARCHAR(512) NOT NULL DEFAULT '', metadata_json JSON NULL, sort_order INT NOT NULL DEFAULT 0, created_by_user_id BIGINT NOT NULL DEFAULT 0, updated_by_user_id BIGINT NOT NULL DEFAULT 0, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, UNIQUE KEY uk_resources_code (app_code, resource_code), KEY idx_resources_type_status (app_code, resource_type, status, sort_order) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS resource_groups ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', group_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, group_code VARCHAR(96) NOT NULL, name VARCHAR(128) NOT NULL, status VARCHAR(32) NOT NULL, description VARCHAR(512) NOT NULL DEFAULT '', sort_order INT NOT NULL DEFAULT 0, created_by_user_id BIGINT NOT NULL DEFAULT 0, updated_by_user_id BIGINT NOT NULL DEFAULT 0, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, UNIQUE KEY uk_resource_groups_code (app_code, group_code), KEY idx_resource_groups_status (app_code, status, sort_order) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS resource_group_items ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', group_item_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, group_id BIGINT NOT NULL, item_type VARCHAR(32) NOT NULL DEFAULT 'resource', resource_id BIGINT NOT NULL DEFAULT 0, wallet_asset_type VARCHAR(32) NOT NULL DEFAULT '', wallet_asset_amount BIGINT NOT NULL DEFAULT 0, quantity BIGINT NOT NULL DEFAULT 1, duration_ms BIGINT NOT NULL DEFAULT 0, sort_order INT NOT NULL DEFAULT 0, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, UNIQUE KEY uk_resource_group_items_member (app_code, group_id, item_type, resource_id, wallet_asset_type), KEY idx_resource_group_items_group (app_code, group_id, sort_order) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS gift_configs ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', gift_id VARCHAR(96) NOT NULL, resource_id BIGINT NOT NULL, status VARCHAR(32) NOT NULL, name VARCHAR(128) NOT NULL, sort_order INT NOT NULL DEFAULT 0, presentation_json JSON NULL, created_by_user_id BIGINT NOT NULL DEFAULT 0, updated_by_user_id BIGINT NOT NULL DEFAULT 0, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, gift_id), KEY idx_gift_configs_resource (app_code, resource_id), KEY idx_gift_configs_status_sort (app_code, status, sort_order) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS gift_config_regions ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', gift_id VARCHAR(96) NOT NULL, region_id BIGINT NOT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, gift_id, region_id), KEY idx_gift_config_regions_region (app_code, region_id, gift_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS resource_grants ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', grant_id VARCHAR(96) NOT NULL, command_id VARCHAR(128) NOT NULL, target_user_id BIGINT NOT NULL, grant_source VARCHAR(32) NOT NULL, grant_subject_type VARCHAR(32) NOT NULL, grant_subject_id VARCHAR(96) NOT NULL, status VARCHAR(32) NOT NULL, request_hash VARCHAR(128) NOT NULL, group_snapshot_json JSON NULL, reason VARCHAR(256) NOT NULL, operator_user_id BIGINT NOT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, grant_id), UNIQUE KEY uk_resource_grants_command (app_code, command_id), KEY idx_resource_grants_target_time (app_code, target_user_id, created_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS resource_grant_items ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', grant_item_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, grant_id VARCHAR(96) NOT NULL, resource_id BIGINT NOT NULL, resource_snapshot_json JSON NOT NULL, quantity BIGINT NOT NULL DEFAULT 1, duration_ms BIGINT NOT NULL DEFAULT 0, result_type VARCHAR(32) NOT NULL, wallet_transaction_id VARCHAR(96) NOT NULL DEFAULT '', entitlement_id VARCHAR(96) NOT NULL DEFAULT '', created_at_ms BIGINT NOT NULL, KEY idx_resource_grant_items_grant (app_code, grant_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_resource_entitlements ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', entitlement_id VARCHAR(96) NOT NULL, user_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, status VARCHAR(32) NOT NULL, quantity BIGINT NOT NULL DEFAULT 1, remaining_quantity BIGINT NOT NULL DEFAULT 1, effective_at_ms BIGINT NOT NULL, expires_at_ms BIGINT NOT NULL DEFAULT 0, source_grant_id VARCHAR(96) NOT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, entitlement_id), KEY idx_user_resource_active (app_code, user_id, resource_id, status, expires_at_ms), KEY idx_user_resource_user_type (app_code, user_id, status, updated_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_resource_equipment ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', user_id BIGINT NOT NULL, resource_type VARCHAR(32) NOT NULL, entitlement_id VARCHAR(96) NOT NULL, resource_id BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, user_id, resource_type), KEY idx_user_resource_equipment_user (app_code, user_id, updated_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT IGNORE INTO wallet_gift_prices ( app_code, gift_id, price_version, status, coin_price, gift_point_amount, heat_value, effective_at_ms, created_at_ms, updated_at_ms ) VALUES ('lalu', 'rose', 'v1', 'active', 10, 10, 10, 0, 0, 0), ('lalu', 'rocket', 'v1', 'active', 100, 100, 100, 0, 0, 0); INSERT IGNORE INTO resources ( app_code, resource_code, resource_type, name, status, grantable, grant_strategy, wallet_asset_type, wallet_asset_amount, usage_scope_json, asset_url, preview_url, animation_url, metadata_json, sort_order, created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms ) VALUES ('lalu', 'gift_rose', 'gift', 'Rose', 'active', TRUE, 'increase_quantity', '', 0, JSON_ARRAY('gift'), '', '', '', JSON_OBJECT(), 10, 0, 0, 0, 0), ('lalu', 'gift_rocket', 'gift', 'Rocket', 'active', TRUE, 'increase_quantity', '', 0, JSON_ARRAY('gift'), '', '', '', JSON_OBJECT(), 20, 0, 0, 0, 0); INSERT IGNORE INTO gift_configs ( app_code, gift_id, resource_id, status, name, sort_order, presentation_json, created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms ) SELECT 'lalu', 'rose', resource_id, 'active', 'Rose', 10, JSON_OBJECT(), 0, 0, 0, 0 FROM resources WHERE app_code = 'lalu' AND resource_code = 'gift_rose' LIMIT 1; INSERT IGNORE INTO gift_configs ( app_code, gift_id, resource_id, status, name, sort_order, presentation_json, created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms ) SELECT 'lalu', 'rocket', resource_id, 'active', 'Rocket', 20, JSON_OBJECT(), 0, 0, 0, 0 FROM resources WHERE app_code = 'lalu' AND resource_code = 'gift_rocket' LIMIT 1; INSERT IGNORE INTO gift_config_regions ( app_code, gift_id, region_id, created_at_ms, updated_at_ms ) SELECT gc.app_code, gc.gift_id, 0, 0, 0 FROM gift_configs gc LEFT JOIN gift_config_regions existing ON existing.app_code = gc.app_code AND existing.gift_id = gc.gift_id WHERE existing.gift_id IS NULL AND gc.app_code = 'lalu' AND gc.gift_id IN ('rose', 'rocket');