diff --git a/main/manager-api/README.md b/main/manager-api/README.md
index 0435956e..69aa5375 100644
--- a/main/manager-api/README.md
+++ b/main/manager-api/README.md
@@ -11,6 +11,7 @@ manager-api 该项目基于SpringBoot框架开发。
JDK 21
Maven 3.8+
MySQL 8.0+
+Redis 5.0+
Vue 3.x
# 创建数据库
@@ -43,6 +44,37 @@ spring:
password: 123456
```
+
+# 连接Redis
+
+如果还没有Redis,你可以通过docker安装redis
+
+```
+docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis
+```
+
+# 确认项目Redis连接信息
+
+在`src/main/resources/application-dev.yml`中配置Redis连接信息
+
+```
+spring:
+ data:
+ redis:
+ host: localhost
+ port: 6379
+ password:
+ database: 0
+```
+
+在`src/main/resources/application.yml`中配置Redis启用状态
+
+```
+renren:
+ redis:
+ open: true
+```
+
# 测试启动
本项目为SpringBoot项目,启动方式为:
diff --git a/main/manager-api/pom.xml b/main/manager-api/pom.xml
index eacbdff9..0857ec3c 100644
--- a/main/manager-api/pom.xml
+++ b/main/manager-api/pom.xml
@@ -168,6 +168,12 @@
lombok
true
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ 2.20.0
+
diff --git a/main/manager-api/src/main/java/xiaozhi/common/controller/BaseController.java b/main/manager-api/src/main/java/xiaozhi/common/controller/BaseController.java
new file mode 100644
index 00000000..8cda64c0
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/common/controller/BaseController.java
@@ -0,0 +1,46 @@
+package xiaozhi.common.controller;
+
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Enumeration;
+import java.util.HashMap;
+
+public class BaseController {
+
+ @Autowired
+ protected HttpServletRequest request;
+
+ /**
+ * 获取请求头
+ *
+ * @return
+ */
+ protected HashMap getRequestHeaders() {
+ HashMap requestHeaders = new HashMap();
+ Enumeration headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String headerName = headerNames.nextElement();
+ String headerValue = request.getHeader(headerName);
+ requestHeaders.put(headerName, headerValue);
+ }
+ return requestHeaders;
+ }
+
+ /**
+ * 获取请求参数
+ *
+ * @return
+ */
+ protected HashMap getRequestParams() {
+ HashMap requestParams = new HashMap();
+ Enumeration paramNames = request.getParameterNames();
+ while (paramNames.hasMoreElements()) {
+ String paramName = paramNames.nextElement();
+ String paramValue = request.getParameter(paramName);
+ requestParams.put(paramName, paramValue);
+ }
+ return requestParams;
+ }
+
+}
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 9f2cb10d..f1d496ec 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
@@ -1,149 +1,287 @@
package xiaozhi.modules.agent.controller;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*;
-import xiaozhi.common.constant.Constant;
-import xiaozhi.common.page.PageData;
+import xiaozhi.common.controller.BaseController;
+import xiaozhi.common.redis.RedisUtils;
import xiaozhi.common.user.UserDetail;
-import xiaozhi.common.utils.ConvertUtils;
import xiaozhi.common.utils.Result;
-import xiaozhi.modules.agent.dto.AgentCreateDTO;
-import xiaozhi.modules.agent.dto.AgentUpdateDTO;
-import xiaozhi.modules.agent.entity.AgentEntity;
+import xiaozhi.modules.agent.domain.Agent;
+import xiaozhi.modules.agent.domain.AgentTemplate;
import xiaozhi.modules.agent.service.AgentService;
+import xiaozhi.modules.agent.service.AgentTemplateService;
+import xiaozhi.modules.agent.vo.AgentVO;
+import xiaozhi.modules.device.domain.Device;
+import xiaozhi.modules.device.service.DeviceService;
+import xiaozhi.modules.model.domain.ModelConfig;
+import xiaozhi.modules.model.domain.TtsVoice;
+import xiaozhi.modules.model.service.ModelConfigService;
+import xiaozhi.modules.model.service.TtsVoiceService;
import xiaozhi.modules.security.user.SecurityUser;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-import java.util.Map;
+import java.util.UUID;
+@Slf4j
@Tag(name = "智能体管理")
@AllArgsConstructor
@RestController
-@RequestMapping("/agent")
-public class AgentController {
+@RequestMapping("/user/agent")
+public class AgentController extends BaseController {
private final AgentService agentService;
-
- @GetMapping("/list")
- @Operation(summary = "获取用户智能体列表")
- @RequiresPermissions("sys:role:normal")
- public Result> getUserAgents() {
- UserDetail user = SecurityUser.getUser();
- List agents = agentService.getUserAgents(user.getId());
- return new Result>().ok(agents);
- }
-
- @GetMapping("/all")
- @Operation(summary = "智能体列表(管理员)")
- @RequiresPermissions("sys:role:superAdmin")
- @Parameters({
- @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
- @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
- })
- public Result> adminAgentList(
- @Parameter(hidden = true) @RequestParam Map params) {
- PageData page = agentService.adminAgentList(params);
- return new Result>().ok(page);
- }
-
- @GetMapping("/{id}")
- @Operation(summary = "获取智能体详情")
- @RequiresPermissions("sys:role:normal")
- public Result getAgentById(@PathVariable("id") String id) {
- AgentEntity agent = agentService.getAgentById(id);
- return new Result().ok(agent);
- }
-
+ private final AgentTemplateService agentTemplateService;
+ private final ModelConfigService modelConfigService;
+ private final TtsVoiceService ttsVoiceService;
+ private final DeviceService deviceService;
+ private final RedisUtils redisUtils;
+
@PostMapping
- @Operation(summary = "创建智能体")
+ @Operation(summary = "添加智能体")
@RequiresPermissions("sys:role:normal")
- public Result save(@RequestBody @Valid AgentCreateDTO dto) {
- AgentEntity entity = ConvertUtils.sourceToTarget(dto, AgentEntity.class);
-
- // 设置用户ID和创建者信息
+ public Result addAgent(@RequestBody Agent agent) {
UserDetail user = SecurityUser.getUser();
- entity.setUserId(user.getId());
- entity.setCreator(user.getId());
- entity.setCreatedAt(new Date());
-
- // ID、智能体编码和排序会在Service层自动生成
- agentService.insert(entity);
-
- return new Result<>();
+ if (StringUtils.isBlank(agent.getAgentName())) {
+ log.error("智能体名称不能为空");
+ }
+ Agent oldAgent = agentService.getOne(new QueryWrapper().eq("agent_name", agent.getAgentName()));
+ if (ObjectUtils.isNull(oldAgent)) {
+ AgentTemplate agentTemplate = agentTemplateService.getOne(new QueryWrapper().eq("is_default", 1));
+ if (ObjectUtils.isNull(agentTemplate)) {
+
+ } else {
+ try {
+ oldAgent = new Agent();
+ BeanUtils.copyProperties(oldAgent, agentTemplate);
+ oldAgent.setId(UUID.randomUUID().toString().replace("-", ""));
+ oldAgent.setAgentName(agent.getAgentName());
+ oldAgent.setUserId(user.getId());
+ oldAgent.setCreator(user.getId());
+ oldAgent.setCreatedAt(new Date());
+ agentService.save(oldAgent);
+ } catch (Exception e) {
+ log.error("对象赋值异常", e);
+ }
+ }
+ } else {
+
+ }
+ return new Result().ok(agent);
}
-
- @PutMapping
+
+ @PutMapping("{agentId}")
@Operation(summary = "更新智能体")
@RequiresPermissions("sys:role:normal")
- public Result update(@RequestBody @Valid AgentUpdateDTO dto) {
- // 先查询现有实体
- AgentEntity existingEntity = agentService.getAgentById(dto.getId());
- if (existingEntity == null) {
- return new Result().error("智能体不存在");
- }
-
- // 只更新提供的非空字段
- if (dto.getAgentName() != null) {
- existingEntity.setAgentName(dto.getAgentName());
- }
- if (dto.getAgentCode() != null) {
- existingEntity.setAgentCode(dto.getAgentCode());
- }
- if (dto.getAsrModelId() != null) {
- existingEntity.setAsrModelId(dto.getAsrModelId());
- }
- if (dto.getVadModelId() != null) {
- existingEntity.setVadModelId(dto.getVadModelId());
- }
- if (dto.getLlmModelId() != null) {
- existingEntity.setLlmModelId(dto.getLlmModelId());
- }
- if (dto.getTtsModelId() != null) {
- existingEntity.setTtsModelId(dto.getTtsModelId());
- }
- if (dto.getTtsVoiceId() != null) {
- existingEntity.setTtsVoiceId(dto.getTtsVoiceId());
- }
- if (dto.getMemModelId() != null) {
- existingEntity.setMemModelId(dto.getMemModelId());
- }
- if (dto.getIntentModelId() != null) {
- existingEntity.setIntentModelId(dto.getIntentModelId());
- }
- if (dto.getSystemPrompt() != null) {
- existingEntity.setSystemPrompt(dto.getSystemPrompt());
- }
- if (dto.getLangCode() != null) {
- existingEntity.setLangCode(dto.getLangCode());
- }
- if (dto.getLanguage() != null) {
- existingEntity.setLanguage(dto.getLanguage());
- }
- if (dto.getSort() != null) {
- existingEntity.setSort(dto.getSort());
- }
-
- // 设置更新者信息
+ public Result updateAgent(@PathVariable String agentId, @RequestBody Agent agent) {
UserDetail user = SecurityUser.getUser();
- existingEntity.setUpdater(user.getId());
- existingEntity.setUpdatedAt(new Date());
-
- agentService.updateById(existingEntity);
-
- return new Result<>();
+ if (StringUtils.isBlank(agentId)) {
+ log.error("智能体ID不能为空");
+ return new Result().error("更新失败,智能体ID不能为空");
+ }
+ Agent oldAgent = agentService.getById(agentId);
+ if (ObjectUtils.isNull(oldAgent)) {
+ log.error("智能体不存在");
+ return new Result().error("更新失败,智能体不存在");
+ } else {
+ UpdateWrapper updateWrapper = new UpdateWrapper<>();
+ updateWrapper.eq("id", agentId);
+ updateWrapper.set("agent_code", agent.getAgentCode());
+ updateWrapper.set("asr_model_id", agent.getAsrModelId());
+ updateWrapper.set("intent_model_id", agent.getIntentModelId());
+ updateWrapper.set("llm_model_id", agent.getLlmModelId());
+ updateWrapper.set("memory_model_id", agent.getMemoryModelId());
+ updateWrapper.set("system_prompt", agent.getSystemPrompt());
+ updateWrapper.set("tts_voice_id", agent.getTtsVoiceId());
+ updateWrapper.set("tts_model_id", agent.getTtsModelId());
+ updateWrapper.set("vad_model_id", agent.getVadModelId());
+ updateWrapper.set("updater", user.getId());
+ updateWrapper.set("updated_at", new Date());
+ boolean bool = agentService.update(updateWrapper);
+ if (!bool)
+ return new Result().error("更新失败");
+ }
+ return new Result().ok(agent);
}
-
- @DeleteMapping("/{id}")
+
+ @DeleteMapping("/{agentId}")
@Operation(summary = "删除智能体")
@RequiresPermissions("sys:role:normal")
- public Result delete(@PathVariable String id) {
- agentService.deleteById(id);
- return new Result<>();
+ public Result delAgent(@PathVariable String agentId) {
+ UserDetail user = SecurityUser.getUser();
+ if (StringUtils.isBlank(agentId)) {
+ log.error("智能体ID不能为空");
+ }
+ boolean bool = agentService.removeById(agentId);
+ if (!bool) {
+ return new Result().error("删除失败");
+ }
+ return new Result().ok(null);
}
-}
\ No newline at end of file
+
+ @GetMapping("/{agentId}")
+ @Operation(summary = "获取智能体信息")
+ @RequiresPermissions("sys:role:normal")
+ public Result getAgent(@PathVariable String agentId) {
+ if (StringUtils.isBlank(agentId)) {
+ log.error("智能体ID不能为空");
+ }
+ Agent agent = agentService.getById(agentId);
+ return new Result().ok(agent);
+ }
+
+ @GetMapping
+ @Operation(summary = "智能体列表")
+ @RequiresPermissions("sys:role:normal")
+ public Result> agentList() {
+ UserDetail user = SecurityUser.getUser();
+ List agents = agentService.list(new QueryWrapper().eq("user_id", user.getId()));
+ List list = new ArrayList<>();
+ this.convertAgentVOList(list, agents);
+ return new Result>().ok(list);
+ }
+
+ @GetMapping("/loadAgentConfig/{deviceId}")
+ @Operation(summary = "下载智能体配置")
+ public Result loadAgentConfig(@PathVariable String deviceId) {
+ Device device = deviceService.getOne(new QueryWrapper().eq("mac_address", deviceId.toUpperCase()));
+ if (ObjectUtils.isNull(device)) {
+ return new Result().error("设备不存在");
+ }
+ Agent agent = agentService.getOne(new QueryWrapper().eq("id", device.getAgentId()));
+ if (ObjectUtils.isNull(agent)) {
+ return new Result().error("智能体不存在");
+ }
+
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.set("prompt", agent.getSystemPrompt().replace("{{assistant_name}}", agent.getAgentCode()));
+ jsonObject.set("owner", String.valueOf(agent.getUserId()));
+ ModelConfig asrModel = modelConfigService.getById(agent.getAsrModelId());
+ jsonObject.set("ASR", JSONUtil.parseObj(asrModel.getConfigJson()));
+ ModelConfig llmModel = modelConfigService.getById(agent.getLlmModelId());
+ jsonObject.set("LLM", JSONUtil.parseObj(llmModel.getConfigJson()));
+ ModelConfig ttsModel = modelConfigService.getById(agent.getTtsModelId());
+ JSONObject ttsJson = JSONUtil.parseObj(ttsModel.getConfigJson());
+ TtsVoice ttsVoice = ttsVoiceService.getById(agent.getTtsVoiceId());
+ ttsJson.getJSONObject(ttsModel.getModelCode()).set("voice", ttsVoice.getTtsVoice());
+ jsonObject.set("TTS", ttsJson);
+ ModelConfig vadModel = modelConfigService.getById(agent.getVadModelId());
+ jsonObject.set("VAD", JSONUtil.parseObj(vadModel.getConfigJson()));
+ ModelConfig intentModel = modelConfigService.getById(agent.getIntentModelId());
+ jsonObject.set("Intent", JSONUtil.parseObj(intentModel.getConfigJson()));
+ ModelConfig memoryModel = modelConfigService.getById(agent.getMemoryModelId());
+ jsonObject.set("Memory", JSONUtil.parseObj(memoryModel.getConfigJson()));
+ JSONObject module = new JSONObject();
+ module.set("ASR", asrModel.getModelCode());
+ module.set("LLM", llmModel.getModelCode());
+ module.set("TTS", ttsModel.getModelCode());
+ module.set("Intent", intentModel.getModelCode());
+ module.set("Memory", memoryModel.getModelCode());
+ module.set("VAD", vadModel.getModelCode());
+ jsonObject.set("selected_module", module);
+
+ return new Result().ok(jsonObject);
+
+// String json = "{\n" +
+// " \"ASR\": {\n" +
+// " \"FunASR\": {\n" +
+// " \"model_dir\": \"models/SenseVoiceSmall\",\n" +
+// " \"output_dir\": \"tmp/\",\n" +
+// " \"type\": \"fun_local\"\n" +
+// " }\n" +
+// " },\n" +
+// " \"LLM\": {\n" +
+// " \"ChatGLMLLM\": {\n" +
+// " \"api_key\": \"0415dad4014847babc3e3f03024c50a3.qH7FgTy5Yawc85fl\",\n" +
+// " \"model_name\": \"glm-4-flash\",\n" +
+// " \"type\": \"openai\",\n" +
+// " \"url\": \"https://open.bigmodel.cn/api/paas/v4/\"\n" +
+// " }\n" +
+// " },\n" +
+// " \"TTS\": {\n" +
+// " \"DoubaoTTS\": {\n" +
+// " \"access_token\": \"hrnx22F9WutWBm7YJzE62r_Z1myUmHEL\",\n" +
+// " \"api_url\": \"https://openspeech.bytedance.com/api/v1/tts\",\n" +
+// " \"appid\": \"6295576095\",\n" +
+// " \"authorization\": \"Bearer;\",\n" +
+// " \"cluster\": \"volcano_tts\",\n" +
+// " \"output_dir\": \"tmp/\",\n" +
+// " \"type\": \"doubao\",\n" +
+// " \"voice\": \"BV034_streaming\"\n" +
+// " }\n" +
+// " },\n" +
+// " \"VAD\": {\n" +
+// " \"SileroVAD\": {\n" +
+// " \"min_silence_duration_ms\": 700,\n" +
+// " \"model_dir\": \"models/snakers4_silero-vad\",\n" +
+// " \"threshold\": 0.5\n" +
+// " }\n" +
+// " },\n" +
+// " \"auth_code\": \"642365\",\n" +
+// " \"prompt\": \"你是一个叫小优的女孩,来自优享生活公司的AI智能体,声音好听,习惯简短表达,爱用网络梗。\\n请注意,要像一个人一样说话,请不要回复表情符号、代码、和xml标签。\\n现在我正在和你进行语音聊天,我们开始吧。\\n如果用户希望结束对话,请在最后说“拜拜”或“再见”。\\n\",\n" +
+// " \"selected_module\": {\n" +
+// " \"ASR\": \"FunASR\",\n" +
+// " \"Intent\": \"function_call\",\n" +
+// " \"LLM\": \"ChatGLMLLM\",\n" +
+// " \"Memory\": \"mem0ai\",\n" +
+// " \"TTS\": \"DoubaoTTS\",\n" +
+// " \"VAD\": \"SileroVAD\"\n" +
+// " },\n" +
+// " \"owner\":\"18600806164\"\n" +
+// "}";
+//
+// return new Result().ok(new JSONObject(json));
+ }
+
+ /**
+ * 将Agent对象列表转换为AgentVO对象列表
+ * 此方法遍历Agent对象列表,将每个Agent对象转换为AgentVO对象,并添加到AgentVO列表中
+ *
+ * @param agentVOList 转换后的AgentVO对象列表
+ * @param agentList 原始的Agent对象列表
+ */
+ private void convertAgentVOList(List agentVOList, List agentList) {
+ // 遍历Agent对象列表
+ for (Agent agent : agentList) {
+ // 创建一个新的AgentVO对象
+ AgentVO agentVO = new AgentVO();
+ // 将当前Agent对象的属性值转换并设置到AgentVO对象中
+ this.convertAgentVO(agentVO, agent);
+ // 将转换后的AgentVO对象添加到AgentVO列表中
+ agentVOList.add(agentVO);
+ }
+ }
+
+ private void convertAgentVO(AgentVO agentVO, Agent agent) {
+ try {
+ BeanUtils.copyProperties(agentVO, agent);
+ agentVO.setTtsModelName("未知");
+ TtsVoice ttsVoice = ttsVoiceService.getOne(new QueryWrapper().eq("id", agent.getTtsVoiceId()));
+ if (ObjectUtils.isNotNull(ttsVoice)) {
+ agentVO.setTtsModelName(ttsVoice.getName());
+ }
+ agentVO.setLlmModelName("未知");
+ ModelConfig modelConfig = modelConfigService.getOne(new QueryWrapper().eq("id", agent.getLlmModelId()));
+ if (ObjectUtils.isNotNull(modelConfig)) {
+ agentVO.setLlmModelName(modelConfig.getModelName());
+ }
+ agentVO.setLastConnectedAt("今天");
+ agentVO.setDeviceCount(0L);
+ long deviceCount = deviceService.count(new QueryWrapper().eq("agent_id", agent.getId()));
+ agentVO.setDeviceCount(deviceCount);
+ } catch (Exception e) {
+ log.error("[convertAgentVO]对象转换报错", e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentTemplateController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentTemplateController.java
new file mode 100644
index 00000000..08405cac
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentTemplateController.java
@@ -0,0 +1,131 @@
+package xiaozhi.modules.agent.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.*;
+import xiaozhi.common.controller.BaseController;
+import xiaozhi.common.user.UserDetail;
+import xiaozhi.common.utils.Result;
+import xiaozhi.modules.agent.domain.AgentTemplate;
+import xiaozhi.modules.agent.service.AgentTemplateService;
+import xiaozhi.modules.agent.vo.AgentTemplateVO;
+import xiaozhi.modules.model.domain.ModelConfig;
+import xiaozhi.modules.model.domain.TtsVoice;
+import xiaozhi.modules.model.service.ModelConfigService;
+import xiaozhi.modules.model.service.TtsVoiceService;
+import xiaozhi.modules.security.user.SecurityUser;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+@Slf4j
+@Tag(name = "智能体模板管理")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/user/agent/template")
+public class AgentTemplateController extends BaseController {
+ private final AgentTemplateService agentTemplateService;
+ private final ModelConfigService modelConfigService;
+ private final TtsVoiceService ttsVoiceService;
+
+ @PostMapping
+ @Operation(summary = "添加智能体模板")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result addTemplate(@RequestBody AgentTemplate agentTemplate) {
+ UserDetail user = SecurityUser.getUser();
+ if (StringUtils.isBlank(agentTemplate.getAgentName())) {
+ log.error("智能体模板名称不能为空");
+ }
+ try {
+ agentTemplate = new AgentTemplate();
+ agentTemplate.setId(UUID.randomUUID().toString().replace("-", ""));
+ agentTemplate.setAgentName(agentTemplate.getAgentName());
+ agentTemplate.setCreator(user.getId());
+ agentTemplate.setCreatedAt(new Date());
+ agentTemplateService.save(agentTemplate);
+ } catch (Exception e) {
+ log.error("对象赋值异常", e);
+ }
+ return new Result().ok(agentTemplate);
+ }
+
+ @DeleteMapping("/{templateId}")
+ @Operation(summary = "删除智能体模板")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result delTemplate(@PathVariable String templateId) {
+ UserDetail user = SecurityUser.getUser();
+ if (StringUtils.isBlank(templateId)) {
+ log.error("智能体模板ID不能为空");
+ }
+ boolean bool = agentTemplateService.removeById(templateId);
+ if (!bool) {
+ return new Result().error("删除失败");
+ }
+ return new Result().ok(null);
+ }
+
+ @GetMapping
+ @Operation(summary = "智能体模板模板列表")
+ @RequiresPermissions("sys:role:normal")
+ public Result> templateList() {
+ List list = agentTemplateService.list(new QueryWrapper().orderByAsc("sort"));
+ return new Result>().ok(list);
+ }
+
+ @GetMapping("/vo")
+ @Operation(summary = "智能体模板模板列表")
+ @RequiresPermissions("sys:role:normal")
+ public Result> templateVOList() {
+ UserDetail user = SecurityUser.getUser();
+ List templates = agentTemplateService.list();
+ List list = new ArrayList<>();
+ this.convertAgentTemplateVOList(list, templates);
+ return new Result>().ok(list);
+ }
+
+ /**
+ * 将Agent对象列表转换为AgentTemplateVO对象列表
+ * 此方法遍历Agent对象列表,将每个Agent对象转换为AgentTemplateVO对象,并添加到AgentTemplateVO列表中
+ *
+ * @param agentVOList 转换后的AgentTemplateVO对象列表
+ * @param agentList 原始的Agent对象列表
+ */
+ private void convertAgentTemplateVOList(List agentVOList, List agentList) {
+ // 遍历Agent对象列表
+ for (AgentTemplate agentTemplate : agentList) {
+ // 创建一个新的AgentTemplateVO对象
+ AgentTemplateVO agentTemplateVO = new AgentTemplateVO();
+ // 将当前Agent对象的属性值转换并设置到AgentTemplateVO对象中
+ this.convertAgentTemplateVO(agentTemplateVO, agentTemplate);
+ // 将转换后的AgentTemplateVO对象添加到AgentTemplateVO列表中
+ agentVOList.add(agentTemplateVO);
+ }
+ }
+
+ private void convertAgentTemplateVO(AgentTemplateVO agentTemplateVO, AgentTemplate agentTemplate) {
+ try {
+ BeanUtils.copyProperties(agentTemplateVO, agentTemplate);
+ agentTemplateVO.setTtsModelName("未知");
+ TtsVoice ttsVoice = ttsVoiceService.getOne(new QueryWrapper().eq("id", agentTemplate.getTtsVoiceId()));
+ if (ObjectUtils.isNotNull(ttsVoice)) {
+ agentTemplateVO.setTtsModelName(ttsVoice.getName());
+ }
+ agentTemplateVO.setLlmModelName("未知");
+ ModelConfig modelConfig = modelConfigService.getOne(new QueryWrapper().eq("id", agentTemplate.getLlmModelId()));
+ if (ObjectUtils.isNotNull(modelConfig)) {
+ agentTemplateVO.setLlmModelName(modelConfig.getModelName());
+ }
+ } catch (Exception e) {
+ log.error("[convertAgentTemplateVO]对象转换报错", e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentDao.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentDao.java
deleted file mode 100644
index 169346bf..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentDao.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package xiaozhi.modules.agent.dao;
-
-import org.apache.ibatis.annotations.Mapper;
-import xiaozhi.common.dao.BaseDao;
-import xiaozhi.modules.agent.entity.AgentEntity;
-
-@Mapper
-public interface AgentDao extends BaseDao {
-
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/domain/Agent.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/domain/Agent.java
new file mode 100644
index 00000000..8ae48dec
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/domain/Agent.java
@@ -0,0 +1,116 @@
+package xiaozhi.modules.agent.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 智能体配置表
+ * @TableName ai_agent
+ */
+@TableName(value ="ai_agent")
+@Data
+public class Agent implements Serializable {
+ /**
+ * 智能体唯一标识
+ */
+ @TableId
+ private String id;
+
+ /**
+ * 所属用户 ID
+ */
+ private Long userId;
+
+ /**
+ * 智能体编码
+ */
+ private String agentCode;
+
+ /**
+ * 智能体名称
+ */
+ private String agentName;
+
+ /**
+ * 语音识别模型标识
+ */
+ private String asrModelId;
+
+ /**
+ * 语音活动检测标识
+ */
+ private String vadModelId;
+
+ /**
+ * 大语言模型标识
+ */
+ private String llmModelId;
+
+ /**
+ * 语音合成模型标识
+ */
+ private String ttsModelId;
+
+ /**
+ * 音色标识
+ */
+ private String ttsVoiceId;
+
+ /**
+ * 记忆模型标识
+ */
+ private String memoryModelId;
+
+ /**
+ * 意图模型标识
+ */
+ private String intentModelId;
+
+ /**
+ * 角色设定参数
+ */
+ private String systemPrompt;
+
+ /**
+ * 语言编码
+ */
+ private String langCode;
+
+ /**
+ * 交互语种
+ */
+ private String language;
+
+ /**
+ * 排序权重
+ */
+ private Integer sort;
+
+ /**
+ * 创建者 ID
+ */
+ private Long creator;
+
+ /**
+ * 创建时间
+ */
+ private Date createdAt;
+
+ /**
+ * 更新者 ID
+ */
+ private Long updater;
+
+ /**
+ * 更新时间
+ */
+ private Date updatedAt;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/domain/AgentTemplate.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/domain/AgentTemplate.java
new file mode 100644
index 00000000..594fc219
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/domain/AgentTemplate.java
@@ -0,0 +1,116 @@
+package xiaozhi.modules.agent.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 智能体配置模板表
+ * @TableName ai_agent_template
+ */
+@TableName(value ="ai_agent_template")
+@Data
+public class AgentTemplate implements Serializable {
+ /**
+ * 智能体唯一标识
+ */
+ @TableId
+ private String id;
+
+ /**
+ * 智能体编码
+ */
+ private String agentCode;
+
+ /**
+ * 智能体名称
+ */
+ private String agentName;
+
+ /**
+ * 语音识别模型标识
+ */
+ private String asrModelId;
+
+ /**
+ * 语音活动检测标识
+ */
+ private String vadModelId;
+
+ /**
+ * 大语言模型标识
+ */
+ private String llmModelId;
+
+ /**
+ * 语音合成模型标识
+ */
+ private String ttsModelId;
+
+ /**
+ * 音色标识
+ */
+ private String ttsVoiceId;
+
+ /**
+ * 记忆模型标识
+ */
+ private String memoryModelId;
+
+ /**
+ * 意图模型标识
+ */
+ private String intentModelId;
+
+ /**
+ * 角色设定参数
+ */
+ private String systemPrompt;
+
+ /**
+ * 语言编码
+ */
+ private String langCode;
+
+ /**
+ * 交互语种
+ */
+ private String language;
+
+ /**
+ * 排序权重
+ */
+ private Integer sort;
+
+ /**
+ * 是否默认模板:1:是,0:不是
+ */
+ private Integer isDefault;
+
+ /**
+ * 创建者 ID
+ */
+ private Long creator;
+
+ /**
+ * 创建时间
+ */
+ private Date createdAt;
+
+ /**
+ * 更新者 ID
+ */
+ private Long updater;
+
+ /**
+ * 更新时间
+ */
+ private Date updatedAt;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentCreateDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentCreateDTO.java
deleted file mode 100644
index 302a55fb..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentCreateDTO.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package xiaozhi.modules.agent.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 智能体创建DTO
- * 专用于新增智能体,不包含id、agentCode和sort字段,这些字段由系统自动生成/设置默认值
- */
-@Data
-@Schema(description = "智能体创建对象")
-public class AgentCreateDTO implements Serializable {
- private static final long serialVersionUID = 1L;
-
- @Schema(description = "智能体名称", example = "客服助手")
- @NotBlank(message = "智能体名称不能为空")
- private String agentName;
-
- @Schema(description = "语音识别模型标识", example = "asr_model_01")
- private String asrModelId;
-
- @Schema(description = "语音活动检测标识", example = "vad_model_01")
- private String vadModelId;
-
- @Schema(description = "大语言模型标识", example = "llm_model_01")
- private String llmModelId;
-
- @Schema(description = "语音合成模型标识", example = "tts_model_01")
- private String ttsModelId;
-
- @Schema(description = "音色标识", example = "voice_01")
- private String ttsVoiceId;
-
- @Schema(description = "记忆模型标识", example = "mem_model_01")
- private String memModelId;
-
- @Schema(description = "意图模型标识", example = "intent_model_01")
- private String intentModelId;
-
- @Schema(description = "角色设定参数", example = "你是一个专业的客服助手,负责回答用户问题")
- private String systemPrompt;
-
- @Schema(description = "语言编码", example = "zh_CN")
- private String langCode;
-
- @Schema(description = "交互语种", example = "中文")
- private String language;
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentUpdateDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentUpdateDTO.java
deleted file mode 100644
index 6445bdda..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentUpdateDTO.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package xiaozhi.modules.agent.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 智能体更新DTO
- * 专用于更新智能体,id字段是必需的,用于标识要更新的智能体
- * 其他字段均为非必填,只更新提供的字段
- */
-@Data
-@Schema(description = "智能体更新对象")
-public class AgentUpdateDTO implements Serializable {
- private static final long serialVersionUID = 1L;
-
- @Schema(description = "智能体唯一标识", example = "a1b2c3d4e5f6", required = true)
- @NotBlank(message = "智能体ID不能为空")
- private String id;
-
- @Schema(description = "智能体编码", example = "AGT_1234567890", required = false)
- private String agentCode;
-
- @Schema(description = "智能体名称", example = "客服助手", required = false)
- private String agentName;
-
- @Schema(description = "语音识别模型标识", example = "asr_model_02", required = false)
- private String asrModelId;
-
- @Schema(description = "语音活动检测标识", example = "vad_model_02", required = false)
- private String vadModelId;
-
- @Schema(description = "大语言模型标识", example = "llm_model_02", required = false)
- private String llmModelId;
-
- @Schema(description = "语音合成模型标识", example = "tts_model_02", required = false)
- private String ttsModelId;
-
- @Schema(description = "音色标识", example = "voice_02", required = false)
- private String ttsVoiceId;
-
- @Schema(description = "记忆模型标识", example = "mem_model_02", required = false)
- private String memModelId;
-
- @Schema(description = "意图模型标识", example = "intent_model_02", required = false)
- private String intentModelId;
-
- @Schema(description = "角色设定参数", example = "你是一个专业的客服助手,负责回答用户问题并提供帮助", required = false)
- private String systemPrompt;
-
- @Schema(description = "语言编码", example = "zh_CN", required = false)
- private String langCode;
-
- @Schema(description = "交互语种", example = "中文", required = false)
- private String language;
-
- @Schema(description = "排序", example = "1", required = false)
- private Integer sort;
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentEntity.java
deleted file mode 100644
index 6800aefb..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentEntity.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package xiaozhi.modules.agent.entity;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.util.Date;
-
-@Data
-@TableName("ai_agent")
-@Schema(description = "智能体信息")
-public class AgentEntity {
- @Schema(description = "智能体唯一标识")
- private String id;
-
- @Schema(description = "所属用户ID")
- private Long userId;
-
- @Schema(description = "智能体编码")
- private String agentCode;
-
- @Schema(description = "智能体名称")
- private String agentName;
-
- @Schema(description = "语音识别模型标识")
- private String asrModelId;
-
- @Schema(description = "语音活动检测标识")
- private String vadModelId;
-
- @Schema(description = "大语言模型标识")
- private String llmModelId;
-
- @Schema(description = "语音合成模型标识")
- private String ttsModelId;
-
- @Schema(description = "音色标识")
- private String ttsVoiceId;
-
- @Schema(description = "记忆模型标识")
- private String memModelId;
-
- @Schema(description = "意图模型标识")
- private String intentModelId;
-
- @Schema(description = "角色设定参数")
- private String systemPrompt;
-
- @Schema(description = "语言编码")
- private String langCode;
-
- @Schema(description = "交互语种")
- private String language;
-
- @Schema(description = "排序")
- private Integer sort;
-
- @Schema(description = "创建者")
- private Long creator;
-
- @Schema(description = "创建时间")
- private Date createdAt;
-
- @Schema(description = "更新者")
- private Long updater;
-
- @Schema(description = "更新时间")
- private Date updatedAt;
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/mapper/AgentMapper.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/mapper/AgentMapper.java
new file mode 100644
index 00000000..7c849280
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/mapper/AgentMapper.java
@@ -0,0 +1,20 @@
+package xiaozhi.modules.agent.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import xiaozhi.modules.agent.domain.Agent;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_agent(智能体配置表)】的数据库操作Mapper
+* @createDate 2025-03-22 11:48:18
+* @Entity xiaozhi.modules.agent.domain.Agent
+*/
+@Mapper
+public interface AgentMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/mapper/AgentTemplateMapper.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/mapper/AgentTemplateMapper.java
new file mode 100644
index 00000000..c3222cc4
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/mapper/AgentTemplateMapper.java
@@ -0,0 +1,20 @@
+package xiaozhi.modules.agent.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import xiaozhi.modules.agent.domain.AgentTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_agent_template(智能体配置模板表)】的数据库操作Mapper
+* @createDate 2025-03-22 11:48:18
+* @Entity xiaozhi.modules.agent.domain.AgentTemplate
+*/
+@Mapper
+public interface AgentTemplateMapper extends BaseMapper {
+
+}
+
+
+
+
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 76439ede..b7a7705b 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
@@ -1,25 +1,13 @@
-package xiaozhi.modules.agent.service;
-
-import xiaozhi.common.page.PageData;
-import xiaozhi.common.service.BaseService;
-import xiaozhi.modules.agent.entity.AgentEntity;
-
-import java.util.List;
-import java.util.Map;
-
-public interface AgentService extends BaseService {
- /**
- * 根据用户ID获取智能体列表
- */
- List getUserAgents(Long userId);
-
- /**
- * 管理员获取所有智能体列表(分页)
- */
- PageData adminAgentList(Map params);
-
- /**
- * 获取智能体详情
- */
- AgentEntity getAgentById(String id);
-}
\ No newline at end of file
+package xiaozhi.modules.agent.service;
+
+import xiaozhi.modules.agent.domain.Agent;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_agent(智能体配置表)】的数据库操作Service
+* @createDate 2025-03-22 11:48:18
+*/
+public interface AgentService extends IService {
+
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java
new file mode 100644
index 00000000..18849526
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java
@@ -0,0 +1,13 @@
+package xiaozhi.modules.agent.service;
+
+import xiaozhi.modules.agent.domain.AgentTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_agent_template(智能体配置模板表)】的数据库操作Service
+* @createDate 2025-03-22 11:48:18
+*/
+public interface AgentTemplateService extends IService {
+
+}
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 b41310ab..dfa3400d 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
@@ -1,64 +1,22 @@
-package xiaozhi.modules.agent.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springframework.stereotype.Service;
-import xiaozhi.common.page.PageData;
-import xiaozhi.common.service.impl.BaseServiceImpl;
-import xiaozhi.modules.agent.dao.AgentDao;
-import xiaozhi.modules.agent.entity.AgentEntity;
-import xiaozhi.modules.agent.service.AgentService;
-
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-@Service
-public class AgentServiceImpl extends BaseServiceImpl implements AgentService {
- private final AgentDao agentDao;
-
- public AgentServiceImpl(AgentDao agentDao) {
- this.agentDao = agentDao;
- }
-
- @Override
- public List getUserAgents(Long userId) {
- QueryWrapper wrapper = new QueryWrapper<>();
- wrapper.eq("user_id", userId);
- return agentDao.selectList(wrapper);
- }
-
- @Override
- public PageData adminAgentList(Map params) {
- IPage page = agentDao.selectPage(
- getPage(params, "sort", true),
- new QueryWrapper<>()
- );
- return new PageData<>(page.getRecords(), page.getTotal());
- }
-
- @Override
- public AgentEntity getAgentById(String id) {
- return agentDao.selectById(id);
- }
-
- @Override
- public boolean insert(AgentEntity entity) {
- // 如果ID为空,自动生成一个UUID作为ID
- if (entity.getId() == null || entity.getId().trim().isEmpty()) {
- entity.setId(UUID.randomUUID().toString().replace("-", ""));
- }
-
- // 如果智能体编码为空,自动生成一个带前缀的编码
- if (entity.getAgentCode() == null || entity.getAgentCode().trim().isEmpty()) {
- entity.setAgentCode("AGT_" + System.currentTimeMillis());
- }
-
- // 如果排序字段为空,设置默认值0
- if (entity.getSort() == null) {
- entity.setSort(0);
- }
-
- return super.insert(entity);
- }
-}
\ No newline at end of file
+package xiaozhi.modules.agent.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import xiaozhi.modules.agent.domain.Agent;
+import xiaozhi.modules.agent.service.AgentService;
+import xiaozhi.modules.agent.mapper.AgentMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_agent(智能体配置表)】的数据库操作Service实现
+* @createDate 2025-03-22 11:48:18
+*/
+@Service
+public class AgentServiceImpl extends ServiceImpl
+ implements AgentService{
+
+}
+
+
+
+
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java
new file mode 100644
index 00000000..112b65c0
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java
@@ -0,0 +1,22 @@
+package xiaozhi.modules.agent.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import xiaozhi.modules.agent.domain.AgentTemplate;
+import xiaozhi.modules.agent.service.AgentTemplateService;
+import xiaozhi.modules.agent.mapper.AgentTemplateMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_agent_template(智能体配置模板表)】的数据库操作Service实现
+* @createDate 2025-03-22 11:48:18
+*/
+@Service
+public class AgentTemplateServiceImpl extends ServiceImpl
+ implements AgentTemplateService{
+
+}
+
+
+
+
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentConfigVO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentConfigVO.java
new file mode 100644
index 00000000..ba1ececc
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentConfigVO.java
@@ -0,0 +1,17 @@
+package xiaozhi.modules.agent.vo;
+
+import cn.hutool.json.JSONObject;
+import lombok.Data;
+
+@Data
+public class AgentConfigVO {
+ private JSONObject selected_module;
+ private String prompt;
+ private JSONObject LLM;
+ private JSONObject TTS;
+ private JSONObject ASR;
+ private JSONObject VAD;
+ private JSONObject Memory;
+ private JSONObject Intent;
+ private String owner;
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentTemplateVO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentTemplateVO.java
new file mode 100644
index 00000000..9cd7d79d
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentTemplateVO.java
@@ -0,0 +1,14 @@
+package xiaozhi.modules.agent.vo;
+
+import lombok.Data;
+import xiaozhi.modules.agent.domain.Agent;
+import xiaozhi.modules.agent.domain.AgentTemplate;
+
+@Data
+public class AgentTemplateVO extends AgentTemplate {
+ //角色音色
+ private String ttsModelName;
+
+ //角色模型
+ private String llmModelName;
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentVO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentVO.java
new file mode 100644
index 00000000..3ffddbd7
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentVO.java
@@ -0,0 +1,19 @@
+package xiaozhi.modules.agent.vo;
+
+import lombok.Data;
+import xiaozhi.modules.agent.domain.Agent;
+
+@Data
+public class AgentVO extends Agent {
+ //角色音色
+ private String ttsModelName;
+
+ //角色明星
+ private String llmModelName;
+
+ //最近对话
+ private String lastConnectedAt;
+
+ //设备数量
+ private Long deviceCount;
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/constant/DeviceConstant.java b/main/manager-api/src/main/java/xiaozhi/modules/device/constant/DeviceConstant.java
new file mode 100644
index 00000000..5d6fb39e
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/constant/DeviceConstant.java
@@ -0,0 +1,7 @@
+package xiaozhi.modules.device.constant;
+
+public class DeviceConstant {
+
+ public static final String REDIS_KEY_PREFIX_DEVICE_ACTIVATION_CODE = "device:activation:code";
+ public static final String REDIS_KEY_PREFIX_DEVICE_ACTIVATION_MAC = "device:activation:mac";
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java
index d458e9f9..cfb51de3 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java
@@ -1,82 +1,173 @@
package xiaozhi.modules.device.controller;
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*;
-import xiaozhi.common.constant.Constant;
-import xiaozhi.common.exception.ErrorCode;
-import xiaozhi.common.page.PageData;
-import xiaozhi.common.redis.RedisKeys;
+import xiaozhi.common.controller.BaseController;
import xiaozhi.common.redis.RedisUtils;
import xiaozhi.common.user.UserDetail;
-import xiaozhi.common.utils.JsonUtils;
import xiaozhi.common.utils.Result;
-import xiaozhi.modules.device.dto.DeviceHeaderDTO;
-import xiaozhi.modules.device.dto.DeviceUnBindDTO;
-import xiaozhi.modules.device.entity.DeviceEntity;
+import xiaozhi.modules.agent.domain.Agent;
+import xiaozhi.modules.agent.service.AgentService;
+import xiaozhi.modules.device.constant.DeviceConstant;
+import xiaozhi.modules.device.domain.Device;
import xiaozhi.modules.device.service.DeviceService;
+import xiaozhi.modules.device.vo.DeviceCodeVO;
import xiaozhi.modules.security.user.SecurityUser;
-import java.util.List;
-import java.util.Map;
+import java.util.Date;
+@Slf4j
@Tag(name = "设备管理")
@AllArgsConstructor
@RestController
-@RequestMapping("/device")
-public class DeviceController {
+@RequestMapping("/user/agent/device")
+public class DeviceController extends BaseController {
+ private final AgentService agentService;
private final DeviceService deviceService;
private final RedisUtils redisUtils;
+ @GetMapping("/bind/{agentId}")
+ @Operation(summary = "已绑定设备列表")
+ @RequiresPermissions("sys:role:normal")
+ public Result> bindDeviceList(@PathVariable String agentId, @RequestParam Integer pageNo, @RequestParam Integer pageSize) {
+ if (StringUtils.isBlank(agentId)) {
+ log.error("智能体ID不能为空");
+ return new Result().error("智能体ID不能为空");
+ }
- @PostMapping("/bind/{deviceCode}")
+ UserDetail user = SecurityUser.getUser();
+ Agent agent = agentService.getById(agentId);
+ if (ObjectUtils.isNull(agent)) {
+ log.error("智能体不存在");
+ return new Result().error("智能体不存在");
+ }
+ Page page = new Page(pageNo, pageSize);
+ page = deviceService.page(page, new QueryWrapper().eq("user_id", user.getId()).eq("agent_id", agentId));
+ return new Result>().ok(page);
+ }
+
+
+ @PostMapping("/bind/{agentId}")
@Operation(summary = "绑定设备")
@RequiresPermissions("sys:role:normal")
- public Result bindDevice(@PathVariable String deviceCode) {
- UserDetail user = SecurityUser.getUser();
-
- String deviceHeaders = (String) redisUtils.get(RedisKeys.getDeviceCaptchaKey(deviceCode));
- if (StringUtils.isBlank(deviceHeaders)) {
- return new Result().error(ErrorCode.DEVICE_CAPTCHA_ERROR);
+ public Result bindDevice(@PathVariable String agentId, @RequestBody DeviceCodeVO deviceCodeVO) {
+ if (ObjectUtils.isNull(deviceCodeVO) || StringUtils.isBlank(deviceCodeVO.getDeviceCode())) {
+ log.error("授权码不能为空");
+ return new Result().error("授权码不能为空");
+ }
+ if (StringUtils.isBlank(agentId)) {
+ log.error("智能体ID不能为空");
+ return new Result().error("智能体ID不能为空");
}
- DeviceHeaderDTO deviceHeader = JsonUtils.parseObject(deviceHeaders.getBytes(), DeviceHeaderDTO.class);
- DeviceEntity device = deviceService.bindDevice(user.getId(), deviceHeader);
- return new Result().ok(device);
- }
- @GetMapping("/bind")
- @Operation(summary = "获取已绑定设备")
- @RequiresPermissions("sys:role:normal")
- public Result> getUserDevices() {
UserDetail user = SecurityUser.getUser();
- List devices = deviceService.getUserDevices(user.getId());
- return new Result>().ok(devices);
+
+ // 从 Redis 中获取设备信息
+ Object redisValue = redisUtils.hGet(DeviceConstant.REDIS_KEY_PREFIX_DEVICE_ACTIVATION_CODE, deviceCodeVO.getDeviceCode());
+ if (ObjectUtils.isNull(redisValue)) {
+ log.error("授权码不存在:{}", deviceCodeVO.getDeviceCode());
+ return new Result().error("授权码不存在");
+ }
+ JSONObject jsonObject = (JSONObject) redisValue;
+ try {
+ redisUtils.hDel(DeviceConstant.REDIS_KEY_PREFIX_DEVICE_ACTIVATION_CODE, deviceCodeVO.getDeviceCode());
+ redisUtils.hDel(DeviceConstant.REDIS_KEY_PREFIX_DEVICE_ACTIVATION_MAC, jsonObject.getStr("mac_address").toUpperCase());
+ } catch (Exception e) {
+ log.warn("授权缓存删除失败", e);
+ }
+ JSONObject board = jsonObject.getJSONObject("board");
+ JSONObject application = jsonObject.getJSONObject("application");
+ if (ObjectUtils.isNull(board) || ObjectUtils.isNull(application)) {
+ log.error("设备码绑定信息无效,{}:{}", jsonObject.getStr("mac_address").toUpperCase(), deviceCodeVO.getDeviceCode());
+ return new Result().error("设备码绑定信息无效");
+ }
+
+ Agent agent = agentService.getById(agentId);
+ if (ObjectUtils.isNull(agent)) {
+ log.error("智能体不存在");
+ return new Result().error("智能体不存在");
+ }
+ Device device = new Device();
+ device.setId(jsonObject.getStr("uuid").replace("-", ""));
+ device.setUserId(user.getId());
+ device.setMacAddress(jsonObject.getStr("mac_address").toUpperCase());
+ device.setBoard(board.getStr("type"));
+ device.setAppVersion(application.getStr("version"));
+ device.setAgentId(agentId);
+ device.setCreator(user.getId());
+ device.setCreateDate(new Date());
+ device.setAutoUpdate(1);
+ boolean bool = deviceService.save(device);
+ if (!bool) {
+ return new Result().error("绑定失败");
+ }
+ return new Result().ok(device);
}
- @PostMapping("/unbind")
+ @PutMapping("/unbind/{deviceId}")
@Operation(summary = "解绑设备")
@RequiresPermissions("sys:role:normal")
- public Result unbindDevice(@RequestBody DeviceUnBindDTO unDeviveBind) {
- UserDetail user = SecurityUser.getUser();
- deviceService.unbindDevice(user.getId(), unDeviveBind.getDeviceId());
- return new Result();
+ public Result bindDevice(@PathVariable String deviceId) {
+ if (StringUtils.isBlank(deviceId)) {
+ log.error("设备ID不能为空");
+ return new Result().error("设备ID不能为空");
+ }
+ boolean bool = deviceService.removeById(deviceId);
+ if (!bool) {
+ return new Result().error("解绑失败");
+ }
+ return new Result().ok(null);
}
- @GetMapping("/all")
- @Operation(summary = "设备列表(管理员)")
- @RequiresPermissions("sys:role:superAdmin")
- @Parameters({
- @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
- @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
- })
- public Result> adminDeviceList(
- @Parameter(hidden = true) @RequestParam Map params) {
- PageData page = deviceService.adminDeviceList(params);
- return new Result>().ok(page);
+ @PostMapping("/autoUpdate/{deviceId}")
+ @Operation(summary = "切换设备OTA升级状态")
+ @RequiresPermissions("sys:role:normal")
+ public Result toggleAutoUpdate(@PathVariable String deviceId, @RequestBody Device device) {
+ if (StringUtils.isBlank(deviceId)) {
+ log.error("设备ID不能为空");
+ return new Result().error("设备ID不能为空");
+ }
+ UserDetail user = SecurityUser.getUser();
+ boolean bool = deviceService.update(
+ new UpdateWrapper().eq("id", deviceId)
+ .set("auto_update", device.getAutoUpdate())
+ .set("updater", user.getId())
+ .set("update_date", new Date())
+ );
+ if (!bool) {
+ return new Result().error("切换设备OTA升级状态失败");
+ }
+ return new Result().ok(null);
+ }
+
+ @PostMapping("/alias/{deviceId}")
+ @Operation(summary = "设置设备别名")
+ @RequiresPermissions("sys:role:normal")
+ public Result setAlias(@PathVariable String deviceId, @RequestBody Device device) {
+ if (StringUtils.isBlank(deviceId)) {
+ log.error("设备ID不能为空");
+ return new Result().error("设备ID不能为空");
+ }
+ UserDetail user = SecurityUser.getUser();
+ boolean bool = deviceService.update(
+ new UpdateWrapper().eq("id", deviceId)
+ .set("alias", device.getAlias())
+ .set("updater", user.getId())
+ .set("update_date", new Date())
+ );
+ if (!bool) {
+ return new Result().error("设置设备别名失败");
+ }
+ return new Result().ok(null);
}
}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java
deleted file mode 100644
index 9e4a8cd4..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package xiaozhi.modules.device.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-import xiaozhi.modules.device.entity.DeviceEntity;
-
-@Mapper
-public interface DeviceDao extends BaseMapper {
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/domain/Device.java b/main/manager-api/src/main/java/xiaozhi/modules/device/domain/Device.java
new file mode 100644
index 00000000..ae662dde
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/domain/Device.java
@@ -0,0 +1,91 @@
+package xiaozhi.modules.device.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 设备信息表
+ * @TableName ai_device
+ */
+@TableName(value ="ai_device")
+@Data
+public class Device implements Serializable {
+ /**
+ * 设备唯一标识
+ */
+ @TableId
+ private String id;
+
+ /**
+ * 关联用户 ID
+ */
+ private Long userId;
+
+ /**
+ * MAC 地址
+ */
+ private String macAddress;
+
+ /**
+ * 最后连接时间
+ */
+ private Date lastConnectedAt;
+
+ /**
+ * 自动更新开关(0 关闭/1 开启)
+ */
+ private Integer autoUpdate;
+
+ /**
+ * 设备硬件型号
+ */
+ private String board;
+
+ /**
+ * 设备别名
+ */
+ private String alias;
+
+ /**
+ * 智能体 ID
+ */
+ private String agentId;
+
+ /**
+ * 固件版本号
+ */
+ private String appVersion;
+
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ /**
+ * 创建者
+ */
+ private Long creator;
+
+ /**
+ * 创建时间
+ */
+ private Date createDate;
+
+ /**
+ * 更新者
+ */
+ private Long updater;
+
+ /**
+ * 更新时间
+ */
+ private Date updateDate;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceHeaderDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceHeaderDTO.java
deleted file mode 100644
index 83327fef..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceHeaderDTO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package xiaozhi.modules.device.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Data
-@Schema(description = "设备连接头信息")
-public class DeviceHeaderDTO {
-
- @Schema(description = "设备ID")
- private String deviceId;
-
- @Schema(description = "协议版本号")
- private Long protocolVersion;
-
- @Schema(description = "认证信息")
- private String authorization;
-
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java
deleted file mode 100644
index 830a51ae..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package xiaozhi.modules.device.dto;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 设备解绑表单
- */
-@Data
-@Schema(description = "设备解绑表单")
-public class DeviceUnBindDTO implements Serializable {
-
- @Schema(description = "设备ID")
- @NotBlank(message = "设备ID不能为空")
- private Long deviceId;
-
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java
deleted file mode 100644
index ccbe4683..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package xiaozhi.modules.device.entity;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.util.Date;
-
-@Data
-@TableName("ai_device")
-@Schema(description = "设备信息")
-public class DeviceEntity {
- @Schema(description = "设备ID")
- private Long id;
-
- @Schema(description = "关联用户ID")
- private Long userId;
-
- @Schema(description = "MAC地址")
- private String macAddress;
-
- @Schema(description = "最后连接时间")
- private Date lastConnectedAt;
-
- @Schema(description = "自动更新开关(0关闭/1开启)")
- private Integer autoUpdate;
-
- @Schema(description = "设备硬件型号")
- private String board;
-
- @Schema(description = "设备别名")
- private String alias;
-
- @Schema(description = "智能体ID")
- private String agentId;
-
- @Schema(description = "固件版本号")
- private String appVersion;
-
- @Schema(description = "排序")
- private Integer sort;
-
- @Schema(description = "创建者")
- private Long creator;
-
- @Schema(description = "创建时间")
- private Date createDate;
-
- @Schema(description = "更新者")
- private Long updater;
-
- @Schema(description = "更新时间")
- private Date updateDate;
-}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/mapper/DeviceMapper.java b/main/manager-api/src/main/java/xiaozhi/modules/device/mapper/DeviceMapper.java
new file mode 100644
index 00000000..b43847a5
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/mapper/DeviceMapper.java
@@ -0,0 +1,20 @@
+package xiaozhi.modules.device.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import xiaozhi.modules.device.domain.Device;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_device(设备信息表)】的数据库操作Mapper
+* @createDate 2025-03-22 13:26:35
+* @Entity xiaozhi.modules.device.domain.Device
+*/
+@Mapper
+public interface DeviceMapper extends BaseMapper {
+
+}
+
+
+
+
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 16ad44fe..ec3efe56 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
@@ -1,18 +1,13 @@
-package xiaozhi.modules.device.service;
-
-import xiaozhi.common.page.PageData;
-import xiaozhi.modules.device.dto.DeviceHeaderDTO;
-import xiaozhi.modules.device.entity.DeviceEntity;
-
-import java.util.List;
-import java.util.Map;
-
-public interface DeviceService {
- DeviceEntity bindDevice(Long userId, DeviceHeaderDTO deviceHeader);
-
- List getUserDevices(Long userId);
-
- void unbindDevice(Long userId, Long deviceId);
-
- PageData adminDeviceList(Map params);
-}
\ No newline at end of file
+package xiaozhi.modules.device.service;
+
+import xiaozhi.modules.device.domain.Device;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_device(设备信息表)】的数据库操作Service
+* @createDate 2025-03-22 13:26:35
+*/
+public interface DeviceService extends IService {
+
+}
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 279a9f2e..4c317a64 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
@@ -1,57 +1,22 @@
-package xiaozhi.modules.device.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springframework.stereotype.Service;
-import xiaozhi.common.page.PageData;
-import xiaozhi.common.service.impl.BaseServiceImpl;
-import xiaozhi.modules.device.dao.DeviceDao;
-import xiaozhi.modules.device.dto.DeviceHeaderDTO;
-import xiaozhi.modules.device.entity.DeviceEntity;
-import xiaozhi.modules.device.service.DeviceService;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-@Service
-public class DeviceServiceImpl extends BaseServiceImpl implements DeviceService {
- private final DeviceDao deviceDao;
-
- // 添加构造函数来初始化 deviceMapper
- public DeviceServiceImpl(DeviceDao deviceDao) {
- this.deviceDao = deviceDao;
- }
-
- @Override
- public DeviceEntity bindDevice(Long userId, DeviceHeaderDTO deviceHeader) {
- DeviceEntity device = new DeviceEntity();
- device.setUserId(userId);
- device.setMacAddress(deviceHeader.getDeviceId());
- device.setCreateDate(new Date());
- deviceDao.insert(device);
- return device;
- }
-
- @Override
- public List getUserDevices(Long userId) {
- QueryWrapper wrapper = new QueryWrapper<>();
- wrapper.eq("user_id", userId);
- return deviceDao.selectList(wrapper);
- }
-
- @Override
- public void unbindDevice(Long userId, Long deviceId) {
- deviceDao.deleteById(deviceId);
- }
-
- @Override
- public PageData adminDeviceList(Map params) {
- IPage page = deviceDao.selectPage(
- getPage(params, "sort", true),
- new QueryWrapper<>()
- );
- return new PageData<>(page.getRecords(), page.getTotal());
- }
-
-}
\ No newline at end of file
+package xiaozhi.modules.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import xiaozhi.modules.device.domain.Device;
+import xiaozhi.modules.device.service.DeviceService;
+import xiaozhi.modules.device.mapper.DeviceMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_device(设备信息表)】的数据库操作Service实现
+* @createDate 2025-03-22 13:26:35
+*/
+@Service
+public class DeviceServiceImpl extends ServiceImpl
+ implements DeviceService{
+
+}
+
+
+
+
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/utils/CodeGeneratorUtil.java b/main/manager-api/src/main/java/xiaozhi/modules/device/utils/CodeGeneratorUtil.java
new file mode 100644
index 00000000..3a9ca2e6
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/utils/CodeGeneratorUtil.java
@@ -0,0 +1,68 @@
+package xiaozhi.modules.device.utils;
+
+import java.util.Random;
+
+public class CodeGeneratorUtil {
+
+ private static long lastTime = 0;
+ private static int counter = 0;
+
+ /**
+ * 生成6位数字码,首位不为0,短期内不会重复。
+ * @return 6位数字码
+ */
+ public static synchronized String generateCode() {
+ long currentTime = System.currentTimeMillis();
+
+ // 如果当前时间与上次相同,增加计数器以避免重复
+ if (currentTime == lastTime) {
+ counter++;
+ } else {
+ counter = 0; // 时间变化时重置计数器
+ }
+ lastTime = currentTime;
+
+ // 使用当前时间和计数器生成随机种子
+ long seed = currentTime + counter;
+ Random random = new Random(seed);
+
+ // 确保首位不为0
+ int firstDigit = random.nextInt(9) + 1;
+ int remainingDigits = random.nextInt(100000); // 剩余5位
+
+ // 拼接生成的6位数字码
+ return String.format("%d%05d", firstDigit, remainingDigits);
+ }
+
+ /**
+ * 生成指定位数的数字码,首位不为0,短期内不会重复。
+ * @param digits 生成的数字码位数
+ * @return 指定位数的数字码
+ */
+ public static synchronized String generateCode(int digits) {
+ if (digits < 2) {
+ throw new IllegalArgumentException("数字码位数必须大于等于2");
+ }
+
+ long currentTime = System.currentTimeMillis();
+
+ // 如果当前时间与上次相同,增加计数器以避免重复
+ if (currentTime == lastTime) {
+ counter++;
+ } else {
+ counter = 0; // 时间变化时重置计数器
+ }
+ lastTime = currentTime;
+
+ // 使用当前时间和计数器生成随机种子
+ long seed = currentTime + counter;
+ Random random = new Random(seed);
+
+ // 确保首位不为0
+ int firstDigit = random.nextInt(9) + 1;
+ int remainingDigits = random.nextInt((int) Math.pow(10, digits - 1)); // 剩余位数
+
+ // 拼接生成的动态位数数字码
+ return String.format("%d%0" + (digits - 1) + "d", firstDigit, remainingDigits);
+ }
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceCodeVO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceCodeVO.java
new file mode 100644
index 00000000..a27568cc
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceCodeVO.java
@@ -0,0 +1,8 @@
+package xiaozhi.modules.device.vo;
+
+import lombok.Data;
+
+@Data
+public class DeviceCodeVO {
+ private String deviceCode;
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceOtaVO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceOtaVO.java
new file mode 100644
index 00000000..c5af75af
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceOtaVO.java
@@ -0,0 +1,55 @@
+package xiaozhi.modules.device.vo;
+
+import lombok.Data;
+
+@Data
+public class DeviceOtaVO {
+ private Activation activation;
+ private Mqtt mqtt;
+ private ServerTime server_time;
+ private Firmware firmware;
+ private String error;
+
+ @Data
+ public static class Activation {
+ private String code;
+ private String message;
+
+ public Activation() {
+ }
+ public Activation(String code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+ }
+
+ @Data
+ public class Mqtt {
+
+ }
+
+ @Data
+ public static class ServerTime {
+ private Long timestamp;
+ private Integer timezone_offset;
+
+ public ServerTime() {
+ }
+ public ServerTime(Long timestamp, Integer timezone_offset) {
+ this.timestamp = timestamp;
+ this.timezone_offset = timezone_offset;
+ }
+ }
+
+ @Data
+ public static class Firmware {
+ private String version;
+ private String url;
+ public Firmware() {
+ }
+ public Firmware(String version, String url) {
+ this.version = version;
+ this.url = url;
+ }
+ }
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/Conflict_ModelController.java b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/Conflict_ModelController.java
new file mode 100644
index 00000000..1524d8bc
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/Conflict_ModelController.java
@@ -0,0 +1,106 @@
+package xiaozhi.modules.model.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.*;
+import xiaozhi.common.page.PageData;
+import xiaozhi.common.utils.Result;
+import xiaozhi.modules.model.dto.ModelConfigBodyDTO;
+import xiaozhi.modules.model.dto.ModelConfigDTO;
+import xiaozhi.modules.model.dto.ModelProviderDTO;
+import xiaozhi.modules.model.service.Conflict_ModelConfigService;
+import xiaozhi.modules.model.service.Conflict_ModelProviderService;
+
+import java.util.List;
+
+@AllArgsConstructor
+@RestController
+@RequestMapping("/models")
+@Tag(name = "模型配置")
+public class Conflict_ModelController {
+
+ private final Conflict_ModelProviderService modelProviderService;
+
+ private final Conflict_ModelConfigService modelConfigService;
+
+ @GetMapping("/models/names")
+ @Operation(summary = "获取所有模型名称")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result> getModelNames(@RequestParam String modelType,
+ @RequestParam(required = false) String modelName) {
+ List modelNameList = modelConfigService.getModelCodeList(modelType, modelName);
+ return new Result>().ok(modelNameList);
+ }
+
+ @GetMapping("/{modelType}/provideTypes")
+ @Operation(summary = "获取模型供应器列表")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result> getModelProviderList(@PathVariable String modelType) {
+ List modelProviderDTOS = modelProviderService.getListByModelType(modelType);
+ return new Result>().ok(modelProviderDTOS);
+ }
+
+ @GetMapping("/{modelType}/{provideCode}/fields")
+ @Operation(summary = "获取模型供应器字段")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result> getModelProviderFields(@PathVariable String modelType, @PathVariable String provideCode) {
+ List fieldList = modelProviderService.getFieldList(modelType, provideCode);
+ return new Result>().ok(fieldList);
+ }
+
+
+ @GetMapping("/models/list")
+ @Operation(summary = "获取模型配置列表")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result> getModelConfigList(@RequestParam String modelType,
+ @RequestParam(required = false) String modelName,
+ @RequestParam(required = false, defaultValue = "0") Integer page,
+ @RequestParam(required = false, defaultValue = "10") Integer limit) {
+ PageData pageList = modelConfigService.getPageList(modelType, modelName, page, limit);
+ return new Result>().ok(pageList);
+ }
+
+
+ @PostMapping("/models/{modelType}/{provideCode}")
+ @Operation(summary = "新增模型配置")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result addModelConfig(@PathVariable String modelType,
+ @PathVariable String provideCode,
+ @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
+ ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO);
+ return new Result().ok(modelConfigDTO);
+ }
+
+
+ @PutMapping("/models/{modelType}/{provideCode}/{id}")
+ @Operation(summary = "编辑模型配置")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result editModelConfig(@PathVariable String modelType,
+ @PathVariable String provideCode,
+ @PathVariable String id,
+ @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
+ ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO);
+ return new Result().ok(modelConfigDTO);
+ }
+
+
+ @DeleteMapping("/models/{modelType}/{provideCode}/{id}")
+ @Operation(summary = "删除模型配置")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @PathVariable String id) {
+ modelConfigService.delete(modelType, provideCode, id);
+ return new Result<>();
+ }
+
+ @GetMapping("/models/{modelName}/voices")
+ @Operation(summary = "获取模型音色")
+ @RequiresPermissions("sys:role:normal")
+ public Result> getVoiceList(@PathVariable String modelName,
+ @RequestParam(required = false) String voiceName) {
+
+ List voiceList = modelConfigService.getVoiceList(modelName, voiceName);
+ return new Result>().ok(voiceList);
+ }
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java
index f743a795..f38586dc 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java
@@ -1,106 +1,124 @@
package xiaozhi.modules.model.controller;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
-import org.springframework.web.bind.annotation.*;
-import xiaozhi.common.page.PageData;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import xiaozhi.common.controller.BaseController;
+import xiaozhi.common.redis.RedisUtils;
import xiaozhi.common.utils.Result;
-import xiaozhi.modules.model.dto.ModelConfigBodyDTO;
-import xiaozhi.modules.model.dto.ModelConfigDTO;
-import xiaozhi.modules.model.dto.ModelProviderDTO;
+import xiaozhi.modules.model.domain.ModelConfig;
+import xiaozhi.modules.model.domain.TtsVoice;
import xiaozhi.modules.model.service.ModelConfigService;
-import xiaozhi.modules.model.service.ModelProviderService;
+import xiaozhi.modules.model.service.TtsVoiceService;
import java.util.List;
+@Slf4j
+@Tag(name = "模型数据管理")
@AllArgsConstructor
@RestController
-@RequestMapping("/models")
-@Tag(name = "模型配置")
-public class ModelController {
-
- private final ModelProviderService modelProviderService;
-
+@RequestMapping("/model/")
+public class ModelController extends BaseController {
+ private final TtsVoiceService ttsVoiceService;
private final ModelConfigService modelConfigService;
- @GetMapping("/models/names")
- @Operation(summary = "获取所有模型名称")
- @RequiresPermissions("sys:role:superAdmin")
- public Result> getModelNames(@RequestParam String modelType,
- @RequestParam(required = false) String modelName) {
- List modelNameList = modelConfigService.getModelCodeList(modelType, modelName);
- return new Result>().ok(modelNameList);
- }
- @GetMapping("/{modelType}/provideTypes")
- @Operation(summary = "获取模型供应器列表")
- @RequiresPermissions("sys:role:superAdmin")
- public Result> getModelProviderList(@PathVariable String modelType) {
- List modelProviderDTOS = modelProviderService.getListByModelType(modelType);
- return new Result>().ok(modelProviderDTOS);
- }
-
- @GetMapping("/{modelType}/{provideCode}/fields")
- @Operation(summary = "获取模型供应器字段")
- @RequiresPermissions("sys:role:superAdmin")
- public Result> getModelProviderFields(@PathVariable String modelType, @PathVariable String provideCode) {
- List fieldList = modelProviderService.getFieldList(modelType, provideCode);
- return new Result>().ok(fieldList);
- }
-
-
- @GetMapping("/models/list")
- @Operation(summary = "获取模型配置列表")
- @RequiresPermissions("sys:role:superAdmin")
- public Result> getModelConfigList(@RequestParam String modelType,
- @RequestParam(required = false) String modelName,
- @RequestParam(required = false, defaultValue = "0") Integer page,
- @RequestParam(required = false,defaultValue = "10") Integer limit) {
- PageData pageList = modelConfigService.getPageList(modelType, modelName, page, limit);
- return new Result>().ok(pageList);
- }
-
-
- @PostMapping("/models/{modelType}/{provideCode}")
- @Operation(summary = "新增模型配置")
- @RequiresPermissions("sys:role:superAdmin")
- public Result addModelConfig(@PathVariable String modelType,
- @PathVariable String provideCode,
- @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
- ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO);
- return new Result().ok(modelConfigDTO);
- }
-
-
- @PutMapping("/models/{modelType}/{provideCode}/{id}")
- @Operation(summary = "编辑模型配置")
- @RequiresPermissions("sys:role:superAdmin")
- public Result editModelConfig(@PathVariable String modelType,
- @PathVariable String provideCode,
- @PathVariable String id,
- @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
- ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO);
- return new Result().ok(modelConfigDTO);
- }
-
-
- @DeleteMapping("/models/{modelType}/{provideCode}/{id}")
- @Operation(summary = "删除模型配置")
- @RequiresPermissions("sys:role:superAdmin")
- public Result deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @PathVariable String id) {
- modelConfigService.delete(modelType, provideCode, id);
- return new Result<>();
- }
-
- @GetMapping("/models/{modelName}/voices")
- @Operation(summary = "获取模型音色")
+ @GetMapping("/list")
+ @Operation(summary = "模型配置列表")
@RequiresPermissions("sys:role:normal")
- public Result> getVoiceList(@PathVariable String modelName,
- @RequestParam(required = false) String voiceName) {
-
- List voiceList = modelConfigService.getVoiceList(modelName, voiceName);
- return new Result>().ok(voiceList);
+ public Result> getModelList() {
+ List list = modelConfigService.list(new QueryWrapper().eq("is_enabled", 1));
+ return new Result>().ok(list);
}
-}
+
+
+// private final ModelProviderService modelProviderService;
+//
+// private final ModelConfigService modelConfigService;
+//
+// @GetMapping("/models/names")
+// @Operation(summary = "获取所有模型名称")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelNames(@RequestParam String modelType,
+// @RequestParam(required = false) String modelName) {
+// List modelNameList = modelConfigService.getModelCodeList(modelType, modelName);
+// return new Result>().ok(modelNameList);
+// }
+//
+// @GetMapping("/{modelType}/provideTypes")
+// @Operation(summary = "获取模型供应器列表")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelProviderList(@PathVariable String modelType) {
+// List modelProviderDTOS = modelProviderService.getListByModelType(modelType);
+// return new Result>().ok(modelProviderDTOS);
+// }
+//
+// @GetMapping("/{modelType}/{provideCode}/fields")
+// @Operation(summary = "获取模型供应器字段")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelProviderFields(@PathVariable String modelType, @PathVariable String provideCode) {
+// List fieldList = modelProviderService.getFieldList(modelType, provideCode);
+// return new Result>().ok(fieldList);
+// }
+//
+//
+// @GetMapping("/models/list")
+// @Operation(summary = "获取模型配置列表")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelConfigList(@RequestParam String modelType,
+// @RequestParam(required = false) String modelName,
+// @RequestParam(required = false, defaultValue = "0") Integer page,
+// @RequestParam(required = false,defaultValue = "10") Integer limit) {
+// PageData pageList = modelConfigService.getPageList(modelType, modelName, page, limit);
+// return new Result>().ok(pageList);
+// }
+//
+//
+// @PostMapping("/models/{modelType}/{provideCode}")
+// @Operation(summary = "新增模型配置")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result addModelConfig(@PathVariable String modelType,
+// @PathVariable String provideCode,
+// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
+// ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO);
+// return new Result().ok(modelConfigDTO);
+// }
+//
+//
+// @PutMapping("/models/{modelType}/{provideCode}/{id}")
+// @Operation(summary = "编辑模型配置")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result editModelConfig(@PathVariable String modelType,
+// @PathVariable String provideCode,
+// @PathVariable String id,
+// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
+// ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO);
+// return new Result().ok(modelConfigDTO);
+// }
+//
+//
+// @DeleteMapping("/models/{modelType}/{provideCode}/{id}")
+// @Operation(summary = "删除模型配置")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @PathVariable String id) {
+// modelConfigService.delete(modelType, provideCode, id);
+// return new Result<>();
+// }
+//
+// @GetMapping("/models/{modelName}/voices")
+// @Operation(summary = "获取模型音色")
+// @RequiresPermissions("sys:role:normal")
+// public Result> getVoiceList(@PathVariable String modelName,
+// @RequestParam(required = false) String voiceName) {
+//
+// List voiceList = modelConfigService.getVoiceList(modelName, voiceName);
+// return new Result>().ok(voiceList);
+// }
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/TtsController.java b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/TtsController.java
new file mode 100644
index 00000000..0e00ce0a
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/TtsController.java
@@ -0,0 +1,124 @@
+package xiaozhi.modules.model.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.*;
+import xiaozhi.common.controller.BaseController;
+import xiaozhi.common.utils.Result;
+import xiaozhi.modules.model.domain.TtsVoice;
+import xiaozhi.modules.model.service.ModelConfigService;
+import xiaozhi.modules.model.service.TtsVoiceService;
+
+import java.util.List;
+
+@Slf4j
+@Tag(name = "模型数据管理")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/tts")
+public class TtsController extends BaseController {
+ private final TtsVoiceService ttsVoiceService;
+ private final ModelConfigService modelConfigService;
+
+ @GetMapping("/voice")
+ @Operation(summary = "音色列表")
+ @RequiresPermissions("sys:role:normal")
+ public Result> getTtsList(@RequestParam(required = false) String ttsModelId) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if (StringUtils.isNotBlank(ttsModelId)) {
+ queryWrapper.eq("ttsModelId", ttsModelId);
+ }
+ queryWrapper.orderByAsc("sort");
+ List list = ttsVoiceService.list(queryWrapper);
+ return new Result>().ok(list);
+ }
+
+
+// private final ModelProviderService modelProviderService;
+//
+// private final ModelConfigService modelConfigService;
+//
+// @GetMapping("/models/names")
+// @Operation(summary = "获取所有模型名称")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelNames(@RequestParam String modelType,
+// @RequestParam(required = false) String modelName) {
+// List modelNameList = modelConfigService.getModelCodeList(modelType, modelName);
+// return new Result>().ok(modelNameList);
+// }
+//
+// @GetMapping("/{modelType}/provideTypes")
+// @Operation(summary = "获取模型供应器列表")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelProviderList(@PathVariable String modelType) {
+// List modelProviderDTOS = modelProviderService.getListByModelType(modelType);
+// return new Result>().ok(modelProviderDTOS);
+// }
+//
+// @GetMapping("/{modelType}/{provideCode}/fields")
+// @Operation(summary = "获取模型供应器字段")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelProviderFields(@PathVariable String modelType, @PathVariable String provideCode) {
+// List fieldList = modelProviderService.getFieldList(modelType, provideCode);
+// return new Result>().ok(fieldList);
+// }
+//
+//
+// @GetMapping("/models/list")
+// @Operation(summary = "获取模型配置列表")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result> getModelConfigList(@RequestParam String modelType,
+// @RequestParam(required = false) String modelName,
+// @RequestParam(required = false, defaultValue = "0") Integer page,
+// @RequestParam(required = false,defaultValue = "10") Integer limit) {
+// PageData pageList = modelConfigService.getPageList(modelType, modelName, page, limit);
+// return new Result>().ok(pageList);
+// }
+//
+//
+// @PostMapping("/models/{modelType}/{provideCode}")
+// @Operation(summary = "新增模型配置")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result addModelConfig(@PathVariable String modelType,
+// @PathVariable String provideCode,
+// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
+// ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO);
+// return new Result().ok(modelConfigDTO);
+// }
+//
+//
+// @PutMapping("/models/{modelType}/{provideCode}/{id}")
+// @Operation(summary = "编辑模型配置")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result editModelConfig(@PathVariable String modelType,
+// @PathVariable String provideCode,
+// @PathVariable String id,
+// @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) {
+// ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO);
+// return new Result().ok(modelConfigDTO);
+// }
+//
+//
+// @DeleteMapping("/models/{modelType}/{provideCode}/{id}")
+// @Operation(summary = "删除模型配置")
+// @RequiresPermissions("sys:role:superAdmin")
+// public Result deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @PathVariable String id) {
+// modelConfigService.delete(modelType, provideCode, id);
+// return new Result<>();
+// }
+//
+// @GetMapping("/models/{modelName}/voices")
+// @Operation(summary = "获取模型音色")
+// @RequiresPermissions("sys:role:normal")
+// public Result> getVoiceList(@PathVariable String modelName,
+// @RequestParam(required = false) String voiceName) {
+//
+// List voiceList = modelConfigService.getVoiceList(modelName, voiceName);
+// return new Result>().ok(voiceList);
+// }
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/domain/ModelConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/model/domain/ModelConfig.java
new file mode 100644
index 00000000..938565f9
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/domain/ModelConfig.java
@@ -0,0 +1,91 @@
+package xiaozhi.modules.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 模型配置表
+ * @TableName ai_model_config
+ */
+@TableName(value ="ai_model_config")
+@Data
+public class ModelConfig implements Serializable {
+ /**
+ * 主键
+ */
+ @TableId
+ private String id;
+
+ /**
+ * 模型类型(Memory/ASR/VAD/LLM/TTS)
+ */
+ private String modelType;
+
+ /**
+ * 模型编码(如AliLLM、DoubaoTTS)
+ */
+ private String modelCode;
+
+ /**
+ * 模型名称
+ */
+ private String modelName;
+
+ /**
+ * 是否默认配置(0否 1是)
+ */
+ private Integer isDefault;
+
+ /**
+ * 是否启用
+ */
+ private Integer isEnabled;
+
+ /**
+ * 模型配置(JSON格式)
+ */
+ private String configJson;
+
+ /**
+ * 官方文档链接
+ */
+ private String docLink;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ /**
+ * 创建者
+ */
+ private Long creator;
+
+ /**
+ * 创建时间
+ */
+ private Date createDate;
+
+ /**
+ * 更新者
+ */
+ private Long updater;
+
+ /**
+ * 更新时间
+ */
+ private Date updateDate;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/domain/ModelProvider.java b/main/manager-api/src/main/java/xiaozhi/modules/model/domain/ModelProvider.java
new file mode 100644
index 00000000..af21ffac
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/domain/ModelProvider.java
@@ -0,0 +1,71 @@
+package xiaozhi.modules.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 模型配置表
+ * @TableName ai_model_provider
+ */
+@TableName(value ="ai_model_provider")
+@Data
+public class ModelProvider implements Serializable {
+ /**
+ * 主键
+ */
+ @TableId
+ private String id;
+
+ /**
+ * 模型类型(Memory/ASR/VAD/LLM/TTS)
+ */
+ private String modelType;
+
+ /**
+ * 供应器类型
+ */
+ private String providerCode;
+
+ /**
+ * 供应器名称
+ */
+ private String name;
+
+ /**
+ * 供应器字段列表(JSON格式)
+ */
+ private Object fields;
+
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ /**
+ * 创建者
+ */
+ private Long creator;
+
+ /**
+ * 创建时间
+ */
+ private Date createDate;
+
+ /**
+ * 更新者
+ */
+ private Long updater;
+
+ /**
+ * 更新时间
+ */
+ private Date updateDate;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/domain/TtsVoice.java b/main/manager-api/src/main/java/xiaozhi/modules/model/domain/TtsVoice.java
new file mode 100644
index 00000000..744bd6e8
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/domain/TtsVoice.java
@@ -0,0 +1,81 @@
+package xiaozhi.modules.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * TTS 音色表
+ * @TableName ai_tts_voice
+ */
+@TableName(value ="ai_tts_voice")
+@Data
+public class TtsVoice implements Serializable {
+ /**
+ * 主键
+ */
+ @TableId
+ private String id;
+
+ /**
+ * 对应 TTS 模型主键
+ */
+ private String ttsModelId;
+
+ /**
+ * 音色名称
+ */
+ private String name;
+
+ /**
+ * 音色编码
+ */
+ private String ttsVoice;
+
+ /**
+ * 语言
+ */
+ private String languages;
+
+ /**
+ * 音色 Demo
+ */
+ private String voiceDemo;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ /**
+ * 创建者
+ */
+ private Long creator;
+
+ /**
+ * 创建时间
+ */
+ private Date createDate;
+
+ /**
+ * 更新者
+ */
+ private Long updater;
+
+ /**
+ * 更新时间
+ */
+ private Date updateDate;
+
+ @TableField(exist = false)
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/ModelConfigMapper.java b/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/ModelConfigMapper.java
new file mode 100644
index 00000000..0bbf4ca8
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/ModelConfigMapper.java
@@ -0,0 +1,20 @@
+package xiaozhi.modules.model.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import xiaozhi.modules.model.domain.ModelConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_model_config(模型配置表)】的数据库操作Mapper
+* @createDate 2025-03-22 15:31:57
+* @Entity xiaozhi.modules.model.domain.ModelConfig
+*/
+@Mapper
+public interface ModelConfigMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/ModelProviderMapper.java b/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/ModelProviderMapper.java
new file mode 100644
index 00000000..f3fa01ce
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/ModelProviderMapper.java
@@ -0,0 +1,20 @@
+package xiaozhi.modules.model.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import xiaozhi.modules.model.domain.ModelProvider;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_model_provider(模型配置表)】的数据库操作Mapper
+* @createDate 2025-03-24 18:24:13
+* @Entity xiaozhi.modules.model.domain.ModelProvider
+*/
+@Mapper
+public interface ModelProviderMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/TtsVoiceMapper.java b/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/TtsVoiceMapper.java
new file mode 100644
index 00000000..c4ec5089
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/mapper/TtsVoiceMapper.java
@@ -0,0 +1,20 @@
+package xiaozhi.modules.model.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import xiaozhi.modules.model.domain.TtsVoice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author chenerlei
+* @description 针对表【ai_tts_voice(TTS 音色表)】的数据库操作Mapper
+* @createDate 2025-03-22 15:31:57
+* @Entity xiaozhi.modules.model.domain.TtsVoice
+*/
+@Mapper
+public interface TtsVoiceMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/Conflict_ModelConfigService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/Conflict_ModelConfigService.java
new file mode 100644
index 00000000..8ce94539
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/Conflict_ModelConfigService.java
@@ -0,0 +1,22 @@
+package xiaozhi.modules.model.service;
+
+import xiaozhi.common.page.PageData;
+import xiaozhi.modules.model.dto.ModelConfigBodyDTO;
+import xiaozhi.modules.model.dto.ModelConfigDTO;
+
+import java.util.List;
+
+public interface Conflict_ModelConfigService {
+
+ List getModelCodeList(String modelType, String modelName);
+
+ PageData getPageList(String modelType, String modelName, Integer page, Integer limit);
+
+ ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO);
+
+ ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO);
+
+ void delete(String modelType, String provideCode, String id);
+
+ List getVoiceList(String modelName, String voiceName);
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/Conflict_ModelProviderService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/Conflict_ModelProviderService.java
new file mode 100644
index 00000000..47b70cbf
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/Conflict_ModelProviderService.java
@@ -0,0 +1,23 @@
+package xiaozhi.modules.model.service;
+
+import xiaozhi.modules.model.dto.ModelProviderDTO;
+import xiaozhi.modules.model.entity.ModelProviderEntity;
+
+import java.util.List;
+
+public interface Conflict_ModelProviderService {
+
+// List getModelNames(String modelType, String modelName);
+
+ List getListByModelType(String modelType);
+
+ ModelProviderDTO add(ModelProviderEntity modelProviderEntity);
+
+ ModelProviderDTO edit(ModelProviderEntity modelProviderEntity);
+
+ void delete();
+
+ List getList(String modelType, String provideCode);
+
+ List getFieldList(String modelType, String provideCode);
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java
index 1911be78..25a7be88 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java
@@ -1,22 +1,13 @@
package xiaozhi.modules.model.service;
-import xiaozhi.common.page.PageData;
-import xiaozhi.modules.model.dto.ModelConfigBodyDTO;
-import xiaozhi.modules.model.dto.ModelConfigDTO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import xiaozhi.modules.model.domain.ModelConfig;
-import java.util.List;
+/**
+ * @author chenerlei
+ * @description 针对表【ai_model_config(模型配置表)】的数据库操作Service
+ * @createDate 2025-03-22 15:31:57
+ */
+public interface ModelConfigService extends IService {
-public interface ModelConfigService {
-
- List getModelCodeList(String modelType, String modelName);
-
- PageData getPageList(String modelType, String modelName, Integer page, Integer limit);
-
- ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO);
-
- ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO);
-
- void delete(String modelType, String provideCode, String id);
-
- List getVoiceList(String modelName, String voiceName);
}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java
index d0d221cf..d5a76615 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java
@@ -1,23 +1,13 @@
package xiaozhi.modules.model.service;
-import xiaozhi.modules.model.dto.ModelProviderDTO;
-import xiaozhi.modules.model.entity.ModelProviderEntity;
+import com.baomidou.mybatisplus.extension.service.IService;
+import xiaozhi.modules.model.domain.ModelProvider;
-import java.util.List;
+/**
+ * @author chenerlei
+ * @description 针对表【ai_model_provider(模型配置表)】的数据库操作Service
+ * @createDate 2025-03-24 18:24:13
+ */
+public interface ModelProviderService extends IService {
-public interface ModelProviderService {
-
-// List getModelNames(String modelType, String modelName);
-
- List getListByModelType(String modelType);
-
- ModelProviderDTO add(ModelProviderEntity modelProviderEntity);
-
- ModelProviderDTO edit(ModelProviderEntity modelProviderEntity);
-
- void delete();
-
- List getList(String modelType, String provideCode);
-
- List getFieldList(String modelType, String provideCode);
}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/TtsVoiceService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/TtsVoiceService.java
new file mode 100644
index 00000000..b5a6ecb3
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/TtsVoiceService.java
@@ -0,0 +1,13 @@
+package xiaozhi.modules.model.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import xiaozhi.modules.model.domain.TtsVoice;
+
+/**
+ * @author chenerlei
+ * @description 针对表【ai_tts_voice(TTS 音色表)】的数据库操作Service
+ * @createDate 2025-03-22 15:31:57
+ */
+public interface TtsVoiceService extends IService {
+
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/Conflict_ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/Conflict_ModelConfigServiceImpl.java
new file mode 100644
index 00000000..696df42a
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/Conflict_ModelConfigServiceImpl.java
@@ -0,0 +1,124 @@
+package xiaozhi.modules.model.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import xiaozhi.common.constant.Constant;
+import xiaozhi.common.exception.RenException;
+import xiaozhi.common.page.PageData;
+import xiaozhi.common.service.impl.BaseServiceImpl;
+import xiaozhi.common.utils.ConvertUtils;
+import xiaozhi.modules.model.dao.ModelConfigDao;
+import xiaozhi.modules.model.dto.ModelConfigBodyDTO;
+import xiaozhi.modules.model.dto.ModelConfigDTO;
+import xiaozhi.modules.model.dto.ModelProviderDTO;
+import xiaozhi.modules.model.entity.ModelConfigEntity;
+import xiaozhi.modules.model.service.Conflict_ModelConfigService;
+import xiaozhi.modules.model.service.Conflict_ModelProviderService;
+import xiaozhi.modules.timbre.service.TimbreService;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@AllArgsConstructor
+public class Conflict_ModelConfigServiceImpl extends BaseServiceImpl implements Conflict_ModelConfigService {
+
+ private final ModelConfigDao modelConfigDao;
+ private final Conflict_ModelProviderService modelProviderService;
+ private final TimbreService timbreService;
+
+ private static final Logger logger = LoggerFactory.getLogger(ModelConfigServiceImpl.class);
+
+ @Override
+ public List getModelCodeList(String modelType, String modelName) {
+ return modelConfigDao.getModelCodeList(modelType, modelName);
+ }
+
+ @Override
+ public PageData getPageList(String modelType, String modelName, Integer page, Integer limit) {
+ Map params = new HashMap();
+ params.put(Constant.PAGE, page);
+ params.put(Constant.LIMIT, limit);
+ IPage modelConfigEntityIPage = modelConfigDao.selectPage(
+ getPage(params, "sort", true),
+ new QueryWrapper()
+ .eq("model_type", modelType)
+ .like(StringUtils.isNotBlank(modelName), "model_name", modelName)
+ );
+ return getPageData(modelConfigEntityIPage, ModelConfigDTO.class);
+ }
+
+ @Override
+ public ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO) {
+ // 先验证有没有供应器
+ if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
+ throw new RenException("modelType和provideCode不能为空");
+ }
+ List providerList = modelProviderService.getList(modelType, provideCode);
+ if (CollectionUtil.isEmpty(providerList)) {
+ throw new RenException("供应器不存在");
+ }
+
+ // 再保存供应器提供的模型
+ ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(modelConfigBodyDTO, ModelConfigEntity.class);
+ modelConfigEntity.setModelType(modelType);
+ modelConfigDao.insert(modelConfigEntity);
+ return ConvertUtils.sourceToTarget(modelConfigEntity, ModelConfigDTO.class);
+ }
+
+ @Override
+ public ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO) {
+ // 先验证有没有供应器
+ if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
+ throw new RenException("modelType和provideCode不能为空");
+ }
+ List providerList = modelProviderService.getList(modelType, provideCode);
+ if (CollectionUtil.isEmpty(providerList)) {
+ throw new RenException("供应器不存在");
+ }
+
+ // 再更新供应器提供的模型
+ ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(modelConfigBodyDTO, ModelConfigEntity.class);
+ modelConfigEntity.setId(id);
+ modelConfigEntity.setModelType(modelType);
+ modelConfigDao.updateById(modelConfigEntity);
+ return ConvertUtils.sourceToTarget(modelConfigEntity, ModelConfigDTO.class);
+ }
+
+ @Override
+ public void delete(String modelType, String provideCode, String id) {
+ // 先验证有没有供应器
+ if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
+ throw new RenException("modelType和provideCode不能为空");
+ }
+ List providerList = modelProviderService.getList(modelType, provideCode);
+ if (CollectionUtil.isEmpty(providerList)) {
+ throw new RenException("供应器不存在");
+ }
+
+ modelConfigDao.deleteById(Long.getLong(id));
+ }
+
+ @Override
+ public List getVoiceList(String modelName, String voiceName) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("model_name", StringUtils.isBlank(modelName) ? "" : modelName);
+ queryWrapper.eq("model_type", "TTS");
+ List modelConfigEntities = modelConfigDao.selectList(queryWrapper);
+ if (CollectionUtil.isEmpty(modelConfigEntities)) {
+ logger.warn("没有找到模型配置信息");
+ return null;
+ }
+ ModelConfigEntity modelConfigEntity = modelConfigEntities.get(0);
+ String id = modelConfigEntity.getId();
+
+ return timbreService.getVoiceNames(id, voiceName);
+ }
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/Conflict_ModelProviderServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/Conflict_ModelProviderServiceImpl.java
new file mode 100644
index 00000000..36c63d5e
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/Conflict_ModelProviderServiceImpl.java
@@ -0,0 +1,59 @@
+package xiaozhi.modules.model.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import xiaozhi.common.service.impl.BaseServiceImpl;
+import xiaozhi.common.utils.ConvertUtils;
+import xiaozhi.modules.model.dao.ModelProviderDao;
+import xiaozhi.modules.model.dto.ModelProviderDTO;
+import xiaozhi.modules.model.entity.ModelProviderEntity;
+import xiaozhi.modules.model.service.Conflict_ModelProviderService;
+
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class Conflict_ModelProviderServiceImpl extends BaseServiceImpl implements Conflict_ModelProviderService {
+
+ private final ModelProviderDao modelProviderDao;
+
+ @Override
+ public List getListByModelType(String modelType) {
+
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("model_type", StringUtils.isBlank(modelType) ? "" : modelType);
+ List providerEntities = modelProviderDao.selectList(queryWrapper);
+ return ConvertUtils.sourceToTarget(providerEntities, ModelProviderDTO.class);
+ }
+
+ @Override
+ public ModelProviderDTO add(ModelProviderEntity modelProviderEntity) {
+ return null;
+ }
+
+ @Override
+ public ModelProviderDTO edit(ModelProviderEntity modelProviderEntity) {
+ return null;
+ }
+
+ @Override
+ public void delete() {
+
+ }
+
+ @Override
+ public List getList(String modelType, String provideCode) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("model_type", StringUtils.isBlank(modelType) ? "" : modelType);
+ queryWrapper.eq("provide_code", StringUtils.isBlank(provideCode) ? "" : provideCode);
+ List providerEntities = modelProviderDao.selectList(queryWrapper);
+ return ConvertUtils.sourceToTarget(providerEntities, ModelProviderDTO.class);
+ }
+
+ @Override
+ public List