fix(aihr): preserve case contributor attribution

This commit is contained in:
2026-07-14 10:45:22 +08:00
parent 6f0854803d
commit 92afb51902
4 changed files with 33 additions and 8 deletions
@@ -69,7 +69,7 @@ public class AihrCaseService {
MediaRef media = storeSourceAudio(file);
String caseId = "case-" + UUID.randomUUID();
CaseState state = new CaseState(caseId, fileName, scopedProject, transcript, tagsFromText(transcript), null,
media.ossId(), media.url());
media.ossId(), media.url(), currentCaseOwner());
cases.put(caseId, state);
saveCase(state, "已转写", caseTitle(List.of(), fileName), transcript);
return new UploadResponse(caseId, fileName, transcript, state.tags(), "real-asr", media.url(), media.ossId());
@@ -85,7 +85,7 @@ public class AihrCaseService {
CaseState state = requireCase(request == null ? null : request.caseId(), projectScopes);
CaseSummary summary = organizeWithModel(state).orElseGet(() -> localSummary(state));
CaseState next = new CaseState(state.id(), state.fileName(), state.projectExtOrgId(), state.transcript(), summary.tags(), summary.summary(),
state.mediaOssId(), state.mediaUrl());
state.mediaOssId(), state.mediaUrl(), state.owner());
cases.put(state.id(), next);
saveCase(next, "已整理", caseTitle(summary.summary(), state.fileName()), summary.aiSummary());
return new OrganizeResponse(state.id(), summary.summary(), summary.tags(), summary.aiSummary(), summary.source());
@@ -104,7 +104,7 @@ public class AihrCaseService {
primaryTag(state.tags()),
"已入库",
LocalDateTime.now().format(TIME_FORMAT),
"培训组",
firstNonBlank(state.owner(), "培训组"),
detailSummary.isBlank() ? state.transcript() : detailSummary
);
saveCase(state, "已入库", record.title(), record.summary());
@@ -233,7 +233,7 @@ public class AihrCaseService {
jdbcTemplate.update("""
INSERT INTO aihr_case_record
(tenant_id, case_id, file_name, project_ext_org_id, title, type, status, transcript, summary, media_oss_id, media_url, owner, create_time, update_time)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '培训组', now(), now())
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, now(), now())
ON DUPLICATE KEY UPDATE
file_name = VALUES(file_name),
project_ext_org_id = VALUES(project_ext_org_id),
@@ -256,7 +256,8 @@ public class AihrCaseService {
truncate(maskSensitiveText(state.transcript()), 4000),
truncate(maskSensitiveText(summary), 1000),
state.mediaOssId(),
truncate(state.mediaUrl(), 500)
truncate(state.mediaUrl(), 500),
firstNonBlank(state.owner(), "培训组")
);
}
@@ -403,7 +404,7 @@ public class AihrCaseService {
ensureCaseTable();
List<CaseState> persisted = jdbcTemplate.query("""
SELECT case_id, file_name, project_ext_org_id, transcript, type
, media_oss_id, media_url
, media_oss_id, media_url, owner
FROM aihr_case_record
WHERE tenant_id = ? AND case_id = ?
LIMIT 1
@@ -415,7 +416,8 @@ public class AihrCaseService {
tagsFromText(firstNonBlank(rs.getString("type"), "现场案例")),
null,
rs.getObject("media_oss_id", Long.class),
firstNonBlank(rs.getString("media_url"), "")
firstNonBlank(rs.getString("media_url"), ""),
firstNonBlank(rs.getString("owner"), "培训组")
), tenantId(), normalizedCaseId);
state = persisted.stream().findFirst().orElse(null);
if (state != null) {
@@ -535,6 +537,18 @@ public class AihrCaseService {
return clean(AihrSensitiveText.forModel(text));
}
private String currentCaseOwner() {
return caseOwner(LoginHelper.getUsername());
}
static String caseOwner(String identity) {
String value = clean(identity);
if (value.matches("1[3-9]\\d{9}")) {
return "员工" + value.substring(value.length() - 4);
}
return firstNonBlank(value, "培训组");
}
static boolean isSupportedAudioFile(String fileName) {
String lower = clean(fileName).toLowerCase(Locale.ROOT);
return SUPPORTED_AUDIO_EXTENSIONS.stream().anyMatch(lower::endsWith);
@@ -557,7 +571,8 @@ public class AihrCaseService {
List<TagResponse> tags,
List<SummaryResponse> summary,
Long mediaOssId,
String mediaUrl
String mediaUrl,
String owner
) {
}
@@ -163,6 +163,14 @@ class AihrCaseServiceTest {
assertFalse(AihrCaseService.isCaseContributorPosition("普通员工", "一线"));
}
@Test
@Tag("dev")
void caseOwnerKeepsAttributionWithoutPersistingRawMobileNumber() {
assertEquals("员工1111", AihrCaseService.caseOwner("13900001111"));
assertEquals("hr_operator", AihrCaseService.caseOwner("hr_operator"));
assertEquals("培训组", AihrCaseService.caseOwner(" "));
}
private static class CaseJdbcTemplate extends JdbcTemplate {
private Object[] updateArgs = new Object[0];