vault backup: 2026-01-22 09:07:01

This commit is contained in:
wubaoyong
2026-01-22 09:07:01 +08:00
parent 279a1e78a6
commit 6630f38c6d
30 changed files with 179 additions and 63 deletions

127
sql.md
View File

@@ -1,17 +1,118 @@
### DDL 创建
```sql
CREATE TABLE agent_enterprise_relation
(
id INT AUTO_INCREMENT PRIMARY KEY,
agent_id INT NOT NULL,
ent_id INT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY idx_agent_ent (agent_id, ent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
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='统一认证信息表';
### DDL修改
```sql
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;
```