package com.ruoyi.ai.assistant; import com.ruoyi.ai.tools.PurchaseAgentTools; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; @Component 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 final PurchaseAgentTools purchaseAgentTools; public PurchaseIntentExecutor(PurchaseAgentTools purchaseAgentTools) { this.purchaseAgentTools = purchaseAgentTools; } public String tryExecute(String memoryId, String message) { if (!StringUtils.hasText(message)) { return null; } String text = message.trim(); if (isStatsIntent(text)) { return purchaseAgentTools.getPurchaseStats( memoryId, extractStartDate(text), extractEndDate(text), text ); } if (containsAny(text, "详情", "明细") && extractId(text) != null) { return purchaseAgentTools.getPurchaseLedgerDetail(memoryId, extractId(text)); } if (containsAny(text, "台账", "采购单", "合同", "列表", "查询")) { return purchaseAgentTools.listPurchaseLedgers( memoryId, extractKeyword(text), extractStartDate(text), extractEndDate(text), extractLimit(text) ); } return null; } private boolean isStatsIntent(String text) { if (containsAny(text, "统计", "分析", "报表", "汇总", "趋势", "数据看板")) { return true; } boolean queryWord = containsAny(text, "查询", "查看", "看下", "看看", "获取"); boolean dataWord = containsAny(text, "数据", "金额", "数量", "合同额", "付款额", "发票额"); boolean timeWord = containsAny(text, "今天", "本周", "本月", "上月", "今年", "去年", "近半年", "最近半个月", "半个月") || DATE_PATTERN.matcher(text).find(); return queryWord && dataWord && timeWord; } private boolean containsAny(String text, String... keywords) { for (String keyword : keywords) { if (text.contains(keyword)) { return true; } } return false; } private Long extractId(String text) { Matcher matcher = ID_PATTERN.matcher(text); if (!matcher.find()) { return null; } return Long.parseLong(matcher.group()); } private Integer extractLimit(String text) { Matcher matcher = LIMIT_PATTERN.matcher(text); return matcher.find() ? Integer.parseInt(matcher.group(2)) : 10; } private String extractStartDate(String text) { Matcher matcher = DATE_PATTERN.matcher(text); return matcher.find() ? matcher.group() : null; } private String extractEndDate(String text) { Matcher matcher = DATE_PATTERN.matcher(text); if (!matcher.find()) { return null; } return matcher.find() ? matcher.group() : null; } private String extractKeyword(String text) { String cleaned = text .replace("查询", "") .replace("查看", "") .replace("采购", "") .replace("台账", "") .replace("列表", "") .replace("最近10条", "") .replace("前10条", "") .trim(); return cleaned.length() >= 2 ? cleaned : null; } }