diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index 4bf17091..02133093 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -236,6 +236,7 @@ - 2026-07-14 测试门禁复核:父 POM 默认 `skipTests=true`,普通 `mvn ... test` 只完成编译;改用 `-DskipTests=false` 真跑 AIHR 测试时发现 `AihrSensitiveTextTest` 仍检查已移出 `AihrModelSeedService` 的 `latencyMs` 字符串,已按当前 `ModelUsage + Duration` 实现修正断言。后续 AIHR 测试命令必须显式关闭跳测,避免把编译成功误判为测试通过。 - 2026-07-14 最新线上只读复核:生产根站与 `/h5/` 返回 `200`,线上管理端仍加载 `index-CJZ3Ax3Z.js`(SHA-256 `8b9278a26ccb760abce489b12a20b221748c64d4c4153613d2511777bb9677bc`),H5 仍加载 `index-D4-NrEpb.js`(SHA-256 `ab15bfd17cabe58e2f34b0ac61ee198a837128ed85dc6bb0ddf77bc3e22dcd9c`);当前分支 `b32be4a3` 工作区本地构建仍为管理端 `index-v0LFXtVo.js`、H5 `index-Byx3WtY1.js`,两端资源未对齐。本轮只读核验,未执行生产静态同步、后端重启或业务数据写入。 - 2026-07-14 BRD 5.4 主数据边界复核:发现 `aihr_org_snapshot` 及 `AihrOrgSyncService` 当前仍持久化并通过管理端组织快照返回 `project_name/dept_name/person_name`,同时保留 `person_phone` 做移动端身份映射;这与 BRD“本地只存外部 `party_id`,绝不复制姓名/部门”的硬约束不一致。TechSpec 3.1 又把 `sync_person.name/phone` 列为外部同步快照字段,项目现有 Demo/管理端也依赖姓名、部门和项目展示,因此不能直接删列或清空生产数据,否则会破坏组织筛选、主管范围展示和训练记录标签。该项暂列 P0 合规缺口:正式组织同步前必须由业务/法务/安全确认“生产只存 ID 与必要映射”还是允许受控显示缓存,并给出迁移、脱敏和管理端展示方案;在决策完成前不执行正式覆盖同步,也不把当前组织快照称为符合 BRD 5.4。 +- 2026-07-14 BRD 用户端权限路由复核:后端已对主管接口做身份与项目范围校验,但登录后普通员工请求主管深链时此前仍会先进入主管页面,再由接口返回无权限空态;现将 `mobile-uni` 的员工角色路由显式收口到员工首页,并补用户端源码回归断言与 `demo-check` marker。该修复只改善路由边界,不替代正式组织岗位映射;线上仍需用正式组织身份验证主管角色。 - 2026-07-14 BRD 5.4 渐进缓解:增加 `aihr.org-sync.store-display-fields` 开关,生产配置默认 `false`,开发配置显式 `true`;关闭时组织同步不再写入姓名/部门,组织快照接口也不返回历史姓名/部门,关键词搜索同步收窄为外部主体、项目和岗位字段,管理端人员列回退显示 `ext_party_id`。该修复降低新同步和 API 暴露风险,但不等于完成数据模型迁移:历史生产行仍可能保留旧显示字段,`person_phone` 仍是身份映射必要字段,正式上线前仍需 DBA/法务确认清理、保留期和最小字段方案。 - 2026-07-14 BRD 5.4 前端回退复核:生产关闭组织显示字段后,成长激励页人员选择器原先仍直接渲染 `personName`,会出现“空姓名 / 岗位”;现统一回退为 `personName || extPartyId`,与组织权限页、主管复盘页保持一致,并加入 `demo-check` 防回归标记。该修复只保证最小身份展示,不改变 BRD 5.4 的历史数据迁移和正式组织同步结论。 - 2026-07-14 BRD 4.5 认证规则复核:成长激励页、证据包和后端画像均明确“训练画像参考等级/需 HR 或主管复核”,学分规则显示“待 HR 配置、当前不生效”;后端初/中/高级阈值仅用于训练证据展示,未作为正式资格、晋升或绩效结论。当前无需再加一套伪配置页面,待 HR 明确 `cert_rule`/`incentive_rule` 的来源、版本、生效时间、防刷和人工审批后再实现持久化规则。 diff --git a/mobile-uni/src/services/position.ts b/mobile-uni/src/services/position.ts index 50d158ee..be44d379 100644 --- a/mobile-uni/src/services/position.ts +++ b/mobile-uni/src/services/position.ts @@ -23,6 +23,9 @@ export const routeForMobileRole = (role: RoleKey, requested: string) => { if (role === 'supervisor' && (isUserRoute(requested) || isSupervisorRoute(requested))) { return '/pages/supervisor/index/index'; } + if (role === 'user' && isSupervisorRoute(requested)) { + return '/pages/user/today/index'; + } return requested; }; diff --git a/mobile-uni/tests/mobile-user-pages.test.mjs b/mobile-uni/tests/mobile-user-pages.test.mjs index 88f5f84a..6e8b3125 100644 --- a/mobile-uni/tests/mobile-user-pages.test.mjs +++ b/mobile-uni/tests/mobile-user-pages.test.mjs @@ -93,6 +93,13 @@ test('登录后按组织身份切换主管首页', async () => { assert.match(source, /removeStorageSync\(roleKey\)/); }); +test('普通员工请求主管深链时回到员工首页', async () => { + const source = await pageSource('../src/services/position.ts'); + + assert.match(source, /role === 'user' && isSupervisorRoute\(requested\)/); + assert.match(source, /return '\/pages\/user\/today\/index'/); +}); + test('员工首页保留师傅区、语音条、今日安排、我的地图四段结构', async () => { const source = await pageSource('../src/pages/user/today/index.vue'); diff --git a/scripts/demo-check.sh b/scripts/demo-check.sh index 75d4f694..ec481709 100755 --- a/scripts/demo-check.sh +++ b/scripts/demo-check.sh @@ -392,6 +392,7 @@ contains mobile-uni/src/services/knowledge.ts "/api/knowledge/summary-card" contains mobile-uni/src/services/knowledge.ts "/api/knowledge/position-sop" contains mobile-uni/src/services/position.ts "removeStorageSync(roleKey)" contains mobile-uni/src/services/position.ts "/api/aihr/mobile/me" +contains mobile-uni/src/services/position.ts "role === 'user' && isSupervisorRoute(requested)" contains mobile-uni/src/services/case.ts "/api/knowledge/case/upload" contains mobile-uni/src/services/case.ts "/api/knowledge/case/capabilities" contains mobile-uni/src/services/case.ts "/api/knowledge/case/records/"