fix(aihr): require completed interview reviews

This commit is contained in:
2026-07-14 14:27:20 +08:00
parent d08f4a82e3
commit a300f0c389
4 changed files with 16 additions and 2 deletions
@@ -183,8 +183,8 @@ public class AihrInterviewService {
} }
int updated = jdbcTemplate.update(""" int updated = jdbcTemplate.update("""
UPDATE aihr_interview_result UPDATE aihr_interview_result
SET reviewed_score = ?, review_status = '已复核', reviewer = ?, review_note = ?, reviewed_time = now(), update_time = now() SET reviewed_score = ?, review_status = '已复核', reviewer = ?, review_note = ?, reviewed_time = now(), update_time = now()
WHERE tenant_id = ? AND session_id = ? WHERE tenant_id = ? AND session_id = ? AND finished_time IS NOT NULL AND total_score IS NOT NULL
""", reviewedScore, firstNonBlank(operator, "unknown"), reviewNote, tenantId(), normalizedSessionId); """, reviewedScore, firstNonBlank(operator, "unknown"), reviewNote, tenantId(), normalizedSessionId);
if (updated == 0) { if (updated == 0) {
throw new IllegalArgumentException("面试记录不存在或不属于当前租户"); throw new IllegalArgumentException("面试记录不存在或不属于当前租户");
@@ -159,6 +159,18 @@ class AihrInterviewServiceTest {
verify(jdbcTemplate).update(anyString(), eq(88), eq("hr-operator"), eq("人工确认现场协调能力不足"), eq("000000"), eq("iv-1")); verify(jdbcTemplate).update(anyString(), eq(88), eq("hr-operator"), eq("人工确认现场协调能力不足"), eq("000000"), eq("iv-1"));
} }
@Test
@Tag("dev")
void reviewResultRequiresCompletedAiScore() throws Exception {
Path source = Path.of("src/main/java/org/dromara/aihr/service/AihrInterviewService.java");
if (!Files.exists(source)) {
source = Path.of("ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java");
}
String serviceSource = Files.readString(source);
assertTrue(serviceSource.contains("finished_time IS NOT NULL AND total_score IS NOT NULL"));
}
@Test @Test
@Tag("dev") @Tag("dev")
void reviewResultRejectsOutOfRangeScore() { void reviewResultRejectsOutOfRangeScore() {
+1
View File
@@ -283,3 +283,4 @@
- 2026-07-14 BRD G3/4.5 人工评审身份留痕修复:对练校准和主管复盘接口此前接受客户端传入的 `reviewer`,可能把人工证据归到伪造的操作人;现由控制器从当前登录用户绑定校准人/复盘人,请求字段仅保留兼容,不再作为身份来源。补源码契约回归和 `demo-check` marker;正式试点仍需抽查校准记录、复盘建议与实际主管/HR 账号的对应关系。 - 2026-07-14 BRD G3/4.5 人工评审身份留痕修复:对练校准和主管复盘接口此前接受客户端传入的 `reviewer`,可能把人工证据归到伪造的操作人;现由控制器从当前登录用户绑定校准人/复盘人,请求字段仅保留兼容,不再作为身份来源。补源码契约回归和 `demo-check` marker;正式试点仍需抽查校准记录、复盘建议与实际主管/HR 账号的对应关系。
- 2026-07-14 BRD 4.5/G1 复盘证据状态边界修复:人工校准此前只按 `session_id` 查询,主管复盘更新也未显式要求完成时间,理论上可对未完成训练或非移动对练记录写入复核证据;现统一要求 `mode='mobile'` 且 `finished_time IS NOT NULL`,历史已完成记录不受影响。补服务回归断言和 `demo-check` marker,未修改业务数据。 - 2026-07-14 BRD 4.5/G1 复盘证据状态边界修复:人工校准此前只按 `session_id` 查询,主管复盘更新也未显式要求完成时间,理论上可对未完成训练或非移动对练记录写入复核证据;现统一要求 `mode='mobile'` 且 `finished_time IS NOT NULL`,历史已完成记录不受影响。补服务回归断言和 `demo-check` marker,未修改业务数据。
- 2026-07-14 BRD M5 人工校准样本完整性修复:校准接口此前在 `correctedTotal` 为空时自动复制 AI 原分数,空提交也会增加“人工校准样本”并可能虚高一致率;现要求明确提交人工总分,空值直接拒绝,前端请求类型同步改为必填。新增服务回归测试和 `demo-check` marker,不改变已有校准记录。 - 2026-07-14 BRD M5 人工校准样本完整性修复:校准接口此前在 `correctedTotal` 为空时自动复制 AI 原分数,空提交也会增加“人工校准样本”并可能虚高一致率;现要求明确提交人工总分,空值直接拒绝,前端请求类型同步改为必填。新增服务回归测试和 `demo-check` marker,不改变已有校准记录。
- 2026-07-14 BRD G2 面试复核证据状态边界修复:AI 面试复核此前只按租户和 `session_id` 更新,未显式要求结果已完成且存在 AI 总分;现要求 `finished_time IS NOT NULL` 且 `total_score IS NOT NULL`,避免对未完成或不完整结果写入人工复核证据。新增服务回归断言和 `demo-check` marker,未修改业务数据。
+1
View File
@@ -458,6 +458,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 "训练会话不存在或无权访问" 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/AihrPracticeSeedService.java "finished_time IS NOT NULL" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "finished_time IS NOT NULL"
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/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/AihrPracticeSeedService.java "noneMatch(AihrPracticeSeedService::canSeeProject)" 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 "@SaCheckLogin"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "sessions/{sessionId}/annotations" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "sessions/{sessionId}/annotations"