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;
|
}
|
}
|