From 0989ec1e6b465141f99ed67e40fa2a0b928dce94 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 29 四月 2026 16:54:51 +0800
Subject: [PATCH] feat(production): 新增生产核算和生产工单功能模块 - 添加生产核算控制器、服务接口及实现类 - 实现生产核算分页查询和工人生产工资信息查询功能 - 添加生产工单控制器、服务接口及实现类 - 实现生产工单的增删改查和状态统计功能 - 集成工单流转卡下载和二维码生成功能 - 添加工单相关的数据传输对象和值对象 - 实现工单与用户关联的分配功能 - 完善工单附件图片处理和展示功能
---
src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java | 104 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 86 insertions(+), 18 deletions(-)
diff --git a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
index 6e1a948..5911521 100644
--- a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
+++ b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
@@ -16,6 +16,11 @@
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 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+(澶﹟鍛▅涓湀|鏈坾骞�)");
+ private static final Pattern HALF_RANGE_PATTERN = Pattern.compile("(鏈�杩憒杩�)?鍗�(涓�)?(鏈坾骞�)");
+ private static final Pattern EXPLICIT_RANGE_PATTERN = Pattern.compile(".*(鍒皘鑷�).*");
private final ApproveTodoTools approveTodoTools;
@@ -23,7 +28,7 @@
this.approveTodoTools = approveTodoTools;
}
- public String tryExecute(String message) {
+ public String tryExecute(String memoryId, String message) {
if (!StringUtils.hasText(message)) {
return null;
}
@@ -31,47 +36,53 @@
String text = message.trim();
String approveId = extractApproveId(text);
- if (containsAny(text, "缁熻", "鍒嗘瀽", "鍥捐〃", "瓒嬪娍", "鍗犳瘮")) {
- return approveTodoTools.getTodoStats();
+ if (isStatsIntent(text)) {
+ return approveTodoTools.getTodoStats(
+ memoryId,
+ extractStartDate(text),
+ extractEndDate(text),
+ extractTimeRange(text)
+ );
}
if (containsAny(text, "娴佽浆", "杩涘害", "鑺傜偣", "鏃ュ織")) {
return StringUtils.hasText(approveId)
- ? approveTodoTools.getTodoProgress(approveId)
+ ? approveTodoTools.getTodoProgress(memoryId, approveId)
: missingApproveId("todo_progress", "鏌ヨ瀹℃壒杩涘害闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "璇︽儏", "鏄庣粏") && !containsAny(text, "鍒楄〃")) {
return StringUtils.hasText(approveId)
- ? approveTodoTools.getTodoDetail(approveId)
+ ? approveTodoTools.getTodoDetail(memoryId, approveId)
: missingApproveId("todo_detail", "鏌ヨ瀹℃壒璇︽儏闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "鍙栨秷瀹℃牳", "鎾ら攢瀹℃牳", "鍥為��瀹℃牳")) {
return StringUtils.hasText(approveId)
- ? approveTodoTools.cancelReviewTodo(approveId, extractTail(text, "鍘熷洜"))
+ ? approveTodoTools.cancelReviewTodo(memoryId, approveId, extractTail(text, "鍘熷洜"))
: missingApproveId("cancel_review_action", "鍙栨秷瀹℃牳闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "鍒犻櫎")) {
return StringUtils.hasText(approveId)
- ? approveTodoTools.deleteTodo(approveId)
+ ? approveTodoTools.deleteTodo(memoryId, approveId)
: missingApproveId("delete_action", "鍒犻櫎瀹℃壒鍗曢渶瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "椹冲洖", "鎷掔粷")) {
return StringUtils.hasText(approveId)
- ? approveTodoTools.reviewTodo(approveId, "reject", extractTail(text, "鍘熷洜"))
+ ? approveTodoTools.reviewTodo(memoryId, approveId, "reject", extractTail(text, "鍘熷洜"))
: missingApproveId("review_action", "椹冲洖瀹℃壒闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (containsAny(text, "瀹℃牳閫氳繃", "瀹℃壒閫氳繃", "閫氳繃瀹℃壒", "鍚屾剰瀹℃壒", "瀹℃壒鍚屾剰")) {
return StringUtils.hasText(approveId)
- ? approveTodoTools.reviewTodo(approveId, "approve", extractTail(text, "澶囨敞"))
+ ? approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractTail(text, "澶囨敞"))
: missingApproveId("review_action", "瀹℃壒閫氳繃闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
}
if (StringUtils.hasText(approveId)
&& containsAny(text, "閫氳繃", "鍚屾剰")
&& !containsAny(text, "鏈�氳繃", "閫氳繃鐜�", "瀹℃壒閫氳繃鐜�", "瀹℃牳閫氳繃鐜�")) {
- return approveTodoTools.reviewTodo(approveId, "approve", extractTail(text, "澶囨敞"));
+ return approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractTail(text, "澶囨敞"));
}
if (containsAny(text, "淇敼")) {
return StringUtils.hasText(approveId)
? approveTodoTools.updateTodo(
+ memoryId,
approveId,
extractValue(text, "鏍囬"),
extractDateValue(text, "寮�濮嬫棩鏈�"),
@@ -84,12 +95,27 @@
}
if (containsAny(text, "鍒楄〃", "寰呭姙", "鏌ヨ瀹℃壒")) {
return approveTodoTools.listTodos(
+ memoryId,
extractStatus(text),
extractApproveType(text),
extractKeyword(text),
extractLimit(text));
}
return null;
+ }
+
+ private boolean isStatsIntent(String text) {
+ if (containsAny(text, "缁熻", "鍒嗘瀽", "鍥捐〃", "瓒嬪娍", "鍗犳瘮", "姹囨��", "鎬婚噺")) {
+ return true;
+ }
+ boolean hasQueryWord = containsAny(text, "鏌ヨ", "鏌ョ湅", "鐪嬩笅", "鐪嬬湅", "鑾峰彇");
+ boolean hasDataWord = containsAny(text, "鏁版嵁", "鎶ヨ〃", "鎯呭喌", "鏁伴噺", "閲戦");
+ boolean hasTimeWord = containsAny(text, "浠婂ぉ", "鏄ㄦ棩", "鏄ㄥぉ", "鏈懆", "涓婂懆", "鏈湀", "涓婃湀", "鏈勾", "浠婂勾", "鍘诲勾")
+ || DATE_PATTERN.matcher(text).find()
+ || RECENT_RANGE_PATTERN.matcher(text).find()
+ || HALF_RANGE_PATTERN.matcher(text).find()
+ || EXPLICIT_RANGE_PATTERN.matcher(text).matches();
+ return hasQueryWord && hasDataWord && hasTimeWord;
}
private boolean containsAny(String text, String... keywords) {
@@ -165,33 +191,75 @@
.replace("寰呭姙", "")
.replace("鍒楄〃", "")
.replace("鍓�10鏉�", "")
- .replace("鍓�20鏉�", "")
+ .replace("鏈�杩�10鏉�", "")
.trim();
return cleaned.length() >= 2 ? cleaned : null;
}
private String extractValue(String text, String fieldName) {
- Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)([^锛屻��,锛�;\\s]+)").matcher(text);
+ Pattern pattern = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗鏄�)[:锛歖?[\\s]*([^,锛屻�傦紱;\\s]+)");
+ Matcher matcher = pattern.matcher(text);
return matcher.find() ? matcher.group(2) : null;
}
private String extractDateValue(String text, String fieldName) {
- Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)(\\d{4}-\\d{2}-\\d{2})").matcher(text);
- return matcher.find() ? matcher.group(2) : null;
+ int index = text.indexOf(fieldName);
+ if (index < 0) {
+ return null;
+ }
+ Matcher matcher = DATE_PATTERN.matcher(text.substring(index));
+ return matcher.find() ? matcher.group(1) : null;
+ }
+
+ private String extractStartDate(String text) {
+ Matcher matcher = DATE_PATTERN.matcher(text);
+ return matcher.find() ? matcher.group(1) : null;
+ }
+
+ private String extractEndDate(String text) {
+ Matcher matcher = DATE_PATTERN.matcher(text);
+ if (!matcher.find()) {
+ return null;
+ }
+ return matcher.find() ? matcher.group(1) : null;
+ }
+
+ private String extractTimeRange(String text) {
+ if (containsAny(text, "浠婂ぉ", "鏄ㄦ棩", "鏄ㄥぉ", "鏈懆", "涓婂懆", "鏈湀", "涓婃湀", "鏈勾", "浠婂勾", "鍘诲勾")) {
+ return text;
+ }
+ if (RECENT_RANGE_PATTERN.matcher(text).find()) {
+ return text;
+ }
+ if (HALF_RANGE_PATTERN.matcher(text).find()) {
+ return text;
+ }
+ if (EXPLICIT_RANGE_PATTERN.matcher(text).matches()) {
+ return text;
+ }
+ return null;
}
private Integer extractIntegerValue(String text, String fieldName) {
- Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)(\\d{1,2})").matcher(text);
+ if (!text.contains(fieldName)) {
+ return null;
+ }
+ Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗鏄�)[:锛歖?[\\s]*(\\d{1,2})").matcher(text);
return matcher.find() ? Integer.parseInt(matcher.group(2)) : null;
}
private BigDecimal extractBigDecimalValue(String text, String fieldName) {
- Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)(\\d+(\\.\\d+)?)").matcher(text);
- return matcher.find() ? new BigDecimal(matcher.group(2)) : null;
+ int index = text.indexOf(fieldName);
+ if (index < 0) {
+ return null;
+ }
+ Matcher matcher = NUMBER_PATTERN.matcher(text.substring(index));
+ return matcher.find() ? new BigDecimal(matcher.group(1)) : null;
}
private String extractTail(String text, String key) {
- Matcher matcher = Pattern.compile(key + "(鏄瘄涓簗锛殀:)?(.+)").matcher(text);
+ Pattern pattern = Pattern.compile(key + "(鏄瘄涓�)?[:锛歖?[\\s]*(.+)");
+ Matcher matcher = pattern.matcher(text);
return matcher.find() ? matcher.group(2).trim() : null;
}
--
Gitblit v1.9.3