-- ============================= -- 智能客服系统业务模块 -- 支持:微信小程序客户咨询、智能问答、工单管理、CRM集成 -- ============================= CREATE SCHEMA IF NOT EXISTS customer_service; -- 客户信息表 DROP TABLE IF EXISTS customer_service.tb_customer CASCADE; CREATE TABLE customer_service.tb_customer ( optsn VARCHAR(50) NOT NULL, -- 流水号 customer_id VARCHAR(50) NOT NULL, -- 客户ID customer_no VARCHAR(100), -- 客户编号 customer_name VARCHAR(255), -- 客户姓名 customer_type VARCHAR(30) DEFAULT 'individual', -- 客户类型:individual-个人/enterprise-企业 company_name VARCHAR(255), -- 公司名称 phone VARCHAR(20), -- 电话 email VARCHAR(100), -- 邮箱 wechat_openid VARCHAR(100), -- 微信OpenID wechat_unionid VARCHAR(100), -- 微信UnionID avatar VARCHAR(500), -- 头像URL gender INTEGER DEFAULT 0, -- 性别:0-未知/1-男/2-女 address VARCHAR(500), -- 地址 customer_level VARCHAR(20) DEFAULT 'normal', -- 客户等级:vip/important/normal/potential customer_source VARCHAR(50), -- 客户来源:wechat-微信/web-网站/phone-电话/referral-推荐 tags TEXT[], -- 客户标签数组 notes TEXT, -- 备注 crm_customer_id VARCHAR(50), -- CRM系统客户ID(外部系统) last_contact_time TIMESTAMPTZ, -- 最后联系时间 total_consultations INTEGER DEFAULT 0, -- 咨询总次数 total_orders INTEGER DEFAULT 0, -- 订单总数 total_amount DECIMAL(18,2) DEFAULT 0, -- 总消费金额 satisfaction_score DECIMAL(3,2), -- 满意度评分(1-5) dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 status VARCHAR(20) DEFAULT 'active', -- 状态:active-活跃/inactive-非活跃/blacklist-黑名单 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (customer_id), UNIQUE (optsn), UNIQUE (wechat_openid), UNIQUE (phone), UNIQUE (email) ); CREATE INDEX idx_customer_type ON customer_service.tb_customer(customer_type) WHERE deleted = false; CREATE INDEX idx_customer_level ON customer_service.tb_customer(customer_level) WHERE deleted = false; CREATE INDEX idx_customer_wechat ON customer_service.tb_customer(wechat_openid) WHERE deleted = false; COMMENT ON TABLE customer_service.tb_customer IS '客户信息表'; COMMENT ON COLUMN customer_service.tb_customer.customer_level IS '客户等级:vip/important/normal/potential'; -- 会话表 DROP TABLE IF EXISTS customer_service.tb_conversation CASCADE; CREATE TABLE customer_service.tb_conversation ( optsn VARCHAR(50) NOT NULL, -- 流水号 conversation_id VARCHAR(50) NOT NULL, -- 会话ID customer_id VARCHAR(50) NOT NULL, -- 客户ID conversation_type VARCHAR(30) DEFAULT 'ai', -- 会话类型:ai-AI客服/human-人工客服/transfer-转接 channel VARCHAR(20) DEFAULT 'wechat', -- 渠道:wechat-微信/web-网页/app-应用/phone-电话 agent_id VARCHAR(50), -- 智能体ID或客服人员ID agent_type VARCHAR(20) DEFAULT 'ai', -- 座席类型:ai-AI/human-人工 session_start_time TIMESTAMPTZ DEFAULT now(), -- 会话开始时间 session_end_time TIMESTAMPTZ, -- 会话结束时间 duration_seconds INTEGER, -- 会话时长(秒) message_count INTEGER DEFAULT 0, -- 消息数量 conversation_status VARCHAR(20) DEFAULT 'active', -- 会话状态:active-进行中/closed-已结束/transferred-已转接/timeout-超时 satisfaction_rating INTEGER, -- 满意度评分(1-5星) satisfaction_feedback TEXT, -- 满意度反馈 summary TEXT, -- 会话摘要(AI生成) tags TEXT[], -- 会话标签 metadata JSONB, -- 会话元数据 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (conversation_id), UNIQUE (optsn), FOREIGN KEY (customer_id) REFERENCES customer_service.tb_customer(customer_id) ); CREATE INDEX idx_conv_customer ON customer_service.tb_conversation(customer_id, session_start_time DESC) WHERE deleted = false; CREATE INDEX idx_conv_status ON customer_service.tb_conversation(conversation_status) WHERE deleted = false; CREATE INDEX idx_conv_agent ON customer_service.tb_conversation(agent_id) WHERE deleted = false; COMMENT ON TABLE customer_service.tb_conversation IS '会话表'; COMMENT ON COLUMN customer_service.tb_conversation.conversation_type IS '会话类型:ai/human/transfer'; -- 会话消息表 DROP TABLE IF EXISTS customer_service.tb_conversation_message CASCADE; CREATE TABLE customer_service.tb_conversation_message ( optsn VARCHAR(50) NOT NULL, -- 流水号 message_id VARCHAR(50) NOT NULL, -- 消息ID conversation_id VARCHAR(50) NOT NULL, -- 所属会话ID sender_type VARCHAR(20) NOT NULL, -- 发送者类型:customer-客户/agent-座席/system-系统 sender_id VARCHAR(50), -- 发送者ID message_type VARCHAR(30) NOT NULL DEFAULT 'text',-- 消息类型:text-文本/image-图片/voice-语音/video-视频/file-文件/card-卡片 content TEXT, -- 消息内容 content_url VARCHAR(500), -- 内容URL(图片、文件等) is_ai_generated BOOLEAN DEFAULT false, -- 是否AI生成 ai_model VARCHAR(100), -- 使用的AI模型 kb_references VARCHAR(50)[], -- 引用的知识库文档ID数组 confidence_score DECIMAL(5,4), -- AI回答置信度 sentiment VARCHAR(20), -- 情感分析:positive-正面/neutral-中性/negative-负面 intent VARCHAR(100), -- 意图识别结果 is_sensitive BOOLEAN DEFAULT false, -- 是否敏感信息 read_status BOOLEAN DEFAULT false, -- 已读状态 read_time TIMESTAMPTZ, -- 阅读时间 metadata JSONB, -- 消息元数据 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间(发送时间) deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (message_id), UNIQUE (optsn), FOREIGN KEY (conversation_id) REFERENCES customer_service.tb_conversation(conversation_id) ); CREATE INDEX idx_msg_conversation ON customer_service.tb_conversation_message(conversation_id, create_time) WHERE deleted = false; CREATE INDEX idx_msg_sender ON customer_service.tb_conversation_message(sender_id) WHERE deleted = false; COMMENT ON TABLE customer_service.tb_conversation_message IS '会话消息表'; COMMENT ON COLUMN customer_service.tb_conversation_message.sentiment IS '情感分析:positive/neutral/negative'; -- 工单表 DROP TABLE IF EXISTS customer_service.tb_ticket CASCADE; CREATE TABLE customer_service.tb_ticket ( optsn VARCHAR(50) NOT NULL, -- 流水号 ticket_id VARCHAR(50) NOT NULL, -- 工单ID ticket_no VARCHAR(100) NOT NULL, -- 工单编号 customer_id VARCHAR(50) NOT NULL, -- 客户ID conversation_id VARCHAR(50), -- 关联会话ID ticket_type VARCHAR(50) NOT NULL, -- 工单类型:consultation-咨询/complaint-投诉/suggestion-建议/repair-维修/installation-安装/other-其他 ticket_category VARCHAR(100), -- 工单分类(具体业务分类) priority VARCHAR(20) DEFAULT 'normal', -- 优先级:urgent-紧急/high-高/normal-普通/low-低 title VARCHAR(500) NOT NULL, -- 工单标题 description TEXT NOT NULL, -- 问题描述 attachments VARCHAR(50)[], -- 附件ID数组 ticket_source VARCHAR(30) DEFAULT 'ai', -- 工单来源:ai-AI生成/manual-人工创建/system-系统自动 assigned_to VARCHAR(50), -- 分配给(处理人) assigned_dept VARCHAR(50), -- 分配部门 ticket_status VARCHAR(30) DEFAULT 'pending', -- 工单状态:pending-待处理/processing-处理中/resolved-已解决/closed-已关闭/cancelled-已取消 resolution TEXT, -- 解决方案 resolution_time TIMESTAMPTZ, -- 解决时间 close_time TIMESTAMPTZ, -- 关闭时间 response_time TIMESTAMPTZ, -- 首次响应时间 sla_deadline TIMESTAMPTZ, -- SLA截止时间 is_overdue BOOLEAN DEFAULT false, -- 是否逾期 customer_rating INTEGER, -- 客户评分(1-5星) customer_feedback TEXT, -- 客户反馈 crm_ticket_id VARCHAR(50), -- CRM系统工单ID(外部系统) sync_status VARCHAR(20) DEFAULT 'pending', -- 同步状态:pending-待同步/synced-已同步/failed-失败 tags TEXT[], -- 工单标签 metadata JSONB, -- 工单元数据 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (ticket_id), UNIQUE (optsn), UNIQUE (ticket_no), FOREIGN KEY (customer_id) REFERENCES customer_service.tb_customer(customer_id) ); CREATE INDEX idx_ticket_customer ON customer_service.tb_ticket(customer_id) WHERE deleted = false; CREATE INDEX idx_ticket_status ON customer_service.tb_ticket(ticket_status) WHERE deleted = false; CREATE INDEX idx_ticket_assigned ON customer_service.tb_ticket(assigned_to) WHERE deleted = false; CREATE INDEX idx_ticket_priority ON customer_service.tb_ticket(priority) WHERE deleted = false; CREATE INDEX idx_ticket_sla ON customer_service.tb_ticket(sla_deadline) WHERE deleted = false AND is_overdue = false; COMMENT ON TABLE customer_service.tb_ticket IS '工单表'; COMMENT ON COLUMN customer_service.tb_ticket.ticket_type IS '工单类型:consultation/complaint/suggestion/repair/installation/other'; -- 工单处理记录表 DROP TABLE IF EXISTS customer_service.tb_ticket_log CASCADE; CREATE TABLE customer_service.tb_ticket_log ( optsn VARCHAR(50) NOT NULL, -- 流水号 log_id VARCHAR(50) NOT NULL, -- 日志ID ticket_id VARCHAR(50) NOT NULL, -- 工单ID action_type VARCHAR(50) NOT NULL, -- 操作类型:create-创建/assign-分配/update-更新/comment-评论/resolve-解决/close-关闭/reopen-重开 action_content TEXT, -- 操作内容 old_value TEXT, -- 旧值 new_value TEXT, -- 新值 operator_id VARCHAR(50), -- 操作人ID operator_name VARCHAR(100), -- 操作人姓名 attachments VARCHAR(50)[], -- 附件ID数组 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 PRIMARY KEY (log_id), UNIQUE (optsn), FOREIGN KEY (ticket_id) REFERENCES customer_service.tb_ticket(ticket_id) ); CREATE INDEX idx_ticket_log_ticket ON customer_service.tb_ticket_log(ticket_id, create_time DESC); COMMENT ON TABLE customer_service.tb_ticket_log IS '工单处理记录表'; -- FAQ表(常见问题) DROP TABLE IF EXISTS customer_service.tb_faq CASCADE; CREATE TABLE customer_service.tb_faq ( optsn VARCHAR(50) NOT NULL, -- 流水号 faq_id VARCHAR(50) NOT NULL, -- FAQ ID kb_id VARCHAR(50), -- 关联知识库ID category VARCHAR(100) NOT NULL, -- 分类 question TEXT NOT NULL, -- 问题 answer TEXT NOT NULL, -- 答案 similar_questions TEXT[], -- 相似问题数组 keywords TEXT[], -- 关键词数组 hit_count INTEGER DEFAULT 0, -- 命中次数 helpful_count INTEGER DEFAULT 0, -- 有帮助次数 unhelpful_count INTEGER DEFAULT 0, -- 无帮助次数 is_published BOOLEAN DEFAULT false, -- 是否发布 priority INTEGER DEFAULT 0, -- 优先级 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (faq_id), UNIQUE (optsn) ); CREATE INDEX idx_faq_category ON customer_service.tb_faq(category) WHERE deleted = false; CREATE INDEX idx_faq_published ON customer_service.tb_faq(is_published) WHERE deleted = false AND is_published = true; COMMENT ON TABLE customer_service.tb_faq IS 'FAQ常见问题表'; -- 客服评价表 DROP TABLE IF EXISTS customer_service.tb_service_evaluation CASCADE; CREATE TABLE customer_service.tb_service_evaluation ( optsn VARCHAR(50) NOT NULL, -- 流水号 evaluation_id VARCHAR(50) NOT NULL, -- 评价ID customer_id VARCHAR(50) NOT NULL, -- 客户ID conversation_id VARCHAR(50), -- 会话ID ticket_id VARCHAR(50), -- 工单ID evaluation_type VARCHAR(30) NOT NULL, -- 评价类型:conversation-会话/ticket-工单/overall-整体服务 rating INTEGER NOT NULL, -- 评分(1-5星) dimensions JSONB, -- 分维度评分(JSON格式:响应速度、专业性、态度等) feedback TEXT, -- 评价反馈 tags TEXT[], -- 评价标签 is_anonymous BOOLEAN DEFAULT false, -- 是否匿名 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (evaluation_id), UNIQUE (optsn), FOREIGN KEY (customer_id) REFERENCES customer_service.tb_customer(customer_id) ); CREATE INDEX idx_eval_customer ON customer_service.tb_service_evaluation(customer_id) WHERE deleted = false; CREATE INDEX idx_eval_rating ON customer_service.tb_service_evaluation(rating) WHERE deleted = false; COMMENT ON TABLE customer_service.tb_service_evaluation IS '客服评价表'; -- CRM集成配置表 DROP TABLE IF EXISTS customer_service.tb_crm_config CASCADE; CREATE TABLE customer_service.tb_crm_config ( optsn VARCHAR(50) NOT NULL, -- 流水号 config_id VARCHAR(50) NOT NULL, -- 配置ID crm_system VARCHAR(50) NOT NULL, -- CRM系统名称 api_endpoint VARCHAR(500) NOT NULL, -- API端点 api_key VARCHAR(500), -- API密钥(加密存储) auth_type VARCHAR(30) DEFAULT 'api_key', -- 认证类型:api_key/oauth2/basic_auth sync_interval INTEGER DEFAULT 3600, -- 同步间隔(秒) sync_direction VARCHAR(30) DEFAULT 'bidirectional',-- 同步方向:to_crm-单向到CRM/from_crm-单向从CRM/bidirectional-双向 field_mapping JSONB, -- 字段映射配置 sync_enabled BOOLEAN DEFAULT false, -- 是否启用同步 last_sync_time TIMESTAMPTZ, -- 最后同步时间 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (config_id), UNIQUE (optsn) ); COMMENT ON TABLE customer_service.tb_crm_config IS 'CRM集成配置表';