From ffbf67765d2ae447d62333eed85100a15685d781 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 19 三月 2026 12:27:59 +0800
Subject: [PATCH] #AI.内置工具治理

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsStockTools.java |   34 ++++++++++++++++++++--------------
 1 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsStockTools.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsStockTools.java
index 78994a2..7fcce30 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsStockTools.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsStockTools.java
@@ -27,23 +27,26 @@
     private final LocItemService locItemService;
     private final DeviceSiteService deviceSiteService;
 
-    @Tool(name = "rsf_query_available_inventory", description = "鏍规嵁鐗╂枡缂栫爜鎴栫墿鏂欏悕绉版煡璇㈠綋鍓嶅湪搴撲笖鍙敤浜庡嚭搴撶殑搴撳瓨鏄庣粏銆�")
+    @Tool(name = "rsf_query_available_inventory", description = "鍙鏌ヨ宸ュ叿銆傛牴鎹墿鏂欑紪鐮佹垨鐗╂枡鍚嶇О鏌ヨ褰撳墠鍦ㄥ簱涓斿彲鐢ㄤ簬鍑哄簱鐨勫簱瀛樻槑缁嗐��")
     public List<Map<String, Object>> queryAvailableInventory(
             @ToolParam(description = "鐗╂枡缂栫爜锛屼紭鍏堜娇鐢�") String matnr,
-            @ToolParam(description = "鐗╂枡鍚嶇О锛屽綋娌℃湁鐗╂枡缂栫爜鏃朵娇鐢�") String maktx) {
-        if (!StringUtils.hasText(matnr) && !StringUtils.hasText(maktx)) {
-            throw new CoolException("鐗╂枡缂栫爜鎴栫墿鏂欏悕绉拌嚦灏戦渶瑕佹彁渚涗竴涓�");
-        }
+            @ToolParam(description = "鐗╂枡鍚嶇О锛屽綋娌℃湁鐗╂枡缂栫爜鏃朵娇鐢�") String maktx,
+            @ToolParam(description = "杩斿洖鏉℃暟锛岄粯璁� 10锛屾渶澶� 50") Integer limit) {
+        String normalizedMatnr = BuiltinToolGovernanceSupport.sanitizeQueryText(matnr, "鐗╂枡缂栫爜", 64);
+        String normalizedMaktx = BuiltinToolGovernanceSupport.sanitizeQueryText(maktx, "鐗╂枡鍚嶇О", 100);
+        BuiltinToolGovernanceSupport.requireAnyFilter("鐗╂枡缂栫爜鎴栫墿鏂欏悕绉拌嚦灏戦渶瑕佹彁渚涗竴涓�", normalizedMatnr, normalizedMaktx);
+        int finalLimit = BuiltinToolGovernanceSupport.normalizeLimit(limit, 10, 50);
         LambdaQueryWrapper<LocItem> queryWrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.hasText(matnr)) {
-            queryWrapper.eq(LocItem::getMatnrCode, matnr);
+        if (StringUtils.hasText(normalizedMatnr)) {
+            queryWrapper.eq(LocItem::getMatnrCode, normalizedMatnr);
         } else {
-            queryWrapper.eq(LocItem::getMaktx, maktx);
+            queryWrapper.like(LocItem::getMaktx, normalizedMaktx);
         }
         queryWrapper.apply(
                 "EXISTS (SELECT 1 FROM man_loc ml WHERE ml.use_status = {0} AND ml.id = man_loc_item.loc_id)",
                 LocStsType.LOC_STS_TYPE_F.type
         );
+        queryWrapper.orderByDesc(LocItem::getId).last("LIMIT " + finalLimit);
         List<LocItem> locItems = locItemService.list(queryWrapper);
         List<Map<String, Object>> result = new ArrayList<>();
         for (LocItem locItem : locItems) {
@@ -69,14 +72,17 @@
         return result;
     }
 
-    @Tool(name = "rsf_query_station_list", description = "鏍规嵁浣滀笟绫诲瀷鍒楄〃鏌ヨ鍙敤绔欑偣锛岃繑鍥炵珯鐐圭紪鍙枫�佸悕绉般�佺洰鏍囦綅缃拰鐘舵�佺瓑淇℃伅銆�")
+    @Tool(name = "rsf_query_station_list", description = "鍙鏌ヨ宸ュ叿銆傛牴鎹綔涓氱被鍨嬪垪琛ㄦ煡璇㈠彲鐢ㄧ珯鐐癸紝杩斿洖绔欑偣缂栧彿銆佸悕绉般�佺洰鏍囦綅缃拰鐘舵�佺瓑淇℃伅銆�")
     public List<Map<String, Object>> queryStationList(
-            @ToolParam(required = true, description = "浣滀笟绫诲瀷鍒楄〃") List<String> types) {
-        if (types == null || types.isEmpty()) {
-            throw new CoolException("绔欑偣绫诲瀷鍒楄〃涓嶈兘涓虹┖");
-        }
+            @ToolParam(required = true, description = "浣滀笟绫诲瀷鍒楄〃") List<String> types,
+            @ToolParam(description = "杩斿洖鏉℃暟锛岄粯璁� 20锛屾渶澶� 50") Integer limit) {
+        List<String> normalizedTypes = BuiltinToolGovernanceSupport.sanitizeStringList(types, "绔欑偣绫诲瀷鍒楄〃", 10, 32);
+        int finalLimit = BuiltinToolGovernanceSupport.normalizeLimit(limit, 20, 50);
         List<DeviceSite> sites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>()
-                .in(DeviceSite::getType, types));
+                .in(DeviceSite::getType, normalizedTypes)
+                .orderByAsc(DeviceSite::getType)
+                .orderByAsc(DeviceSite::getSite)
+                .last("LIMIT " + finalLimit));
         List<Map<String, Object>> result = new ArrayList<>();
         for (DeviceSite site : sites) {
             Map<String, Object> item = new LinkedHashMap<>();

--
Gitblit v1.9.1