36 KiB
36 KiB
PostgreSQL to MySQL 数据库迁移脚本
概述
本文档包含从 urbanLifeline (PostgreSQL) 到 pigx (MySQL) 的数据库迁移脚本。
迁移策略
- PostgreSQL Schema → MySQL Database 或表前缀
- 所有业务表添加
tenant_id字段 - 用户ID关联到 pigx 的 sys_user 表
- 数据类型映射和语法适配
类型映射规则
| PostgreSQL | MySQL | 说明 |
|---|---|---|
| SERIAL | INT AUTO_INCREMENT | 自增整数 |
| BIGSERIAL | BIGINT AUTO_INCREMENT | 自增大整数 |
| VARCHAR(n) | VARCHAR(n) | 可变长字符串 |
| TEXT | TEXT | 长文本 |
| TIMESTAMPTZ | DATETIME | 时间戳 |
| BOOLEAN | TINYINT(1) | 布尔值 |
| DECIMAL(m,n) | DECIMAL(m,n) | 十进制数 |
| INTEGER | INT | 整数 |
| BIGINT | BIGINT | 大整数 |
| JSONB | JSON | JSON数据 |
| VARCHAR(50)[] | JSON | 数组转JSON |
| TEXT[] | JSON | 文本数组转JSON |
1. 工单模块 (Workcase)
1.1 来客表(系统外部人员)
-- PostgreSQL 原表: sys.tb_guest
-- MySQL 目标表: tb_guest
CREATE TABLE IF NOT EXISTS `tb_guest` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`user_id` varchar(50) NOT NULL COMMENT '来客ID',
`name` varchar(50) NOT NULL COMMENT '姓名',
`phone` varchar(50) DEFAULT NULL COMMENT '电话',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`wechat_id` varchar(50) DEFAULT NULL COMMENT '微信号',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`user_id`),
UNIQUE KEY `uk_wechat_id` (`wechat_id`),
UNIQUE KEY `uk_phone` (`phone`),
UNIQUE KEY `uk_email` (`email`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统外部人员表';
### 1.2 聊天室表
CREATE TABLE IF NOT EXISTS `tb_chat_room` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`room_id` varchar(50) NOT NULL COMMENT '聊天室ID',
`workcase_id` varchar(50) DEFAULT NULL COMMENT '关联工单ID',
`room_name` varchar(200) NOT NULL COMMENT '聊天室名称',
`room_type` varchar(20) NOT NULL DEFAULT 'workcase' COMMENT '聊天室类型',
`status` varchar(20) NOT NULL DEFAULT 'active' COMMENT '状态:active-活跃 closed-已关闭 archived-已归档',
`guest_id` varchar(50) NOT NULL COMMENT '来客ID(创建者)',
`guest_name` varchar(100) NOT NULL COMMENT '来客姓名',
`ai_session_id` varchar(50) DEFAULT NULL COMMENT 'AI对话会话ID',
`message_count` int NOT NULL DEFAULT 0 COMMENT '消息总数',
`device_code` varchar(50) NOT NULL COMMENT '设备代码',
`last_message_time` datetime DEFAULT NULL COMMENT '最后消息时间',
`last_message` text DEFAULT NULL COMMENT '最后一条消息内容',
`comment_level` int DEFAULT 0 COMMENT '服务评分(1-5)',
`closed_by` varchar(50) DEFAULT NULL COMMENT '关闭人',
`closed_time` datetime DEFAULT NULL COMMENT '关闭时间',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`room_id`),
UNIQUE KEY `uk_workcase_id` (`workcase_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
KEY `idx_guest_status` (`guest_id`, `status`),
KEY `idx_last_message_time` (`last_message_time` DESC),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IM聊天室表,一个工单对应一个聊天室';
### 1.3 聊天室成员表
CREATE TABLE IF NOT EXISTS `tb_chat_room_member` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`member_id` varchar(50) NOT NULL COMMENT '成员记录ID',
`room_id` varchar(50) NOT NULL COMMENT '聊天室ID',
`user_id` varchar(50) NOT NULL COMMENT '用户ID(来客ID或员工ID)',
`user_type` varchar(20) NOT NULL COMMENT '用户类型:guest-来客 staff-客服 ai-AI助手',
`user_name` varchar(100) NOT NULL COMMENT '用户名称',
`status` varchar(20) NOT NULL DEFAULT 'active' COMMENT '状态:active-活跃 left-已离开 removed-被移除',
`unread_count` int NOT NULL DEFAULT 0 COMMENT '该成员的未读消息数',
`last_read_time` datetime DEFAULT NULL COMMENT '最后阅读时间',
`last_read_msg_id` varchar(50) DEFAULT NULL COMMENT '最后阅读的消息ID',
`join_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
`leave_time` datetime DEFAULT NULL COMMENT '离开时间',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`member_id`),
UNIQUE KEY `uk_room_user` (`room_id`, `user_id`),
KEY `idx_room_status` (`room_id`, `status`),
KEY `idx_user_status` (`user_id`, `user_type`, `status`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='聊天室成员表,记录来客和客服人员';
### 1.4 聊天室消息表
CREATE TABLE IF NOT EXISTS `tb_chat_room_message` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`message_id` varchar(50) NOT NULL COMMENT '消息ID',
`room_id` varchar(50) NOT NULL COMMENT '聊天室ID',
`sender_id` varchar(50) NOT NULL COMMENT '发送者ID',
`sender_type` varchar(20) NOT NULL COMMENT '发送者类型:guest-来客 agent-客服 ai-AI助手 system-系统消息',
`sender_name` varchar(100) NOT NULL COMMENT '发送者名称',
`message_type` varchar(20) NOT NULL DEFAULT 'text' COMMENT '消息类型:text-文本 image-图片 file-文件 voice-语音 video-视频',
`content` text NOT NULL COMMENT '消息内容',
`files` json DEFAULT NULL COMMENT '附件文件ID数组',
`content_extra` json DEFAULT NULL COMMENT '扩展内容',
`reply_to_msg_id` varchar(50) DEFAULT NULL COMMENT '回复的消息ID',
`is_ai_message` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否AI消息',
`ai_message_id` varchar(50) DEFAULT NULL COMMENT 'AI原始消息ID',
`status` varchar(20) NOT NULL DEFAULT 'sent' COMMENT '状态:sent-已发送 delivered-已送达 read-已读 failed-失败',
`read_count` int NOT NULL DEFAULT 0 COMMENT '已读人数',
`send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`message_id`),
KEY `idx_room_time` (`room_id`, `send_time` DESC),
KEY `idx_sender` (`sender_id`, `sender_type`),
KEY `idx_ai_message` (`ai_message_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IM聊天消息表,包含AI对话和人工客服消息';
### 1.5 聊天室总结表
CREATE TABLE IF NOT EXISTS `tb_chat_room_summary` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`summary_id` varchar(50) NOT NULL COMMENT '总结ID',
`room_id` varchar(50) NOT NULL COMMENT '聊天室ID',
`question` text DEFAULT NULL COMMENT '核心问题',
`needs` json DEFAULT NULL COMMENT '核心诉求数组',
`answer` text DEFAULT NULL COMMENT '解决方案',
`workcloud` json DEFAULT NULL COMMENT '词云关键词数组',
`message_count` int DEFAULT 0 COMMENT '参与总结的消息数量',
`summary_time` datetime DEFAULT NULL COMMENT '总结生成时间',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`summary_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
KEY `idx_room_time` (`room_id`, `summary_time` DESC),
KEY `idx_summary_time` (`summary_time` DESC),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='聊天室总结表,保存AI生成的聊天总结分析';
### 1.6 视频会议表
CREATE TABLE IF NOT EXISTS `tb_video_meeting` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`meeting_id` varchar(50) NOT NULL COMMENT '会议ID(也是Jitsi房间名)',
`room_id` varchar(50) NOT NULL COMMENT '关联聊天室ID',
`workcase_id` varchar(50) NOT NULL COMMENT '关联工单ID',
`meeting_name` varchar(200) NOT NULL COMMENT '会议名称',
`meeting_password` varchar(50) DEFAULT NULL COMMENT '会议密码',
`description` varchar(500) DEFAULT NULL COMMENT '会议描述',
`jwt_token` text DEFAULT NULL COMMENT 'JWT Token',
`jitsi_room_name` varchar(200) NOT NULL COMMENT 'Jitsi房间名',
`jitsi_server_url` varchar(500) NOT NULL DEFAULT 'https://meet.jit.si' COMMENT 'Jitsi服务器地址',
`status` varchar(20) NOT NULL DEFAULT 'scheduled' COMMENT '状态',
`creator_type` varchar(20) NOT NULL COMMENT '创建者类型',
`creator_name` varchar(100) NOT NULL COMMENT '创建者名称',
`participant_count` int NOT NULL DEFAULT 0 COMMENT '参与人数',
`max_participants` int DEFAULT 10 COMMENT '最大参与人数',
`start_time` datetime NOT NULL COMMENT '会议开始时间',
`end_time` datetime NOT NULL COMMENT '会议结束时间',
`advance` int DEFAULT 5 COMMENT '提前入会时间(分钟)',
`actual_start_time` datetime DEFAULT NULL COMMENT '实际开始时间',
`actual_end_time` datetime DEFAULT NULL COMMENT '实际结束时间',
`duration_seconds` int DEFAULT 0 COMMENT '会议时长(秒)',
`iframe_url` text DEFAULT NULL COMMENT 'iframe嵌入URL',
`config` json DEFAULT NULL COMMENT 'Jitsi配置项',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`meeting_id`),
UNIQUE KEY `uk_jitsi_room_name` (`jitsi_room_name`),
KEY `idx_room_status` (`room_id`, `status`),
KEY `idx_workcase_status` (`workcase_id`, `status`),
KEY `idx_create_time` (`create_time` DESC),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Jitsi Meet视频会议表';
### 1.7 客服人员配置表
CREATE TABLE IF NOT EXISTS `tb_customer_service` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`user_id` varchar(50) NOT NULL COMMENT '员工ID(关联sys用户ID)',
`username` varchar(100) NOT NULL COMMENT '员工姓名',
`user_code` varchar(50) DEFAULT NULL COMMENT '员工工号',
`status` varchar(20) NOT NULL DEFAULT 'offline' COMMENT '状态:online-在线 busy-忙碌 offline-离线',
`skill_tags` json DEFAULT NULL COMMENT '技能标签',
`max_concurrent` int NOT NULL DEFAULT 5 COMMENT '最大并发接待数',
`avg_response_time` int DEFAULT NULL COMMENT '平均响应时间(秒)',
`satisfaction_score` decimal(3,2) DEFAULT NULL COMMENT '满意度评分(0-5)',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`user_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客服人员配置表';
### 1.8 工单表
CREATE TABLE IF NOT EXISTS `tb_workcase` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`workcase_id` varchar(50) NOT NULL COMMENT '工单ID',
`room_id` varchar(50) NOT NULL COMMENT '聊天室ID',
`user_id` varchar(50) NOT NULL COMMENT '来客ID',
`username` varchar(200) NOT NULL COMMENT '来客姓名',
`phone` varchar(20) NOT NULL COMMENT '来客电话',
`type` varchar(50) NOT NULL COMMENT '故障类型',
`device` varchar(50) DEFAULT NULL COMMENT '设备名称',
`device_code` varchar(50) DEFAULT NULL COMMENT '设备代码',
`device_name_plate` varchar(50) DEFAULT NULL COMMENT '设备名称牌',
`device_name_plate_img` varchar(50) NOT NULL COMMENT '设备名称牌图片',
`address` varchar(1000) DEFAULT NULL COMMENT '现场地址',
`description` varchar(1000) DEFAULT NULL COMMENT '故障描述',
`imgs` json DEFAULT NULL COMMENT '工单图片id数组',
`emergency` varchar(50) NOT NULL DEFAULT 'normal' COMMENT '紧急程度 normal-普通 emergency-紧急',
`status` varchar(50) NOT NULL DEFAULT 'pending' COMMENT '状态 pending-待处理 processing-处理中 done-已完成',
`processor` varchar(50) DEFAULT NULL COMMENT '处理人',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`workcase_id`),
UNIQUE KEY `uk_room_id` (`room_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工单表';
### 1.9 工单处理过程表
CREATE TABLE IF NOT EXISTS `tb_workcase_process` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`workcase_id` varchar(50) NOT NULL COMMENT '工单ID',
`process_id` varchar(50) NOT NULL COMMENT '过程id',
`action` varchar(50) NOT NULL COMMENT '动作 info:记录,assign:指派,redeploy:转派,repeal:撤销,finish:完成',
`message` varchar(200) DEFAULT NULL COMMENT '消息',
`files` json DEFAULT NULL COMMENT '携带文件',
`processor` varchar(50) DEFAULT NULL COMMENT '处理人',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '过程发起人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`process_id`),
KEY `idx_workcase_id` (`workcase_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工单处理过程表';
### 1.10 工单设备文件表
CREATE TABLE IF NOT EXISTS `tb_workcase_device` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`workcase_id` varchar(50) NOT NULL COMMENT '工单ID',
`device` varchar(50) NOT NULL COMMENT '设备名称',
`device_code` varchar(50) DEFAULT NULL COMMENT '设备代码',
`file_id` varchar(50) NOT NULL COMMENT '文件id',
`file_name` varchar(50) NOT NULL COMMENT '文件名',
`file_root_id` varchar(50) DEFAULT NULL COMMENT '文件根id',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
PRIMARY KEY(`workcase_id`, `file_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工单设备文件表';
### 1.11 词云统计表
CREATE TABLE IF NOT EXISTS `tb_word_cloud` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`word_id` varchar(50) NOT NULL COMMENT '词条ID',
`word` varchar(100) NOT NULL COMMENT '词语',
`frequency` int NOT NULL DEFAULT 1 COMMENT '词频',
`source_type` varchar(20) NOT NULL COMMENT '来源类型 chat-聊天 workcase-工单 global-全局',
`source_id` varchar(50) DEFAULT NULL COMMENT '来源ID',
`category` varchar(50) DEFAULT NULL COMMENT '分类',
`stat_date` date NOT NULL COMMENT '统计日期',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`word_id`),
UNIQUE KEY `uk_word_source` (`word`, `source_type`, `source_id`, `stat_date`, `category`),
KEY `idx_source` (`source_type`, `source_id`, `stat_date`),
KEY `idx_category` (`category`, `stat_date`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='词云统计表';
2. AI模块 (Dify)
2.1 智能体配置表
CREATE TABLE IF NOT EXISTS `tb_agent` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`agent_id` varchar(50) NOT NULL COMMENT '智能体ID',
`name` varchar(50) NOT NULL COMMENT '智能体名称',
`description` varchar(500) DEFAULT NULL COMMENT '智能体描述',
`link` varchar(500) DEFAULT NULL COMMENT '智能体url',
`api_key` varchar(500) NOT NULL COMMENT 'dify智能体APIKEY',
`is_outer` tinyint(1) DEFAULT 0 COMMENT '是否是对外智能体,未登录可用',
`introduce` varchar(500) NOT NULL COMMENT '引导词',
`prompt_cards` json DEFAULT NULL COMMENT '提示卡片数组',
`category` varchar(50) NOT NULL COMMENT '分类',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) DEFAULT NULL COMMENT '创建者',
`updater` varchar(50) DEFAULT NULL COMMENT '更新者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`agent_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
UNIQUE KEY `uk_api_key` (`api_key`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI智能体配置表';
### 2.2 AI对话表
CREATE TABLE IF NOT EXISTS `tb_chat` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`chat_id` varchar(50) NOT NULL COMMENT '对话ID',
`agent_id` varchar(50) NOT NULL COMMENT '智能体ID',
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
`user_type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '用户类型 1-系统内部人员 0-系统外部人员',
`title` varchar(500) NOT NULL COMMENT '对话标题',
`channel` varchar(50) DEFAULT 'agent' COMMENT '对话渠道 agent、wechat',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`chat_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
KEY `idx_agent_id` (`agent_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI对话表';
### 2.3 AI对话消息表
CREATE TABLE IF NOT EXISTS `tb_chat_message` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`message_id` varchar(50) NOT NULL COMMENT '消息ID',
`dify_message_id` varchar(100) DEFAULT NULL COMMENT 'Dify消息ID',
`chat_id` varchar(50) NOT NULL COMMENT '对话ID',
`role` varchar(50) NOT NULL COMMENT '角色:user-用户/ai-智能体/recipient-来客',
`content` text NOT NULL COMMENT '消息内容',
`files` json DEFAULT NULL COMMENT '文件id数组',
`comment` varchar(50) DEFAULT NULL COMMENT '评价',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`message_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
KEY `idx_chat_id` (`chat_id`),
KEY `idx_dify_message_id` (`dify_message_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI对话消息表';
### 2.4 知识库配置表
CREATE TABLE IF NOT EXISTS `tb_knowledge` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`knowledge_id` varchar(50) NOT NULL COMMENT '知识库ID',
`title` varchar(255) NOT NULL COMMENT '知识库标题',
`avatar` varchar(255) DEFAULT NULL COMMENT '知识库头像',
`description` varchar(500) DEFAULT NULL COMMENT '知识库描述',
`dify_dataset_id` varchar(100) DEFAULT NULL COMMENT 'Dify知识库ID',
`dify_indexing_technique` varchar(50) DEFAULT 'high_quality' COMMENT 'Dify索引方式',
`embedding_model` varchar(100) DEFAULT NULL COMMENT '向量模型名称',
`embedding_model_provider` varchar(100) DEFAULT NULL COMMENT '向量模型提供商',
`rerank_model` varchar(100) DEFAULT NULL COMMENT 'Rerank模型名称',
`rerank_model_provider` varchar(100) DEFAULT NULL COMMENT 'Rerank模型提供商',
`reranking_enable` tinyint(1) DEFAULT 0 COMMENT '是否启用Rerank',
`retrieval_top_k` int DEFAULT 2 COMMENT '检索Top K',
`retrieval_score_threshold` decimal(3,2) DEFAULT 0.00 COMMENT '检索分数阈值',
`document_count` int DEFAULT 0 COMMENT '文档数量',
`total_chunks` int DEFAULT 0 COMMENT '总分段数',
`service` varchar(50) DEFAULT NULL COMMENT '所属服务 workcase、bidding',
`project_id` varchar(50) DEFAULT NULL COMMENT 'bidding所属项目ID',
`category` varchar(50) DEFAULT NULL COMMENT '所属分类',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建者',
`dept_path` varchar(50) DEFAULT NULL COMMENT '创建者部门路径',
`updater` varchar(50) DEFAULT NULL COMMENT '更新者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`optsn`),
UNIQUE KEY `uk_knowledge_id` (`knowledge_id`),
UNIQUE KEY `uk_dify_dataset_id` (`dify_dataset_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库配置表';
### 2.5 知识库文件表
CREATE TABLE IF NOT EXISTS `tb_knowledge_file` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`knowledge_id` varchar(50) NOT NULL COMMENT '知识库ID',
`file_root_id` varchar(50) NOT NULL COMMENT '文件根ID',
`file_id` varchar(50) NOT NULL COMMENT '文件ID',
`dify_file_id` varchar(50) NOT NULL COMMENT 'dify文件ID',
`version` int NOT NULL DEFAULT 1 COMMENT '文件版本',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`optsn`),
UNIQUE KEY `uk_knowledge_file` (`knowledge_id`, `file_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库文件表';
### 2.6 知识库文件日志表
CREATE TABLE IF NOT EXISTS `tb_knowledge_file_log` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`log_id` varchar(50) NOT NULL COMMENT '日志ID',
`knowledge_id` varchar(50) NOT NULL COMMENT '知识库ID',
`file_root_id` varchar(50) NOT NULL COMMENT '文件根ID',
`file_id` varchar(50) NOT NULL COMMENT '文件ID',
`file_name` varchar(100) NOT NULL COMMENT '文件名',
`service` varchar(50) NOT NULL COMMENT '所属服务 workcase、bidding',
`version` int NOT NULL DEFAULT 1 COMMENT '文件版本',
`action` varchar(50) NOT NULL COMMENT '操作类型 upload、update、delete',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL COMMENT '创建者',
`creator_name` varchar(100) NOT NULL COMMENT '创建者姓名',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`optsn`),
UNIQUE KEY `uk_knowledge_file_log` (`knowledge_id`, `file_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库文件日志表';
3. 招标模块 (Bidding)
3.1 招标项目表
CREATE TABLE IF NOT EXISTS `tb_bidding_project` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`project_id` varchar(50) NOT NULL COMMENT '项目ID',
`project_no` varchar(100) NOT NULL COMMENT '项目编号',
`project_name` varchar(500) NOT NULL COMMENT '项目名称',
`project_type` varchar(50) NOT NULL COMMENT '项目类型',
`industry` varchar(100) DEFAULT NULL COMMENT '所属行业',
`source_platform` varchar(100) DEFAULT NULL COMMENT '来源平台',
`source_url` varchar(500) DEFAULT NULL COMMENT '来源URL',
`publish_date` datetime DEFAULT NULL COMMENT '发布日期',
`deadline` datetime DEFAULT NULL COMMENT '投标截止日期',
`opening_date` datetime DEFAULT NULL COMMENT '开标日期',
`budget_amount` decimal(18,2) DEFAULT NULL COMMENT '预算金额',
`currency` varchar(10) DEFAULT 'CNY' COMMENT '货币单位',
`project_status` varchar(30) NOT NULL DEFAULT 'collecting' COMMENT '项目状态',
`winning_status` varchar(30) DEFAULT NULL COMMENT '中标状态',
`winning_amount` decimal(18,2) DEFAULT NULL COMMENT '中标金额',
`client_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`client_contact` varchar(100) DEFAULT NULL COMMENT '客户联系方式',
`contact_person` varchar(100) DEFAULT NULL COMMENT '联系人',
`project_location` varchar(500) DEFAULT NULL COMMENT '项目地点',
`description` text DEFAULT NULL COMMENT '项目描述',
`keywords` json DEFAULT NULL COMMENT '关键词数组',
`metadata` json DEFAULT NULL COMMENT '项目元数据',
`dept_path` varchar(255) DEFAULT NULL COMMENT '部门全路径',
`responsible_user` varchar(50) DEFAULT NULL COMMENT '负责人',
`team_members` json DEFAULT NULL COMMENT '团队成员数组',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) DEFAULT NULL COMMENT '创建者',
`updater` varchar(50) DEFAULT NULL COMMENT '更新者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`project_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
UNIQUE KEY `uk_project_no` (`project_no`),
KEY `idx_project_status` (`project_status`),
KEY `idx_deadline` (`deadline`),
KEY `idx_dept_path` (`dept_path`),
KEY `idx_responsible_user` (`responsible_user`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='招标项目表';
### 3.2 招标文件表
CREATE TABLE IF NOT EXISTS `tb_bidding_document` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`doc_id` varchar(50) NOT NULL COMMENT '文档ID',
`project_id` varchar(50) NOT NULL COMMENT '所属项目ID',
`doc_type` varchar(50) NOT NULL COMMENT '文档类型',
`doc_name` varchar(500) NOT NULL COMMENT '文档名称',
`file_id` varchar(50) DEFAULT NULL COMMENT '关联文件表ID',
`file_path` varchar(500) DEFAULT NULL COMMENT '文件路径',
`file_size` bigint DEFAULT NULL COMMENT '文件大小',
`mime_type` varchar(100) DEFAULT NULL COMMENT 'MIME类型',
`version` int DEFAULT 1 COMMENT '版本号',
`language` varchar(20) DEFAULT 'zh-CN' COMMENT '语言',
`page_count` int DEFAULT NULL COMMENT '页数',
`parse_status` varchar(30) DEFAULT 'pending' COMMENT '解析状态',
`parse_result` json DEFAULT NULL COMMENT '解析结果',
`extraction_data` json DEFAULT NULL COMMENT '提取的结构化数据',
`ai_analysis` text DEFAULT NULL COMMENT 'AI分析结果',
`upload_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '上传日期',
`dept_path` varchar(255) DEFAULT NULL COMMENT '部门全路径',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) DEFAULT NULL COMMENT '创建者',
`updater` varchar(50) DEFAULT NULL COMMENT '更新者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`doc_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
KEY `idx_project_id` (`project_id`),
KEY `idx_doc_type` (`doc_type`),
KEY `idx_tenant_id` (`tenant_id`),
CONSTRAINT `fk_bidding_document_project` FOREIGN KEY (`project_id`) REFERENCES `tb_bidding_project`(`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='招标文件表';
4. 消息模块 (Message)
4.1 消息表
CREATE TABLE IF NOT EXISTS `tb_message` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`message_id` varchar(50) NOT NULL COMMENT '消息ID',
`title` varchar(255) NOT NULL COMMENT '消息标题',
`content` varchar(255) NOT NULL COMMENT '消息内容',
`type` varchar(50) NOT NULL COMMENT '消息类型',
`status` varchar(50) NOT NULL COMMENT '消息状态',
`service` varchar(50) NOT NULL COMMENT '服务类型',
`dept_path` varchar(255) DEFAULT NULL COMMENT '部门全路径',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL DEFAULT 'system' COMMENT '创建者',
`updater` varchar(50) DEFAULT NULL COMMENT '更新者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`message_id`),
UNIQUE KEY `uk_optsn` (`optsn`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息表';
### 4.2 消息发送范围表
CREATE TABLE IF NOT EXISTS `tb_message_range` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`message_id` varchar(50) NOT NULL COMMENT '消息ID',
`target_type` varchar(20) NOT NULL COMMENT '目标类型:user/dept/role/all',
`target_id` varchar(50) DEFAULT NULL COMMENT '目标ID',
`channel` varchar(20) NOT NULL DEFAULT 'app' COMMENT '发送渠道',
`dept_path` varchar(255) DEFAULT NULL COMMENT '部门全路径',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`creator` varchar(50) NOT NULL DEFAULT 'system' COMMENT '创建者',
`updater` varchar(50) DEFAULT NULL COMMENT '更新者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
`deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`optsn`),
UNIQUE KEY `uk_message_target` (`message_id`, `target_type`, `target_id`, `channel`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息发送范围定义表';
### 4.3 消息接收记录表
CREATE TABLE IF NOT EXISTS `tb_message_receiver` (
`optsn` varchar(50) NOT NULL COMMENT '流水号',
`message_id` varchar(50) NOT NULL COMMENT '消息ID',
`user_id` varchar(50) NOT NULL COMMENT '用户ID',
`channel` varchar(20) DEFAULT 'app' COMMENT '接收渠道',
`status` varchar(20) NOT NULL DEFAULT 'unread' COMMENT '状态',
`read_time` datetime DEFAULT NULL COMMENT '阅读时间',
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`optsn`),
UNIQUE KEY `uk_message_user` (`message_id`, `user_id`, `channel`),
KEY `idx_user_status` (`user_id`, `status`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户消息接收记录表';
5. 平台管理模块 (Platform)
-- 平台管理的表通常比较简单,主要是配置和日志
-- 根据实际需求补充具体表结构
6. 数据迁移脚本
6.1 用户数据映射
-- 创建用户映射表(临时)
CREATE TABLE IF NOT EXISTS `temp_user_mapping` (
`old_user_id` varchar(50) NOT NULL COMMENT '原系统用户ID',
`new_user_id` bigint NOT NULL COMMENT 'pigx系统用户ID',
`user_type` varchar(20) NOT NULL COMMENT '用户类型',
PRIMARY KEY (`old_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户ID映射表(临时)';
-- 插入映射数据(示例)
-- INSERT INTO temp_user_mapping (old_user_id, new_user_id, user_type)
-- SELECT old_id, new_id, 'staff' FROM ...;
6.2 数据迁移存储过程(示例)
DELIMITER $$
CREATE PROCEDURE migrate_workcase_data()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE v_old_user_id VARCHAR(50);
DECLARE v_new_user_id BIGINT;
DECLARE cur CURSOR FOR
SELECT old_user_id, new_user_id FROM temp_user_mapping;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 开始事务
START TRANSACTION;
-- 迁移工单数据
INSERT INTO tb_workcase (
optsn, workcase_id, room_id, user_id, username, phone,
type, device, device_code, device_name_plate, device_name_plate_img,
address, description, imgs, emergency, status, processor,
tenant_id, creator, create_time, update_time, delete_time, deleted
)
SELECT
optsn, workcase_id, room_id,
COALESCE(m.new_user_id, w.user_id) as user_id, -- 映射用户ID
username, phone,
type, device, device_code, device_name_plate, device_name_plate_img,
address, description,
CASE WHEN imgs IS NULL THEN NULL ELSE JSON_ARRAY(imgs) END, -- 数组转JSON
emergency, status, processor,
1 as tenant_id, -- 默认租户ID
creator, create_time, update_time, delete_time, deleted
FROM postgresql_workcase.tb_workcase w
LEFT JOIN temp_user_mapping m ON w.user_id = m.old_user_id;
COMMIT;
END$$
DELIMITER ;
7. 索引优化建议
-- 为查询性能添加复合索引
ALTER TABLE tb_workcase ADD INDEX idx_status_tenant (status, tenant_id);
ALTER TABLE tb_chat_room ADD INDEX idx_status_tenant (status, tenant_id);
ALTER TABLE tb_chat_message ADD INDEX idx_chat_tenant (chat_id, tenant_id);
ALTER TABLE tb_agent ADD INDEX idx_category_tenant (category, tenant_id);
8. 注意事项
- 租户隔离:所有业务表都添加了
tenant_id字段,默认值为 1 - 用户关联:需要建立原系统用户ID到pigx用户ID的映射关系
- 数组处理:PostgreSQL的数组类型转换为MySQL的JSON类型
- 时区处理:PostgreSQL的TIMESTAMPTZ转换为MySQL的DATETIME,注意时区转换
- 外键约束:根据实际需求决定是否保留外键约束
- 数据完整性:迁移前做好数据备份,迁移后进行数据验证
9. 迁移后验证
-- 验证数据条数
SELECT 'tb_workcase' as table_name, COUNT(*) as record_count FROM tb_workcase
UNION ALL
SELECT 'tb_chat_room', COUNT(*) FROM tb_chat_room
UNION ALL
SELECT 'tb_agent', COUNT(*) FROM tb_agent
UNION ALL
SELECT 'tb_chat', COUNT(*) FROM tb_chat
UNION ALL
SELECT 'tb_knowledge', COUNT(*) FROM tb_knowledge;
-- 验证租户隔离
SELECT tenant_id, COUNT(*) as count
FROM tb_workcase
GROUP BY tenant_id;
-- 验证用户关联
SELECT COUNT(*) as unmapped_users
FROM tb_workcase w
LEFT JOIN sys_user u ON w.user_id = u.user_id
WHERE u.user_id IS NULL;