diff --git a/src/main/java/com/rj/controller/AudioManagementSegmentsController.java b/src/main/java/com/rj/controller/AudioManagementSegmentsController.java index f303815..a677cd8 100644 --- a/src/main/java/com/rj/controller/AudioManagementSegmentsController.java +++ b/src/main/java/com/rj/controller/AudioManagementSegmentsController.java @@ -8,6 +8,7 @@ import com.rj.dto.AsrResponse; import com.rj.entity.AudioManagementSegments; import com.rj.service.IAudioManagementSegmentsService; import com.rj.service.ITtsRequestLogService; +import com.rj.tenant.TenantContextHolder; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -236,7 +237,7 @@ public class AudioManagementSegmentsController { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(AudioManagementSegments::getId, id); - boolean success = audioManagementSegmentsService.update(updateEntity, updateWrapper); + boolean success = audioManagementSegmentsService.updateNoTenant(updateEntity, updateWrapper); if (!success) { result.put("success", false); @@ -263,15 +264,29 @@ public class AudioManagementSegmentsController { } // TODO 2: 启用异步线程处理转文本 + // 获取租户ID:优先从segment对象获取,如果没有则从当前线程的租户上下文获取 + final String tenantId = segment.getTenantId() != null + ? segment.getTenantId() + : TenantContextHolder.getTenantId(); final String finalPresignedUrl = presignedUrl; final String segmentId = id; + final String audioFileName = segment.getAudioFileOriginalName(); + CompletableFuture.runAsync(() -> { try { - log.info("开始异步转文本处理,ID: {}", segmentId); + // 在异步线程中设置租户上下文 + if (tenantId != null && !tenantId.trim().isEmpty()) { + TenantContextHolder.setTenantId(tenantId); + log.info("异步线程中设置租户ID: {}, segmentId: {}", tenantId, segmentId); + } else { + log.warn("租户ID为空,segmentId: {}", segmentId); + } + + log.info("开始异步转文本处理,ID: {}, tenantId: {}", segmentId, tenantId); AsrRequest asrRequest = new AsrRequest(); asrRequest.setAudioUrl(finalPresignedUrl); - asrRequest.setAudioName(segment.getAudioFileOriginalName()); + asrRequest.setAudioName(audioFileName); asrRequest.setModel("paraformer-v2"); // 使用默认模型 asrRequest.setFormat("wav"); // 默认格式 asrRequest.setSampleRate(16000); // 默认采样率 @@ -290,19 +305,26 @@ public class AudioManagementSegmentsController { LambdaUpdateWrapper textUpdateWrapper = new LambdaUpdateWrapper<>(); textUpdateWrapper.eq(AudioManagementSegments::getId, segmentId); - + + // 使用正常的update方法,因为已经设置了租户上下文 boolean updateSuccess = audioManagementSegmentsService.update(textUpdateEntity, textUpdateWrapper); + + if (updateSuccess) { - log.info("转文本结果保存成功,ID: {}, 文本长度: {}", segmentId, asrResponse.getText().length()); + log.info("转文本结果保存成功,ID: {}, tenantId: {}, 文本长度: {}", segmentId, tenantId, asrResponse.getText().length()); } else { - log.error("转文本结果保存失败,ID: {}", segmentId); + log.error("转文本结果保存失败,ID: {}, tenantId: {}", segmentId, tenantId); } } else { String errorMsg = asrResponse != null ? asrResponse.getMessage() : "ASR响应为空"; - log.error("转文本失败,ID: {}, error: {}", segmentId, errorMsg); + log.error("转文本失败,ID: {}, tenantId: {}, error: {}", segmentId, tenantId, errorMsg); } } catch (Exception e) { - log.error("异步转文本处理异常,ID: {}, error: {}", segmentId, e.getMessage(), e); + log.error("异步转文本处理异常,ID: {}, tenantId: {}, error: {}", segmentId, tenantId, e.getMessage(), e); + } finally { + // 清理租户上下文,防止线程复用导致租户串用 + TenantContextHolder.clear(); + log.debug("清理异步线程租户上下文,segmentId: {}", segmentId); } }); diff --git a/src/main/java/com/rj/service/IAudioManagementSegmentsService.java b/src/main/java/com/rj/service/IAudioManagementSegmentsService.java index 53ef84d..7dbbcb7 100644 --- a/src/main/java/com/rj/service/IAudioManagementSegmentsService.java +++ b/src/main/java/com/rj/service/IAudioManagementSegmentsService.java @@ -1,5 +1,7 @@ package com.rj.service; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.rj.entity.AudioManagementSegments; @@ -12,5 +14,8 @@ import com.rj.entity.AudioManagementSegments; */ public interface IAudioManagementSegmentsService extends IService { + @InterceptorIgnore(tenantLine = "true") // 禁用多租户拦截 + public boolean updateNoTenant(AudioManagementSegments entity, + LambdaUpdateWrapper updateWrapper) ; } diff --git a/src/main/java/com/rj/service/impl/AudioManagementSegmentsServiceImpl.java b/src/main/java/com/rj/service/impl/AudioManagementSegmentsServiceImpl.java index 769ab46..1c7a640 100644 --- a/src/main/java/com/rj/service/impl/AudioManagementSegmentsServiceImpl.java +++ b/src/main/java/com/rj/service/impl/AudioManagementSegmentsServiceImpl.java @@ -1,5 +1,7 @@ package com.rj.service.impl; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.rj.entity.AudioManagementSegments; import com.rj.mapper.AudioManagementSegmentsMapper; @@ -17,6 +19,12 @@ import org.springframework.stereotype.Service; public class AudioManagementSegmentsServiceImpl extends ServiceImpl implements IAudioManagementSegmentsService { + @Override + @InterceptorIgnore(tenantLine = "true") // 禁用多租户拦截 + public boolean updateNoTenant(AudioManagementSegments entity, + LambdaUpdateWrapper updateWrapper) { + return super.update(entity, updateWrapper); + } } diff --git a/src/main/java/com/rj/service/impl/TtsRequestLogServiceImpl.java b/src/main/java/com/rj/service/impl/TtsRequestLogServiceImpl.java index a9c45f1..4798629 100644 --- a/src/main/java/com/rj/service/impl/TtsRequestLogServiceImpl.java +++ b/src/main/java/com/rj/service/impl/TtsRequestLogServiceImpl.java @@ -383,7 +383,7 @@ public class TtsRequestLogServiceImpl implements ITtsRequestLogService { try { // 从transcriptionUrl下载识别结果 String transcriptionResult = downloadTranscriptionResult(taskResult.getTranscriptionUrl()); - log.info("transcriptionResult: {}" , transcriptionResult); + // log.info("transcriptionResult: {}" , transcriptionResult); if (transcriptionResult != null && !transcriptionResult.trim().isEmpty()) { // 解析transcription结果JSON