fix(case): refresh oss media urls on detail

This commit is contained in:
2026-07-14 05:53:41 +08:00
parent 3560d42793
commit 23e893316f
2 changed files with 34 additions and 5 deletions
@@ -152,7 +152,9 @@ public class AihrCaseService {
FROM aihr_case_record FROM aihr_case_record
WHERE tenant_id = '000000' AND case_id = ? WHERE tenant_id = '000000' AND case_id = ?
""" + projectWhere + " LIMIT 1"; """ + projectWhere + " LIMIT 1";
return jdbcTemplate.query(sql, (rs, rowNum) -> new DetailResponse( return jdbcTemplate.query(sql, (rs, rowNum) -> {
Long mediaOssId = rs.getObject("media_oss_id", Long.class);
return new DetailResponse(
firstNonBlank(rs.getString("case_id"), normalizedCaseId), firstNonBlank(rs.getString("case_id"), normalizedCaseId),
firstNonBlank(rs.getString("file_name"), "case-audio"), firstNonBlank(rs.getString("file_name"), "case-audio"),
firstNonBlank(rs.getString("title"), "现场案例"), firstNonBlank(rs.getString("title"), "现场案例"),
@@ -162,9 +164,10 @@ public class AihrCaseService {
firstNonBlank(rs.getString("owner"), "培训组"), firstNonBlank(rs.getString("owner"), "培训组"),
firstNonBlank(rs.getString("transcript"), ""), firstNonBlank(rs.getString("transcript"), ""),
firstNonBlank(rs.getString("summary"), ""), firstNonBlank(rs.getString("summary"), ""),
firstNonBlank(rs.getString("media_url"), ""), resolveMediaUrl(mediaOssId, rs.getString("media_url")),
rs.getObject("media_oss_id", Long.class) mediaOssId
), args.toArray()).stream().findFirst().orElse(null); );
}, args.toArray()).stream().findFirst().orElse(null);
} }
public List<String> projectScopesForAppUser(String identity) { public List<String> projectScopesForAppUser(String identity) {
@@ -425,6 +428,23 @@ public class AihrCaseService {
return new MediaRef(oss.getOssId(), firstNonBlank(oss.getUrl(), "")); return new MediaRef(oss.getOssId(), firstNonBlank(oss.getUrl(), ""));
} }
private String resolveMediaUrl(Long mediaOssId, String persistedUrl) {
String fallback = firstNonBlank(persistedUrl, "");
if (mediaOssId == null || ossService == null) {
return fallback;
}
try {
return ossService.listByIds(List.of(mediaOssId)).stream()
.findFirst()
.map(SysOssVo::getUrl)
.map(url -> firstNonBlank(url, fallback))
.orElse(fallback);
} catch (Exception e) {
log.debug("refresh case media url failed for ossId={}", mediaOssId);
return fallback;
}
}
private void addCaseColumn(String column, String sql) { private void addCaseColumn(String column, String sql) {
try { try {
jdbcTemplate.execute(sql); jdbcTemplate.execute(sql);
@@ -92,12 +92,19 @@ class AihrCaseServiceTest {
@Tag("dev") @Tag("dev")
void detailReturnsPersistedCaseForAuthorizedProject() { void detailReturnsPersistedCaseForAuthorizedProject() {
PersistentCaseJdbcTemplate jdbcTemplate = new PersistentCaseJdbcTemplate(); PersistentCaseJdbcTemplate jdbcTemplate = new PersistentCaseJdbcTemplate();
AihrCaseService service = new AihrCaseService(null, null, new ObjectMapper(), jdbcTemplate, null); SysOssVo oss = new SysOssVo();
oss.setOssId(456L);
oss.setUrl("https://oss.local/cases/refreshed-case.webm");
ISysOssService ossService = mock(ISysOssService.class);
when(ossService.listByIds(List.of(456L))).thenReturn(List.of(oss));
AihrCaseService service = new AihrCaseService(null, null, new ObjectMapper(), jdbcTemplate, ossService);
var detail = service.detail("persisted-case", List.of("P1")); var detail = service.detail("persisted-case", List.of("P1"));
assertEquals("persisted-case", detail.caseId()); assertEquals("persisted-case", detail.caseId());
assertEquals("业主投诉后完成跟进", detail.transcript()); assertEquals("业主投诉后完成跟进", detail.transcript());
assertEquals("https://oss.local/cases/refreshed-case.webm", detail.mediaUrl());
assertEquals(456L, detail.mediaOssId());
assertEquals("P1", jdbcTemplate.lastArgs[1]); assertEquals("P1", jdbcTemplate.lastArgs[1]);
} }
@@ -161,6 +168,8 @@ class AihrCaseServiceTest {
when(resultSet.getString("transcript")).thenReturn("业主投诉后完成跟进"); when(resultSet.getString("transcript")).thenReturn("业主投诉后完成跟进");
when(resultSet.getString("type")).thenReturn("投诉处理"); when(resultSet.getString("type")).thenReturn("投诉处理");
when(resultSet.getString("title")).thenReturn("业主投诉案例"); when(resultSet.getString("title")).thenReturn("业主投诉案例");
when(resultSet.getString("media_url")).thenReturn("https://oss.local/cases/expired-case.webm");
when(resultSet.getObject("media_oss_id", Long.class)).thenReturn(456L);
return List.of(rowMapper.mapRow(resultSet, 0)); return List.of(rowMapper.mapRow(resultSet, 0));
} catch (SQLException e) { } catch (SQLException e) {
throw new AssertionError(e); throw new AssertionError(e);