多场景分析代码架构

This commit is contained in:
zhonghua1
2026-01-06 22:07:35 +08:00
parent be1554cd9a
commit 34e352fbb6
2 changed files with 134 additions and 10 deletions

View File

@@ -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<Map<String, Object>> AIAnlyById(
@Parameter(description = "录音信息", required = true)
@RequestBody AudioManagement audioManagement) {
Map<String, Object> 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<AudioManagementSegments> segQuery = new LambdaQueryWrapper<>();
segQuery.eq(AudioManagementSegments::getParentId, audioManagementFromDB.getId())
.orderByAsc(AudioManagementSegments::getChunkIndex);
List<AudioManagementSegments> 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删除录音

View File

@@ -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();