diff --git a/api/ai-agent/pom.xml b/api/ai-agent/pom.xml index 68341d95..794e7b0d 100644 --- a/api/ai-agent/pom.xml +++ b/api/ai-agent/pom.xml @@ -143,6 +143,7 @@ + dev.langchain4j langchain4j diff --git a/api/ai-agent/src/main/java/cn/qihangerp/erp/controller/SseController.java b/api/ai-agent/src/main/java/cn/qihangerp/erp/controller/SseController.java index 2afbfa3f..a34999c7 100644 --- a/api/ai-agent/src/main/java/cn/qihangerp/erp/controller/SseController.java +++ b/api/ai-agent/src/main/java/cn/qihangerp/erp/controller/SseController.java @@ -71,10 +71,17 @@ public class SseController { try { // 使用AiService处理消息,传递模型参数 String response = aiService.processMessage(message, model); + log.info("==========AI回复:{}",response); + // 确保SSE消息格式正确,处理多行消息 + String[] lines = response.split("\n"); + StringBuilder formattedResponse = new StringBuilder(); + for (String line : lines) { + formattedResponse.append("data:").append(line).append("\n"); + } + formattedResponse.append("\n"); // 结束消息 - emitter.send(SseEmitter.event() - .name("message") - .data(response)); + emitter.send(formattedResponse.toString()); + log.info("发送给前端的消息: {}", response); return "消息发送成功"; } catch (Exception e) { diff --git a/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderService.java b/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderService.java index 29f8c75b..ae59d0a9 100644 --- a/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderService.java +++ b/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderService.java @@ -1,5 +1,7 @@ package cn.qihangerp.erp.service; +import lombok.extern.slf4j.Slf4j; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -8,6 +10,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * 订单服务类,用于查询订单信息 */ +@Slf4j public class OrderService { // 模拟订单数据 @@ -20,6 +23,8 @@ public class OrderService { orderMap.put("ORDER003", new Order("ORDER003", "2026-03-03", "王五", 599.99, "已完成")); orderMap.put("ORDER004", new Order("ORDER004", "2026-03-04", "赵六", 1999.99, "待发货")); orderMap.put("ORDER005", new Order("ORDER005", "2026-03-05", "钱七", 399.99, "已发货")); + orderMap.put("ORDER006", new Order("ORDER006", "2026-03-06", "齐", 399.99, "已发货")); + orderMap.put("ORDER007", new Order("ORDER007", "2026-03-07", "钱", 399.99, "未发货")); } /** @@ -62,6 +67,22 @@ public class OrderService { return getOrdersByStatus("待发货"); } + /** + * 根据日期查询订单 + * @param date 订单日期 + * @return 订单列表 + */ + public List getOrdersByDate(String date) { + log.info("=========根据日期查询订单:{}",date); + List orders = new ArrayList<>(); + for (Order order : orderMap.values()) { + if (order.getOrderDate().equals(date)) { + orders.add(order); + } + } + return orders; + } + /** * 订单实体类 */ diff --git a/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderToolService.java b/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderToolService.java index 47f2e6c3..96bb8c62 100644 --- a/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderToolService.java +++ b/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderToolService.java @@ -2,6 +2,8 @@ package cn.qihangerp.erp.service; import dev.langchain4j.agent.tool.Tool; import java.util.List; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; /** * 订单工具服务,用于AI查询订单信息 @@ -82,4 +84,32 @@ public class OrderToolService { } return sb.toString(); } + + /** + * 根据日期查询订单 + * @param date 订单日期,可以是具体日期或"今天"、"昨天"、"明天"等时间表达式 + * @return 订单信息 + */ + @Tool("根据日期查询订单信息") + public String getOrdersByDate(String date) { + // 处理时间表达式 + if ("今天".equals(date)) { + date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } else if ("昨天".equals(date)) { + date = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } else if ("明天".equals(date)) { + date = LocalDate.now().plusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } + + List orders = orderService.getOrdersByDate(date); + if (orders.isEmpty()) { + return "暂无日期为" + date + "的订单"; + } + StringBuilder sb = new StringBuilder(); + sb.append("日期为").append(date).append("的订单:
"); + for (OrderService.Order order : orders) { + sb.append(order.toString()).append("
"); + } + return sb.toString(); + } } \ No newline at end of file diff --git a/api/ai-agent/src/main/java/cn/qihangerp/erp/serviceImpl/AiService.java b/api/ai-agent/src/main/java/cn/qihangerp/erp/serviceImpl/AiService.java index 83352277..d2410140 100644 --- a/api/ai-agent/src/main/java/cn/qihangerp/erp/serviceImpl/AiService.java +++ b/api/ai-agent/src/main/java/cn/qihangerp/erp/serviceImpl/AiService.java @@ -1,8 +1,11 @@ package cn.qihangerp.erp.serviceImpl; import dev.langchain4j.model.ollama.OllamaChatModel; +import dev.langchain4j.service.AiServices; import org.springframework.stereotype.Service; import java.time.Duration; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import cn.qihangerp.erp.service.OrderToolService; /** @@ -11,6 +14,13 @@ import cn.qihangerp.erp.service.OrderToolService; @Service public class AiService { + /** + * 定义AI服务接口 + */ + interface OrderAiService { + String chat(String message); + } + /** * 处理聊天消息 * @param message 用户消息 @@ -19,40 +29,35 @@ public class AiService { */ public String processMessage(String message, String model) { try { - // 检查是否是订单相关查询 - if (message.contains("订单")) { - // 使用订单服务直接处理 - OrderToolService orderToolService = new OrderToolService(); - - // 简单的意图识别 - if (message.contains("待发货") || message.contains("未发货")) { - return orderToolService.getPendingOrders(); - } else if (message.contains("所有")) { - return orderToolService.getAllOrders(); - } else if (message.contains("状态")) { - // 提取状态 - String status = message.replaceAll(".*状态为([^,。]+).*", "$1"); - return orderToolService.getOrdersByStatus(status); - } else if (message.contains("订单号") || message.contains("订单ID")) { - // 提取订单号 - String orderId = message.replaceAll(".*[订单号|订单ID][::]([^,。]+).*", "$1"); - return orderToolService.getOrderById(orderId); - } else { - // 默认返回所有订单 - return orderToolService.getAllOrders(); - } - } else { - // 根据模型名称创建对应的ChatModel - OllamaChatModel modelInstance = OllamaChatModel.builder() - .baseUrl("http://localhost:11434") // Ollama默认端口 - .modelName(model) // 使用指定的模型 - .temperature(0.7) - .timeout(Duration.ofSeconds(300)) // 超时时间设置为300秒(5分钟) - .build(); - - // 调用Ollama模型获取回复 - return modelInstance.chat(message); - } + // 获取当前日期 + String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + + // 替换消息中的"今天"为具体日期 + message = message.replace("今天", today); + + // 根据模型名称创建对应的ChatModel + OllamaChatModel modelInstance = OllamaChatModel.builder() + .baseUrl("http://localhost:11434") // Ollama默认端口 + .modelName(model) // 使用指定的模型 + .temperature(0.7) + .timeout(Duration.ofSeconds(300)) // 超时时间设置为300秒(5分钟) + .build(); + + // 创建订单工具服务 + OrderToolService orderToolService = new OrderToolService(); + + // 使用AiServices创建AI服务,自动处理工具调用 + OrderAiService aiService = AiServices.builder(OrderAiService.class) + .chatModel(modelInstance) + .tools(orderToolService) + .build(); + + // 执行AI服务,添加今天的日期信息 + String enhancedMessage = "今天的日期是:" + today + "\n" + message; + System.out.println("发送给AI的消息: " + enhancedMessage); + String result = aiService.chat(enhancedMessage); + System.out.println("AI返回的结果: " + result); + return result; } catch (Exception e) { e.printStackTrace(); return "错误: " + e.getMessage(); diff --git a/vue/src/views/index.vue b/vue/src/views/index.vue index 75c5c53b..da4404fa 100644 --- a/vue/src/views/index.vue +++ b/vue/src/views/index.vue @@ -209,8 +209,12 @@ export default { this.isLoading = false; } // 添加实际回复消息 + // 确保消息内容是完整的,处理多行消息 + let messageContent = event.data; + // 移除可能的data:前缀 + messageContent = messageContent.replace(/^data:/g, ''); this.messages.push({ - content: event.data, + content: messageContent, time: this.formatTime(new Date()), isMe: false, avatar: ''