From 7171b917dab0b0b9a250ba8946f0f9c1d73f6bd4 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 08 Apr 2026 10:12:11 +0800
Subject: [PATCH] feat(ai): 添加AI代理及分类实体和服务
---
src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentPageDto.java | 28 ++++
src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentVo.java | 36 +++++
src/main/java/cc/mrbird/febs/ai/mapper/AiAgentStartQuestionMapper.java | 7 +
src/main/java/cc/mrbird/febs/ai/entity/AiAgentCategory.java | 3
src/main/resources/mapper/modules/AiAgentMapper.xml | 21 +++
src/main/java/cc/mrbird/febs/ai/mapper/AiAgentMapper.java | 7 +
src/main/java/cc/mrbird/febs/ai/service/impl/AiAgentServiceImpl.java | 88 ++++++++++++
src/main/java/cc/mrbird/febs/ai/service/AiAgentService.java | 10 +
src/main/java/cc/mrbird/febs/ai/entity/AiAgent.java | 3
src/main/java/cc/mrbird/febs/ai/req/agent/AiAgentInitDto.java | 16 ++
src/main/java/cc/mrbird/febs/ai/entity/AiAgentStartQuestion.java | 20 ++
src/main/java/cc/mrbird/febs/ai/res/agent/AiAgentInitVo.java | 26 +++
src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentCategoryAllDto.java | 13 +
src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentCategoryVo.java | 19 ++
src/main/java/cc/mrbird/febs/ai/controller/agent/ApiAgentController.java | 70 ++++++++++
15 files changed, 360 insertions(+), 7 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/agent/ApiAgentController.java b/src/main/java/cc/mrbird/febs/ai/controller/agent/ApiAgentController.java
new file mode 100644
index 0000000..6655c9f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/agent/ApiAgentController.java
@@ -0,0 +1,70 @@
+package cc.mrbird.febs.ai.controller.agent;
+
+import cc.mrbird.febs.ai.req.agent.AiAgentInitDto;
+import cc.mrbird.febs.ai.req.agent.ApiAgentCategoryAllDto;
+import cc.mrbird.febs.ai.req.agent.ApiAgentPageDto;
+import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryAllDto;
+import cc.mrbird.febs.ai.res.agent.AiAgentInitVo;
+import cc.mrbird.febs.ai.res.agent.ApiAgentCategoryVo;
+import cc.mrbird.febs.ai.res.agent.ApiAgentVo;
+import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo;
+import cc.mrbird.febs.ai.service.AiAgentService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/ai/agent")
+@Api(value = "ApiAgentController", tags = "AI-智能体")
+public class ApiAgentController {
+
+ private final AiAgentService service;
+
+ @ApiOperation(value = "全部分类(带公司ID)", notes = "全部分类(带公司ID)")
+ @ApiResponses({
+ @ApiResponse(code = 200, message = "success", response = ApiAgentCategoryVo.class)
+ })
+ @PostMapping(value = "/allCategoryList")
+ public FebsResponse allCategoryList(@RequestBody ApiAgentCategoryAllDto dto) {
+
+ return service.allCategoryList(dto);
+ }
+
+
+ @ApiOperation(value = "列表", notes = "列表")
+ @ApiResponses({
+ @ApiResponse(code = 200, message = "success", response = ApiAgentVo.class)
+ })
+ @PostMapping(value = "/list")
+ public FebsResponse list(@RequestBody @Validated ApiAgentPageDto dto) {
+
+ return service.agentList(dto);
+ }
+
+ @ApiOperation(value = "初始化智能体", notes = "初始化智能体")
+ @ApiResponses({
+ @ApiResponse(code = 200, message = "success", response = AiAgentInitVo.class)
+ })
+ @PostMapping(value = "/initAgent", produces = "application/json")
+ public FebsResponse initAgent(@RequestBody @Validated AiAgentInitDto dto) {
+
+ return service.initAgent(dto);
+ }
+
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiAgent.java b/src/main/java/cc/mrbird/febs/ai/entity/AiAgent.java
index 0d6b135..199c30b 100644
--- a/src/main/java/cc/mrbird/febs/ai/entity/AiAgent.java
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiAgent.java
@@ -8,9 +8,6 @@
@TableName("ai_agent")
public class AiAgent extends AiBaseEntity {
- /** 主键 */
- private String id;
-
/** 公司ID */
private String companyId;
diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiAgentCategory.java b/src/main/java/cc/mrbird/febs/ai/entity/AiAgentCategory.java
index 2f3efea..3c9dc55 100644
--- a/src/main/java/cc/mrbird/febs/ai/entity/AiAgentCategory.java
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiAgentCategory.java
@@ -8,9 +8,6 @@
@TableName("ai_agent_category")
public class AiAgentCategory extends AiBaseEntity {
- /** 主键 */
- private String id;
-
/** 公司ID */
private String companyId;
diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiAgentStartQuestion.java b/src/main/java/cc/mrbird/febs/ai/entity/AiAgentStartQuestion.java
new file mode 100644
index 0000000..bcc9094
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiAgentStartQuestion.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.ai.entity;
+
+import cc.mrbird.febs.common.entity.AiBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("ai_agent_start_question")
+public class AiAgentStartQuestion extends AiBaseEntity {
+
+ /** 公司ID */
+ private String companyId;
+
+ /** 代理ID */
+ private String agentId;
+
+ /** 问题内容 */
+ private String title;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiAgentMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiAgentMapper.java
index 0727c4c..0dc1fb3 100644
--- a/src/main/java/cc/mrbird/febs/ai/mapper/AiAgentMapper.java
+++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiAgentMapper.java
@@ -1,7 +1,14 @@
package cc.mrbird.febs.ai.mapper;
import cc.mrbird.febs.ai.entity.AiAgent;
+import cc.mrbird.febs.ai.req.agent.ApiAgentPageDto;
+import cc.mrbird.febs.ai.res.agent.ApiAgentVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
public interface AiAgentMapper extends BaseMapper<AiAgent> {
+
+ Page<ApiAgentVo> getPageListByQuery(Page<ApiAgentVo> page, @Param("record")ApiAgentPageDto dto);
+
}
diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiAgentStartQuestionMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiAgentStartQuestionMapper.java
new file mode 100644
index 0000000..a366100
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiAgentStartQuestionMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.ai.mapper;
+
+import cc.mrbird.febs.ai.entity.AiAgentStartQuestion;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface AiAgentStartQuestionMapper extends BaseMapper<AiAgentStartQuestion> {
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/agent/AiAgentInitDto.java b/src/main/java/cc/mrbird/febs/ai/req/agent/AiAgentInitDto.java
new file mode 100644
index 0000000..506049c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/agent/AiAgentInitDto.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.ai.req.agent;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "AiAgentInitDto", description = "参数")
+public class AiAgentInitDto {
+
+ @NotBlank(message = "智能体不能为空")
+ @ApiModelProperty(value = "智能体ID", example = "you_ke_*****")
+ private String id;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentCategoryAllDto.java b/src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentCategoryAllDto.java
new file mode 100644
index 0000000..076fbd9
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentCategoryAllDto.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.ai.req.agent;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiAgentCategoryAllDto", description = "参数")
+public class ApiAgentCategoryAllDto {
+
+ @ApiModelProperty(value = "公司ID", example = "1")
+ private String companyId;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentPageDto.java
new file mode 100644
index 0000000..da998c8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentPageDto.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.ai.req.agent;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiAgentPageDto", description = "参数")
+public class ApiAgentPageDto {
+
+ @NotNull(message = "页码不能为空")
+ @ApiModelProperty(value = "页码", example = "1")
+ private Integer pageNow;
+
+ @NotNull(message = "每页数量不能为空")
+ @ApiModelProperty(value = "每页数量", example = "10")
+ private Integer pageSize;
+
+ @ApiModelProperty(value = "分类ID", example = "123")
+ private String categoryId;
+
+ @ApiModelProperty(value = "公司ID", example = "123")
+ private String companyId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/agent/AiAgentInitVo.java b/src/main/java/cc/mrbird/febs/ai/res/agent/AiAgentInitVo.java
new file mode 100644
index 0000000..5e81d42
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/agent/AiAgentInitVo.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.ai.res.agent;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "AiAgentInitVo", description = "参数")
+public class AiAgentInitVo {
+
+ @ApiModelProperty(value = "智能体ID*", example = "1")
+ private String id;
+ @ApiModelProperty(value = "名称*", example = "1")
+ private String name;
+ @ApiModelProperty(value = "描述*", example = "1")
+ private String description;
+ @ApiModelProperty(value = "小图标*", example = "1")
+ private String iconImg;
+ @ApiModelProperty(value = "开场白*", example = "1")
+ private String introduct;
+
+ @ApiModelProperty(value = "开场白预设问题", example = "1")
+ private List<String> items;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentCategoryVo.java b/src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentCategoryVo.java
new file mode 100644
index 0000000..e65b974
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentCategoryVo.java
@@ -0,0 +1,19 @@
+package cc.mrbird.febs.ai.res.agent;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiAgentCategoryVo", description = "参数")
+public class ApiAgentCategoryVo {
+
+ @ApiModelProperty(value = "ID")
+ private String id;
+
+ /**
+ * 名称
+ */
+ @ApiModelProperty(value = "名称")
+ private String name;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentVo.java b/src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentVo.java
new file mode 100644
index 0000000..1325490
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentVo.java
@@ -0,0 +1,36 @@
+package cc.mrbird.febs.ai.res.agent;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiAgentVo", description = "参数")
+public class ApiAgentVo {
+
+ @ApiModelProperty(value = "ID")
+ private String id;
+ /**
+ * 名称
+ */
+ @ApiModelProperty(value = "ID")
+ private String name;
+
+ /**
+ * 目标
+ */
+ @ApiModelProperty(value = "描述")
+ private String description;
+
+ /**
+ * 小图标
+ */
+ @ApiModelProperty(value = "图片")
+ private String iconImg;
+
+
+ /** 开场白 */
+ @ApiModelProperty(value = "开场白")
+ private String introduct;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiAgentService.java b/src/main/java/cc/mrbird/febs/ai/service/AiAgentService.java
index 467b512..355af3b 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiAgentService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiAgentService.java
@@ -1,7 +1,17 @@
package cc.mrbird.febs.ai.service;
import cc.mrbird.febs.ai.entity.AiAgent;
+import cc.mrbird.febs.ai.req.agent.AiAgentInitDto;
+import cc.mrbird.febs.ai.req.agent.ApiAgentCategoryAllDto;
+import cc.mrbird.febs.ai.req.agent.ApiAgentPageDto;
+import cc.mrbird.febs.common.entity.FebsResponse;
import com.baomidou.mybatisplus.extension.service.IService;
public interface AiAgentService extends IService<AiAgent> {
+
+ FebsResponse allCategoryList(ApiAgentCategoryAllDto dto);
+
+ FebsResponse agentList(ApiAgentPageDto dto);
+
+ FebsResponse initAgent(AiAgentInitDto dto);
}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiAgentServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiAgentServiceImpl.java
index ece9c39..f600f6d 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiAgentServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiAgentServiceImpl.java
@@ -1,15 +1,101 @@
package cc.mrbird.febs.ai.service.impl;
-import cc.mrbird.febs.ai.entity.AiAgent;
+import cc.mrbird.febs.ai.entity.*;
+import cc.mrbird.febs.ai.enumerates.AiCommonEnum;
+import cc.mrbird.febs.ai.enumerates.ProductCategoryLevelEnum;
+import cc.mrbird.febs.ai.mapper.AiAgentCategoryMapper;
import cc.mrbird.febs.ai.mapper.AiAgentMapper;
+import cc.mrbird.febs.ai.mapper.AiAgentStartQuestionMapper;
+import cc.mrbird.febs.ai.req.agent.AiAgentInitDto;
+import cc.mrbird.febs.ai.req.agent.ApiAgentCategoryAllDto;
+import cc.mrbird.febs.ai.req.agent.ApiAgentPageDto;
+import cc.mrbird.febs.ai.res.agent.AiAgentInitVo;
+import cc.mrbird.febs.ai.res.agent.ApiAgentCategoryVo;
+import cc.mrbird.febs.ai.res.agent.ApiAgentVo;
+import cc.mrbird.febs.ai.res.product.ApiProductVo;
+import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo;
import cc.mrbird.febs.ai.service.AiAgentService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.exception.FebsException;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import java.util.List;
+
@Slf4j
@Service
@RequiredArgsConstructor
public class AiAgentServiceImpl extends ServiceImpl<AiAgentMapper, AiAgent> implements AiAgentService {
+
+ private final AiAgentMapper aiAgentMapper;
+ private final AiAgentCategoryMapper aiAgentCategoryMapper;
+ private final AiAgentStartQuestionMapper aiAgentStartQuestionMapper;
+
+ @Override
+ public FebsResponse allCategoryList(ApiAgentCategoryAllDto dto) {
+ List<ApiAgentCategoryVo> list = new ArrayList<>();
+ LambdaQueryWrapper<AiAgentCategory> query = Wrappers.lambdaQuery(AiAgentCategory.class);
+ if (StrUtil.isEmpty(dto.getCompanyId())){
+ dto.setCompanyId(AiCommonEnum.COMPANY_ID.getPrompt());
+ }
+ query.eq(AiAgentCategory::getCompanyId, dto.getCompanyId());
+ query.eq(AiAgentCategory::getState, 1);
+ query.orderByAsc(AiAgentCategory::getSort);
+ List<AiAgentCategory> listByQuery = aiAgentCategoryMapper.selectList(query);
+ if (CollUtil.isNotEmpty(listByQuery)){
+ for (AiAgentCategory entity : listByQuery){
+ ApiAgentCategoryVo vo = new ApiAgentCategoryVo();
+ vo.setId(entity.getId());
+ vo.setName(entity.getName());
+ list.add(vo);
+ }
+
+ }
+ return new FebsResponse().success().data(list);
+ }
+
+ @Override
+ public FebsResponse agentList(ApiAgentPageDto dto) {
+ // 创建分页对象,传入当前页和每页大小
+ Page<ApiAgentVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+ Page<ApiAgentVo> pageListByQuery = aiAgentMapper.getPageListByQuery(page, dto);
+ return new FebsResponse().success().data(pageListByQuery);
+ }
+
+ @Override
+ public FebsResponse initAgent(AiAgentInitDto dto) {
+ String id = dto.getId();
+
+ AiAgent aiAgent = aiAgentMapper.selectById(id);
+ if (aiAgent == null) {
+ throw new FebsException("智能体异常");
+ }
+ AiAgentInitVo vo = new AiAgentInitVo();
+ //将chatWebPlugin复制给apiInitPluginVo
+ BeanUtil.copyProperties(aiAgent, vo);
+
+ List<AiAgentStartQuestion> aiAgentStartQuestions = aiAgentStartQuestionMapper.selectList(
+ Wrappers.lambdaQuery(AiAgentStartQuestion.class)
+ .select(AiAgentStartQuestion::getTitle)
+ .eq(AiAgentStartQuestion::getAgentId, id)
+ );
+ if (CollUtil.isNotEmpty(aiAgentStartQuestions)){
+ List<String> items = new ArrayList<>();
+ for (AiAgentStartQuestion aiAgentStartQuestion : aiAgentStartQuestions) {
+ items.add(aiAgentStartQuestion.getTitle());
+ }
+ vo.setItems( items);
+ }
+
+ return new FebsResponse().success().data(vo);
+ }
}
diff --git a/src/main/resources/mapper/modules/AiAgentMapper.xml b/src/main/resources/mapper/modules/AiAgentMapper.xml
index 081c5af..f0684e8 100644
--- a/src/main/resources/mapper/modules/AiAgentMapper.xml
+++ b/src/main/resources/mapper/modules/AiAgentMapper.xml
@@ -1,4 +1,25 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cc.mrbird.febs.ai.mapper.AiAgentMapper">
+
+
+
+ <select id="getPageListByQuery" resultType="cc.mrbird.febs.ai.res.agent.ApiAgentVo">
+ select
+ a.id as id,
+ a.name as name,
+ a.description as description,
+ a.icon_img as iconImg,
+ a.introduct as introduct
+ from ai_agent a
+ <where>
+ a.state = 1
+ and a.company_id = #{record.companyId}
+ <if test="record != null">
+ <if test="record.categoryId != null and record.categoryId != ''">
+ and a.agent_category_id = #{record.categoryId}
+ </if>
+ </if>
+ </where>
+ </select>
</mapper>
\ No newline at end of file
--
Gitblit v1.9.1