-- +goose Up ALTER TABLE users ADD COLUMN invite_code VARCHAR(32) NULL COMMENT '用户专属邀请码' AFTER register_track_code, ADD COLUMN invited_by_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '邀请人用户ID' AFTER invite_code, ADD COLUMN invite_verified_at DATETIME NULL COMMENT '被邀请人生效实名时间' AFTER invited_by_id, ADD UNIQUE KEY uk_users_invite_code (invite_code), ADD KEY idx_users_invited_by_id (invited_by_id); CREATE TABLE user_invitations ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, inviter_id BIGINT UNSIGNED NOT NULL COMMENT '邀请人用户ID', invitee_id BIGINT UNSIGNED NOT NULL COMMENT '被邀请人用户ID', distribution_site_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属分销站点ID (0=主站)', invite_code VARCHAR(32) NOT NULL DEFAULT '' COMMENT '当时使用的邀请码', status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT '状态: pending=注册待实名, active=已实名生效, invalid=已失效', verified_at DATETIME NULL COMMENT '被邀请人实名通过时间(首月计时起点)', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_user_invitations_invitee (invitee_id), KEY idx_user_invitations_inviter (inviter_id, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户邀请关系表'; CREATE TABLE invitation_rebate_configs ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, distribution_site_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属分销站点ID (0=主站全局默认)', first_month_rate DECIMAL(6,4) NOT NULL DEFAULT 0.6000 COMMENT '首月返利比例 (默认0.60)', second_month_rate DECIMAL(6,4) NOT NULL DEFAULT 0.3000 COMMENT '次月返利比例 (默认0.30)', subsequent_rate DECIMAL(6,4) NOT NULL DEFAULT 0.1500 COMMENT '往后返利比例 (默认0.15)', enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用返利', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_invitation_rebate_configs_site (distribution_site_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='邀请返利比例配置表'; INSERT INTO invitation_rebate_configs (distribution_site_id, first_month_rate, second_month_rate, subsequent_rate, enabled, created_at, updated_at) VALUES (0, 0.6000, 0.3000, 0.1500, 1, NOW(), NOW()) ON DUPLICATE KEY UPDATE updated_at = NOW(); CREATE TABLE invitation_rebate_ledgers ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, order_id BIGINT UNSIGNED NOT NULL COMMENT '关联订单ID', order_no VARCHAR(64) NOT NULL COMMENT '订单号', distribution_site_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '分担成本的站点ID (0=主站)', inviter_id BIGINT UNSIGNED NOT NULL COMMENT '获得返利的用户ID', invitee_id BIGINT UNSIGNED NOT NULL COMMENT '贡献交易的被邀请人ID', trade_role VARCHAR(16) NOT NULL COMMENT '交易端角色: buyer=买家, seller=卖家', order_profit_basis_cent BIGINT NOT NULL DEFAULT 0 COMMENT '订单收益基数(分)', single_side_basis_cent BIGINT NOT NULL DEFAULT 0 COMMENT '单边收益基数(分)', rate_applied DECIMAL(6,4) NOT NULL DEFAULT 0 COMMENT '计算时采用的返利比例', days_since_verified INT NOT NULL DEFAULT 0 COMMENT '被邀请人实名至成交的天数', cycle_stage VARCHAR(32) NOT NULL DEFAULT '' COMMENT '周期阶段: first_month/second_month/subsequent', rebate_amount_cent BIGINT NOT NULL DEFAULT 0 COMMENT '实际返利金额(分)', wallet_ledger_no VARCHAR(64) NOT NULL DEFAULT '' COMMENT '关联钱包流水号', status VARCHAR(32) NOT NULL DEFAULT 'settled' COMMENT '状态: settled=已发放, cancelled=已取消/冲正', settled_at DATETIME NOT NULL COMMENT '结算发放时间', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_invitation_rebate_order_role (order_id, trade_role), KEY idx_invitation_rebate_inviter (inviter_id, settled_at), KEY idx_invitation_rebate_site (distribution_site_id, settled_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='邀请返利结算明细表'; -- +goose Down DROP TABLE IF EXISTS invitation_rebate_ledgers; DROP TABLE IF EXISTS invitation_rebate_configs; DROP TABLE IF EXISTS user_invitations; ALTER TABLE users DROP COLUMN invite_verified_at, DROP COLUMN invited_by_id, DROP COLUMN invite_code;