fix(aihr): align supervisor scenario options

This commit is contained in:
2026-07-14 14:04:35 +08:00
parent c7ebe6d31c
commit 750e546e47
5 changed files with 13 additions and 8 deletions
+1
View File
@@ -273,3 +273,4 @@
- 2026-07-14 BRD M1 场景启停边界复核:停用场景此前在新训练启动时可能因内置 seed 回退而继续可用,管理端“停用”不具备实际阻断效果;现仅在新开始训练前检查数据库场景的 `enabled` 状态,已停用场景明确拒绝,历史训练/复盘读取不受影响。新增服务源码回归测试与 `demo-check` marker,未修改生产数据。
- 2026-07-14 BRD M1 派发场景状态与展示一致性复核:修复停用场景仍可通过直接派发接口进入待训练,以及客户端传入场景名称可与场景 ID 不一致的问题;主管派发现在复用启停校验,记录名称始终取服务端场景定义。历史任务读取不受影响,未修改生产数据。
- 2026-07-14 BRD M1 场景筛选回退语义复核:场景表查询成功但岗位/类型没有启用场景时,旧逻辑仍回退到内置场景,可能把不匹配或已停用场景展示给员工/主管;现仅在数据库异常时保留 seed fallback,真实空结果保持为空,并补岗位筛选回归测试。未修改生产数据。
- 2026-07-14 BRD M1 主管场景入口回退复核:后端已启用场景 API 优先,但主管指派页模板仍循环三条静态场景,且 API 正常空结果会继续显示静态选项;现改为循环 API 场景,真实空结果显示“暂无可派发的已启用场景”,只有请求失败才使用本地兜底。复盘后再练入口同步保持真实空结果为空,未修改生产数据。
@@ -45,9 +45,9 @@
/>
<text class="field-label section-label">训练场景</text>
<view class="scenario-row">
<view v-if="scenarioOptions.length" class="scenario-row">
<button
v-for="item in supervisorScenarioOptions"
v-for="item in scenarioOptions"
:key="item.id"
class="chip scenario-chip"
:class="{ active: assignmentScenarioId === item.id }"
@@ -57,6 +57,7 @@
{{ item.name }}
</button>
</view>
<text v-else class="muted block">暂无可派发的已启用场景</text>
<text class="field-label section-label">指派原因</text>
<textarea
@@ -65,7 +66,7 @@
maxlength="180"
placeholder="填写本次专项训练原因"
/>
<button class="primary-button submit-button" :disabled="assigning || historyLoading" @click="assignPractice">
<button class="primary-button submit-button" :disabled="assigning || historyLoading || !scenarioOptions.length" @click="assignPractice">
{{ assigning ? '指派中' : '确认指派' }}
</button>
</view>
@@ -255,10 +256,8 @@ const loadScenarioOptions = async () => {
}
return;
}
scenarioOptions.value = [...supervisorScenarioOptions];
if (!isScenarioId(assignmentScenarioId.value)) {
assignmentScenarioId.value = supervisorScenarioOptions[0].id;
}
scenarioOptions.value = [];
assignmentScenarioId.value = '';
} catch {
scenarioOptions.value = [...supervisorScenarioOptions];
if (!isScenarioId(assignmentScenarioId.value)) {
@@ -319,6 +319,8 @@ const loadScenarioOptions = async () => {
.map((item) => ({ id: item.id, name: item.name }));
if (nextOptions.length) {
scenarioOptions.value = nextOptions;
} else {
scenarioOptions.value = [];
}
} catch {
scenarioOptions.value = [...supervisorScenarioOptions];
+3 -1
View File
@@ -159,8 +159,10 @@ test('主管页面共享三个业务场景及文本推荐规则', () => {
'repair-elevator-delay'
]);
assert.match(practiceServiceSource, /getPracticeScenarios/);
assert.match(assignPageSource, /scenarioOptions/);
assert.match(assignPageSource, /v-for="item in scenarioOptions"/);
assert.match(assignPageSource, /暂无可派发的已启用场景/);
assert.match(reviewPageSource, /scenarioOptions/);
assert.match(reviewPageSource, /scenarioOptions\.value = \[\]/);
assert.equal(inferSupervisorScenarioId('电梯故障沟通低分'), 'repair-elevator-delay');
assert.equal(inferSupervisorScenarioId('投诉接待需要补练'), 'complaint-water');
assert.equal(inferSupervisorScenarioId('催缴物业费'), 'fee-parking');
+1
View File
@@ -530,6 +530,7 @@ contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service
contains mobile-uni/src/services/practice.ts "/api/aihr/mobile/practice/assignments"
contains mobile-uni/src/services/practice.ts "/api/train/practice/scenarios?position="
contains mobile-uni/src/pages/supervisor/assign/index.vue "scenarioOptions"
contains mobile-uni/src/pages/supervisor/assign/index.vue "暂无可派发的已启用场景"
contains mobile-uni/src/pages/supervisor/review/index.vue "scenarioOptions"
contains frontend/src/api/aihr/case.ts "/api/knowledge/case/upload"
contains frontend/src/api/aihr/case.ts "/api/knowledge/case/records?limit="