From a64774b3898c4ce8e7d3aa0ccc3c4ee92861d2a6 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 21 五月 2026 15:03:51 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_New_pro
---
src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java | 199 ++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 177 insertions(+), 22 deletions(-)
diff --git a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
index 9f8499d..8d8ad45 100644
--- a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
+++ b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
@@ -14,8 +14,9 @@
@Component
public class ApproveTodoIntentExecutor {
- private static final Pattern APPROVE_ID_PATTERN = Pattern.compile("\\b[A-Za-z]*\\d{8,}\\b");
- private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?(\\d{1,2})鏉�");
+ private static final Pattern APPROVE_ID_BY_LABEL_PATTERN = Pattern.compile("(娴佺▼缂栧彿|娴佺▼鍙穦娴佺▼ID|瀹℃壒缂栧彿|缂栧彿)\\s*[:锛歖?\\s*([A-Za-z0-9_-]{2,64})");
+ private static final Pattern APPROVE_ID_PATTERN = Pattern.compile("\\b[A-Za-z]*\\d{6,}[A-Za-z0-9_-]*\\b");
+ private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?\\s*(\\d{1,2})\\s*鏉�");
private static final Pattern DATE_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
private static final Pattern NUMBER_PATTERN = Pattern.compile("(\\d+(?:\\.\\d+)?)");
private static final Pattern RECENT_RANGE_PATTERN = Pattern.compile("杩慭\d+(澶﹟鍛▅涓湀|鏈坾骞�)");
@@ -34,54 +35,63 @@
}
String text = message.trim();
+ String quickPromptResponse = tryExecuteQuickPrompt(memoryId, text);
+ if (StringUtils.hasText(quickPromptResponse)) {
+ return quickPromptResponse;
+ }
+
String approveId = extractApproveId(text);
+ boolean hasApproveId = StringUtils.hasText(approveId) && !isPlaceholderApproveId(approveId);
+ String startDate = extractStartDate(text);
+ String endDate = extractEndDate(text);
+ String timeRange = extractTimeRange(text);
if (isStatsIntent(text)) {
return approveTodoTools.getTodoStats(
memoryId,
- extractStartDate(text),
- extractEndDate(text),
- extractTimeRange(text)
+ startDate,
+ endDate,
+ timeRange
);
}
if (containsAny(text, "娴佽浆", "杩涘害", "鑺傜偣", "鏃ュ織", "鍗″湪", "鍗″埌", "褰撳墠瀹℃壒浜�", "澶勭悊璁板綍")) {
- return StringUtils.hasText(approveId)
+ return hasApproveId
? approveTodoTools.getTodoProgress(memoryId, approveId)
: missingApproveId("todo_progress", "鏌ヨ瀹℃壒杩涘害闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "璇︽儏", "鏄庣粏") && !containsAny(text, "鍒楄〃")) {
- return StringUtils.hasText(approveId)
+ return hasApproveId
? approveTodoTools.getTodoDetail(memoryId, approveId)
: missingApproveId("todo_detail", "鏌ヨ瀹℃壒璇︽儏闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "鍙栨秷瀹℃牳", "鎾ら攢瀹℃牳", "鍥為��瀹℃牳", "鎾ら攢瀹℃壒", "鎾ゅ洖瀹℃壒")
|| (containsAny(text, "鎾ら攢", "鎾ゅ洖") && containsAny(text, "瀹℃壒鎿嶄綔", "瀹℃牳鎿嶄綔"))) {
- return StringUtils.hasText(approveId)
- ? approveTodoTools.cancelReviewTodo(memoryId, approveId, firstNonBlank(extractTail(text, "鍘熷洜"), extractTail(text, "澶囨敞")))
+ return hasApproveId
+ ? approveTodoTools.cancelReviewTodo(memoryId, approveId, extractRemark(text))
: missingApproveId("cancel_review_action", "鍙栨秷瀹℃牳闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "鍒犻櫎", "绉婚櫎")) {
- return StringUtils.hasText(approveId)
+ return hasApproveId
? approveTodoTools.deleteTodo(memoryId, approveId)
: missingApproveId("delete_action", "鍒犻櫎瀹℃壒鍗曢渶瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "椹冲洖", "鎷掔粷")) {
- return StringUtils.hasText(approveId)
- ? approveTodoTools.reviewTodo(memoryId, approveId, "reject", firstNonBlank(extractTail(text, "鍘熷洜"), extractTail(text, "澶囨敞")))
+ return hasApproveId
+ ? approveTodoTools.reviewTodo(memoryId, approveId, "reject", extractRemark(text))
: missingApproveId("review_action", "椹冲洖瀹℃壒闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "瀹℃牳閫氳繃", "瀹℃壒閫氳繃", "閫氳繃瀹℃壒", "鍚屾剰瀹℃壒", "瀹℃壒鍚屾剰")) {
- return StringUtils.hasText(approveId)
- ? approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractTail(text, "澶囨敞"))
+ return hasApproveId
+ ? approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractRemark(text))
: missingApproveId("review_action", "瀹℃壒閫氳繃闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
- if (StringUtils.hasText(approveId)
+ if (hasApproveId
&& containsAny(text, "閫氳繃", "鍚屾剰")
&& !containsAny(text, "鏈�氳繃", "閫氳繃鐜�", "瀹℃壒閫氳繃鐜�", "瀹℃牳閫氳繃鐜�")) {
- return approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractTail(text, "澶囨敞"));
+ return approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractRemark(text));
}
if (containsAny(text, "淇敼", "鏇存柊", "鍙樻洿")) {
- return StringUtils.hasText(approveId)
+ return hasApproveId
? approveTodoTools.updateTodo(
memoryId,
approveId,
@@ -101,7 +111,82 @@
extractApproveType(text),
extractKeyword(text),
extractLimit(text),
- extractScope(text));
+ extractScope(text),
+ startDate,
+ endDate,
+ timeRange);
+ }
+ return null;
+ }
+
+ private String tryExecuteQuickPrompt(String memoryId, String text) {
+ String normalized = normalizeForMatch(text);
+ String approveId = extractApproveId(text);
+ boolean hasApproveId = StringUtils.hasText(approveId) && !isPlaceholderApproveId(approveId);
+
+ if ("鎴戝綋鍓嶆湁鍝簺瀹℃壒寰呭姙闇�瑕佸鐞�".equals(normalized)) {
+ return approveTodoTools.listTodos(memoryId, "pending", null, null, 10, "approver", null, null, null);
+ }
+ if ("甯垜鍒楀嚭浠婂ぉ鏂板鐨勫鎵瑰緟鍔�".equals(normalized)) {
+ return approveTodoTools.listTodos(memoryId, "all", null, null, 10, "related", null, null, "浠婂ぉ");
+ }
+ if ("褰撳墠寰呮垜瀹℃壒鐨勫崟鎹寜鏃堕棿鍊掑簭鍒楀嚭鏉�".equals(normalized)) {
+ return approveTodoTools.listTodos(memoryId, "pending", null, null, 10, "approver", null, null, null);
+ }
+ if ("鎴戝彂璧风殑瀹℃壒閲屽摢浜涜繕鍦ㄥ鐞嗕腑".equals(normalized)) {
+ return approveTodoTools.listTodos(memoryId, "processing", null, null, 10, "applicant", null, null, null);
+ }
+ if ("杩�7澶╂垜鐨勫鎵瑰緟鍔炵粺璁℃儏鍐垫�庝箞鏍�".equals(normalized)) {
+ return approveTodoTools.getTodoStats(memoryId, null, null, "杩�7澶�");
+ }
+ if ("鏈湀鎴戠殑瀹℃壒涓�氳繃椹冲洖澶勭悊涓悇鏈夊灏�".equals(normalized)) {
+ return approveTodoTools.getTodoStats(memoryId, null, null, "鏈湀");
+ }
+ if ("杩�30澶╁悇绫诲瀷瀹℃壒鏁伴噺鍒嗗竷鏄粈涔�".equals(normalized)) {
+ return approveTodoTools.getTodoStats(memoryId, null, null, "杩�30澶�");
+ }
+
+ if (normalized.startsWith("鏌ヨ娴佺▼缂栧彿") && normalized.contains("瀹℃壒璇︽儏")) {
+ return hasApproveId
+ ? approveTodoTools.getTodoDetail(memoryId, approveId)
+ : missingApproveId("todo_detail", "鏌ヨ瀹℃壒璇︽儏闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+ }
+ if (normalized.startsWith("娴佺▼缂栧彿")
+ && normalized.contains("鍗″湪鍝釜瀹℃壒鑺傜偣")
+ && normalized.contains("褰撳墠瀹℃壒浜烘槸璋�")) {
+ return hasApproveId
+ ? approveTodoTools.getTodoProgress(memoryId, approveId)
+ : missingApproveId("todo_progress", "鏌ヨ瀹℃壒杩涘害闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+ }
+ if (normalized.startsWith("甯垜鏌ョ湅娴佺▼缂栧彿") && normalized.contains("瀹℃壒娴佽浆璁板綍")) {
+ return hasApproveId
+ ? approveTodoTools.getTodoProgress(memoryId, approveId)
+ : missingApproveId("todo_progress", "鏌ヨ瀹℃壒娴佽浆璁板綍闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+ }
+ if (normalized.startsWith("甯垜瀹℃壒閫氳繃娴佺▼缂栧彿")) {
+ return hasApproveId
+ ? approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractRemark(text))
+ : missingApproveId("review_action", "瀹℃壒閫氳繃闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+ }
+ if (normalized.startsWith("甯垜椹冲洖娴佺▼缂栧彿")) {
+ return hasApproveId
+ ? approveTodoTools.reviewTodo(memoryId, approveId, "reject", extractRemark(text))
+ : missingApproveId("review_action", "椹冲洖瀹℃壒闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+ }
+ if (normalized.startsWith("鎾ら攢鎴戝垰鍒氬娴佺▼缂栧彿") && normalized.contains("瀹℃壒鎿嶄綔")) {
+ return hasApproveId
+ ? approveTodoTools.cancelReviewTodo(memoryId, approveId, extractRemark(text))
+ : missingApproveId("cancel_review_action", "鎾ら攢瀹℃壒鎿嶄綔闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+ }
+ if (normalized.startsWith("甯垜淇敼娴佺▼缂栧彿") && normalized.contains("澶囨敞涓�")) {
+ return hasApproveId
+ ? approveTodoTools.updateTodo(memoryId, approveId, null, null, null, null, null, null, extractRemark(text))
+ : missingApproveId("update_action", "淇敼瀹℃壒鍗曢渶瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+ }
+ if (normalized.startsWith("鍒犻櫎鎴戝彂璧风殑娴佺▼缂栧彿")) {
+ return hasApproveId
+ ? approveTodoTools.deleteTodo(memoryId, approveId)
+ : missingApproveId("delete_action", "鍒犻櫎瀹℃壒鍗曢渶瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
}
return null;
}
@@ -130,6 +215,10 @@
}
private String extractApproveId(String text) {
+ Matcher keywordMatcher = APPROVE_ID_BY_LABEL_PATTERN.matcher(text);
+ if (keywordMatcher.find()) {
+ return keywordMatcher.group(2);
+ }
Matcher matcher = APPROVE_ID_PATTERN.matcher(text);
return matcher.find() ? matcher.group() : null;
}
@@ -196,6 +285,8 @@
.replace("鍗曟嵁", "")
.replace("寰呭姙", "")
.replace("鍒楄〃", "")
+ .replace("娴佺▼缂栧彿", "")
+ .replace("娴佺▼鍙�", "")
.replace("鍓�10鏉�", "")
.replace("鏈�杩�10鏉�", "")
.trim();
@@ -203,7 +294,7 @@
}
private String extractValue(String text, String fieldName) {
- Pattern pattern = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗鏄�)[:锛歖?[\\s]*([^,锛屻�傦紱;\\s]+)");
+ Pattern pattern = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)[:锛歖?[\\s]*([^,锛屻�傦紱;\\s]+)");
Matcher matcher = pattern.matcher(text);
return matcher.find() ? matcher.group(2) : null;
}
@@ -250,7 +341,7 @@
if (!text.contains(fieldName)) {
return null;
}
- Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗鏄�)[:锛歖?[\\s]*(\\d{1,2})").matcher(text);
+ Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)[:锛歖?[\\s]*(\\d{1,2})").matcher(text);
return matcher.find() ? Integer.parseInt(matcher.group(2)) : null;
}
@@ -264,21 +355,85 @@
}
private String extractTail(String text, String key) {
+ Pattern quotedPattern = Pattern.compile(key + "(鏄瘄涓�)?[:锛歖?[\\s]*[鈥淺"]([^鈥漒"]+)[鈥漒"]");
+ Matcher quotedMatcher = quotedPattern.matcher(text);
+ if (quotedMatcher.find()) {
+ return cleanContent(quotedMatcher.group(2));
+ }
Pattern pattern = Pattern.compile(key + "(鏄瘄涓�)?[:锛歖?[\\s]*(.+)");
Matcher matcher = pattern.matcher(text);
- return matcher.find() ? matcher.group(2).trim() : null;
+ return matcher.find() ? cleanContent(matcher.group(2)) : null;
}
private String extractScope(String text) {
if (containsAny(text, "鎴戝彂璧�", "鎴戞彁浜�", "鎴戠敵璇�", "鐢宠浜烘槸鎴�")) {
return "applicant";
}
- if (containsAny(text, "寰呮垜瀹℃壒", "寰呮垜瀹℃牳", "鎴戝鐞�", "鎴戝鎵�", "褰撳墠寰呮垜", "闇�瑕佹垜澶勭悊")) {
+ if (containsAny(text, "寰呮垜瀹℃壒", "寰呮垜瀹℃牳", "鎴戝鐞�", "鎴戝鎵�", "褰撳墠寰呮垜", "闇�瑕佹垜澶勭悊", "闇�瑕佸鐞�")) {
return "approver";
}
return "related";
}
+ private String extractRemark(String text) {
+ return firstNonBlank(firstNonBlank(extractTail(text, "澶囨敞"), extractTail(text, "鍘熷洜")), extractQuotedContent(text));
+ }
+
+ private String extractQuotedContent(String text) {
+ Matcher matcher = Pattern.compile("[鈥淺"]([^鈥漒"]+)[鈥漒"]").matcher(text);
+ return matcher.find() ? cleanContent(matcher.group(1)) : null;
+ }
+
+ private String normalizeForMatch(String text) {
+ if (!StringUtils.hasText(text)) {
+ return "";
+ }
+ return text.replace("锛�", "")
+ .replace(",", "")
+ .replace("銆�", "")
+ .replace(".", "")
+ .replace("锛�", "")
+ .replace("!", "")
+ .replace("锛�", "")
+ .replace("?", "")
+ .replace("锛�", "")
+ .replace(":", "")
+ .replace("锛�", "")
+ .replace(";", "")
+ .replace("鈥�", "")
+ .replace("鈥�", "")
+ .replace("\"", "")
+ .replace(" ", "")
+ .trim();
+ }
+
+ private boolean isPlaceholderApproveId(String approveId) {
+ if (!StringUtils.hasText(approveId)) {
+ return true;
+ }
+ String value = approveId.trim();
+ return "xxx".equalsIgnoreCase(value)
+ || value.matches("[xX]{2,}")
+ || "娴佺▼缂栧彿".equals(value)
+ || "缂栧彿".equals(value)
+ || value.contains("绀轰緥")
+ || value.contains("璇疯緭鍏�");
+ }
+
+ private String cleanContent(String text) {
+ if (!StringUtils.hasText(text)) {
+ return null;
+ }
+ return text.trim()
+ .replace("鈥�", "")
+ .replace("鈥�", "")
+ .replace("\"", "")
+ .replace("銆�", "")
+ .replace("锛�", "")
+ .replace(";", "")
+ .trim();
+ }
+
private String firstNonBlank(String first, String second) {
return StringUtils.hasText(first) ? first : second;
}
--
Gitblit v1.9.3