From 482b2982ba27b18e6391c3862ec239c89a801a46 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 21 五月 2026 13:09:05 +0800
Subject: [PATCH] feat(home): 添加生产看板功能并优化订单查询性能

---
 src/main/java/com/ruoyi/ai/assistant/SalesAgent.java                 |    4 
 src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java              |    3 
 src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java |   12 +
 src/main/java/com/ruoyi/ai/service/PurchaseAiService.java            |   12 +
 src/main/java/com/ruoyi/home/controller/HomeController.java          |  138 ++++++++++++--
 src/main/resources/manufacturing-agent-prompt.txt                    |    2 
 src/main/resources/mapper/production/ProductionOrderMapper.xml       |   30 +++
 src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java |   18 +
 src/main/resources/purchase-agent-prompt.txt                         |    2 
 src/main/resources/sales-agent-prompt.txt                            |    2 
 doc/20260521_首页HomeController接口升级前端变更文档.md                           |  113 ++++++++++++
 src/main/java/com/ruoyi/ai/controller/SalesAiController.java         |   12 +
 src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java     |  144 +++++++++++++--
 src/main/java/com/ruoyi/ai/controller/XiaozhiController.java         |   11 +
 src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java         |    3 
 src/main/resources/approve-todo-agent-prompt.txt                     |    2 
 src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java           |    3 
 17 files changed, 447 insertions(+), 64 deletions(-)

