# 高风险数据库迁移清单与执行顺序

> 适用范围：`leaudit-platform` 当前从 `area/region` 过渡到 `tenant_code` 的高风险数据库收口阶段  
> 更新日期：2026-05-21  
> 文档定位：明确高风险阶段数据库需要补哪些字段、为什么补、执行顺序是什么、哪些脚本需要先后落地。

---

## 1. 目标

本清单只解决一个核心问题：

当前多个核心业务表仍没有把 `tenant_code` 作为真实归属主字段，导致代码层即使传了 `tenant_code`，最终也只是转成中文 `area/region` 去查。

高风险数据库阶段的目标是：

1. 所有核心业务主表具备真实 `tenant_code`
2. 查询和写入具备切到 `tenant_code` 主链的基础
3. 历史 `area/region/default/省级/公共` 有明确回填路径

---

## 2. 高风险表清单

## 2.1 必须补字段的主表

### `D1` leaudit_documents

当前现状：

1. 模型层只有 `region`
2. 文档、公文、交叉评查、版本链大量依赖该表

必须新增：

1. `tenant_code VARCHAR(64) NULL`

建议索引：

1. `idx_leaudit_documents_tenant_code`
2. `idx_leaudit_documents_type_tenant_name_latest`
   说明：替代当前依赖 `region` 的版本匹配索引

### `D2` contract_templates

当前现状：

1. 主表只有 `region`
2. service 返回里仍存在 `'' AS tenant_code`

必须新增：

1. `tenant_code VARCHAR(64) NULL`

建议索引：

1. `idx_contract_templates_tenant_code_active`
2. `uq_contract_templates_tenant_code_code_active`

### `D3` usage_login_events

当前现状：

1. 只有 `area_snapshot`
2. 登录统计无法稳定按租户回溯

必须新增：

1. `tenant_code_snapshot VARCHAR(64) NULL`
2. `tenant_name_snapshot VARCHAR(128) NULL`

建议索引：

1. `idx_usage_login_events_tenant_code`

### `D4` rag_dataset

当前现状：

1. 只有 `area`
2. 数据集可见性和编辑权限仍依赖旧地区模型

必须新增：

1. `tenant_code VARCHAR(64) NULL`

建议索引：

1. `idx_rag_dataset_tenant_code`
2. 后续可替代 `idx_rag_dataset_area`

### `D5` rag_chat_app

当前现状：

1. 只有 `area`
2. 聊天应用可见性仍跟旧地区字段耦合

必须新增：

1. `tenant_code VARCHAR(64) NULL`

建议索引：

1. `idx_rag_chat_app_tenant_code`

### `D8` evaluation_points

当前现状：

1. 真实运行链路仍使用旧表 `evaluation_points`
2. 评查点模块代码已切到 `tenant_code` 优先，但旧表仍可能只有 `area`
3. 若数据库不补列，模块只能长期停留在兼容态

必须新增：

1. `tenant_code VARCHAR(64) NULL`
2. `tenant_name VARCHAR(128) NULL`

建议索引：

1. `idx_evaluation_points_tenant_code`
2. `idx_evaluation_points_group_tenant_code`
3. `idx_evaluation_points_group_pid_tenant_code`

## 2.2 暂不直接补字段，但依赖主表收口的表

### `D6` govdoc_runs / govdoc_rule_results / govdoc_report_artifacts

结论：

1. 暂不优先单独加 `tenant_code`
2. 先通过 `govdoc_runs.document_id -> leaudit_documents.tenant_code` 间接收口
3. 等主链稳定后，再评估是否补冗余快照列提升报表与筛选性能

### `D7` leaudit_audit_runs / 评查结果衍生表

结论：

1. 暂不优先单独加 `tenant_code`
2. 先通过 `document_id -> leaudit_documents.tenant_code` 收口
3. 若后续统计或明细页性能不足，再追加快照字段

---

