Files
Aether/crates/aether-data/schema/drivers/mysql/baseline/005_wallet_billing.sql
2026-05-06 02:22:32 +08:00

184 lines
6.7 KiB
SQL

CREATE TABLE IF NOT EXISTS wallets (
id VARCHAR(64) PRIMARY KEY,
user_id VARCHAR(64),
api_key_id VARCHAR(64),
balance DOUBLE NOT NULL DEFAULT 0,
gift_balance DOUBLE NOT NULL DEFAULT 0,
limit_mode VARCHAR(64) NOT NULL DEFAULT 'finite',
currency VARCHAR(16) NOT NULL DEFAULT 'USD',
status VARCHAR(64) NOT NULL DEFAULT 'active',
total_recharged DOUBLE NOT NULL DEFAULT 0,
total_consumed DOUBLE NOT NULL DEFAULT 0,
total_refunded DOUBLE NOT NULL DEFAULT 0,
total_adjusted DOUBLE NOT NULL DEFAULT 0,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY wallets_user_id_key (user_id),
UNIQUE KEY wallets_api_key_id_key (api_key_id),
KEY wallets_api_key_id_idx (api_key_id),
KEY wallets_user_id_idx (user_id)
);
CREATE TABLE IF NOT EXISTS wallet_transactions (
id VARCHAR(64) PRIMARY KEY,
wallet_id VARCHAR(64) NOT NULL,
category VARCHAR(64) NOT NULL,
reason_code VARCHAR(64) NOT NULL,
amount DOUBLE NOT NULL,
balance_before DOUBLE NOT NULL,
balance_after DOUBLE NOT NULL,
recharge_balance_before DOUBLE NOT NULL,
recharge_balance_after DOUBLE NOT NULL,
gift_balance_before DOUBLE NOT NULL,
gift_balance_after DOUBLE NOT NULL,
link_type VARCHAR(64),
link_id VARCHAR(128),
operator_id VARCHAR(64),
description TEXT,
created_at BIGINT NOT NULL,
KEY idx_wallet_tx_wallet_created (wallet_id, created_at),
KEY idx_wallet_tx_category_created (category, created_at),
KEY idx_wallet_tx_reason_created (reason_code, created_at),
KEY idx_wallet_tx_link (link_type, link_id),
KEY ix_wallet_transactions_operator_id (operator_id)
);
CREATE TABLE IF NOT EXISTS wallet_daily_usage_ledgers (
id VARCHAR(64) PRIMARY KEY,
wallet_id VARCHAR(64) NOT NULL,
billing_date VARCHAR(16) NOT NULL,
billing_timezone VARCHAR(64) NOT NULL,
total_cost_usd DOUBLE NOT NULL DEFAULT 0,
total_requests BIGINT NOT NULL DEFAULT 0,
input_tokens BIGINT NOT NULL DEFAULT 0,
output_tokens BIGINT NOT NULL DEFAULT 0,
cache_creation_tokens BIGINT NOT NULL DEFAULT 0,
cache_read_tokens BIGINT NOT NULL DEFAULT 0,
first_finalized_at BIGINT,
last_finalized_at BIGINT,
aggregated_at BIGINT NOT NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY idx_wallet_daily_usage_wallet_date (wallet_id, billing_timezone, billing_date)
);
CREATE TABLE IF NOT EXISTS payment_orders (
id VARCHAR(64) PRIMARY KEY,
order_no VARCHAR(128) NOT NULL,
wallet_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64),
amount_usd DOUBLE NOT NULL,
pay_amount DOUBLE,
pay_currency VARCHAR(16),
exchange_rate DOUBLE,
refunded_amount_usd DOUBLE NOT NULL DEFAULT 0,
refundable_amount_usd DOUBLE NOT NULL DEFAULT 0,
payment_method VARCHAR(64) NOT NULL,
gateway_order_id VARCHAR(128),
gateway_response TEXT,
status VARCHAR(64) NOT NULL DEFAULT 'pending',
created_at BIGINT NOT NULL,
paid_at BIGINT,
credited_at BIGINT,
expires_at BIGINT,
UNIQUE KEY uq_payment_orders_order_no (order_no),
KEY idx_payment_orders_wallet_created (wallet_id, created_at),
KEY idx_payment_orders_user_created (user_id, created_at),
KEY idx_payment_orders_status (status),
KEY idx_payment_orders_gateway_order_id (gateway_order_id)
);
CREATE TABLE IF NOT EXISTS payment_callbacks (
id VARCHAR(64) PRIMARY KEY,
payment_order_id VARCHAR(64),
payment_method VARCHAR(64) NOT NULL,
callback_key VARCHAR(128) NOT NULL,
order_no VARCHAR(128),
gateway_order_id VARCHAR(128),
payload_hash VARCHAR(128),
signature_valid TINYINT(1) NOT NULL DEFAULT 0,
status VARCHAR(64) NOT NULL DEFAULT 'received',
payload TEXT,
error_message TEXT,
created_at BIGINT NOT NULL,
processed_at BIGINT,
UNIQUE KEY uq_payment_callbacks_callback_key (callback_key),
KEY idx_payment_callbacks_order (order_no),
KEY idx_payment_callbacks_gateway_order (gateway_order_id),
KEY idx_payment_callbacks_created (created_at),
KEY ix_payment_callbacks_payment_order_id (payment_order_id)
);
CREATE TABLE IF NOT EXISTS refund_requests (
id VARCHAR(64) PRIMARY KEY,
refund_no VARCHAR(128) NOT NULL,
wallet_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64),
payment_order_id VARCHAR(64),
source_type VARCHAR(64) NOT NULL,
source_id VARCHAR(128),
refund_mode VARCHAR(64) NOT NULL,
amount_usd DOUBLE NOT NULL,
status VARCHAR(64) NOT NULL DEFAULT 'pending_approval',
reason TEXT,
requested_by VARCHAR(64),
approved_by VARCHAR(64),
processed_by VARCHAR(64),
gateway_refund_id VARCHAR(128),
payout_method VARCHAR(64),
payout_reference VARCHAR(255),
payout_proof TEXT,
failure_reason TEXT,
idempotency_key VARCHAR(128),
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
processed_at BIGINT,
completed_at BIGINT,
UNIQUE KEY uq_refund_requests_refund_no (refund_no),
UNIQUE KEY uq_refund_requests_idempotency_key (idempotency_key),
KEY idx_refund_wallet_created (wallet_id, created_at),
KEY idx_refund_user_created (user_id, created_at),
KEY idx_refund_status (status),
KEY ix_refund_requests_payment_order_id (payment_order_id),
KEY ix_refund_requests_requested_by (requested_by),
KEY ix_refund_requests_approved_by (approved_by),
KEY ix_refund_requests_processed_by (processed_by)
);
CREATE TABLE IF NOT EXISTS redeem_code_batches (
id VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
amount_usd DOUBLE NOT NULL,
currency VARCHAR(16) NOT NULL DEFAULT 'USD',
balance_bucket VARCHAR(64) NOT NULL DEFAULT 'gift',
total_count INT NOT NULL,
status VARCHAR(64) NOT NULL DEFAULT 'active',
description TEXT,
created_by VARCHAR(64),
expires_at BIGINT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY idx_redeem_code_batches_status (status, created_at)
);
CREATE TABLE IF NOT EXISTS redeem_codes (
id VARCHAR(64) PRIMARY KEY,
batch_id VARCHAR(64) NOT NULL,
code_hash VARCHAR(128) NOT NULL,
code_prefix VARCHAR(16) NOT NULL,
code_suffix VARCHAR(16) NOT NULL,
status VARCHAR(64) NOT NULL DEFAULT 'active',
redeemed_by_user_id VARCHAR(64),
redeemed_wallet_id VARCHAR(64),
redeemed_payment_order_id VARCHAR(64),
redeemed_at BIGINT,
disabled_by VARCHAR(64),
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY uq_redeem_codes_code_hash (code_hash),
KEY idx_redeem_codes_batch_created (batch_id, created_at),
KEY idx_redeem_codes_status (status, updated_at),
KEY idx_redeem_codes_redeemed_user (redeemed_by_user_id, redeemed_at),
KEY idx_redeem_codes_redeemed_order (redeemed_payment_order_id)
);