diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index dde05875..20d17813 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -263,6 +263,7 @@ - 2026-07-14 BRD G1/4.5 证据包评分边界修复:成长/晋升证据包此前只展示 AI 测评分,人工校准结果仅存在于试点 CSV;现复用 `aihr_practice_calibration` 最新记录,向管理端和员工端同时返回人工校准分、最终采用分和校准样本数,并在导出证据包中保留三项字段。未校准时明确显示“待采集”,不把 AI 分伪装成人工结论;AI 仍仅作训练参考,不直接生成绩效或晋升结论。 - 2026-07-14 BRD 4.5/4.7 案例贡献证据边界复核:现有 `aihr_case_record.owner` 仅保存负责人展示值(系统用户或员工末四位),没有稳定 `ext_party_id`、采纳审核任务或 `incentive_point.source='case_contribution'` 关联;当前案例上传/入库数量不能安全算作员工案例贡献。成长证据包现明确提示“案例上传/入库”与“正式采纳、署名、积分”分离,未把案例数量伪装成晋升证据;待 HR 确认 `review_task` 终审、署名和积分规则后,再设计正式关联与统计。 - 2026-07-14 BRD 4.5/B5 贡献度口径修复:能力画像此前把训练次数和待复盘状态混入 `contribution`,会将训练活跃度误显示为有效贡献;现将贡献度收敛为 `aihr_practice_session.incentive_point` 的人工确认分,训练次数继续单独展示。未新增积分来源或自动案例计分,正式案例贡献仍等待 `review_task`/署名/积分规则。 +- 2026-07-14 BRD 4.4 错题本任务来源展示修复:员工学习中心此前把所有非每日题任务统一显示为“专项训练”,会遮蔽 `retry` 错题再练和 `camp` 训练营来源;现按服务端来源分别显示“错题再练/训练营/专项训练”,并保留每日三题标签与样式区分。该修复只校正任务语义展示,不把 `source='camp'` 标签扩展成未配置的训练营计划、进度或完成规则。 - 2026-07-14 BRD G3 组织快照质量门禁修复:生产默认关闭 `store-display-fields` 时,`AihrOrgSyncService` 原先在 `orgRow()` 内先清空姓名/部门,再以已屏蔽的 `OrgRow` 计算 `suspectText`,外部姓名/部门中的问号乱码可能被漏报,覆盖写入保护因此不完整。现先基于外部原始字段计算 `suspectText`,再独立保存质量标记;展示字段仍按生产脱敏策略清空,组织表结构和写入字段不变。新增 `AihrOrgSyncServiceTest` 回归和 `demo-check` marker;未修改生产数据。正式同步仍需真实上游快照、手机号映射和法务确认。 - 2026-07-14 BRD 4.3.4 每日三题资格边界修复:`aihr_org_snapshot` 没有 `hire_date` 时,旧逻辑用“移动端训练记录少于 3 次”推断新员工,可能把老员工或临时账号误派每日三题。现仅在本地 `application-dev.yml` 显式开启 `allow-legacy-daily-drill-fallback=true`;生产默认关闭,正式环境必须等组织同步提供 `hire_date` 后再按三个月窗口派发。新增边界测试和 `demo-check` marker;不改数据库结构,不伪造正式新员工数据。 - 2026-07-14 BRD 4.3.4 每日三题生产 profile 硬门禁:旧回退即使被环境变量显式打开,仍可能在生产 profile 生效;现仅允许 `dev/local` profile 使用训练次数兼容回退,`prod` 或混合 profile 强制关闭。新增 profile 边界测试和 `demo-check` marker;未修改数据库结构或生产数据。 diff --git a/mobile-uni/src/pages/user/learning/index.vue b/mobile-uni/src/pages/user/learning/index.vue index 6e901211..76c9ebdc 100644 --- a/mobile-uni/src/pages/user/learning/index.vue +++ b/mobile-uni/src/pages/user/learning/index.vue @@ -50,8 +50,15 @@ - - {{ item.source === 'daily' ? '每日三题' : '专项训练' }} + + {{ assignmentSourceLabel(item.source) }} {{ item.question || item.scenarioName }} {{ assignmentDesc(item) }} @@ -276,6 +283,13 @@ const assignmentDesc = (item: PracticeAssignment) => { return item.reason || item.feedback; }; +const assignmentSourceLabel = (source?: string) => { + if (source === 'daily') return '每日三题'; + if (source === 'retry') return '错题再练'; + if (source === 'camp') return '训练营'; + return '专项训练'; +}; + const snippetExcerpt = (text = '') => { const value = text.trim(); return value.length > 180 ? `${value.slice(0, 180)}...` : value; @@ -648,6 +662,16 @@ onShow(() => { color: #166534; } +.task-badge.retry { + background: #fff1f2; + color: #be123c; +} + +.task-badge.camp { + background: #eff6ff; + color: #1d4ed8; +} + .task-title, .snippet-title, .prep-label { diff --git a/mobile-uni/tests/mobile-user-pages.test.mjs b/mobile-uni/tests/mobile-user-pages.test.mjs index 50e2d14f..0d723a5a 100644 --- a/mobile-uni/tests/mobile-user-pages.test.mjs +++ b/mobile-uni/tests/mobile-user-pages.test.mjs @@ -149,6 +149,8 @@ test('学习页展示真实错题本并可进入已有再练任务', async () => assert.match(source, /pendingAssignmentKey/); assert.match(source, /mistakeFilters/); assert.match(source, /visibleMistakes/); + assert.match(source, /source === 'retry'[\s\S]*错题再练/); + assert.match(source, /source === 'camp'[\s\S]*训练营/); assert.match(practiceService, /\/api\/aihr\/mobile\/practice\/mistakes/); });