From 2bfe033e2fd8f3d8ee9e99f43df977e661fcbda8 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 31 Jul 2025 18:07:42 +0800
Subject: [PATCH] feat(ai): 添加会员角色、产品和产品分类的新增页面

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java                  |  103 -
 src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java                             |    2 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java                   |   90 
 src/main/resources/templates/febs/views/modules/ai/productCategory/list.html                |  287 ++
 src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java                     |   80 
 src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java                          |   83 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java                 |  121 -
 src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java                      |   47 
 src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java                              |   11 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java            |  114 -
 src/main/resources/templates/febs/views/modules/ai/productCategory/info.html                |  213 ++
 src/main/resources/templates/febs/views/modules/ai/productCategory/add.html                 |  179 +
 src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java                 |   70 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java                        |   54 
 src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java                       |  106 -
 src/main/java/cc/mrbird/febs/ai/service/AiProductService.java                               |   97 
 src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java           |   78 
 src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java                       |   98 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java          |  149 -
 src/main/resources/application-test.yml                                                     |    4 
 src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java                                       |    4 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java                   |  167 
 src/main/resources/templates/febs/views/modules/ai/memberRole/list.html                     |  246 ++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java                      |  223 +-
 src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java |   76 
 src/main/resources/templates/febs/views/modules/ai/product/info.html                        |  328 +++
 src/main/java/cc/mrbird/febs/ai/util/UUID.java                                              |  495 ++++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java           |  114 -
 src/main/resources/templates/febs/views/modules/ai/memberRole/add.html                      |  139 +
 src/main/resources/templates/febs/views/modules/ai/product/add.html                         |  283 ++
 src/main/resources/templates/febs/views/modules/ai/product/list.html                        |  329 +++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java                 |  117 -
 src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java                   |  100 
 src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java                             |   13 
 src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html               |  128 +
 src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java                                |    2 
 src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java              |   47 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java                          |   85 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java                            |   61 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java              |  145 -
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java             |  123 -
 src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java                   |  102 +
 src/main/resources/templates/febs/views/modules/ai/memberRole/info.html                     |  167 +
 src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java                           |   70 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java                            |   75 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java               |   82 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java              |  214 +-
 src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java                      |   90 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java                    |   78 
 src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java                                    |    5 
 50 files changed, 3,612 insertions(+), 2,482 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java
