# 权限组部门身份修复 组织来源为报表库 `hr_groups`,由 `organization-sync` 默认每天上海时间 02:00 同步。 同步以 `sourceDeptId` 更新同一个 `OrganizationUnit.id`,改名、换上级不重建身份;上游删除只下线。 权限组归属由管理员保存的数据库配置决定,不能根据部门名称自动推断。 ## 修复 - 部门关联保存 `organizationUnitId` 外键;旧 `departmentPath` 保留为历史快照。 - 权限组页面、按人看权限和鉴权统一使用绑定部门的当前有效路径。 - 花名册中有部门 ID 时,只使用组织数据库解析的当前任职,忽略旧路径快照;一人多部门仍取各任职最近组的并集。 - 移除按名称自动挂接默认组的逻辑;管理页面不再创建默认组或重置组名。 - 无有效身份的历史关联显示“关联已失效”,不参与组鉴权,可按关联记录 ID 精确清理。 - 部门只允许加入一个组,约束由稳定身份的数据库唯一索引保证;并发冲突不会返回假成功。 ## 数据迁移与边界 `20261008_permission_group_department_identity` 只回填当前有效且完整路径唯一匹配的部门。 无法证明的历史关联保留为空,不按简称、同名或名称相似度猜测。迁移不修改组里的素材权限或个人成员。 迁移失败时不得部署依赖新字段的应用。 生产只读盘点:17 条关联,16 条精确匹配;1 条为“视觉”组的“效率部(懂业务的技术部)”。 当前组织目录唯一部门为“效率部”,上游 ID `920560736`。 该条已先备份旧记录与目标身份,再修正为当前完整路径;未修改权限勾选或个人成员。 修复后只读复核为 17 条关联、17 条当前有效部门唯一精确匹配、0 条未匹配。 受保护的生产备份位于 `/mnt/PoolOne/apps/youyidian-3d/releases/permission-identity-repair-20261008`,包含 before 与 after JSON,目录权限 0700。 这是让现有版本恢复关联的单条数据修复;稳定部门 ID 的新代码及数据库迁移尚未提交、发布。 `scripts/repair-permission-group-department.mjs` 用明确的关联 ID、当前部门 ID、预期组 ID 和预期旧路径复核。 默认只读预演;`--apply` 必须指定 `--backup-dir`,写前备份,事务内检查身份和记录未变化。 此工具依赖新字段,须在上述数据库迁移完成后使用。 ## 验证 覆盖改名与移动、部门下线、旧路径复用、一人多部门、最近上级继承、组冲突与并发、失效关联清理和管理员组名保留。 在独立 PostgreSQL 容器执行迁移 SQL,验证精确回填、歧义与失效保留、唯一约束和外键保护。 相关 12 个测试套件、86 项测试通过;Prisma 生成、客户端校验、类型检查和修改文件 lint 通过。 本地隔离样例完成桌面及 390px 移动端检查,无横向溢出,失效关联提示和按记录 ID 移除正常。 截图位于 `tmp/permission-groups-qa/identity-desktop.png`、`identity-mobile.png`。样例操作没有写入生产数据。 浏览器控制会话恢复后,已补充当前生产版本的登录态界面验收: - 权限组「视觉」的部门列表显示「效率部」及当前完整路径。 - 按人看权限搜索「魔礼红」,显示「效率部」、部门组「视觉 · 本部门」,个人组为空;与权限组页面一致。 - 桌面及 390px 移动端显示正常,移动端文档宽度与视口均为 390px,无横向溢出。 - 生产截图位于 `tmp/permission-groups-qa/production-efficiency-person-desktop.png`、`production-efficiency-person-mobile.png`;权限组截图为 `browser-control-recovered.png`。 上述结果验证单条生产关联修正的显示结果;未操作权限勾选或个人加组,未以魔礼红身份执行真实下载。 稳定 ID 新代码的生产迁移、部署及上线后的鉴权验收仍待完成。 生产鉴权和界面验收必须在应用上线后按真实数据检查;本地样例验收不能代替生产验收。