feat(mobile): filter practice mistakes by cause

This commit is contained in:
2026-07-14 03:38:20 +08:00
parent c8eeedc089
commit c392bb3768
4 changed files with 31 additions and 4 deletions
+1 -1
View File
@@ -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 | 搜索、引用、反馈、知识缺口和人工评审入口已有;住宅核心流程覆盖率与可用率仍需正式评审数据 | 按住宅核心流程建立评审批次,保留命中片段、评审人、状态、版本和来源 |
+27 -3
View File
@@ -78,8 +78,20 @@
{{ mistakeLoading ? '加载中' : '刷新' }}
</button>
</view>
<view v-if="mistakes.length" class="mistake-list">
<view v-for="item in mistakes" :key="item.id" class="mistake-row">
<view class="chip-row mistake-filter-row">
<button
v-for="cause in mistakeFilters"
:key="cause"
class="chip"
:class="{ active: cause === activeMistakeCause }"
:disabled="mistakeLoading"
@click="activeMistakeCause = cause"
>
{{ cause }}
</button>
</view>
<view v-if="visibleMistakes.length" class="mistake-list">
<view v-for="item in visibleMistakes" :key="item.id" class="mistake-row">
<view class="mistake-copy">
<view class="mistake-meta">
<text class="mistake-cause">{{ item.cause }}</text>
@@ -98,7 +110,9 @@
</button>
</view>
</view>
<view v-else-if="!mistakeLoading" class="empty">完成训练后,低分和红线回合会自动出现在这里</view>
<view v-else-if="!mistakeLoading" class="empty">
{{ mistakes.length ? '当前归因筛选暂无错题' : '完成训练后,低分和红线回合会自动出现在这里' }}
</view>
</view>
<view v-if="loggedIn" class="panel">
@@ -210,6 +224,8 @@ const positionSopSummary = ref<PositionSopSummary | null>(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;
@@ -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/);
});
+1
View File
@@ -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"