Administrator
18 hours ago 577bef7f8ece263c4bc272bab23fcc8aa4b6083b
feat(ai): 产品知识点增加分类功能

- 在产品知识点添加和编辑页面添加分类下拉框
- 从后端获取产品分类数据并渲染到下拉框
- 在产品知识点列表页面添加分类列显示
- 优化产品知识点实体类,增加分类相关字段
- 更新产品知识点服务实现类,支持分类查询和保存
5 files modified
79 ■■■■■ changed files
src/main/java/cc/mrbird/febs/ai/entity/AiProductPoint.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java 23 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/ai/productPoint/add.html 21 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/ai/productPoint/info.html 25 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/ai/productPoint/list.html 1 ●●●● patch | view | raw | blame | history
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;
}
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())
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;
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);
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'},