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 4221dc55..b7ac960d 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 @@ -328,6 +328,11 @@ public class AihrInterviewService { answers_json = VALUES(answers_json), questions_json = VALUES(questions_json), dimensions_json = VALUES(dimensions_json), + reviewed_score = NULL, + review_status = '待复核', + reviewer = NULL, + review_note = NULL, + reviewed_time = NULL, finished_time = VALUES(finished_time), update_time = now() """, 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 d5037a49..d1767bd8 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 @@ -171,6 +171,20 @@ class AihrInterviewServiceTest { assertTrue(serviceSource.contains("finished_time IS NOT NULL AND total_score IS NOT NULL")); } + @Test + @Tag("dev") + void repeatedFinishRequiresFreshHumanReview() 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("reviewed_score = NULL")); + assertTrue(serviceSource.contains("review_status = '待复核'")); + assertTrue(serviceSource.contains("reviewed_time = NULL")); + } + @Test @Tag("dev") void reviewResultRejectsOutOfRangeScore() { diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index ef06c1c2..f9056b97 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -284,3 +284,4 @@ - 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,未修改业务数据。 +- 2026-07-14 BRD G2 面试复核版本一致性修复:同一面试会话重复 `finish` 时,AI 结果 upsert 此前会更新 AI 分数但保留旧人工复核分,可能把旧人工结论挂到新结果;现重复完成会清空人工复核分、复核人、意见和时间并恢复“待复核”,要求对新结果重新人工确认。新增服务回归断言和 `demo-check` marker,未修改业务数据。 diff --git a/scripts/demo-check.sh b/scripts/demo-check.sh index 13c3bfab..438b1be1 100755 --- a/scripts/demo-check.sh +++ b/scripts/demo-check.sh @@ -459,6 +459,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 "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/AihrInterviewService.java "reviewed_score = 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"