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
WHERE tenant_id = '000000' AND case_id = ?
""" + 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("file_name"), "case-audio"),
firstNonBlank(rs.getString("title"), "现场案例"),
@@ -162,9 +164,10 @@ public class AihrCaseService {
firstNonBlank(rs.getString("owner"), "培训组"),
firstNonBlank(rs.getString("transcript"), ""),
firstNonBlank(rs.getString("summary"), ""),
firstNonBlank(rs.getString("media_url"), ""),
rs.getObject("media_oss_id", Long.class)
), args.toArray()).stream().findFirst().orElse(null);
resolveMediaUrl(mediaOssId, rs.getString("media_url")),
mediaOssId
);
}, args.toArray()).stream().findFirst().orElse(null);
}
public List<String> projectScopesForAppUser(String identity) {
@@ -425,6 +428,23 @@ public class AihrCaseService {
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) {
try {
jdbcTemplate.execute(sql);
@@ -92,12 +92,19 @@ class AihrCaseServiceTest {
@Tag("dev")
void detailReturnsPersistedCaseForAuthorizedProject() {
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"));
assertEquals("persisted-case", detail.caseId());
assertEquals("业主投诉后完成跟进", detail.transcript());
assertEquals("https://oss.local/cases/refreshed-case.webm", detail.mediaUrl());
assertEquals(456L, detail.mediaOssId());
assertEquals("P1", jdbcTemplate.lastArgs[1]);
}
@@ -161,6 +168,8 @@ class AihrCaseServiceTest {
when(resultSet.getString("transcript")).thenReturn("业主投诉后完成跟进");
when(resultSet.getString("type")).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));
} catch (SQLException e) {
throw new AssertionError(e);