From 0d7d874912d0147376826b55667a1deb6547ed91 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 21 五月 2026 15:25:27 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' into dev_宁夏_英泽防锈

---
 src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java |  249 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 188 insertions(+), 61 deletions(-)

diff --git a/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java b/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
index 5991fc3..c04915e 100644
--- a/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
+++ b/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
@@ -4,6 +4,9 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -11,8 +14,12 @@
 public class PurchaseIntentExecutor {
 
     private static final Pattern ID_PATTERN = Pattern.compile("\\b\\d{1,12}\\b");
-    private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?(\\d{1,2})鏉�");
-    private static final Pattern DATE_PATTERN = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
+    private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?\\s*(\\d{1,2})\\s*鏉�");
+    private static final Pattern DATE_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
+    private static final Pattern RELATIVE_RANGE_PATTERN = Pattern.compile("(杩憒鏈�杩�)\\s*(\\d{1,3})\\s*(澶﹟鍛▅涓湀|鏈坾骞�)");
+    private static final Pattern HALF_RANGE_PATTERN = Pattern.compile("(鏈�杩憒杩�)?鍗�(涓�)?(鏈坾骞�)");
+    private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final PurchaseAgentTools purchaseAgentTools;
 
@@ -25,71 +32,63 @@
             return null;
         }
         String text = message.trim();
+        String quickPromptResponse = tryExecuteQuickPrompt(memoryId, text);
+        if (StringUtils.hasText(quickPromptResponse)) {
+            return quickPromptResponse;
+        }
 
