# 新平台主链路租户改造实施任务单 > 目标:把新平台主链路从“半租户化”推进到“关键链路 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 规则版本与规则集归属模型重构`