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 (containsAny(text, "排行", "排名", "前几", "前五", "前十") && containsAny(text, "物料", "产品", "原材料", "采购金额", "金额")) { return purchaseAgentTools.rankPurchaseMaterials( memoryId, extractStartDate(text), extractEndDate(text), text, extractLimit(text) ); } if (containsAny(text, "未入库", "待入库", "没有入库", "还未入库")) { return purchaseAgentTools.listUnstockedPurchaseOrders( memoryId, extractStartDate(text), extractEndDate(text), extractKeyword(text), extractLimit(text) ); } if (containsAny(text, "到货异常", "到货有异常", "异常到货", "到货问题", "供应商到货异常")) { return purchaseAgentTools.listArrivalExceptions( memoryId, extractStartDate(text), extractEndDate(text), text, extractLimit(text) ); } if (containsAny(text, "待付款", "未付款", "未付清", "待支付", "应付")) { return purchaseAgentTools.listPendingPaymentOrders( memoryId, extractStartDate(text), extractEndDate(text), extractKeyword(text), extractLimit(text) ); } if (containsAny(text, "退货", "退料", "拒收")) { return purchaseAgentTools.listPurchaseReturns( memoryId, extractStartDate(text), extractEndDate(text), extractKeyword(text), extractLimit(text) ); } 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("订单", "") .replace("台账", "") .replace("列表", "") .replace("哪些", "") .replace("列出", "") .replace("帮我", "") .replace("最近10条", "") .replace("前10条", "") .trim(); return cleaned.length() >= 2 ? cleaned : null; } }