From 23e893316fc3ea630ddbdcc405efa8e54f330b1e Mon Sep 17 00:00:00 2001 From: let5sne Date: Tue, 14 Jul 2026 05:53:41 +0800 Subject: [PATCH] fix(case): refresh oss media urls on detail --- .../dromara/aihr/service/AihrCaseService.java | 28 ++++++++++++++++--- .../aihr/service/AihrCaseServiceTest.java | 11 +++++++- 2 files changed, 34 insertions(+), 5 deletions(-) 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 070f4453..0cf6edee 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 @@ -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 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); 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 295a0a18..784308a3 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 @@ -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);