# 新平台主链路租户改造实施任务单

> 目标：把新平台主链路从“半租户化”推进到“关键链路 tenant-first”  
> 当前优先级：先修会落错数据、查错范围、跨租户误改的链路

---

## T1 文档上传 tenant-first 收口

### 数据库变更

- 无强制新表
- 如当前库中还没有文档业务快照字段，需要补充：
  - `leaudit_documents.root_group_id`
  - `leaudit_documents.entry_module_id`

### 后端改造

- `Upload` 改为显式以 `tenant_code` 为主，不再依赖 `region` 主导归属
- 上传时校验：
  - `group_id` 必须属于 `document_type_id`
  - `group_id` 必须属于当前入口模块业务树
  - `group_id` 必须属于当前租户允许范围
- 上传落库时持久化：
  - `tenant_code`
  - `group_id`
  - `root_group_id`
  - `entry_module_id`

### 前端改造

- 上传页显式提交 `tenant_code`
- 上传页不再仅传 `region`
- 上传页当前租户显式展示

### 验收点

- 同一文档类型、不同租户上传，不会再混入同一版本链
- 上传请求缺少 `tenant_code` 时，行为明确可控
- 非当前租户二级组 ID 无法上传成功

### 风险

- 历史旧文档若仍无 `tenant_code`，需要兼容迁移窗口

---

## T2 文档列表/详情停止 `tenant_code + region` 混查

### 数据库变更

- 如缺索引，确认：
  - `idx_leaudit_documents_tenant_code`
  - `idx_leaudit_documents_group_id`

### 后端改造

- 收紧 `_document_tenant_filter_sql`
- 收紧 `_buildDocumentScopeFilters`
- 收紧 `_find_latest_version_candidate`
- 停止危险的“`tenant_code` 不命中就退回 `region`”

### 前端改造

- 文档列表请求显式带 `tenant_code`
- 列表页显示当前租户范围

### 验收点

- 同地区旧数据不会再被当成当前租户数据读出来
- 文档列表和详情在同一租户下口径一致

### 风险

- 某些历史脏数据可能在收紧后“暂时查不到”，需要预先判定为预期行为

---

## T3 文档业务边界快照固化

### 数据库变更

- 补字段：
  - `leaudit_documents.root_group_id`
  - `leaudit_documents.entry_module_id`

### 后端改造

- 上传落库时写入业务快照
- 列表/详情优先读持久化快照，不再运行时推断
- 减少 `COALESCE(d.group_id, inferred_group_id)` 这类推导

### 前端改造

- 无必须改动
- 后续可显示上传时绑定的业务子类型

### 验收点

- 分组树配置变化后，历史文档仍保持原业务归属

### 风险

- 需要一次性回填历史文档快照

---

## T4 RuleController 鉴权与权限补齐

### 数据库变更

- 无

### 后端改造

- `RuleController` 全量加 `verify_access_token`
- 补功能权限校验
- 统一透传当前租户上下文

### 前端改造

- 无必须改动

### 验收点

- 未登录不能直接访问规则接口
- 无权限用户不能读写规则版本和绑定

### 风险

- 可能暴露前端现有页面实际依赖“裸接口”的问题

---

## T5 评查组读链路 tenant-first 收口

### 数据库变更

- 短期可先不改表结构
- 中期需要评估给 `leaudit_evaluation_point_groups` 增加 `tenant_code`

### 后端改造

- `ListGroups`
- `ListAllGroups`
- `GetGroup`
- `GetChildren`
- `ListGroupsByDocumentTypes`

以上全部接入租户过滤

### 前端改造

- `rule-groups` 页面查询显式带 `tenant_code`
- 页面头部显示当前租户

### 验收点

- 不同租户打开分组页，看到的根组/子组不再混杂

### 风险

- 如果当前业务暂时仍共享分组树，需要先定义共享策略

---

## T6 评查组写链路 tenant-first 收口

### 数据库变更

- 中期大概率需要：
  - `leaudit_evaluation_point_groups.tenant_code`
  - `leaudit_rule_group_bindings.tenant_code`

### 后端改造

- `CreateGroup`
- `UpdateGroup`
- `DeleteGroup`
- `BatchDelete`
- `BatchUpdateStatus`
- `RebindGroup`
- `CreateBinding`
- `UpdateBinding`
- `DeleteBinding`

全部改成租户内操作

### 前端改造

- 编辑、删除、迁移前提示当前租户范围

### 验收点

- 无法跨租户误删、误绑、误迁移分组

### 风险

- `RebindGroup` 是最高危操作，必须单独加保护

---

## T7 规则版本与规则集归属模型重构

### 数据库变更

- 评估是否新增：
  - `leaudit_rule_sets.tenant_code`
  - `leaudit_rule_versions.tenant_code`

### 后端改造

- `CreateVersion`
- `PublishRuleVersion`
- `RollbackRuleVersion`
- `ListSets`
- `GetVersions`
- `GetContent`

全部明确租户归属模型

### 前端改造

- 规则列表/版本查看显示当前租户

### 验收点

- 一个租户发布规则版本，不会影响另一个租户同名规则类型

### 风险

- 这是最深层模型调整，需要最后做，不适合第一批直接大改

---

## T8 前端作用域上下文统一

### 数据库变更

- 无

### 后端改造

- 允许并鼓励所有主链路查询显式接受 `tenant_code`

### 前端改造

- 首页点击入口时带上 `tenant_code`
- sessionStorage 记录 `selectedTenantCode`
- 上传页、列表页、分组页、文档类型页全部统一读取/透传

### 验收点

- 跨页面刷新、跨模块进入后，租户上下文不丢失

### 风险

- 需要统一多页面的 scope 来源，避免出现多个来源互相覆盖

---

## T9 交叉评查跨租户策略明确化

### 数据库变更

- 可选补快照字段到 `leaudit_review_point_audits`

### 后端改造

- 明确 `_hasCrossReviewDocumentAccess` 是否允许跨租户
- 如果允许：
  - 做显式特权链路
  - 做审计快照
- 如果不允许：
  - 收紧 bypass scope

### 前端改造

- 交叉评查页展示任务涉及租户

### 验收点

- 跨租户访问行为是“明确允许”而不是“意外绕过”

### 风险

- 这是业务策略题，改之前必须先拍板

---

## 当前建议执行顺序

1. `T1 文档上传 tenant-first 收口`
2. `T2 文档列表/详情停止 tenant_code + region 混查`
3. `T4 RuleController 鉴权与权限补齐`
4. `T5 评查组读链路 tenant-first 收口`
5. `T8 前端作用域上下文统一`
6. `T3 文档业务边界快照固化`
7. `T6 评查组写链路 tenant-first 收口`
8. `T9 交叉评查跨租户策略明确化`
9. `T7 规则版本与规则集归属模型重构`

