# 中高低风险修复优化计划

> 适用范围：`leaudit-platform` 当前权限、租户、地区隔离、多租户入口模块改造收尾阶段  
> 更新日期：2026-05-20  
> 文档定位：把当前“哪些地方还没收口”转成可执行的风险分级修复计划，作为后续逐步开发、联调、验收的直接依据。

---

## 1. 总体原则

本轮改造后续一律按下面 5 条原则推进：

1. 所有“归属租户”语义统一收口到 `tenant_code`
2. `tenant_name` 只负责展示，不再承担主键语义
3. `area / region / default / 省级 / 公共` 只允许存在于兼容层、历史数据清洗层、展示层
4. 所有 service 内部查询、写入、权限边界判断优先走 `tenant_code`
5. 所有角色判断最终要迁到“权限点 + 数据范围 + 租户能力”，不能长期保留 `admin/provincial_admin/common/super_admin` 业务硬编码

---

## 2. 风险分级标准

### 2.1 高风险

满足任一条件即归为高风险：

1. 会直接导致“查错数据、落错租户、串版本、越权访问”
2. 底层数据表没有 `tenant_code` 主字段，当前仍靠 `area/region` 做真实过滤
3. 查询链路和写入链路不一致，容易出现“写到 A，查按 B”
4. 会影响多个下游模块的主数据域

### 2.2 中风险

满足任一条件即归为中风险：

1. 不一定立刻串数据，但会造成前后端边界不一致
2. 前端仍按旧角色、旧地区字段判断，和后端真实权限模型不一致
3. 业务能跑，但兼容层和正式模型混用，后续维护成本高且容易继续扩散

### 2.3 低风险

满足任一条件即归为低风险：

1. 不直接影响数据正确性与权限边界
2. 主要影响可维护性、一致性、可理解性、页面上手体验
3. 适合在主链稳定后统一清理

---

## 3. 高风险修复计划

## 3.1 范围

当前高风险模块如下：

1. 文档模块 `T2`
2. 内部公文模块 `T3`
3. 合同模板模块 `T6`
4. 系统使用统计模块 `T7`
5. 核心业务表 `tenant_code` 缺失与历史 `area/region` 主过滤残留

## 3.2 当前问题

这些模块虽然已经接了 `TenantResolver` 或兼容入参，但底层仍存在以下问题：

1. 业务表未落真实 `tenant_code`
2. SQL 过滤主条件仍是 `region/area`
3. 接口表面支持 `tenant_code`，但只是转译成中文地区再去查
4. 历史公共范围仍散落为 `default / 公共 / 省级`
5. 统计快照字段还没有完整记录 `tenant_code`

## 3.3 修复目标

高风险阶段必须达成：

1. 核心业务表具备 `tenant_code`
2. 列表、详情、上传、删除、运行、版本链、统计聚合统一按 `tenant_code`
3. `region/area` 退化为兼容展示字段
4. `PUBLIC / PROVINCIAL` 变成规范租户编码，不再以中文和 `default` 直接参与 SQL

## 3.4 执行顺序

### `H1` 数据库主链补齐

目标：

1. 识别仍缺 `tenant_code` 的核心业务表
2. 补字段、索引、必要约束
3. 设计历史数据回填脚本

优先表：

1. `leaudit_documents`
2. `contract_templates`
3. `usage_login_events`
4. `rag_dataset`
5. `rag_chat_app`
6. 评估内部公文相关主表是否需单独补 `tenant_code`，还是直接复用 `leaudit_documents.tenant_code`

### `H2` 文档模块收口

目标：

1. 上传写入 `tenant_code`
2. 列表/详情/附件/删除/版本链按 `tenant_code` 查询
3. `_resolve_document_region` 降级为兼容展示方法

### `H3` 内部公文模块收口

目标：

1. 上传、列表、详情、运行、结果统一基于 `tenant_code`
2. 公文版本链、运行链、路径链路不再以 `region` 作为真实归属键

### `H4` 合同模板模块收口

目标：

1. 去掉 `'' AS tenant_code` 这类伪租户返回
2. 列表、详情、搜索、上传统一改成真实 `tenant_code`
3. `region` 只保留中文展示与兼容输入

当前进展：

1. 第一轮高风险已完成
2. 上传权限、列表/详情/搜索 scope、公共/省级查询口径已收口为 `tenant_code` 优先
3. 旧数据仍允许按 `region` 兜底命中，但不再把 `region` 当新数据真实归属键

### `H5` 统计模块收口

目标：

1. 登录/上传/运行等事件记录租户快照
2. 聚合统计按 `tenant_code` 计算
3. 页面展示再映射为 `tenant_name`

## 3.5 高风险验收标准

