From 6477d7156272a6f1fe126c781958369bb10970c6 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期六, 21 三月 2026 11:15:50 +0800
Subject: [PATCH] #ai 思维链

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsTaskTools.java |  189 +++++++++++++++++++++++++++++++++++-----------
 1 files changed, 142 insertions(+), 47 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsTaskTools.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsTaskTools.java
index 249d4bd..93ebf7d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsTaskTools.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/tool/RsfWmsTaskTools.java
@@ -18,37 +18,103 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Component
 @RequiredArgsConstructor
 public class RsfWmsTaskTools {
 
+    private static final Pattern TASK_CODE_PATTERN = Pattern.compile("[A-Za-z]{1,8}\\d{6,}");
+    private static final Pattern TASK_CODE_DIGIT_PATTERN = Pattern.compile("\\d{8,}");
+
     private final TaskService taskService;
     private final TaskItemService taskItemService;
 
     /**
-     * 鏌ヨ浠诲姟鍒楄〃銆�
-     * 鏂规硶瑕佹眰鑷冲皯甯︿竴涓繃婊ゆ潯浠讹紝閬垮厤妯″瀷鎶婁换鍔¤〃褰撲綔鍙洿鎺ラ亶鍘嗙殑鏁版嵁婧愩��
+     * 缁熶竴浠诲姟鏌ヨ銆�
+     * 浼犵簿纭� taskCode 鏃惰繑鍥炰换鍔℃眹鎬诲拰鏄庣粏锛涘惁鍒欐寜鏉′欢杩斿洖浠诲姟鍒楄〃銆�
      */
-    @Tool(name = "rsf_query_task_list", description = "鍙鏌ヨ宸ュ叿銆傛寜浠诲姟鍙枫�佺姸鎬併�佷换鍔$被鍨嬨�佹簮绔欑偣銆佺洰鏍囩珯鐐圭瓑鏉′欢鏌ヨ浠诲姟鍒楄〃銆�")
-    public List<Map<String, Object>> queryTaskList(
-            @ToolParam(description = "浠诲姟鍙凤紝鍙ā绯婃煡璇�") String taskCode,
-            @ToolParam(description = "浠诲姟鐘舵�侊紝鍙��") Integer taskStatus,
-            @ToolParam(description = "浠诲姟绫诲瀷锛屽彲閫�") Integer taskType,
+    @Tool(name = "rsf_query_task", description = "鍙鏌ヨ宸ュ叿銆傛敮鎸佹寜浠诲姟鍙枫�佺姸鎬併�佺被鍨嬨�佹簮绔欑偣銆佺洰鏍囩珯鐐规煡璇换鍔★紱浼犵簿纭换鍔″彿鏃惰繑鍥炰换鍔℃槑缁嗭紝涓嶄紶杩囨护鏉′欢鏃惰繑鍥炴渶杩戜换鍔°��")
+    public Map<String, Object> queryTask(
+            @ToolParam(description = "浠诲姟鍙凤紝鍙ā绯婃煡璇紱鏀寔鐩存帴浼犲叆鑷劧璇█锛屽伐鍏蜂細鑷姩鎻愬彇浠诲姟鍙�") String taskCode,
+            @ToolParam(description = "浠诲姟鐘舵�侊紝鍙�夛紱绌哄瓧绗︿覆鎴� 0 瑙嗕负鏈紶") String taskStatus,
+            @ToolParam(description = "浠诲姟绫诲瀷锛屽彲閫夛紱绌哄瓧绗︿覆鎴� 0 瑙嗕负鏈紶") String taskType,
             @ToolParam(description = "婧愮珯鐐癸紝鍙��") String orgSite,
             @ToolParam(description = "鐩爣绔欑偣锛屽彲閫�") String targSite,
-            @ToolParam(description = "杩斿洖鏉℃暟锛岄粯璁� 10锛屾渶澶� 50") Integer limit) {
-        String normalizedTaskCode = BuiltinToolGovernanceSupport.sanitizeQueryText(taskCode, "浠诲姟鍙�", 64);
+            @ToolParam(description = "杩斿洖鏉℃暟锛岄粯璁� 10锛屾渶澶� 50锛涚┖瀛楃涓叉垨 0 瑙嗕负榛樿鍊�") String limit) {
+        String normalizedTaskCode = normalizeTaskCode(taskCode);
+        Integer normalizedTaskStatus = normalizeOptionalFilterNumber(taskStatus, "浠诲姟鐘舵��");
+        Integer normalizedTaskType = normalizeOptionalFilterNumber(taskType, "浠诲姟绫诲瀷");
         String normalizedOrgSite = BuiltinToolGovernanceSupport.sanitizeQueryText(orgSite, "婧愮珯鐐�", 64);
         String normalizedTargSite = BuiltinToolGovernanceSupport.sanitizeQueryText(targSite, "鐩爣绔欑偣", 64);
-        BuiltinToolGovernanceSupport.requireAnyFilter("浠诲姟鍒楄〃鏌ヨ鑷冲皯闇�瑕佹彁渚涗竴涓繃婊ゆ潯浠�",
-                normalizedTaskCode, normalizedOrgSite, normalizedTargSite,
-                taskStatus == null ? null : String.valueOf(taskStatus),
-                taskType == null ? null : String.valueOf(taskType));
+        int finalLimit = normalizeLimit(limit, 10, 50);
+
+        Task exactMatchedTask = findExactMatchedTask(normalizedTaskCode, normalizedTaskStatus, normalizedTaskType,
+                normalizedOrgSite, normalizedTargSite);
+        if (exactMatchedTask != null) {
+            Map<String, Object> response = new LinkedHashMap<>();
+            response.put("queryMode", "detail");
+            response.put("taskCount", 1);
+            response.put("limit", finalLimit);
+            response.put("resolvedTaskCode", exactMatchedTask.getTaskCode());
+            response.put("tasks", List.of(buildTaskDetail(exactMatchedTask)));
+            return response;
+        }
+
         LambdaQueryWrapper<Task> queryWrapper = new LambdaQueryWrapper<>();
-        int finalLimit = BuiltinToolGovernanceSupport.normalizeLimit(limit, 10, 50);
-        if (StringUtils.hasText(normalizedTaskCode)) {
-            queryWrapper.like(Task::getTaskCode, normalizedTaskCode);
+        applyCommonFilters(queryWrapper, normalizedTaskCode, normalizedTaskStatus, normalizedTaskType,
+                normalizedOrgSite, normalizedTargSite, true);
+        queryWrapper.orderByDesc(Task::getCreateTime).last("LIMIT " + finalLimit);
+        List<Task> tasks = taskService.list(queryWrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Task task : tasks) {
+            result.add(buildTaskSummary(task));
+        }
+        Map<String, Object> response = new LinkedHashMap<>();
+        response.put("queryMode", "list");
+        response.put("taskCount", result.size());
+        response.put("limit", finalLimit);
+        response.put("resolvedTaskCode", normalizedTaskCode);
+        response.put("tasks", result);
+        return response;
+    }
+
+    private Task findExactMatchedTask(String taskCode, Integer taskStatus, Integer taskType, String orgSite, String targSite) {
+        if (!StringUtils.hasText(taskCode)) {
+            return null;
+        }
+        Task exactTask = findUniqueTask(taskCode, taskStatus, taskType, orgSite, targSite, false);
+        if (exactTask != null) {
+            return exactTask;
+        }
+        String digitCandidate = extractDigitCandidate(taskCode);
+        if (!StringUtils.hasText(digitCandidate) || digitCandidate.equals(taskCode)) {
+            return null;
+        }
+        return findUniqueTask(digitCandidate, taskStatus, taskType, orgSite, targSite, true);
+    }
+
+    private Task findUniqueTask(String taskCode, Integer taskStatus, Integer taskType, String orgSite,
+                                String targSite, boolean fuzzyTaskCode) {
+        LambdaQueryWrapper<Task> queryWrapper = new LambdaQueryWrapper<>();
+        applyCommonFilters(queryWrapper, taskCode, taskStatus, taskType, orgSite, targSite, fuzzyTaskCode);
+        queryWrapper.orderByDesc(Task::getCreateTime).last("LIMIT 2");
+        List<Task> tasks = taskService.list(queryWrapper);
+        if (tasks.size() == 1) {
+            return tasks.get(0);
+        }
+        return null;
+    }
+
+    private void applyCommonFilters(LambdaQueryWrapper<Task> queryWrapper, String taskCode, Integer taskStatus,
+                                    Integer taskType, String orgSite, String targSite, boolean fuzzyTaskCode) {
+        if (StringUtils.hasText(taskCode)) {
+            if (fuzzyTaskCode) {
+                queryWrapper.like(Task::getTaskCode, taskCode);
+            } else {
+                queryWrapper.eq(Task::getTaskCode, taskCode);
+            }
         }
         if (taskStatus != null) {
             queryWrapper.eq(Task::getTaskStatus, taskStatus);
@@ -56,40 +122,68 @@
         if (taskType != null) {
             queryWrapper.eq(Task::getTaskType, taskType);
         }
-        if (StringUtils.hasText(normalizedOrgSite)) {
-            queryWrapper.eq(Task::getOrgSite, normalizedOrgSite);
+        if (StringUtils.hasText(orgSite)) {
+            queryWrapper.eq(Task::getOrgSite, orgSite);
         }
-        if (StringUtils.hasText(normalizedTargSite)) {
-            queryWrapper.eq(Task::getTargSite, normalizedTargSite);
+        if (StringUtils.hasText(targSite)) {
+            queryWrapper.eq(Task::getTargSite, targSite);
         }
-        queryWrapper.orderByDesc(Task::getCreateTime).last("LIMIT " + finalLimit);
-        List<Task> tasks = taskService.list(queryWrapper);
-        List<Map<String, Object>> result = new ArrayList<>();
-        for (Task task : tasks) {
-            result.add(buildTaskSummary(task));
-        }
-        return result;
     }
 
-    /**
-     * 鏌ヨ鍗曚釜浠诲姟璇︽儏銆�
-     * 涓庡垪琛ㄦ煡璇笉鍚岋紝杩欓噷鍏佽杩斿洖鏇翠赴瀵岀殑瀛楁锛屼絾浠嶇劧瑕佹眰璋冪敤鏂归�氳繃浠诲姟 ID 鎴栦换鍔″彿鍋氱簿纭畾浣嶃��
-     */
-    @Tool(name = "rsf_query_task_detail", description = "鍙鏌ヨ宸ュ叿銆傛煡璇换鍔″垪琛ㄦ湁姝e父杩斿洖鍊煎彲浠ユ牴鎹换鍔D鏌ヨ浠诲姟璇︽儏銆�")
-    public Map<String, Object> queryTaskDetail(
-            @ToolParam(description = "浠诲姟 ID") Long taskId
-            ) {
-
-        if (taskId == null) {
-            throw new CoolException("浠诲姟 ID 闇�瑕佹彁渚�");
+    private String normalizeTaskCode(String taskCode) {
+        String normalized = BuiltinToolGovernanceSupport.sanitizeQueryText(taskCode, "浠诲姟鍙�", 128);
+        if (!StringUtils.hasText(normalized)) {
+            return null;
         }
-        List<TaskItem> taskItems = new ArrayList<>();
-        taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, taskId));
-
-        if (taskItems.isEmpty()) {
-            throw new CoolException("鏈煡璇㈠埌浠诲姟");
+        Matcher taskCodeMatcher = TASK_CODE_PATTERN.matcher(normalized);
+        if (taskCodeMatcher.find()) {
+            return taskCodeMatcher.group().toUpperCase();
         }
-        return buildTaskItemDetail(taskItems);
+        Matcher digitMatcher = TASK_CODE_DIGIT_PATTERN.matcher(normalized);
+        if (digitMatcher.find()) {
+            return digitMatcher.group();
+        }
+        return normalized.replace("*", "").trim();
+    }
+
+    private String extractDigitCandidate(String taskCode) {
+        if (!StringUtils.hasText(taskCode)) {
+            return null;
+        }
+        Matcher digitMatcher = TASK_CODE_DIGIT_PATTERN.matcher(taskCode);
+        if (digitMatcher.find()) {
+            return digitMatcher.group();
+        }
+        return null;
+    }
+
+    private Integer normalizeOptionalFilterNumber(String value, String fieldLabel) {
+        String normalized = BuiltinToolGovernanceSupport.sanitizeQueryText(value, fieldLabel, 32);
+        if (!StringUtils.hasText(normalized)) {
+            return null;
+        }
+        try {
+            int parsed = Integer.parseInt(normalized);
+            return parsed <= 0 ? null : parsed;
+        } catch (NumberFormatException e) {
+            throw new CoolException(fieldLabel + "蹇呴』鏄暣鏁�");
+        }
+    }
+
+    private int normalizeLimit(String value, int defaultValue, int maxValue) {
+        String normalized = BuiltinToolGovernanceSupport.sanitizeQueryText(value, "limit", 16);
+        if (!StringUtils.hasText(normalized)) {
+            return defaultValue;
+        }
+        try {
+            int parsed = Integer.parseInt(normalized);
+            if (parsed <= 0) {
+                return defaultValue;
+            }
+            return BuiltinToolGovernanceSupport.normalizeLimit(parsed, defaultValue, maxValue);
+        } catch (NumberFormatException e) {
+            throw new CoolException("limit 蹇呴』鏄暣鏁�");
+        }
     }
 
     private Map<String, Object> buildTaskSummary(Task task) {
@@ -112,9 +206,10 @@
         return item;
     }
 
-    private Map<String, Object> buildTaskItemDetail(List<TaskItem> taskItems) {
-        Map<String, Object> result = new LinkedHashMap<>();
-        result.put("taskId", taskItems.get(0).getTaskId());
+    private Map<String, Object> buildTaskDetail(Task task) {
+        Map<String, Object> result = buildTaskSummary(task);
+        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>()
+                .eq(TaskItem::getTaskId, task.getId()));
         result.put("itemCount", taskItems.size());
 
         double totalAnfme = 0D;

--
Gitblit v1.9.1