Files
obsidian-valut-mq/sql.md
2026-01-22 09:07:01 +08:00

118 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
```sql
CREATE TABLE `auth_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '认证信息ID',
`phone` varchar(50) NOT NULL COMMENT '手机号',
`password` varchar(255) NOT NULL COMMENT '加密后的密码',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_phone_deleted` (`phone`, `deleted_at`),
KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一认证信息表';
CREATE TABLE `auth_info_agent` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '关联ID',
`auth_info_id` bigint(20) NOT NULL COMMENT '认证信息ID',
`agent_id` bigint(20) NOT NULL COMMENT '客服ID',
`ent_id` bigint(20) NOT NULL COMMENT '企业ID冗余字段便于查询',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_auth_agent` (`auth_info_id`, `agent_id`),
KEY `idx_agent` (`agent_id`),
KEY `idx_auth_info` (`auth_info_id`),
KEY `idx_ent` (`ent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='认证信息与客服关联表';
CREATE TABLE `user_login_status` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`agent_id` bigint(20) NOT NULL COMMENT '客服ID',
`platform` varchar(50) NOT NULL COMMENT '登录平台: web, ios, android, mac, windows等',
`token` varchar(255) NOT NULL COMMENT '登录token',
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理字符串',
`ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
`isp` varchar(100) DEFAULT NULL COMMENT '运营商',
`country` varchar(100) DEFAULT NULL COMMENT '国家',
`province` varchar(100) DEFAULT NULL COMMENT '省份',
`city` varchar(100) DEFAULT NULL COMMENT '城市',
`status` varchar(20) NOT NULL COMMENT '状态: online(在线), invisible(隐身), off_duty(离线)',
`login_at` datetime NOT NULL COMMENT '登录时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_token` (`token`),
KEY `idx_ent_agent`(`ent_id`,`agent_id`),
KEY `idx_agent_platform` (`agent_id`, `platform`),
KEY `idx_status` (`status`),
KEY `idx_login_at` (`login_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户登录状态表';
INSERT INTO auth_info (phone, password, created_at, updated_at)
SELECT DISTINCT
phone,
COALESCE(password, '') as password,
NOW(6),
NOW(6)
FROM agent
WHERE deleted_at IS NULL
AND phone IS NOT NULL
AND phone != ''
AND NOT EXISTS (
SELECT 1 FROM auth_info ai WHERE ai.phone = agent.phone AND ai.deleted_at IS NULL
)
GROUP BY phone;
-- 步骤2: 创建 auth_info 与 agent 的关联关系
INSERT INTO auth_info_agent (auth_info_id, agent_id, created_at)
SELECT
ai.id as auth_info_id,
a.id as agent_id,
NOW(6)
FROM agent a
INNER JOIN auth_info ai ON a.phone = ai.phone AND ai.deleted_at IS NULL
WHERE a.deleted_at IS NULL
AND a.phone IS NOT NULL
AND a.phone != ''
AND NOT EXISTS (
SELECT 1 FROM auth_info_agent aia
WHERE aia.auth_info_id = ai.id AND aia.agent_id = a.id
);
-- 步骤3可选: 验证迁移结果
-- 检查是否所有 agent 都有对应的 auth_info_agent 记录
SELECT
'未关联的 agent 数量' as check_item,
COUNT(*) as count
FROM agent a
WHERE a.deleted_at IS NULL
AND a.phone IS NOT NULL
AND a.phone != ''
AND NOT EXISTS (
SELECT 1 FROM auth_info_agent aia WHERE aia.agent_id = a.id
);
-- 检查 auth_info 记录数
SELECT
'auth_info 记录数' as check_item,
COUNT(*) as count
FROM auth_info
WHERE deleted_at IS NULL;
-- 检查 auth_info_agent 关联记录数
SELECT
'auth_info_agent 关联记录数' as check_item,
COUNT(*) as count
FROM auth_info_agent;
-- 检查有多个 agent 的手机号
SELECT
ai.phone,
COUNT(aia.agent_id) as agent_count,
GROUP_CONCAT(a.realname SEPARATOR ', ') as agent_names
FROM auth_info ai
INNER JOIN auth_info_agent aia ON ai.id = aia.auth_info_id
INNER JOIN agent a ON aia.agent_id = a.id
WHERE ai.deleted_at IS NULL AND a.deleted_at IS NULL
GROUP BY ai.phone
HAVING COUNT(aia.agent_id) > 1;
```