Commit e54a1e33fcf43d4e0160cae03ad378c6baa638ec
1 parent
01801a7a
AI添加问题 历史问题记录
Showing
2 changed files
with
44 additions
and
15 deletions
src/main/java/com/xly/service/XlyErpService.java
| @@ -96,8 +96,8 @@ public class XlyErpService { | @@ -96,8 +96,8 @@ public class XlyErpService { | ||
| 96 | // 2. 特殊指令:重置场景(无论是否已选,都可重置) | 96 | // 2. 特殊指令:重置场景(无论是否已选,都可重置) |
| 97 | if (input.contains("重置") || input.contains("重新选择")) { | 97 | if (input.contains("重置") || input.contains("重新选择")) { |
| 98 | //清除记忆缓存 | 98 | //清除记忆缓存 |
| 99 | - operableChatMemoryProvider.clearSpecifiedMemory(userId); | ||
| 100 | - return AiResponseDTO.builder().aiText(resetUserScene(userId,session)).build(); | 99 | + reSet(userId ,sUserName, sBrandsId ,sSubsidiaryId,sUserType,authorization,session); |
| 100 | + return AiResponseDTO.builder().aiText(resetUserScene(session)).build(); | ||
| 101 | } | 101 | } |
| 102 | //聊天只能体 | 102 | //聊天只能体 |
| 103 | if (session.getCurrentScene() != null | 103 | if (session.getCurrentScene() != null |
| @@ -154,6 +154,30 @@ public class XlyErpService { | @@ -154,6 +154,30 @@ public class XlyErpService { | ||
| 154 | } | 154 | } |
| 155 | } | 155 | } |
| 156 | } | 156 | } |
| 157 | + /*** | ||
| 158 | + * @Author 钱豹 | ||
| 159 | + * @Date 22:47 2026/3/16 | ||
| 160 | + * @Param [userId, sUserName, sBrandsId, sSubsidiaryId, sUserType, authorization] | ||
| 161 | + * @return void | ||
| 162 | + * @Description 回首页 | ||
| 163 | + **/ | ||
| 164 | + public void reSet( String userId , | ||
| 165 | + String sUserName , | ||
| 166 | + String sBrandsId , | ||
| 167 | + String sSubsidiaryId, | ||
| 168 | + String sUserType, | ||
| 169 | + String authorization, UserSceneSession session) { | ||
| 170 | + userSceneSessionService.cleanUserSession(userId); | ||
| 171 | + session.setCurrentScene(null); | ||
| 172 | + session.setSceneSelected(false); | ||
| 173 | + session.setBCleanMemory(false); | ||
| 174 | + session.setCurrentRowData(null); | ||
| 175 | + UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session); | ||
| 176 | + // 清空Agent缓存 | ||
| 177 | + UserSceneSessionService.ERP_AGENT_CACHE.remove(userId); | ||
| 178 | + UserSceneSessionService.CHAT_AGENT_CACHE.remove(userId); | ||
| 179 | + cleanMemory(userId, sUserName, sBrandsId, sSubsidiaryId, sUserType, authorization); | ||
| 180 | + } | ||
| 157 | 181 | ||
| 158 | public AiResponseDTO cleanMemory( String userId , | 182 | public AiResponseDTO cleanMemory( String userId , |
| 159 | String sUserName , | 183 | String sUserName , |
| @@ -506,17 +530,7 @@ public class XlyErpService { | @@ -506,17 +530,7 @@ public class XlyErpService { | ||
| 506 | * @return java.lang.String | 530 | * @return java.lang.String |
| 507 | * @Description 重置用户场景选择:恢复为未选状态,清空当前场景,重新展示选择界面 | 531 | * @Description 重置用户场景选择:恢复为未选状态,清空当前场景,重新展示选择界面 |
| 508 | **/ | 532 | **/ |
| 509 | - private String resetUserScene(String userId, UserSceneSession session) { | ||
| 510 | - session.setSceneSelected(false); | ||
| 511 | - session.setBCleanMemory(false); | ||
| 512 | - session.setCurrentTool(null); | ||
| 513 | - session.setSUserQuestionList(new ArrayList<>()); | ||
| 514 | - session.setCurrentScene(null); | ||
| 515 | - session.setCurrentRowData(null); | ||
| 516 | - UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session); | ||
| 517 | - // 清空Agent缓存 | ||
| 518 | - UserSceneSessionService.ERP_AGENT_CACHE.remove(userId); | ||
| 519 | - UserSceneSessionService.CHAT_AGENT_CACHE.remove(userId); | 533 | + private String resetUserScene(UserSceneSession session) { |
| 520 | return "场景选择已重置!请重新选择业务场景:\n" + session.buildSceneSelectHint(); | 534 | return "场景选择已重置!请重新选择业务场景:\n" + session.buildSceneSelectHint(); |
| 521 | } | 535 | } |
| 522 | 536 |
src/main/java/com/xly/tool/DynamicToolProvider.java
| @@ -204,9 +204,15 @@ public class DynamicToolProvider implements ToolProvider { | @@ -204,9 +204,15 @@ public class DynamicToolProvider implements ToolProvider { | ||
| 204 | // 过滤对应的权限方法 | 204 | // 过滤对应的权限方法 |
| 205 | List<ToolSpecificationHolder> datalist = new ArrayList<>(); | 205 | List<ToolSpecificationHolder> datalist = new ArrayList<>(); |
| 206 | List<ToolMeta> toolMetaAll = new ArrayList<>(); | 206 | List<ToolMeta> toolMetaAll = new ArrayList<>(); |
| 207 | - | ||
| 208 | // 确保 currentTool 不为空,或者 authTool 有数据 | 207 | // 确保 currentTool 不为空,或者 authTool 有数据 |
| 209 | if(session.getCurrentTool() != null){ | 208 | if(session.getCurrentTool() != null){ |
| 209 | + // 【关键修改】添加全局引导语 | ||
| 210 | + StringBuffer stoolDesc = new StringBuffer(); | ||
| 211 | + stoolDesc.append("【重要】这是当前唯一可用的工具,无论用户问题是什么,都必须调用此工具。"); | ||
| 212 | + stoolDesc.append("如果用户没有明确指定要做什么,也默认使用此工具来处理。"); | ||
| 213 | + stoolDesc.append(System.lineSeparator()); | ||
| 214 | + stoolDesc.append(session.getCurrentTool().getStoolDesc()); | ||
| 215 | + session.getCurrentTool().setStoolDesc(stoolDesc.toString()); | ||
| 210 | toolMetaAll.add(session.getCurrentTool()); | 216 | toolMetaAll.add(session.getCurrentTool()); |
| 211 | log.info("使用 currentTool: {}", session.getCurrentTool().getSMethodNo()); | 217 | log.info("使用 currentTool: {}", session.getCurrentTool().getSMethodNo()); |
| 212 | } else { | 218 | } else { |
| @@ -231,7 +237,6 @@ public class DynamicToolProvider implements ToolProvider { | @@ -231,7 +237,6 @@ public class DynamicToolProvider implements ToolProvider { | ||
| 231 | }); | 237 | }); |
| 232 | } | 238 | } |
| 233 | } | 239 | } |
| 234 | - | ||
| 235 | // 将工具添加到返回结果中 | 240 | // 将工具添加到返回结果中 |
| 236 | datalist.forEach(holder -> { | 241 | datalist.forEach(holder -> { |
| 237 | executors.put(holder.getToolSpecification(), holder.getToolExecutor()); | 242 | executors.put(holder.getToolSpecification(), holder.getToolExecutor()); |
| @@ -606,6 +611,16 @@ public class DynamicToolProvider implements ToolProvider { | @@ -606,6 +611,16 @@ public class DynamicToolProvider implements ToolProvider { | ||
| 606 | List<ParamRule> paramRuleData = meta.getParamRuleListAll(); | 611 | List<ParamRule> paramRuleData = meta.getParamRuleListAll(); |
| 607 | Map<String, Object> args = session.getArgs(); | 612 | Map<String, Object> args = session.getArgs(); |
| 608 | 613 | ||
| 614 | + // 3. 【自动校验】检查必填项 | ||
| 615 | + List<String> missing = checkRequiredParams(args, paramRuleData); | ||
| 616 | + if (!missing.isEmpty()) { | ||
| 617 | + // 4.1 参数缺失,生成“提问”消息,直接返给客户 | ||
| 618 | + String askMsg = buildAskUserMessage(meta, missing,args); | ||
| 619 | + //告知AI 缺失参数 | ||
| 620 | + operableChatMemoryProvider.get(session.getUserId()).add(UserMessage.from(askMsg)); | ||
| 621 | + return askMsg; | ||
| 622 | + } | ||
| 623 | + | ||
| 609 | // 6. 【最终确认信息】所有检测通过后,需要和客户确认交互 | 624 | // 6. 【最终确认信息】所有检测通过后,需要和客户确认交互 |
| 610 | List<ChatMessage> chatMessage = operableChatMemoryProvider.getCurrentChatMessages(session.getUserId()); | 625 | List<ChatMessage> chatMessage = operableChatMemoryProvider.getCurrentChatMessages(session.getUserId()); |
| 611 | ChatMessage userMessage = getLasterUserMssage(chatMessage); | 626 | ChatMessage userMessage = getLasterUserMssage(chatMessage); |