| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- -- =====================================================
- -- 审计之家 · 在线客服系统 · 数据库设计
- -- 数据库: 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;
|