## 3. 历史数据回填规则

## 3.1 统一回填原则

所有历史回填统一按下面顺序处理：

1. 若已有 `tenant_code` 且合法，保留
2. 否则根据原 `tenant_code` 对应编码直接回填
3. 否则根据 `tenant_name`
4. 否则根据 `area`
5. 否则根据 `region`
6. 若值为 `default / 公共 / 省级 / 空值`，回填为规范编码

规范编码建议：

1. `PUBLIC`
2. `PROVINCIAL`

## 3.2 别名映射来源

优先使用：

1. `sys_tenants`
2. `sys_tenant_aliases`

不再允许长期使用硬编码映射表作为正式来源。

## 3.3 风险点

以下数据回填前必须预检：

1. 同一个中文地区名是否映射到多个租户编码
2. 是否存在脏数据：空格、大小写、历史缩写混用
3. 是否存在已经改名但旧数据仍用旧租户名的记录

---

## 4. 执行顺序

## 4.1 第一步：补列，不切读写

执行内容：

1. 给 `leaudit_documents`
2. `contract_templates`
3. `usage_login_events`
4. `rag_dataset`
5. `rag_chat_app`
6. `evaluation_points`

先补 `tenant_code` 或快照字段及索引。

目标：

1. 不影响当前存量逻辑
2. 为后续渐进式代码改造做准备

## 4.2 第二步：做历史回填

执行内容：

1. 用 `sys_tenant_aliases` 回填历史 `region/area`
2. 对 `PUBLIC/PROVINCIAL` 做统一归并

目标：

1. 让存量数据先具备基础 `tenant_code`
2. 避免代码一切换就出现大量空值

## 4.3 第三步：后端改读写

执行内容：

1. 文档模块先切
2. 公文模块第二个切
3. 合同模板第三个切
4. 统计与 RAG 随后切

目标：

1. 读写统一以 `tenant_code` 为主
2. `region/area` 退化为兼容展示字段

## 4.4 第四步：补约束与清理旧索引

等代码和数据稳定后再做：

1. 评估 `tenant_code` 是否可加 `NOT NULL`
2. 评估是否可将唯一索引从 `region` 改为 `tenant_code`
3. 逐步淘汰旧 `area/region` 主过滤索引

---

## 5. 本轮建议新增的 SQL 脚本

建议新增一个统一高风险迁移脚本：

1. `scripts/创建sql/schema_tenant_code_high_risk_phase1.sql`
2. `scripts/创建sql/schema_evaluation_points_tenant_cleanup.sql`

建议内容：

1. 给核心业务表补 `tenant_code` / `tenant_code_snapshot`
2. 建立基础索引
3. 执行首轮历史回填
4. 对评查点旧表单独补 `tenant_code/tenant_name` 与共享域标准编码回填

后续再拆第二阶段脚本：

1. `scripts/创建sql/migrate_tenant_code_high_risk_phase2_cleanup.sql`

用于：

1. 强化约束
2. 调整唯一索引
3. 清理旧索引

---

## 6. 验收标准

数据库层本阶段完成后，应满足：

1. 核心业务主表都能查到 `tenant_code`
2. 核心历史数据回填完成率可统计
3. `PUBLIC / PROVINCIAL` 已规范化
4. 后端可以在不依赖中文 `area/region` 的前提下完成后续主链改造

---

## 7. 本轮直接执行项

本轮直接开始：

1. 新增 `schema_tenant_code_high_risk_phase1.sql`
2. 先补列与索引
3. 加入首轮基于 `sys_tenant_aliases` 的历史回填 SQL
4. 评查点模块单独补充 [schema_evaluation_points_tenant_cleanup.sql](/home/wren-dev/Porject/leaudit-platform/scripts/创建sql/schema_evaluation_points_tenant_cleanup.sql)，用于旧表 `evaluation_points` 的收尾

随后再进入 service 层改造。
