From 577bef7f8ece263c4bc272bab23fcc8aa4b6083b Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 16 Sep 2025 11:56:01 +0800
Subject: [PATCH] feat(ai): 产品知识点增加分类功能

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java |   23 +++++++++++
 src/main/resources/templates/febs/views/modules/ai/productPoint/list.html   |    1 
 src/main/resources/templates/febs/views/modules/ai/productPoint/info.html   |   25 +++++++++++-
 src/main/java/cc/mrbird/febs/ai/entity/AiProductPoint.java                  |    9 ++++
 src/main/resources/templates/febs/views/modules/ai/productPoint/add.html    |   21 ++++++++++
 5 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiProductPoint.java b/src/main/java/cc/mrbird/febs/ai/entity/AiProductPoint.java
index d094130..4abafcd 100644
--- a/src/main/java/cc/mrbird/febs/ai/entity/AiProductPoint.java
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiProductPoint.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;
 
@@ -17,6 +18,11 @@
      * 公司ID (UUID)
      */
     private String companyId;
+
+    /**
+     * 类型
+     */
+    private String productCategoryId;
 
     /**
      * 类型1:普通内容  2:视频号内容
@@ -47,4 +53,7 @@
      * 描述
      */
     private String description;
+
+    @TableField(exist = false)
+    private String productCategoryName;
 }
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 9d0c44e..c496f82 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java
@@ -1,13 +1,16 @@
 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.entity.AiProductPoint;
 import cc.mrbird.febs.ai.mapper.AiProductPointMapper;
+import cc.mrbird.febs.ai.service.AiProductCategoryService;
 import cc.mrbird.febs.ai.service.AiProductPointLinkService;
 import cc.mrbird.febs.ai.service.AiProductPointService;
 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 cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -21,6 +24,9 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * AI产品知识点 Service实现类
@@ -35,6 +41,7 @@
 
     private final AiProductPointMapper aiProductPointMapper;
     private final AiProductPointLinkService aiProductPointLinkService;
+    private final AiProductCategoryService aiProductCategoryService;
 
     @Override
     public AiProductPoint getById(String id) {
@@ -49,6 +56,20 @@
             query.eq(AiProductPoint::getCompanyId, dto.getCompanyId());
         }
         Page<AiProductPoint> pages = aiProductPointMapper.selectPage(page, query);
+        List<AiProductPoint> records = pages.getRecords();
+        if (CollUtil.isNotEmpty( records)){
+            Set<String> collect = records.stream().map(AiProductPoint::getProductCategoryId).collect(Collectors.toSet());
+
+            if(CollUtil.isNotEmpty( collect)){
+                Map<String, AiProductCategory> map = aiProductCategoryService.selectMapByIds(collect);
+                for (AiProductPoint record : records){
+                    AiProductCategory orDefault = map.getOrDefault(record.getProductCategoryId(), null);
+                    if(ObjectUtil.isNotNull(orDefault)){
+                        record.setProductCategoryName(orDefault.getName());
+                    }
+                }
+            }
+        }
         return pages;
     }
 