diff --git "a/doc/20260521_\351\246\226\351\241\265HomeController\346\216\245\345\217\243\345\215\207\347\272\247\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md" "b/doc/20260521_\351\246\226\351\241\265HomeController\346\216\245\345\217\243\345\215\207\347\272\247\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..008660f
--- /dev/null
+++ "b/doc/20260521_\351\246\226\351\241\265HomeController\346\216\245\345\217\243\345\215\207\347\272\247\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
@@ -0,0 +1,113 @@
+# 棣栭〉 HomeController 鎺ュ彛鍗囩骇鍓嶇鍙樻洿鏂囨。
+
+鏇存柊鏃堕棿锛�2026-05-21  
+閫傜敤妯″潡锛氶椤碉紙`/home`锛�
+
+## 1. 鍙樻洿姒傝
+
+鏈涓� **鍏煎寮忓崌绾�**锛屾棫璋冪敤鏂瑰紡浠嶅彲鐢ㄣ��  
+閲嶇偣鏄粰鐢熶骇鐪嬫澘鎺ュ彛澧炲姞鏇存槑纭殑绛涢�夊弬鏁帮紝渚夸簬鍓嶇鎸夋棩鏈熷拰鐘舵�佹煡璇€��
+
+娑夊強鎺ュ彛锛�
+
+1. `GET /home/productionOrderProgress`
+2. `GET /home/todayProductionPlan`
+
+## 2. 鍙傛暟鍙樻洿
+
+### 2.1 鐢熶骇璁㈠崟杩涘害 `GET /home/productionOrderProgress`
+
+鏃у弬鏁帮紙浠嶅吋瀹癸級锛�
+
+- `tab`锛歚all` / `inProgress` / `completed` / `paused`
+- `pageNum`锛氶粯璁� `1`
+- `pageSize`锛氶粯璁� `10`锛屾渶澶� `50`
+
+鏂板鍙傛暟锛�
+
+- `status`锛堝彲閫夛級锛氱姸鎬佺瓫閫夛紝浼樺厛绾ч珮浜� `tab`  
+  鍙�夊�硷細`all` / `waiting` / `inProgress` / `completed` / `paused` / `1` / `2` / `3` / `4`
+- `bizDate`锛堝彲閫夛級锛氫笟鍔℃棩鏈熺瓫閫夛紝鏍煎紡 `yyyy-MM-dd`锛堟寜璁㈠崟鍒涘缓鏃堕棿杩囨护锛�
+
+鍙傛暟浼樺厛绾э細
+
+1. 濡傛灉浼犱簡 `status`锛屽悗绔紭鍏堟寜 `status` 瑙f瀽锛�
+2. 鏈紶 `status` 鏃讹紝娌跨敤鍘熸湁 `tab` 琛屼负锛�
+3. `status` 鎴� `bizDate` 鏍煎紡閿欒鏃惰繑鍥炲け璐ヤ俊鎭��
+
+璇锋眰绀轰緥锛�
+
+```http
+GET /home/productionOrderProgress?status=completed&bizDate=2026-05-20&pageNum=1&pageSize=10
+```
+
+### 2.2 浠婃棩鐢熶骇璁″垝 `GET /home/todayProductionPlan`
+
+鏃у弬鏁帮紙浠嶅吋瀹癸級锛�
+
+- `limit`锛氶粯璁� `4`锛屾渶澶� `20`
+
+鏂板鍙傛暟锛�
+
+- `planDate`锛堝彲閫夛級锛氳鍒掓棩鏈熺瓫閫夛紝鏍煎紡 `yyyy-MM-dd`锛堟寜 `plan_complete_time` 杩囨护锛�
+
+璇锋眰绀轰緥锛�
+
+```http
+GET /home/todayProductionPlan?limit=6&planDate=2026-05-21
+```
+
+## 3. 杩斿洖缁撴瀯鍙樻洿
+
+### 3.1 `productionOrderProgress` 杩斿洖鏂板瀛楁
+
+鏂板锛�
+
+- `status`锛氭爣鍑嗗寲鐘舵�佸洖鏄撅紙`all` / `waiting` / `inProgress` / `completed` / `paused`锛�
+- `bizDate`锛氭棩鏈熺瓫閫夊洖鏄撅紙鏈紶鏃朵负 `null`锛�
+- `waitingCount`锛氬緟寮�濮嬭鍗曟暟閲�
+
+鍏煎淇濈暀锛�
+
+- `tab` 瀛楁缁х画杩斿洖锛堣�侀〉闈㈡棤闇�鏀瑰姩鍙户缁娇鐢級
+
+杩斿洖绀轰緥锛�
+
+```json
+{
+  "tab": "completed",
+  "status": "completed",
+  "bizDate": "2026-05-20",
+  "total": 24,
+  "pageNum": 1,
+  "pageSize": 10,
+  "waitingCount": 3,
+  "inProgressCount": 6,
+  "completedCount": 12,
+  "pausedCount": 2,
+  "records": []
+}
+```
+
+### 3.2 `todayProductionPlan` 杩斿洖鏂板瀛楁
+
+鏂板锛�
+
+- `planDate`锛氭棩鏈熺瓫閫夊洖鏄撅紙鏈紶鏃朵负 `null`锛�
+
+杩斿洖绀轰緥锛�
+
+```json
+{
+  "planDate": "2026-05-21",
+  "total": 9,
+  "records": []
+}
+```
+
+## 4. 鍓嶇鏀归�犲缓璁�
+
+1. 鏂伴〉闈㈠缓璁紭鍏堜紶 `status`锛岄�愭鏇夸唬 `tab`銆�
+2. 闇�瑕佹寜鏃ユ湡澶嶇洏鐪嬫澘鏃讹紝浣跨敤 `bizDate` / `planDate`銆�
+3. 鑰侀〉闈㈠彲涓嶆敼锛岀户缁部鐢ㄥ師鍙傛暟涔熻兘姝e父鑱旇皟銆�
+
diff --git a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java
index 3b37909..bad0e0a 100644
--- a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java
+++ b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java
@@ -3,6 +3,7 @@
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
 import dev.langchain4j.service.spring.AiService;
 import reactor.core.publisher.Flux;
 
@@ -16,5 +17,5 @@
 public interface ApproveTodoAgent {
 
     @SystemMessage(fromResource = "approve-todo-agent-prompt.txt")
-    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage);
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java b/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java
index f0e8cf7..0d16703 100644
--- a/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java
+++ b/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java
@@ -3,6 +3,7 @@
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
 import dev.langchain4j.service.spring.AiService;
 import reactor.core.publisher.Flux;
 
@@ -17,5 +18,5 @@
 public interface ManufacturingAgent {
 
     @SystemMessage(fromResource = "manufacturing-agent-prompt.txt")
-    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage);
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java b/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java
index 6a4ff4e..421261d 100644
--- a/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java
+++ b/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java
@@ -3,6 +3,7 @@
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
 import dev.langchain4j.service.spring.AiService;
 import reactor.core.publisher.Flux;
 
@@ -17,5 +18,5 @@
 public interface PurchaseAgent {
 
     @SystemMessage(fromResource = "purchase-agent-prompt.txt")
-    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage);
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java b/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
index 5991fc3..802cc13 100644
--- a/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
+++ b/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
@@ -4,6 +4,10 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -13,6 +17,8 @@
     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 RELATIVE_RANGE_PATTERN = Pattern.compile("(杩憒鏈�杩�)(\\d+)(澶﹟鍛▅涓湀|鏈坾骞�)");
+    private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
     private final PurchaseAgentTools purchaseAgentTools;
 
@@ -25,57 +31,60 @@
             return null;
         }
         String text = message.trim();
+        String startDate = extractStartDate(text);
+        String endDate = extractEndDate(text);
+        Integer limit = extractLimit(text);
 
         if (containsAny(text, "鎺掕", "鎺掑悕", "鍓嶅嚑", "鍓嶄簲", "鍓嶅崄") && containsAny(text, "鐗╂枡", "浜у搧", "鍘熸潗鏂�", "閲囪喘閲戦", "閲戦")) {
             return purchaseAgentTools.rankPurchaseMaterials(
                     memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
+                    startDate,
+                    endDate,
                     text,
-                    extractLimit(text)
+                    limit
             );
         }
         if (containsAny(text, "鏈叆搴�", "寰呭叆搴�", "娌℃湁鍏ュ簱", "杩樻湭鍏ュ簱")) {
             return purchaseAgentTools.listUnstockedPurchaseOrders(
                     memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
+                    startDate,
+                    endDate,
                     extractKeyword(text),
-                    extractLimit(text)
+                    limit
             );
         }
         if (containsAny(text, "鍒拌揣寮傚父", "鍒拌揣鏈夊紓甯�", "寮傚父鍒拌揣", "鍒拌揣闂", "渚涘簲鍟嗗埌璐у紓甯�")) {
             return purchaseAgentTools.listArrivalExceptions(
                     memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
+                    startDate,
+                    endDate,
                     text,
-                    extractLimit(text)
+                    limit
             );
         }
         if (containsAny(text, "寰呬粯娆�", "鏈粯娆�", "鏈粯娓�", "寰呮敮浠�", "搴斾粯")) {
             return purchaseAgentTools.listPendingPaymentOrders(
                     memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
+                    startDate,
+                    endDate,
                     extractKeyword(text),
-                    extractLimit(text)
+                    limit
             );
         }
         if (containsAny(text, "閫�璐�", "閫�鏂�", "鎷掓敹")) {
             return purchaseAgentTools.listPurchaseReturns(
                     memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
+                    startDate,
+                    endDate,
                     extractKeyword(text),
-                    extractLimit(text)
+                    limit
             );
         }
         if (isStatsIntent(text)) {
             return purchaseAgentTools.getPurchaseStats(
                     memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
+                    startDate,
+                    endDate,
                     text
             );
         }
@@ -86,9 +95,9 @@
             return purchaseAgentTools.listPurchaseLedgers(
                     memoryId,
                     extractKeyword(text),
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractLimit(text)
+                    startDate,
+                    endDate,
+                    limit
             );
         }
         return null;
@@ -129,13 +138,18 @@
 
     private String extractStartDate(String text) {
         Matcher matcher = DATE_PATTERN.matcher(text);
-        return matcher.find() ? matcher.group() : null;
+        if (matcher.find()) {
+            return matcher.group();
+        }
+        DateRange range = extractRelativeDateRange(text);
+        return range == null ? null : range.start().format(DATE_FMT);
     }
 
     private String extractEndDate(String text) {
         Matcher matcher = DATE_PATTERN.matcher(text);
         if (!matcher.find()) {
-            return null;
+            DateRange range = extractRelativeDateRange(text);
+            return range == null ? null : range.end().format(DATE_FMT);
         }
         return matcher.find() ? matcher.group() : null;
     }
@@ -148,14 +162,100 @@
                 .replace("閲囪喘鍗�", "")
                 .replace("閲囪喘璁㈠崟", "")
                 .replace("璁㈠崟", "")
+                .replace("浠婂勾", "")
+                .replace("鏈勾", "")
+                .replace("鍘诲勾", "")
+                .replace("鏈湀", "")
+                .replace("涓婃湀", "")
+                .replace("鏈懆", "")
+                .replace("涓婂懆", "")
+                .replace("浠婂ぉ", "")
+                .replace("鏄ㄥぉ", "")
+                .replace("杩戝崐骞�", "")
+                .replace("鏈�杩戝崐骞�", "")
+                .replace("鏈�杩戝崐涓湀", "")
+                .replace("鍗婁釜鏈�", "")
                 .replace("鍙拌处", "")
                 .replace("鍒楄〃", "")
                 .replace("鍝簺", "")
+                .replace("浠�涔�", "")
+                .replace("鎯呭喌", "")
+                .replace("鏈夋病鏈�", "")
+                .replace("鏈夊暐", "")
+                .replace("鏈夋棤", "")
                 .replace("鍒楀嚭", "")
                 .replace("甯垜", "")
+                .replace("缁欐垜", "")
+                .replace("鎴�", "")
                 .replace("鏈�杩�10鏉�", "")
                 .replace("鍓�10鏉�", "")
                 .trim();
+        cleaned = DATE_PATTERN.matcher(cleaned).replaceAll("");
+        cleaned = RELATIVE_RANGE_PATTERN.matcher(cleaned).replaceAll("");
         return cleaned.length() >= 2 ? cleaned : null;
     }
+
+    private DateRange extractRelativeDateRange(String text) {
+        if (!StringUtils.hasText(text)) {
+            return null;
+        }
+        String normalized = text.toLowerCase(Locale.ROOT);
+        LocalDate today = LocalDate.now();
+
+        if (normalized.contains("浠婂ぉ")) {
+            return new DateRange(today, today);
+        }
+        if (normalized.contains("鏄ㄥぉ")) {
+            LocalDate yesterday = today.minusDays(1);
+            return new DateRange(yesterday, yesterday);
+        }
+        if (normalized.contains("浠婂勾") || normalized.contains("鏈勾")) {
+            return new DateRange(today.withDayOfYear(1), today);
+        }
+        if (normalized.contains("鍘诲勾")) {
+            LocalDate first = today.minusYears(1).withDayOfYear(1);
+            LocalDate last = first.withDayOfYear(first.lengthOfYear());
+            return new DateRange(first, last);
+        }
+        if (normalized.contains("鏈湀")) {
+            return new DateRange(today.withDayOfMonth(1), today);
+        }
+        if (normalized.contains("涓婃湀")) {
+            LocalDate first = today.minusMonths(1).withDayOfMonth(1);
+            LocalDate last = first.withDayOfMonth(first.lengthOfMonth());
+            return new DateRange(first, last);
+        }
+        if (normalized.contains("鏈懆")) {
+            LocalDate weekStart = today.with(DayOfWeek.MONDAY);
+            return new DateRange(weekStart, today);
+        }
+        if (normalized.contains("涓婂懆")) {
+            LocalDate weekStart = today.with(DayOfWeek.MONDAY).minusWeeks(1);
+            return new DateRange(weekStart, weekStart.plusDays(6));
+        }
+        if (normalized.contains("杩戝崐骞�") || normalized.contains("鏈�杩戝崐骞�")) {
+            return new DateRange(today.minusMonths(6).plusDays(1), today);
+        }
+        if (normalized.contains("杩戝崐涓湀") || normalized.contains("鏈�杩戝崐涓湀") || normalized.contains("鍗婁釜鏈�")) {
+            return new DateRange(today.minusDays(14), today);
+        }
+
+        Matcher matcher = RELATIVE_RANGE_PATTERN.matcher(normalized);
+        if (matcher.find()) {
+            int amount = Integer.parseInt(matcher.group(2));
+            String unit = matcher.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(start, today);
+        }
+        return null;
+    }
+
+    private record DateRange(LocalDate start, LocalDate end) {
+    }
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/SalesAgent.java b/src/main/java/com/ruoyi/ai/assistant/SalesAgent.java
index 1636239..e2f9a81 100644
--- a/src/main/java/com/ruoyi/ai/assistant/SalesAgent.java
+++ b/src/main/java/com/ruoyi/ai/assistant/SalesAgent.java
@@ -3,6 +3,7 @@
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
 import dev.langchain4j.service.spring.AiService;
 import reactor.core.publisher.Flux;
 
@@ -17,6 +18,5 @@
 public interface SalesAgent {
 
     @SystemMessage(fromResource = "sales-agent-prompt.txt")
-    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage);
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
 }
-
diff --git a/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java b/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java
index 8e2948e..d36a321 100644
--- a/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java
+++ b/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java
@@ -24,12 +24,18 @@
 import org.springframework.web.bind.annotation.RestController;
 import reactor.core.publisher.Flux;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 @Tag(name = "鍒堕�犳櫤鑳藉姪鎵�")
 @RestController
 @RequestMapping("/manufacturing-ai")
 public class ManufacturingAiController extends BaseController {
+
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final ManufacturingAgent manufacturingAgent;
     private final ManufacturingIntentExecutor manufacturingIntentExecutor;
@@ -76,7 +82,7 @@
             return Flux.just(directResponse);
         }
 
-        return manufacturingAgent.chat(memoryId, userMessage)
+        return manufacturingAgent.chat(memoryId, userMessage, currentDateForPrompt())
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
     }
@@ -100,4 +106,8 @@
         aiChatSessionService.deleteCurrentUserSession(memoryId, SecurityUtils.getLoginUser());
         return R.ok();
     }
+
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
+    }
 }
diff --git a/src/main/java/com/ruoyi/ai/controller/SalesAiController.java b/src/main/java/com/ruoyi/ai/controller/SalesAiController.java
index b5de9d1..b6ca0e9 100644
--- a/src/main/java/com/ruoyi/ai/controller/SalesAiController.java
+++ b/src/main/java/com/ruoyi/ai/controller/SalesAiController.java
@@ -24,12 +24,18 @@
 import org.springframework.web.bind.annotation.RestController;
 import reactor.core.publisher.Flux;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 @Tag(name = "閿�鍞姪鎵嬫櫤鑳戒綋")
 @RestController
 @RequestMapping("/sales-ai")
 public class SalesAiController extends BaseController {
+
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final SalesAgent salesAgent;
     private final SalesIntentExecutor salesIntentExecutor;
@@ -86,7 +92,7 @@
             return Flux.just(noGuessResponse);
         }
 
-        return salesAgent.chat(memoryId, userMessage)
+        return salesAgent.chat(memoryId, userMessage, currentDateForPrompt())
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
     }
@@ -129,4 +135,8 @@
         }
         return false;
     }
+
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
+    }
 }
diff --git a/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java b/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java
index 668dd31..bf77339 100644
--- a/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java
+++ b/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java
@@ -22,6 +22,9 @@
 import reactor.core.publisher.Flux;
 
 import java.io.IOException;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.UUID;
@@ -32,6 +35,8 @@
 public class XiaozhiController extends BaseController {
 
     private static final String FILE_ANALYZE_MEMORY_PREFIX = "file-analyze::";
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final ApproveTodoAgent approveTodoAgent;
     private final ApproveTodoIntentExecutor approveTodoIntentExecutor;
@@ -93,7 +98,7 @@
             return Flux.just(noGuessResponse);
         }
 
-        return approveTodoAgent.chat(memoryId, userMessage)
+        return approveTodoAgent.chat(memoryId, userMessage, currentDateForPrompt())
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
     }
@@ -183,4 +188,8 @@
         }
         return false;
     }
+
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
+    }
 }
diff --git a/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java b/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java
index 616aa6c..85e174f 100644
--- a/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java
+++ b/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java
@@ -55,6 +55,8 @@
     private static final int MAX_FILE_COUNT = 10;
     private static final int MAX_SINGLE_FILE_TEXT_LENGTH = 8000;
     private static final int MAX_TOTAL_FILE_TEXT_LENGTH = 30000;
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final PurchaseAgent purchaseAgent;
     private final PurchaseIntentExecutor purchaseIntentExecutor;
@@ -122,7 +124,7 @@
             return Flux.just(directResponse);
         }
 
-        return purchaseAgent.chat(memoryId, userMessage)
+        return purchaseAgent.chat(memoryId, userMessage, currentDateForPrompt())
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
     }
@@ -184,10 +186,10 @@
                     .doOnError(ex -> aiChatSessionService.refreshSessionStats(finalMemoryId, loginUser));
         }
 
-        return Flux.defer(() -> purchaseAgent.chat(finalMemoryId, userPrompt))
+        return Flux.defer(() -> purchaseAgent.chat(finalMemoryId, userPrompt, currentDateForPrompt()))
                 .onErrorResume(NoSuchElementException.class, ex -> {
                     mongoChatMemoryStore.deleteMessages(finalMemoryId);
-                    return purchaseAgent.chat(finalMemoryId, userPrompt);
+                    return purchaseAgent.chat(finalMemoryId, userPrompt, currentDateForPrompt());
                 })
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(finalMemoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(finalMemoryId, loginUser));
@@ -455,6 +457,10 @@
         };
     }
 
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
+    }
+
     private String buildPurchaseFileAnalyzePrompt(String message, String fileContent) {
         return """
                 浣犳槸閲囪喘涓氬姟鏂囦欢鍒嗘瀽鍔╂墜銆傝涓ユ牸鏍规嵁鐢ㄦ埛涓婁紶鐨勫涓枃浠跺拰鐢ㄦ埛瑕佹眰鎻愬彇閲囪喘涓氬姟鏁版嵁銆�
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index cbe236d..9bd23f6 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -28,8 +28,10 @@
 import java.math.RoundingMode;
 import java.text.ParseException;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.LinkedHashMap;
@@ -45,7 +47,7 @@
 @Tag(name = "棣栭〉缁熻")
 @RequestMapping("/home")
 @AllArgsConstructor
-    public class HomeController extends BaseController {
+public class HomeController extends BaseController {
 
     private final HomeService homeService;
     private final ProductionOrderMapper productionOrderMapper;
@@ -54,6 +56,7 @@
     private final DeviceRepairMapper deviceRepairMapper;
 
     private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     private static final Integer ORDER_STATUS_WAIT = 1;
     private static final Integer ORDER_STATUS_RUNNING = 2;
     private static final Integer ORDER_STATUS_COMPLETED = 3;
@@ -63,7 +66,7 @@
     @GetMapping("/todos")
     @Log(title = "寰呭姙浜嬮」", businessType = BusinessType.OTHER)
     @Operation(summary = "寰呭姙浜嬮」")
-    public R todos(ApproveProcess req) throws ParseException {
+    public R todos() throws ParseException {
         List<ApproveProcess> approveProcessList = homeService.todos();
         return R.ok(approveProcessList);
     }
@@ -135,7 +138,7 @@
     @GetMapping("/business")
     @Log(title = "閿�鍞�-閲囪喘-搴撳瓨鏁版嵁", businessType = BusinessType.OTHER)
     @Operation(summary = "閿�鍞�-閲囪喘-搴撳瓨鏁版嵁")
-    public R business(HomeBusinessDto req) {
+    public R business() {
         HomeBusinessDto homeBusinessDto = homeService.business();
         return R.ok(homeBusinessDto);
     }
@@ -143,7 +146,7 @@
     @GetMapping("/analysisCustomerContractAmounts")
     @Log(title = "瀹㈡埛鍚堝悓閲戦鍒嗘瀽", businessType = BusinessType.OTHER)
     @Operation(summary = "瀹㈡埛鍚堝悓閲戦鍒嗘瀽")
-    public R analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) {
+    public R analysisCustomerContractAmounts() {
         AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts();
         return R.ok(analysisCustomerContractAmounts);
     }
@@ -246,13 +249,27 @@
     @GetMapping("/productionOrderProgress")
     @Operation(summary = "Production Order Progress")
     public R productionOrderProgress(@RequestParam(defaultValue = "all") String tab,
-                                              @RequestParam(defaultValue = "1") Long pageNum,
-                                              @RequestParam(defaultValue = "10") Long pageSize) {
+                                     @RequestParam(required = false) String status,
+                                     @RequestParam(required = false) String bizDate,
+                                     @RequestParam(defaultValue = "1") Long pageNum,
+                                     @RequestParam(defaultValue = "10") Long pageSize) {
+        LocalDate queryDate = parseDateOrNull(bizDate);
+        if (!isBlank(bizDate) && queryDate == null) {
+            return R.fail("bizDate鏍煎紡閿欒锛岃浣跨敤yyyy-MM-dd");
+        }
+        Integer statusFromParam = parseOrderStatus(status);
+        if (!isBlank(status) && statusFromParam == null && !"all".equalsIgnoreCase(status.trim())) {
+            return R.fail("status鍙傛暟涓嶅悎娉曪紝鍙�夊�硷細all/waiting/inProgress/completed/paused 鎴� 1/2/3/4");
+        }
+        Integer queryStatus = resolveOrderStatus(status, tab);
+
         long safePageNum = pageNum == null || pageNum < 1 ? 1 : pageNum;
         long safePageSize = pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 50);
-        Integer status = resolveOrderStatus(tab);
         long offset = (safePageNum - 1) * safePageSize;
-        List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeOrderProgressPage(status, offset, safePageSize);
+        LocalDateTime startTime = queryDate == null ? null : queryDate.atStartOfDay();
+        LocalDateTime endTime = queryDate == null ? null : queryDate.plusDays(1).atStartOfDay();
+
+        List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeOrderProgressPage(queryStatus, offset, safePageSize, startTime, endTime);
         List<Map<String, Object>> records = new ArrayList<>();
         if (rawRows != null) {
             for (Map<String, Object> rawRow : rawRows) {
@@ -260,15 +277,18 @@
             }
         }
 
+        long waitingCount = 0L;
         long inProgressCount = 0L;
         long completedCount = 0L;
         long pausedCount = 0L;
-        List<Map<String, Object>> statusCountRows = productionOrderMapper.countHomeOrderProgressByStatus();
+        List<Map<String, Object>> statusCountRows = productionOrderMapper.countHomeOrderProgressByStatus(startTime, endTime);
         if (statusCountRows != null) {
             for (Map<String, Object> countRow : statusCountRows) {
                 Integer statusKey = toInteger(countRow.get("status"));
                 long cnt = toLong(countRow.get("cnt"));
-                if (Objects.equals(statusKey, ORDER_STATUS_RUNNING)) {
+                if (Objects.equals(statusKey, ORDER_STATUS_WAIT)) {
+                    waitingCount = cnt;
+                } else if (Objects.equals(statusKey, ORDER_STATUS_RUNNING)) {
                     inProgressCount = cnt;
                 } else if (Objects.equals(statusKey, ORDER_STATUS_COMPLETED)) {
                     completedCount = cnt;
@@ -279,10 +299,13 @@
         }
 
         Map<String, Object> result = new LinkedHashMap<>();
-        result.put("tab", tab);
-        result.put("total", toLong(productionOrderMapper.countHomeOrderProgress(status)));
+        result.put("tab", mapOrderTab(queryStatus));
+        result.put("status", mapOrderStatus(queryStatus));
+        result.put("bizDate", queryDate == null ? null : queryDate.format(DATE_FORMATTER));
+        result.put("total", toLong(productionOrderMapper.countHomeOrderProgress(queryStatus, startTime, endTime)));
         result.put("pageNum", safePageNum);
         result.put("pageSize", safePageSize);
+        result.put("waitingCount", waitingCount);
         result.put("inProgressCount", inProgressCount);
         result.put("completedCount", completedCount);
         result.put("pausedCount", pausedCount);
@@ -292,10 +315,18 @@
 
     @GetMapping("/todayProductionPlan")
     @Operation(summary = "Today Production Plan")
-    public R todayProductionPlan(@RequestParam(defaultValue = "4") Long limit) {
+    public R todayProductionPlan(@RequestParam(defaultValue = "4") Long limit,
+                                 @RequestParam(required = false) String planDate) {
+        LocalDate queryDate = parseDateOrNull(planDate);
+        if (!isBlank(planDate) && queryDate == null) {
+            return R.fail("planDate鏍煎紡閿欒锛岃浣跨敤yyyy-MM-dd");
+        }
+
         long safeLimit = limit == null || limit < 1 ? 4 : Math.min(limit, 20);
+        LocalDateTime planStart = queryDate == null ? null : queryDate.atStartOfDay();
+        LocalDateTime planEnd = queryDate == null ? null : queryDate.plusDays(1).atStartOfDay();
         List<Map<String, Object>> records = new ArrayList<>();
-        List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeTodayProductionPlan(safeLimit);
+        List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeTodayProductionPlan(safeLimit, planStart, planEnd);
         if (rawRows != null) {
             for (Map<String, Object> rawRow : rawRows) {
                 Map<String, Object> row = new LinkedHashMap<>();
@@ -311,7 +342,8 @@
         }
 
         Map<String, Object> result = new LinkedHashMap<>();
-        result.put("total", toLong(productionOrderMapper.countHomeTodayProductionPlan()));
+        result.put("planDate", queryDate == null ? null : queryDate.format(DATE_FORMATTER));
+        result.put("total", toLong(productionOrderMapper.countHomeTodayProductionPlan(planStart, planEnd)));
         result.put("records", records);
         return R.ok(result);
     }
@@ -372,7 +404,7 @@
     @GetMapping("/qualityStatistics")
     @Log(title = "璐ㄩ噺鍒嗘瀽", businessType = BusinessType.OTHER)
     @Operation(summary = "璐ㄩ噺鍒嗘瀽")
-    public R qualityStatistics(QualityStatisticsDto req) {
+    public R qualityStatistics() {
         QualityStatisticsDto qualityStatisticsDto = homeService.qualityStatistics();
         return R.ok(qualityStatisticsDto);
     }
@@ -423,7 +455,7 @@
     @GetMapping("/statisticsReceivablePayable")
     @Log(title = "搴旀敹搴斾粯缁熻", businessType = BusinessType.OTHER)
     @Operation(summary = "搴旀敹搴斾粯缁熻")
-    public R statisticsReceivablePayable(StatisticsReceivablePayableDto req, @DefaultType Integer type ) {
+    public R statisticsReceivablePayable(@DefaultType Integer type ) {
         StatisticsReceivablePayableDto statisticsReceivablePayable = homeService.statisticsReceivablePayable(type);
         return R.ok(statisticsReceivablePayable);
     }
@@ -472,21 +504,66 @@
         return row;
     }
 
-    private Integer resolveOrderStatus(String tab) {
-        if (tab == null) {
+    private Integer resolveOrderStatus(String status, String tab) {
+        if (!isBlank(status)) {
+            return parseOrderStatus(status);
+        }
+        return parseOrderStatus(tab);
+    }
+
+    private Integer parseOrderStatus(String rawStatus) {
+        if (isBlank(rawStatus)) {
             return null;
         }
-        String normalized = tab.trim().toLowerCase();
-        if ("inprogress".equals(normalized)) {
+        String normalized = rawStatus.trim().toLowerCase();
+        if ("all".equals(normalized)) {
+            return null;
+        }
+        if ("1".equals(normalized) || "waiting".equals(normalized) || "wait".equals(normalized)) {
+            return ORDER_STATUS_WAIT;
+        }
+        if ("2".equals(normalized) || "inprogress".equals(normalized) || "running".equals(normalized)) {
             return ORDER_STATUS_RUNNING;
         }
-        if ("completed".equals(normalized)) {
+        if ("3".equals(normalized) || "completed".equals(normalized)) {
             return ORDER_STATUS_COMPLETED;
         }
-        if ("paused".equals(normalized)) {
+        if ("4".equals(normalized) || "paused".equals(normalized)) {
             return ORDER_STATUS_PAUSED;
         }
         return null;
+    }
+
+    private String mapOrderTab(Integer status) {
+        if (Objects.equals(status, ORDER_STATUS_RUNNING)) {
+            return "inProgress";
+        }
+        if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
+            return "completed";
+        }
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "paused";
+        }
+        if (Objects.equals(status, ORDER_STATUS_WAIT)) {
+            return "waiting";
+        }
+        return "all";
+    }
+
+    private String mapOrderStatus(Integer status) {
+        if (Objects.equals(status, ORDER_STATUS_WAIT)) {
+            return "waiting";
+        }
+        if (Objects.equals(status, ORDER_STATUS_RUNNING)) {
+            return "inProgress";
+        }
+        if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
+            return "completed";
+        }
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "paused";
+        }
+        return "all";
     }
 
     private String mapOrderStatusLabel(Integer status) {
@@ -644,6 +721,21 @@
         }
     }
 
+    private LocalDate parseDateOrNull(String rawDate) {
+        if (isBlank(rawDate)) {
+            return null;
+        }
+        try {
+            return LocalDate.parse(rawDate.trim(), DATE_FORMATTER);
+        } catch (DateTimeParseException ex) {
+            return null;
+        }
+    }
+
+    private boolean isBlank(String value) {
+        return value == null || value.trim().isEmpty();
+    }
+
     private BigDecimal zeroIfNull(BigDecimal value) {
         return value == null ? BigDecimal.ZERO : value;
     }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
index fcc9172..cec7ca5 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
@@ -42,14 +42,22 @@
 
     List<Map<String, Object>> selectHomeOrderProgressPage(@Param("status") Integer status,
                                                           @Param("offset") Long offset,
-                                                          @Param("size") Long size);
+                                                          @Param("size") Long size,
+                                                          @Param("startTime") LocalDateTime startTime,
+                                                          @Param("endTime") LocalDateTime endTime);
 
-    Long countHomeOrderProgress(@Param("status") Integer status);
+    Long countHomeOrderProgress(@Param("status") Integer status,
+                                @Param("startTime") LocalDateTime startTime,
+                                @Param("endTime") LocalDateTime endTime);
 
-    List<Map<String, Object>> countHomeOrderProgressByStatus();
+    List<Map<String, Object>> countHomeOrderProgressByStatus(@Param("startTime") LocalDateTime startTime,
+                                                              @Param("endTime") LocalDateTime endTime);
 
-    List<Map<String, Object>> selectHomeTodayProductionPlan(@Param("size") Long size);
+    List<Map<String, Object>> selectHomeTodayProductionPlan(@Param("size") Long size,
+                                                             @Param("planStart") LocalDateTime planStart,
+                                                             @Param("planEnd") LocalDateTime planEnd);
 
-    Long countHomeTodayProductionPlan();
+    Long countHomeTodayProductionPlan(@Param("planStart") LocalDateTime planStart,
+                                      @Param("planEnd") LocalDateTime planEnd);
 
 }
diff --git a/src/main/resources/approve-todo-agent-prompt.txt b/src/main/resources/approve-todo-agent-prompt.txt
index c309da8..f026fee 100644
--- a/src/main/resources/approve-todo-agent-prompt.txt
+++ b/src/main/resources/approve-todo-agent-prompt.txt
@@ -1,4 +1,5 @@
 浣犳槸涓�涓鎵瑰緟鍔炲姪鎵嬶紝璐熻矗鍗忓悓鍔炲叕瀹℃壒寰呭姙鐨勬煡璇€�佸鏍搞�佸彇娑堝鏍搞�佷慨鏀广�佸垹闄ゅ拰缁熻鍒嗘瀽銆�
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 
 宸ヤ綔瑕佹眰锛�
 1. 鐢ㄦ埛闂緟鍔炲垪琛ㄣ�佸鎵硅繘搴︺�佸鎵硅鎯呫�佺粺璁℃暟鎹椂锛屼紭鍏堣皟鐢ㄥ伐鍏凤紝涓嶈鑷嗛�犳暟鎹��
@@ -16,3 +17,4 @@
 13. 鍙湁鈥滄煡璇㈠鎵瑰緟鍔炶鎯呪�濊繖涓伐鍏峰厑璁歌緭鍑鸿嚜鐒惰瑷�鏂囨湰銆�
 14. 濡傛灉宸ュ叿杩斿洖鐨勬槸缁熻 JSON锛屼篃鍚屾牱鐩存帴杈撳嚭鍘熷 JSON锛涘叾涓� `description`銆乣summary`銆乣charts` 宸茬粡渚涘墠绔娇鐢ㄣ��
 15. 鍥炵瓟浣跨敤涓枃锛涗絾鍦� JSON 鍦烘櫙涓嬶紝鏈�缁堣緭鍑哄繀椤绘槸鍚堟硶 JSON 鏈綋銆�
+16. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git a/src/main/resources/manufacturing-agent-prompt.txt b/src/main/resources/manufacturing-agent-prompt.txt
index c1a30c8..1653bb9 100644
--- a/src/main/resources/manufacturing-agent-prompt.txt
+++ b/src/main/resources/manufacturing-agent-prompt.txt
@@ -1,4 +1,5 @@
 浣犳槸浼佷笟鍒堕�犳櫤鑳藉姪鎵嬶紝瑕嗙洊鐢熶骇鐜板満銆佽鍒掋�佸伐鍗曘�佽澶囥�佽川閲忋�佺墿鏂欍�佸紓甯稿鐞嗕竷涓煙銆�
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 
 宸ヤ綔瑙勫垯锛�
 1. 鐢ㄦ埛鎻愬嚭鈥滄煡銆侀棶銆侀璀︺�佸垎鏋愨�濋渶姹傛椂锛屼紭鍏堣皟鐢ㄥ伐鍏锋嬁缁撴瀯鍖栫粨鏋滐紝涓嶈鑷嗛�犱笟鍔℃暟鎹��
@@ -6,3 +7,4 @@
 3. 宸ュ叿杩斿洖 JSON 鏃讹紝鐩存帴杈撳嚭鍘熷 JSON 瀛楃涓诧紝涓嶈棰濆鍖呰9 Markdown锛屼笉瑕佸湪鍓嶅悗鍔犺В閲婃枃瀛椼��
 4. 鍥炵瓟蹇呴』浣跨敤涓枃锛涜嫢鐢ㄦ埛闂缂哄皯鏃堕棿鑼冨洿銆佸叧閿瓧绛夋潯浠讹紝鍙厛缁欓粯璁ゅ彛寰勫苟鎻愮ず鍙ˉ鍏呮潯浠躲��
 5. 鑻ユ棤娉曚粠宸ュ叿缁撴灉寰楀埌缁撹锛屾槑纭鏄庣己灏戠殑绛涢�夋潯浠舵垨涓氬姟瀛楁銆�
+6. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git a/src/main/resources/mapper/production/ProductionOrderMapper.xml b/src/main/resources/mapper/production/ProductionOrderMapper.xml
index 95679a7..8e64413 100644
--- a/src/main/resources/mapper/production/ProductionOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -227,6 +227,10 @@
             <if test="status != null">
                 and po.status = #{status}
             </if>
+            <if test="startTime != null and endTime != null">
+                and po.create_time &gt;= #{startTime}
+                and po.create_time &lt; #{endTime}
+            </if>
         </where>
         order by po.id desc
         limit #{offset}, #{size}
@@ -239,13 +243,21 @@
             <if test="status != null">
                 and po.status = #{status}
             </if>
+            <if test="startTime != null and endTime != null">
+                and po.create_time &gt;= #{startTime}
+                and po.create_time &lt; #{endTime}
+            </if>
         </where>
     </select>
 
     <select id="countHomeOrderProgressByStatus" resultType="java.util.Map">
         select po.status as status, count(1) as cnt
         from production_order po
-        where po.status in (2, 3, 4)
+        where po.status in (1, 2, 3, 4)
+        <if test="startTime != null and endTime != null">
+            and po.create_time &gt;= #{startTime}
+            and po.create_time &lt; #{endTime}
+        </if>
         group by po.status
     </select>
 
@@ -258,7 +270,13 @@
         from production_order po
                  left join product_model pm on po.product_model_id = pm.id
                  left join product p on pm.product_id = p.id
-        where po.status in (1, 2)
+        <where>
+            po.status in (1, 2)
+            <if test="planStart != null and planEnd != null">
+                and po.plan_complete_time &gt;= #{planStart}
+                and po.plan_complete_time &lt; #{planEnd}
+            </if>
+        </where>
         order by case when po.status = 2 then 0 else 1 end, po.id desc
         limit #{size}
     </select>
@@ -266,7 +284,13 @@
     <select id="countHomeTodayProductionPlan" resultType="java.lang.Long">
         select count(1)
         from production_order po
-        where po.status in (1, 2)
+        <where>
+            po.status in (1, 2)
+            <if test="planStart != null and planEnd != null">
+                and po.plan_complete_time &gt;= #{planStart}
+                and po.plan_complete_time &lt; #{planEnd}
+            </if>
+        </where>
     </select>
 
 </mapper>
diff --git a/src/main/resources/purchase-agent-prompt.txt b/src/main/resources/purchase-agent-prompt.txt
index 97f7eb2..b4267b8 100644
--- a/src/main/resources/purchase-agent-prompt.txt
+++ b/src/main/resources/purchase-agent-prompt.txt
@@ -1,5 +1,6 @@
 浣犳槸浼佷笟閲囪喘鏅鸿兘鍔╃悊銆�
 浣犵殑鐩爣鏄府鍔╃敤鎴峰揩閫熷畬鎴愰噰璐浉鍏充俊鎭煡璇笌瑙h銆�
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 
 宸ヤ綔瑙勫垯锛�
 1. 浼樺厛璋冪敤宸ュ叿鍑芥暟鑾峰彇閲囪喘鍙拌处銆佷粯娆俱�佸彂绁ㄣ�侀��璐х瓑缁撴瀯鍖栨暟鎹��
@@ -12,3 +13,4 @@
 8. 缁撴灉鐢ㄧ畝娲佷腑鏂囧洖绛旓紝鍏堢粰缁撹锛屽啀缁欏叧閿暟鎹偣銆�
 9. 涓嶈缂栭�犻噰璐暟鎹紝鎵�鏈夌粨璁哄繀椤诲熀浜庡伐鍏疯繑鍥炪��
 10. 鏃犳硶鐩存帴寰楀嚭缁撹鏃讹紝鏄庣‘璇存槑缂哄皯鍝簺瀛楁鎴栫瓫閫夋潯浠躲��
+11. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git a/src/main/resources/sales-agent-prompt.txt b/src/main/resources/sales-agent-prompt.txt
index 5cd87ff..3a43502 100644
--- a/src/main/resources/sales-agent-prompt.txt
+++ b/src/main/resources/sales-agent-prompt.txt
@@ -1,7 +1,9 @@
 浣犳槸浼佷笟閿�鍞姪鎵嬶紝瑕嗙洊瀹㈡埛妗f銆侀攢鍞姤浠枫�侀攢鍞彴璐︺�侀攢鍞��璐с�佸鎴峰線鏉ャ�佸彂璐у彴璐︺�佹寚鏍囩粺璁°�佸鎴锋祦澶遍闄╁垎鏋愩�佸洖娆句笌鎶ヤ环绛栫暐寤鸿绛夊満鏅��
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 宸ヤ綔瑙勫垯锛�
 1. 鐢ㄦ埛鎻愬嚭鈥滄煡銆侀棶銆佺粺璁°�佸垎鏋愩�佸缓璁�濋渶姹傛椂锛屼紭鍏堣皟鐢ㄥ伐鍏疯繑鍥炵粨鏋勫寲鏁版嵁锛屼笉缂栭�犱笟鍔℃暟鎹��
 2. 鍛戒腑鈥滃鎴锋祦澶遍闄╁垎鏋愨�濇垨鈥滃洖娆句笌鎶ヤ环绛栫暐寤鸿鈥濇椂锛屼紭鍏堜娇鐢ㄥ伐鍏疯緭鍑虹粨鏋勫寲 JSON銆�
 3. 宸ュ叿杩斿洖 JSON 鏃讹紝鐩存帴杈撳嚭鍘熷 JSON 瀛楃涓诧紝涓嶈棰濆鍖呰9 Markdown锛屼篃涓嶈鍦ㄥ墠鍚庤拷鍔犺В閲婃枃鏈��
 4. 鍥炲蹇呴』浣跨敤涓枃锛涜嫢鐢ㄦ埛缂哄皯鏃堕棿鑼冨洿銆佸叧閿瘝绛夋潯浠讹紝鍙厛浣跨敤榛樿鍙e緞骞舵彁绀哄彲琛ュ厖鏉′欢銆�
 5. 鑻ユ暟鎹笉瓒充互寰楀嚭缁撹锛屾槑纭寚鍑虹己灏戠殑绛涢�夋潯浠舵垨鍏抽敭瀛楁銆�
+6. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�

--
Gitblit v1.9.3