1. 任意核心业务记录都能明确看到 `tenant_code`
2. 同名文档、模板、公文在不同租户之间不会串数据
3. 非本租户用户无法通过列表、详情、附件、运行、统计明细绕过边界
4. 公共/省级范围由规范租户编码统一表达
5. 即使 `tenant_name` 被修改，历史归属和查询边界也不受影响

## 3.6 高风险阶段不做的事

1. 不在这个阶段追求完全去掉所有 `region/area` 字段
2. 不在这个阶段大面积重构统一权限执行器
3. 不在这个阶段优先做页面视觉优化

---

## 4. 中风险修复计划

## 4.1 范围

当前中风险模块如下：

1. `T4` RAG 知识库模块
2. `T1` RBAC 管理域剩余角色/范围硬编码
3. `T10` 前端菜单、守卫、按钮显隐中的旧角色判断
4. 交叉评查入口与可见性判断残留的 `area/region/provincial_admin` 分支

## 4.2 当前问题

1. 前后端都还存在“认角色名”的逻辑
2. RAG 底层还是 `area` 主模型
3. 前端可见性和后端鉴权未完全同构
4. 某些页面已经接了租户接口，但按钮是否显示仍按 `admin/provincial_admin`

## 4.3 修复目标

1. RAG 数据集、应用改用 `tenant_code`
2. 前端从“角色名驱动”迁到“权限点 + 能力 + 租户归属”
3. RBAC 页面中的核心角色保护、系统角色识别改为后端权威字段或配置
4. 菜单守卫与接口鉴权口径保持一致

## 4.4 执行顺序

### `M1` RAG 数据模型和服务收口

目标：

1. `rag_dataset`、`rag_chat_app` 补 `tenant_code`
2. service 查询、创建、编辑、删除统一按 `tenant_code`
3. 公共知识库策略从角色判断改为标准租户能力规则

### `M2` 前端角色硬编码收口

目标：

1. `user-routes`
2. `guard`
3. `cross-checking-access`
4. `role-permissions`
5. `contract-template`
6. `dify-dataset-manager`

统一改成：

1. 按权限点判断能否访问
2. 按租户归属判断能否管理
3. 仅保留极少数系统级保底兼容

### `M3` RBAC 边界统一

目标：

1. 系统角色识别不再由前端手工猜
2. 角色删除保护由后端统一返回是否允许删除
3. 页面展示不再写死 `provincial_admin/admin/common`

## 4.5 中风险验收标准

1. 自定义角色只要拿到权限，前端就能正确显示入口与按钮
2. 没有权限时，即使角色名叫 `admin` 也不能误显示能力
3. 前端守卫、菜单、按钮显隐与接口 403 结果一致
4. RAG 不再依赖 `area` 作为真实归属字段

---

## 5. 低风险修复计划

## 5.1 范围

当前低风险事项如下：

1. 页面 UI 风格统一
2. 旧命名清理
3. 兼容字段对外返回口径统一
4. 文档导航与开发说明补齐

## 5.2 当前问题

1. 租户管理页和角色权限页视觉系统还不完全统一
2. 前端大量 `area-*`、`region-*`、`tenant-*` 命名混用
3. 部分返回结构里主字段和兼容字段同时存在，但优先级不够明确

## 5.3 修复目标

1. 租户管理、角色权限、入口模块等后台页风格统一
2. 新接口主输出统一为 `tenant_code / tenant_name`
3. 旧字段仅作为兼容字段保留，并在类型和注释中明确标记
4. 文档导航和执行进度持续更新

## 5.4 执行顺序

### `L1` 角色权限页样式统一

目标：

1. 完成 `RolePermissionsClient.tsx` 新结构对应 CSS
2. 与租户管理页保持同一后台设计语言

### `L2` 命名清理

目标：

1. 新增代码不再出现新的 `area-*` 命名
2. 旧 `area/region` 命名逐步迁到 `tenant-*`

### `L3` 文档与注释补充

目标：

1. 更新总导航
2. 更新当前进度
3. 为新迁移脚本和关键兼容点补说明

## 5.5 低风险验收标准

1. 页面风格统一、上手成本降低
2. 新代码可读性显著提升
3. 后续开发者能明确知道哪些字段是主字段、哪些只是兼容字段

---

## 6. 推荐执行计划

建议按下面顺序推进：

1. 先完成高风险 `H1-H5`
2. 再完成中风险 `M1-M3`
3. 最后完成低风险 `L1-L3`

原因：

1. 先保数据和边界正确
2. 再保权限模型一致
3. 最后做视觉、命名、文档收尾

---

## 7. 本轮立即启动项

本轮开始直接执行以下两件事：

1. 先补“高风险数据库迁移清单”，明确哪些表要加 `tenant_code`
2. 然后从 `T2/T3/T6` 主链开始，把文档、公文、合同模板改成 `tenant_code` 主过滤

这两步完成后，项目才算真正进入“tenant_code 全链路收口”阶段，而不是继续停留在兼容层阶段。
