# 模块级真实落地清单与下一步动作

> 适用范围：`leaudit-platform` 当前权限、地区、租户、多租户入口模块改造的真实工程进度  
> 更新日期：2026-05-21  
> 文档定位：按模块判断“已落地 / 半落地 / 未开始 / 风险点 / 下一步动作”，便于逐模块把控，不再只看大 Phase。

---

## 1. 使用说明

本文档不再按“方案章节”描述，而是按真实模块拆分。

每个模块统一给出 5 个结论：

1. 当前状态
2. 已落地内容
3. 未完成内容
4. 主要风险
5. 下一步动作

状态分级说明：

- `已落地`
- `半落地`
- `已触达但未验收`
- `基本未开始`

---

## 2. 总体判断

当前系统最真实的现状不是“权限改造未开始”，而是：

1. 租户底座和兼容层已经开始落地
2. 部分业务模块已接入租户参数或租户解析
3. 但很多模块仍在用旧 `area/region` 作为最终边界字段
4. 统一权限执行器还没有成为公共主链
5. RAG 等模块仍存在角色硬编码残留

也就是说，当前最需要防的不是“没设计”，而是“半改状态继续扩散”。

---

## 3. 模块清单

## 3.1 租户主数据模块

涉及文件：

- [tenantController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/tenantController.py)
- [tenantServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/tenantServiceImpl.py)
- [tenantResolver.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/tenantResolver.py)
- [schema_tenant_foundation.sql](/home/wren-dev/Porject/leaudit-platform/scripts/创建sql/schema_tenant_foundation.sql)

当前状态：`进行中`

已落地内容：

1. `sys_tenants / sys_tenant_aliases / sys_tenant_feature_flags` 已建表
2. `TenantResolver` 已提供统一租户解析
3. `TenantServiceImpl` 已支持主数据查询和 legacy fallback
4. `TenantController` 已提供：
   - `GET /api/v3/tenants`
   - `GET /api/v3/tenants/options`
   - `GET /api/v3/tenants/{tenantCode}`
   - `POST /api/v3/tenants`
   - `PUT /api/v3/tenants/{tenantCode}`
   - `PATCH /api/v3/tenants/{tenantCode}/status`
5. 前端已补齐租户 API 封装：
   - `getTenants()`
   - `getTenantByCode()`
   - `createTenant()`
   - `updateTenant()`
   - `updateTenantStatus()`
6. 前端已新增独立 `/tenants` 租户管理页
7. RBAC 已补 `/tenants` 菜单蓝图和 `rbac:tenants:*` 权限定义

未完成内容：

1. 删除接口还没做
2. 更复杂的租户树/批量维护能力还没做
3. 下游业务引用检查仍可继续扩展到更多业务表

主要风险：

1. 如果 RBAC 种子未被触发，老环境角色可能暂时还看不到新菜单
2. 当前引用检查先覆盖了用户、入口模块、子租户，尚未扩展到所有业务表

下一步动作：

1. 联调创建/更新/启停接口
2. 扩展引用检查到更多业务表
3. 进入 `T9` 收尾验收

---

## 3.2 登录 / 当前用户上下文

涉及文件：

- [authServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/authServiceImpl.py)
- [ssoUserCompat.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/ssoUserCompat.py)

当前状态：`已落地`

已落地内容：

1. `sso_users` 动态列读取已兼容旧库缺失 `tenant_code/tenant_name`
2. 登录后返回已接入 `TenantResolver.ResolveUserContext()`
3. 当前用户接口已开始输出：
   - `tenant_code`
   - `tenant_name`
   - `tenant_type`
4. OAuth 登录已明确禁止前端直接覆盖可信地区字段

未完成内容：

1. 用户租户归属仍主要依赖 `sso_users.area + tenant_code` 混合状态
2. 还没有后台用户租户维护闭环
3. 还没有彻底把“用户归属租户”和“数据访问范围”解耦

主要风险：

1. 用户返回有 `tenant_code`，并不代表所有业务查询都已经按它执行
2. 仍可能出现“用户上下文是租户化的，业务 SQL 仍按旧地区字段比对”

下一步动作：

