From 9b6620dd4a64728ef8fc8bff53ccfaa05269eeff Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Sun, 4 Jan 2026 16:53:38 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=8B=93=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/xiaozhi/modules/agent/dto/AgentDTO.java | 4 ++++ .../modules/agent/service/impl/AgentServiceImpl.java | 10 ++++++++++ main/manager-web/package-lock.json | 9 +++++++++ main/manager-web/src/views/home.vue | 10 +++++++++- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java index 218ee1eb..e5d6b029 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java @@ -1,6 +1,7 @@ package xiaozhi.modules.agent.dto; import java.util.Date; +import java.util.List; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -45,4 +46,7 @@ public class AgentDTO { @Schema(description = "设备数量", example = "10") private Integer deviceCount; + + @Schema(description = "关联设备的MAC地址列表", example = "[\"00:11:22:33:44:55\", \"66:77:88:99:AA:BB\"]") + private List macAddresses; } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index 0adf0873..65e842fd 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -42,6 +42,7 @@ import xiaozhi.modules.agent.service.AgentPluginMappingService; import xiaozhi.modules.agent.service.AgentService; import xiaozhi.modules.agent.service.AgentTemplateService; import xiaozhi.modules.agent.vo.AgentInfoVO; +import xiaozhi.modules.device.entity.DeviceEntity; import xiaozhi.modules.device.service.DeviceService; import xiaozhi.modules.model.dto.ModelProviderDTO; import xiaozhi.modules.model.dto.VoiceDTO; @@ -157,6 +158,15 @@ public class AgentServiceImpl extends BaseServiceImpl imp // 获取设备数量 dto.setDeviceCount(getDeviceCountByAgentId(agent.getId())); + + // 获取关联设备的MAC地址列表 + List devices = deviceService.getUserDevices(agent.getUserId(), agent.getId()); + List macAddresses = devices.stream() + .map(DeviceEntity::getMacAddress) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + dto.setMacAddresses(macAddresses); + return dto; }).collect(Collectors.toList()); } diff --git a/main/manager-web/package-lock.json b/main/manager-web/package-lock.json index acc4aec2..6ace205e 100644 --- a/main/manager-web/package-lock.json +++ b/main/manager-web/package-lock.json @@ -11096,6 +11096,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index fea5af89..d88a44ac 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -136,7 +136,15 @@ export default { } this.devices = this.originalDevices.filter(device => { - return this.searchRegex.test(device.agentName); + // 搜索智能体名称 + if (this.searchRegex.test(device.agentName)) { + return true; + } + // 搜索关联设备的MAC地址 + if (device.macAddresses && device.macAddresses.length > 0) { + return device.macAddresses.some(macAddress => this.searchRegex.test(macAddress)); + } + return false; }); }, // 搜索更新智能体列表 From 436a01fb6ef91f2b574f9d93e036b28f367b199a Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Sun, 4 Jan 2026 17:14:25 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E5=88=86=EF=BC=88=E8=BF=98=E5=8E=9F?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/package-lock.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/main/manager-web/package-lock.json b/main/manager-web/package-lock.json index 6ace205e..acc4aec2 100644 --- a/main/manager-web/package-lock.json +++ b/main/manager-web/package-lock.json @@ -11096,15 +11096,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", From 9c111b2d5e657fbc02930da0e96d8a49d070cf9b Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Sun, 4 Jan 2026 18:04:26 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/i18n/de.js | 2 +- main/manager-web/src/i18n/en.js | 2 +- main/manager-web/src/i18n/vi.js | 2 +- main/manager-web/src/i18n/zh_CN.js | 2 +- main/manager-web/src/i18n/zh_TW.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/main/manager-web/src/i18n/de.js b/main/manager-web/src/i18n/de.js index 22512e8c..2ecfca59 100644 --- a/main/manager-web/src/i18n/de.js +++ b/main/manager-web/src/i18n/de.js @@ -25,7 +25,7 @@ export default { 'header.featureManagement': 'Systemfunktionsverwaltung', 'header.changePassword': 'Passwort ändern', 'header.logout': 'Abmelden', - 'header.searchPlaceholder': 'Nach Namen suchen..', + 'header.searchPlaceholder': 'Namen oder MAC suchen', // McpToolCallDialog component text 'mcpToolCall.title': 'Werkzeugaufruf', diff --git a/main/manager-web/src/i18n/en.js b/main/manager-web/src/i18n/en.js index 9bcc1f7d..76876b42 100644 --- a/main/manager-web/src/i18n/en.js +++ b/main/manager-web/src/i18n/en.js @@ -25,7 +25,7 @@ export default { 'header.featureManagement': 'System Feature Management', 'header.changePassword': 'Change Password', 'header.logout': 'Logout', - 'header.searchPlaceholder': 'Search by name..', + 'header.searchPlaceholder': 'Search name or mac', // McpToolCallDialog component text 'mcpToolCall.title': 'Tool Call', diff --git a/main/manager-web/src/i18n/vi.js b/main/manager-web/src/i18n/vi.js index c9d9e1cf..9e6cb17d 100644 --- a/main/manager-web/src/i18n/vi.js +++ b/main/manager-web/src/i18n/vi.js @@ -25,7 +25,7 @@ export default { 'header.featureManagement': 'Cấu hình chức năng hệ thống', 'header.changePassword': 'Đổi mật khẩu', 'header.logout': 'Đăng xuất', - 'header.searchPlaceholder': 'Tìm kiếm theo tên..', + 'header.searchPlaceholder': 'Tìm tên hoặc MAC', // McpToolCallDialog component text 'mcpToolCall.title': 'Gọi công cụ', diff --git a/main/manager-web/src/i18n/zh_CN.js b/main/manager-web/src/i18n/zh_CN.js index 44d8e400..bc655d32 100644 --- a/main/manager-web/src/i18n/zh_CN.js +++ b/main/manager-web/src/i18n/zh_CN.js @@ -25,7 +25,7 @@ export default { 'header.featureManagement': '系统功能配置', 'header.changePassword': '修改密码', 'header.logout': '退出登录', - 'header.searchPlaceholder': '输入名称搜索..', + 'header.searchPlaceholder': '输入名称或mac搜索', // McpToolCallDialog组件文本 'mcpToolCall.title': '工具调用', diff --git a/main/manager-web/src/i18n/zh_TW.js b/main/manager-web/src/i18n/zh_TW.js index ca5a5221..c5ea5b19 100644 --- a/main/manager-web/src/i18n/zh_TW.js +++ b/main/manager-web/src/i18n/zh_TW.js @@ -25,7 +25,7 @@ export default { 'header.featureManagement': '系統功能配置', 'header.changePassword': '修改密碼', 'header.logout': '退出登錄', - 'header.searchPlaceholder': '輸入名稱搜索..', + 'header.searchPlaceholder': '輸入名稱或mac搜索', // McpToolCallDialog组件文本 'mcpToolCall.title': '工具調用', From e25ca3d1d3ca856aed71c34beb473b18b471c4a8 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 10:10:17 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0-=E4=BB=8E=E5=89=8D=E7=AB=AF=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=94=B9=E4=B8=BA=E5=90=8E=E7=AB=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/controller/AgentController.java | 11 +++++ .../modules/agent/service/AgentService.java | 10 +++++ .../agent/service/impl/AgentServiceImpl.java | 39 ++++++++++++++++++ .../modules/device/service/DeviceService.java | 9 ++++ .../service/impl/DeviceServiceImpl.java | 8 ++++ main/manager-web/src/apis/module/agent.js | 20 +++++++++ main/manager-web/src/components/HeaderBar.vue | 14 +------ main/manager-web/src/views/home.vue | 41 +++++++++---------- 8 files changed, 118 insertions(+), 34 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java index 0052c7cc..4eb53a65 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java @@ -271,4 +271,15 @@ public class AgentController { .body(audioData); } + @GetMapping("/search") + @Operation(summary = "搜索智能体") + @RequiresPermissions("sys:role:normal") + public Result> searchAgent( + @RequestParam("keyword") String keyword, + @RequestParam(value = "searchType", defaultValue = "name") String searchType) { + UserDetail user = SecurityUser.getUser(); + List agents = agentService.searchAgent(keyword, searchType, user.getId()); + return new Result>().ok(agents); + } + } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java index a9d4e5bb..6db9caaa 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java @@ -98,4 +98,14 @@ public interface AgentService extends BaseService { * @return 创建的智能体ID */ String createAgent(AgentCreateDTO dto); + + /** + * 搜索智能体 + * + * @param keyword 搜索关键词 + * @param searchType 搜索类型:name(按名称搜索)或mac(按MAC地址搜索) + * @param userId 用户ID + * @return 智能体列表 + */ + List searchAgent(String keyword, String searchType, Long userId); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index 65e842fd..04c902a0 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -478,4 +478,43 @@ public class AgentServiceImpl extends BaseServiceImpl imp agentPluginMappingService.saveBatch(toInsert); return entity.getId(); } + + @Override + public List searchAgent(String keyword, String searchType, Long userId) { + if (StringUtils.isBlank(keyword)) { + return new ArrayList<>(); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + + if ("mac".equals(searchType)) { + // 按MAC地址搜索:先搜索设备,再获取对应的智能体 + List devices = deviceService.searchDevicesByMacAddress(keyword, userId); + + if (devices.isEmpty()) { + return new ArrayList<>(); + } + + // 获取设备对应的智能体ID列表 + List agentIds = devices.stream() + .map(DeviceEntity::getAgentId) + .distinct() + .collect(Collectors.toList()); + + if (agentIds.isEmpty()) { + return new ArrayList<>(); + } + + // 查询智能体 + queryWrapper.in("id", agentIds); + } else { + // 按名称搜索 + queryWrapper.like("agent_name", keyword); + } + + // 执行查询 + List agentEntities = baseDao.selectList(queryWrapper); + return ConvertUtils.sourceToTarget(agentEntities, AgentDTO.class); + } } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java index 5b56161f..f4debba9 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java @@ -108,4 +108,13 @@ public interface DeviceService extends BaseService { */ String generateWebSocketToken(String clientId, String username) throws Exception; + /** + * 根据MAC地址搜索设备 + * + * @param macAddress MAC地址关键词 + * @param userId 用户ID + * @return 设备列表 + */ + List searchDevicesByMacAddress(String macAddress, Long userId); + } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java index 5c807645..ea0d20eb 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java @@ -496,6 +496,14 @@ public class DeviceServiceImpl extends BaseServiceImpl redisUtils.delete(RedisKeys.getAgentDeviceCountById(dto.getAgentId())); } + @Override + public List searchDevicesByMacAddress(String macAddress, Long userId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("mac_address", macAddress); + wrapper.eq("user_id", userId); + return deviceDao.selectList(wrapper); + } + /** * 生成MQTT密码签名 * diff --git a/main/manager-web/src/apis/module/agent.js b/main/manager-web/src/apis/module/agent.js index 4a76514c..e10d9c77 100644 --- a/main/manager-web/src/apis/module/agent.js +++ b/main/manager-web/src/apis/module/agent.js @@ -382,4 +382,24 @@ export default { }); }).send(); }, + + // 搜索智能体 + searchAgent(keyword, searchType, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/search`) + .method('GET') + .data({ + keyword: keyword, + searchType: searchType // searchType: 'name' 或 'mac' + }) + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail(() => { + RequestService.reAjaxFun(() => { + this.searchAgent(keyword, searchType, callback); + }); + }).send(); + }, } diff --git a/main/manager-web/src/components/HeaderBar.vue b/main/manager-web/src/components/HeaderBar.vue index add7e221..c661f6fc 100644 --- a/main/manager-web/src/components/HeaderBar.vue +++ b/main/manager-web/src/components/HeaderBar.vue @@ -408,18 +408,8 @@ export default { // 保存搜索历史 this.saveSearchHistory(searchValue); - try { - // 创建不区分大小写的正则表达式 - const regex = new RegExp(searchValue, "i"); - // 触发搜索事件,将正则表达式传递给父组件 - this.$emit("search", regex); - } catch (error) { - console.error("正则表达式创建失败:", error); - this.$message.error({ - message: this.$t("message.error"), - showClose: true, - }); - } + // 触发搜索事件,将搜索关键词传递给父组件 + this.$emit("search", searchValue); // 搜索完成后让输入框失去焦点,从而触发blur事件隐藏搜索历史 if (this.$refs.searchInput) { diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index d88a44ac..e4e8db46 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -119,34 +119,31 @@ export default { handleDeviceManage() { this.$router.push('/device-management'); }, - handleSearch(regex) { + handleSearch(keyword) { this.isSearching = true; - this.searchRegex = regex; - this.applySearchFilter(); + this.isLoading = true; + // 检测MAC地址格式:包含4个冒号 + const isMac = /(:.*?){4}/.test(keyword); + const searchType = isMac ? 'mac' : 'name'; + Api.agent.searchAgent(keyword, searchType, ({ data }) => { + if (data?.data) { + this.devices = data.data.map(item => ({ + ...item, + agentId: item.id + })); + } + this.isLoading = false; + }, (error) => { + console.error('搜索智能体失败:', error); + this.isLoading = false; + this.$message.error(this.$t('message.searchFailed')); + }); }, handleSearchReset() { this.isSearching = false; - this.searchRegex = null; - this.devices = [...this.originalDevices]; + this.fetchAgentList(); }, - applySearchFilter() { - if (!this.isSearching || !this.searchRegex) { - this.devices = [...this.originalDevices]; - return; - } - this.devices = this.originalDevices.filter(device => { - // 搜索智能体名称 - if (this.searchRegex.test(device.agentName)) { - return true; - } - // 搜索关联设备的MAC地址 - if (device.macAddresses && device.macAddresses.length > 0) { - return device.macAddresses.some(macAddress => this.searchRegex.test(macAddress)); - } - return false; - }); - }, // 搜索更新智能体列表 handleSearchResult(filteredList) { this.devices = filteredList; // 更新设备列表 From cc96eaeb8f049c3a5d5e2c3f4321882d36e172c4 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 10:13:11 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/views/home.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index e4e8db46..a1d58805 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -141,7 +141,8 @@ export default { }, handleSearchReset() { this.isSearching = false; - this.fetchAgentList(); + // 直接将原始设备列表赋值给显示设备列表,避免重新加载数据 + this.devices = [...this.originalDevices]; }, // 搜索更新智能体列表 @@ -164,7 +165,8 @@ export default { 10 // 最多10个 ); - this.handleSearchReset(); + // 将原始设备列表赋值给显示设备列表 + this.devices = [...this.originalDevices]; } this.isLoading = false; }, (error) => { From a01f01198c49786821e2fb182606f9de4762549b Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 11:13:01 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E8=A1=A5=E5=85=A8=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/service/impl/AgentServiceImpl.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index 04c902a0..f14f8216 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -515,6 +515,44 @@ public class AgentServiceImpl extends BaseServiceImpl imp // 执行查询 List agentEntities = baseDao.selectList(queryWrapper); - return ConvertUtils.sourceToTarget(agentEntities, AgentDTO.class); + + // 转换为DTO并设置所有必要字段 + return agentEntities.stream().map(agent -> { + AgentDTO dto = new AgentDTO(); + dto.setId(agent.getId()); + dto.setAgentName(agent.getAgentName()); + dto.setSystemPrompt(agent.getSystemPrompt()); + + // 获取 TTS 模型名称 + dto.setTtsModelName(modelConfigService.getModelNameById(agent.getTtsModelId())); + + // 获取 LLM 模型名称 + dto.setLlmModelName(modelConfigService.getModelNameById(agent.getLlmModelId())); + + // 获取 VLLM 模型名称 + dto.setVllmModelName(modelConfigService.getModelNameById(agent.getVllmModelId())); + + // 获取记忆模型名称 + dto.setMemModelId(agent.getMemModelId()); + + // 获取 TTS 音色名称 + dto.setTtsVoiceName(timbreModelService.getTimbreNameById(agent.getTtsVoiceId())); + + // 获取智能体最近的最后连接时长 + dto.setLastConnectedAt(deviceService.getLatestLastConnectionTime(agent.getId())); + + // 获取设备数量 + dto.setDeviceCount(getDeviceCountByAgentId(agent.getId())); + + // 获取关联设备的MAC地址列表 + List devices = deviceService.getUserDevices(agent.getUserId(), agent.getId()); + List macAddresses = devices.stream() + .map(DeviceEntity::getMacAddress) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + dto.setMacAddresses(macAddresses); + + return dto; + }).collect(Collectors.toList()); } } From d003e663109c251fb0592a713c63df12b685c528 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 11:31:28 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/views/home.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index a1d58805..2a2bfa81 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -165,8 +165,7 @@ export default { 10 // 最多10个 ); - // 将原始设备列表赋值给显示设备列表 - this.devices = [...this.originalDevices]; + this.handleSearchReset(); } this.isLoading = false; }, (error) => { From e9373b59c8a2881dabdb0c37ae62a63a8775ab59 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 14:50:23 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/controller/AgentController.java | 32 ++++++++----- .../xiaozhi/modules/agent/dto/AgentDTO.java | 3 -- .../modules/agent/dto/AgentSearchDTO.java | 17 +++++++ .../modules/agent/service/AgentService.java | 7 ++- .../agent/service/impl/AgentServiceImpl.java | 48 +++++++------------ main/manager-web/src/apis/module/agent.js | 2 +- 6 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java index 4eb53a65..7197d159 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java @@ -39,6 +39,7 @@ import xiaozhi.modules.agent.dto.AgentChatSessionDTO; import xiaozhi.modules.agent.dto.AgentCreateDTO; import xiaozhi.modules.agent.dto.AgentDTO; import xiaozhi.modules.agent.dto.AgentMemoryDTO; +import xiaozhi.modules.agent.dto.AgentSearchDTO; import xiaozhi.modules.agent.dto.AgentUpdateDTO; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.entity.AgentTemplateEntity; @@ -73,10 +74,24 @@ public class AgentController { @GetMapping("/list") @Operation(summary = "获取用户智能体列表") @RequiresPermissions("sys:role:normal") - public Result> getUserAgents() { + public Result> getUserAgents( + @RequestParam(value = "keyword", required = false) String keyword, + @RequestParam(value = "searchType", defaultValue = "name") String searchType) { UserDetail user = SecurityUser.getUser(); - List agents = agentService.getUserAgents(user.getId()); - return new Result>().ok(agents); + + // 如果有搜索关键词,则使用搜索功能 + if (StringUtils.isNotBlank(keyword)) { + AgentSearchDTO searchDTO = new AgentSearchDTO(); + searchDTO.setKeyword(keyword); + searchDTO.setSearchType(searchType); + searchDTO.setUserId(user.getId()); + List agents = agentService.searchAgent(searchDTO); + return new Result>().ok(agents); + } else { + // 否则返回所有智能体 + List agents = agentService.getUserAgents(user.getId()); + return new Result>().ok(agents); + } } @GetMapping("/all") @@ -271,15 +286,6 @@ public class AgentController { .body(audioData); } - @GetMapping("/search") - @Operation(summary = "搜索智能体") - @RequiresPermissions("sys:role:normal") - public Result> searchAgent( - @RequestParam("keyword") String keyword, - @RequestParam(value = "searchType", defaultValue = "name") String searchType) { - UserDetail user = SecurityUser.getUser(); - List agents = agentService.searchAgent(keyword, searchType, user.getId()); - return new Result>().ok(agents); - } + } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java index e5d6b029..edad88db 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentDTO.java @@ -46,7 +46,4 @@ public class AgentDTO { @Schema(description = "设备数量", example = "10") private Integer deviceCount; - - @Schema(description = "关联设备的MAC地址列表", example = "[\"00:11:22:33:44:55\", \"66:77:88:99:AA:BB\"]") - private List macAddresses; } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java new file mode 100644 index 00000000..9715a276 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java @@ -0,0 +1,17 @@ +package xiaozhi.modules.agent.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "智能体搜索查询DTO") +public class AgentSearchDTO { + @Schema(description = "搜索关键词") + private String keyword; + + @Schema(description = "搜索类型: mac - 按MAC地址搜索, name - 按名称搜索") + private String searchType; + + @Schema(description = "用户ID") + private Long userId; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java index 6db9caaa..63806a0a 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java @@ -7,6 +7,7 @@ import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; import xiaozhi.modules.agent.dto.AgentCreateDTO; import xiaozhi.modules.agent.dto.AgentDTO; +import xiaozhi.modules.agent.dto.AgentSearchDTO; import xiaozhi.modules.agent.dto.AgentUpdateDTO; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.vo.AgentInfoVO; @@ -102,10 +103,8 @@ public interface AgentService extends BaseService { /** * 搜索智能体 * - * @param keyword 搜索关键词 - * @param searchType 搜索类型:name(按名称搜索)或mac(按MAC地址搜索) - * @param userId 用户ID + * @param searchDTO 搜索条件DTO * @return 智能体列表 */ - List searchAgent(String keyword, String searchType, Long userId); + List searchAgent(AgentSearchDTO searchDTO); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index f14f8216..b487150c 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -31,6 +31,7 @@ import xiaozhi.common.utils.JsonUtils; import xiaozhi.modules.agent.dao.AgentDao; import xiaozhi.modules.agent.dto.AgentCreateDTO; import xiaozhi.modules.agent.dto.AgentDTO; +import xiaozhi.modules.agent.dto.AgentSearchDTO; import xiaozhi.modules.agent.dto.AgentUpdateDTO; import xiaozhi.modules.agent.entity.AgentContextProviderEntity; import xiaozhi.modules.agent.entity.AgentEntity; @@ -89,13 +90,13 @@ public class AgentServiceImpl extends BaseServiceImpl imp agent.setChatHistoryConf(Constant.ChatHistoryConfEnum.RECORD_TEXT_AUDIO.getCode()); } } - + // 查询上下文源配置 AgentContextProviderEntity contextProviderEntity = agentContextProviderService.getByAgentId(id); if (contextProviderEntity != null) { agent.setContextProviders(contextProviderEntity.getContextProviders()); } - + // 无需额外查询插件列表,已通过SQL查询出来 return agent; } @@ -158,15 +159,7 @@ public class AgentServiceImpl extends BaseServiceImpl imp // 获取设备数量 dto.setDeviceCount(getDeviceCountByAgentId(agent.getId())); - - // 获取关联设备的MAC地址列表 - List devices = deviceService.getUserDevices(agent.getUserId(), agent.getId()); - List macAddresses = devices.stream() - .map(DeviceEntity::getMacAddress) - .filter(StringUtils::isNotBlank) - .collect(Collectors.toList()); - dto.setMacAddresses(macAddresses); - + return dto; }).collect(Collectors.toList()); } @@ -480,42 +473,43 @@ public class AgentServiceImpl extends BaseServiceImpl imp } @Override - public List searchAgent(String keyword, String searchType, Long userId) { - if (StringUtils.isBlank(keyword)) { + public List searchAgent(AgentSearchDTO searchDTO) { + if (StringUtils.isBlank(searchDTO.getKeyword())) { return new ArrayList<>(); } QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("user_id", userId); + queryWrapper.eq("user_id", searchDTO.getUserId()); - if ("mac".equals(searchType)) { + if ("mac".equals(searchDTO.getSearchType())) { // 按MAC地址搜索:先搜索设备,再获取对应的智能体 - List devices = deviceService.searchDevicesByMacAddress(keyword, userId); - + List devices = deviceService.searchDevicesByMacAddress(searchDTO.getKeyword(), + searchDTO.getUserId()); + if (devices.isEmpty()) { return new ArrayList<>(); } - + // 获取设备对应的智能体ID列表 List agentIds = devices.stream() .map(DeviceEntity::getAgentId) .distinct() .collect(Collectors.toList()); - + if (agentIds.isEmpty()) { return new ArrayList<>(); } - + // 查询智能体 queryWrapper.in("id", agentIds); } else { // 按名称搜索 - queryWrapper.like("agent_name", keyword); + queryWrapper.like("agent_name", searchDTO.getKeyword()); } // 执行查询 List agentEntities = baseDao.selectList(queryWrapper); - + // 转换为DTO并设置所有必要字段 return agentEntities.stream().map(agent -> { AgentDTO dto = new AgentDTO(); @@ -543,15 +537,7 @@ public class AgentServiceImpl extends BaseServiceImpl imp // 获取设备数量 dto.setDeviceCount(getDeviceCountByAgentId(agent.getId())); - - // 获取关联设备的MAC地址列表 - List devices = deviceService.getUserDevices(agent.getUserId(), agent.getId()); - List macAddresses = devices.stream() - .map(DeviceEntity::getMacAddress) - .filter(StringUtils::isNotBlank) - .collect(Collectors.toList()); - dto.setMacAddresses(macAddresses); - + return dto; }).collect(Collectors.toList()); } diff --git a/main/manager-web/src/apis/module/agent.js b/main/manager-web/src/apis/module/agent.js index e10d9c77..0d5d5076 100644 --- a/main/manager-web/src/apis/module/agent.js +++ b/main/manager-web/src/apis/module/agent.js @@ -386,7 +386,7 @@ export default { // 搜索智能体 searchAgent(keyword, searchType, callback) { RequestService.sendRequest() - .url(`${getServiceUrl()}/agent/search`) + .url(`${getServiceUrl()}/agent/list`) .method('GET') .data({ keyword: keyword, From 6851ccacf3f071222ccbea6133adc37dbe3577f1 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 15:05:29 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E6=8F=90=E5=8F=96=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/service/impl/AgentServiceImpl.java | 77 +++++++------------ main/manager-web/src/apis/module/agent.js | 6 +- 2 files changed, 28 insertions(+), 55 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index b487150c..81f084da 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -133,35 +133,40 @@ public class AgentServiceImpl extends BaseServiceImpl imp QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("user_id", userId); List agents = agentDao.selectList(wrapper); - return agents.stream().map(agent -> { - AgentDTO dto = new AgentDTO(); - dto.setId(agent.getId()); - dto.setAgentName(agent.getAgentName()); - dto.setSystemPrompt(agent.getSystemPrompt()); + return agents.stream().map(this::buildAgentDTO).collect(Collectors.toList()); + } - // 获取 TTS 模型名称 - dto.setTtsModelName(modelConfigService.getModelNameById(agent.getTtsModelId())); + /** + * 将AgentEntity转换为AgentDTO + */ + private AgentDTO buildAgentDTO(AgentEntity agent) { + AgentDTO dto = new AgentDTO(); + dto.setId(agent.getId()); + dto.setAgentName(agent.getAgentName()); + dto.setSystemPrompt(agent.getSystemPrompt()); - // 获取 LLM 模型名称 - dto.setLlmModelName(modelConfigService.getModelNameById(agent.getLlmModelId())); + // 获取 TTS 模型名称 + dto.setTtsModelName(modelConfigService.getModelNameById(agent.getTtsModelId())); - // 获取 VLLM 模型名称 - dto.setVllmModelName(modelConfigService.getModelNameById(agent.getVllmModelId())); + // 获取 LLM 模型名称 + dto.setLlmModelName(modelConfigService.getModelNameById(agent.getLlmModelId())); - // 获取记忆模型名称 - dto.setMemModelId(agent.getMemModelId()); + // 获取 VLLM 模型名称 + dto.setVllmModelName(modelConfigService.getModelNameById(agent.getVllmModelId())); - // 获取 TTS 音色名称 - dto.setTtsVoiceName(timbreModelService.getTimbreNameById(agent.getTtsVoiceId())); + // 获取记忆模型名称 + dto.setMemModelId(agent.getMemModelId()); - // 获取智能体最近的最后连接时长 - dto.setLastConnectedAt(deviceService.getLatestLastConnectionTime(agent.getId())); + // 获取 TTS 音色名称 + dto.setTtsVoiceName(timbreModelService.getTimbreNameById(agent.getTtsVoiceId())); - // 获取设备数量 - dto.setDeviceCount(getDeviceCountByAgentId(agent.getId())); + // 获取智能体最近的最后连接时长 + dto.setLastConnectedAt(deviceService.getLatestLastConnectionTime(agent.getId())); - return dto; - }).collect(Collectors.toList()); + // 获取设备数量 + dto.setDeviceCount(getDeviceCountByAgentId(agent.getId())); + + return dto; } @Override @@ -511,34 +516,6 @@ public class AgentServiceImpl extends BaseServiceImpl imp List agentEntities = baseDao.selectList(queryWrapper); // 转换为DTO并设置所有必要字段 - return agentEntities.stream().map(agent -> { - AgentDTO dto = new AgentDTO(); - dto.setId(agent.getId()); - dto.setAgentName(agent.getAgentName()); - dto.setSystemPrompt(agent.getSystemPrompt()); - - // 获取 TTS 模型名称 - dto.setTtsModelName(modelConfigService.getModelNameById(agent.getTtsModelId())); - - // 获取 LLM 模型名称 - dto.setLlmModelName(modelConfigService.getModelNameById(agent.getLlmModelId())); - - // 获取 VLLM 模型名称 - dto.setVllmModelName(modelConfigService.getModelNameById(agent.getVllmModelId())); - - // 获取记忆模型名称 - dto.setMemModelId(agent.getMemModelId()); - - // 获取 TTS 音色名称 - dto.setTtsVoiceName(timbreModelService.getTimbreNameById(agent.getTtsVoiceId())); - - // 获取智能体最近的最后连接时长 - dto.setLastConnectedAt(deviceService.getLatestLastConnectionTime(agent.getId())); - - // 获取设备数量 - dto.setDeviceCount(getDeviceCountByAgentId(agent.getId())); - - return dto; - }).collect(Collectors.toList()); + return agentEntities.stream().map(this::buildAgentDTO).collect(Collectors.toList()); } } diff --git a/main/manager-web/src/apis/module/agent.js b/main/manager-web/src/apis/module/agent.js index 0d5d5076..b90c932c 100644 --- a/main/manager-web/src/apis/module/agent.js +++ b/main/manager-web/src/apis/module/agent.js @@ -386,12 +386,8 @@ export default { // 搜索智能体 searchAgent(keyword, searchType, callback) { RequestService.sendRequest() - .url(`${getServiceUrl()}/agent/list`) + .url(`${getServiceUrl()}/agent/list?keyword=${encodeURIComponent(keyword)}&searchType=${searchType}`) .method('GET') - .data({ - keyword: keyword, - searchType: searchType // searchType: 'name' 或 'mac' - }) .success((res) => { RequestService.clearRequestTime(); callback(res); From 341ed22370905bc175b8fa9af02c25abe0326562 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 15:27:47 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/controller/AgentController.java | 17 +--- .../modules/agent/dto/AgentSearchDTO.java | 17 ---- .../modules/agent/service/AgentService.java | 13 +-- .../agent/service/impl/AgentServiceImpl.java | 85 ++++++++----------- 4 files changed, 44 insertions(+), 88 deletions(-) delete mode 100644 main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java index 7197d159..76669e67 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java @@ -39,7 +39,6 @@ import xiaozhi.modules.agent.dto.AgentChatSessionDTO; import xiaozhi.modules.agent.dto.AgentCreateDTO; import xiaozhi.modules.agent.dto.AgentDTO; import xiaozhi.modules.agent.dto.AgentMemoryDTO; -import xiaozhi.modules.agent.dto.AgentSearchDTO; import xiaozhi.modules.agent.dto.AgentUpdateDTO; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.entity.AgentTemplateEntity; @@ -79,19 +78,9 @@ public class AgentController { @RequestParam(value = "searchType", defaultValue = "name") String searchType) { UserDetail user = SecurityUser.getUser(); - // 如果有搜索关键词,则使用搜索功能 - if (StringUtils.isNotBlank(keyword)) { - AgentSearchDTO searchDTO = new AgentSearchDTO(); - searchDTO.setKeyword(keyword); - searchDTO.setSearchType(searchType); - searchDTO.setUserId(user.getId()); - List agents = agentService.searchAgent(searchDTO); - return new Result>().ok(agents); - } else { - // 否则返回所有智能体 - List agents = agentService.getUserAgents(user.getId()); - return new Result>().ok(agents); - } + // 直接调用整合后的getUserAgents方法,无需再区分搜索和普通查询 + List agents = agentService.getUserAgents(user.getId(), keyword, searchType); + return new Result>().ok(agents); } @GetMapping("/all") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java deleted file mode 100644 index 9715a276..00000000 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentSearchDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package xiaozhi.modules.agent.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(description = "智能体搜索查询DTO") -public class AgentSearchDTO { - @Schema(description = "搜索关键词") - private String keyword; - - @Schema(description = "搜索类型: mac - 按MAC地址搜索, name - 按名称搜索") - private String searchType; - - @Schema(description = "用户ID") - private Long userId; -} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java index 63806a0a..22e8a2e0 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java @@ -7,7 +7,6 @@ import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; import xiaozhi.modules.agent.dto.AgentCreateDTO; import xiaozhi.modules.agent.dto.AgentDTO; -import xiaozhi.modules.agent.dto.AgentSearchDTO; import xiaozhi.modules.agent.dto.AgentUpdateDTO; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.vo.AgentInfoVO; @@ -55,9 +54,11 @@ public interface AgentService extends BaseService { * 获取用户智能体列表 * * @param userId 用户ID + * @param keyword 搜索关键词 + * @param searchType 搜索类型(name - 按名称搜索,mac - 按MAC地址搜索) * @return 智能体列表 */ - List getUserAgents(Long userId); + List getUserAgents(Long userId, String keyword, String searchType); /** * 根据智能体ID获取设备数量 @@ -100,11 +101,5 @@ public interface AgentService extends BaseService { */ String createAgent(AgentCreateDTO dto); - /** - * 搜索智能体 - * - * @param searchDTO 搜索条件DTO - * @return 智能体列表 - */ - List searchAgent(AgentSearchDTO searchDTO); + } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index 81f084da..71a4641a 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -31,7 +31,6 @@ import xiaozhi.common.utils.JsonUtils; import xiaozhi.modules.agent.dao.AgentDao; import xiaozhi.modules.agent.dto.AgentCreateDTO; import xiaozhi.modules.agent.dto.AgentDTO; -import xiaozhi.modules.agent.dto.AgentSearchDTO; import xiaozhi.modules.agent.dto.AgentUpdateDTO; import xiaozhi.modules.agent.entity.AgentContextProviderEntity; import xiaozhi.modules.agent.entity.AgentEntity; @@ -129,11 +128,42 @@ public class AgentServiceImpl extends BaseServiceImpl imp } @Override - public List getUserAgents(Long userId) { - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("user_id", userId); - List agents = agentDao.selectList(wrapper); - return agents.stream().map(this::buildAgentDTO).collect(Collectors.toList()); + public List getUserAgents(Long userId, String keyword, String searchType) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + + // 如果有搜索关键词,根据搜索类型添加相应的查询条件 + if (StringUtils.isNotBlank(keyword)) { + if ("mac".equals(searchType)) { + // 按MAC地址搜索:先搜索设备,再获取对应的智能体 + List devices = deviceService.searchDevicesByMacAddress(keyword, userId); + + if (!devices.isEmpty()) { + // 获取设备对应的智能体ID列表 + List agentIds = devices.stream() + .map(DeviceEntity::getAgentId) + .distinct() + .collect(Collectors.toList()); + + if (!agentIds.isEmpty()) { + queryWrapper.in("id", agentIds); + } else { + return new ArrayList<>(); + } + } else { + return new ArrayList<>(); + } + } else { + // 按名称搜索 + queryWrapper.like("agent_name", keyword); + } + } + + // 执行查询 + List agentEntities = baseDao.selectList(queryWrapper); + + // 转换为DTO并设置所有必要字段 + return agentEntities.stream().map(this::buildAgentDTO).collect(Collectors.toList()); } /** @@ -477,45 +507,4 @@ public class AgentServiceImpl extends BaseServiceImpl imp return entity.getId(); } - @Override - public List searchAgent(AgentSearchDTO searchDTO) { - if (StringUtils.isBlank(searchDTO.getKeyword())) { - return new ArrayList<>(); - } - - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("user_id", searchDTO.getUserId()); - - if ("mac".equals(searchDTO.getSearchType())) { - // 按MAC地址搜索:先搜索设备,再获取对应的智能体 - List devices = deviceService.searchDevicesByMacAddress(searchDTO.getKeyword(), - searchDTO.getUserId()); - - if (devices.isEmpty()) { - return new ArrayList<>(); - } - - // 获取设备对应的智能体ID列表 - List agentIds = devices.stream() - .map(DeviceEntity::getAgentId) - .distinct() - .collect(Collectors.toList()); - - if (agentIds.isEmpty()) { - return new ArrayList<>(); - } - - // 查询智能体 - queryWrapper.in("id", agentIds); - } else { - // 按名称搜索 - queryWrapper.like("agent_name", searchDTO.getKeyword()); - } - - // 执行查询 - List agentEntities = baseDao.selectList(queryWrapper); - - // 转换为DTO并设置所有必要字段 - return agentEntities.stream().map(this::buildAgentDTO).collect(Collectors.toList()); - } -} +} \ No newline at end of file From 4c550245db88d49a8e3b5418523c44242394b004 Mon Sep 17 00:00:00 2001 From: LJH-rgsze <3241304429@qq.com> Date: Mon, 5 Jan 2026 16:51:09 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/views/home.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/manager-web/src/views/home.vue b/main/manager-web/src/views/home.vue index 2a2bfa81..07d46f01 100644 --- a/main/manager-web/src/views/home.vue +++ b/main/manager-web/src/views/home.vue @@ -123,7 +123,7 @@ export default { this.isSearching = true; this.isLoading = true; // 检测MAC地址格式:包含4个冒号 - const isMac = /(:.*?){4}/.test(keyword); + const isMac = /^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/.test(keyword) const searchType = isMac ? 'mac' : 'name'; Api.agent.searchAgent(keyword, searchType, ({ data }) => { if (data?.data) {