接单平台新增 VIP 等级体系与邀请绑定

- 等级按累计验收通过工单数自动升级(阈值后台可配),VIP1-5 默认配置 10/30/50/100
- 存量打手统一归 VIP1,原 regular 等级停用
- 注册支持邀请码绑定邀请人,每人生成唯一邀请码
- 新增 worker_level_logs 升级流水表
- 个人中心展示邀请码与升级进度,管理端等级表单支持升级阈值配置
This commit is contained in:
yml2213
2026-08-01 14:50:08 +08:00
parent 6e635b2499
commit 51d72cc283
9 changed files with 353 additions and 21 deletions
@@ -0,0 +1,55 @@
-- 007_worker_vip_levels_and_invite.sql —— VIP 等级体系与邀请绑定。
--
-- 说明:
-- 1. 等级升级按累计验收通过(accepted)工单数,阈值存 permission_json.upgradeThreshold,后台可配;
-- 2. 每个打手拥有唯一邀请码,注册时可填邀请码绑定邀请人(inviter_id);
-- 3. 存量打手统一归 VIP1,原 regular 等级停用;
-- 4. 佣金结算暂缓(规则未定),本迁移只落邀请关系,后续按规则补佣金。
-- 1) worker_users 增加邀请字段
ALTER TABLE worker_users ADD COLUMN IF NOT EXISTS inviter_id BIGINT REFERENCES worker_users(id) ON DELETE SET NULL;
ALTER TABLE worker_users ADD COLUMN IF NOT EXISTS invite_code TEXT;
-- 2) 存量用户填充唯一邀请码(8 位大写字母数字)
UPDATE worker_users
SET invite_code = UPPER(SUBSTRING(MD5(random()::text || id::text) FROM 1 FOR 8))
WHERE invite_code IS NULL;
ALTER TABLE worker_users ALTER COLUMN invite_code SET NOT NULL;
CREATE UNIQUE INDEX IF NOT EXISTS idx_worker_users_invite_code ON worker_users(invite_code);
CREATE INDEX IF NOT EXISTS idx_worker_users_inviter ON worker_users(inviter_id);
-- 3) seed VIP1-5 等级(level_key 唯一,重复执行不覆盖)
INSERT INTO worker_levels (level_key, name, sort_order, status, permission_json, created_at, updated_at) VALUES
('vip1', 'VIP1', 10, 'active', '{"depositFreeAmount":0,"maxActiveOrders":1,"upgradeThreshold":0}', NOW(), NOW()),
('vip2', 'VIP2', 20, 'active', '{"depositFreeAmount":0,"maxActiveOrders":3,"upgradeThreshold":10}', NOW(), NOW()),
('vip3', 'VIP3', 30, 'active', '{"depositFreeAmount":0,"maxActiveOrders":10,"upgradeThreshold":30}', NOW(), NOW()),
('vip4', 'VIP4', 40, 'active', '{"depositFreeAmount":0,"maxActiveOrders":50,"upgradeThreshold":50}', NOW(), NOW()),
('vip5', 'VIP5', 50, 'active', '{"depositFreeAmount":0,"maxActiveOrders":100,"upgradeThreshold":100}', NOW(), NOW())
ON CONFLICT (level_key) DO NOTHING;
-- 4) 存量打手统一归 VIP1,原 regular 等级停用
UPDATE worker_levels SET status = 'disabled' WHERE level_key = 'regular';
UPDATE worker_users
SET level_id = (SELECT id FROM worker_levels WHERE level_key = 'vip1')
WHERE level_id IS NULL
OR level_id = (SELECT id FROM worker_levels WHERE level_key = 'regular');
-- 5) 打手等级升级记录
CREATE TABLE IF NOT EXISTS worker_level_logs (
id BIGSERIAL PRIMARY KEY,
worker_id BIGINT NOT NULL REFERENCES worker_users(id) ON DELETE CASCADE,
from_level_id BIGINT REFERENCES worker_levels(id) ON DELETE SET NULL,
to_level_id BIGINT NOT NULL REFERENCES worker_levels(id) ON DELETE SET NULL,
reason TEXT NOT NULL DEFAULT 'auto',
payload_json JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_worker_level_logs_worker_created
ON worker_level_logs(worker_id, created_at DESC);
COMMENT ON COLUMN worker_users.inviter_id IS '邀请人(注册时通过邀请码绑定)';
COMMENT ON COLUMN worker_users.invite_code IS '本人专属邀请码,注册/邀请他人时使用';
COMMENT ON TABLE worker_level_logs IS '打手等级升级流水';
COMMENT ON COLUMN worker_level_logs.reason IS '升级原因:auto 自动升级 / admin 后台调整';