fix(aihr): hide unpublished cases from app users
This commit is contained in:
+4
-2
@@ -123,12 +123,13 @@ public class AihrCaseService {
|
|||||||
projectWhere = " AND project_ext_org_id IN (" + placeholders(projectScopes.size()) + ")";
|
projectWhere = " AND project_ext_org_id IN (" + placeholders(projectScopes.size()) + ")";
|
||||||
args.addAll(projectScopes);
|
args.addAll(projectScopes);
|
||||||
}
|
}
|
||||||
|
String publishedWhere = projectScopes == null ? "" : " AND status = '已入库'";
|
||||||
args.add(safeLimit);
|
args.add(safeLimit);
|
||||||
String sql = """
|
String sql = """
|
||||||
SELECT case_id, title, type, status, update_time, owner, summary
|
SELECT case_id, title, type, status, update_time, owner, summary
|
||||||
FROM aihr_case_record
|
FROM aihr_case_record
|
||||||
WHERE tenant_id = ?
|
WHERE tenant_id = ?
|
||||||
""" + projectWhere + """
|
""" + projectWhere + publishedWhere + """
|
||||||
ORDER BY update_time DESC, id DESC
|
ORDER BY update_time DESC, id DESC
|
||||||
LIMIT ?
|
LIMIT ?
|
||||||
""";
|
""";
|
||||||
@@ -157,11 +158,12 @@ public class AihrCaseService {
|
|||||||
projectWhere = " AND project_ext_org_id IN (" + placeholders(projectScopes.size()) + ")";
|
projectWhere = " AND project_ext_org_id IN (" + placeholders(projectScopes.size()) + ")";
|
||||||
args.addAll(projectScopes);
|
args.addAll(projectScopes);
|
||||||
}
|
}
|
||||||
|
String publishedWhere = projectScopes == null ? "" : " AND status = '已入库'";
|
||||||
String sql = """
|
String sql = """
|
||||||
SELECT case_id, file_name, title, type, status, update_time, owner, transcript, summary, media_url, media_oss_id
|
SELECT case_id, file_name, title, type, status, update_time, owner, transcript, summary, media_url, media_oss_id
|
||||||
FROM aihr_case_record
|
FROM aihr_case_record
|
||||||
WHERE tenant_id = ? AND case_id = ?
|
WHERE tenant_id = ? AND case_id = ?
|
||||||
""" + projectWhere + " LIMIT 1";
|
""" + projectWhere + publishedWhere + " LIMIT 1";
|
||||||
args.add(0, tenantId());
|
args.add(0, tenantId());
|
||||||
return jdbcTemplate.query(sql, (rs, rowNum) -> {
|
return jdbcTemplate.query(sql, (rs, rowNum) -> {
|
||||||
Long mediaOssId = rs.getObject("media_oss_id", Long.class);
|
Long mediaOssId = rs.getObject("media_oss_id", Long.class);
|
||||||
|
|||||||
+24
@@ -108,6 +108,18 @@ class AihrCaseServiceTest {
|
|||||||
assertEquals("https://oss.local/cases/refreshed-case.webm", detail.mediaUrl());
|
assertEquals("https://oss.local/cases/refreshed-case.webm", detail.mediaUrl());
|
||||||
assertEquals(456L, detail.mediaOssId());
|
assertEquals(456L, detail.mediaOssId());
|
||||||
assertEquals("P1", jdbcTemplate.lastArgs[2]);
|
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
|
@Test
|
||||||
@@ -189,9 +201,11 @@ class AihrCaseServiceTest {
|
|||||||
private static final class PersistentCaseJdbcTemplate extends CaseJdbcTemplate {
|
private static final class PersistentCaseJdbcTemplate extends CaseJdbcTemplate {
|
||||||
private String lastCaseId;
|
private String lastCaseId;
|
||||||
private Object[] lastArgs = new Object[0];
|
private Object[] lastArgs = new Object[0];
|
||||||
|
private String lastSql = "";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args) {
|
public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args) {
|
||||||
|
this.lastSql = sql;
|
||||||
this.lastCaseId = String.valueOf(args[1]);
|
this.lastCaseId = String.valueOf(args[1]);
|
||||||
this.lastArgs = args;
|
this.lastArgs = args;
|
||||||
try {
|
try {
|
||||||
@@ -210,4 +224,14 @@ class AihrCaseServiceTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class RecordsCaseJdbcTemplate extends CaseJdbcTemplate {
|
||||||
|
private String lastSql = "";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args) {
|
||||||
|
this.lastSql = sql;
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,3 +186,4 @@
|
|||||||
- 2026-07-14 BRD 试点门禁租户参数化:严格试点预检此前将 M5 查询固定到 `tenant_id='000000'`,正式试点切换租户时会统计错误;现支持经过字符白名单校验的 `AIHR_PILOT_TENANT_ID`,默认仍为本地开发租户,试点命令和文档已同步。
|
- 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 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 线上只读核对:生产根站点、`/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` 通过;视频样片、学习点和主管点评仍需正式业务输入。
|
||||||
|
|||||||
Reference in New Issue
Block a user