Files
obsidian-valut-mq/sql.md
2026-02-12 16:31:31 +08:00

4.4 KiB
Raw Blame History

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;

alter table webhook  
    add workec_id json comment 'workec配置' default '{}' after push_platform;