fix(aihr): preserve assignment source labels
This commit is contained in:
@@ -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;未修改数据库结构或生产数据。
|
||||
|
||||
@@ -50,8 +50,15 @@
|
||||
<view v-if="assignments.length" class="task-list">
|
||||
<view v-for="item in assignments" :key="item.id" class="task-row">
|
||||
<view class="task-copy">
|
||||
<text class="task-badge" :class="{ daily: item.source === 'daily' }">
|
||||
{{ item.source === 'daily' ? '每日三题' : '专项训练' }}
|
||||
<text
|
||||
class="task-badge"
|
||||
:class="{
|
||||
daily: item.source === 'daily',
|
||||
retry: item.source === 'retry',
|
||||
camp: item.source === 'camp'
|
||||
}"
|
||||
>
|
||||
{{ assignmentSourceLabel(item.source) }}
|
||||
</text>
|
||||
<text class="task-title">{{ item.question || item.scenarioName }}</text>
|
||||
<text v-if="assignmentDesc(item)" class="task-desc">{{ assignmentDesc(item) }}</text>
|
||||
@@ -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 {
|
||||
|
||||
@@ -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/);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user