From 3bfb50eb7a505c634f0d76ec12ffa68d3f281e85 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 04 Aug 2025 14:03:48 +0800
Subject: [PATCH] feat(ai): 添加 AI 产品相关接口和功能

---
 src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java |   48 +++
 src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java                 |   54 ++++
 src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java                            |   68 +++++
 src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java                                  |    5 
 src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java       |   44 +++
 src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java                           |   20 +
 src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java                           |    9 
 src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java                          |    5 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java                  |   61 ++++
 src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java           |    4 
 src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java                                |   28 ++
 src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java                           |    4 
 src/main/java/cc/mrbird/febs/ai/service/AiProductService.java                                |   15 +
 src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java                 |   20 +
 src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java                      |   22 +
 src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java                  |   45 +++
 src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java                        |   15 +
 src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java                           |   29 ++
 src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java                             |    2 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java              |    9 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java                    |   15 +
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java               |   62 ++++
 src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java                |   35 ++
 src/main/resources/mapper/modules/AiProductCategoryMapper.xml                                |   12 
 src/main/resources/mapper/modules/AiProductMapper.xml                                        |   22 +
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java                       |   64 ++++
 src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java                       |    6 
 src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java           |   27 ++
 28 files changed, 742 insertions(+), 8 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java
index 888ae6d..079a0de 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java
@@ -29,8 +29,8 @@
     @ApiResponses({
             @ApiResponse(code = 200, message = "success", response = ApiMemberRoleVo.class)
     })
