715 lines
36 KiB
Markdown
715 lines
36 KiB
Markdown
# PostgreSQL to MySQL 数据库迁移脚本
|
||
|
||
## 概述
|
||
本文档包含从 urbanLifeline (PostgreSQL) 到 pigx (MySQL) 的数据库迁移脚本。
|
||
|
||
## 迁移策略
|
||
1. PostgreSQL Schema → MySQL Database 或表前缀
|
||
2. 所有业务表添加 `tenant_id` 字段
|
||
3. 用户ID关联到 pigx 的 sys_user 表
|
||
4. 数据类型映射和语法适配
|
||
|
||
## 类型映射规则
|
||
|
||
| 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 来客表(系统外部人员)
|
||
```sql
|
||
-- 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 '最大并发接待数',
|
||
`current_workload` int NOT NULL DEFAULT 0 COMMENT '当前工作量',
|
||
`total_served` int NOT NULL DEFAULT 0 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_status_workload` (`status`, `current_workload`),
|
||
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 智能体配置表
|
||
```sql
|
||
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 招标项目表
|
||
```sql
|
||
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 消息表
|
||
```sql
|
||
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)
|
||
|
||
```sql
|
||
-- 平台管理的表通常比较简单,主要是配置和日志
|
||
-- 根据实际需求补充具体表结构
|
||
```
|
||
|
||
## 6. 数据迁移脚本
|
||
|
||
### 6.1 用户数据映射
|
||
```sql
|
||
-- 创建用户映射表(临时)
|
||
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 数据迁移存储过程(示例)
|
||
```sql
|
||
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. 索引优化建议
|
||
|
||
```sql
|
||
-- 为查询性能添加复合索引
|
||
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. 注意事项
|
||
|
||
1. **租户隔离**:所有业务表都添加了 `tenant_id` 字段,默认值为 1
|
||
2. **用户关联**:需要建立原系统用户ID到pigx用户ID的映射关系
|
||
3. **数组处理**:PostgreSQL的数组类型转换为MySQL的JSON类型
|
||
4. **时区处理**:PostgreSQL的TIMESTAMPTZ转换为MySQL的DATETIME,注意时区转换
|
||
5. **外键约束**:根据实际需求决定是否保留外键约束
|
||
6. **数据完整性**:迁移前做好数据备份,迁移后进行数据验证
|
||
|
||
## 9. 迁移后验证
|
||
|
||
```sql
|
||
-- 验证数据条数
|
||
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;
|
||
``` |