fix(aihr): require complete interview answers

This commit is contained in:
2026-07-14 14:35:18 +08:00
parent c4f98b9ab6
commit 269d3dc68c
4 changed files with 23 additions and 4 deletions
@@ -110,8 +110,8 @@ public class AihrInterviewService {
}
});
}
if (session.questions().stream().noneMatch(question -> !isBlank(session.answers().get(question.questionId())))) {
throw new IllegalArgumentException("请先提交至少一条有效面试回答");
if (session.questions().stream().anyMatch(question -> isBlank(session.answers().get(question.questionId())))) {
throw new IllegalArgumentException("请先完成全部面试回答");
}
ScoreResult score = scoreWithModel(session).orElseGet(() -> localScore(session));
String time = LocalDateTime.now().format(TIME_FORMAT);
@@ -199,7 +199,24 @@ class AihrInterviewServiceTest {
new FinishRequest(started.sessionId(), Map.of())
));
assertEquals("请先提交至少一条有效面试回答", error.getMessage());
assertEquals("请先完成全部面试回答", error.getMessage());
verify(jdbcTemplate, never()).update(anyString(), org.mockito.ArgumentMatchers.<Object[]>any());
}
@Test
@Tag("dev")
void interviewFinishRequiresAllRealAnswers() {
JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class);
AihrModelSeedService modelService = mock(AihrModelSeedService.class);
when(modelService.tryChat(anyString(), anyString(), anyDouble())).thenReturn(Optional.empty());
AihrInterviewService service = new AihrInterviewService(new ObjectMapper(), modelService, jdbcTemplate);
var started = service.start(new StartRequest("candidate-partial", "候选人", "customer-service", "mobile"));
IllegalArgumentException error = assertThrows(IllegalArgumentException.class, () -> service.finish(
new FinishRequest(started.sessionId(), Map.of("q1", "先确认诉求并安抚情绪"))
));
assertEquals("请先完成全部面试回答", error.getMessage());
verify(jdbcTemplate, never()).update(anyString(), org.mockito.ArgumentMatchers.<Object[]>any());
}
+2
View File
@@ -286,3 +286,5 @@
- 2026-07-14 BRD G2 面试复核证据状态边界修复:AI 面试复核此前只按租户和 `session_id` 更新,未显式要求结果已完成且存在 AI 总分;现要求 `finished_time IS NOT NULL` 且 `total_score IS NOT NULL`,避免对未完成或不完整结果写入人工复核证据。新增服务回归断言和 `demo-check` marker,未修改业务数据。
- 2026-07-14 BRD G2 面试复核版本一致性修复:同一面试会话重复 `finish` 时,AI 结果 upsert 此前会更新 AI 分数但保留旧人工复核分,可能把旧人工结论挂到新结果;现重复完成会清空人工复核分、复核人、意见和时间并恢复“待复核”,要求对新结果重新人工确认。新增服务回归断言和 `demo-check` marker,未修改业务数据。
- 2026-07-14 BRD 4.1 面试作答完整性修复:面试 `finish` 此前允许没有任何对应题目有效回答仍生成本地 55 分结果并进入人工复核;现要求至少提交一条有效面试回答,空面试不落结果表。新增服务回归测试和 `demo-check` marker,未修改业务数据。
- 2026-07-14 BRD 4.1 面试完成门禁收紧:前端要求完成全部面试题,但后端此前只要求至少一题有效回答,部分回答仍可生成面试结果;现 `finish` 要求所有服务端题目均有非空回答,空/部分回答均不落结果表。新增部分作答回归测试和 `demo-check` marker,未修改业务数据。
- 2026-07-14 BRD 发布状态只读复核:生产根站、`/h5/`、租户列表和员工首页 API 均返回 `200`,但线上仍加载管理端 `assets/index-CJZ3Ax3Z.js` 与 H5 `assets/index-D4-NrEpb.js`;当前分支 `c4f98b9a` 的面试完成门禁修复尚未发布。本轮未执行生产静态同步、后端重启或业务数据写入。
+1 -1
View File
@@ -460,7 +460,7 @@ contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "人工校准必须明确填写总分"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java "finished_time IS NOT NULL AND total_score IS NOT NULL"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java "reviewed_score = NULL"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java "请先提交至少一条有效面试回答"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java "请先完成全部面试回答"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "noneMatch(AihrPracticeSeedService::canSeeProject)"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "@SaCheckLogin"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "sessions/{sessionId}/annotations"