From de6f2bdba5884afd668e536f1e378e5a5195159d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=AF=E8=88=AA=E8=80=81=E9=BD=90?= <280645618@qq.com> Date: Sat, 7 Mar 2026 16:55:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=A2=E5=8D=95=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qihangerp/erp/service/OrderService.java | 108 ++++++++++++++++++ .../erp/service/OrderToolService.java | 85 ++++++++++++++ .../qihangerp/erp/serviceImpl/AiService.java | 45 ++++++-- vue/src/views/index.vue | 11 +- 4 files changed, 234 insertions(+), 15 deletions(-) create mode 100644 api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderService.java create mode 100644 api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderToolService.java 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 new file mode 100644 index 00000000..29f8c75b --- /dev/null +++ b/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderService.java @@ -0,0 +1,108 @@ +package cn.qihangerp.erp.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 订单服务类,用于查询订单信息 + */ +public class OrderService { + + // 模拟订单数据 + private static final Map orderMap = new ConcurrentHashMap<>(); + + static { + // 初始化一些模拟订单数据 + orderMap.put("ORDER001", new Order("ORDER001", "2026-03-01", "张三", 1299.99, "待发货")); + orderMap.put("ORDER002", new Order("ORDER002", "2026-03-02", "李四", 899.99, "已发货")); + 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, "已发货")); + } + + /** + * 根据订单号查询订单 + * @param orderId 订单号 + * @return 订单信息 + */ + public Order getOrderById(String orderId) { + return orderMap.get(orderId); + } + + /** + * 获取所有订单 + * @return 订单列表 + */ + public List getAllOrders() { + return new ArrayList<>(orderMap.values()); + } + + /** + * 根据状态查询订单 + * @param status 订单状态 + * @return 订单列表 + */ + public List getOrdersByStatus(String status) { + List orders = new ArrayList<>(); + for (Order order : orderMap.values()) { + if (order.getStatus().equals(status)) { + orders.add(order); + } + } + return orders; + } + + /** + * 获取待发货订单 + * @return 待发货订单列表 + */ + public List getPendingOrders() { + return getOrdersByStatus("待发货"); + } + + /** + * 订单实体类 + */ + public static class Order { + private String orderId; + private String orderDate; + private String customerName; + private double totalAmount; + private String status; + + public Order(String orderId, String orderDate, String customerName, double totalAmount, String status) { + this.orderId = orderId; + this.orderDate = orderDate; + this.customerName = customerName; + this.totalAmount = totalAmount; + this.status = status; + } + + public String getOrderId() { + return orderId; + } + + public String getOrderDate() { + return orderDate; + } + + public String getCustomerName() { + return customerName; + } + + public double getTotalAmount() { + return totalAmount; + } + + public String getStatus() { + return status; + } + + @Override + public String toString() { + return "订单号: " + orderId + ", 日期: " + orderDate + ", 客户: " + customerName + ", 金额: " + totalAmount + ", 状态: " + status; + } + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..47f2e6c3 --- /dev/null +++ b/api/ai-agent/src/main/java/cn/qihangerp/erp/service/OrderToolService.java @@ -0,0 +1,85 @@ +package cn.qihangerp.erp.service; + +import dev.langchain4j.agent.tool.Tool; +import java.util.List; + +/** + * 订单工具服务,用于AI查询订单信息 + */ +public class OrderToolService { + + private final OrderService orderService; + + public OrderToolService() { + this.orderService = new OrderService(); + } + + /** + * 查询指定订单号的订单信息 + * @param orderId 订单号 + * @return 订单信息 + */ + @Tool("根据订单号查询订单信息") + public String getOrderById(String orderId) { + OrderService.Order order = orderService.getOrderById(orderId); + if (order == null) { + return "未找到订单号为" + orderId + "的订单"; + } + return order.toString().replace("\n", "
"); + } + + /** + * 查询所有订单 + * @return 所有订单信息 + */ + @Tool("获取所有订单信息") + public String getAllOrders() { + List orders = orderService.getAllOrders(); + if (orders.isEmpty()) { + return "暂无订单数据"; + } + StringBuilder sb = new StringBuilder(); + sb.append("所有订单信息:
"); + for (OrderService.Order order : orders) { + sb.append(order.toString()).append("
"); + } + return sb.toString(); + } + + /** + * 查询指定状态的订单 + * @param status 订单状态 + * @return 订单信息 + */ + @Tool("根据状态查询订单信息") + public String getOrdersByStatus(String status) { + List orders = orderService.getOrdersByStatus(status); + if (orders.isEmpty()) { + return "暂无状态为" + status + "的订单"; + } + StringBuilder sb = new StringBuilder(); + sb.append("状态为").append(status).append("的订单:
"); + for (OrderService.Order order : orders) { + sb.append(order.toString()).append("
"); + } + return sb.toString(); + } + + /** + * 查询待发货订单 + * @return 待发货订单信息 + */ + @Tool("获取待发货订单信息") + public String getPendingOrders() { + List orders = orderService.getPendingOrders(); + if (orders.isEmpty()) { + return "暂无待发货订单"; + } + StringBuilder sb = new StringBuilder(); + sb.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 165ecc9b..83352277 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 @@ -3,6 +3,7 @@ package cn.qihangerp.erp.serviceImpl; import dev.langchain4j.model.ollama.OllamaChatModel; import org.springframework.stereotype.Service; import java.time.Duration; +import cn.qihangerp.erp.service.OrderToolService; /** * AI服务类,使用LangChain4J调用Ollama模型处理聊天内容 @@ -18,16 +19,40 @@ public class AiService { */ public String processMessage(String message, String model) { try { - // 根据模型名称创建对应的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); + // 检查是否是订单相关查询 + 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); + } } catch (Exception e) { e.printStackTrace(); return "错误: " + e.getMessage(); diff --git a/vue/src/views/index.vue b/vue/src/views/index.vue index 9ba39f43..75c5c53b 100644 --- a/vue/src/views/index.vue +++ b/vue/src/views/index.vue @@ -31,7 +31,7 @@
-
{{ message.content }}
+
{{ message.time }}
@@ -443,10 +443,11 @@ export default { box-shadow: 0 2px 4px rgba(0,0,0,0.1); .message-text { - font-size: 14px; - line-height: 1.5; - margin-bottom: 4px; - } + font-size: 14px; + line-height: 1.5; + margin-bottom: 4px; + white-space: pre-line; + } .message-time { font-size: 12px;