From c392bb37685a8653e46cd1ec2328bd6a54b6d2b2 Mon Sep 17 00:00:00 2001 From: let5sne Date: Tue, 14 Jul 2026 03:38:20 +0800 Subject: [PATCH] feat(mobile): filter practice mistakes by cause --- docs/BRD_IMPLEMENTATION_AUDIT.md | 2 +- mobile-uni/src/pages/user/learning/index.vue | 30 ++++++++++++++++++-- mobile-uni/tests/mobile-user-pages.test.mjs | 2 ++ scripts/demo-check.sh | 1 + 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index 6b55b823..6046950b 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -34,7 +34,7 @@ | 缺口 | BRD依据 | 当前事实 | 建议实现顺序 | |---|---|---|---| | 岗位-SOP匹配与上岗资格 gating | 3.1、4.2、TechSpec P1 | 已补 `GET /api/knowledge/position-sop` 和员工学习页状态提示:一期只确认生活顾问内置学习导航;尚无 `sop_applicability`、`onboard_task`、`qualification_gate` 正式数据闭环,不能作为上岗资格判断 | 先接正式岗位/项目与 SOP 适用范围数据,再补培训任务状态;资格 gating 必须由 HR 明确规则和证据来源后实现 | -| 智能错题本 | 3.1、4.4、TechSpec P1 | 已补 `/api/aihr/mobile/practice/mistakes` 和员工“学”页错题本:按本人聚合低分/红线回合,展示原因、分数、再练状态,并可跳已有 retry assignment;暂未做复杂原因筛选和独立错题表 | 下一步补原因筛选、复盘详情关联和主管侧聚合,仍复用现有 session/assignment/annotation | +| 智能错题本 | 3.1、4.4、TechSpec P1 | 已补 `/api/aihr/mobile/practice/mistakes` 和员工“学”页错题本:按本人聚合低分/红线回合,展示原因、分数、再练状态,支持按现有归因筛选,并可跳已有 retry assignment;尚未做独立错题表和主管侧聚合 | 后续复用现有 session/assignment/annotation 补复盘详情关联和主管侧聚合,不新增独立错题事实表 | | 案例学习/视频详情 | 3.1、4.6、矩阵第35行 | `AihrCaseService` 当前用内存 `CaseState` + `aihr_case_record` 保存转写/摘要,没有稳定 media URL、学习点、主管点评和案例详情 API;仓库也没有可用于一期验收的预渲染样片资产 | 先由业务提供样片或正式媒体 URL,并确定案例详情、学习点、主管点评字段,再扩持久化契约和权限;没有真实媒体 URL 时不造播放按钮 | | 案例库质量与数量 | L1-B、4.6/4.7 | 上传/整理/筛选路径已有;“至少20条脱敏案例”和每周每项目一条需要正式数据证明,当前也没有可用于一期样片验收的真实视频资产 | 先按项目窗口采集并脱敏检查,再补案例统计/学习详情导出;不使用空壳视频或演示 seed 冒充 | | RAG 可用率与知识治理 | 4.7、L1-C、G3 | 搜索、引用、反馈、知识缺口和人工评审入口已有;住宅核心流程覆盖率与可用率仍需正式评审数据 | 按住宅核心流程建立评审批次,保留命中片段、评审人、状态、版本和来源 | diff --git a/mobile-uni/src/pages/user/learning/index.vue b/mobile-uni/src/pages/user/learning/index.vue index edaefa54..2608973e 100644 --- a/mobile-uni/src/pages/user/learning/index.vue +++ b/mobile-uni/src/pages/user/learning/index.vue @@ -78,8 +78,20 @@ {{ mistakeLoading ? '加载中' : '刷新' }} - - + + + + + {{ item.cause }} @@ -98,7 +110,9 @@ - 完成训练后,低分和红线回合会自动出现在这里 + + {{ mistakes.length ? '当前归因筛选暂无错题' : '完成训练后,低分和红线回合会自动出现在这里' }} + @@ -210,6 +224,8 @@ const positionSopSummary = ref(null); const activeTopic = ref('岗前 SOP'); const assignmentLoading = ref(false); const mistakeLoading = ref(false); +const mistakeFilters = ['全部', '红线话术', '情绪承接', '流程合规', '综合得分不足']; +const activeMistakeCause = ref('全部'); const prepLoading = ref(false); const knowledgeLoading = ref(false); const positionProfile = ref(getSelectedPositionProfile()); @@ -230,6 +246,9 @@ const firstPracticeAssignment = computed(() => || null ); const prepScenarioId = computed(() => firstPracticeAssignment.value?.scenarioId || defaultScenarioId); +const visibleMistakes = computed(() => activeMistakeCause.value === '全部' + ? mistakes.value + : mistakes.value.filter((item) => item.cause === activeMistakeCause.value)); const refreshAuthState = () => { loggedIn.value = isLoggedIn(); @@ -436,6 +455,11 @@ onShow(() => { gap: 10px; } +.mistake-filter-row { + margin-top: 12px; + margin-bottom: 12px; +} + .mistake-row { display: flex; gap: 12px; diff --git a/mobile-uni/tests/mobile-user-pages.test.mjs b/mobile-uni/tests/mobile-user-pages.test.mjs index 623f845e..50e2d14f 100644 --- a/mobile-uni/tests/mobile-user-pages.test.mjs +++ b/mobile-uni/tests/mobile-user-pages.test.mjs @@ -147,6 +147,8 @@ test('学习页展示真实错题本并可进入已有再练任务', async () => assert.match(source, /getPracticeMistakes/); assert.match(source, /retryAssignmentId/); assert.match(source, /pendingAssignmentKey/); + assert.match(source, /mistakeFilters/); + assert.match(source, /visibleMistakes/); assert.match(practiceService, /\/api\/aihr\/mobile\/practice\/mistakes/); }); diff --git a/scripts/demo-check.sh b/scripts/demo-check.sh index 767701ba..192b45ba 100755 --- a/scripts/demo-check.sh +++ b/scripts/demo-check.sh @@ -335,6 +335,7 @@ contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/control contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "mobileCompletedCount" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "/practice/mistakes" contains mobile-uni/src/pages/user/learning/index.vue "错题本" +contains mobile-uni/src/pages/user/learning/index.vue "mistakeFilters" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "aihr_practice_session" contains backend/script/sql/aihr_practice_mysql8.sql "aihr_practice_scenario" contains backend/script/sql/aihr_practice_mysql8.sql "aihr_prompt_template"