Administrator
20 hours ago 7171b917dab0b0b9a250ba8946f0f9c1d73f6bd4
feat(ai): 添加AI代理及分类实体和服务
6 files modified
9 files added
367 ■■■■■ changed files
src/main/java/cc/mrbird/febs/ai/controller/agent/ApiAgentController.java 70 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/entity/AiAgent.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/entity/AiAgentCategory.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/entity/AiAgentStartQuestion.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/mapper/AiAgentMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/mapper/AiAgentStartQuestionMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/req/agent/AiAgentInitDto.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentCategoryAllDto.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentPageDto.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/agent/AiAgentInitVo.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentCategoryVo.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentVo.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiAgentService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiAgentServiceImpl.java 88 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/AiAgentMapper.xml 21 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/controller/agent/ApiAgentController.java
New file
@@ -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);
    }
}
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;
    
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;
    
src/main/java/cc/mrbird/febs/ai/entity/AiAgentStartQuestion.java
New file
@@ -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;
}
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);
}
src/main/java/cc/mrbird/febs/ai/mapper/AiAgentStartQuestionMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/ai/req/agent/AiAgentInitDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentCategoryAllDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/ai/req/agent/ApiAgentPageDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/ai/res/agent/AiAgentInitVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentCategoryVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/ai/res/agent/ApiAgentVo.java
New file
@@ -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;
}
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);
}
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);
    }
}
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>