diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrCaseService.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrCaseService.java index 4796849e..6d85f7db 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrCaseService.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrCaseService.java @@ -123,12 +123,13 @@ public class AihrCaseService { projectWhere = " AND project_ext_org_id IN (" + placeholders(projectScopes.size()) + ")"; args.addAll(projectScopes); } + String publishedWhere = projectScopes == null ? "" : " AND status = '已入库'"; args.add(safeLimit); String sql = """ SELECT case_id, title, type, status, update_time, owner, summary FROM aihr_case_record WHERE tenant_id = ? - """ + projectWhere + """ + """ + projectWhere + publishedWhere + """ ORDER BY update_time DESC, id DESC LIMIT ? """; @@ -157,11 +158,12 @@ public class AihrCaseService { projectWhere = " AND project_ext_org_id IN (" + placeholders(projectScopes.size()) + ")"; args.addAll(projectScopes); } + String publishedWhere = projectScopes == null ? "" : " AND status = '已入库'"; String sql = """ SELECT case_id, file_name, title, type, status, update_time, owner, transcript, summary, media_url, media_oss_id FROM aihr_case_record WHERE tenant_id = ? AND case_id = ? - """ + projectWhere + " LIMIT 1"; + """ + projectWhere + publishedWhere + " LIMIT 1"; args.add(0, tenantId()); return jdbcTemplate.query(sql, (rs, rowNum) -> { Long mediaOssId = rs.getObject("media_oss_id", Long.class); diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrCaseServiceTest.java b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrCaseServiceTest.java index 11cb2fae..2aedb3df 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrCaseServiceTest.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrCaseServiceTest.java @@ -108,6 +108,18 @@ class AihrCaseServiceTest { assertEquals("https://oss.local/cases/refreshed-case.webm", detail.mediaUrl()); assertEquals(456L, detail.mediaOssId()); assertEquals("P1", jdbcTemplate.lastArgs[2]); + assertTrue(jdbcTemplate.lastSql.contains("status = '已入库'")); + } + + @Test + @Tag("dev") + void appCaseRecordsOnlyExposePublishedCases() { + RecordsCaseJdbcTemplate jdbcTemplate = new RecordsCaseJdbcTemplate(); + AihrCaseService service = new AihrCaseService(null, null, new ObjectMapper(), jdbcTemplate, null); + + service.records(10, List.of("P1")); + + assertTrue(jdbcTemplate.lastSql.contains("status = '已入库'")); } @Test @@ -189,9 +201,11 @@ class AihrCaseServiceTest { private static final class PersistentCaseJdbcTemplate extends CaseJdbcTemplate { private String lastCaseId; private Object[] lastArgs = new Object[0]; + private String lastSql = ""; @Override public List query(String sql, RowMapper rowMapper, Object... args) { + this.lastSql = sql; this.lastCaseId = String.valueOf(args[1]); this.lastArgs = args; try { @@ -210,4 +224,14 @@ class AihrCaseServiceTest { } } } + + private static final class RecordsCaseJdbcTemplate extends CaseJdbcTemplate { + private String lastSql = ""; + + @Override + public List query(String sql, RowMapper rowMapper, Object... args) { + this.lastSql = sql; + return List.of(); + } + } } diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index 1b3f0a8b..b6a50acc 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -186,3 +186,4 @@ - 2026-07-14 BRD 试点门禁租户参数化:严格试点预检此前将 M5 查询固定到 `tenant_id='000000'`,正式试点切换租户时会统计错误;现支持经过字符白名单校验的 `AIHR_PILOT_TENANT_ID`,默认仍为本地开发租户,试点命令和文档已同步。 - 2026-07-14 BRD SOP 人工评审结论完整性:`POST /api/knowledge/reviews/{id}` 现在要求明确提交 `usable=true/false`,空请求或缺少结论会拒绝,不再把未作答误记为“不可用”;`reviewer` 仍由当前登录操作人写入。已补服务层回归测试与 `demo-check` marker,但这只修正评审数据完整性,不代表住宅 SOP 可用率已达到正式试点门槛。 - 2026-07-14 线上只读核对:生产根站点、`/h5/` 和 `/prod-api/auth/tenant/list` 均返回 `200`,当前线上仍加载管理端 `index-CJZ3Ax3Z.js` 与 H5 `index-D4-NrEpb.js`;本地 `8fcc58fe` 的 SOP 评审结论校验尚未发布。`release-preflight.sh` 仍因两份既有 Figma 文档未提交而阻断,本轮未执行生产写入、静态资源同步或后端重启。 +- 2026-07-14 BRD 4.6 案例发布状态复核:员工端案例列表和详情原先只按租户/项目范围读取,未限制案例状态,理论上可能看到仍处于“已转写/已整理”的管理流程半成品;现对 APP 项目范围读取增加 `status='已入库'`,管理端 HR/管理员仍可查看全部状态以继续处理。新增案例服务回归测试,AIHR 全量测试 `81/81` 通过;视频样片、学习点和主管点评仍需正式业务输入。