-- ===================================================== -- 审计之家 · 在线客服系统 · 数据库设计 -- 数据库: MySQL 8.0 -- 字符集: utf8mb4 -- 时间: 2026-03-17 -- ===================================================== CREATE DATABASE IF NOT EXISTS `sjzj_chat` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `sjzj_chat`; -- ===================================================== -- 1. 坐席配置表 -- 对应前端: SeatConfig.vue -- ===================================================== DROP TABLE IF EXISTS `cs_seat_config`; CREATE TABLE `cs_seat_config` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '坐席ID', `seat_name` VARCHAR(50) NOT NULL COMMENT '坐席名称(如:客服小A)', `avatar` VARCHAR(500) DEFAULT NULL COMMENT '坐席头像URL', `module` VARCHAR(20) NOT NULL COMMENT '负责模块: mini(小程序), merchant(商家), all(全部)', `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态: 0=停用, 1=启用', `create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `del_flag` CHAR(1) DEFAULT '0' COMMENT '删除标志: 0=存在, 2=已删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='坐席配置表'; -- 坐席与客服人员关联表 DROP TABLE IF EXISTS `cs_seat_waiter`; CREATE TABLE `cs_seat_waiter` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `seat_id` BIGINT NOT NULL COMMENT '坐席ID', `user_id` BIGINT NOT NULL COMMENT '客服用户ID(关联若依sys_user)', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_seat_id` (`seat_id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='坐席-客服关联表'; -- 初始数据 INSERT INTO `cs_seat_config` (`seat_name`, `avatar`, `module`, `status`) VALUES ('客服小A', 'https://api.dicebear.com/7.x/avataaars/svg?seed=A', '小程序', 1), ('客服小B', 'https://api.dicebear.com/7.x/avataaars/svg?seed=B', '官网', 1), ('客服小C', 'https://api.dicebear.com/7.x/avataaars/svg?seed=C', '小程序', 0); -- ===================================================== -- 2. 会话表(一个 User/商家 与客服建立一个会话) -- ===================================================== DROP TABLE IF EXISTS `cs_session`; CREATE TABLE `cs_session` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '会话ID', `session_no` VARCHAR(32) NOT NULL UNIQUE COMMENT '会话编号,唯一,用于WS频道路由', `session_type` TINYINT(1) NOT NULL COMMENT '会话类型: 1=小程序用户, 2=PC商家', `from_user_id` BIGINT NOT NULL COMMENT '发起用户ID(小程序用户或商家用户ID)', `from_user_name` VARCHAR(100) DEFAULT '' COMMENT '发起方昵称', `from_user_avatar`VARCHAR(500) DEFAULT '' COMMENT '发起方头像', `seat_id` BIGINT DEFAULT NULL COMMENT '当前分配坐席ID', `waiter_id` BIGINT DEFAULT NULL COMMENT '当前接待客服ID', `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态: 1=进行中, 2=已结束', `last_msg` VARCHAR(500) DEFAULT '' COMMENT '最后一条消息摘要(用于列表展示)', `last_msg_time` DATETIME DEFAULT NULL COMMENT '最后消息时间', `unread_count` INT NOT NULL DEFAULT 0 COMMENT '客服侧未读消息数', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '会话建立时间', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `end_time` DATETIME DEFAULT NULL COMMENT '会话结束时间', PRIMARY KEY (`id`), KEY `idx_from_user` (`from_user_id`), KEY `idx_waiter` (`waiter_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='客服会话表'; -- ===================================================== -- 3. 消息表(核心表,存储所有聊天消息) -- ===================================================== DROP TABLE IF EXISTS `cs_message`; CREATE TABLE `cs_message` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '消息ID', `session_id` BIGINT NOT NULL COMMENT '归属会话ID', `msg_no` VARCHAR(32) NOT NULL UNIQUE COMMENT '消息唯一编号(客户端生成,用于幂等)', `sender_type` TINYINT(1) NOT NULL COMMENT '发送方类型: 1=用户/商家, 2=客服, 3=系统', `sender_id` BIGINT NOT NULL COMMENT '发送者ID', `msg_type` VARCHAR(20) NOT NULL COMMENT '消息类型: text/image/file/job_card/order_card/emoji', `content` TEXT DEFAULT NULL COMMENT '文本消息内容', `file_url` VARCHAR(500) DEFAULT NULL COMMENT '图片/文件URL', `file_name` VARCHAR(255) DEFAULT NULL COMMENT '文件原始名称', `file_size` BIGINT DEFAULT NULL COMMENT '文件大小(字节)', `file_type` VARCHAR(100) DEFAULT NULL COMMENT '文件MIME类型', `payload` JSON DEFAULT NULL COMMENT '卡片类消息的结构化数据(job_card/order_card的JSON)', `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态: 1=正常, 2=已撤回', `is_read` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已读: 0=未读, 1=已读', `send_time` DATETIME NOT NULL COMMENT '发送时间', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_session` (`session_id`), KEY `idx_send_time` (`send_time`), KEY `idx_msg_type` (`msg_type`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='聊天消息表'; -- ===================================================== -- 4. 结算单(order_card)扩展表 -- 配合消息表中 msg_type='order_card' 的消息使用 -- 实现: 60秒倒计时自动失效 -- ===================================================== DROP TABLE IF EXISTS `cs_order_card`; CREATE TABLE `cs_order_card` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '结算单ID', `msg_id` BIGINT NOT NULL COMMENT '关联消息ID', `session_id` BIGINT NOT NULL COMMENT '关联会话ID', `order_name` VARCHAR(200) NOT NULL COMMENT '项目名称', `order_price` DECIMAL(10, 2) NOT NULL COMMENT '支付金额', `order_type` VARCHAR(50) DEFAULT NULL COMMENT '订单类型说明', `original_order_id` BIGINT DEFAULT NULL COMMENT '关联平台真实订单ID', `status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '状态: pending=待支付, paid=已支付, cancelled=已取消, expired=已失效', `expire_time` DATETIME NOT NULL COMMENT '结算单过期时间(发送时间+60s)', `pay_time` DATETIME DEFAULT NULL COMMENT '实际支付时间', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_msg_id` (`msg_id`), KEY `idx_session` (`session_id`), KEY `idx_status` (`status`), KEY `idx_expire` (`expire_time`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='结算单表(order_card)'; -- ===================================================== -- 5. 工单表(客服工单管理) -- 对应前端: SeatConfig.vue 的工单子系统 -- ===================================================== DROP TABLE IF EXISTS `cs_ticket`; CREATE TABLE `cs_ticket` ( `id` VARCHAR(32) NOT NULL COMMENT '工单编号(如: 20991216194)', `session_id` BIGINT DEFAULT NULL COMMENT '关联会话ID(若来自在线沟通)', `user_id` VARCHAR(50) NOT NULL COMMENT '反馈用户ID', `user_name` VARCHAR(100) NOT NULL COMMENT '反馈用户昵称', `content` TEXT NOT NULL COMMENT '反馈内容', `source` VARCHAR(20) NOT NULL COMMENT '反馈渠道: 小程序/商家', `category` VARCHAR(50) NOT NULL COMMENT '问题分类', `status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '状态: pending=待处理, processing=处理中, completed=已完成, abandoned=已废弃', `handler_id` BIGINT DEFAULT NULL COMMENT '处理客服ID', `handler_reply` TEXT DEFAULT NULL COMMENT '客服处理回复', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `finish_time` DATETIME DEFAULT NULL COMMENT '完结时间', PRIMARY KEY (`id`), KEY `idx_user` (`user_id`), KEY `idx_status` (`status`), KEY `idx_source` (`source`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客服工单表'; -- ===================================================== -- 6. 文件资源表(统一管理上传的图片/附件) -- ===================================================== DROP TABLE IF EXISTS `cs_file_resource`; CREATE TABLE `cs_file_resource` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `session_id` BIGINT DEFAULT NULL COMMENT '关联会话', `msg_id` BIGINT DEFAULT NULL COMMENT '关联消息', `origin_name` VARCHAR(255) NOT NULL COMMENT '原始文件名', `storage_name` VARCHAR(255) NOT NULL COMMENT '存储文件名(UUID格式)', `file_url` VARCHAR(500) NOT NULL COMMENT '文件访问URL', `file_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型', `file_size` BIGINT DEFAULT 0 COMMENT '文件大小(字节)', `upload_by` BIGINT DEFAULT NULL COMMENT '上传者ID', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='聊天文件资源表'; -- ===================================================== -- 7. 消息已读记录表(精确追踪已读状态) -- ===================================================== DROP TABLE IF EXISTS `cs_read_record`; CREATE TABLE `cs_read_record` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `session_id` BIGINT NOT NULL COMMENT '会话ID', `user_id` BIGINT NOT NULL COMMENT '用户ID', `last_read_msg_id` BIGINT DEFAULT 0 COMMENT '已读到的消息ID', `read_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_session_user` (`session_id`, `user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='消息已读记录表'; -- ===================================================== -- 关联视图: 会话列表聚合视图(供坐席端展示) -- ===================================================== CREATE OR REPLACE VIEW `v_session_list` AS SELECT s.id, s.session_no, s.session_type, s.from_user_id, s.from_user_name, s.from_user_avatar, s.waiter_id, s.status, s.last_msg, s.last_msg_time, s.unread_count, s.create_time, sc.seat_name FROM cs_session s LEFT JOIN cs_seat_config sc ON s.seat_id = sc.id;