Files
x-server-mobile/backend/database/migrations/011_migrate_users_feishu_data.sql
T
root 0489da5e40 refactor: 重构多飞书应用绑定架构和数据库清理
- 新增 user_feishu_apps 表支持用户绑定多个飞书应用
- users 表添加唯一约束(公司内邮箱/手机唯一)
- 迁移现有飞书数据到 user_feishu_apps 表
- 清理冗余表(users_bak, user_feishu_binding)
- 废弃 users 表中的 feishu_user_id/feishu_open_id/tenant_key 字段
- 更新 FeishuNotificationService 使用新的数据获取方式
- User 模型新增 getFeishuUserId() 等便捷方法

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:27:33 +08:00

93 lines
2.6 KiB
SQL

-- X-Server 用户表飞书数据迁移
-- 将 users 表中的飞书字段数据迁移到 user_feishu_apps 表
USE xserver;
-- =====================================
-- 1. 迁移现有数据到 user_feishu_apps
-- =====================================
-- 将 users 表中的飞书信息迁移到 user_feishu_apps 表
-- 使用每个公司的默认飞书应用 (system_id=1)
INSERT INTO user_feishu_apps (
user_id,
company_id,
feishu_app_id,
feishu_user_id,
feishu_open_id,
tenant_key,
is_default,
last_login_at,
created_at,
updated_at
)
SELECT
u.id as user_id,
u.company_id,
cfa.id as feishu_app_id,
u.feishu_user_id,
u.feishu_open_id,
u.tenant_key,
1 as is_default,
NOW() as last_login_at,
u.created_at,
u.updated_at
FROM users u
INNER JOIN company_feishu_apps cfa ON cfa.company_id = u.company_id
WHERE u.feishu_user_id IS NOT NULL
AND cfa.system_id = 1
AND cfa.status = 1
ON DUPLICATE KEY UPDATE
feishu_user_id = VALUES(feishu_user_id),
feishu_open_id = VALUES(feishu_open_id),
tenant_key = VALUES(tenant_key),
last_login_at = NOW();
-- =====================================
-- 2. 更新 users 表的 feishu_app_id
-- =====================================
UPDATE users u
INNER JOIN company_feishu_apps cfa ON cfa.company_id = u.company_id
SET u.feishu_app_id = cfa.id
WHERE u.feishu_user_id IS NOT NULL
AND cfa.system_id = 1
AND cfa.status = 1;
-- =====================================
-- 3. 验证迁移结果
-- =====================================
SELECT "=== 迁移前 users 表数据 ===" as "";
SELECT
company_id,
COUNT(*) as total_users,
SUM(CASE WHEN feishu_user_id IS NOT NULL THEN 1 ELSE 0 END) as with_feishu_id,
SUM(CASE WHEN feishu_app_id IS NOT NULL THEN 1 ELSE 0 END) as with_app_id
FROM users
GROUP BY company_id;
SELECT "=== 迁移后 user_feishu_apps 表数据 ===" as "";
SELECT
company_id,
COUNT(DISTINCT user_id) as users_count,
COUNT(*) as bindings_count
FROM user_feishu_apps
GROUP BY company_id;
-- =====================================
-- 4. 标记冗余字段(不删除,保证向后兼容)
-- =====================================
-- 注意:以下字段保留但不推荐使用
-- - feishu_user_id (冗余,应从 user_feishu_apps 获取)
-- - feishu_open_id (冗余,应从 user_feishu_apps 获取)
-- - tenant_key (冗余,应从 user_feishu_apps 获取)
--
-- 推荐使用方式:
-- $binding = UserFeishuApp::where('user_id', $userId)
-- ->where('company_id', $companyId)
-- ->where('feishu_app_id', $appId)
-- ->first();
-- $feishuUserId = $binding ? $binding->feishu_user_id : null;