Commit dfc18450a7a06ee3682adb888d37d416981a7d91

Authored by qianbao
1 parent 81a572e6

1111

src/main/java/com/xly/service/XlyErpService.java
... ... @@ -63,7 +63,8 @@ public class XlyErpService {
63 63 String sSubsidiaryId,
64 64 String sUserType,
65 65 String authorization) {
66   - long startTime = System.currentTimeMillis();
  66 + String sceneName = StrUtil.EMPTY;
  67 + String methodName = StrUtil.EMPTY;
67 68 try {
68 69 // 0. 预处理用户输入:去空格、转小写(方便匹配)
69 70 String input= InputPreprocessor.preprocessWithCommons(userInput);
... ... @@ -71,6 +72,8 @@ public class XlyErpService {
71 72 UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization);
72 73 session.setAuthorization(authorization);
73 74 session.setSFunPrompts(null);
  75 + sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY;
  76 + methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY;
74 77 // 2. 特殊指令:重置场景(无论是否已选,都可重置)
75 78 if (input.contains("重置") || input.contains("重新选择")) {
76 79 //清除记忆缓存
... ... @@ -118,7 +121,6 @@ public class XlyErpService {
118 121 ){
119 122 sResponMessage = getDynamicTableSql(session, input, userId, userInput);
120 123 }
121   -
122 124 //如果返回空的进入闲聊模式
123 125 if (ObjectUtil.isEmpty(sResponMessage)){
124 126 return getChatiAgent (input, session);
... ... @@ -130,13 +132,29 @@ public class XlyErpService {
130 132 .sReturnType(ReturnTypeCode.MAKEDOWN.getCode())
131 133 .build();
132 134 }else {
133   - return AiResponseDTO.builder().aiText("当前场景:没有选择 退回当前场景 请输入 "+ CommonConstant.RESET + sResponMessage).sReturnType(ReturnTypeCode.HTML.getCode()).build();
  135 + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText("当前场景:没有选择 退回当前场景 请输入 "+ CommonConstant.RESET + sResponMessage).sReturnType(ReturnTypeCode.HTML.getCode()).build();
134 136 }
135 137 } catch (Exception e) {
136   - return AiResponseDTO.builder().aiText("系统异常:" + e.getMessage() + ",请稍后重试!").sReturnType(ReturnTypeCode.HTML.getCode()).build();
  138 + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText("系统异常:" + e.getMessage() + ",请稍后重试!").sReturnType(ReturnTypeCode.HTML.getCode()).build();
137 139 }
138 140 }
139 141  
  142 + public AiResponseDTO cleanMemory( String userId ,
  143 + String sUserName ,
  144 + String sBrandsId ,
  145 + String sSubsidiaryId,
  146 + String sUserType,
  147 + String authorization) {
  148 +
  149 + UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization);
  150 + operableChatMemoryProvider.clearSpecifiedMemory(userId);
  151 + session.setCurrentTool(null);
  152 + session.setBCleanMemory(false);
  153 + String sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY;
  154 + String methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY;
  155 + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(StrUtil.EMPTY).systemText("清除记忆成功!").sReturnType(ReturnTypeCode.HTML.getCode()).build();
  156 + }
  157 +
140 158  
141 159 /***
142 160 * @Author 钱豹
... ... @@ -333,6 +351,8 @@ public class XlyErpService {
333 351 private AiResponseDTO handleSceneSelect(String userId, String userInput, UserSceneSession session) {
334 352 // 1. 尝试根据序号匹配场景
335 353 boolean selectSuccess = session.selectSceneByInput(userInput);
  354 + String sceneName = StrUtil.EMPTY;
  355 + String methodName = StrUtil.EMPTY;
336 356 if (selectSuccess) {
337 357 // 2. 选择成功:更新缓存,返回成功提示
338 358 UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session);
... ... @@ -341,10 +361,12 @@ public class XlyErpService {
341 361 //清除记忆缓存
342 362 operableChatMemoryProvider.clearSpecifiedMemory(userId);
343 363 String aiText = "智能体选择成功! 现在可以问她相关问题(如" + String.join("、", session.getCurrentScene().getSSceneContext()) + ")";
344   - return AiResponseDTO.builder().aiText(aiText).sSceneName(session.getCurrentScene().getSSceneName()).build();
  364 + sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene().getSSceneName())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY;
  365 + methodName = ObjectUtil.isNotEmpty(session.getCurrentTool().getSControlName())?session.getCurrentTool().getSControlName():StrUtil.EMPTY;
  366 + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(aiText).sSceneName(session.getCurrentScene().getSSceneName()).build();
345 367 } else {
346 368 // 3. 选择失败:重新展示场景选择提示
347   - return AiResponseDTO.builder().aiText(session.buildSceneSelectHint()).build();
  369 + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(session.buildSceneSelectHint()).build();
348 370 }
349 371 }
350 372  
... ... @@ -364,7 +386,9 @@ public class XlyErpService {
364 386 .build();
365 387 UserSceneSessionService.CHAT_AGENT_CACHE.put(session.getUserId(), chatiAgent); }
366 388 String sChatMessage = chatiAgent.chat(session.getUserId(), input);
367   - return AiResponseDTO.builder().aiText(sChatMessage).sSceneName("随便聊聊").systemText(StrUtil.EMPTY).sReturnType(ReturnTypeCode.HTML.getCode()).build();
  389 + String sceneName = ObjectUtil.isNotEmpty(session.getCurrentScene())?session.getCurrentScene().getSSceneName():StrUtil.EMPTY;
  390 + String methodName = ObjectUtil.isNotEmpty(session.getCurrentTool())?session.getCurrentTool().getSMethodName():StrUtil.EMPTY;
  391 + return AiResponseDTO.builder().sSceneName(sceneName).sMethodName(methodName).aiText(sChatMessage).sSceneName("随便聊聊").systemText(StrUtil.EMPTY).sReturnType(ReturnTypeCode.HTML.getCode()).build();
368 392 }
369 393  
370 394 }
371 395 \ No newline at end of file
... ...
src/main/java/com/xly/tts/service/PythonTtsProxyService.java
... ... @@ -76,11 +76,34 @@ public class PythonTtsProxyService {
76 76 String sSubsidiaryId = request.getSubsidiaryid();
77 77 String sUserType = request.getUsertype();
78 78 String authorization = request.getAuthorization();
79   - //校验登录token 是否有效
80 79 AiResponseDTO voiceText = xlyErpService.erpUserInput(userInput,sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization);
81 80 return synthesizeStreamAi(request,voiceText);
82 81 }
83 82  
  83 + public ResponseEntity<TTSResponseDTO> cleanMemory(TTSRequestDTO request) {
  84 + //调用AI返回请求内容
  85 + String sUserId = request.getUserid();
  86 + String sUserName = request.getUsername();
  87 + String sBrandsId = request.getBrandsid();
  88 + String sSubsidiaryId = request.getSubsidiaryid();
  89 + String sUserType = request.getUsertype();
  90 + String authorization = request.getAuthorization();
  91 + AiResponseDTO aiResponseDTO = xlyErpService.cleanMemory(sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization);
  92 + return ResponseEntity.ok(TTSResponseDTO.builder()
  93 + .code(200)
  94 + .message("success")
  95 + .originalText(request.getText()) // 原始文本
  96 + .processedText(aiResponseDTO.getAiText()) // AI提示语
  97 + .systemText(aiResponseDTO.getSystemText()) // 系统提示语言
  98 + .voice(request.getVoice())
  99 + .sSceneName(aiResponseDTO.getSSceneName())
  100 + .sMethodName (aiResponseDTO.getSMethodName())
  101 + .sReturnType (aiResponseDTO.getSReturnType())
  102 + .timestamp(System.currentTimeMillis())
  103 + .textLength(request.getText().length())
  104 + .build());
  105 + }
  106 +
84 107 /***
85 108 * @Author 钱豹
86 109 * @Date 11:16 2026/2/8
... ... @@ -165,8 +188,8 @@ public class PythonTtsProxyService {
165 188 .audioBase64(audioBase64) // Base64编码的音频
166 189 .audioSize(response.getBody().length)
167 190 .sSceneName(aiResponseDTO.getSSceneName())
168   - .sMethodName (aiResponseDTO.getSMethodName())
169   - .sReturnType (aiResponseDTO.getSReturnType())
  191 + .sMethodName(aiResponseDTO.getSMethodName())
  192 + .sReturnType(aiResponseDTO.getSReturnType())
170 193 .audioFormat("audio/mpeg")
171 194 .build();
172 195 return ResponseEntity.ok(ttsResponse);
... ...
src/main/java/com/xly/web/TTSStreamController.java
... ... @@ -79,6 +79,14 @@ public class TTSStreamController {
79 79 }
80 80  
81 81 /**
  82 + * 流式合成语音(代理到Python服务)
  83 + */
  84 + @PostMapping("/cleanMemory")
  85 + public ResponseEntity<TTSResponseDTO> cleanMemory(@RequestBody TTSRequestDTO request) {
  86 + return pythonTtsProxyService.cleanMemory(request);
  87 + }
  88 +
  89 + /**
82 90 * 流式合成语音(异步)
83 91 */
84 92 @PostMapping("/async-stream")
... ...