From a300f0c389f2f27005069d0e9d0e691aebb63733 Mon Sep 17 00:00:00 2001 From: let5sne Date: Tue, 14 Jul 2026 14:27:20 +0800 Subject: [PATCH] fix(aihr): require completed interview reviews --- .../dromara/aihr/service/AihrInterviewService.java | 4 ++-- .../aihr/service/AihrInterviewServiceTest.java | 12 ++++++++++++ docs/BRD_IMPLEMENTATION_AUDIT.md | 1 + scripts/demo-check.sh | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java index 3e47120d..4221dc55 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrInterviewService.java @@ -183,8 +183,8 @@ public class AihrInterviewService { } int updated = jdbcTemplate.update(""" UPDATE aihr_interview_result - SET reviewed_score = ?, review_status = '已复核', reviewer = ?, review_note = ?, reviewed_time = now(), update_time = now() - WHERE tenant_id = ? AND session_id = ? + SET reviewed_score = ?, review_status = '已复核', reviewer = ?, review_note = ?, reviewed_time = now(), update_time = now() + 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); if (updated == 0) { throw new IllegalArgumentException("面试记录不存在或不属于当前租户"); diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrInterviewServiceTest.java b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrInterviewServiceTest.java index 42ddf3c6..d5037a49 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrInterviewServiceTest.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrInterviewServiceTest.java @@ -159,6 +159,18 @@ class AihrInterviewServiceTest { 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 @Tag("dev") void reviewResultRejectsOutOfRangeScore() { diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index ccb4af96..ef06c1c2 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -283,3 +283,4 @@ - 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 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,未修改业务数据。 diff --git a/scripts/demo-check.sh b/scripts/demo-check.sh index 1311217d..13c3bfab 100755 --- a/scripts/demo-check.sh +++ b/scripts/demo-check.sh @@ -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 "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/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/controller/AihrPracticeController.java "@SaCheckLogin" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "sessions/{sessionId}/annotations"