Commit dfc18450a7a06ee3682adb888d37d416981a7d91
1 parent
81a572e6
1111
Showing
3 changed files
with
65 additions
and
10 deletions
src/main/java/com/xly/service/XlyErpService.java
| @@ -63,7 +63,8 @@ public class XlyErpService { | @@ -63,7 +63,8 @@ public class XlyErpService { | ||
| 63 | String sSubsidiaryId, | 63 | String sSubsidiaryId, |
| 64 | String sUserType, | 64 | String sUserType, |
| 65 | String authorization) { | 65 | String authorization) { |
| 66 | - long startTime = System.currentTimeMillis(); | 66 | + String sceneName = StrUtil.EMPTY; |
| 67 | + String methodName = StrUtil.EMPTY; | ||
| 67 | try { | 68 | try { |
| 68 | // 0. 预处理用户输入:去空格、转小写(方便匹配) | 69 | // 0. 预处理用户输入:去空格、转小写(方便匹配) |
| 69 | String input= InputPreprocessor.preprocessWithCommons(userInput); | 70 | String input= InputPreprocessor.preprocessWithCommons(userInput); |
| @@ -71,6 +72,8 @@ public class XlyErpService { | @@ -71,6 +72,8 @@ public class XlyErpService { | ||
| 71 | UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization); | 72 | UserSceneSession session = userSceneSessionService.getUserSceneSession(userId,sUserName,sBrandsId,sSubsidiaryId,sUserType,authorization); |
| 72 | session.setAuthorization(authorization); | 73 | session.setAuthorization(authorization); |
| 73 | session.setSFunPrompts(null); | 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 | // 2. 特殊指令:重置场景(无论是否已选,都可重置) | 77 | // 2. 特殊指令:重置场景(无论是否已选,都可重置) |
| 75 | if (input.contains("重置") || input.contains("重新选择")) { | 78 | if (input.contains("重置") || input.contains("重新选择")) { |
| 76 | //清除记忆缓存 | 79 | //清除记忆缓存 |
| @@ -118,7 +121,6 @@ public class XlyErpService { | @@ -118,7 +121,6 @@ public class XlyErpService { | ||
| 118 | ){ | 121 | ){ |
| 119 | sResponMessage = getDynamicTableSql(session, input, userId, userInput); | 122 | sResponMessage = getDynamicTableSql(session, input, userId, userInput); |
| 120 | } | 123 | } |
| 121 | - | ||
| 122 | //如果返回空的进入闲聊模式 | 124 | //如果返回空的进入闲聊模式 |
| 123 | if (ObjectUtil.isEmpty(sResponMessage)){ | 125 | if (ObjectUtil.isEmpty(sResponMessage)){ |
| 124 | return getChatiAgent (input, session); | 126 | return getChatiAgent (input, session); |
| @@ -130,13 +132,29 @@ public class XlyErpService { | @@ -130,13 +132,29 @@ public class XlyErpService { | ||
| 130 | .sReturnType(ReturnTypeCode.MAKEDOWN.getCode()) | 132 | .sReturnType(ReturnTypeCode.MAKEDOWN.getCode()) |
| 131 | .build(); | 133 | .build(); |
| 132 | }else { | 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 | } catch (Exception e) { | 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 | * @Author 钱豹 | 160 | * @Author 钱豹 |
| @@ -333,6 +351,8 @@ public class XlyErpService { | @@ -333,6 +351,8 @@ public class XlyErpService { | ||
| 333 | private AiResponseDTO handleSceneSelect(String userId, String userInput, UserSceneSession session) { | 351 | private AiResponseDTO handleSceneSelect(String userId, String userInput, UserSceneSession session) { |
| 334 | // 1. 尝试根据序号匹配场景 | 352 | // 1. 尝试根据序号匹配场景 |
| 335 | boolean selectSuccess = session.selectSceneByInput(userInput); | 353 | boolean selectSuccess = session.selectSceneByInput(userInput); |
| 354 | + String sceneName = StrUtil.EMPTY; | ||
| 355 | + String methodName = StrUtil.EMPTY; | ||
| 336 | if (selectSuccess) { | 356 | if (selectSuccess) { |
| 337 | // 2. 选择成功:更新缓存,返回成功提示 | 357 | // 2. 选择成功:更新缓存,返回成功提示 |
| 338 | UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session); | 358 | UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session); |
| @@ -341,10 +361,12 @@ public class XlyErpService { | @@ -341,10 +361,12 @@ public class XlyErpService { | ||
| 341 | //清除记忆缓存 | 361 | //清除记忆缓存 |
| 342 | operableChatMemoryProvider.clearSpecifiedMemory(userId); | 362 | operableChatMemoryProvider.clearSpecifiedMemory(userId); |
| 343 | String aiText = "智能体选择成功! 现在可以问她相关问题(如" + String.join("、", session.getCurrentScene().getSSceneContext()) + ")"; | 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 | } else { | 367 | } else { |
| 346 | // 3. 选择失败:重新展示场景选择提示 | 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,7 +386,9 @@ public class XlyErpService { | ||
| 364 | .build(); | 386 | .build(); |
| 365 | UserSceneSessionService.CHAT_AGENT_CACHE.put(session.getUserId(), chatiAgent); } | 387 | UserSceneSessionService.CHAT_AGENT_CACHE.put(session.getUserId(), chatiAgent); } |
| 366 | String sChatMessage = chatiAgent.chat(session.getUserId(), input); | 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 | \ No newline at end of file | 395 | \ No newline at end of file |
src/main/java/com/xly/tts/service/PythonTtsProxyService.java
| @@ -76,11 +76,34 @@ public class PythonTtsProxyService { | @@ -76,11 +76,34 @@ public class PythonTtsProxyService { | ||
| 76 | String sSubsidiaryId = request.getSubsidiaryid(); | 76 | String sSubsidiaryId = request.getSubsidiaryid(); |
| 77 | String sUserType = request.getUsertype(); | 77 | String sUserType = request.getUsertype(); |
| 78 | String authorization = request.getAuthorization(); | 78 | String authorization = request.getAuthorization(); |
| 79 | - //校验登录token 是否有效 | ||
| 80 | AiResponseDTO voiceText = xlyErpService.erpUserInput(userInput,sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization); | 79 | AiResponseDTO voiceText = xlyErpService.erpUserInput(userInput,sUserId,sUserName,sBrandsId,sSubsidiaryId,sUserType, authorization); |
| 81 | return synthesizeStreamAi(request,voiceText); | 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 | * @Author 钱豹 | 108 | * @Author 钱豹 |
| 86 | * @Date 11:16 2026/2/8 | 109 | * @Date 11:16 2026/2/8 |
| @@ -165,8 +188,8 @@ public class PythonTtsProxyService { | @@ -165,8 +188,8 @@ public class PythonTtsProxyService { | ||
| 165 | .audioBase64(audioBase64) // Base64编码的音频 | 188 | .audioBase64(audioBase64) // Base64编码的音频 |
| 166 | .audioSize(response.getBody().length) | 189 | .audioSize(response.getBody().length) |
| 167 | .sSceneName(aiResponseDTO.getSSceneName()) | 190 | .sSceneName(aiResponseDTO.getSSceneName()) |
| 168 | - .sMethodName (aiResponseDTO.getSMethodName()) | ||
| 169 | - .sReturnType (aiResponseDTO.getSReturnType()) | 191 | + .sMethodName(aiResponseDTO.getSMethodName()) |
| 192 | + .sReturnType(aiResponseDTO.getSReturnType()) | ||
| 170 | .audioFormat("audio/mpeg") | 193 | .audioFormat("audio/mpeg") |
| 171 | .build(); | 194 | .build(); |
| 172 | return ResponseEntity.ok(ttsResponse); | 195 | return ResponseEntity.ok(ttsResponse); |
src/main/java/com/xly/web/TTSStreamController.java
| @@ -79,6 +79,14 @@ public class TTSStreamController { | @@ -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 | @PostMapping("/async-stream") | 92 | @PostMapping("/async-stream") |