From 34e352fbb6fea8ba437a939fc17ec8455ec3fdff Mon Sep 17 00:00:00 2001 From: zhonghua1 Date: Tue, 6 Jan 2026 22:07:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E5=9C=BA=E6=99=AF=E5=88=86=E6=9E=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AudioManagementController.java | 118 +++++++++++++++++- .../AudioTextAnalysisFurnitureController.java | 26 +++- 2 files changed, 134 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/rj/controller/AudioManagementController.java b/src/main/java/com/rj/controller/AudioManagementController.java index 339c70f..455381d 100644 --- a/src/main/java/com/rj/controller/AudioManagementController.java +++ b/src/main/java/com/rj/controller/AudioManagementController.java @@ -2,14 +2,12 @@ package com.rj.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.common.AudioAnalysisSceneType; import com.rj.common.AudioManagementConstants; import com.rj.common.DataEnrichmentUtil; import com.rj.entity.AudioManagement; import com.rj.entity.AudioManagementSegments; -import com.rj.service.IAudioManagementService; -import com.rj.service.IFileUploadService; -import com.rj.service.MinIOService; -import com.rj.service.ITtsRequestLogService; +import com.rj.service.*; import com.rj.dto.AsrRequest; import com.rj.dto.AsrResponse; import io.swagger.v3.oas.annotations.Operation; @@ -44,6 +42,11 @@ import java.util.UUID; @Slf4j public class AudioManagementController { + // 场景常量,避免在解析逻辑中硬编码字符串 + private static final String SCENARIO_FURNITURE_SALE = "FURNITURE_SALE"; + private static final String SCENARIO_MEETING_SUMMARY = "MEETING_SUMMARY"; + private static final String SCENARIO_CAR_SALE = "CAR_SALE"; + @Autowired private IAudioManagementService audioManagementService; @@ -56,6 +59,9 @@ public class AudioManagementController { @Autowired private ITtsRequestLogService ttsRequestLogService; + @Autowired + private IAudioTextAnalysisLlmService audioTextAnalysisLlmService; + /** * 新增录音 */ @@ -485,6 +491,110 @@ public class AudioManagementController { return ResponseEntity.internalServerError().body(result); } } + /** + * 更新录音信息 + */ + @PostMapping("/AIAnlyzById") + @Operation(summary = "AI分析", description = "AI分析的总入口") + public ResponseEntity> AIAnlyById( + @Parameter(description = "录音信息", required = true) + @RequestBody AudioManagement audioManagement) { + Map result = new HashMap<>(); + try { + if (audioManagement.getId() == null || audioManagement.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "录音ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + // 1. 根据ID查询家具意向分析记录 + AudioManagement audioManagementFromDB = audioManagementService.getById(audioManagement.getId()); + if (audioManagementFromDB == null) { + result.put("success", false); + result.put("message", "记录不存在"); + return ResponseEntity.badRequest().body(result); + } + // 3. 获取录音文本;如主表为空,则从分段表拼接 + String recordingText = audioManagementFromDB.getRecordingText(); + if (recordingText == null || recordingText.trim().isEmpty()) { + LambdaQueryWrapper segQuery = new LambdaQueryWrapper<>(); + segQuery.eq(AudioManagementSegments::getParentId, audioManagementFromDB.getId()) + .orderByAsc(AudioManagementSegments::getChunkIndex); + List segmentList = audioManagementSegmentsService.list(segQuery); + int emptyCount = 0 ; + StringBuilder mergedText = new StringBuilder(); + if (segmentList != null && !segmentList.isEmpty()) { + for (AudioManagementSegments seg : segmentList) { + String segText = seg.getRecordingText(); + if (segText != null && !segText.trim().isEmpty()) { + if (mergedText.length() > 0) { + mergedText.append("\n"); + } + mergedText.append(segText.trim()); + }else { + emptyCount ++; + } + } + } + if (mergedText.length() > 0) { + recordingText = mergedText.toString(); + audioManagementFromDB.setRecordingText(recordingText); + } + log.info(" AudioManagementSegments 总数是: {} ,未转文本记录条数是: {}",segmentList.size(), emptyCount); + } + + if (recordingText == null || recordingText.trim().isEmpty()) { + result.put("success", false); + result.put("message", "录音文本为空"); + return ResponseEntity.badRequest().body(result); + } + + // 4. 根据场景动态选择业务场景类型,调用业务层通用服务生成总结 + AudioAnalysisSceneType sceneType = resolveSceneType(audioManagementFromDB.getScenario()); + String rawContent = audioTextAnalysisLlmService.generateSummaryByLLM( + sceneType, + recordingText + ); + + + boolean success = true; + if (success) { + result.put("success", true); + result.put("message", "录音finishServiceById更新成功"); + result.put("data", audioManagement); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "录音finishServiceById更新失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "更新异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据录音场景字符串解析为大模型分析场景类型 + */ + private AudioAnalysisSceneType resolveSceneType(String scenario) { + + String s = scenario.trim().toUpperCase(); + // 根据约定的大写场景值进行映射 + if (SCENARIO_FURNITURE_SALE.equals(s)) { + return AudioAnalysisSceneType.SCENARIO_FURNITURE_SALE; + } + if (SCENARIO_CAR_SALE.equals(s)) { + return AudioAnalysisSceneType.SCENARIO_CAR_SALE; + } + if (SCENARIO_MEETING_SUMMARY.equals(s)) { + return AudioAnalysisSceneType.SCENARIO_MEETING_SUMMARY; + } + // 未识别场景时,默认按会议场景处理 + return AudioAnalysisSceneType.SCENARIO_MEETING_SUMMARY; + } + /** * 根据ID删除录音 diff --git a/src/main/java/com/rj/controller/AudioTextAnalysisFurnitureController.java b/src/main/java/com/rj/controller/AudioTextAnalysisFurnitureController.java index e36de4f..e69c472 100644 --- a/src/main/java/com/rj/controller/AudioTextAnalysisFurnitureController.java +++ b/src/main/java/com/rj/controller/AudioTextAnalysisFurnitureController.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.rj.common.AudioAnalysisSceneType; import com.rj.entity.AudioManagement; import com.rj.entity.AudioTextAnalysisFurniture; import com.rj.entity.AudioTextAnalysisSop; @@ -19,6 +20,7 @@ import com.rj.entity.TodoItem; import com.rj.service.IAudioManagementService; import com.rj.service.IAudioTextAnalysisFurnitureService; import com.rj.service.IAudioTextAnalysisSopService; +import com.rj.service.IAudioTextAnalysisLlmService; import com.rj.service.ITodoItemService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -63,11 +65,12 @@ public class AudioTextAnalysisFurnitureController { @Autowired private ObjectMapper objectMapper; - // 提示词文件路径 + @Autowired + private IAudioTextAnalysisLlmService audioTextAnalysisLlmService; + + // 兼容旧代码的字段声明(已不再在控制层使用,实际逻辑已迁移到业务层) private static final String SYSTEM_PROMPT_PATH = "prompts/audio_text_analysis_furniture_system.txt"; private static final String USER_PROMPT_PATH = "prompts/audio_text_analysis_furniture_user.txt"; - - // 缓存提示词内容,避免重复读取文件 private static String cachedSystemPrompt; private static String cachedUserPromptTemplate; @@ -243,9 +246,20 @@ public class AudioTextAnalysisFurnitureController { } AudioTextAnalysisFurniture furniture = new AudioTextAnalysisFurniture(); furniture.setRecordingText(recordingText); - // 4. 调用大模型生成总结,传递待办事项和SOP所需的关联信息 - generateSummaryByLLM(furniture, id, audioManagement.getSalesName(), audioManagement.getSalesPhone(), - audioManagement.getCustomerName(), audioManagement.getCustomerPhone()); + // 4. 通过业务层通用服务调用大模型生成总结,然后解析结构化结果 + String rawContent = audioTextAnalysisLlmService.generateSummaryByLLM( + AudioAnalysisSceneType.SCENARIO_MEETING_SUMMARY, + furniture.getRecordingText() + ); + applyStructuredResult( + furniture, + rawContent, + id, + audioManagement.getSalesName(), + audioManagement.getSalesPhone(), + audioManagement.getCustomerName(), + audioManagement.getCustomerPhone() + ); audioManagement = new AudioManagement();