1. 明确用户主归属字段只认 `tenant_code`
2. 用户管理接口补齐租户设置/修改能力
3. 审计所有下游是否仍直接只取 `payload.area`

---

## 3.3 首页入口模块

涉及文件：

- [homeServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/homeServiceImpl.py)

当前状态：`已完成 T8 收口`

已落地内容：

1. 首页入口读取已经接入用户租户解析
2. 已优先读取 `leaudit_entry_module_tenants`
3. 在关系表缺失时可回退旧 `areas` JSON
4. 已支持 `PUBLIC` 与用户租户联合过滤
5. `super_admin` 已有绕过租户逻辑
6. 已确认后端 `/api/home/entry-modules` 对 `000` 真实返回 5 个入口模块
7. 已确认前端首页此前无入口的根因是兼容层漏识别 `targetPath/routePath`
8. 前端兼容层修复后，`/api/auth/session-data` 已真实返回 `entryModules=5`
9. 首页交叉评查入口判断已改为 `tenants` 优先；只要模块存在租户配置，前端不再回退按 `areas` 判定
10. 首页后端租户过滤已收紧，去掉了 `em.areas IS NULL / jsonb_typeof <> 'array'` 这类会放宽边界的 fallback
11. 首页前端标准化时已优先使用 `tenants` 反推兼容 `areas`，首页主消费链路不再依赖旧 `areas` 原始值

未完成内容：

1. 首页接口仍保留 `areas` 兼容输出
2. 旧 JSON 与关系表双写仍属于过渡态
3. 后续若要彻底去兼容，需要配合历史数据清理再收最后一刀

主要风险：

1. 新模块如果只配关系表、不配旧 `areas`，下游兼容没收干净时仍可能表现异常
2. 旧 `default` 仍可能造成边界模糊

下一步动作：

1. `T8` 可视为完成，后续不再把首页入口当作阻塞项
2. 对现有入口模块逐条核对关系表数据
3. 进入 `T9` 租户主数据维护能力开发

---

## 3.4 入口模块后台管理

涉及文件：

- [entryModuleAdminServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/entryModuleAdminServiceImpl.py)
- [entryModuleController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/entryModuleController.py)
- [schema_entry_module_tenants.sql](/home/wren-dev/Porject/leaudit-platform/scripts/创建sql/schema_entry_module_tenants.sql)

当前状态：`已完成 T8 收口`

已落地内容：

1. 已引入 `leaudit_entry_module_tenants`
2. 列表/详情已支持关系表读取
3. 创建/更新已支持 tenants 入参标准化
4. 关系表缺失时可降级到旧 `areas`
5. 已实现旧 `areas` 与新 tenants 的兼容转换
6. 已确认“后台配了入口但首页没显示”不是后台配置失败，而是首页前端兼容层问题
7. 前端入口模块创建/更新请求已改成只以下发 `tenants` 为主，`areas` 不再作为主提交流程字段
8. 入口模块列表页展示已改成只以 `tenants` 为主，`areas` 仅在编辑页做历史兼容回显
9. 后端已新增“适用租户不能为空”校验，空 `tenants` 提交会被明确拒绝
10. 入口模块管理端编辑页已不再读取 `areas`，管理端消费层已完全改为只消费 `tenants`
11. 入口模块管理端列表/详情接口已不再对外返回 `areas`，管理端返回结构已收口为 `tenants` 主模型

未完成内容：

1. 旧 JSON 与关系表仍处于双写兼容期
2. 后续若要彻底删掉 `areas` 存储，需要单独安排数据清理窗口
3. 权限控制还不是“入口模块 + 租户能力 + permission”闭环

主要风险：

1. 后端写了兼容层，但前端如果还传旧字段，会继续固化旧模型
2. 关系表与旧 JSON 双写期间，容易出现数据不一致

---

## 3.5 T5 评查点模块

涉及文件：

- [evaluationPointServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/evaluationPointServiceImpl.py)
- [evaluationPointController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/evaluationPointController.py)

当前状态：`首轮 tenant-first 收口已完成`

已落地内容：

