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