Files
x-server-mobile/backend/database/migrations/010_add_user_feishu_apps.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

119 lines
3.9 KiB
SQL

-- X-Server 用户多飞书应用绑定功能
-- 执行方式:在数据库中直接执行此SQL
USE xserver;
-- =====================================
-- 1. 添加 users 表唯一约束
-- =====================================
-- 删除可能存在的旧索引
ALTER TABLE users DROP INDEX IF EXISTS idx_email;
ALTER TABLE users DROP INDEX IF EXISTS idx_phone;
-- 添加 email 唯一索引(同一公司内邮箱唯一)
CREATE UNIQUE INDEX uk_users_company_email ON users(company_id, email);
-- 添加 phone 唯一索引(同一公司内手机号唯一)
CREATE UNIQUE INDEX uk_users_company_phone ON users(company_id, phone);
-- =====================================
-- 2. 创建用户飞书应用绑定表
-- =====================================
DROP TABLE IF EXISTS user_feishu_apps;
CREATE TABLE `user_feishu_apps` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "ID",
`user_id` bigint unsigned NOT NULL COMMENT "用户ID",
`company_id` bigint unsigned NOT NULL COMMENT "公司ID",
`feishu_app_id` int unsigned NOT NULL COMMENT "飞书应用配置ID",
-- 该应用中的飞书用户信息
`feishu_user_id` varchar(60) DEFAULT NULL COMMENT "该应用的飞书用户ID",
`feishu_open_id` varchar(60) DEFAULT NULL COMMENT "该应用的飞书OpenID",
`tenant_key` varchar(60) DEFAULT NULL COMMENT "该应用的租户Key",
-- 绑定信息
`is_default` tinyint NOT NULL DEFAULT 0 COMMENT "是否为默认应用: 1=是, 0=否",
`last_login_at` timestamp NULL DEFAULT NULL COMMENT "最后一次通过此应用登录时间",
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "绑定时间",
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间",
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_app` (`user_id`, `company_id`, `feishu_app_id`),
KEY `idx_user_default` (`user_id`, `company_id`, `is_default`),
KEY `idx_feishu_user_id` (`feishu_user_id`),
KEY `idx_feishu_open_id` (`feishu_open_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="用户飞书应用绑定表";
-- =====================================
-- 3. 修改 users 表,移除不需要的飞书字段
-- =====================================
-- 注意:为了兼容性,先保留现有字段,后续可考虑迁移
-- ALTER TABLE users DROP COLUMN feishu_user_id;
-- ALTER TABLE users DROP COLUMN feishu_open_id;
-- ALTER TABLE users DROP COLUMN tenant_key;
-- 临时方案:添加 feishu_app_id 记录最后登录的应用
ALTER TABLE users
ADD COLUMN `feishu_app_id` int unsigned DEFAULT NULL
COMMENT '最后登录的飞书应用ID'
AFTER `tenant_key`;
ALTER TABLE users
ADD INDEX `idx_feishu_app_id` (`feishu_app_id`);
-- =====================================
-- 4. 迁移现有用户飞书绑定数据(如果有的话)
-- =====================================
-- 将现有 users 表中的飞书信息迁移到绑定表
-- 只处理有 feishu_user_id 的用户
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
)
SELECT
u.id as user_id,
u.company_id,
u.feishu_app_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
FROM users u
WHERE u.feishu_user_id IS NOT NULL
AND u.feishu_app_id IS NOT NULL
ON DUPLICATE KEY UPDATE
last_login_at = NOW();
-- =====================================
-- 验证结果
-- =====================================
SELECT "=== 用户表唯一约束 ===" as "";
SHOW INDEX FROM users WHERE Key_name LIKE 'uk_users_company%';
SELECT "=== 飞书应用绑定表结构 ===" as "";
DESCRIBE user_feishu_apps;
SELECT "=== 现有用户飞书绑定数据 ===" as "";
SELECT
u.id as user_id,
u.name,
u.company_id,
u.feishu_app_id,
COUNT(ufa.id) as app_count
FROM users u
LEFT JOIN user_feishu_apps ufa ON u.id = ufa.user_id
GROUP BY u.id, u.name, u.company_id, u.feishu_app_id;