# 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 '最大并发接待数', `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 智能体配置表 ```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; ```