-        if (containsAny(text, "鎺掕", "鎺掑悕", "鍓嶅嚑", "鍓嶄簲", "鍓嶅崄") && containsAny(text, "鐗╂枡", "浜у搧", "鍘熸潗鏂�", "閲囪喘閲戦", "閲戦")) {
-            return purchaseAgentTools.rankPurchaseMaterials(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    text,
-                    extractLimit(text)
-            );
+        String keyword = extractKeyword(text);
+        Integer limit = extractLimit(text);
+        DateRange dateRange = extractDateRange(text);
+        String startDate = dateRange.startDate();
+        String endDate = dateRange.endDate();
+
+        if (containsAny(text, "鎺掕", "鎺掑悕", "鍓嶅嚑", "鍓嶄簲", "鍓嶅崄")
+                && containsAny(text, "鐗╂枡", "浜у搧", "鍘熸潗鏂�", "閲囪喘閲戦", "閲戦")) {
+            return purchaseAgentTools.rankPurchaseMaterials(memoryId, startDate, endDate, text, limit);
         }
         if (containsAny(text, "鏈叆搴�", "寰呭叆搴�", "娌℃湁鍏ュ簱", "杩樻湭鍏ュ簱")) {
-            return purchaseAgentTools.listUnstockedPurchaseOrders(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractKeyword(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listUnstockedPurchaseOrders(memoryId, startDate, endDate, keyword, limit);
         }
         if (containsAny(text, "鍒拌揣寮傚父", "鍒拌揣鏈夊紓甯�", "寮傚父鍒拌揣", "鍒拌揣闂", "渚涘簲鍟嗗埌璐у紓甯�")) {
-            return purchaseAgentTools.listArrivalExceptions(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    text,
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listArrivalExceptions(memoryId, startDate, endDate, text, limit);
         }
         if (containsAny(text, "寰呬粯娆�", "鏈粯娆�", "鏈粯娓�", "寰呮敮浠�", "搴斾粯")) {
-            return purchaseAgentTools.listPendingPaymentOrders(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractKeyword(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listPendingPaymentOrders(memoryId, startDate, endDate, keyword, limit);
         }
         if (containsAny(text, "閫�璐�", "閫�鏂�", "鎷掓敹")) {
-            return purchaseAgentTools.listPurchaseReturns(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractKeyword(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listPurchaseReturns(memoryId, startDate, endDate, keyword, limit);
         }
         if (isStatsIntent(text)) {
-            return purchaseAgentTools.getPurchaseStats(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    text
-            );
+            return purchaseAgentTools.getPurchaseStats(memoryId, startDate, endDate, text);
         }
-        if (containsAny(text, "璇︽儏", "鏄庣粏") && extractId(text) != null) {
-            return purchaseAgentTools.getPurchaseLedgerDetail(memoryId, extractId(text));
+
+        Long ledgerId = extractId(text);
+        if (containsAny(text, "璇︽儏", "鏄庣粏") && ledgerId != null) {
+            return purchaseAgentTools.getPurchaseLedgerDetail(memoryId, ledgerId);
         }
         if (containsAny(text, "鍙拌处", "閲囪喘鍗�", "閲囪喘璁㈠崟", "璁㈠崟", "鍚堝悓", "鍒楄〃", "鏌ヨ")) {
-            return purchaseAgentTools.listPurchaseLedgers(
-                    memoryId,
-                    extractKeyword(text),
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listPurchaseLedgers(memoryId, keyword, startDate, endDate, limit);
+        }
+        return null;
+    }
+
+    private String tryExecuteQuickPrompt(String memoryId, String text) {
+        String normalized = normalizeForMatch(text);
+        if ("鏈湀閲囪喘閲戦鎺掑悕鍓嶅崄鐨勭墿鏂欐湁鍝簺".equals(normalized)) {
+            return purchaseAgentTools.rankPurchaseMaterials(memoryId, null, null, "鏈湀", 10);
+        }
+        if ("鍝簺閲囪喘璁㈠崟杩樻湭鍏ュ簱".equals(normalized)) {
+            return purchaseAgentTools.listUnstockedPurchaseOrders(memoryId, null, null, null, 10);
+        }
+        if ("鏈�杩�7澶╀緵搴斿晢鍒拌揣寮傚父鏈夊摢浜�".equals(normalized)) {
+            return purchaseAgentTools.listArrivalExceptions(memoryId, null, null, "鏈�杩�7澶�", 10);
+        }
+        if ("甯垜缁熻寰呬粯娆鹃噰璐崟".equals(normalized)) {
+            return purchaseAgentTools.listPendingPaymentOrders(memoryId, null, null, null, 10);
+        }
+        if ("鍒楀嚭鏈湀閲囪喘閫�璐ф儏鍐�".equals(normalized)) {
+            return purchaseAgentTools.listPurchaseReturns(memoryId, null, null, null, 10);
         }
         return null;
     }
@@ -100,8 +99,10 @@
         }
         boolean queryWord = containsAny(text, "鏌ヨ", "鏌ョ湅", "鐪嬩笅", "鐪嬬湅", "鑾峰彇");
         boolean dataWord = containsAny(text, "鏁版嵁", "閲戦", "鏁伴噺", "鍚堝悓棰�", "浠樻棰�", "鍙戠エ棰�");
-        boolean timeWord = containsAny(text, "浠婂ぉ", "鏈懆", "鏈湀", "涓婃湀", "浠婂勾", "鍘诲勾", "杩戝崐骞�", "鏈�杩戝崐涓湀", "鍗婁釜鏈�")
-                || DATE_PATTERN.matcher(text).find();
+        boolean timeWord = containsAny(text, "浠婂ぉ", "鏄ㄥぉ", "鏈懆", "涓婂懆", "鏈湀", "涓婃湀", "浠婂勾", "鍘诲勾", "杩戝崐骞�", "鏈�杩戝崐涓湀", "鍗婁釜鏈�")
+                || DATE_PATTERN.matcher(text).find()
+                || RELATIVE_RANGE_PATTERN.matcher(text).find()
+                || HALF_RANGE_PATTERN.matcher(text).find();
         return queryWord && dataWord && timeWord;
     }
 
@@ -127,23 +128,125 @@
         return matcher.find() ? Integer.parseInt(matcher.group(2)) : 10;
     }
 
-    private String extractStartDate(String text) {
+    private DateRange extractDateRange(String text) {
         Matcher matcher = DATE_PATTERN.matcher(text);
-        return matcher.find() ? matcher.group() : null;
+        if (matcher.find()) {
+            String first = matcher.group(1);
+            String second = matcher.find() ? matcher.group(1) : first;
+            return buildDateRange(first, second);
+        }
+
+        LocalDate today = LocalDate.now(CHINA_ZONE_ID);
+        if (text.contains("浠婂ぉ")) {
+            return new DateRange(formatDate(today), formatDate(today));
+        }
+        if (text.contains("鏄ㄥぉ")) {
+            LocalDate yesterday = today.minusDays(1);
+            return new DateRange(formatDate(yesterday), formatDate(yesterday));
+        }
+        if (text.contains("鏈懆")) {
+            LocalDate start = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            return new DateRange(formatDate(start), formatDate(today));
+        }
+        if (text.contains("涓婂懆")) {
+            LocalDate thisWeekStart = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            LocalDate start = thisWeekStart.minusWeeks(1);
+            LocalDate end = start.plusDays(6);
+            return new DateRange(formatDate(start), formatDate(end));
+        }
+        if (text.contains("鏈湀")) {
+            return new DateRange(formatDate(today.withDayOfMonth(1)), formatDate(today));
+        }
+        if (text.contains("涓婃湀")) {
+            LocalDate start = today.minusMonths(1).withDayOfMonth(1);
+            return new DateRange(formatDate(start), formatDate(start.withDayOfMonth(start.lengthOfMonth())));
+        }
+        if (text.contains("浠婂勾") || text.contains("鏈勾")) {
+            return new DateRange(formatDate(today.withDayOfYear(1)), formatDate(today));
+        }
+        if (text.contains("鍘诲勾")) {
+            LocalDate start = today.minusYears(1).withDayOfYear(1);
+            LocalDate end = start.withDayOfYear(start.lengthOfYear());
+            return new DateRange(formatDate(start), formatDate(end));
+        }
+        if (containsAny(text, "杩戝崐骞�", "鏈�杩戝崐骞�")) {
+            return new DateRange(formatDate(today.minusMonths(6).plusDays(1)), formatDate(today));
+        }
+        if (containsAny(text, "杩戝崐涓湀", "鏈�杩戝崐涓湀", "鍗婁釜鏈�")) {
+            return new DateRange(formatDate(today.minusDays(14)), formatDate(today));
+        }
+
+        Matcher relativeMatcher = RELATIVE_RANGE_PATTERN.matcher(text);
+        if (relativeMatcher.find()) {
+            int amount = Integer.parseInt(relativeMatcher.group(2));
+            String unit = relativeMatcher.group(3);
+            LocalDate start = switch (unit) {
+                case "澶�" -> today.minusDays(Math.max(amount - 1L, 0));
+                case "鍛�" -> today.minusWeeks(Math.max(amount, 1)).plusDays(1);
+                case "涓湀", "鏈�" -> today.minusMonths(Math.max(amount, 1)).plusDays(1);
+                case "骞�" -> today.minusYears(Math.max(amount, 1)).plusDays(1);
+                default -> today.minusDays(29);
+            };
+            return new DateRange(formatDate(start), formatDate(today));
+        }
+
+        return new DateRange(null, null);
     }
 
-    private String extractEndDate(String text) {
-        Matcher matcher = DATE_PATTERN.matcher(text);
-        if (!matcher.find()) {
+    private DateRange buildDateRange(String start, String end) {
+        LocalDate startDate = parseDate(start);
+        LocalDate endDate = parseDate(end);
+        if (startDate == null || endDate == null) {
+            return new DateRange(null, null);
+        }
+        if (startDate.isAfter(endDate)) {
+            LocalDate temp = startDate;
+            startDate = endDate;
+            endDate = temp;
+        }
+        return new DateRange(formatDate(startDate), formatDate(endDate));
+    }
+
+    private LocalDate parseDate(String text) {
+        try {
+            return LocalDate.parse(text, DATE_FMT);
+        } catch (Exception ignored) {
             return null;
         }
-        return matcher.find() ? matcher.group() : null;
+    }
+
+    private String formatDate(LocalDate date) {
+        return date == null ? null : date.format(DATE_FMT);
+    }
+
+    private String normalizeForMatch(String text) {
+        if (!StringUtils.hasText(text)) {
+            return "";
+        }
+        return text.replace("锛�", "")
+                .replace(",", "")
+                .replace("銆�", "")
+                .replace(".", "")
+                .replace("锛�", "")
+                .replace("!", "")
+                .replace("锛�", "")
+                .replace("?", "")
+                .replace("锛�", "")
+                .replace(":", "")
+                .replace("锛�", "")
+                .replace(";", "")
+                .replace(" ", "")
+                .trim();
     }
 
     private String extractKeyword(String text) {
         String cleaned = text
                 .replace("鏌ヨ", "")
                 .replace("鏌ョ湅", "")
+                .replace("鐪嬩笅", "")
+                .replace("鐪嬬湅", "")
+                .replace("璇�", "")
+                .replace("涓�涓�", "")
                 .replace("閲囪喘", "")
                 .replace("閲囪喘鍗�", "")
                 .replace("閲囪喘璁㈠崟", "")
@@ -153,9 +256,33 @@
                 .replace("鍝簺", "")
                 .replace("鍒楀嚭", "")
                 .replace("甯垜", "")
+                .replace("缁熻", "")
+                .replace("鍒嗘瀽", "")
+                .replace("鏈湀", "")
+                .replace("涓婃湀", "")
+                .replace("鏈勾", "")
+                .replace("浠婂勾", "")
+                .replace("鍘诲勾", "")
+                .replace("鏈懆", "")
+                .replace("涓婂懆", "")
+                .replace("浠婂ぉ", "")
+                .replace("鏄ㄥぉ", "")
+                .replace("杩�30澶�", "")
+                .replace("杩�7澶�", "")
+                .replace("杩�15澶�", "")
+                .replace("杩�60澶�", "")
+                .replace("鏈�杩�30澶�", "")
+                .replace("鏈�杩�7澶�", "")
+                .replace("鏈�杩�15澶�", "")
+                .replace("鏈�杩�60澶�", "")
                 .replace("鏈�杩�10鏉�", "")
                 .replace("鍓�10鏉�", "")
+                .replace("鍓�20鏉�", "")
+                .replace("鏈�杩�20鏉�", "")
                 .trim();
         return cleaned.length() >= 2 ? cleaned : null;
     }
+
+    private record DateRange(String startDate, String endDate) {
+    }
 }

--
Gitblit v1.9.3