fix(aihr): reload persisted case sessions

This commit is contained in:
2026-07-14 04:44:57 +08:00
parent c9a7ceca0c
commit 6b84f1ab60
3 changed files with 66 additions and 4 deletions
@@ -226,7 +226,28 @@ public class AihrCaseService {
}
private CaseState requireCase(String caseId) {
CaseState state = cases.get(clean(caseId));
String normalizedCaseId = clean(caseId);
CaseState state = cases.get(normalizedCaseId);
if (state == null && !normalizedCaseId.isBlank()) {
ensureCaseTable();
List<CaseState> persisted = jdbcTemplate.query("""
SELECT case_id, file_name, project_ext_org_id, transcript, type
FROM aihr_case_record
WHERE tenant_id = '000000' AND case_id = ?
LIMIT 1
""", (rs, rowNum) -> new CaseState(
rs.getString("case_id"),
firstNonBlank(rs.getString("file_name"), "case-audio"),
firstNonBlank(rs.getString("project_ext_org_id"), ""),
firstNonBlank(rs.getString("transcript"), ""),
tagsFromText(firstNonBlank(rs.getString("type"), "现场案例")),
null
), normalizedCaseId);
state = persisted.stream().findFirst().orElse(null);
if (state != null) {
cases.put(normalizedCaseId, state);
}
}
if (state == null) {
throw new IllegalArgumentException("案例不存在或已过期,请重新上传语音");
}
@@ -5,12 +5,18 @@ import org.dromara.aihr.domain.AihrCaseDto.UploadResponse;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.mock.web.MockMultipartFile;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class AihrCaseServiceTest {
@@ -36,7 +42,22 @@ class AihrCaseServiceTest {
assertFalse(response.transcript().contains("2-304"));
}
private static final class CaseJdbcTemplate extends JdbcTemplate {
@Test
@Tag("dev")
void curateCanReloadCaseAfterServiceRestart() {
PersistentCaseJdbcTemplate jdbcTemplate = new PersistentCaseJdbcTemplate();
AihrCaseService service = new AihrCaseService(null, null, new ObjectMapper(), jdbcTemplate);
var response = service.curate(new org.dromara.aihr.domain.AihrCaseDto.CurateRequest(
"persisted-case", "可复用培训案例", 1
));
assertEquals(List.of("persisted-case"), response.selectedCaseIds());
assertEquals("已入库", response.records().get(0).status());
assertEquals("persisted-case", jdbcTemplate.lastCaseId);
}
private static class CaseJdbcTemplate extends JdbcTemplate {
private Object[] updateArgs = new Object[0];
@Override
@@ -50,4 +71,24 @@ class AihrCaseServiceTest {
return 1;
}
}
private static final class PersistentCaseJdbcTemplate extends CaseJdbcTemplate {
private String lastCaseId;
@Override
public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args) {
this.lastCaseId = String.valueOf(args[0]);
try {
ResultSet resultSet = mock(ResultSet.class);
when(resultSet.getString("case_id")).thenReturn("persisted-case");
when(resultSet.getString("file_name")).thenReturn("case.webm");
when(resultSet.getString("project_ext_org_id")).thenReturn("P1");
when(resultSet.getString("transcript")).thenReturn("业主投诉后完成跟进");
when(resultSet.getString("type")).thenReturn("投诉处理");
return List.of(rowMapper.mapRow(resultSet, 0));
} catch (SQLException e) {
throw new AssertionError(e);
}
}
}
}