@@ -56,6 +77,7 @@
     public FebsResponse add(AiProductPoint dto) {
         AiProductPoint entity = new AiProductPoint();
         entity.setId(UUID.getSimpleUUIDString());
+        entity.setProductCategoryId(dto.getProductCategoryId());
         entity.setCompanyId(dto.getCompanyId());
         entity.setIsNormal(dto.getIsNormal() );
         entity.setFinderUserName(dto.getFinderUserName());
@@ -76,6 +98,7 @@
             this.update(null,
                     Wrappers.lambdaUpdate(AiProductPoint.class)
                             .set(AiProductPoint::getIsNormal, dto.getIsNormal())
+                            .set(AiProductPoint::getProductCategoryId, dto.getProductCategoryId())
                             .set(AiProductPoint::getFinderUserName, dto.getFinderUserName())
                             .set(AiProductPoint::getFeedId, dto.getFeedId())
                             .set(AiProductPoint::getTitle, dto.getTitle())
diff --git a/src/main/resources/templates/febs/views/modules/ai/productPoint/add.html b/src/main/resources/templates/febs/views/modules/ai/productPoint/add.html
index 02964a8..a045842 100644
--- a/src/main/resources/templates/febs/views/modules/ai/productPoint/add.html
+++ b/src/main/resources/templates/febs/views/modules/ai/productPoint/add.html
@@ -9,6 +9,15 @@
                         </ul>
                         <div class="layui-tab-content">
                             <div class="layui-tab-item layui-show">
+
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">分类:</label>
+                                    <div class="layui-input-block">
+                                        <select name="productCategoryId" class="news-category" id="news-category" >
+                                            <option value="">请选择</option>
+                                        </select>
+                                    </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>
@@ -117,6 +126,18 @@
 
         form.render();
 
+        //(下拉框)
+        $.get(ctx + 'admin/productCategory/categoryTree/parent', function (data) {
+            for (var k in data)
+            {
+                $(".news-category").append("<option value='" + data[k].id + "'>" + data[k].name + "</option>");
+            }
+            layui.use('form', function () {
+                var form = layui.form;
+                form.render();
+            });
+        });
+
         const E = window.wangEditor;
         const editor = new E('#product-point-toolbar-container', '#product-point-text-container'); // 传入两个元素
         editor.config.showLinkImg = false;
diff --git a/src/main/resources/templates/febs/views/modules/ai/productPoint/info.html b/src/main/resources/templates/febs/views/modules/ai/productPoint/info.html
index c1addd8..bc08ba8 100644
--- a/src/main/resources/templates/febs/views/modules/ai/productPoint/info.html
+++ b/src/main/resources/templates/febs/views/modules/ai/productPoint/info.html
@@ -11,7 +11,14 @@
                             <input type="text" name="id"
                                    placeholder="" autoComplete="off" class="layui-input febs-hide">
                             <div class="layui-tab-item layui-show">
-
+                                <div class="layui-form-item">
+                                    <label class="layui-form-label febs-form-item-require">分类:</label>
+                                    <div class="layui-input-block">
+                                        <select name="productCategoryId" class="news-category" id="news-category" >
+                                            <option value="">请选择</option>
+                                        </select>
+                                    </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>
@@ -126,6 +133,19 @@
 
         form.render();
 
+        //(下拉框)
+        $.get(ctx + 'admin/productCategory/categoryTree/parent', function (data) {
+            for (var k in data)
+            {
+                $(".news-category").append("<option value='" + data[k].id + "'>" + data[k].name + "</option>");
+            }
+            layui.use('form', function () {
+                var form = layui.form;
+                $("#news-category").val(aiProductPoint.productCategoryId)
+                form.render();
+            });
+        });
+
         const E = window.wangEditor;
         const editor = new E('#product-point-toolbar-container', '#product-point-text-container'); // 传入两个元素
         editor.config.showLinkImg = false;
@@ -189,10 +209,9 @@
                 "title": aiProductPoint.title,
                 "isNormal": aiProductPoint.isNormal,
                 "finderUserName": aiProductPoint.finderUserName,
+                "productCategoryId": aiProductPoint.productCategoryId,
                 "feedId": aiProductPoint.feedId,
             });
-
-
 
             $('#productPointImageUpload').append('<img src="' + aiProductPoint.feedImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">');
             $("#feedImg").val(aiProductPoint.feedImg);
diff --git a/src/main/resources/templates/febs/views/modules/ai/productPoint/list.html b/src/main/resources/templates/febs/views/modules/ai/productPoint/list.html
index b6c4bfb..5abd069 100644
--- a/src/main/resources/templates/febs/views/modules/ai/productPoint/list.html
+++ b/src/main/resources/templates/febs/views/modules/ai/productPoint/list.html
@@ -159,6 +159,7 @@
                     {type: 'checkbox'},
                     {type: 'numbers', title: '', width: 80},
                     {title: '操作', toolbar: '#productPointOption', minWidth: 200, align: 'center'},
+                    {field: 'productCategoryName', title: '分类', minWidth: 100,align:'center'},
                     {field: 'title', title: '标题', minWidth: 100,align:'center'},
                     {templet:"#pointTypeFormat",  title: '类型', minWidth: 140,align:'center'},
                     {field: 'companyId', title: '公司编码', minWidth: 150,align:'center'},

--
Gitblit v1.9.1