feat(mobile): filter practice mistakes by cause
This commit is contained in:
@@ -34,7 +34,7 @@
|
|||||||
| 缺口 | BRD依据 | 当前事实 | 建议实现顺序 |
|
| 缺口 | BRD依据 | 当前事实 | 建议实现顺序 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 岗位-SOP匹配与上岗资格 gating | 3.1、4.2、TechSpec P1 | 已补 `GET /api/knowledge/position-sop` 和员工学习页状态提示:一期只确认生活顾问内置学习导航;尚无 `sop_applicability`、`onboard_task`、`qualification_gate` 正式数据闭环,不能作为上岗资格判断 | 先接正式岗位/项目与 SOP 适用范围数据,再补培训任务状态;资格 gating 必须由 HR 明确规则和证据来源后实现 |
|
| 岗位-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 时不造播放按钮 |
|
| 案例学习/视频详情 | 3.1、4.6、矩阵第35行 | `AihrCaseService` 当前用内存 `CaseState` + `aihr_case_record` 保存转写/摘要,没有稳定 media URL、学习点、主管点评和案例详情 API;仓库也没有可用于一期验收的预渲染样片资产 | 先由业务提供样片或正式媒体 URL,并确定案例详情、学习点、主管点评字段,再扩持久化契约和权限;没有真实媒体 URL 时不造播放按钮 |
|
||||||
| 案例库质量与数量 | L1-B、4.6/4.7 | 上传/整理/筛选路径已有;“至少20条脱敏案例”和每周每项目一条需要正式数据证明,当前也没有可用于一期样片验收的真实视频资产 | 先按项目窗口采集并脱敏检查,再补案例统计/学习详情导出;不使用空壳视频或演示 seed 冒充 |
|
| 案例库质量与数量 | L1-B、4.6/4.7 | 上传/整理/筛选路径已有;“至少20条脱敏案例”和每周每项目一条需要正式数据证明,当前也没有可用于一期样片验收的真实视频资产 | 先按项目窗口采集并脱敏检查,再补案例统计/学习详情导出;不使用空壳视频或演示 seed 冒充 |
|
||||||
| RAG 可用率与知识治理 | 4.7、L1-C、G3 | 搜索、引用、反馈、知识缺口和人工评审入口已有;住宅核心流程覆盖率与可用率仍需正式评审数据 | 按住宅核心流程建立评审批次,保留命中片段、评审人、状态、版本和来源 |
|
| RAG 可用率与知识治理 | 4.7、L1-C、G3 | 搜索、引用、反馈、知识缺口和人工评审入口已有;住宅核心流程覆盖率与可用率仍需正式评审数据 | 按住宅核心流程建立评审批次,保留命中片段、评审人、状态、版本和来源 |
|
||||||
|
|||||||
@@ -78,8 +78,20 @@
|
|||||||
{{ mistakeLoading ? '加载中' : '刷新' }}
|
{{ mistakeLoading ? '加载中' : '刷新' }}
|
||||||
</button>
|
</button>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="mistakes.length" class="mistake-list">
|
<view class="chip-row mistake-filter-row">
|
||||||
<view v-for="item in mistakes" :key="item.id" class="mistake-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-copy">
|
||||||
<view class="mistake-meta">
|
<view class="mistake-meta">
|
||||||
<text class="mistake-cause">{{ item.cause }}</text>
|
<text class="mistake-cause">{{ item.cause }}</text>
|
||||||
@@ -98,7 +110,9 @@
|
|||||||
</button>
|
</button>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-else-if="!mistakeLoading" class="empty">完成训练后,低分和红线回合会自动出现在这里</view>
|
<view v-else-if="!mistakeLoading" class="empty">
|
||||||
|
{{ mistakes.length ? '当前归因筛选暂无错题' : '完成训练后,低分和红线回合会自动出现在这里' }}
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view v-if="loggedIn" class="panel">
|
<view v-if="loggedIn" class="panel">
|
||||||
@@ -210,6 +224,8 @@ const positionSopSummary = ref<PositionSopSummary | null>(null);
|
|||||||
const activeTopic = ref('岗前 SOP');
|
const activeTopic = ref('岗前 SOP');
|
||||||
const assignmentLoading = ref(false);
|
const assignmentLoading = ref(false);
|
||||||
const mistakeLoading = ref(false);
|
const mistakeLoading = ref(false);
|
||||||
|
const mistakeFilters = ['全部', '红线话术', '情绪承接', '流程合规', '综合得分不足'];
|
||||||
|
const activeMistakeCause = ref('全部');
|
||||||
const prepLoading = ref(false);
|
const prepLoading = ref(false);
|
||||||
const knowledgeLoading = ref(false);
|
const knowledgeLoading = ref(false);
|
||||||
const positionProfile = ref(getSelectedPositionProfile());
|
const positionProfile = ref(getSelectedPositionProfile());
|
||||||
@@ -230,6 +246,9 @@ const firstPracticeAssignment = computed(() =>
|
|||||||
|| null
|
|| null
|
||||||
);
|
);
|
||||||
const prepScenarioId = computed(() => firstPracticeAssignment.value?.scenarioId || defaultScenarioId);
|
const prepScenarioId = computed(() => firstPracticeAssignment.value?.scenarioId || defaultScenarioId);
|
||||||
|
const visibleMistakes = computed(() => activeMistakeCause.value === '全部'
|
||||||
|
? mistakes.value
|
||||||
|
: mistakes.value.filter((item) => item.cause === activeMistakeCause.value));
|
||||||
|
|
||||||
const refreshAuthState = () => {
|
const refreshAuthState = () => {
|
||||||
loggedIn.value = isLoggedIn();
|
loggedIn.value = isLoggedIn();
|
||||||
@@ -436,6 +455,11 @@ onShow(() => {
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mistake-filter-row {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.mistake-row {
|
.mistake-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
|
|||||||
@@ -147,6 +147,8 @@ test('学习页展示真实错题本并可进入已有再练任务', async () =>
|
|||||||
assert.match(source, /getPracticeMistakes/);
|
assert.match(source, /getPracticeMistakes/);
|
||||||
assert.match(source, /retryAssignmentId/);
|
assert.match(source, /retryAssignmentId/);
|
||||||
assert.match(source, /pendingAssignmentKey/);
|
assert.match(source, /pendingAssignmentKey/);
|
||||||
|
assert.match(source, /mistakeFilters/);
|
||||||
|
assert.match(source, /visibleMistakes/);
|
||||||
assert.match(practiceService, /\/api\/aihr\/mobile\/practice\/mistakes/);
|
assert.match(practiceService, /\/api\/aihr\/mobile\/practice\/mistakes/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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/service/AihrPracticeSeedService.java "mobileCompletedCount"
|
||||||
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "/practice/mistakes"
|
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 "错题本"
|
||||||
|
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/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_practice_scenario"
|
||||||
contains backend/script/sql/aihr_practice_mysql8.sql "aihr_prompt_template"
|
contains backend/script/sql/aihr_practice_mysql8.sql "aihr_prompt_template"
|
||||||
|
|||||||
Reference in New Issue
Block a user