1. 列表、详情、创建、更新已经改成 `tenant_code` 优先，老表没有 `tenant_code/tenant_name` 时才回退到 `area`
2. 创建、更新写入链路已支持同步写 `tenant_code/tenant_name`
3. 全局用户维护非公共评查点时，缺失标准 `tenant_code` 会被拒绝
4. 控制器列表查询不再把当前用户租户误当成“显式筛选条件”硬塞回去
5. `T5-1` 已完成：评查点列表读链路已拆开“当前用户租户上下文”和“显式筛选租户条件”，避免读范围判断漂移
6. `T5-1` 已完成：清理了遗留的 `visible_areas` 无效 SQL 绑定残留
7. `T5-2` 已完成第一轮：更新接口不再把原始 `area` 自由文本直接写成归属字段，统一改为从解析后的 `writable_scope` 推导
8. `T5-2` 已完成第一轮：`PUBLIC/PROVINCIAL` 与 `公共/省级/default` 共享域写入已统一归一化到标准租户编码
9. `T5-2` 已完成第一轮：全局用户若未显式指定租户或共享域，创建/更新会直接拒绝，避免静默落到错误范围
10. `T5-3` 已完成第一轮：列表/详情的共享域读范围已优先按 `PUBLIC/PROVINCIAL` 命中，旧 `公共/default/空值/省局/省级` 仅作为老数据 fallback
11. `T5-4` 已完成第一轮：评查点模块主链路的全局/管理能力判定已改为 `data_scope + evaluation_point:*` 权限推断，不再直接写死角色名；仅保留查不到数据库上下文时的兼容兜底
12. `T5-5` 已完成第一轮：查不到数据库用户上下文时，已移除 `payload.user_role` 角色名兜底；fallback 默认不再推断全局范围，只保留租户解析和权限服务判定

未完成内容：

1. 物理表层面还没有彻底摆脱 `area`
2. `visible_areas -> visible_tenant_codes` 的最终命名与统一执行器接入仍未完成
3. 统一数据范围执行器与最终 `area` 兼容层下线还没接进来

主要风险：

1. 容易误以为“接口看起来有 `tenant_code`”就等于模块已完全租户化
2. 如果数据库没有执行补字段脚本，仍只能停留在兼容模式

下一步动作：

1. 先补数据库字段和历史回填
2. 再把评查点模块内共享域中文常量继续下沉到更薄的兼容层
3. 最后配合数据库历史回填收掉 `area` 物理兼容层

---

## 3.6 合同模板模块

涉及文件：

- [contractTemplateServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/contractTemplateServiceImpl.py)
- [contractTemplateController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/contractTemplateController.py)

当前状态：`已完成首轮联调，未完成全量收口`

已落地内容：

1. controller 已接受 `region + tenant_code`
2. service 已引入 `TenantResolver`
3. 列表/搜索/详情查询开始考虑 `region/tenant_code`

未完成内容：

1. SQL 结果里仍直接写：
   - `''::VARCHAR AS tenant_code`
   - `t.region AS tenant_name`
2. 也就是模板模块当前本质上还没有真实租户字段
3. 仍属于“参数长得像租户化，存储与返回仍是旧 region 模型”

主要风险：

1. 前端可能误以为该模块已经支持标准租户编码
2. 实际上租户边界仍受 `region` 历史值影响

下一步动作：

1. 合同模板表补 `tenant_code`
2. 返回结构不再伪造空 `tenant_code`
3. 分类、搜索、详情统一改为按租户编码过滤

---

## 3.7 RAG 知识库模块

涉及文件：

- [ragDatasetServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/ragDatasetServiceImpl.py)
- [ragChatServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/ragChatServiceImpl.py)
- [ragChatController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/ragChatController.py)
- 前端 `components/dify-dataset-manager/*`

当前状态：`第一轮高风险收口已完成，未完成最终验收`

已落地内容：

1. controller 已传入 `TenantCode/TenantName`
2. service 已引入 `TenantResolver`
3. 已支持请求的租户/地区标准化

未完成内容：

1. 仍然存在显式角色白名单：
   - `provincial_admin`
   - `admin`
   - `super_admin`
2. 管理权限仍不是纯 permission 驱动
3. 数据集主字段仍大量使用 `area`
4. 前端数据集管理目录仍明显保留 `area-dataset` 旧命名体系

主要风险：

