0489da5e40
- 新增 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>
93 lines
2.6 KiB
SQL
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;
|