# 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;
```