1. 这是当前角色去硬编码最明显的残留区
2. 也是最容易出现“自定义角色有权限但不能用”的模块

下一步动作：

1. 先移除 service 里的角色白名单
2. 用 permission + tenant scope 替代
3. 把 `area-dataset` 命名体系升级成 `tenant-dataset`

---

## 3.8 文档模块

涉及文件：

- [documentServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py)
- [documentController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/documentController.py)

当前状态：`半落地`

已落地内容：

1. 上传接口已接受 `TenantCode/TenantName`
2. 已通过 `TenantResolver` 解析上传侧地区/租户
3. 返回侧已开始回写解析后的租户信息
4. 用户上下文开始兼容租户字段

未完成内容：

1. 存储主字段仍是 `region`
2. 版本链、路径构建、重复判断等核心逻辑仍按 `region`
3. 还没有看到统一 `DocumentPolicy + PermissionDecision` 完整闭环证据

主要风险：

1. 文档模块是主数据域，若仍按 `region` 跑，后续所有统计/详情/附件都有边界不一致风险
2. 新租户一旦不等于历史中文地区名，旧逻辑会直接出错

下一步动作：

1. 文档主表补 `tenant_code`
2. 列表/详情/状态/附件统一按租户边界过滤
3. 把 `region` 退化为展示兼容字段

---

## 3.9 内部公文模块

涉及文件：

- [govdocServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/govdocServiceImpl.py)
- [govdocController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/govdocController.py)

当前状态：`半落地`

已落地内容：

1. 上传/列表接口已接受 `tenantCode`
2. 已引入 `TenantResolver`
3. 上传前已解析租户请求
4. 当前用户上下文已开始租户化

未完成内容：

1. 最终写入和版本判断主字段仍是 `resolvedRegion`
2. 也就是公文模块本质仍在用旧地区值做主边界
3. 未见统一权限执行器完全接入

主要风险：

1. 与文档模块同类，属于“参数租户化、底层 region 化”
2. 真实多租户扩展时会先在这里出边界问题

下一步动作：

1. 公文文档链路补 `tenant_code`
2. 版本链判断、上传归属、列表过滤统一切租户编码
3. `region` 仅保留兼容展示

---

## 3.10 系统使用统计模块

涉及文件：

- [usageStatsServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/usageStatsServiceImpl.py)

当前状态：`半落地`

已落地内容：

1. 登录事件记录已接入 `TenantResolver.ResolveUserContext()`
2. 登录审计写入前已做租户标准化
3. 服务已引入 `SsoUserCompat + TenantResolver`

未完成内容：

1. 当前快照写入字段仍是 `area_snapshot`
2. 未见标准 `tenant_code_snapshot`
3. 统计查询是否完全按租户边界，还需要继续核验下半段 SQL

主要风险：

1. 审计留痕如果不记标准 `tenant_code`，后续历史统计会很难稳定迁移
2. 统计口径可能继续受历史中文地区值影响

下一步动作：

1. 审计事件表补 `tenant_code_snapshot`
2. 统计聚合统一按标准租户编码
3. 地区维度改成“租户展示维度”

---

## 3.11 RBAC 管理域

涉及文件：

- [rbacAdminServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/rbacAdminServiceImpl.py)
- [rbacAdminController.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/controllers/rbacAdminController.py)

当前状态：`已触达但未验收`

已落地内容：

1. 已引入 `SsoUserCompat + TenantResolver`
2. 用户列表和上下文读取已开始兼容 `tenant_code/tenant_name`
3. 部分列表/树结构已开始计算 tenant label
4. 已新增用户租户设置 DTO/VO、service 能力与 controller 接口
5. 已新增 `PUT /api/v3/rbac/users/{UserId}/tenant`
6. 已完成前端“设置租户”弹窗与接口联调
7. 已真实验证 `000` 用户可成功设置 `tenant_code=MZ`
8. 用户列表、角色用户列表已按 `tenant_code` 优先过滤，旧 `tenant_name/area` 仅作无 `tenant_code` 兼容回退
9. 组织树已改为 `tenant_code` 优先分组，节点主键从展示名切到稳定租户编码
10. 用户角色分配、用户角色查询已补“目标用户必须在当前管理员租户范围内”校验

