数据库设计.sql 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. -- =====================================================
  2. -- 审计之家 · 在线客服系统 · 数据库设计
  3. -- 数据库: MySQL 8.0
  4. -- 字符集: utf8mb4
  5. -- 时间: 2026-03-17
  6. -- =====================================================
  7. CREATE DATABASE IF NOT EXISTS `sjzj_chat` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  8. USE `sjzj_chat`;
  9. -- =====================================================
  10. -- 1. 坐席配置表
  11. -- 对应前端: SeatConfig.vue
  12. -- =====================================================
  13. DROP TABLE IF EXISTS `cs_seat_config`;
  14. CREATE TABLE `cs_seat_config` (
  15. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '坐席ID',
  16. `seat_name` VARCHAR(50) NOT NULL COMMENT '坐席名称(如:客服小A)',
  17. `avatar` VARCHAR(500) DEFAULT NULL COMMENT '坐席头像URL',
  18. `module` VARCHAR(20) NOT NULL COMMENT '负责模块: mini(小程序), merchant(商家), all(全部)',
  19. `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态: 0=停用, 1=启用',
  20. `create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
  21. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  22. `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
  23. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  24. `del_flag` CHAR(1) DEFAULT '0' COMMENT '删除标志: 0=存在, 2=已删除',
  25. PRIMARY KEY (`id`)
  26. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='坐席配置表';
  27. -- 坐席与客服人员关联表
  28. DROP TABLE IF EXISTS `cs_seat_waiter`;
  29. CREATE TABLE `cs_seat_waiter` (
  30. `id` BIGINT NOT NULL AUTO_INCREMENT,
  31. `seat_id` BIGINT NOT NULL COMMENT '坐席ID',
  32. `user_id` BIGINT NOT NULL COMMENT '客服用户ID(关联若依sys_user)',
  33. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  34. PRIMARY KEY (`id`),
  35. KEY `idx_seat_id` (`seat_id`),
  36. KEY `idx_user_id` (`user_id`)
  37. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='坐席-客服关联表';
  38. -- 初始数据
  39. INSERT INTO `cs_seat_config` (`seat_name`, `avatar`, `module`, `status`) VALUES
  40. ('客服小A', 'https://api.dicebear.com/7.x/avataaars/svg?seed=A', '小程序', 1),
  41. ('客服小B', 'https://api.dicebear.com/7.x/avataaars/svg?seed=B', '官网', 1),
  42. ('客服小C', 'https://api.dicebear.com/7.x/avataaars/svg?seed=C', '小程序', 0);
  43. -- =====================================================
  44. -- 2. 会话表(一个 User/商家 与客服建立一个会话)
  45. -- =====================================================
  46. DROP TABLE IF EXISTS `cs_session`;
  47. CREATE TABLE `cs_session` (
  48. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '会话ID',
  49. `session_no` VARCHAR(32) NOT NULL UNIQUE COMMENT '会话编号,唯一,用于WS频道路由',
  50. `session_type` TINYINT(1) NOT NULL COMMENT '会话类型: 1=小程序用户, 2=PC商家',
  51. `from_user_id` BIGINT NOT NULL COMMENT '发起用户ID(小程序用户或商家用户ID)',
  52. `from_user_name` VARCHAR(100) DEFAULT '' COMMENT '发起方昵称',
  53. `from_user_avatar`VARCHAR(500) DEFAULT '' COMMENT '发起方头像',
  54. `seat_id` BIGINT DEFAULT NULL COMMENT '当前分配坐席ID',
  55. `waiter_id` BIGINT DEFAULT NULL COMMENT '当前接待客服ID',
  56. `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态: 1=进行中, 2=已结束',
  57. `last_msg` VARCHAR(500) DEFAULT '' COMMENT '最后一条消息摘要(用于列表展示)',
  58. `last_msg_time` DATETIME DEFAULT NULL COMMENT '最后消息时间',
  59. `unread_count` INT NOT NULL DEFAULT 0 COMMENT '客服侧未读消息数',
  60. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '会话建立时间',
  61. `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  62. `end_time` DATETIME DEFAULT NULL COMMENT '会话结束时间',
  63. PRIMARY KEY (`id`),
  64. KEY `idx_from_user` (`from_user_id`),
  65. KEY `idx_waiter` (`waiter_id`),
  66. KEY `idx_status` (`status`)
  67. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='客服会话表';
  68. -- =====================================================
  69. -- 3. 消息表(核心表,存储所有聊天消息)
  70. -- =====================================================
  71. DROP TABLE IF EXISTS `cs_message`;
  72. CREATE TABLE `cs_message` (
  73. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  74. `session_id` BIGINT NOT NULL COMMENT '归属会话ID',
  75. `msg_no` VARCHAR(32) NOT NULL UNIQUE COMMENT '消息唯一编号(客户端生成,用于幂等)',
  76. `sender_type` TINYINT(1) NOT NULL COMMENT '发送方类型: 1=用户/商家, 2=客服, 3=系统',
  77. `sender_id` BIGINT NOT NULL COMMENT '发送者ID',
  78. `msg_type` VARCHAR(20) NOT NULL COMMENT '消息类型: text/image/file/job_card/order_card/emoji',
  79. `content` TEXT DEFAULT NULL COMMENT '文本消息内容',
  80. `file_url` VARCHAR(500) DEFAULT NULL COMMENT '图片/文件URL',
  81. `file_name` VARCHAR(255) DEFAULT NULL COMMENT '文件原始名称',
  82. `file_size` BIGINT DEFAULT NULL COMMENT '文件大小(字节)',
  83. `file_type` VARCHAR(100) DEFAULT NULL COMMENT '文件MIME类型',
  84. `payload` JSON DEFAULT NULL COMMENT '卡片类消息的结构化数据(job_card/order_card的JSON)',
  85. `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态: 1=正常, 2=已撤回',
  86. `is_read` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已读: 0=未读, 1=已读',
  87. `send_time` DATETIME NOT NULL COMMENT '发送时间',
  88. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
  89. PRIMARY KEY (`id`),
  90. KEY `idx_session` (`session_id`),
  91. KEY `idx_send_time` (`send_time`),
  92. KEY `idx_msg_type` (`msg_type`)
  93. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='聊天消息表';
  94. -- =====================================================
  95. -- 4. 结算单(order_card)扩展表
  96. -- 配合消息表中 msg_type='order_card' 的消息使用
  97. -- 实现: 60秒倒计时自动失效
  98. -- =====================================================
  99. DROP TABLE IF EXISTS `cs_order_card`;
  100. CREATE TABLE `cs_order_card` (
  101. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '结算单ID',
  102. `msg_id` BIGINT NOT NULL COMMENT '关联消息ID',
  103. `session_id` BIGINT NOT NULL COMMENT '关联会话ID',
  104. `order_name` VARCHAR(200) NOT NULL COMMENT '项目名称',
  105. `order_price` DECIMAL(10, 2) NOT NULL COMMENT '支付金额',
  106. `order_type` VARCHAR(50) DEFAULT NULL COMMENT '订单类型说明',
  107. `original_order_id` BIGINT DEFAULT NULL COMMENT '关联平台真实订单ID',
  108. `status` VARCHAR(20) NOT NULL DEFAULT 'pending'
  109. COMMENT '状态: pending=待支付, paid=已支付, cancelled=已取消, expired=已失效',
  110. `expire_time` DATETIME NOT NULL COMMENT '结算单过期时间(发送时间+60s)',
  111. `pay_time` DATETIME DEFAULT NULL COMMENT '实际支付时间',
  112. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
  113. PRIMARY KEY (`id`),
  114. KEY `idx_msg_id` (`msg_id`),
  115. KEY `idx_session` (`session_id`),
  116. KEY `idx_status` (`status`),
  117. KEY `idx_expire` (`expire_time`)
  118. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='结算单表(order_card)';
  119. -- =====================================================
  120. -- 5. 工单表(客服工单管理)
  121. -- 对应前端: SeatConfig.vue 的工单子系统
  122. -- =====================================================
  123. DROP TABLE IF EXISTS `cs_ticket`;
  124. CREATE TABLE `cs_ticket` (
  125. `id` VARCHAR(32) NOT NULL COMMENT '工单编号(如: 20991216194)',
  126. `session_id` BIGINT DEFAULT NULL COMMENT '关联会话ID(若来自在线沟通)',
  127. `user_id` VARCHAR(50) NOT NULL COMMENT '反馈用户ID',
  128. `user_name` VARCHAR(100) NOT NULL COMMENT '反馈用户昵称',
  129. `content` TEXT NOT NULL COMMENT '反馈内容',
  130. `source` VARCHAR(20) NOT NULL COMMENT '反馈渠道: 小程序/商家',
  131. `category` VARCHAR(50) NOT NULL COMMENT '问题分类',
  132. `status` VARCHAR(20) NOT NULL DEFAULT 'pending'
  133. COMMENT '状态: pending=待处理, processing=处理中, completed=已完成, abandoned=已废弃',
  134. `handler_id` BIGINT DEFAULT NULL COMMENT '处理客服ID',
  135. `handler_reply` TEXT DEFAULT NULL COMMENT '客服处理回复',
  136. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  137. `finish_time` DATETIME DEFAULT NULL COMMENT '完结时间',
  138. PRIMARY KEY (`id`),
  139. KEY `idx_user` (`user_id`),
  140. KEY `idx_status` (`status`),
  141. KEY `idx_source` (`source`)
  142. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客服工单表';
  143. -- =====================================================
  144. -- 6. 文件资源表(统一管理上传的图片/附件)
  145. -- =====================================================
  146. DROP TABLE IF EXISTS `cs_file_resource`;
  147. CREATE TABLE `cs_file_resource` (
  148. `id` BIGINT NOT NULL AUTO_INCREMENT,
  149. `session_id` BIGINT DEFAULT NULL COMMENT '关联会话',
  150. `msg_id` BIGINT DEFAULT NULL COMMENT '关联消息',
  151. `origin_name` VARCHAR(255) NOT NULL COMMENT '原始文件名',
  152. `storage_name` VARCHAR(255) NOT NULL COMMENT '存储文件名(UUID格式)',
  153. `file_url` VARCHAR(500) NOT NULL COMMENT '文件访问URL',
  154. `file_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型',
  155. `file_size` BIGINT DEFAULT 0 COMMENT '文件大小(字节)',
  156. `upload_by` BIGINT DEFAULT NULL COMMENT '上传者ID',
  157. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
  158. PRIMARY KEY (`id`)
  159. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='聊天文件资源表';
  160. -- =====================================================
  161. -- 7. 消息已读记录表(精确追踪已读状态)
  162. -- =====================================================
  163. DROP TABLE IF EXISTS `cs_read_record`;
  164. CREATE TABLE `cs_read_record` (
  165. `id` BIGINT NOT NULL AUTO_INCREMENT,
  166. `session_id` BIGINT NOT NULL COMMENT '会话ID',
  167. `user_id` BIGINT NOT NULL COMMENT '用户ID',
  168. `last_read_msg_id` BIGINT DEFAULT 0 COMMENT '已读到的消息ID',
  169. `read_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  170. PRIMARY KEY (`id`),
  171. UNIQUE KEY `uk_session_user` (`session_id`, `user_id`)
  172. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='消息已读记录表';
  173. -- =====================================================
  174. -- 关联视图: 会话列表聚合视图(供坐席端展示)
  175. -- =====================================================
  176. CREATE OR REPLACE VIEW `v_session_list` AS
  177. SELECT
  178. s.id,
  179. s.session_no,
  180. s.session_type,
  181. s.from_user_id,
  182. s.from_user_name,
  183. s.from_user_avatar,
  184. s.waiter_id,
  185. s.status,
  186. s.last_msg,
  187. s.last_msg_time,
  188. s.unread_count,
  189. s.create_time,
  190. sc.seat_name
  191. FROM cs_session s
  192. LEFT JOIN cs_seat_config sc ON s.seat_id = sc.id;