new file mode 100644
index 0000000..e03c29a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java
@@ -0,0 +1,78 @@
+package cc.mrbird.febs.ai.controller.memberRole;
+
+import cc.mrbird.febs.ai.entity.AiMemberRole;
+import cc.mrbird.febs.ai.req.AdminMoveChooseInfoDto;
+import cc.mrbird.febs.ai.service.AiMemberRoleService;
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/admin/memberRole")
+public class AiMemberRoleController extends BaseController {
+
+    private final AiMemberRoleService aiMemberRoleService;
+
+    @GetMapping("list")
+    public FebsResponse list(AiMemberRole dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(aiMemberRoleService.listInPage(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    @GetMapping("changeState/{id}/{state}")
+    @ControllerEndpoint(operation = "状态操作", exceptionMessage = "操作失败")
+    public FebsResponse changeState(
+            @NotNull(message = "{required}") @PathVariable String id,
+            @NotNull(message = "{required}") @PathVariable Integer state
+    ) {
+
+        return aiMemberRoleService.changeState(id,state);
+    }
+
+    @PostMapping("add")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse add(@RequestBody @Valid AiMemberRole dto) {
+
+        return aiMemberRoleService.memberRoleAdd(dto);
+    }
+
+    @PostMapping("update")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse update(@RequestBody @Valid AiMemberRole dto) {
+
+        return aiMemberRoleService.updateMemberRole(dto);
+    }
+
+    @GetMapping("delete/{id}")
+    @ControllerEndpoint(operation = "删除", exceptionMessage = "操作失败")
+    public FebsResponse delete(
+            @NotNull(message = "{required}") @PathVariable String id
+    ) {
+
+        return aiMemberRoleService.delete(id);
+    }
+
+    @PostMapping("productSet")
+    @ControllerEndpoint(operation = "产品配置", exceptionMessage = "操作失败")
+    public FebsResponse productSet(@RequestBody @Valid AdminMoveChooseInfoDto dto) {
+
+        return aiMemberRoleService.productSet(dto);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java
new file mode 100644
index 0000000..9e673bf
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java
@@ -0,0 +1,102 @@
+package cc.mrbird.febs.ai.controller.memberRole;
+
+import cc.mrbird.febs.ai.entity.AiMemberRole;
+import cc.mrbird.febs.ai.entity.AiMemberRoleProduct;
+import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.ai.res.AdminMoveChooseInfoVo;
+import cc.mrbird.febs.ai.service.AiMemberRoleProductService;
+import cc.mrbird.febs.ai.service.AiMemberRoleService;
+import cc.mrbird.febs.ai.service.AiProductService;
+import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.utils.FebsUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author Administrator
+ */
+@Controller("AiMemberRoleView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/ai/memberRole")
+@RequiredArgsConstructor
+public class ViewController {
+
+    private final AiMemberRoleService aiMemberRoleService;
+    private final AiMemberRoleProductService aiMemberRoleProductService;
+    private final AiProductService aiProductService;
+
+    @GetMapping("list")
+    @RequiresPermissions("memberRoleList:view")
+    public String memberRoleList() {
+
+        return FebsUtil.view("modules/ai/memberRole/list");
+    }
+
+    @GetMapping(value = "/add")
+    @RequiresPermissions("memberRoleList:add")
+    public String artAdd() {
+
+        return FebsUtil.view("modules/ai/memberRole/add");
+    }
+
+    @GetMapping("info/{id}")
+    @RequiresPermissions("memberRoleList:info")
+    public String artInfo(@PathVariable String id, Model model) {
+        AiMemberRole entity = aiMemberRoleService.getById(id);
+        model.addAttribute("aiMemberRole", entity);
+        return FebsUtil.view("modules/ai/memberRole/info");
+    }
+
+    @GetMapping("productSet/{id}")
+    @RequiresPermissions("memberRoleList:productSet")
+    public String productSet(@PathVariable String id, Model model) {
+        List<AdminMoveChooseInfoVo> vos = new ArrayList<>();
+        Set<String> productIds = new HashSet<>();
+
+        AiMemberRole entity = aiMemberRoleService.getById(id);
+        if(ObjectUtil.isNotNull(entity)){
+            //右侧数据
+            LambdaQueryWrapper<AiMemberRoleProduct> query = Wrappers.lambdaQuery(AiMemberRoleProduct.class);
+            if(StrUtil.isNotEmpty(id)){
+                query.eq(AiMemberRoleProduct::getRoleId, id);
+            }
+            List<AiMemberRoleProduct> selectedList = aiMemberRoleProductService.selectListByQuery(query);
+            if(CollUtil.isNotEmpty(selectedList)){
+                //stream流操作happyMemberLabelRecords,获取memberId的set集合
+                productIds = selectedList.stream().map(AiMemberRoleProduct::getProductId).collect(Collectors.toSet());
+            }
+
+            //左侧数据
+            List<AiProduct> allList = aiProductService.selectList();
+            if(CollUtil.isNotEmpty(allList)){
+                //stream流操作mallMembers,生成一个新的List<MallMemberVo>
+                vos = allList.stream().map(AiProduct -> {
+                    AdminMoveChooseInfoVo vo = new AdminMoveChooseInfoVo();
+                    vo.setId(AiProduct.getId());
+                    vo.setName(AiProduct.getName());
+                    return vo;
+                }).collect(Collectors.toList());
+            }
+        }
+
+        model.addAttribute("productAll", vos);
+        model.addAttribute("productSelected", productIds);
+        model.addAttribute("roleId", id);
+        return FebsUtil.view("modules/ai/memberRole/productSet");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java b/src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java
new file mode 100644
index 0000000..692baed
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java
@@ -0,0 +1,70 @@
+package cc.mrbird.febs.ai.controller.product;
+
+import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.ai.service.AiProductService;
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/admin/product")
+public class AiProductController extends BaseController {
+
+    private final AiProductService service;
+
+    @GetMapping("list")
+    public FebsResponse list(AiProduct dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(service.listInPage(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    @GetMapping("changeState/{id}/{type}/{state}")
+    @ControllerEndpoint(operation = "状态操作", exceptionMessage = "操作失败")
+    public FebsResponse changeState(
+            @NotNull(message = "{required}") @PathVariable String id,
+            @NotNull(message = "{required}") @PathVariable Integer type,
+            @NotNull(message = "{required}") @PathVariable Integer state
+    ) {
+
+        return service.changeState(id,type,state);
+    }
+
+    @PostMapping("add")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse add(@RequestBody @Valid AiProduct dto) {
+
+        return service.add(dto);
+    }
+
+    @PostMapping("update")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse update(@RequestBody @Valid AiProduct dto) {
+
+        return service.update(dto);
+    }
+
+    @GetMapping("delete/{id}")
+    @ControllerEndpoint(operation = "删除", exceptionMessage = "操作失败")
+    public FebsResponse delete(
+            @NotNull(message = "{required}") @PathVariable String id
+    ) {
+
+        return service.delete(id);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java b/src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java
new file mode 100644
index 0000000..65e03e8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java
@@ -0,0 +1,47 @@
+package cc.mrbird.febs.ai.controller.product;
+
+import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.ai.service.AiProductService;
+import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.utils.FebsUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * @author Administrator
+ */
+@Controller("AiProductView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/ai/product")
+@RequiredArgsConstructor
+public class ViewController {
+
+
+    private final AiProductService service;
+
+    @GetMapping("list")
+    @RequiresPermissions("productList:view")
+    public String memberRoleList() {
+
+        return FebsUtil.view("modules/ai/product/list");
+    }
+
+    @GetMapping(value = "/add")
+    @RequiresPermissions("productList:add")
+    public String artAdd() {
+
+        return FebsUtil.view("modules/ai/product/add");
+    }
+
+    @GetMapping("info/{id}")
+    @RequiresPermissions("productList:info")
+    public String artInfo(@PathVariable String id, Model model) {
+        AiProduct entity = service.getById(id);
+        model.addAttribute("aiProduct", entity);
+        return FebsUtil.view("modules/ai/product/info");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java
new file mode 100644
index 0000000..79e93bb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java
@@ -0,0 +1,76 @@
+package cc.mrbird.febs.ai.controller.productCategory;
+
+import cc.mrbird.febs.ai.entity.AiProductCategory;
+import cc.mrbird.febs.ai.service.AiProductCategoryService;
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/admin/productCategory")
+public class AiProductCategoryController extends BaseController {
+
+    private final AiProductCategoryService service;
+
+    @GetMapping("list")
+    public FebsResponse list(AiProductCategory dto, QueryRequest request) {
+
+        Map<String, Object> data = getDataTable(service.listInPage(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    @GetMapping("changeState/{id}/{type}/{state}")
+    @ControllerEndpoint(operation = "状态操作", exceptionMessage = "操作失败")
+    public FebsResponse changeState(
+            @NotNull(message = "{required}") @PathVariable String id,
+            @NotNull(message = "{required}") @PathVariable Integer type,
+            @NotNull(message = "{required}") @PathVariable Integer state
+    ) {
+
+        return service.changeState(id,type,state);
+    }
+
+    @PostMapping("add")
+    @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败")
+    public FebsResponse add(@RequestBody @Valid AiProductCategory dto) {
+
+        return service.add(dto);
+    }
+
+    @PostMapping("update")
+    @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败")
+    public FebsResponse update(@RequestBody @Valid AiProductCategory dto) {
+
+        return service.update(dto);
+    }
+
+    @GetMapping("delete/{id}")
+    @ControllerEndpoint(operation = "删除", exceptionMessage = "操作失败")
+    public FebsResponse delete(
+            @NotNull(message = "{required}") @PathVariable String id
+    ) {
+
+        return service.delete(id);
+    }
+
+    @GetMapping(value = "/categoryTree")
+    public FebsResponse categoryTree() {
+
+        return new FebsResponse().success().data(service.categoryTree());
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java
new file mode 100644
index 0000000..64fe4ed
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java
@@ -0,0 +1,47 @@
+package cc.mrbird.febs.ai.controller.productCategory;
+
+import cc.mrbird.febs.ai.entity.AiProductCategory;
+import cc.mrbird.febs.ai.service.AiProductCategoryService;
+import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.utils.FebsUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * @author Administrator
+ */
+@Controller("AiProductCategoryView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/ai/productCategory")
+@RequiredArgsConstructor
+public class ViewController {
+
+
+    private final AiProductCategoryService service;
+
+    @GetMapping("list")
+    @RequiresPermissions("categoryList:view")
+    public String memberRoleList() {
+
+        return FebsUtil.view("modules/ai/productCategory/list");
+    }
+
+    @GetMapping(value = "/add")
+    @RequiresPermissions("categoryList:add")
+    public String artAdd() {
+
+        return FebsUtil.view("modules/ai/productCategory/add");
+    }
+
+    @GetMapping("info/{id}")
+    @RequiresPermissions("categoryList:info")
+    public String artInfo(@PathVariable String id, Model model) {
+        AiProductCategory entity = service.getById(id);
+        model.addAttribute("aiProductCategory", entity);
+        return FebsUtil.view("modules/ai/productCategory/info");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java
index c169494..c7f9459 100644
--- a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java
@@ -38,4 +38,9 @@
      * 状态 0-禁用 1-启用 2-已删除
      */
     private Integer state;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java b/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java
index e60a2be..bdc2e75 100644
--- a/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java
@@ -1,6 +1,7 @@
 package cc.mrbird.febs.ai.entity;
 
 import cc.mrbird.febs.common.entity.AiBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -58,6 +59,9 @@
      */
     private String productCategoryId;
 
+    @TableField(exist = false)
+    private String productCategoryName;
+
     /**
      * 场景(可以根据场景生成prompt提示词)
      */
diff --git a/src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java b/src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java
new file mode 100644
index 0000000..a1171f2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.ai.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AdminMoveChooseInfoDto {
+
+    private String roleId;
+
+    private List<String> chooseIds;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java
new file mode 100644
index 0000000..550794c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java
@@ -0,0 +1,11 @@
+package cc.mrbird.febs.ai.res;
+
+import lombok.Data;
+
+@Data
+public class AdminMoveChooseInfoVo {
+
+    private String id;
+
+    private String name;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java
index b449215..b9d5570 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java
@@ -19,95 +19,5 @@
      */
     AiMemberAnswerItem getById(String id);
 
-    /**
-     * 根据答题记录ID查询答题记录项列表
-     * @param answerId 答题记录ID
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByAnswerId(String answerId);
 
-    /**
-     * 根据用户ID查询答题记录项列表
-     * @param memberId 用户ID
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByMemberId(String memberId);
-
-    /**
-     * 根据产品ID查询答题记录项列表
-     * @param productId 产品ID
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByProductId(String productId);
-
-    /**
-     * 根据题目父ID查询答题记录项列表
-     * @param productQuestionParentId 题目父ID
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByProductQuestionParentId(String productQuestionParentId);
-
-    /**
-     * 根据题目ID查询答题记录项列表
-     * @param productQuestionId 题目ID
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByProductQuestionId(String productQuestionId);
-
-    /**
-     * 根据用户回答状态查询答题记录项列表
-     * @param memberAnswerState 用户回答状态 0-未回答 1-答对了 2-答错了
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByMemberAnswerState(Integer memberAnswerState);
-
-    /**
-     * 根据是否加入错题集查询答题记录项列表
-     * @param isCollected 是否加入错题集:0-否,1-是
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByIsCollected(Integer isCollected);
-
-    /**
-     * 根据公司ID和用户ID查询答题记录项列表
-     * @param companyId 公司ID
-     * @param memberId 用户ID
-     * @return 答题记录项列表
-     */
-    List<AiMemberAnswerItem> getByCompanyIdAndMemberId(String companyId, String memberId);
-
-    /**
-     * 保存答题记录项
-     * @param aiMemberAnswerItem 答题记录项实体
-     * @return 是否保存成功
-     */
-    boolean saveAnswerItem(AiMemberAnswerItem aiMemberAnswerItem);
-
-    /**
-     * 批量保存答题记录项
-     * @param answerItems 答题记录项列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchAnswerItems(List<AiMemberAnswerItem> answerItems);
-
-    /**
-     * 更新答题记录项
-     * @param aiMemberAnswerItem 答题记录项实体
-     * @return 是否更新成功
-     */
-    boolean updateAnswerItem(AiMemberAnswerItem aiMemberAnswerItem);
-
-    /**
-     * 根据ID删除答题记录项
-     * @param id 答题记录项ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据答题记录ID删除答题记录项
-     * @param answerId 答题记录ID
-     * @return 是否删除成功
-     */
-    boolean deleteByAnswerId(String answerId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
index 0b58d28..82a409b 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
@@ -19,90 +19,5 @@
      */
     AiMemberAnswer getById(String id);
 
-    /**
-     * 根据用户ID查询答题记录列表
-     * @param memberId 用户ID
-     * @return 答题记录列表
-     */
-    List<AiMemberAnswer> getByMemberId(String memberId);
 
-    /**
-     * 根据产品ID查询答题记录列表
-     * @param productId 产品ID
-     * @return 答题记录列表
-     */
-    List<AiMemberAnswer> getByProductId(String productId);
-
-    /**
-     * 根据公司ID查询答题记录列表
-     * @param companyId 公司ID
-     * @return 答题记录列表
-     */
-    List<AiMemberAnswer> getByCompanyId(String companyId);
-
-    /**
-     * 根据状态查询答题记录列表
-     * @param state 状态 0-进行中 1-已结束
-     * @return 答题记录列表
-     */
-    List<AiMemberAnswer> getByState(Integer state);
-
-    /**
-     * 根据用户ID和状态查询答题记录列表
-     * @param memberId 用户ID
-     * @param state 状态 0-进行中 1-已结束
-     * @return 答题记录列表
-     */
-    List<AiMemberAnswer> getByMemberIdAndState(String memberId, Integer state);
-
-    /**
-     * 根据公司ID和用户ID查询答题记录列表
-     * @param companyId 公司ID
-     * @param memberId 用户ID
-     * @return 答题记录列表
-     */
-    List<AiMemberAnswer> getByCompanyIdAndMemberId(String companyId, String memberId);
-
-    /**
-     * 根据评分范围查询答题记录列表
-     * @param minScore 最低分
-     * @param maxScore 最高分
-     * @return 答题记录列表
-     */
-    List<AiMemberAnswer> getByScoreRange(Integer minScore, Integer maxScore);
-
-    /**
-     * 保存答题记录
-     * @param aiMemberAnswer 答题记录实体
-     * @return 是否保存成功
-     */
-    boolean saveAnswer(AiMemberAnswer aiMemberAnswer);
-
-    /**
-     * 批量保存答题记录
-     * @param answers 答题记录列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchAnswers(List<AiMemberAnswer> answers);
-
-    /**
-     * 更新答题记录
-     * @param aiMemberAnswer 答题记录实体
-     * @return 是否更新成功
-     */
-    boolean updateAnswer(AiMemberAnswer aiMemberAnswer);
-
-    /**
-     * 根据ID删除答题记录
-     * @param id 答题记录ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据用户ID删除答题记录
-     * @param memberId 用户ID
-     * @return 是否删除成功
-     */
-    boolean deleteByMemberId(String memberId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java
index 728603a..807e3bd 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java
@@ -19,82 +19,4 @@
      */
     AiMemberRoleCategory getById(String id);
 
-    /**
-     * 根据角色ID查询关联记录
-     * @param roleId 角色ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleCategory> getByRoleId(String roleId);
-
-    /**
-     * 根据产品分类ID查询关联记录
-     * @param productCategoryId 产品分类ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleCategory> getByProductCategoryId(String productCategoryId);
-
-    /**
-     * 根据公司ID查询关联记录
-     * @param companyId 公司ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleCategory> getByCompanyId(String companyId);
-
-    /**
-     * 根据角色ID和产品分类ID查询关联记录
-     * @param roleId 角色ID
-     * @param productCategoryId 产品分类ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleCategory> getByRoleIdAndProductCategoryId(String roleId, String productCategoryId);
-
-    /**
-     * 保存关联记录
-     * @param aiMemberRoleCategory 关联记录实体
-     * @return 是否保存成功
-     */
-    boolean saveRoleCategory(AiMemberRoleCategory aiMemberRoleCategory);
-
-    /**
-     * 批量保存关联记录
-     * @param roleCategories 关联记录列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchRoleCategories(List<AiMemberRoleCategory> roleCategories);
-
-    /**
-     * 更新关联记录
-     * @param aiMemberRoleCategory 关联记录实体
-     * @return 是否更新成功
-     */
-    boolean updateRoleCategory(AiMemberRoleCategory aiMemberRoleCategory);
-
-    /**
-     * 根据ID删除关联记录
-     * @param id 关联记录ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据角色ID删除关联记录
-     * @param roleId 角色ID
-     * @return 是否删除成功
-     */
-    boolean deleteByRoleId(String roleId);
-
-    /**
-     * 根据产品分类ID删除关联记录
-     * @param productCategoryId 产品分类ID
-     * @return 是否删除成功
-     */
-    boolean deleteByProductCategoryId(String productCategoryId);
-
-    /**
-     * 根据角色ID和产品分类ID删除关联记录
-     * @param roleId 角色ID
-     * @param productCategoryId 产品分类ID
-     * @return 是否删除成功
-     */
-    boolean deleteByRoleIdAndProductCategoryId(String roleId, String productCategoryId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java
index 8dd64b0..83c38ab 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java
@@ -1,6 +1,7 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiMemberRoleProduct;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import java.util.List;
 
@@ -19,82 +20,7 @@
      */
     AiMemberRoleProduct getById(String id);
 
-    /**
-     * 根据角色ID查询关联记录
-     * @param roleId 角色ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleProduct> getByRoleId(String roleId);
+    List<AiMemberRoleProduct> selectListByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query);
 
-    /**
-     * 根据产品ID查询关联记录
-     * @param productId 产品ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleProduct> getByProductId(String productId);
-
-    /**
-     * 根据公司ID查询关联记录
-     * @param companyId 公司ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleProduct> getByCompanyId(String companyId);
-
-    /**
-     * 根据角色ID和产品ID查询关联记录
-     * @param roleId 角色ID
-     * @param productId 产品ID
-     * @return 关联记录列表
-     */
-    List<AiMemberRoleProduct> getByRoleIdAndProductId(String roleId, String productId);
-
-    /**
-     * 保存关联记录
-     * @param aiMemberRoleProduct 关联记录实体
-     * @return 是否保存成功
-     */
-    boolean saveRoleProduct(AiMemberRoleProduct aiMemberRoleProduct);
-
-    /**
-     * 批量保存关联记录
-     * @param roleProducts 关联记录列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchRoleProducts(List<AiMemberRoleProduct> roleProducts);
-
-    /**
-     * 更新关联记录
-     * @param aiMemberRoleProduct 关联记录实体
-     * @return 是否更新成功
-     */
-    boolean updateRoleProduct(AiMemberRoleProduct aiMemberRoleProduct);
-
-    /**
-     * 根据ID删除关联记录
-     * @param id 关联记录ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据角色ID删除关联记录
-     * @param roleId 角色ID
-     * @return 是否删除成功
-     */
-    boolean deleteByRoleId(String roleId);
-
-    /**
-     * 根据产品ID删除关联记录
-     * @param productId 产品ID
-     * @return 是否删除成功
-     */
-    boolean deleteByProductId(String productId);
-
-    /**
-     * 根据角色ID和产品ID删除关联记录
-     * @param roleId 角色ID
-     * @param productId 产品ID
-     * @return 是否删除成功
-     */
-    boolean deleteByRoleIdAndProductId(String roleId, String productId);
+    void deleteByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query);
 }
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 efbb525..e7c15f3 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java
@@ -1,6 +1,10 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiMemberRole;
+import cc.mrbird.febs.ai.req.AdminMoveChooseInfoDto;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import java.util.List;
 
@@ -19,74 +23,15 @@
      */
     AiMemberRole getById(String id);
 
-    /**
-     * 根据公司ID查询角色列表
-     * @param companyId 公司ID
-     * @return 角色列表
-     */
-    List<AiMemberRole> getByCompanyId(String companyId);
+    IPage<AiMemberRole> listInPage(AiMemberRole dto, QueryRequest request);
 
-    /**
-     * 根据编码查询角色
-     * @param code 角色编码
-     * @return 角色信息
-     */
-    AiMemberRole getByCode(String code);
+    FebsResponse changeState(String id, Integer state);
 
-    /**
-     * 根据名称查询角色列表
-     * @param name 角色名称
-     * @return 角色列表
-     */
-    List<AiMemberRole> getByName(String name);
+    FebsResponse memberRoleAdd(AiMemberRole dto);
 
-    /**
-     * 根据状态查询角色列表
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return 角色列表
-     */
-    List<AiMemberRole> getByState(Integer state);
+    FebsResponse updateMemberRole(AiMemberRole dto);
 
-    /**
-     * 根据公司ID和状态查询角色列表
-     * @param companyId 公司ID
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return 角色列表
-     */
-    List<AiMemberRole> getByCompanyIdAndState(String companyId, Integer state);
+    FebsResponse delete(String id);
 
-    /**
-     * 保存角色
-     * @param aiMemberRole 角色实体
-     * @return 是否保存成功
-     */
-    boolean saveRole(AiMemberRole aiMemberRole);
-
-    /**
-     * 批量保存角色
-     * @param roles 角色列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchRoles(List<AiMemberRole> roles);
-
-    /**
-     * 更新角色
-     * @param aiMemberRole 角色实体
-     * @return 是否更新成功
-     */
-    boolean updateRole(AiMemberRole aiMemberRole);
-
-    /**
-     * 根据ID删除角色
-     * @param id 角色ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据公司ID删除角色
-     * @param companyId 公司ID
-     * @return 是否删除成功
-     */
-    boolean deleteByCompanyId(String companyId);
+    FebsResponse productSet(AdminMoveChooseInfoDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java
index 4f29e78..9374f9c 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java
@@ -19,59 +19,5 @@
      */
     AiMemberTalkItem getById(String id);
 
-    /**
-     * 根据对话ID查询所有对话项
-     * @param memberTalkId 对话ID
-     * @return 对话项列表
-     */
-    List<AiMemberTalkItem> getByMemberTalkId(String memberTalkId);
 
-    /**
-     * 根据用户ID查询对话项
-     * @param memberId 用户ID
-     * @return 对话项列表
-     */
-    List<AiMemberTalkItem> getByMemberId(String memberId);
-
-    /**
-     * 根据类型查询对话项
-     * @param type 类型 1-AI提问 2-用户回答 3-AI分析结果
-     * @return 对话项列表
-     */
-    List<AiMemberTalkItem> getByType(Integer type);
-
-    /**
-     * 保存对话项
-     * @param aiMemberTalkItem 对话项实体
-     * @return 是否保存成功
-     */
-    boolean saveTalkItem(AiMemberTalkItem aiMemberTalkItem);
-
-    /**
-     * 批量保存对话项
-     * @param talkItems 对话项列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchTalkItems(List<AiMemberTalkItem> talkItems);
-
-    /**
-     * 更新对话项
-     * @param aiMemberTalkItem 对话项实体
-     * @return 是否更新成功
-     */
-    boolean updateTalkItem(AiMemberTalkItem aiMemberTalkItem);
-
-    /**
-     * 根据ID删除对话项
-     * @param id 对话项ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据对话ID删除对话项
-     * @param memberTalkId 对话ID
-     * @return 是否删除成功
-     */
-    boolean deleteByMemberTalkId(String memberTalkId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
index d9d063e..f3cd28b 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
@@ -19,66 +19,5 @@
      */
     AiMemberTalk getById(String id);
 
-    /**
-     * 根据用户ID查询对话记录
-     * @param memberId 用户ID
-     * @return 对话记录列表
-     */
-    List<AiMemberTalk> getByMemberId(String memberId);
 
-    /**
-     * 根据产品ID查询对话记录
-     * @param productId 产品ID
-     * @return 对话记录列表
-     */
-    List<AiMemberTalk> getByProductId(String productId);
-
-    /**
-     * 根据角色ID查询对话记录
-     * @param productRoleId 角色ID
-     * @return 对话记录列表
-     */
-    List<AiMemberTalk> getByProductRoleId(String productRoleId);
-
-    /**
-     * 根据公司ID查询对话记录
-     * @param companyId 公司ID
-     * @return 对话记录列表
-     */
-    List<AiMemberTalk> getByCompanyId(String companyId);
-
-    /**
-     * 保存对话记录
-     * @param aiMemberTalk 对话记录实体
-     * @return 是否保存成功
-     */
-    boolean saveTalk(AiMemberTalk aiMemberTalk);
-
-    /**
-     * 批量保存对话记录
-     * @param talks 对话记录列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchTalks(List<AiMemberTalk> talks);
-
-    /**
-     * 更新对话记录
-     * @param aiMemberTalk 对话记录实体
-     * @return 是否更新成功
-     */
-    boolean updateTalk(AiMemberTalk aiMemberTalk);
-
-    /**
-     * 根据ID删除对话记录
-     * @param id 对话记录ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据用户ID删除对话记录
-     * @param memberId 用户ID
-     * @return 是否删除成功
-     */
-    boolean deleteByMemberId(String memberId);
 }
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 d9081cb..1e2ce17 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
@@ -1,8 +1,14 @@
 package cc.mrbird.febs.ai.service;
 
+import cc.mrbird.febs.ai.entity.AiMemberRole;
 import cc.mrbird.febs.ai.entity.AiProductCategory;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * AI产品类别 Service接口
@@ -19,95 +25,19 @@
      */
     AiProductCategory getById(String id);
 
-    /**
-     * 根据公司ID查询AI产品类别列表
-     * @param companyId 公司ID
-     * @return AI产品类别列表
-     */
-    List<AiProductCategory> getByCompanyId(String companyId);
+    List<AiProductCategory> getList();
 
-    /**
-     * 根据编码查询AI产品类别
-     * @param code 类别编码
-     * @return AI产品类别信息
-     */
-    AiProductCategory getByCode(String code);
+    Map<String, AiProductCategory> selectMapByIds(Set<String> collect);
 
-    /**
-     * 根据名称查询AI产品类别列表
-     * @param name 类别名称
-     * @return AI产品类别列表
-     */
-    List<AiProductCategory> getByName(String name);
+    IPage<AiProductCategory> listInPage(AiProductCategory dto, QueryRequest request);
 
-    /**
-     * 根据状态查询AI产品类别列表
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return AI产品类别列表
-     */
-    List<AiProductCategory> getByState(Integer state);
+    FebsResponse changeState(String id, Integer type, Integer state);
 
-    /**
-     * 根据是否推荐查询AI产品类别列表
-     * @param hotState 是否推荐到首页 1-推荐 0-不推荐
-     * @return AI产品类别列表
-     */
-    List<AiProductCategory> getByHotState(Integer hotState);
+    FebsResponse add(AiProductCategory dto);
 
-    /**
-     * 根据公司ID和状态查询AI产品类别列表
-     * @param companyId 公司ID
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return AI产品类别列表
-     */
-    List<AiProductCategory> getByCompanyIdAndState(String companyId, Integer state);
+    FebsResponse update(AiProductCategory dto);
 
-    /**
-     * 根据公司ID和推荐状态查询AI产品类别列表
-     * @param companyId 公司ID
-     * @param hotState 是否推荐到首页 1-推荐 0-不推荐
-     * @return AI产品类别列表
-     */
-    List<AiProductCategory> getByCompanyIdAndHotState(String companyId, Integer hotState);
+    FebsResponse delete(String id);
 
-    /**
-     * 获取启用状态下的所有AI产品类别,按排序字段升序排列
-     * @return 启用的AI产品类别列表
-     */
-    List<AiProductCategory> getEnabledCategories();
-
-    /**
-     * 保存AI产品类别
-     * @param aiProductCategory AI产品类别实体
-     * @return 是否保存成功
-     */
-    boolean saveProductCategory(AiProductCategory aiProductCategory);
-
-    /**
-     * 批量保存AI产品类别
-     * @param productCategories AI产品类别列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchProductCategories(List<AiProductCategory> productCategories);
-
-    /**
-     * 更新AI产品类别
-     * @param aiProductCategory AI产品类别实体
-     * @return 是否更新成功
-     */
-    boolean updateProductCategory(AiProductCategory aiProductCategory);
-
-    /**
-     * 根据ID删除AI产品类别
-     * @param id 类别ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据公司ID删除AI产品类别
-     * @param companyId 公司ID
-     * @return 是否删除成功
-     */
-    boolean deleteByCompanyId(String companyId);
+    List<AiProductCategory> categoryTree();
 }
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 b71c7d2..54d38b1 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java
@@ -19,88 +19,5 @@
      */
     AiProductPoint getById(String id);
 
-    /**
-     * 根据公司ID查询AI产品知识点列表
-     * @param companyId 公司ID
-     * @return AI产品知识点列表
-     */
-    List<AiProductPoint> getByCompanyId(String companyId);
 
-    /**
-     * 根据类型查询AI产品知识点列表
-     * @param isNormal 类型1:普通内容 2:视频号内容
-     * @return AI产品知识点列表
-     */
-    List<AiProductPoint> getByIsNormal(Integer isNormal);
-
-    /**
-     * 根据视频号用户名查询AI产品知识点列表
-     * @param finderUserName 视频号用户名
-     * @return AI产品知识点列表
-     */
-    List<AiProductPoint> getByFinderUserName(String finderUserName);
-
-    /**
-     * 根据标题查询AI产品知识点列表
-     * @param title 标题
-     * @return AI产品知识点列表
-     */
-    List<AiProductPoint> getByTitle(String title);
-
-    /**
-     * 根据公司ID和类型查询AI产品知识点列表
-     * @param companyId 公司ID
-     * @param isNormal 类型1:普通内容 2:视频号内容
-     * @return AI产品知识点列表
-     */
-    List<AiProductPoint> getByCompanyIdAndIsNormal(String companyId, Integer isNormal);
-
-    /**
-     * 模糊查询标题或描述包含关键字的AI产品知识点列表
-     * @param keyword 关键字
-     * @return AI产品知识点列表
-     */
-    List<AiProductPoint> searchByKeyword(String keyword);
-
-    /**
-     * 保存AI产品知识点
-     * @param aiProductPoint AI产品知识点实体
-     * @return 是否保存成功
-     */
-    boolean saveProductPoint(AiProductPoint aiProductPoint);
-
-    /**
-     * 批量保存AI产品知识点
-     * @param productPoints AI产品知识点列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchProductPoints(List<AiProductPoint> productPoints);
-
-    /**
-     * 更新AI产品知识点
-     * @param aiProductPoint AI产品知识点实体
-     * @return 是否更新成功
-     */
-    boolean updateProductPoint(AiProductPoint aiProductPoint);
-
-    /**
-     * 根据ID删除AI产品知识点
-     * @param id 知识点ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据公司ID删除AI产品知识点
-     * @param companyId 公司ID
-     * @return 是否删除成功
-     */
-    boolean deleteByCompanyId(String companyId);
-
-    /**
-     * 根据视频号FeedID删除AI产品知识点
-     * @param feedId 视频号FeedID
-     * @return 是否删除成功
-     */
-    boolean deleteByFeedId(String feedId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java
index 78853bd..8a7ea6d 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java
@@ -19,105 +19,5 @@
      */
     AiProductQuestionLink getById(String id);
 
-    /**
-     * 根据公司ID查询产品题目关系列表
-     * @param companyId 公司ID
-     * @return 产品题目关系列表
-     */
-    List<AiProductQuestionLink> getByCompanyId(String companyId);
 
-    /**
-     * 根据产品题目ID查询产品题目关系列表
-     * @param productQuestionId 产品题目ID
-     * @return 产品题目关系列表
-     */
-    List<AiProductQuestionLink> getByProductQuestionId(String productQuestionId);
-
-    /**
-     * 根据产品ID查询产品题目关系列表
-     * @param productId 产品ID
-     * @return 产品题目关系列表
-     */
-    List<AiProductQuestionLink> getByProductId(String productId);
-
-    /**
-     * 根据公司ID和产品ID查询产品题目关系列表
-     * @param companyId 公司ID
-     * @param productId 产品ID
-     * @return 产品题目关系列表
-     */
-    List<AiProductQuestionLink> getByCompanyIdAndProductId(String companyId, String productId);
-
-    /**
-     * 根据公司ID和产品题目ID查询产品题目关系列表
-     * @param companyId 公司ID
-     * @param productQuestionId 产品题目ID
-     * @return 产品题目关系列表
-     */
-    List<AiProductQuestionLink> getByCompanyIdAndProductQuestionId(String companyId, String productQuestionId);
-
-    /**
-     * 根据产品ID和产品题目ID查询产品题目关系列表
-     * @param productId 产品ID
-     * @param productQuestionId 产品题目ID
-     * @return 产品题目关系列表
-     */
-    List<AiProductQuestionLink> getByProductIdAndProductQuestionId(String productId, String productQuestionId);
-
-    /**
-     * 保存产品题目关系
-     * @param aiProductQuestionLink 产品题目关系实体
-     * @return 是否保存成功
-     */
-    boolean saveProductQuestionLink(AiProductQuestionLink aiProductQuestionLink);
-
-    /**
-     * 批量保存产品题目关系
-     * @param productQuestionLinks 产品题目关系列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchProductQuestionLinks(List<AiProductQuestionLink> productQuestionLinks);
-
-    /**
-     * 更新产品题目关系
-     * @param aiProductQuestionLink 产品题目关系实体
-     * @return 是否更新成功
-     */
-    boolean updateProductQuestionLink(AiProductQuestionLink aiProductQuestionLink);
-
-    /**
-     * 根据ID删除产品题目关系
-     * @param id 关系ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据产品ID删除产品题目关系
-     * @param productId 产品ID
-     * @return 是否删除成功
-     */
-    boolean deleteByProductId(String productId);
-
-    /**
-     * 根据产品题目ID删除产品题目关系
-     * @param productQuestionId 产品题目ID
-     * @return 是否删除成功
-     */
-    boolean deleteByProductQuestionId(String productQuestionId);
-
-    /**
-     * 根据公司ID删除产品题目关系
-     * @param companyId 公司ID
-     * @return 是否删除成功
-     */
-    boolean deleteByCompanyId(String companyId);
-
-    /**
-     * 根据产品ID和产品题目ID删除产品题目关系
-     * @param productId 产品ID
-     * @param productQuestionId 产品题目ID
-     * @return 是否删除成功
-     */
-    boolean deleteByProductIdAndProductQuestionId(String productId, String productQuestionId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java
index 1b31504..1bdf6f1 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java
@@ -19,110 +19,4 @@
      */
     AiProductQuestion getById(String id);
 
-    /**
-     * 根据公司ID查询AI产品题目列表
-     * @param companyId 公司ID
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByCompanyId(String companyId);
-
-    /**
-     * 根据AI产品类别ID查询AI产品题目列表
-     * @param productCategoryId AI产品类别ID
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByProductCategoryId(String productCategoryId);
-
-    /**
-     * 根据题目查询AI产品题目列表
-     * @param title 题目
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByTitle(String title);
-
-    /**
-     * 根据父ID查询AI产品题目列表
-     * @param parentId 父ID
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByParentId(String parentId);
-
-    /**
-     * 根据难度查询AI产品题目列表
-     * @param difficulty 难度:1-简单,2-中等,3-困难
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByDifficulty(Integer difficulty);
-
-    /**
-     * 根据状态查询AI产品题目列表
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByState(Integer state);
-
-    /**
-     * 根据是否正确答案查询AI产品题目列表
-     * @param correctAnswer 是否是正确答案 0-否 1-是
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByCorrectAnswer(Integer correctAnswer);
-
-    /**
-     * 根据公司ID和状态查询AI产品题目列表
-     * @param companyId 公司ID
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByCompanyIdAndState(String companyId, Integer state);
-
-    /**
-     * 根据父ID和状态查询AI产品题目列表(获取同一题目的所有选项)
-     * @param parentId 父ID
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return AI产品题目列表
-     */
-    List<AiProductQuestion> getByParentIdAndState(String parentId, Integer state);
-
-    /**
-     * 保存AI产品题目
-     * @param aiProductQuestion AI产品题目实体
-     * @return 是否保存成功
-     */
-    boolean saveProductQuestion(AiProductQuestion aiProductQuestion);
-
-    /**
-     * 批量保存AI产品题目
-     * @param productQuestions AI产品题目列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchProductQuestions(List<AiProductQuestion> productQuestions);
-
-    /**
-     * 更新AI产品题目
-     * @param aiProductQuestion AI产品题目实体
-     * @return 是否更新成功
-     */
-    boolean updateProductQuestion(AiProductQuestion aiProductQuestion);
-
-    /**
-     * 根据ID删除AI产品题目
-     * @param id 题目ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据父ID删除AI产品题目(删除整个题目及其选项)
-     * @param parentId 父ID
-     * @return 是否删除成功
-     */
-    boolean deleteByParentId(String parentId);
-
-    /**
-     * 根据公司ID删除AI产品题目
-     * @param companyId 公司ID
-     * @return 是否删除成功
-     */
-    boolean deleteByCompanyId(String companyId);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java
index 384af47..47d2231 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java
@@ -19,74 +19,4 @@
      */
     AiProductRole getById(String id);
 
-    /**
-     * 根据公司ID查询AI产品角色列表
-     * @param companyId 公司ID
-     * @return AI产品角色列表
-     */
-    List<AiProductRole> getByCompanyId(String companyId);
-
-    /**
-     * 根据AI产品ID查询AI产品角色列表
-     * @param productId AI产品ID
-     * @return AI产品角色列表
-     */
-    List<AiProductRole> getByProductId(String productId);
-
-    /**
-     * 根据名称查询AI产品角色列表
-     * @param name 角色名称
-     * @return AI产品角色列表
-     */
-    List<AiProductRole> getByName(String name);
-
-    /**
-     * 根据公司ID和产品ID查询AI产品角色列表
-     * @param companyId 公司ID
-     * @param productId AI产品ID
-     * @return AI产品角色列表
-     */
-    List<AiProductRole> getByCompanyIdAndProductId(String companyId, String productId);
-
-    /**
-     * 保存AI产品角色
-     * @param aiProductRole AI产品角色实体
-     * @return 是否保存成功
-     */
-    boolean saveProductRole(AiProductRole aiProductRole);
-
-    /**
-     * 批量保存AI产品角色
-     * @param productRoles AI产品角色列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchProductRoles(List<AiProductRole> productRoles);
-
-    /**
-     * 更新AI产品角色
-     * @param aiProductRole AI产品角色实体
-     * @return 是否更新成功
-     */
-    boolean updateProductRole(AiProductRole aiProductRole);
-
-    /**
-     * 根据ID删除AI产品角色
-     * @param id 角色ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据AI产品ID删除AI产品角色
-     * @param productId AI产品ID
-     * @return 是否删除成功
-     */
-    boolean deleteByProductId(String productId);
-
-    /**
-     * 根据公司ID删除AI产品角色
-     * @param companyId 公司ID
-     * @return 是否删除成功
-     */
-    boolean deleteByCompanyId(String companyId);
 }
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 7e5b27a..45bf65b 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,10 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.entity.ClothesArt;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import java.util.List;
 
@@ -19,96 +23,15 @@
      */
     AiProduct getById(String id);
 
-    /**
-     * 根据公司ID查询AI产品列表
-     * @param companyId 公司ID
-     * @return AI产品列表
-     */
-    List<AiProduct> getByCompanyId(String companyId);
+    IPage<AiProduct> listInPage(AiProduct dto, QueryRequest request);
 
-    /**
-     * 根据编码查询AI产品
-     * @param code 产品编码
-     * @return AI产品信息
-     */
-    AiProduct getByCode(String code);
+    FebsResponse changeState(String id, Integer type, Integer state);
 
-    /**
-     * 根据名称查询AI产品列表
-     * @param name 产品名称
-     * @return AI产品列表
-     */
-    List<AiProduct> getByName(String name);
+    FebsResponse add(AiProduct dto);
 
-    /**
-     * 根据产品类别ID查询AI产品列表
-     * @param productCategoryId 产品类别ID
-     * @return AI产品列表
-     */
-    List<AiProduct> getByProductCategoryId(String productCategoryId);
+    FebsResponse update(AiProduct dto);
 
-    /**
-     * 根据状态查询AI产品列表
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return AI产品列表
-     */
-    List<AiProduct> getByState(Integer state);
+    FebsResponse delete(String id);
 
-    /**
-     * 根据是否推荐查询AI产品列表
-     * @param hotState 是否推荐到首页 1-推荐 0-不推荐
-     * @return AI产品列表
-     */
-    List<AiProduct> getByHotState(Integer hotState);
-
-    /**
-     * 根据公司ID和状态查询AI产品列表
-     * @param companyId 公司ID
-     * @param state 状态 0-禁用 1-启用 2-已删除
-     * @return AI产品列表
-     */
-    List<AiProduct> getByCompanyIdAndState(String companyId, Integer state);
-
-    /**
-     * 根据公司ID和推荐状态查询AI产品列表
-     * @param companyId 公司ID
-     * @param hotState 是否推荐到首页 1-推荐 0-不推荐
-     * @return AI产品列表
-     */
-    List<AiProduct> getByCompanyIdAndHotState(String companyId, Integer hotState);
-
-    /**
-     * 保存AI产品
-     * @param aiProduct AI产品实体
-     * @return 是否保存成功
-     */
-    boolean saveProduct(AiProduct aiProduct);
-
-    /**
-     * 批量保存AI产品
-     * @param products AI产品列表
-     * @return 是否保存成功
-     */
-    boolean saveBatchProducts(List<AiProduct> products);
-
-    /**
-     * 更新AI产品
-     * @param aiProduct AI产品实体
-     * @return 是否更新成功
-     */
-    boolean updateProduct(AiProduct aiProduct);
-
-    /**
-     * 根据ID删除AI产品
-     * @param id 产品ID
-     * @return 是否删除成功
-     */
-    boolean deleteById(String id);
-
-    /**
-     * 根据公司ID删除AI产品
-     * @param companyId 公司ID
-     * @return 是否删除成功
-     */
-    boolean deleteByCompanyId(String companyId);
+    List<AiProduct> selectList();
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java
index 22bc4e1..a7510ab 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java
@@ -27,128 +27,7 @@
 
     @Override
     public AiMemberAnswerItem getById(String id) {
-        return this.getById(id);
+        return aiMemberAnswerItemMapper.selectById(id);
     }
 
-    @Override
-    public List<AiMemberAnswerItem> getByAnswerId(String answerId) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getAnswerId, answerId);
-        queryWrapper.orderByAsc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswerItem> getByMemberId(String memberId) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getMemberId, memberId);
-        queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswerItem> getByProductId(String productId) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getProductId, productId);
-        queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswerItem> getByProductQuestionParentId(String productQuestionParentId) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getProductQuestionParentId, productQuestionParentId);
-        queryWrapper.orderByAsc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswerItem> getByProductQuestionId(String productQuestionId) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getProductQuestionId, productQuestionId);
-        queryWrapper.orderByAsc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswerItem> getByMemberAnswerState(Integer memberAnswerState) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getMemberAnswerState, memberAnswerState);
-        queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswerItem> getByIsCollected(Integer isCollected) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getIsCollected, isCollected);
-        queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswerItem> getByCompanyIdAndMemberId(String companyId, String memberId) {
-        LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswerItem::getCompanyId, companyId);
-        queryWrapper.eq(AiMemberAnswerItem::getMemberId, memberId);
-        queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveAnswerItem(AiMemberAnswerItem aiMemberAnswerItem) {
-        try {
-            return this.save(aiMemberAnswerItem);
-        } catch (Exception e) {
-            log.error("保存答题记录项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchAnswerItems(List<AiMemberAnswerItem> answerItems) {
-        try {
-            return this.saveBatch(answerItems);
-        } catch (Exception e) {
-            log.error("批量保存答题记录项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateAnswerItem(AiMemberAnswerItem aiMemberAnswerItem) {
-        try {
-            return this.updateById(aiMemberAnswerItem);
-        } catch (Exception e) {
-            log.error("更新答题记录项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除答题记录项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByAnswerId(String answerId) {
-        try {
-            LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberAnswerItem::getAnswerId, answerId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据答题记录ID删除答题记录项失败: ", e);
-            return false;
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
index 9a4d288..cc1d109 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
@@ -27,122 +27,7 @@
 
     @Override
     public AiMemberAnswer getById(String id) {
-        return this.getById(id);
+        return aiMemberAnswerMapper.selectById(id);
     }
 
-    @Override
-    public List<AiMemberAnswer> getByMemberId(String memberId) {
-        LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswer::getMemberId, memberId);
-        queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswer> getByProductId(String productId) {
-        LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswer::getProductId, productId);
-        queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswer> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswer::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswer> getByState(Integer state) {
-        LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswer::getState, state);
-        queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswer> getByMemberIdAndState(String memberId, Integer state) {
-        LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswer::getMemberId, memberId);
-        queryWrapper.eq(AiMemberAnswer::getState, state);
-        queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswer> getByCompanyIdAndMemberId(String companyId, String memberId) {
-        LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberAnswer::getCompanyId, companyId);
-        queryWrapper.eq(AiMemberAnswer::getMemberId, memberId);
-        queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberAnswer> getByScoreRange(Integer minScore, Integer maxScore) {
-        LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.ge(AiMemberAnswer::getScore, minScore);
-        queryWrapper.le(AiMemberAnswer::getScore, maxScore);
-        queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveAnswer(AiMemberAnswer aiMemberAnswer) {
-        try {
-            return this.save(aiMemberAnswer);
-        } catch (Exception e) {
-            log.error("保存答题记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchAnswers(List<AiMemberAnswer> answers) {
-        try {
-            return this.saveBatch(answers);
-        } catch (Exception e) {
-            log.error("批量保存答题记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateAnswer(AiMemberAnswer aiMemberAnswer) {
-        try {
-            return this.updateById(aiMemberAnswer);
-        } catch (Exception e) {
-            log.error("更新答题记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除答题记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByMemberId(String memberId) {
-        try {
-            LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberAnswer::getMemberId, memberId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据用户ID删除答题记录失败: ", e);
-            return false;
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java
index e5969dc..abb33fc 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java
@@ -27,119 +27,7 @@
 
     @Override
     public AiMemberRoleCategory getById(String id) {
-        return this.getById(id);
+        return aiMemberRoleCategoryMapper.selectById(id);
     }
 
-    @Override
-    public List<AiMemberRoleCategory> getByRoleId(String roleId) {
-        LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberRoleCategory> getByProductCategoryId(String productCategoryId) {
-        LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberRoleCategory> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleCategory::getCompanyId, companyId);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberRoleCategory> getByRoleIdAndProductCategoryId(String roleId, String productCategoryId) {
-        LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId);
-        queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveRoleCategory(AiMemberRoleCategory aiMemberRoleCategory) {
-        try {
-            return this.save(aiMemberRoleCategory);
-        } catch (Exception e) {
-            log.error("保存角色产品分类关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchRoleCategories(List<AiMemberRoleCategory> roleCategories) {
-        try {
-            return this.saveBatch(roleCategories);
-        } catch (Exception e) {
-            log.error("批量保存角色产品分类关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateRoleCategory(AiMemberRoleCategory aiMemberRoleCategory) {
-        try {
-            return this.updateById(aiMemberRoleCategory);
-        } catch (Exception e) {
-            log.error("更新角色产品分类关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除角色产品分类关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByRoleId(String roleId) {
-        try {
-            LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据角色ID删除角色产品分类关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByProductCategoryId(String productCategoryId) {
-        try {
-            LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据产品分类ID删除角色产品分类关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByRoleIdAndProductCategoryId(String roleId, String productCategoryId) {
-        try {
-            LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId);
-            queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据角色ID和产品分类ID删除角色产品分类关联记录失败: ", e);
-            return false;
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java
index 8ba2b70..6bbaf47 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java
@@ -3,7 +3,9 @@
 import cc.mrbird.febs.ai.entity.AiMemberRoleProduct;
 import cc.mrbird.febs.ai.mapper.AiMemberRoleProductMapper;
 import cc.mrbird.febs.ai.service.AiMemberRoleProductService;
+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.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -27,119 +29,19 @@
 
     @Override
     public AiMemberRoleProduct getById(String id) {
-        return this.getById(id);
+
+        return aiMemberRoleProductMapper.selectById(id);
     }
 
     @Override
-    public List<AiMemberRoleProduct> getByRoleId(String roleId) {
-        LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId);
-        return this.list(queryWrapper);
+    public List<AiMemberRoleProduct> selectListByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query) {
+        return aiMemberRoleProductMapper.selectList( query);
     }
 
     @Override
-    public List<AiMemberRoleProduct> getByProductId(String productId) {
-        LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleProduct::getProductId, productId);
-        return this.list(queryWrapper);
+    public void deleteByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query) {
+        aiMemberRoleProductMapper.delete( query);
     }
 
-    @Override
-    public List<AiMemberRoleProduct> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleProduct::getCompanyId, companyId);
-        return this.list(queryWrapper);
-    }
 
-    @Override
-    public List<AiMemberRoleProduct> getByRoleIdAndProductId(String roleId, String productId) {
-        LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId);
-        queryWrapper.eq(AiMemberRoleProduct::getProductId, productId);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveRoleProduct(AiMemberRoleProduct aiMemberRoleProduct) {
-        try {
-            return this.save(aiMemberRoleProduct);
-        } catch (Exception e) {
-            log.error("保存角色产品关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchRoleProducts(List<AiMemberRoleProduct> roleProducts) {
-        try {
-            return this.saveBatch(roleProducts);
-        } catch (Exception e) {
-            log.error("批量保存角色产品关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateRoleProduct(AiMemberRoleProduct aiMemberRoleProduct) {
-        try {
-            return this.updateById(aiMemberRoleProduct);
-        } catch (Exception e) {
-            log.error("更新角色产品关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除角色产品关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByRoleId(String roleId) {
-        try {
-            LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据角色ID删除角色产品关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByProductId(String productId) {
-        try {
-            LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberRoleProduct::getProductId, productId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据产品ID删除角色产品关联记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByRoleIdAndProductId(String roleId, String productId) {
-        try {
-            LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId);
-            queryWrapper.eq(AiMemberRoleProduct::getProductId, productId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据角色ID和产品ID删除角色产品关联记录失败: ", e);
-            return false;
-        }
-    }
 }
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 c0e8f0a..97ea8dc 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
@@ -1,15 +1,28 @@
 package cc.mrbird.febs.ai.service.impl;
 
 import cc.mrbird.febs.ai.entity.AiMemberRole;
+import cc.mrbird.febs.ai.entity.AiMemberRoleProduct;
 import cc.mrbird.febs.ai.mapper.AiMemberRoleMapper;
+import cc.mrbird.febs.ai.req.AdminMoveChooseInfoDto;
+import cc.mrbird.febs.ai.service.AiMemberRoleProductService;
 import cc.mrbird.febs.ai.service.AiMemberRoleService;
+import cc.mrbird.febs.ai.service.AiProductService;
+import cc.mrbird.febs.ai.util.UUID;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.entity.ClothesTypeArt;
+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.metadata.IPage;
+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.Date;
 import java.util.List;
 
 /**
@@ -24,106 +37,106 @@
 public class AiMemberRoleServiceImpl extends ServiceImpl<AiMemberRoleMapper, AiMemberRole> implements AiMemberRoleService {
 
     private final AiMemberRoleMapper aiMemberRoleMapper;
+    private final AiProductService aiProductService;
+    private final AiMemberRoleProductService aiMemberRoleProductService;
 
     @Override
     public AiMemberRole getById(String id) {
-        return this.getById(id);
+        return aiMemberRoleMapper.selectById(id);
     }
 
     @Override
-    public List<AiMemberRole> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRole::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiMemberRole::getCreatedTime);
-        return this.list(queryWrapper);
+    public IPage<AiMemberRole> listInPage(AiMemberRole dto, QueryRequest request) {
+
+        Page<AiMemberRole> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<AiMemberRole> query = Wrappers.lambdaQuery(AiMemberRole.class);
+        query.ne(AiMemberRole::getState, 2);
+        query.orderByAsc(AiMemberRole::getSort);
+        Page<AiMemberRole> pages = aiMemberRoleMapper.selectPage(page, query);
+        return pages;
     }
 
     @Override
-    public AiMemberRole getByCode(String code) {
-        LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRole::getCode, code);
-        return this.getOne(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberRole> getByName(String name) {
-        LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRole::getName, name);
-        queryWrapper.orderByDesc(AiMemberRole::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberRole> getByState(Integer state) {
-        LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRole::getState, state);
-        queryWrapper.orderByDesc(AiMemberRole::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberRole> getByCompanyIdAndState(String companyId, Integer state) {
-        LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberRole::getCompanyId, companyId);
-        queryWrapper.eq(AiMemberRole::getState, state);
-        queryWrapper.orderByDesc(AiMemberRole::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveRole(AiMemberRole aiMemberRole) {
-        try {
-            return this.save(aiMemberRole);
-        } catch (Exception e) {
-            log.error("保存角色失败: ", e);
-            return false;
+    public FebsResponse changeState(String id, Integer state) {
+        AiMemberRole entity = this.getById(id);
+        if(ObjectUtil.isNotEmpty(entity)){
+            this.update(null,
+                    Wrappers.lambdaUpdate(AiMemberRole.class)
+                            .set(AiMemberRole::getState, state)
+                            .set(AiMemberRole::getUpdatedTime, new Date())
+                            .eq(AiMemberRole::getId, id));
         }
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchRoles(List<AiMemberRole> roles) {
-        try {
-            return this.saveBatch(roles);
-        } catch (Exception e) {
-            log.error("批量保存角色失败: ", e);
-            return false;
-        }
+    public FebsResponse memberRoleAdd(AiMemberRole dto) {
+        AiMemberRole entity = new AiMemberRole();
+        entity.setId(UUID.getSimpleUUIDString());
+        entity.setName(dto.getName());
+        entity.setCode(dto.getCode());
+        entity.setIconImg(dto.getIconImg());
+        entity.setSort(dto.getSort());
+        entity.setState(dto.getState());
+        entity.setCreatedTime(new Date());
+        this.save( entity);
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateRole(AiMemberRole aiMemberRole) {
-        try {
-            return this.updateById(aiMemberRole);
-        } catch (Exception e) {
-            log.error("更新角色失败: ", e);
-            return false;
+    public FebsResponse updateMemberRole(AiMemberRole dto) {
+
+        String id = dto.getId();
+        AiMemberRole entity = this.getById(id);
+        if(ObjectUtil.isNotNull( entity)){
+            this.update(null,
+                    Wrappers.lambdaUpdate(AiMemberRole.class)
+                            .set(AiMemberRole::getCode, dto.getCode())
+                            .set(AiMemberRole::getName, dto.getName())
+                            .set(AiMemberRole::getIconImg, dto.getIconImg())
+                            .set(AiMemberRole::getSort, dto.getSort())
+                            .set(AiMemberRole::getUpdatedTime, new Date())
+                            .eq(AiMemberRole::getId, id));
+
         }
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除角色失败: ", e);
-            return false;
+    public FebsResponse delete(String id) {
+        AiMemberRole entity = this.getById(id);
+        if(ObjectUtil.isNotNull( entity)){
+            this.update(null,
+                    Wrappers.lambdaUpdate(AiMemberRole.class)
+                            .set(AiMemberRole::getState, 2)
+                            .set(AiMemberRole::getUpdatedTime, new Date())
+                            .eq(AiMemberRole::getId, id));
+
         }
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByCompanyId(String companyId) {
-        try {
-            LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberRole::getCompanyId, companyId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据公司ID删除角色失败: ", e);
-            return false;
+    public FebsResponse productSet(AdminMoveChooseInfoDto dto) {
+        String roleId = dto.getRoleId();
+        List<String> chooseIds = dto.getChooseIds();
+        AiMemberRole aiMemberRole = this.getById(roleId);
+        if (ObjectUtil.isNotNull(aiMemberRole)) {
+            aiMemberRoleProductService.deleteByQuery(
+                    Wrappers.lambdaQuery(AiMemberRoleProduct.class)
+                            .eq(AiMemberRoleProduct::getRoleId,roleId)
+            );
+            if(CollUtil.isNotEmpty(chooseIds)){
+                Date createdTime = new Date();
+                for (String chooseId : chooseIds){
+                    AiMemberRoleProduct entity = new AiMemberRoleProduct();
+                    entity.setRoleId(roleId);
+                    entity.setProductId(chooseId);
+                    entity.setCreatedTime(createdTime);
+                    aiMemberRoleProductService.getBaseMapper().insert(entity);
+                }
+            }
         }
+        return new FebsResponse().success().message("操作成功");
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java
index 4810016..9f239ca 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java
@@ -27,87 +27,7 @@
 
     @Override
     public AiMemberTalkItem getById(String id) {
-        return this.getById(id);
+        return aiMemberTalkItemMapper.selectById(id);
     }
 
-    @Override
-    public List<AiMemberTalkItem> getByMemberTalkId(String memberTalkId) {
-        LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberTalkItem::getMemberTalkId, memberTalkId);
-        queryWrapper.orderByAsc(AiMemberTalkItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberTalkItem> getByMemberId(String memberId) {
-        LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberTalkItem::getMemberId, memberId);
-        queryWrapper.orderByAsc(AiMemberTalkItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberTalkItem> getByType(Integer type) {
-        LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberTalkItem::getType, type);
-        queryWrapper.orderByAsc(AiMemberTalkItem::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveTalkItem(AiMemberTalkItem aiMemberTalkItem) {
-        try {
-            return this.save(aiMemberTalkItem);
-        } catch (Exception e) {
-            log.error("保存对话项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchTalkItems(List<AiMemberTalkItem> talkItems) {
-        try {
-            return this.saveBatch(talkItems);
-        } catch (Exception e) {
-            log.error("批量保存对话项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateTalkItem(AiMemberTalkItem aiMemberTalkItem) {
-        try {
-            return this.updateById(aiMemberTalkItem);
-        } catch (Exception e) {
-            log.error("更新对话项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除对话项失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByMemberTalkId(String memberTalkId) {
-        try {
-            LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberTalkItem::getMemberTalkId, memberTalkId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据对话ID删除对话项失败: ", e);
-            return false;
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
index 8aaa3f9..ffb78fa 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
@@ -27,95 +27,7 @@
 
     @Override
     public AiMemberTalk getById(String id) {
-        return this.getById(id);
+        return aiMemberTalkMapper.selectById(id);
     }
 
-    @Override
-    public List<AiMemberTalk> getByMemberId(String memberId) {
-        LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberTalk::getMemberId, memberId);
-        queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberTalk> getByProductId(String productId) {
-        LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberTalk::getProductId, productId);
-        queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberTalk> getByProductRoleId(String productRoleId) {
-        LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberTalk::getProductRoleId, productRoleId);
-        queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiMemberTalk> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiMemberTalk::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveTalk(AiMemberTalk aiMemberTalk) {
-        try {
-            return this.save(aiMemberTalk);
-        } catch (Exception e) {
-            log.error("保存对话记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchTalks(List<AiMemberTalk> talks) {
-        try {
-            return this.saveBatch(talks);
-        } catch (Exception e) {
-            log.error("批量保存对话记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateTalk(AiMemberTalk aiMemberTalk) {
-        try {
-            return this.updateById(aiMemberTalk);
-        } catch (Exception e) {
-            log.error("更新对话记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除对话记录失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByMemberId(String memberId) {
-        try {
-            LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiMemberTalk::getMemberId, memberId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据用户ID删除对话记录失败: ", e);
-            return false;
-        }
-    }
 }
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 ca52aa9..a64f47e 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
@@ -1,16 +1,25 @@
 package cc.mrbird.febs.ai.service.impl;
 
+import cc.mrbird.febs.ai.entity.AiMemberRole;
 import cc.mrbird.febs.ai.entity.AiProductCategory;
 import cc.mrbird.febs.ai.mapper.AiProductCategoryMapper;
 import cc.mrbird.febs.ai.service.AiProductCategoryService;
+import cc.mrbird.febs.ai.util.UUID;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+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.metadata.IPage;
+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.List;
+import java.util.*;
 
 /**
  * AI产品类别 Service实现类
@@ -27,135 +36,120 @@
 
     @Override
     public AiProductCategory getById(String id) {
-        return this.getById(id);
+        return aiProductCategoryMapper.selectById(id);
     }
 
     @Override
-    public List<AiProductCategory> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductCategory::getCompanyId, companyId);
-        queryWrapper.orderByAsc(AiProductCategory::getSort);
-        queryWrapper.orderByDesc(AiProductCategory::getCreatedTime);
-        return this.list(queryWrapper);
+    public List<AiProductCategory> getList() {
+        LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class);
+        query.ne(AiProductCategory::getState, 2);
+        query.orderByDesc(AiProductCategory::getHotState);
+        query.orderByAsc(AiProductCategory::getSort);
+        List<AiProductCategory> aiProductCategories = aiProductCategoryMapper.selectList(query);
+        return aiProductCategories;
     }
 
     @Override
-    public AiProductCategory getByCode(String code) {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductCategory::getCode, code);
-        return this.getOne(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductCategory> getByName(String name) {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.like(AiProductCategory::getName, name);
-        queryWrapper.orderByAsc(AiProductCategory::getSort);
-        queryWrapper.orderByDesc(AiProductCategory::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductCategory> getByState(Integer state) {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductCategory::getState, state);
-        queryWrapper.orderByAsc(AiProductCategory::getSort);
-        queryWrapper.orderByDesc(AiProductCategory::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductCategory> getByHotState(Integer hotState) {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductCategory::getHotState, hotState);
-        queryWrapper.orderByAsc(AiProductCategory::getSort);
-        queryWrapper.orderByDesc(AiProductCategory::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductCategory> getByCompanyIdAndState(String companyId, Integer state) {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductCategory::getCompanyId, companyId);
-        queryWrapper.eq(AiProductCategory::getState, state);
-        queryWrapper.orderByAsc(AiProductCategory::getSort);
-        queryWrapper.orderByDesc(AiProductCategory::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductCategory> getByCompanyIdAndHotState(String companyId, Integer hotState) {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductCategory::getCompanyId, companyId);
-        queryWrapper.eq(AiProductCategory::getHotState, hotState);
-        queryWrapper.orderByAsc(AiProductCategory::getSort);
-        queryWrapper.orderByDesc(AiProductCategory::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductCategory> getEnabledCategories() {
-        LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductCategory::getState, 1); // 1-启用
-        queryWrapper.orderByAsc(AiProductCategory::getSort);
-        queryWrapper.orderByDesc(AiProductCategory::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveProductCategory(AiProductCategory aiProductCategory) {
-        try {
-            return this.save(aiProductCategory);
-        } catch (Exception e) {
-            log.error("保存AI产品类别失败: ", e);
-            return false;
+    public Map<String, AiProductCategory> selectMapByIds(Set<String> collect) {
+        Map<String,AiProductCategory> map = new HashMap<>();
+        if(CollUtil.isNotEmpty( collect)){
+            List<AiProductCategory> aiProductCategories = aiProductCategoryMapper.selectList(
+                    Wrappers.lambdaQuery(AiProductCategory.class)
+                    .in(AiProductCategory::getId,collect)
+            );
+            if(CollUtil.isNotEmpty(aiProductCategories)){
+                aiProductCategories.forEach(aiProductCategory -> map.put(aiProductCategory.getId(),aiProductCategory));
+            }
         }
+        return map;
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchProductCategories(List<AiProductCategory> productCategories) {
-        try {
-            return this.saveBatch(productCategories);
-        } catch (Exception e) {
-            log.error("批量保存AI产品类别失败: ", e);
-            return false;
-        }
+    public IPage<AiProductCategory> listInPage(AiProductCategory dto, QueryRequest request) {
+
+
+        Page<AiProductCategory> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class);
+        query.ne(AiProductCategory::getState, 2);
+        query.orderByDesc(AiProductCategory::getHotState);
+        query.orderByAsc(AiProductCategory::getSort);
+        Page<AiProductCategory> pages = aiProductCategoryMapper.selectPage(page, query);
+        return pages;
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateProductCategory(AiProductCategory aiProductCategory) {
-        try {
-            return this.updateById(aiProductCategory);
-        } catch (Exception e) {
-            log.error("更新AI产品类别失败: ", e);
-            return false;
+    public FebsResponse changeState(String id, Integer type, Integer state) {
+        AiProductCategory entity = this.getById(id);
+        if(ObjectUtil.isNotNull(entity)){
+            if(1 == type){
+                aiProductCategoryMapper.update(null,
+                        Wrappers.lambdaUpdate(AiProductCategory.class)
+                        .set(AiProductCategory::getState, state)
+                        .eq(AiProductCategory::getId, id)
+                        );
+            }
+            if(2 == type){
+                aiProductCategoryMapper.update(null,
+                        Wrappers.lambdaUpdate(AiProductCategory.class)
+                        .set(AiProductCategory::getHotState, state)
+                        .eq(AiProductCategory::getId, id)
+                        );
+            }
         }
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除AI产品类别失败: ", e);
-            return false;
-        }
+    public FebsResponse add(AiProductCategory dto) {
+        AiProductCategory entity = new AiProductCategory();
+        entity.setId(UUID.getSimpleUUIDString());
+        entity.setCompanyId(dto.getCompanyId());
+        entity.setCode(dto.getCode());
+        entity.setName(dto.getName());
+        entity.setBackImg(dto.getBackImg());
+        entity.setIconImg(dto.getIconImg());
+        entity.setSort(dto.getSort());
+        entity.setCreatedTime(new Date());
+        this.save(entity);
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByCompanyId(String companyId) {
-        try {
-            LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductCategory::getCompanyId, companyId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据公司ID删除AI产品类别失败: ", e);
-            return false;
+    public FebsResponse update(AiProductCategory dto) {
+        String id = dto.getId();
+        AiProductCategory entity = this.getById(id);
+        if (ObjectUtil.isNotNull( entity)){
+            this.update(null,
+                    Wrappers.lambdaUpdate(AiProductCategory.class)
+                            .set(AiProductCategory::getCode, dto.getCode())
+                            .set(AiProductCategory::getName, dto.getName())
+                            .set(AiProductCategory::getBackImg, dto.getBackImg())
+                            .set(AiProductCategory::getIconImg, dto.getIconImg())
+                            .set(AiProductCategory::getSort, dto.getSort())
+                            .set(AiProductCategory::getUpdatedTime, new Date())
+                            .eq(AiProductCategory::getId, id)
+            );
         }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse delete(String id) {
+
+        AiProductCategory entity = this.getById(id);
+        if(ObjectUtil.isNotNull( entity)){
+            this.update(null,
+                    Wrappers.lambdaUpdate(AiProductCategory.class)
+                            .set(AiProductCategory::getState, 2)
+                            .set(AiProductCategory::getUpdatedTime, new Date())
+                            .eq(AiProductCategory::getId, id));
+
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public List<AiProductCategory> categoryTree() {
+        return this.getList() ;
     }
 }
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 0aae32b..f76b1d3 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
@@ -27,127 +27,8 @@
 
     @Override
     public AiProductPoint getById(String id) {
-        return this.getById(id);
+        return aiProductPointMapper.selectById(id);
     }
 
-    @Override
-    public List<AiProductPoint> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductPoint::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiProductPoint::getCreatedTime);
-        return this.list(queryWrapper);
-    }
 
-    @Override
-    public List<AiProductPoint> getByIsNormal(Integer isNormal) {
-        LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductPoint::getIsNormal, isNormal);
-        queryWrapper.orderByDesc(AiProductPoint::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductPoint> getByFinderUserName(String finderUserName) {
-        LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductPoint::getFinderUserName, finderUserName);
-        queryWrapper.orderByDesc(AiProductPoint::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductPoint> getByTitle(String title) {
-        LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.like(AiProductPoint::getTitle, title);
-        queryWrapper.orderByDesc(AiProductPoint::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductPoint> getByCompanyIdAndIsNormal(String companyId, Integer isNormal) {
-        LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductPoint::getCompanyId, companyId);
-        queryWrapper.eq(AiProductPoint::getIsNormal, isNormal);
-        queryWrapper.orderByDesc(AiProductPoint::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductPoint> searchByKeyword(String keyword) {
-        LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.and(wrapper -> wrapper.like(AiProductPoint::getTitle, keyword)
-                .or()
-                .like(AiProductPoint::getDescription, keyword));
-        queryWrapper.orderByDesc(AiProductPoint::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveProductPoint(AiProductPoint aiProductPoint) {
-        try {
-            return this.save(aiProductPoint);
-        } catch (Exception e) {
-            log.error("保存AI产品知识点失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchProductPoints(List<AiProductPoint> productPoints) {
-        try {
-            return this.saveBatch(productPoints);
-        } catch (Exception e) {
-            log.error("批量保存AI产品知识点失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateProductPoint(AiProductPoint aiProductPoint) {
-        try {
-            return this.updateById(aiProductPoint);
-        } catch (Exception e) {
-            log.error("更新AI产品知识点失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除AI产品知识点失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByCompanyId(String companyId) {
-        try {
-            LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductPoint::getCompanyId, companyId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据公司ID删除AI产品知识点失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByFeedId(String feedId) {
-        try {
-            LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductPoint::getFeedId, feedId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据视频号FeedID删除AI产品知识点失败: ", e);
-            return false;
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java
index 49cc62c..1bc9905 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java
@@ -27,154 +27,7 @@
 
     @Override
     public AiProductQuestionLink getById(String id) {
-        return this.getById(id);
+        return aiProductQuestionLinkMapper.selectById(id);
     }
 
-    @Override
-    public List<AiProductQuestionLink> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestionLink> getByProductQuestionId(String productQuestionId) {
-        LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId);
-        queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestionLink> getByProductId(String productId) {
-        LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestionLink::getProductId, productId);
-        queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestionLink> getByCompanyIdAndProductId(String companyId, String productId) {
-        LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId);
-        queryWrapper.eq(AiProductQuestionLink::getProductId, productId);
-        queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestionLink> getByCompanyIdAndProductQuestionId(String companyId, String productQuestionId) {
-        LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId);
-        queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId);
-        queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestionLink> getByProductIdAndProductQuestionId(String productId, String productQuestionId) {
-        LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestionLink::getProductId, productId);
-        queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId);
-        queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveProductQuestionLink(AiProductQuestionLink aiProductQuestionLink) {
-        try {
-            return this.save(aiProductQuestionLink);
-        } catch (Exception e) {
-            log.error("保存产品题目关系失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchProductQuestionLinks(List<AiProductQuestionLink> productQuestionLinks) {
-        try {
-            return this.saveBatch(productQuestionLinks);
-        } catch (Exception e) {
-            log.error("批量保存产品题目关系失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateProductQuestionLink(AiProductQuestionLink aiProductQuestionLink) {
-        try {
-            return this.updateById(aiProductQuestionLink);
-        } catch (Exception e) {
-            log.error("更新产品题目关系失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除产品题目关系失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByProductId(String productId) {
-        try {
-            LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductQuestionLink::getProductId, productId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据产品ID删除产品题目关系失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByProductQuestionId(String productQuestionId) {
-        try {
-            LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据产品题目ID删除产品题目关系失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByCompanyId(String companyId) {
-        try {
-            LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据公司ID删除产品题目关系失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByProductIdAndProductQuestionId(String productId, String productQuestionId) {
-        try {
-            LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductQuestionLink::getProductId, productId);
-            queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据产品ID和产品题目ID删除产品题目关系失败: ", e);
-            return false;
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java
index 90d990b..4084e1c 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java
@@ -27,150 +27,7 @@
 
     @Override
     public AiProductQuestion getById(String id) {
-        return this.getById(id);
+        return aiProductQuestionMapper.selectById(id);
     }
 
-    @Override
-    public List<AiProductQuestion> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByProductCategoryId(String productCategoryId) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getProductCategoryId, productCategoryId);
-        queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByTitle(String title) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.like(AiProductQuestion::getTitle, title);
-        queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByParentId(String parentId) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getParentId, parentId);
-        queryWrapper.orderByAsc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByDifficulty(Integer difficulty) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getDifficulty, difficulty);
-        queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByState(Integer state) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getState, state);
-        queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByCorrectAnswer(Integer correctAnswer) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getCorrectAnswer, correctAnswer);
-        queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByCompanyIdAndState(String companyId, Integer state) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getCompanyId, companyId);
-        queryWrapper.eq(AiProductQuestion::getState, state);
-        queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductQuestion> getByParentIdAndState(String parentId, Integer state) {
-        LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductQuestion::getParentId, parentId);
-        queryWrapper.eq(AiProductQuestion::getState, state);
-        queryWrapper.orderByAsc(AiProductQuestion::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveProductQuestion(AiProductQuestion aiProductQuestion) {
-        try {
-            return this.save(aiProductQuestion);
-        } catch (Exception e) {
-            log.error("保存AI产品题目失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchProductQuestions(List<AiProductQuestion> productQuestions) {
-        try {
-            return this.saveBatch(productQuestions);
-        } catch (Exception e) {
-            log.error("批量保存AI产品题目失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateProductQuestion(AiProductQuestion aiProductQuestion) {
-        try {
-            return this.updateById(aiProductQuestion);
-        } catch (Exception e) {
-            log.error("更新AI产品题目失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除AI产品题目失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByParentId(String parentId) {
-        try {
-            LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductQuestion::getParentId, parentId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据父ID删除AI产品题目失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByCompanyId(String companyId) {
-        try {
-            LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductQuestion::getCompanyId, companyId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据公司ID删除AI产品题目失败: ", e);
-            return false;
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java
index 8086d0b..dbe2908 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java
@@ -27,109 +27,8 @@
 
     @Override
     public AiProductRole getById(String id) {
-        return this.getById(id);
+        return aiProductRoleMapper.selectById(id);
     }
 
-    @Override
-    public List<AiProductRole> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductRole::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiProductRole::getCreatedTime);
-        return this.list(queryWrapper);
-    }
 
-    @Override
-    public List<AiProductRole> getByProductId(String productId) {
-        LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductRole::getProductId, productId);
-        queryWrapper.orderByDesc(AiProductRole::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductRole> getByName(String name) {
-        LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.like(AiProductRole::getName, name);
-        queryWrapper.orderByDesc(AiProductRole::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProductRole> getByCompanyIdAndProductId(String companyId, String productId) {
-        LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProductRole::getCompanyId, companyId);
-        queryWrapper.eq(AiProductRole::getProductId, productId);
-        queryWrapper.orderByDesc(AiProductRole::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveProductRole(AiProductRole aiProductRole) {
-        try {
-            return this.save(aiProductRole);
-        } catch (Exception e) {
-            log.error("保存AI产品角色失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchProductRoles(List<AiProductRole> productRoles) {
-        try {
-            return this.saveBatch(productRoles);
-        } catch (Exception e) {
-            log.error("批量保存AI产品角色失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateProductRole(AiProductRole aiProductRole) {
-        try {
-            return this.updateById(aiProductRole);
-        } catch (Exception e) {
-            log.error("更新AI产品角色失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除AI产品角色失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByProductId(String productId) {
-        try {
-            LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductRole::getProductId, productId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据AI产品ID删除AI产品角色失败: ", e);
-            return false;
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByCompanyId(String companyId) {
-        try {
-            LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProductRole::getCompanyId, companyId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据公司ID删除AI产品角色失败: ", e);
-            return false;
-        }
-    }
 }
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 17566dc..a1f0f5f 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,30 @@
 package cc.mrbird.febs.ai.service.impl;
 
 import cc.mrbird.febs.ai.entity.AiProduct;
+import cc.mrbird.febs.ai.entity.AiProductCategory;
 import cc.mrbird.febs.ai.mapper.AiProductMapper;
+import cc.mrbird.febs.ai.service.AiProductCategoryService;
 import cc.mrbird.febs.ai.service.AiProductService;
+import cc.mrbird.febs.ai.util.UUID;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.entity.ClothesArt;
+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.metadata.IPage;
+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.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * AI产品表 Service实现类
@@ -24,138 +38,125 @@
 public class AiProductServiceImpl extends ServiceImpl<AiProductMapper, AiProduct> implements AiProductService {
 
     private final AiProductMapper aiProductMapper;
+    private final AiProductCategoryService aiProductCategoryService;
 
     @Override
     public AiProduct getById(String id) {
-        return this.getById(id);
+        return aiProductMapper.selectById(id);
     }
 
     @Override
-    public List<AiProduct> getByCompanyId(String companyId) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProduct::getCompanyId, companyId);
-        queryWrapper.orderByDesc(AiProduct::getSort);
-        queryWrapper.orderByDesc(AiProduct::getCreatedTime);
-        return this.list(queryWrapper);
-    }
+    public IPage<AiProduct> listInPage(AiProduct dto, QueryRequest request) {
 
-    @Override
-    public AiProduct getByCode(String code) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProduct::getCode, code);
-        return this.getOne(queryWrapper);
-    }
-
-    @Override
-    public List<AiProduct> getByName(String name) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.like(AiProduct::getName, name);
-        queryWrapper.orderByDesc(AiProduct::getSort);
-        queryWrapper.orderByDesc(AiProduct::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProduct> getByProductCategoryId(String productCategoryId) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProduct::getProductCategoryId, productCategoryId);
-        queryWrapper.orderByDesc(AiProduct::getSort);
-        queryWrapper.orderByDesc(AiProduct::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProduct> getByState(Integer state) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProduct::getState, state);
-        queryWrapper.orderByDesc(AiProduct::getSort);
-        queryWrapper.orderByDesc(AiProduct::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProduct> getByHotState(Integer hotState) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProduct::getHotState, hotState);
-        queryWrapper.orderByDesc(AiProduct::getSort);
-        queryWrapper.orderByDesc(AiProduct::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProduct> getByCompanyIdAndState(String companyId, Integer state) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProduct::getCompanyId, companyId);
-        queryWrapper.eq(AiProduct::getState, state);
-        queryWrapper.orderByDesc(AiProduct::getSort);
-        queryWrapper.orderByDesc(AiProduct::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public List<AiProduct> getByCompanyIdAndHotState(String companyId, Integer hotState) {
-        LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AiProduct::getCompanyId, companyId);
-        queryWrapper.eq(AiProduct::getHotState, hotState);
-        queryWrapper.orderByDesc(AiProduct::getSort);
-        queryWrapper.orderByDesc(AiProduct::getCreatedTime);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveProduct(AiProduct aiProduct) {
-        try {
-            return this.save(aiProduct);
-        } catch (Exception e) {
-            log.error("保存AI产品失败: ", e);
-            return false;
+        Page<AiProduct> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<AiProduct> query = Wrappers.lambdaQuery(AiProduct.class);
+        if (ObjectUtil.isNotNull(dto.getProductCategoryId())){
+            query.eq(AiProduct::getProductCategoryId, dto.getProductCategoryId());
         }
+        query.ne(AiProduct::getState, 2);
+        query.orderByDesc(AiProduct::getHotState);
+        query.orderByAsc(AiProduct::getSort);
+        Page<AiProduct> pages = aiProductMapper.selectPage(page, query);
+        List<AiProduct> records = pages.getRecords();
+        if (CollUtil.isNotEmpty( records)){
+            Set<String> collect = records.stream().map(AiProduct::getProductCategoryId).collect(Collectors.toSet());
+            if(CollUtil.isNotEmpty( collect)){
+                Map<String,AiProductCategory> map = aiProductCategoryService.selectMapByIds(collect);
+                for (AiProduct record : records){
+                    AiProductCategory orDefault = map.getOrDefault(record.getProductCategoryId(), null);
+                    if(ObjectUtil.isNotNull(orDefault)){
+                        record.setProductCategoryName(orDefault.getName());
+                    }
+                }
+            }
+        }
+        return pages;
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchProducts(List<AiProduct> products) {
-        try {
-            return this.saveBatch(products);
-        } catch (Exception e) {
-            log.error("批量保存AI产品失败: ", e);
-            return false;
+    public FebsResponse changeState(String id, Integer type, Integer state) {
+
+        AiProduct entity = this.getById(id);
+        if(ObjectUtil.isNotNull(entity)){
+            if(1 == type){
+                aiProductMapper.update(null,
+                        Wrappers.lambdaUpdate(AiProduct.class)
+                                .set(AiProduct::getState, state)
+                                .eq(AiProduct::getId, id)
+                );
+            }
+            if(2 == type){
+                aiProductMapper.update(null,
+                        Wrappers.lambdaUpdate(AiProduct.class)
+                                .set(AiProduct::getHotState, state)
+                                .eq(AiProduct::getId, id)
+                );
+            }
         }
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateProduct(AiProduct aiProduct) {
-        try {
-            return this.updateById(aiProduct);
-        } catch (Exception e) {
-            log.error("更新AI产品失败: ", e);
-            return false;
-        }
+    public FebsResponse add(AiProduct dto) {
+        AiProduct entity = new AiProduct();
+        entity.setId(UUID.getSimpleUUIDString());
+        entity.setCompanyId(dto.getCompanyId());
+        entity.setCode(dto.getCode());
+        entity.setName(dto.getName());
+        entity.setBackImg(dto.getBackImg());
+        entity.setIconImg(dto.getIconImg());
+        entity.setSort(dto.getSort());
+        entity.setProductCategoryId(dto.getProductCategoryId());
+        entity.setScene(dto.getScene());
+        entity.setTarget(dto.getTarget());
+        entity.setDescription(dto.getDescription());
+        entity.setQuestionCount(dto.getQuestionCount());
+        entity.setCreatedTime(new Date());
+        this.save(entity);
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteById(String id) {
-        try {
-            return this.removeById(id);
-        } catch (Exception e) {
-            log.error("删除AI产品失败: ", e);
-            return false;
+    public FebsResponse update(AiProduct dto) {
+        String id = dto.getId();
+        AiProduct entity = this.getById(id);
+        if (ObjectUtil.isNotNull( entity)){
+            this.update(null,
+                    Wrappers.lambdaUpdate(AiProduct.class)
+                            .set(AiProduct::getCode, dto.getCode())
+                            .set(AiProduct::getName, dto.getName())
+                            .set(AiProduct::getBackImg, dto.getBackImg())
+                            .set(AiProduct::getIconImg, dto.getIconImg())
+                            .set(AiProduct::getSort, dto.getSort())
+                            .set(AiProduct::getProductCategoryId, dto.getProductCategoryId())
+                            .set(AiProduct::getScene, dto.getScene())
+                            .set(AiProduct::getTarget, dto.getTarget())
+                            .set(AiProduct::getDescription, dto.getDescription())
+                            .set(AiProduct::getQuestionCount, dto.getQuestionCount())
+                            .set(AiProduct::getUpdatedTime, new Date())
+                            .eq(AiProduct::getId, id)
+            );
         }
+        return new FebsResponse().success().message("操作成功");
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByCompanyId(String companyId) {
-        try {
-            LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AiProduct::getCompanyId, companyId);
-            return this.remove(queryWrapper);
-        } catch (Exception e) {
-            log.error("根据公司ID删除AI产品失败: ", e);
-            return false;
+    public FebsResponse delete(String id) {
+
+        AiProduct entity = this.getById(id);
+        if(ObjectUtil.isNotNull( entity)){
+            this.update(null,
+                    Wrappers.lambdaUpdate(AiProduct.class)
+                            .set(AiProduct::getState, 2)
+                            .set(AiProduct::getUpdatedTime, new Date())
+                            .eq(AiProduct::getId, id));
+
         }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public List<AiProduct> selectList() {
+        return aiProductMapper.selectList( null);
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/util/UUID.java b/src/main/java/cc/mrbird/febs/ai/util/UUID.java
new file mode 100644
index 0000000..848afb4
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/util/UUID.java
@@ -0,0 +1,495 @@
+package cc.mrbird.febs.ai.util;
+
+import com.sun.xml.internal.ws.util.UtilException;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 提供通用唯一识别码(universally unique identifier)(UUID)实现
+ *
+ * @author ruoyi
+ */
+public final class UUID implements java.io.Serializable, Comparable<UUID>
+{
+    private static final long serialVersionUID = -1185015143654744140L;
+
+    /**
+     * SecureRandom 的单例
+     *
+     */
+    private static class Holder
+    {
+        static final SecureRandom numberGenerator = getSecureRandom();
+    }
+
+    /** 此UUID的最高64有效位 */
+    private final long mostSigBits;
+
+    /** 此UUID的最低64有效位 */
+    private final long leastSigBits;
+
+    /**
+     * 私有构造
+     * 
+     * @param data 数据
+     */
+    private UUID(byte[] data)
+    {
+        long msb = 0;
+        long lsb = 0;
+        assert data.length == 16 : "data must be 16 bytes in length";
+        for (int i = 0; i < 8; i++)
+        {
+            msb = (msb << 8) | (data[i] & 0xff);
+        }
+        for (int i = 8; i < 16; i++)
+        {
+            lsb = (lsb << 8) | (data[i] & 0xff);
+        }
+        this.mostSigBits = msb;
+        this.leastSigBits = lsb;
+    }
+
+    /**
+     * 使用指定的数据构造新的 UUID。
+     *
+     * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位
+     * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位
+     */
+    public UUID(long mostSigBits, long leastSigBits)
+    {
+        this.mostSigBits = mostSigBits;
+        this.leastSigBits = leastSigBits;
+    }
+
+    /**
+     * 获取类型 4(伪随机生成的)UUID 的静态工厂。
+     * 
+     * @return 随机生成的 {@code UUID}
+     */
+    public static UUID fastUUID()
+    {
+        return randomUUID(false);
+    }
+
+    /**
+     * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
+     * 
+     * @return 随机生成的 {@code UUID}
+     */
+    public static UUID randomUUID()
+    {
+        return randomUUID(true);
+    }
+
+    /**
+     * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
+     *
+     * @return 随机生成的 {@code UUID}
+     */
+    public static String getSimpleUUIDString()
+    {
+        return randomUUID(true).toString(true);
+    }
+
+    /**
+     * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
+     * 
+     * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能
+     * @return 随机生成的 {@code UUID}
+     */
+    public static UUID randomUUID(boolean isSecure)
+    {
+        final Random ng = isSecure ? Holder.numberGenerator : getRandom();
+
+        byte[] randomBytes = new byte[16];
+        ng.nextBytes(randomBytes);
+        randomBytes[6] &= 0x0f; /* clear version */
+        randomBytes[6] |= 0x40; /* set to version 4 */
+        randomBytes[8] &= 0x3f; /* clear variant */
+        randomBytes[8] |= 0x80; /* set to IETF variant */
+        return new UUID(randomBytes);
+    }
+
+    /**
+     * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。
+     *
+     * @param name 用于构造 UUID 的字节数组。
+     *
+     * @return 根据指定数组生成的 {@code UUID}
+     */
+    public static UUID nameUUIDFromBytes(byte[] name)
+    {
+        MessageDigest md;
+        try
+        {
+            md = MessageDigest.getInstance("MD5");
+        }
+        catch (NoSuchAlgorithmException nsae)
+        {
+            throw new InternalError("MD5 not supported");
+        }
+        byte[] md5Bytes = md.digest(name);
+        md5Bytes[6] &= 0x0f; /* clear version */
+        md5Bytes[6] |= 0x30; /* set to version 3 */
+        md5Bytes[8] &= 0x3f; /* clear variant */
+        md5Bytes[8] |= 0x80; /* set to IETF variant */
+        return new UUID(md5Bytes);
+    }
+
+    /**
+     * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。
+     *
+     * @param name 指定 {@code UUID} 字符串
+     * @return 具有指定值的 {@code UUID}
+     * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常
+     *
+     */
+    public static UUID fromString(String name)
+    {
+        String[] components = name.split("-");
+        if (components.length != 5)
+        {
+            throw new IllegalArgumentException("Invalid UUID string: " + name);
+        }
+        for (int i = 0; i < 5; i++)
+        {
+            components[i] = "0x" + components[i];
+        }
+
+        long mostSigBits = Long.decode(components[0]).longValue();
+        mostSigBits <<= 16;
+        mostSigBits |= Long.decode(components[1]).longValue();
+        mostSigBits <<= 16;
+        mostSigBits |= Long.decode(components[2]).longValue();
+
+        long leastSigBits = Long.decode(components[3]).longValue();
+        leastSigBits <<= 48;
+        leastSigBits |= Long.decode(components[4]).longValue();
+
+        return new UUID(mostSigBits, leastSigBits);
+    }
+
+    /**
+     * 返回此 UUID 的 128 位值中的最低有效 64 位。
+     *
+     * @return 此 UUID 的 128 位值中的最低有效 64 位。
+     */
+    public long getLeastSignificantBits()
+    {
+        return leastSigBits;
+    }
+
+    /**
+     * 返回此 UUID 的 128 位值中的最高有效 64 位。
+     *
+     * @return 此 UUID 的 128 位值中最高有效 64 位。
+     */
+    public long getMostSignificantBits()
+    {
+        return mostSigBits;
+    }
+
+    /**
+     * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。
+     * <p>
+     * 版本号具有以下含意:
+     * <ul>
+     * <li>1 基于时间的 UUID
+     * <li>2 DCE 安全 UUID
+     * <li>3 基于名称的 UUID
+     * <li>4 随机生成的 UUID
+     * </ul>
+     *
+     * @return 此 {@code UUID} 的版本号
+     */
+    public int version()
+    {
+        // Version is bits masked by 0x000000000000F000 in MS long
+        return (int) ((mostSigBits >> 12) & 0x0f);
+    }
+
+    /**
+     * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。
+     * <p>
+     * 变体号具有以下含意:
+     * <ul>
+     * <li>0 为 NCS 向后兼容保留
+     * <li>2 <a href="http://www.ietf.org/rfc/rfc4122.txt">IETF&nbsp;RFC&nbsp;4122</a>(Leach-Salz), 用于此类
+     * <li>6 保留,微软向后兼容
+     * <li>7 保留供以后定义使用
+     * </ul>
+     *
+     * @return 此 {@code UUID} 相关联的变体号
+     */
+    public int variant()
+    {
+        // This field is composed of a varying number of bits.
+        // 0 - - Reserved for NCS backward compatibility
+        // 1 0 - The IETF aka Leach-Salz variant (used by this class)
+        // 1 1 0 Reserved, Microsoft backward compatibility
+        // 1 1 1 Reserved for future definition.
+        return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));
+    }
+
+    /**
+     * 与此 UUID 相关联的时间戳值。
+     *
+     * <p>
+     * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。<br>
+     * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。
+     *
+     * <p>
+     * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>
+     * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
+     *
+     * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。
+     */
+    public long timestamp() throws UnsupportedOperationException
+    {
+        checkTimeBase();
+        return (mostSigBits & 0x0FFFL) << 48//
+                | ((mostSigBits >> 16) & 0x0FFFFL) << 32//
+                | mostSigBits >>> 32;
+    }
+
+    /**
+     * 与此 UUID 相关联的时钟序列值。
+     *
+     * <p>
+     * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。
+     * <p>
+     * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出
+     * UnsupportedOperationException。
+     *
+     * @return 此 {@code UUID} 的时钟序列
+     *
+     * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
+     */
+    public int clockSequence() throws UnsupportedOperationException
+    {
+        checkTimeBase();
+        return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);
+    }
+
+    /**
+     * 与此 UUID 相关的节点值。
+     *
+     * <p>
+     * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。
+     * <p>
+     * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>
+     * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
+     *
+     * @return 此 {@code UUID} 的节点值
+     *
+     * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
+     */
+    public long node() throws UnsupportedOperationException
+    {
+        checkTimeBase();
+        return leastSigBits & 0x0000FFFFFFFFFFFFL;
+    }
+
+    /**
+     * 返回此{@code UUID} 的字符串表现形式。
+     *
+     * <p>
+     * UUID 的字符串表示形式由此 BNF 描述:
+     * 
+     * <pre>
+     * {@code
+     * UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
+     * time_low               = 4*<hexOctet>
+     * time_mid               = 2*<hexOctet>
+     * time_high_and_version  = 2*<hexOctet>
+     * variant_and_sequence   = 2*<hexOctet>
+     * node                   = 6*<hexOctet>
+     * hexOctet               = <hexDigit><hexDigit>
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * </pre>
+     * 
+     * </blockquote>
+     *
+     * @return 此{@code UUID} 的字符串表现形式
+     * @see #toString(boolean)
+     */
+    @Override
+    public String toString()
+    {
+        return toString(false);
+    }
+
+    /**
+     * 返回此{@code UUID} 的字符串表现形式。
+     *
+     * <p>
+     * UUID 的字符串表示形式由此 BNF 描述:
+     * 
+     * <pre>
+     * {@code
+     * UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
+     * time_low               = 4*<hexOctet>
+     * time_mid               = 2*<hexOctet>
+     * time_high_and_version  = 2*<hexOctet>
+     * variant_and_sequence   = 2*<hexOctet>
+     * node                   = 6*<hexOctet>
+     * hexOctet               = <hexDigit><hexDigit>
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * </pre>
+     * 
+     * </blockquote>
+     *
+     * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串
+     * @return 此{@code UUID} 的字符串表现形式
+     */
+    public String toString(boolean isSimple)
+    {
+        final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36);
+        // time_low
+        builder.append(digits(mostSigBits >> 32, 8));
+        if (!isSimple)
+        {
+            builder.append('-');
+        }
+        // time_mid
+        builder.append(digits(mostSigBits >> 16, 4));
+        if (!isSimple)
+        {
+            builder.append('-');
+        }
+        // time_high_and_version
+        builder.append(digits(mostSigBits, 4));
+        if (!isSimple)
+        {
+            builder.append('-');
+        }
+        // variant_and_sequence
+        builder.append(digits(leastSigBits >> 48, 4));
+        if (!isSimple)
+        {
+            builder.append('-');
+        }
+        // node
+        builder.append(digits(leastSigBits, 12));
+
+        return builder.toString();
+    }
+
+    /**
+     * 返回此 UUID 的哈希码。
+     *
+     * @return UUID 的哈希码值。
+     */
+    @Override
+    public int hashCode()
+    {
+        long hilo = mostSigBits ^ leastSigBits;
+        return ((int) (hilo >> 32)) ^ (int) hilo;
+    }
+
+    /**
+     * 将此对象与指定对象比较。
+     * <p>
+     * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。
+     *
+     * @param obj 要与之比较的对象
+     *
+     * @return 如果对象相同,则返回 {@code true};否则返回 {@code false}
+     */
+    @Override
+    public boolean equals(Object obj)
+    {
+        if ((null == obj) || (obj.getClass() != UUID.class))
+        {
+            return false;
+        }
+        UUID id = (UUID) obj;
+        return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);
+    }
+
+    // Comparison Operations
+
+    /**
+     * 将此 UUID 与指定的 UUID 比较。
+     *
+     * <p>
+     * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。
+     *
+     * @param val 与此 UUID 比较的 UUID
+     *
+     * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。
+     *
+     */
+    @Override
+    public int compareTo(UUID val)
+    {
+        // The ordering is intentionally set up so that the UUIDs
+        // can simply be numerically compared as two numbers
+        return (this.mostSigBits < val.mostSigBits ? -1 : //
+                (this.mostSigBits > val.mostSigBits ? 1 : //
+                        (this.leastSigBits < val.leastSigBits ? -1 : //
+                                (this.leastSigBits > val.leastSigBits ? 1 : //
+                                        0))));
+    }
+
+    // -------------------------------------------------------------------------------------------------------------------
+    // Private method start
+    /**
+     * 返回指定数字对应的hex值
+     * 
+     * @param val 值
+     * @param digits 位
+     * @return 值
+     */
+    private static String digits(long val, int digits)
+    {
+        long hi = 1L << (digits * 4);
+        return Long.toHexString(hi | (val & (hi - 1))).substring(1);
+    }
+
+    /**
+     * 检查是否为time-based版本UUID
+     */
+    private void checkTimeBase()
+    {
+        if (version() != 1)
+        {
+            throw new UnsupportedOperationException("Not a time-based UUID");
+        }
+    }
+
+    /**
+     * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG)
+     * 
+     * @return {@link SecureRandom}
+     */
+    public static SecureRandom getSecureRandom()
+    {
+        try
+        {
+            return SecureRandom.getInstance("SHA1PRNG");
+        }
+        catch (NoSuchAlgorithmException e)
+        {
+            throw new RuntimeException("UUID生成异常");
+        }
+    }
+
+    /**
+     * 获取随机数生成器对象<br>
+     * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。
+     * 
+     * @return {@link ThreadLocalRandom}
+     */
+    public static ThreadLocalRandom getRandom()
+    {
+        return ThreadLocalRandom.current();
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java b/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java
index bb438ba..75b2452 100644
--- a/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java
+++ b/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java
@@ -31,5 +31,5 @@
      * 主键 (UUID)
      */
     @TableId(value = "id",type = IdType.ASSIGN_UUID)
-    private Long id;
+    private String id;
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
index bc97182..bb898ce 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -9,6 +9,7 @@
 import org.springframework.amqp.core.Message;
 import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Component;
 
 import java.util.Date;
@@ -19,6 +20,7 @@
  **/
 @Slf4j
 @Component
+@ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
 public class AgentConsumer {
 
     @Autowired
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 96eb464..0d6fbb2 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -18,7 +18,7 @@
           username: ct_test
           password: 123456
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://120.27.238.55:3406/clothes_test?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://120.27.238.55:3406/ai_one?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     # Redis数据库索引(默认为 0)
@@ -89,4 +89,4 @@
     path: /mnt/sdc/webresource/file/
 
 system:
-  job: true
\ No newline at end of file
+  job: false
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/add.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/add.html
new file mode 100644
index 0000000..31c34f2
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/add.html
@@ -0,0 +1,139 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-memberRole-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="memberRole-add">
+                <form class="layui-form" action="" lay-filter="memberRole-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="sort" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="memberRoleImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="memberRoleImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="memberRole-add-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#memberRole-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        //图片上传
+        upload.render({
+            elem: '#memberRoleImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#memberRoleImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#iconImg").val(res.data.src);
+            }
+        });
+
+        form.on('submit(memberRole-add-form-submit)', function (data) {
+            $.ajax({
+                'url':ctx + 'admin/memberRole/add',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-memberRole').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/info.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/info.html
new file mode 100644
index 0000000..8f9ce63
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/info.html
@@ -0,0 +1,167 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-memberRole-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="memberRole-info">
+                <form class="layui-form" action="" lay-filter="memberRole-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="sort" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="memberRoleImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="memberRoleImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="memberRole-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#memberRole-info'),
+            aiMemberRole = [[${aiMemberRole}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        //图片上传
+        upload.render({
+            elem: '#memberRoleImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#memberRoleImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#iconImg").val(res.data.src);
+            }
+        });
+
+        setTimeout(() => {
+            initMemberRoleInfo();
+        }, 500);
+        function initMemberRoleInfo() {
+            form.val("memberRole-info-form", {
+                "id": aiMemberRole.id,
+                "name": aiMemberRole.name,
+                "code": aiMemberRole.code,
+                "iconImg": aiMemberRole.iconImg,
+                "sort": aiMemberRole.sort,
+            });
+
+
+            $('#memberRoleImageUpload').append('<img src="' + aiMemberRole.iconImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#iconImg").val(aiMemberRole.iconImg);
+
+        }
+
+        form.on('submit(memberRole-info-form-submit)', function (data) {
+            $.ajax({
+                'url':ctx + 'admin/memberRole/update',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-memberRole').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/list.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/list.html
new file mode 100644
index 0000000..fb030b9
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/list.html
@@ -0,0 +1,246 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-memberRole" lay-title="角色类型">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="memberRole-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="memberRoleTable" lay-data="{id: 'memberRoleTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="memberRoleToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="memberRoleList:add" lay-event="memberRoleAdd">新增</button>
+        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="memberRoleList:productSet" lay-event="productSet">产品配置</button>
+    </div>
+</script>
+
+<script type="text/html" id="memberRoleOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="memberRoleList:info" lay-event="memberRoleInfoEvent">编辑</button>
+    <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="memberRoleList:info" lay-event="memberRoleDeleteEvent">删除</button>
+</script>
+
+
+<script type="text/html" id="memberRoleStateSwitch">
+    {{# if(d.state === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="memberRoleStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="memberRoleStateSwitch">
+    {{# } }}
+</script>
+
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-memberRole'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initMemberRoleTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(memberRoleTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seeImage') {
+                var t = $view.find('#seeImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'memberRoleInfoEvent') {
+                if (data.state == 1){
+                    febs.alert.warn('请先禁用这行数据');
+                    return;
+                }
+                febs.modal.open('编辑','modules/ai/memberRole/info/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-memberRole-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'memberRoleDeleteEvent') {
+                if (data.state == 1){
+                    febs.alert.warn('请先禁用这行数据');
+                    return;
+                }
+                febs.modal.confirm('删除', '确认删除?', function () {
+                    memberRoleDeleteEvent(data.id);
+                });
+            }
+        });
+
+        form.on('switch(memberRoleStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                memberRoleStateSwitch(data.value,1);
+            } else {
+                memberRoleStateSwitch(data.value,0);
+            }
+        })
+        function memberRoleStateSwitch(id,state) {
+            febs.get(ctx + 'admin/memberRole/changeState/' + id+'/' + state, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+        function memberRoleDeleteEvent(id) {
+            febs.get(ctx + 'admin/memberRole/delete/' + id, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(memberRoleTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            if(layEvent === 'memberRoleAdd'){
+                febs.modal.open('新增', 'modules/ai/memberRole/add/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-memberRole-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'productSet') {
+                var checkData = table.checkStatus('memberRoleTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('产品配置', 'modules/ai/memberRole/productSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#product-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+        function initMemberRoleTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'memberRoleTable',
+                url: ctx + 'admin/memberRole/list',
+                toolbar:"#memberRoleToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#memberRoleOption', minWidth: 200, align: 'center'},
+                    {field: 'state', title: '状态', templet: '#memberRoleStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'sort', title: '排序', minWidth: 100,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 100,align:'center'},
+                    {field: 'name', title: '名称', minWidth: 100,align:'center'},
+                    {field: 'image',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seeImage">' +
+                                '<img id="seeImage' + d.id + '" src="' + d.iconImg +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                    {field: 'companyId', title: '公司编码', minWidth: 150,align:'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+            };
+        }
+
+    })
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html
new file mode 100644
index 0000000..f9b3857
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html
@@ -0,0 +1,128 @@
+<div class="layui-fluid layui-anim febs-anim" id="product-set" lay-title="产品配置">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="product-type-set">
+                <form class="layui-form" action="" lay-filter="product-type-set-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">产品配置</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="roleId"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-form-item">
+                                    <div id="productSetMove"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="product-type-set-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs','form', 'transfer'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            form = layui.form,
+            transfer = layui.transfer,
+            productTypeAll = [[${productAll}]],
+            productTypeChoose = [[${productSelected}]],
+            roleId = [[${roleId}]],
+            $view = $('#product-set'),
+
+            $productSetMoveQuery = $view.find('#productSetMoveQuery')
+        ;
+
+        // 查询按钮
+        $productSetMoveQuery.on('click', function () {
+            console.log(transfer.getData('productSetMove-set'))
+
+            let data1 = transfer.getData('productSetMove-set');
+            //获取data1中的value,返回一个数组
+            let productIdList = data1.map(function(item){
+                return item.value;
+            });
+
+            console.log(productIdList)
+        });
+
+
+        form.render();
+
+        initProductTypeSet();
+
+        function initProductTypeSet() {
+            console.log("productTypeAll:", productTypeAll); // 调试信息
+            console.log("productTypeChoose:", productTypeChoose); // 调试信息
+            console.log("roleId:", roleId); // 调试信息
+            form.val("product-type-set-form", {
+                "roleId": roleId,
+            });
+            // 转换数据格式(假设接口返回的数据结构需要处理)
+            var dataLeft = productTypeAll.map(function(item){
+                return {
+                    value: item.id,  // 值字段
+                    title: item.name // 显示文本
+                }
+            });
+            var dataRight = productTypeChoose.map(function(item){
+                return {
+                    value: item,  // 值字段
+                }
+            });
+
+            // 渲染穿梭框
+            transfer.render({
+                elem: '#productSetMove',
+                data: dataLeft,
+                id: 'productSetMove-set', // 唯一标识
+                title: ['待选择列表', '已选择列表'],
+                width: 300,
+                height: 400,
+                showSearch: true,
+                value: productTypeChoose,
+            });
+        }
+
+        form.on('submit(product-type-set-form-submit)', function (data) {
+            let data1 = transfer.getData('productSetMove-set');
+            //获取data1中的value,返回一个数组
+            let productIdList = data1.map(function(item){
+                return item.value;
+            });
+            data.field.chooseIds = productIdList;
+            data.field.roleId = roleId;
+            $.ajax({
+                'url':ctx + 'admin/memberRole/productSet',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-type').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/ai/product/add.html b/src/main/resources/templates/febs/views/modules/ai/product/add.html
new file mode 100644
index 0000000..abb0c34
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/product/add.html
@@ -0,0 +1,283 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-product-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="product-add">
+                <form class="layui-form" action="" lay-filter="product-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">商品分类:</label>
+                                        <div class="layui-input-block">
+                                            <div id="product-category"></div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="sort" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">背景图片:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productBackImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productBackImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">场景:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="scene" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">目标:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="target" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">出题数量:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="questionCount" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="product-toolbar-container" class="toolbar"></div>
+                                            <div id="product-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="product-add-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#product-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        var category = xmSelect.render({
+            el: '#product-category',
+            language: 'zn',
+            prop : {
+                value : 'id',
+                children : 'child'
+            },
+            iconfont: {
+                parent: 'hidden',
+            },
+            tips: '请选择',
+            filterable: true,
+            radio: true,
+            clickClose: true,
+            tree: {
+                show: true,
+                //非严格模式
+                strict: false,
+            },
+            data: []
+        })
+
+        febs.get(ctx + 'admin/productCategory/categoryTree', null, function(res) {
+            category.update({
+                data : res.data,
+                autoRow: true,
+            });
+        })
+
+        const E = window.wangEditor;
+        const editor = new E('#product-toolbar-container', '#product-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+        //图片上传
+        upload.render({
+            elem: '#productImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#iconImg").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#productBackImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#backImg").val(res.data.src);
+            }
+        });
+
+        form.on('submit(product-add-form-submit)', function (data) {
+            data.field.productCategoryId = category.getValue('valueStr');
+            data.field.description = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/product/add',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-product').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/ai/product/info.html b/src/main/resources/templates/febs/views/modules/ai/product/info.html
new file mode 100644
index 0000000..6ec3669
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/product/info.html
@@ -0,0 +1,328 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-product-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="product-info">
+                <form class="layui-form" action="" lay-filter="product-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">商品分类:</label>
+                                        <div class="layui-input-block">
+                                            <div id="product-category"></div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="sort" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">背景图片:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productBackImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productBackImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">场景:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="scene" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">目标:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="target" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">出题数量:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="questionCount" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">详情:</label>
+                                    <div class="layui-input-block">
+                                        <div style="border: 1px solid #ccc;">
+                                            <div id="product-toolbar-container" class="toolbar"></div>
+                                            <div id="product-text-container" class="text" style="height: 450px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="product-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#product-info'),
+            aiProduct = [[${aiProduct}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        var category = xmSelect.render({
+            el: '#product-category',
+            language: 'zn',
+            prop : {
+                value : 'id',
+                children : 'child'
+            },
+            iconfont: {
+                parent: 'hidden',
+            },
+            tips: '请选择',
+            filterable: true,
+            radio: true,
+            clickClose: true,
+            tree: {
+                show: true,
+                //非严格模式
+                strict: false,
+            },
+            data: []
+        })
+
+        febs.get(ctx + 'admin/productCategory/categoryTree', null, function(res) {
+            category.update({
+                data : res.data,
+                autoRow: true,
+            });
+        })
+
+        const E = window.wangEditor;
+        const editor = new E('#product-toolbar-container', '#product-text-container'); // 传入两个元素
+        editor.config.showLinkImg = false;
+        editor.config.uploadFileName = 'file';
+        editor.config.customUploadImg = function (files, insertImgFn) {
+            // files 是 input 中选中的文件列表
+            // insertImgFn 是获取图片 url 后,插入到编辑器的方法
+            // 上传图片,返回结果,将图片插入到编辑器中
+            for (let i = 0; i < files.length; i++){
+                var form = new FormData();
+                form.append("file", files[0]);
+                $.ajax({
+                    url:'/admin/goods/uploadFileBase64',
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    data: form,
+                    dataType: 'json',
+                    success(res) {
+                        // 上传代码返回结果之后,将图片插入到编辑器中
+                        insertImgFn(res.data.src, res.data.title, '')
+                    }
+                })
+            }
+        };
+        editor.create();
+
+        //图片上传
+        upload.render({
+            elem: '#productImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#iconImg").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#productBackImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#backImg").val(res.data.src);
+            }
+        });
+
+
+        setTimeout(() => {
+            initProductInfo();
+        }, 500);
+        function initProductInfo() {
+            form.val("product-info-form", {
+                "id": aiProduct.id,
+                "name": aiProduct.name,
+                "code": aiProduct.code,
+                "scene": aiProduct.scene,
+                "target": aiProduct.target,
+                "questionCount": aiProduct.questionCount,
+                "sort": aiProduct.sort,
+            });
+
+
+            var categoryList = [];
+            categoryList.push(aiProduct.productCategoryId)
+            category.setValue(categoryList);
+
+            $('#productImageUpload').append('<img src="' + aiProduct.iconImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#iconImg").val(aiProduct.iconImg);
+
+
+            $('#productBackImageUpload').append('<img src="' + aiProduct.backImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#backImg").val(aiProduct.backImg);
+
+
+            editor.txt.html(aiProduct.description);
+
+        }
+
+        form.on('submit(product-info-form-submit)', function (data) {
+            data.field.productCategoryId = category.getValue('valueStr');
+            data.field.description = editor.txt.html();
+            $.ajax({
+                'url':ctx + 'admin/product/update',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-product').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/ai/product/list.html b/src/main/resources/templates/febs/views/modules/ai/product/list.html
new file mode 100644
index 0000000..581d9df
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/product/list.html
@@ -0,0 +1,329 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-product" lay-title="产品">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="product-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-row layui-col-space6 layui-form-item">
+                                    <div class="layui-col-lg3">
+                                        <label class="layui-form-label">产品分类:</label>
+                                        <div class="layui-input-block">
+                                            <div id="product-category-query"></div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="productTable" lay-data="{id: 'productTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="productToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" type="button" shiro:hasPermission="categoryList:add" lay-event="productAdd">新增</button>
+    </div>
+</script>
+
+<script type="text/html" id="productOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productInfoEvent">编辑</button>
+    <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productDeleteEvent">删除</button>
+</script>
+
+
+<script type="text/html" id="productStateSwitch">
+    {{# if(d.state === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productStateSwitch">
+    {{# } }}
+</script>
+
+
+<script type="text/html" id="productHotStateSwitch">
+    {{# if(d.hotState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productHotStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productHotStateSwitch">
+    {{# } }}
+</script>
+
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-product'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        var category = xmSelect.render({
+            el: '#product-category-query',
+            language: 'zn',
+            prop : {
+                value : 'id',
+                children : 'child'
+            },
+            iconfont: {
+                parent: 'hidden',
+            },
+            tips: '请选择',
+            filterable: true,
+            radio: true,
+            clickClose: true,
+            tree: {
+                show: true,
+                //非严格模式
+                strict: false,
+            },
+            data: []
+        })
+
+        febs.get(ctx + 'admin/productCategory/categoryTree', null, function(res) {
+            category.update({
+                data : res.data,
+                autoRow: true,
+            });
+        })
+
+        // 表格初始化
+        setTimeout(() => {
+            initproductTable();
+        }, 500);
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(productTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seeImage') {
+                var t = $view.find('#seeImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'seeBackImage') {
+                var t = $view.find('#seeBackImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "背景图片",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'productInfoEvent') {
+                if (data.state == 1){
+                    febs.alert.warn('请先禁用这行数据');
+                    return;
+                }
+                febs.modal.open('编辑','modules/ai/product/info/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-product-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'productDeleteEvent') {
+                if (data.state == 1){
+                    febs.alert.warn('请先禁用这行数据');
+                    return;
+                }
+                febs.modal.confirm('删除', '确认删除?', function () {
+                    productDeleteEvent(data.id);
+                });
+            }
+        });
+
+        form.on('switch(productStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                productSwitch(data.value,1,1);
+            } else {
+                productSwitch(data.value,1,0);
+            }
+        })
+        form.on('switch(productHotStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                productSwitch(data.value,2,1);
+            } else {
+                productSwitch(data.value,2,0);
+            }
+        })
+        function productSwitch(id,type,state) {
+            febs.get(ctx + 'admin/product/changeState/' + id+'/'+ type+'/' + state, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
+        function productDeleteEvent(id) {
+            febs.get(ctx + 'admin/product/delete/' + id, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(productTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            if(layEvent === 'productAdd'){
+                febs.modal.open('新增', 'modules/ai/product/add/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-product-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'productSet') {
+                var checkData = table.checkStatus('productTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('工艺配置', 'modules/clothesType/productSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#art-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+        function initproductTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'productTable',
+                url: ctx + 'admin/product/list',
+                toolbar:"#productToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#productOption', minWidth: 200, align: 'center'},
+                    {field: 'hotState', title: '推荐首页', templet: '#productHotStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'state', title: '状态', templet: '#productStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'productCategoryName', title: '产品分类', minWidth: 100,align:'center'},
+                    {field: 'sort', title: '排序', minWidth: 100,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 100,align:'center'},
+                    {field: 'name', title: '名称', minWidth: 100,align:'center'},
+                    {field: 'iconImg',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seeImage">' +
+                                '<img id="seeImage' + d.id + '" src="' + d.iconImg +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                    {field: 'backImg',title: '背景图',
+                        templet: function (d) {
+                            return '<a lay-event="seeBackImage">' +
+                                '<img id="seeBackImage' + d.id + '" src="' + d.backImg +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                    {field: 'companyId', title: '公司编码', minWidth: 150,align:'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+
+            var categoryList = [];
+            category.setValue(categoryList);
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                productCategoryId: category.getValue('valueStr'),
+            };
+        }
+
+    })
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/ai/productCategory/add.html b/src/main/resources/templates/febs/views/modules/ai/productCategory/add.html
new file mode 100644
index 0000000..b25cda5
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/productCategory/add.html
@@ -0,0 +1,179 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-productCategory-add" lay-title="新增">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="productCategory-add">
+                <form class="layui-form" action="" lay-filter="productCategory-add-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="sort" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productCategoryImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">背景图片:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryBackImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productCategoryBackImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="productCategory-add-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            $view = $('#productCategory-add'),
+            layedit = layui.layedit,
+            upload = layui.upload,
+            validate = layui.validate,
+            element = layui.element;
+
+        form.render();
+
+        //图片上传
+        upload.render({
+            elem: '#productCategoryImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productCategoryImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#iconImg").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#productCategoryBackImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productCategoryBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#backImg").val(res.data.src);
+            }
+        });
+
+        form.on('submit(productCategory-add-form-submit)', function (data) {
+            $.ajax({
+                'url':ctx + 'admin/productCategory/add',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-productCategory').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/febs/views/modules/ai/productCategory/info.html b/src/main/resources/templates/febs/views/modules/ai/productCategory/info.html
new file mode 100644
index 0000000..96bb4a2
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/productCategory/info.html
@@ -0,0 +1,213 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-productCategory-Info" lay-title="编辑">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-fluid" id="productCategory-info">
+                <form class="layui-form" action="" lay-filter="productCategory-info-form">
+                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
+                        <ul class="layui-tab-title">
+                            <li class="layui-this">基础信息</li>
+                        </ul>
+                        <div class="layui-tab-content">
+                            <input type="text" name="id"
+                                   placeholder="" autoComplete="off" class="layui-input febs-hide">
+                            <div class="layui-tab-item layui-show">
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">名称:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">编码:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="code" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">排序:</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="sort" lay-verify="required"
+                                                   placeholder="" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">小图标:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productCategoryImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label febs-form-item-require">背景图片:</label>
+                                        <div class="layui-input-block">
+                                            <div class="layui-upload">
+                                                <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryBackImageUploadButton">上传</button>
+                                                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                                                    <div class="layui-upload-list" id="productCategoryBackImageUpload"></div>
+                                                </blockquote>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="layui-row layui-col-space10 layui-form-item febs-hide">
+                                    <div class="layui-col-lg6">
+                                        <label class="layui-form-label">小图标链接:</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item febs-hide">
+                        <button class="layui-btn" lay-submit="" lay-filter="productCategory-info-form-submit" id="submit">保存</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .blue-border {
+        border-left-color: #2db7f5;
+        font-size: 18px;
+    }
+    .layui-table-cell {
+        height:auto;
+    }
+    .layui-upload-list {
+        margin: 0 !important;
+    }
+    .multi-images {
+        margin: 0 5px !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            layer = layui.layer,
+            table = layui.table,
+            form = layui.form,
+            $view = $('#productCategory-info'),
+            aiProductCategory = [[${aiProductCategory}]],
+            upload = layui.upload,
+            validate = layui.validate;
+
+        form.render();
+
+        //图片上传
+        upload.render({
+            elem: '#productCategoryImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productCategoryImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#iconImg").val(res.data.src);
+            }
+        });
+
+        //图片上传
+        upload.render({
+            elem: '#productCategoryBackImageUploadButton'
+            ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+            ,accept: 'file' //普通文件
+            ,size: 10240 //限制文件大小,单位 KB
+            ,before: function(obj){
+                //预读本地文件示例,不支持ie8
+                obj.preview(function(index, file, result){
+                    $('#productCategoryBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">')
+                });
+            }
+            ,done: function(res){
+                $("#backImg").val(res.data.src);
+            }
+        });
+
+
+
+        setTimeout(() => {
+            initproductCategoryInfo();
+        }, 500);
+        function initproductCategoryInfo() {
+            form.val("productCategory-info-form", {
+                "id": aiProductCategory.id,
+                "name": aiProductCategory.name,
+                "code": aiProductCategory.code,
+                "iconImg": aiProductCategory.iconImg,
+                "sort": aiProductCategory.sort,
+            });
+
+
+            $('#productCategoryImageUpload').append('<img src="' + aiProductCategory.iconImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#iconImg").val(aiProductCategory.iconImg);
+
+
+            $('#productCategoryBackImageUpload').append('<img src="' + aiProductCategory.backImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
+            $("#backImg").val(aiProductCategory.backImg);
+
+        }
+
+        form.on('submit(productCategory-info-form-submit)', function (data) {
+            $.ajax({
+                'url':ctx + 'admin/productCategory/update',
+                'type':'post',
+                'dataType':'json',
+                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+                'traditional': true,//ajax传递数组必须添加属性
+                'data':JSON.stringify(data.field),
+                'success':function (data) {
+                    if(data.code==200){
+                        layer.closeAll();
+                        febs.alert.success(data.message);
+                        $('#febs-productCategory').find('#query').click();
+                    }else{
+                        febs.alert.warn(data.message);
+                    }
+                },
+                'error':function () {
+                    febs.alert.warn('服务器繁忙');
+                }
+            })
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/ai/productCategory/list.html b/src/main/resources/templates/febs/views/modules/ai/productCategory/list.html
new file mode 100644
index 0000000..e125bcb
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/ai/productCategory/list.html
@@ -0,0 +1,287 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-productCategory" lay-title="产品类型">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="productCategory-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="productCategoryTable" lay-data="{id: 'productCategoryTable'}"></table>
+
+                    <style type="text/css">
+                        .layui-table-cell{
+                            text-align:center;
+                            height: auto;
+                            white-space: nowrap; /*文本不会换行,在同一行显示*/
+                            overflow: hidden; /*超出隐藏*/
+                            text-overflow: ellipsis; /*省略号显示*/
+                        }
+                        .layui-table img{
+                            max-width:100px
+                        }
+                        ::-webkit-scrollbar {
+                            height: 20px !important;
+                            background-color: #f4f4f4;
+                        }
+                    </style>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="productCategoryToolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="categoryList:add" lay-event="productCategoryAdd">新增</button>
+    </div>
+</script>
+
+<script type="text/html" id="productCategoryOption">
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productCategoryInfoEvent">编辑</button>
+    <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productCategoryDeleteEvent">删除</button>
+</script>
+
+
+<script type="text/html" id="productCategoryStateSwitch">
+    {{# if(d.state === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productCategoryStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productCategoryStateSwitch">
+    {{# } }}
+</script>
+
+
+<script type="text/html" id="productCategoryHotStateSwitch">
+    {{# if(d.hotState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productCategoryHotStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productCategoryHotStateSwitch">
+    {{# } }}
+</script>
+
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-productCategory'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'orderNum', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initproductCategoryTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(productCategoryTable)', function (obj) {
+            console.log("触发事件:", obj.event); // 调试信息
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'seeImage') {
+                var t = $view.find('#seeImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "小图标",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'seeBackImage') {
+                var t = $view.find('#seeBackImage'+data.id+'');
+                //页面层
+                layer.open({
+                    type: 1,
+                    title: "背景图片",
+                    skin: 'layui-layer-rim', //加上边框
+                    area: ['100%', '100%'], //宽高
+                    shadeClose: true, //开启遮罩关闭
+                    end: function (index, layero) {
+                        return false;
+                    },
+                    content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'
+                });
+            }
+
+            if (layEvent === 'productCategoryInfoEvent') {
+                if (data.state == 1){
+                    febs.alert.warn('请先禁用这行数据');
+                    return;
+                }
+                febs.modal.open('编辑','modules/ai/productCategory/info/' + data.id, {
+                    btn: ['提交', '取消'],
+                    area: ['100%', '100%'],
+                    yes: function (index, layero) {
+                        $('#febs-productCategory-Info').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'productCategoryDeleteEvent') {
+                if (data.state == 1){
+                    febs.alert.warn('请先禁用这行数据');
+                    return;
+                }
+                febs.modal.confirm('删除', '确认删除?', function () {
+                    productCategoryDeleteEvent(data.id);
+                });
+            }
+        });
+
+        form.on('switch(productCategoryStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                productCategorySwitch(data.value,1,1);
+            } else {
+                productCategorySwitch(data.value,1,0);
+            }
+        })
+        form.on('switch(productCategoryHotStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                productCategorySwitch(data.value,2,1);
+            } else {
+                productCategorySwitch(data.value,2,0);
+            }
+        })
+        function productCategorySwitch(id,type,state) {
+            febs.get(ctx + 'admin/productCategory/changeState/' + id+'/'+ type+'/' + state, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
+        function productCategoryDeleteEvent(id) {
+            febs.get(ctx + 'admin/productCategory/delete/' + id, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('toolbar(productCategoryTable)', function (obj) {
+            let data = obj.data,
+                layEvent = obj.event;
+            if(layEvent === 'productCategoryAdd'){
+                febs.modal.open('新增', 'modules/ai/productCategory/add/', {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#febs-productCategory-add').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'productSet') {
+                var checkData = table.checkStatus('productCategoryTable').data;
+                if (checkData.length > 1 || checkData.length === 0) {
+                    febs.alert.warn('每次操作只能操作一行数据');
+                    return;
+                }
+                febs.modal.open('工艺配置', 'modules/clothesType/productSet/' + checkData[0].id, {
+                    btn: ['提交', '取消'],
+                    area:['100%','100%'],
+                    yes: function (index, layero) {
+                        $('#art-set').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+        function initproductCategoryTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'productCategoryTable',
+                url: ctx + 'admin/productCategory/list',
+                toolbar:"#productCategoryToolbar",
+                defaultToolbar:[],
+                cols: [[
+                    {type: 'checkbox'},
+                    {type: 'numbers', title: '', width: 80},
+                    {title: '操作', toolbar: '#productCategoryOption', minWidth: 200, align: 'center'},
+                    {field: 'hotState', title: '推荐首页', templet: '#productCategoryHotStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'state', title: '状态', templet: '#productCategoryStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'sort', title: '排序', minWidth: 100,align:'center'},
+                    {field: 'code', title: '编码', minWidth: 100,align:'center'},
+                    {field: 'name', title: '名称', minWidth: 100,align:'center'},
+                    {field: 'iconImg',title: '小图标',
+                        templet: function (d) {
+                            return '<a lay-event="seeImage">' +
+                                '<img id="seeImage' + d.id + '" src="' + d.iconImg +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                    {field: 'backImg',title: '背景图',
+                        templet: function (d) {
+                            return '<a lay-event="seeBackImage">' +
+                                '<img id="seeBackImage' + d.id + '" src="' + d.backImg +
+                                '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' +
+                                '</a>';
+                        },
+                    minWidth: 150,align: 'center'},
+                    {field: 'companyId', title: '公司编码', minWidth: 150,align:'center'},
+                ]]
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+            };
+        }
+
+    })
+</script>

--
Gitblit v1.9.1