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>
119 lines
3.9 KiB
SQL
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;
|