From 2283d13176def5097a53a9bfe4330fa6bca424f2 Mon Sep 17 00:00:00 2001 From: let5sne Date: Tue, 14 Jul 2026 14:22:23 +0800 Subject: [PATCH] fix(aihr): require completed practice evidence --- .../org/dromara/aihr/service/AihrPracticeSeedService.java | 4 ++-- .../org/dromara/aihr/service/AihrPracticeSeedServiceTest.java | 1 + docs/BRD_IMPLEMENTATION_AUDIT.md | 1 + scripts/demo-check.sh | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java index b6c80a6d..104a070d 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java @@ -1387,7 +1387,7 @@ public class AihrPracticeSeedService { review_advice = CASE WHEN ? = '' THEN review_advice ELSE ? END, incentive_point = CASE WHEN ? IS NULL THEN incentive_point ELSE ? END, update_time = ? - WHERE tenant_id = ? AND mode = 'mobile' AND id = ? AND status = '待复盘' + WHERE tenant_id = ? AND mode = 'mobile' AND id = ? AND status = '待复盘' AND finished_time IS NOT NULL """, adviceText(request), adviceText(request), @@ -1462,7 +1462,7 @@ public class AihrPracticeSeedService { List rows = jdbcTemplate.query(""" SELECT scenario_id, dialogue_json, annotations_json FROM aihr_practice_session - WHERE tenant_id = ? AND session_id = ? + WHERE tenant_id = ? AND mode = 'mobile' AND session_id = ? AND finished_time IS NOT NULL LIMIT 1 """, (rs, rowNum) -> new SessionAnnotationSource( rs.getString("scenario_id"), diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java index 2a818010..0157c8b1 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java @@ -431,6 +431,7 @@ public class AihrPracticeSeedServiceTest { assertTrue(jdbcTemplate.sessionUpdateSql.contains("mode = 'mobile'")); assertTrue(jdbcTemplate.sessionUpdateSql.contains("id = ?")); assertTrue(jdbcTemplate.sessionUpdateSql.contains("status = '待复盘'")); + assertTrue(jdbcTemplate.sessionUpdateSql.contains("finished_time IS NOT NULL")); assertEquals(1, jdbcTemplate.sessionUpdateCount); } diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index eb95b600..535d9d06 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -281,3 +281,4 @@ - 2026-07-14 BRD 4.5/B5 训练时长口径修复:能力画像此前用“完成次数 × 8 分钟”估算训练时长,无法作为真实时长证据;现复用 `started_time/finished_time` 按实际秒数聚合并换算分钟,无时间证据的历史记录按 0 计。未新增表字段;正式试点仍需核对时间来源、异常时长和课程学习时长是否纳入统一口径。 - 2026-07-14 BRD 4.5/B5 人工贡献分默认值修复:管理端主管复盘表单此前默认填入 `10` 分,单纯点击“标记已复盘”可能产生未经主管确认的贡献分;现改为可选空值,只有明确填写的 `0–100` 分才提交并计入画像,页面文案同步为“人工贡献分”。后端既有空值保留逻辑不变,未新增积分来源;正式激励规则仍需 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,未修改业务数据。 diff --git a/scripts/demo-check.sh b/scripts/demo-check.sh index 632269ec..8f93418a 100755 --- a/scripts/demo-check.sh +++ b/scripts/demo-check.sh @@ -456,6 +456,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/controller/AihrPracticeController.java "practiceSeedService.turn(request, currentAppUsername())" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "practiceSeedService.finish(request, currentAppUsername())" 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 "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"