-    @GetMapping(value = "/memberRoleList")
-    public FebsResponse memberRoleList() {
+    @GetMapping(value = "/list")
+    public FebsResponse list() {
         return aiMemberRoleService.memberRoleList();
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java b/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java
new file mode 100644
index 0000000..0fface7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java
@@ -0,0 +1,54 @@
+package cc.mrbird.febs.ai.controller.product;
+
+import cc.mrbird.febs.ai.req.product.ApiProductInfoDto;
+import cc.mrbird.febs.ai.req.product.ApiProductPageDto;
+import cc.mrbird.febs.ai.res.product.ApiProductInfoVo;
+import cc.mrbird.febs.ai.res.product.ApiProductVo;
+import cc.mrbird.febs.ai.service.AiProductService;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/ai/product")
+@Api(value = "ApiProductController", tags = "AI-产品")
+public class ApiProductController {
+
+    private final AiProductService aiProductService;
+
+    @ApiOperation(value = "产品列表", notes = "产品列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiProductVo.class)
+    })
+    @PostMapping(value = "/list")
+    public FebsResponse list(@RequestBody @Validated ApiProductPageDto dto) {
+
+        return aiProductService.productList(dto);
+    }
+
+    @ApiOperation(value = "产品详情", notes = "产品详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiProductInfoVo.class)
+    })
+    @PostMapping(value = "/info")
+    public FebsResponse info(@RequestBody @Validated ApiProductInfoDto dto) {
+
+        return aiProductService.productInfo(dto);
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java
new file mode 100644
index 0000000..3b82b0d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java
@@ -0,0 +1,48 @@
+package cc.mrbird.febs.ai.controller.productCategory;
+
+import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto;
+import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo;
+import cc.mrbird.febs.ai.service.AiProductCategoryService;
+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.*;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/ai/productCategory")
+@Api(value = "ApiProductCategoryController", tags = "AI-产品分类")
+public class ApiProductCategoryController {
+
+    private final AiProductCategoryService aiProductCategoryService;
+
+    @ApiOperation(value = "首页推荐", notes = "首页推荐")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiProductCategoryVo.class)
+    })
+    @GetMapping(value = "/hot")
+    public FebsResponse hot() {
+        return aiProductCategoryService.hot();
+    }
+
+
+    @ApiOperation(value = "分类列表", notes = "分类列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiProductCategoryVo.class)
+    })
+    @PostMapping(value = "/list")
+    public FebsResponse list(@RequestBody @Validated ApiProductCategoryPageDto dto) {
+
+        return aiProductCategoryService.categoryList(dto);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java b/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java
new file mode 100644
index 0000000..88ab37e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java
@@ -0,0 +1,44 @@
+package cc.mrbird.febs.ai.controller.productPoint;
+
+import cc.mrbird.febs.ai.req.product.ApiProductInfoDto;
+import cc.mrbird.febs.ai.req.productPoint.ApiProductPointInfoDto;
+import cc.mrbird.febs.ai.res.product.ApiProductInfoVo;
+import cc.mrbird.febs.ai.res.productPoint.ApiProductPointInfoVo;
+import cc.mrbird.febs.ai.service.AiProductPointService;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/ai/productPoint")
+@Api(value = "ApiProductPointController", tags = "AI-产品知识点")
+public class ApiProductPointController {
+
+    private final AiProductPointService aiProductPointService;
+
+    @ApiOperation(value = "知识点详情", notes = "知识点详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiProductPointInfoVo.class)
+    })
+    @PostMapping(value = "/info")
+    public FebsResponse info(@RequestBody @Validated ApiProductPointInfoDto dto) {
+
+        return aiProductPointService.productPointInfo(dto);
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java
index 516ec6c..9fba1b1 100644
--- a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java
+++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java
@@ -1,7 +1,11 @@
 package cc.mrbird.febs.ai.mapper;
 
 import cc.mrbird.febs.ai.entity.AiProductCategory;
+import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto;
+import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * AI产品类别 Mapper接口
@@ -11,4 +15,5 @@
  */
 public interface AiProductCategoryMapper extends BaseMapper<AiProductCategory> {
 
+    Page<ApiProductCategoryVo> selectPageListByQuery(Page<ApiProductCategoryVo> page, @Param("record")ApiProductCategoryPageDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java
index 4f20d91..15c7eae 100644
--- a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java
+++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java
@@ -1,7 +1,11 @@
 package cc.mrbird.febs.ai.mapper;
 
 import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.ai.req.product.ApiProductPageDto;
+import cc.mrbird.febs.ai.res.product.ApiProductVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * AI产品表 Mapper接口
@@ -11,4 +15,5 @@
  */
 public interface AiProductMapper extends BaseMapper<AiProduct> {
 
+    Page<ApiProductVo> selectPageListByQuery(Page<ApiProductVo> page, @Param("record") ApiProductPageDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java
new file mode 100644
index 0000000..66940cc
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.ai.req.product;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductInfoDto", description = "参数")
+public class ApiProductInfoDto {
+
+    @NotBlank(message = "ID不能为空")
+    @ApiModelProperty(value = "产品ID", example = "10")
+    private String id;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java
new file mode 100644
index 0000000..ef63b7c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java
@@ -0,0 +1,29 @@
+package cc.mrbird.febs.ai.req.product;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductPageDto", description = "参数")
+public class ApiProductPageDto {
+
+    @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 memberRoleId;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java
new file mode 100644
index 0000000..5e413ea
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.ai.req.productCategory;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductCategoryPageDto", description = "参数")
+public class ApiProductCategoryPageDto {
+
+    @NotNull(message = "页码不能为空")
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNow;
+
+    @NotNull(message = "每页数量不能为空")
+    @ApiModelProperty(value = "每页数量", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "查询名称", example = "123")
+    private String query;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java b/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java
new file mode 100644
index 0000000..0d2f805
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.ai.req.productPoint;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductPointInfoDto", description = "参数")
+public class ApiProductPointInfoDto {
+
+
+    @NotBlank(message = "ID不能为空")
+    @ApiModelProperty(value = "产品知识点ID", example = "10")
+    private String id;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java
new file mode 100644
index 0000000..e2728c7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java
@@ -0,0 +1,68 @@
+package cc.mrbird.febs.ai.res.product;
+
+import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductInfoVo", description = "参数")
+public class ApiProductInfoVo {
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+    @ApiModelProperty(value = "分类ID")
+    private String productCategoryId;
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "ID")
+    private String name;
+    /**
+     * 场景(可以根据场景生成prompt提示词)
+     */
+
+    @ApiModelProperty(value = "场景")
+    private String scene;
+
+    /**
+     * 目标
+     */
+    @ApiModelProperty(value = "目标")
+    private String target;
+
+    /**
+     * 背景图片
+     */
+    @ApiModelProperty(value = "背景图片")
+    private String backImg;
+
+    /**
+     * 小图标
+     */
+    @ApiModelProperty(value = "小图标")
+    private String iconImg;
+
+    /**
+     * 描述
+     */
+    @ApiModelProperty(value = "描述")
+    private String description;
+
+    /**
+     * 每次出题数量
+     */
+    @ApiModelProperty(value = "每次出题数量")
+    private Integer questionCount;
+
+    @ApiModelProperty(value = "知识点")
+    private List<ApiProductPointVo> productPointList;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java
new file mode 100644
index 0000000..bcb8aa1
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.ai.res.product;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductVo", description = "参数")
+public class ApiProductVo {
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "ID")
+    private String name;
+
+    /**
+     * 目标
+     */
+    @ApiModelProperty(value = "ID")
+    private String target;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java b/src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java
new file mode 100644
index 0000000..c20e2c2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java
@@ -0,0 +1,35 @@
+package cc.mrbird.febs.ai.res.productCategory;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductCategoryVo", description = "参数")
+public class ApiProductCategoryVo {
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    /**
+     * 背景图片
+     */
+    @ApiModelProperty(value = "背景图片")
+    private String backImg;
+
+    /**
+     * 小图标
+     */
+    @ApiModelProperty(value = "小图标")
+    private String iconImg;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java
new file mode 100644
index 0000000..008ca2f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java
@@ -0,0 +1,45 @@
+package cc.mrbird.febs.ai.res.productPoint;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductPointInfoVo", description = "参数")
+public class ApiProductPointInfoVo {
+
+
+    /**
+     * 类型1:普通内容  2:视频号内容
+     */
+    @ApiModelProperty(value = "类型1:普通内容  2:视频号内容")
+    private Integer isNormal;
+
+    /**
+     * 视频号 id,以"sph"开头的id,可在视频号助手获取
+     */
+    @ApiModelProperty(value = "视频号 id")
+    private String finderUserName;
+
+    /**
+     * 视频 feedId
+     */
+    @ApiModelProperty(value = "视频 feedId")
+    private String feedId;
+
+    /**
+     * 标题
+     */
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    /**
+     * 描述
+     */
+    @ApiModelProperty(value = "描述")
+    private String description;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java
new file mode 100644
index 0000000..f2552eb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java
@@ -0,0 +1,22 @@
+package cc.mrbird.febs.ai.res.productPoint;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiProductPointVo", description = "参数")
+public class ApiProductPointVo {
+
+    @ApiModelProperty(value = "知识点ID")
+    private String id;
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "名称")
+    private String title;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java
index db6d335..5ca434d 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java
@@ -18,4 +18,6 @@
     List<AiMemberRole> getListByQuery(LambdaQueryWrapper<AiMemberRole> query);
 
     FebsResponse memberRoleList();
+
+    String getDefaultMemberRoleId();
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
index 50e1cf8..58742f4 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
@@ -1,6 +1,12 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiProductCategory;
+import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto;
+import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.vo.ApiActivityInfoVo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import java.util.List;
 
@@ -13,4 +19,13 @@
 public interface AiProductCategoryService extends IService<AiProductCategory> {
 
 
+    List<AiProductCategory> getListByQuery(LambdaQueryWrapper<AiProductCategory> query);
+
+    Page<ApiProductCategoryVo> getPageListByQuery(Page<ApiProductCategoryVo> page , ApiProductCategoryPageDto dto);
+
+    FebsResponse hot();
+
+    FebsResponse categoryList(ApiProductCategoryPageDto dto);
+
+    String getDefaultProductCategoryId();
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java
index c312695..495d002 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java
@@ -1,10 +1,16 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiProductPointLink;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
 
 /**
  * @author Administrator
  */
 public interface AiProductPointLinkService extends IService<AiProductPointLink> {
+
+
+    List<AiProductPointLink> getListByProductId(LambdaQueryWrapper<AiProductPointLink> pointLinkQUery);
 }
\ No newline at end of file
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java
index 9517605..04eb5e2 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java
@@ -1,8 +1,12 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiProductPoint;
+import cc.mrbird.febs.ai.req.productPoint.ApiProductPointInfoDto;
+import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo;
+import cc.mrbird.febs.common.entity.FebsResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
 import java.util.List;
+import java.util.Set;
 
 /**
  * AI产品知识点 Service接口
@@ -11,6 +15,11 @@
  * @date 2025-07-29
  */
 public interface AiProductPointService extends IService<AiProductPoint> {
+    AiProductPoint getById(String id);
 
+    List<AiProductPoint> getListByPointIds(Set<String> collect);
 
+    List<ApiProductPointVo> listByProductId(String productId);
+
+    FebsResponse productPointInfo(ApiProductPointInfoDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java
index 0da0708..1d4a9fa 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java
@@ -1,6 +1,13 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.ai.req.product.ApiProductInfoDto;
+import cc.mrbird.febs.ai.req.product.ApiProductPageDto;
+import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto;
+import cc.mrbird.febs.ai.res.product.ApiProductVo;
+import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import java.util.List;
 
@@ -11,4 +18,12 @@
  * @date 2025-07-29
  */
 public interface AiProductService extends IService<AiProduct> {
+
+    AiProduct getById(String id);
+
+    Page<ApiProductVo> getPageListByQuery(Page<ApiProductVo> page , ApiProductPageDto dto);
+
+    FebsResponse productList(ApiProductPageDto dto);
+
+    FebsResponse productInfo(ApiProductInfoDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java
index 2b8dda6..e4aad6e 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java
@@ -55,4 +55,19 @@
         }
         return new FebsResponse().success().data(list);
     }
+
+    @Override
+    public String getDefaultMemberRoleId() {
+        LambdaQueryWrapper<AiMemberRole> queryWrapper = Wrappers.lambdaQuery(AiMemberRole.class);
+        queryWrapper.eq(AiMemberRole::getState, 1);
+        queryWrapper.orderByAsc(AiMemberRole::getCreatedTime);
+        queryWrapper.last("limit 1");
+        List<AiMemberRole> listByQuery = this.getListByQuery(queryWrapper);
+        if (CollUtil.isNotEmpty(listByQuery)){
+            for (AiMemberRole aiMemberRole : listByQuery){
+                    return aiMemberRole.getId();
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java
index f669736..fda81b3 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java
@@ -2,14 +2,22 @@
 
 import cc.mrbird.febs.ai.entity.AiProductCategory;
 import cc.mrbird.febs.ai.mapper.AiProductCategoryMapper;
+import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto;
+import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo;
 import cc.mrbird.febs.ai.service.AiProductCategoryService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.vo.ApiActivityInfoVo;
+import cn.hutool.core.collection.CollUtil;
 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 org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -26,4 +34,58 @@
     private final AiProductCategoryMapper aiProductCategoryMapper;
 
 
+    @Override
+    public List<AiProductCategory> getListByQuery(LambdaQueryWrapper<AiProductCategory> query) {
+        return aiProductCategoryMapper.selectList(query);
+    }
+
+    @Override
+    public Page<ApiProductCategoryVo> getPageListByQuery(Page<ApiProductCategoryVo> page , ApiProductCategoryPageDto dto) {
+        return aiProductCategoryMapper.selectPageListByQuery(page,dto);
+    }
+
+    @Override
+    public FebsResponse hot() {
+
+        List<ApiProductCategoryVo> list = new ArrayList<>();
+
+        LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class);
+        query.eq(AiProductCategory::getState, 1);
+        query.eq(AiProductCategory::getHotState, 1);
+        query.orderByAsc(AiProductCategory::getSort);
+        List<AiProductCategory> listByQuery = this.getListByQuery(query);
+        if (CollUtil.isNotEmpty(listByQuery)){
+            for (AiProductCategory aiProductCategory : listByQuery){
+                ApiProductCategoryVo apiProductCategoryVo = new ApiProductCategoryVo();
+                apiProductCategoryVo.setId(aiProductCategory.getId());
+                apiProductCategoryVo.setName(aiProductCategory.getName());
+                apiProductCategoryVo.setBackImg(aiProductCategory.getBackImg());
+                apiProductCategoryVo.setIconImg(aiProductCategory.getIconImg());
+                list.add(apiProductCategoryVo);
+            }
+        }
+        return new FebsResponse().success().data(list);
+    }
+
+    @Override
+    public FebsResponse categoryList(ApiProductCategoryPageDto dto) {
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiProductCategoryVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        Page<ApiProductCategoryVo> pageListByQuery = this.getPageListByQuery(page, dto);
+        return new FebsResponse().success().data(pageListByQuery);
+    }
+
+    @Override
+    public String getDefaultProductCategoryId() {
+        LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class);
+        query.eq(AiProductCategory::getState, 1);
+        query.eq(AiProductCategory::getHotState, 1);
+        query.orderByAsc(AiProductCategory::getSort);
+        query.last("limit 1");
+        List<AiProductCategory> listByQuery = this.getListByQuery(query);
+        if (CollUtil.isNotEmpty(listByQuery)){
+            return listByQuery.get(0).getId();
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java
index 9818302..f90a251 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java
@@ -3,10 +3,13 @@
 import cc.mrbird.febs.ai.entity.AiProductPointLink;
 import cc.mrbird.febs.ai.mapper.AiProductPointLinkMapper;
 import cc.mrbird.febs.ai.service.AiProductPointLinkService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 /**
  * @author Administrator
@@ -16,4 +19,10 @@
 @Transactional
 public class AiProductPointLinkServiceImpl extends ServiceImpl<AiProductPointLinkMapper, AiProductPointLink> implements AiProductPointLinkService {
 
+    private final AiProductPointLinkMapper aiProductPointLinkMapper;
+
+    @Override
+    public List<AiProductPointLink> getListByProductId(LambdaQueryWrapper<AiProductPointLink> pointLinkQUery) {
+        return aiProductPointLinkMapper.selectList(pointLinkQUery);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
index f9115c9..5bf24cf 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
@@ -1,16 +1,28 @@
 package cc.mrbird.febs.ai.service.impl;
 
 import cc.mrbird.febs.ai.entity.AiProductPoint;
+import cc.mrbird.febs.ai.entity.AiProductPointLink;
 import cc.mrbird.febs.ai.mapper.AiProductPointMapper;
+import cc.mrbird.febs.ai.req.productPoint.ApiProductPointInfoDto;
+import cc.mrbird.febs.ai.res.productPoint.ApiProductPointInfoVo;
+import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo;
+import cc.mrbird.febs.ai.service.AiProductPointLinkService;
 import cc.mrbird.febs.ai.service.AiProductPointService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * AI产品知识点 Service实现类
@@ -24,6 +36,55 @@
 public class AiProductPointServiceImpl extends ServiceImpl<AiProductPointMapper, AiProductPoint> implements AiProductPointService {
 
     private final AiProductPointMapper aiProductPointMapper;
+    private final AiProductPointLinkService aiProductPointLinkService;
 
+    @Override
+    public AiProductPoint getById(String id) {
+        return aiProductPointMapper.selectById( id);
+    }
 
+    @Override
+    public List<AiProductPoint> getListByPointIds(Set<String> collect) {
+        return aiProductPointMapper.selectBatchIds( collect);
+    }
+    @Override
+    public List<ApiProductPointVo> listByProductId(String productId) {
+        List<ApiProductPointVo> vos = new ArrayList<>();
+
+        LambdaQueryWrapper<AiProductPointLink> pointLinkQUery = Wrappers.lambdaQuery(AiProductPointLink.class);
+        pointLinkQUery.eq(AiProductPointLink::getProductId, productId);
+        List<AiProductPointLink> linkList = aiProductPointLinkService.getListByProductId(pointLinkQUery);
+        if (CollUtil.isEmpty(linkList)){
+            return vos;
+        }
+
+        Set<String> collect = linkList.stream().map(AiProductPointLink::getProductPointId).collect(Collectors.toSet());
+        List<AiProductPoint> list = this.getListByPointIds(collect);
+        if (CollUtil.isEmpty(list)){
+            return vos;
+        }
+
+        for (AiProductPoint point : list){
+            ApiProductPointVo vo = new ApiProductPointVo();
+            vo.setId(point.getId());
+            vo.setTitle(point.getTitle());
+            vos.add(vo);
+        }
+        return vos;
+    }
+
+    @Override
+    public FebsResponse productPointInfo(ApiProductPointInfoDto dto) {
+        ApiProductPointInfoVo apiProductPointInfoVo = new ApiProductPointInfoVo();
+        String id = dto.getId();
+        AiProductPoint entity = this.getById(id);
+        if (ObjectUtil.isNotNull( entity)){
+            apiProductPointInfoVo.setIsNormal(entity.getIsNormal());
+            apiProductPointInfoVo.setFinderUserName(entity.getFinderUserName());
+            apiProductPointInfoVo.setFeedId(entity.getFeedId());
+            apiProductPointInfoVo.setTitle(entity.getTitle());
+            apiProductPointInfoVo.setDescription(entity.getDescription());
+        }
+        return new FebsResponse().success().data(apiProductPointInfoVo);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java
index b946cf7..566e82f 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java
@@ -1,16 +1,20 @@
 package cc.mrbird.febs.ai.service.impl;
 
 import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.ai.entity.AiProductPoint;
 import cc.mrbird.febs.ai.mapper.AiProductMapper;
-import cc.mrbird.febs.ai.service.AiProductService;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cc.mrbird.febs.ai.req.product.ApiProductInfoDto;
+import cc.mrbird.febs.ai.req.product.ApiProductPageDto;
+import cc.mrbird.febs.ai.res.product.ApiProductInfoVo;
+import cc.mrbird.febs.ai.res.product.ApiProductVo;
+import cc.mrbird.febs.ai.service.*;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cn.hutool.core.util.StrUtil;
+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 org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
 
 /**
  * AI产品表 Service实现类
@@ -24,6 +28,56 @@
 public class AiProductServiceImpl extends ServiceImpl<AiProductMapper, AiProduct> implements AiProductService {
 
     private final AiProductMapper aiProductMapper;
+    private final AiMemberRoleService aiMemberRoleService;
+    private final AiProductCategoryService aiProductCategoryService;
+    private final AiProductPointService aiProductPointService;
 
 
+    @Override
+    public AiProduct getById(String id) {
+        return aiProductMapper.selectById( id);
+    }
+
+    @Override
+    public Page<ApiProductVo> getPageListByQuery(Page<ApiProductVo> page, ApiProductPageDto dto) {
+        return aiProductMapper.selectPageListByQuery(page, dto);
+    }
+
+    @Override
+    public FebsResponse productList(ApiProductPageDto dto) {
+
+        if(StrUtil.isEmpty(dto.getMemberRoleId())){
+            String memberRoleId = aiMemberRoleService.getDefaultMemberRoleId();
+            dto.setMemberRoleId(memberRoleId);
+        }
+
+        if(StrUtil.isEmpty(dto.getCategoryId())){
+            String categoryId = aiProductCategoryService.getDefaultProductCategoryId();
+            dto.setCategoryId(categoryId);
+        }
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiProductVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        Page<ApiProductVo> pageListByQuery = this.getPageListByQuery(page, dto);
+        return new FebsResponse().success().data(pageListByQuery);
+    }
+
+    @Override
+    public FebsResponse productInfo(ApiProductInfoDto dto) {
+
+        String id = dto.getId();
+        AiProduct entity = this.getById(id);
+        ApiProductInfoVo vo = new ApiProductInfoVo();
+        vo.setId(entity.getId());
+        vo.setProductCategoryId(entity.getProductCategoryId());
+        vo.setName(entity.getName());
+        vo.setScene(entity.getScene());
+        vo.setTarget(entity.getTarget());
+        vo.setBackImg(entity.getBackImg());
+        vo.setIconImg(entity.getIconImg());
+        vo.setDescription(entity.getDescription());
+        vo.setQuestionCount(entity.getQuestionCount());
+
+        vo.setProductPointList(aiProductPointService.listByProductId(id));
+        return new FebsResponse().success().data(vo);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
index 863af31..6539b77 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
+++ b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -47,6 +47,8 @@
         registration.excludePathPatterns("/api/clothes/social/allComment");
         registration.excludePathPatterns("/api/clothes/social/socialInfo");
         registration.excludePathPatterns("/api/clothes/clothesType");
-        registration.excludePathPatterns("/api/ai/**");
+        registration.excludePathPatterns("/api/ai/memberRole/**");
+        registration.excludePathPatterns("/api/ai/productCategory/**");
+        registration.excludePathPatterns("/api/ai/product/**");
     }
 }
diff --git a/src/main/resources/mapper/modules/AiProductCategoryMapper.xml b/src/main/resources/mapper/modules/AiProductCategoryMapper.xml
index cb5c925..d1ae984 100644
--- a/src/main/resources/mapper/modules/AiProductCategoryMapper.xml
+++ b/src/main/resources/mapper/modules/AiProductCategoryMapper.xml
@@ -1,4 +1,16 @@
 <?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.AiProductCategoryMapper">
+
+    <select id="selectPageListByQuery" resultType="cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo">
+        select
+            a.id as id,
+            a.name as name,
+            a.back_img as backImg,
+            a.icon_img as iconImg
+        from ai_product_category a
+        where
+            a.state = 1
+        order by a.sort asc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/AiProductMapper.xml b/src/main/resources/mapper/modules/AiProductMapper.xml
index a4c1c21..a5a099c 100644
--- a/src/main/resources/mapper/modules/AiProductMapper.xml
+++ b/src/main/resources/mapper/modules/AiProductMapper.xml
@@ -1,4 +1,26 @@
 <?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.AiProductMapper">
+
+    <select id="selectPageListByQuery" resultType="cc.mrbird.febs.ai.res.product.ApiProductVo">
+        select
+            a.id as id,
+            a.name as name,
+            a.target as target
+        from ai_product a
+        <where>
+            a.state = 1
+            <if test="record != null">
+                <if test="record.categoryId != null and record.categoryId != ''">
+                    and a.product_category_id=#{record.categoryId}
+                </if>
+                <if test="record.memberRoleId != null and record.memberRoleId != ''">
+                    and a.id in (
+                        select product_id from ai_member_role_product where role_id = #{record.memberRoleId}
+                    )
+                </if>
+            </if>
+        </where>
+        order by a.sort asc
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1