Files
hfb_sys/backend/migrations/000081_user_invitations_and_rebates.sql
yml2213 984433f866 feat(invitation): 实现邀请返利系统、专属注册落地页与分成管理
- 数据库与数据模型:新增 migration 000081,支持用户专属邀请码、被邀请人绑定与实名时间戳;新增邀请返利配置表与结算明细表
- 业务与结算逻辑:实现首月 60%、次月 30%、往后 15% 阶梯返利算法;买卖双向独立寻源并根据订单平台利润 50% 单边基准核算;与终态订单结算和钱包可用余额强幂等联动
- 分销站点支持:支持主站与加盟分站独立配置返利比例;跨站交易按照收号端与售卖端独立出资,资金互不侵蚀
- 前端交互与入口:
  - 新增专属短链注册落地页 /i/:code,自动带入并锁定邀请码,引导实名认证
  - 个人中心与移动端新增邀请返利看板(专属码、推广链接、统计面板、好友记录与返利流水明细)
  - 管理后台新增邀请返利管理(比例配置、邀请关系与返利流水审计)
- 验证方式:
  - 通过 repository_test.go 单元测试(阶梯区间、实名激活、跨站多方分流验证)
  - 通过 npm run format、npm run check 与 scripts/check.sh 全量门禁校验
2026-10-10 12:48:59 +08:00

77 lines
4.3 KiB
SQL

-- +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;