未完成内容：

1. `can_manage/is_global/is_super_admin` 仍由角色名派生，尚未切到统一 `permission + policy`
2. 组织树仍保留 `tenant_name/area` 兼容展示值，尚未完全接入租户主数据树
3. 还没有形成“用户归属租户 + 管理范围 + 数据权限”的统一执行器模型

主要风险：

1. RBAC 管理域如果长期继续用角色名派生管理能力，会拖住全项目统一权限执行器落地
2. 当前属于“tenant-first 已收口，但 policy 未统一”，后续若新增接口仍可能绕回手写边界

下一步动作：

1. 把 `can_manage/is_global` 从角色名派生迁到后端统一权限/能力快照
2. 组织树进一步过渡到租户主数据树，而不是仅基于用户表动态拼树
3. 角色授权与租户边界分开建模，并纳入统一 `RbacAdminPolicy`

---

## 3.12 前端租户接入

涉及目录：

- `legal-platform-frontend/lib/api/legacy/tenants/tenants.ts`
- `legal-platform-frontend/app/(audit)/entry-modules/*`
- `legal-platform-frontend/components/dify-dataset-manager/*`
- `legal-platform-frontend/hooks/use-area-dataset-config.ts`

当前状态：`已触达但未收口`

已落地内容：

1. 前端已有 `/api/v3/tenants/options` 调用封装
2. 入口模块前端已有新页面改造痕迹
3. RAG 前端有较多对应改造痕迹

未完成内容：

1. 仍广泛保留 `area-dataset` 命名
2. 仍需要核查是否存在按角色名显示按钮/菜单的逻辑
3. 还未证明页面全部优先认 `tenant_code`

主要风险：

1. 后端改了但前端仍传旧字段，会持续把旧模型写回系统
2. 命名层长期保留 `area`，会误导后续开发继续写旧逻辑

下一步动作：

1. 前端新表单统一只选租户，不再手输地区
2. `area-*` 命名逐步迁到 `tenant-*`
3. 清理按钮/guard 中的角色硬编码

---

## 4. 当前优先级排序

如果按“最容易继续出错 / 越权 / 落错数据”排序，当前建议这样推进：

1. `入口模块后台 + 租户主数据写能力`
   - 原因：这是后续新增租户和新增入口能否真正闭环的当前缺口
2. `文档模块`
   - 原因：主数据域，后续所有统计和评查都依赖它
3. `内部公文模块`
   - 原因：与文档链路类似，仍是 region 主模型
4. `合同模板模块`
   - 原因：已接参数但底层未真正租户化，且属于配置/检索域
5. `统计模块`
   - 原因：需要尽快固化标准租户审计快照
6. `RAG 模块`
   - 原因：角色白名单残留明显，最容易出现自定义角色不可用
7. `评查点模块`
   - 原因：已经半租户化，但底层仍是 area 模型

---

## 5. 最关键的工程判断

现在不能再笼统说“项目已经租户化”。

更准确的说法是：

1. 底座已租户化一部分
2. 入口模块已开始关系化
3. 用户上下文已开始输出租户信息
4. 但多个核心业务模块仍以 `area/region` 作为最终执行边界

因此，后续改造主线必须从“传了 tenant 参数就算完成”升级为：

1. 数据库存标准 `tenant_code`
2. 查询边界按 `tenant_code`
3. 返回结构带 `tenant_code + tenant_name`
4. 旧 `area/region/default/省级/省局` 只保留兼容层

---

## 6. 建议配套阅读

1. [权限与租户改造当前进度总览.md](/home/wren-dev/Porject/leaudit-platform/docs/权限与地区隔离/权限与租户改造当前进度总览.md)
2. [权限改造实施任务拆解与排期.md](/home/wren-dev/Porject/leaudit-platform/docs/权限与地区隔离/权限改造实施任务拆解与排期.md)
3. [角色去硬编码迁移清单.md](/home/wren-dev/Porject/leaudit-platform/docs/权限与地区隔离/角色去硬编码迁移清单.md)
4. [地区到租户编码映射清洗清单.md](/home/wren-dev/Porject/leaudit-platform/docs/权限与地区隔离/地区到租户编码映射清洗清单.md)
