diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index 717a88f9..baf04c6a 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -2,6 +2,7 @@ 更新时间:2026-07-14 +- 2026-07-14 BRD 4.2/5.4 用户端岗位显示对齐:员工练习页此前虽按当前岗位请求训练数据,副标题却固定显示“生活顾问”,正式岗位映射存在时会造成界面与请求口径不一致;现复用 `getSelectedPosition()`,并在岗位同步后刷新显示,未新增资格判断或改变生活顾问演示回退。`mobile-uni` 用户端源码回归已增至 55 项通过,正式岗位与岗位-SOP资格规则仍需组织/HR数据后再实现。 - 2026-07-14 20:33 BRD/发布只读复核:当前 `HEAD=a7938a77`;管理端、`mobile-uni` H5 和后端 jar 已重新构建,产物时间晚于当前提交。当前本地管理端主资源 `assets/index-B9T505HT.js`(SHA-256 `66a827a7b3e5d794ae9da54c6e2276080995614fa52f54d49f746087663f8c94`)、H5 主资源 `assets/index-CfObC14z.js`(SHA-256 `e0d4a8e52c2827421fefb53a269c31c6062b0128fda62d3b00275b7bc4c53c47`)、后端 jar(SHA-256 `f6b76c54061a05bff70d54754867c448e6cfdb4e42120acb7c2103b4e52fa983`)均可用于发布。线上仍加载管理端 `assets/index-CJZ3Ax3Z.js`(SHA-256 `8b9278a26ccb760abce489b12a20b221748c64d4c4153613d2511777bb9677bc`)和 H5 `assets/index-D4-NrEpb.js`(SHA-256 `ab15bfd17cabe58e2f34b0ac61ee198a837128ed85dc6bb0ddf77bc3e22dcd9c`);`release-preflight.sh` 已通过产物新鲜度检查,但因两份用户未提交 Figma 文档阻断,未执行生产静态同步、后端重启或业务数据写入。 - 2026-07-14 最新线上只读复核:生产根站、`/h5/` 和 `/prod-api/auth/tenant/list` 均返回 `200`;线上管理端仍加载 `assets/index-CJZ3Ax3Z.js`,H5 仍加载 `assets/index-D4-NrEpb.js`。当前 `HEAD=81060fba` 的本地产物分别为 `assets/index-B9T505HT.js`(SHA-256 `66a827a7b3e5d794ae9da54c6e2276080995614fa52f54d49f746087663f8c94`)和 `assets/index-C1WoTt0t.js`(SHA-256 `bfb07609acecde3678ed18bf48ce022f36596c6b946e076436fe242cf3e15675`),当前提交尚未发布;发布预检仍因两份既有未提交 Figma 文档停止,本轮未执行生产静态资源同步、后端重启或业务数据写入。 - 2026-07-14 BRD G3/G6 视觉外发闸门修复:资料处理的图片 OCR/视频关键帧视觉调用此前直接查询启用模型,可能绕过 `AIHR_AI_RUNTIME_ENABLED`/`AIHR_AI_CHAT_ENABLED` 成本开关并向外部供应商发送原始图片;现复用 `AihrModelSeedService.visionAllowed()` 在共用 `visionRuntime()` 入口拦截,关闭时按既有“待处理/文本降级”语义,不新增配置。补充源码契约测试、`demo-check` marker、运行说明和演示验收说明;未改变已配置视觉模型的正常处理路径。 diff --git a/mobile-uni/src/pages/user/practice/index.vue b/mobile-uni/src/pages/user/practice/index.vue index c8df1576..c94a7cb1 100644 --- a/mobile-uni/src/pages/user/practice/index.vue +++ b/mobile-uni/src/pages/user/practice/index.vue @@ -18,7 +18,7 @@ {{ activeScenarioName }} - 生活顾问 · 业主服务场景 + {{ positionLabel }} · 业主服务场景 业 @@ -263,7 +263,7 @@ import type { PracticeRecord } from '@/types/api'; import { answerDailyDrill, finishPractice, getPracticeAssignments, getPracticeHistory, getPracticePrepCard, startPractice, submitPracticeSatisfaction, submitPracticeTurn } from '@/services/practice'; -import { isLoggedIn, rememberLoginRedirect } from '@/services/auth'; +import { getSelectedPosition, isLoggedIn, rememberLoginRedirect } from '@/services/auth'; import { searchKnowledge } from '@/services/knowledge'; import { resetPageScroll } from '@/services/navigation'; import { ensureEmployeePosition } from '@/services/position'; @@ -299,6 +299,7 @@ const selectedScenarioId = ref(defaultScenarioId); const prepCard = ref(null); const prepLoading = ref(false); const activeScenarioName = ref(defaultScenarioName); +const positionLabel = ref(getSelectedPosition() || '生活顾问'); const helpLoading = ref(false); const helpAnswer = ref(''); const helpRefs = ref([]); @@ -918,6 +919,7 @@ const handleShow = async () => { if (loggedIn.value && !(await ensureEmployeePosition('/pages/user/practice/index'))) { return; } + positionLabel.value = getSelectedPosition() || '生活顾问'; void loadAssignments(); void loadPrepCard(); }; diff --git a/mobile-uni/tests/mobile-user-pages.test.mjs b/mobile-uni/tests/mobile-user-pages.test.mjs index 6e8b3125..b52ed38c 100644 --- a/mobile-uni/tests/mobile-user-pages.test.mjs +++ b/mobile-uni/tests/mobile-user-pages.test.mjs @@ -153,6 +153,15 @@ test('训练页保留任务卡、对话区、回复区和结果区', async () => assert.match(source, /result-card/); }); +test('员工练习页显示当前岗位而不是固定生活顾问', async () => { + const source = await pageSource('../src/pages/user/practice/index.vue'); + + assert.match(source, /getSelectedPosition/); + assert.match(source, /const positionLabel = ref\(getSelectedPosition\(\) \|\| '生活顾问'\)/); + assert.match(source, /\{\{ positionLabel \}\} · 业主服务场景/); + assert.doesNotMatch(source, /scenario-desc">生活顾问 · 业主服务场景/); +}); + test('训练页最近练过保留派发任务来源', async () => { const source = await pageSource('../src/pages/user/practice/index.vue');