Jelajahi Sumber

feat: 1、产品库支持下发记录数据的入库 2、产品库记录知识库与产品的关联关系。3、页面支持查看关联条目

lihao16 4 bulan lalu
induk
melakukan
b44999ff66
25 mengubah file dengan 1004 tambahan dan 26 penghapusan
  1. 83 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/controller/SmsbDatasetsPushRecordController.java
  2. 17 16
      smsb-modules/smsb-device/src/main/java/com/inspur/device/controller/SmsbDifyDatasetsController.java
  3. 9 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/controller/SmsbDifyDatasetsProductController.java
  4. 56 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbDatasetsProductRel.java
  5. 74 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbDatasetsPushRecord.java
  6. 39 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/bo/SmsbDatasetsProductRelBo.java
  7. 64 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/bo/SmsbDatasetsPushRecordBo.java
  8. 53 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/vo/SmsbDatasetsProductRelVo.java
  9. 63 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/vo/SmsbDatasetsPushRecordVo.java
  10. 15 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/mapper/SmsbDatasetsProductRelMapper.java
  11. 15 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/mapper/SmsbDatasetsPushRecordMapper.java
  12. 8 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/mapper/SmsbDifyDatasetsProductMapper.java
  13. 68 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/ISmsbDatasetsPushRecordService.java
  14. 7 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/ISmsbDifyDatasetsProductService.java
  15. 131 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDatasetsPushRecordServiceImpl.java
  16. 17 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDifyDatasetsProductServiceImpl.java
  17. 29 3
      smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDifyDatasetsServiceImpl.java
  18. 7 0
      smsb-modules/smsb-device/src/main/resources/mapper/device/SmsbDatasetsProductRelMapper.xml
  19. 7 0
      smsb-modules/smsb-device/src/main/resources/mapper/device/SmsbDatasetsPushRecordMapper.xml
  20. 11 0
      smsb-modules/smsb-device/src/main/resources/mapper/device/SmsbDifyDatasetsProductMapper.xml
  21. 1 0
      smsb-plus-ui/src/api/smsb/device/datasets.ts
  22. 63 0
      smsb-plus-ui/src/api/smsb/device/datasetsPushRecord/api.ts
  23. 101 0
      smsb-plus-ui/src/api/smsb/device/datasetsPushRecord/types.ts
  24. 14 3
      smsb-plus-ui/src/api/smsb/device/difyDatasetsProduct/index.ts
  25. 52 4
      smsb-plus-ui/src/views/smsb/datasets/product.vue

+ 83 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/controller/SmsbDatasetsPushRecordController.java

@@ -0,0 +1,83 @@
+package com.inspur.device.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import com.inspur.device.domain.vo.SmsbDatasetsPushRecordVo;
+import com.inspur.device.domain.bo.SmsbDatasetsPushRecordBo;
+import com.inspur.device.service.ISmsbDatasetsPushRecordService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 知识库下发记录
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/device/datasetsPushRecord")
+public class SmsbDatasetsPushRecordController extends BaseController {
+
+    private final ISmsbDatasetsPushRecordService smsbDatasetsPushRecordService;
+
+    /**
+     * 查询知识库下发记录列表
+     */
+    @SaCheckPermission("device:datasetsPushRecord:list")
+    @GetMapping("/list")
+    public TableDataInfo<SmsbDatasetsPushRecordVo> list(SmsbDatasetsPushRecordBo bo, PageQuery pageQuery) {
+        return smsbDatasetsPushRecordService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出知识库下发记录列表
+     */
+    @SaCheckPermission("device:datasetsPushRecord:export")
+    @Log(title = "知识库下发记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SmsbDatasetsPushRecordBo bo, HttpServletResponse response) {
+        List<SmsbDatasetsPushRecordVo> list = smsbDatasetsPushRecordService.queryList(bo);
+        ExcelUtil.exportExcel(list, "知识库下发记录", SmsbDatasetsPushRecordVo.class, response);
+    }
+
+    /**
+     * 获取知识库下发记录详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("device:datasetsPushRecord:query")
+    @GetMapping("/{id}")
+    public R<SmsbDatasetsPushRecordVo> getInfo(@NotNull(message = "主键不能为空")
+                                               @PathVariable Long id) {
+        return R.ok(smsbDatasetsPushRecordService.queryById(id));
+    }
+
+    /**
+     * 删除知识库下发记录
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("device:datasetsPushRecord:remove")
+    @Log(title = "知识库下发记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(smsbDatasetsPushRecordService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 17 - 16
smsb-modules/smsb-device/src/main/java/com/inspur/device/controller/SmsbDifyDatasetsController.java

@@ -1,27 +1,28 @@
 package com.inspur.device.controller;
 
-import java.io.IOException;
-import java.util.List;
-
-import lombok.RequiredArgsConstructor;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
+import com.inspur.device.domain.bo.SmsbDifyDatasetsBo;
+import com.inspur.device.domain.vo.SmsbDifyDatasetsVo;
+import com.inspur.device.service.ISmsbDifyDatasetsService;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
-import com.inspur.device.domain.vo.SmsbDifyDatasetsVo;
-import com.inspur.device.domain.bo.SmsbDifyDatasetsBo;
-import com.inspur.device.service.ISmsbDifyDatasetsService;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
 
 /**
  * 知识库管理

+ 9 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/controller/SmsbDifyDatasetsProductController.java

@@ -55,6 +55,15 @@ public class SmsbDifyDatasetsProductController extends BaseController {
         return R.ok(smsbDifyDatasetsProductService.queryList(new SmsbDifyDatasetsProductBo()));
     }
 
+    /**
+     * 查询所有的Dify产品推荐列表
+     */
+    @SaCheckPermission("device:difyDatasetsProduct:list")
+    @GetMapping("/listByDatasetsId/{datasetsId}")
+    public R<List<SmsbDifyDatasetsProductVo>> listByDatasetsId(@PathVariable("datasetsId") Long datasetsId) {
+        return R.ok(smsbDifyDatasetsProductService.queryListByDatasetsId(datasetsId));
+    }
+
     /**
      * 导出Dify产品推荐列表
      */

+ 56 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbDatasetsProductRel.java

@@ -0,0 +1,56 @@
+package com.inspur.device.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 产品库产品关联对象 smsb_datasets_product_rel
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@Data
+@TableName("smsb_datasets_product_rel")
+public class SmsbDatasetsProductRel {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 知识库ID
+     */
+    private Long datasetsId;
+
+    /**
+     * 产品库ID
+     */
+    private Long productId;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 下发记录ID
+     */
+    private Long recordId;
+}

+ 74 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/SmsbDatasetsPushRecord.java

@@ -0,0 +1,74 @@
+package com.inspur.device.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 知识库下发记录对象 smsb_datasets_push_record
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@Data
+@TableName("smsb_datasets_push_record")
+public class SmsbDatasetsPushRecord {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 知识库ID
+     */
+    private Long datasetsId;
+
+    /**
+     * 类型 1-问答 2-产品
+     */
+    private Integer datasetsType;
+
+    /**
+     * 知识库名称
+     */
+    private String datasetsName;
+
+    /**
+     * 条目数量
+     */
+    private Integer entryNum;
+
+    /**
+     * 创建人名称
+     */
+    private String createUser;
+
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+    /**
+     * 创建者
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+
+}

+ 39 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/bo/SmsbDatasetsProductRelBo.java

@@ -0,0 +1,39 @@
+package com.inspur.device.domain.bo;
+
+import com.inspur.device.domain.SmsbDatasetsProductRel;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 产品库产品关联业务对象 smsb_datasets_product_rel
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SmsbDatasetsProductRel.class, reverseConvertGenerate = false)
+public class SmsbDatasetsProductRelBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 知识库ID
+     */
+    private Long datasetsId;
+
+    /**
+     * 产品库ID
+     */
+    private Long productId;
+
+    /**
+     * 下发记录ID
+     */
+    private Long recordId;
+}

+ 64 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/bo/SmsbDatasetsPushRecordBo.java

@@ -0,0 +1,64 @@
+package com.inspur.device.domain.bo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.inspur.device.domain.SmsbDatasetsPushRecord;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 知识库下发记录业务对象 smsb_datasets_push_record
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@Data
+@AutoMapper(target = SmsbDatasetsPushRecord.class, reverseConvertGenerate = false)
+public class SmsbDatasetsPushRecordBo {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 知识库ID
+     */
+    private Long datasetsId;
+
+    /**
+     * 类型 1-问答 2-产品
+     */
+    private Integer datasetsType;
+
+    /**
+     * 知识库名称
+     */
+    private String datasetsName;
+
+    /**
+     * 条目数量
+     */
+    private Integer entryNum;
+
+    /**
+     * 创建人名称
+     */
+    private String createUser;
+
+    /**
+     * 创建者
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+
+}

+ 53 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/vo/SmsbDatasetsProductRelVo.java

@@ -0,0 +1,53 @@
+package com.inspur.device.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.inspur.device.domain.SmsbDatasetsProductRel;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 产品库产品关联视图对象 smsb_datasets_product_rel
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SmsbDatasetsProductRel.class)
+public class SmsbDatasetsProductRelVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 知识库ID
+     */
+    private Long datasetsId;
+
+    /**
+     * 产品库ID
+     */
+    private Long productId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 下发记录ID
+     */
+    private Long recordId;
+
+
+}

+ 63 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/vo/SmsbDatasetsPushRecordVo.java

@@ -0,0 +1,63 @@
+package com.inspur.device.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.inspur.device.domain.SmsbDatasetsPushRecord;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 知识库下发记录视图对象 smsb_datasets_push_record
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SmsbDatasetsPushRecord.class)
+public class SmsbDatasetsPushRecordVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 知识库ID
+     */
+    private Long datasetsId;
+
+    /**
+     * 类型 1-问答 2-产品
+     */
+    private Integer datasetsType;
+
+    /**
+     * 知识库名称
+     */
+    private String datasetsName;
+
+    /**
+     * 条目数量
+     */
+    private Integer entryNum;
+
+    /**
+     * 创建人名称
+     */
+    private String createUser;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+
+}

+ 15 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/mapper/SmsbDatasetsProductRelMapper.java

@@ -0,0 +1,15 @@
+package com.inspur.device.mapper;
+
+import com.inspur.device.domain.SmsbDatasetsProductRel;
+import com.inspur.device.domain.vo.SmsbDatasetsProductRelVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品库产品关联Mapper接口
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+public interface SmsbDatasetsProductRelMapper extends BaseMapperPlus<SmsbDatasetsProductRel, SmsbDatasetsProductRelVo> {
+
+}

+ 15 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/mapper/SmsbDatasetsPushRecordMapper.java

@@ -0,0 +1,15 @@
+package com.inspur.device.mapper;
+
+import com.inspur.device.domain.SmsbDatasetsPushRecord;
+import com.inspur.device.domain.vo.SmsbDatasetsPushRecordVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 知识库下发记录Mapper接口
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+public interface SmsbDatasetsPushRecordMapper extends BaseMapperPlus<SmsbDatasetsPushRecord, SmsbDatasetsPushRecordVo> {
+
+}

+ 8 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/mapper/SmsbDifyDatasetsProductMapper.java

@@ -16,4 +16,12 @@ import java.util.List;
 public interface SmsbDifyDatasetsProductMapper extends BaseMapperPlus<SmsbDifyDatasetsProduct, SmsbDifyDatasetsProductVo> {
 
     List<SmsbDifyDatasetsProductVo> selectVoListByIds(@Param("ids") List<String> ids);
+
+    /**
+     * 根据recordId+datasetsId 获取当前知识库下发的内容
+     * @param recordId
+     * @param datasetsId
+     * @return
+     */
+    List<SmsbDifyDatasetsProductVo> selectVoListByRIdAndDid(@Param("recordId") Long recordId, @Param("datasetsId") Long datasetsId);
 }

+ 68 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/ISmsbDatasetsPushRecordService.java

@@ -0,0 +1,68 @@
+package com.inspur.device.service;
+
+import com.inspur.device.domain.bo.SmsbDatasetsPushRecordBo;
+import com.inspur.device.domain.vo.SmsbDatasetsPushRecordVo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 知识库下发记录Service接口
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+public interface ISmsbDatasetsPushRecordService {
+
+    /**
+     * 查询知识库下发记录
+     *
+     * @param id 主键
+     * @return 知识库下发记录
+     */
+    SmsbDatasetsPushRecordVo queryById(Long id);
+
+    /**
+     * 分页查询知识库下发记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 知识库下发记录分页列表
+     */
+    TableDataInfo<SmsbDatasetsPushRecordVo> queryPageList(SmsbDatasetsPushRecordBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的知识库下发记录列表
+     *
+     * @param bo 查询条件
+     * @return 知识库下发记录列表
+     */
+    List<SmsbDatasetsPushRecordVo> queryList(SmsbDatasetsPushRecordBo bo);
+
+    /**
+     * 新增知识库下发记录
+     *
+     * @param bo 知识库下发记录
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SmsbDatasetsPushRecordBo bo);
+
+    /**
+     * 修改知识库下发记录
+     *
+     * @param bo 知识库下发记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SmsbDatasetsPushRecordBo bo);
+
+    /**
+     * 校验并批量删除知识库下发记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 7 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/ISmsbDifyDatasetsProductService.java

@@ -66,4 +66,11 @@ public interface ISmsbDifyDatasetsProductService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据产品库ID 查询当前下发的产品内容
+     * @param datasetsId
+     * @return
+     */
+    List<SmsbDifyDatasetsProductVo> queryListByDatasetsId(Long datasetsId);
 }

+ 131 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDatasetsPushRecordServiceImpl.java

@@ -0,0 +1,131 @@
+package com.inspur.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.inspur.device.domain.SmsbDatasetsPushRecord;
+import com.inspur.device.domain.bo.SmsbDatasetsPushRecordBo;
+import com.inspur.device.domain.vo.SmsbDatasetsPushRecordVo;
+import com.inspur.device.mapper.SmsbDatasetsPushRecordMapper;
+import com.inspur.device.service.ISmsbDatasetsPushRecordService;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 知识库下发记录Service业务层处理
+ *
+ * @author Hao Li
+ * @date 2025-06-18
+ */
+@RequiredArgsConstructor
+@Service
+public class SmsbDatasetsPushRecordServiceImpl implements ISmsbDatasetsPushRecordService {
+
+    private final SmsbDatasetsPushRecordMapper baseMapper;
+
+    /**
+     * 查询知识库下发记录
+     *
+     * @param id 主键
+     * @return 知识库下发记录
+     */
+    @Override
+    public SmsbDatasetsPushRecordVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询知识库下发记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 知识库下发记录分页列表
+     */
+    @Override
+    public TableDataInfo<SmsbDatasetsPushRecordVo> queryPageList(SmsbDatasetsPushRecordBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SmsbDatasetsPushRecord> lqw = buildQueryWrapper(bo);
+        Page<SmsbDatasetsPushRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的知识库下发记录列表
+     *
+     * @param bo 查询条件
+     * @return 知识库下发记录列表
+     */
+    @Override
+    public List<SmsbDatasetsPushRecordVo> queryList(SmsbDatasetsPushRecordBo bo) {
+        LambdaQueryWrapper<SmsbDatasetsPushRecord> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SmsbDatasetsPushRecord> buildQueryWrapper(SmsbDatasetsPushRecordBo bo) {
+        LambdaQueryWrapper<SmsbDatasetsPushRecord> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getDatasetsId() != null, SmsbDatasetsPushRecord::getDatasetsId, bo.getDatasetsId());
+        lqw.eq(bo.getDatasetsType() != null, SmsbDatasetsPushRecord::getDatasetsType, bo.getDatasetsType());
+        lqw.like(StringUtils.isNotBlank(bo.getDatasetsName()), SmsbDatasetsPushRecord::getDatasetsName, bo.getDatasetsName());
+        lqw.like(StringUtils.isNotBlank(bo.getCreateUser()), SmsbDatasetsPushRecord::getCreateUser, bo.getCreateUser());
+        return lqw;
+    }
+
+    /**
+     * 新增知识库下发记录
+     *
+     * @param bo 知识库下发记录
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SmsbDatasetsPushRecordBo bo) {
+        SmsbDatasetsPushRecord add = MapstructUtils.convert(bo, SmsbDatasetsPushRecord.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改知识库下发记录
+     *
+     * @param bo 知识库下发记录
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SmsbDatasetsPushRecordBo bo) {
+        SmsbDatasetsPushRecord update = MapstructUtils.convert(bo, SmsbDatasetsPushRecord.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SmsbDatasetsPushRecord entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除知识库下发记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 17 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDifyDatasetsProductServiceImpl.java

@@ -1,8 +1,11 @@
 package com.inspur.device.service.impl;
 
+import com.inspur.device.domain.SmsbDatasetsPushRecord;
 import com.inspur.device.domain.SmsbDifyDatasetsProduct;
 import com.inspur.device.domain.bo.SmsbDifyDatasetsProductBo;
+import com.inspur.device.domain.vo.SmsbDatasetsPushRecordVo;
 import com.inspur.device.domain.vo.SmsbDifyDatasetsProductVo;
+import com.inspur.device.mapper.SmsbDatasetsPushRecordMapper;
 import com.inspur.device.mapper.SmsbDifyDatasetsProductMapper;
 import com.inspur.device.service.ISmsbDifyDatasetsProductService;
 import org.dromara.common.core.utils.MapstructUtils;
@@ -19,6 +22,7 @@ import org.dromara.system.mapper.SysOssMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -34,6 +38,7 @@ import java.util.Collection;
 public class SmsbDifyDatasetsProductServiceImpl implements ISmsbDifyDatasetsProductService {
 
     private final SmsbDifyDatasetsProductMapper baseMapper;
+    private final SmsbDatasetsPushRecordMapper smsbDatasetsPushRecordMapper;
 
     @Autowired
     private SysOssMapper sysOssMapper;
@@ -75,6 +80,18 @@ public class SmsbDifyDatasetsProductServiceImpl implements ISmsbDifyDatasetsProd
         return baseMapper.selectVoList(lqw);
     }
 
+    @Override
+    public List<SmsbDifyDatasetsProductVo> queryListByDatasetsId(Long datasetsId) {
+        // 1、根据产品库Id查询最近的一次下发记录
+        SmsbDatasetsPushRecordVo lastPushRecord = smsbDatasetsPushRecordMapper.selectVoOne(new LambdaQueryWrapper<SmsbDatasetsPushRecord>()
+            .eq(SmsbDatasetsPushRecord::getDatasetsId,datasetsId).orderByDesc(SmsbDatasetsPushRecord::getId).last("limit 1"));
+        if (null == lastPushRecord) {
+            return new ArrayList<>();
+        }
+        // 2、根据下发记录ID + datasetsId 查询关联关系获取产品信息
+        return baseMapper.selectVoListByRIdAndDid(lastPushRecord.getId(),datasetsId);
+    }
+
     private LambdaQueryWrapper<SmsbDifyDatasetsProduct> buildQueryWrapper(SmsbDifyDatasetsProductBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<SmsbDifyDatasetsProduct> lqw = Wrappers.lambdaQuery();

+ 29 - 3
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDifyDatasetsServiceImpl.java

@@ -9,6 +9,8 @@ import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.inspur.device.domain.SmsbDatasetsProductRel;
+import com.inspur.device.domain.SmsbDatasetsPushRecord;
 import com.inspur.device.domain.SmsbDifyDatasets;
 import com.inspur.device.domain.SmsbDifyDatasetsFile;
 import com.inspur.device.domain.bo.SmsbDifyDatasetsBo;
@@ -16,9 +18,7 @@ import com.inspur.device.domain.vo.DifyDatasetsRspData;
 import com.inspur.device.domain.vo.SmsbDifyDatasetsFileVo;
 import com.inspur.device.domain.vo.SmsbDifyDatasetsProductVo;
 import com.inspur.device.domain.vo.SmsbDifyDatasetsVo;
-import com.inspur.device.mapper.SmsbDifyDatasetsFileMapper;
-import com.inspur.device.mapper.SmsbDifyDatasetsMapper;
-import com.inspur.device.mapper.SmsbDifyDatasetsProductMapper;
+import com.inspur.device.mapper.*;
 import com.inspur.device.service.ISmsbDifyDatasetsFileService;
 import com.inspur.device.service.ISmsbDifyDatasetsService;
 import lombok.RequiredArgsConstructor;
@@ -66,6 +66,8 @@ public class SmsbDifyDatasetsServiceImpl implements ISmsbDifyDatasetsService {
     private final SmsbDifyDatasetsProductMapper smsbDifyDatasetsProductMapper;
     private final SmsbDifyDatasetsFileMapper smsbDifyDatasetsFileMapper;
     private final ISmsbDifyDatasetsFileService smsbDifyDatasetsFileService;
+    private final SmsbDatasetsProductRelMapper smsbDatasetsProductRelMapper;
+    private final SmsbDatasetsPushRecordMapper smsbDatasetsPushRecordMapper;
 
 
     /**
@@ -134,11 +136,16 @@ public class SmsbDifyDatasetsServiceImpl implements ISmsbDifyDatasetsService {
         List<SmsbDifyDatasetsProductVo> productVoList = smsbDifyDatasetsProductMapper.selectVoListByIds(productIds);
         // 1 生成新的内容
         StringBuffer sb = new StringBuffer();
+        List<SmsbDatasetsProductRel> datasetsProductRelList = new ArrayList<>();
         for (SmsbDifyDatasetsProductVo productVo : productVoList) {
             sb.append("###");
             sb.append("产品名称:" + productVo.getName()).append("\n");
             sb.append("产品简介:" + productVo.getNote()).append("\n");
             sb.append("产品图片:" + productVo.getImgUrl()).append("\n");
+            SmsbDatasetsProductRel datasetsProductRel = new SmsbDatasetsProductRel();
+            datasetsProductRel.setProductId(productVo.getId());
+            datasetsProductRel.setDatasetsId(datasetsId);
+            datasetsProductRelList.add(datasetsProductRel);
         }
         // 2 查询当前产品库关联的文件
         SmsbDifyDatasetsFileVo difyDatasetsFileVo = smsbDifyDatasetsFileMapper.selectVoOne(new LambdaQueryWrapper<SmsbDifyDatasetsFile>()
@@ -152,10 +159,29 @@ public class SmsbDifyDatasetsServiceImpl implements ISmsbDifyDatasetsService {
         // 4 生成新的文件上传至dify平台
         String filePath = createTempFile(sb.toString());
         boolean uploadResult = upload2Dify(datasetsVo,filePath);
+        // 5 生成下发记录
+        SmsbDatasetsPushRecord pushRecord = createNewPushRecord(datasetsVo,2,productVoList.size());
+        Long recordId = pushRecord.getId();
+        // 6 记录当前产品库关联的产品
+        datasetsProductRelList.forEach(rel -> {
+            rel.setRecordId(recordId);
+        });
+        smsbDatasetsProductRelMapper.insertBatch(datasetsProductRelList);
 
         return uploadResult;
     }
 
+    private SmsbDatasetsPushRecord createNewPushRecord(SmsbDifyDatasetsVo datasetsVo,Integer datasetsType,Integer entryNum) {
+        SmsbDatasetsPushRecord pushRecord = new SmsbDatasetsPushRecord();
+        pushRecord.setDatasetsId(datasetsVo.getId());
+        pushRecord.setDatasetsType(datasetsType);
+        pushRecord.setDatasetsName(datasetsVo.getName());
+        pushRecord.setEntryNum(entryNum);
+        pushRecord.setCreateUser(LoginHelper.getLoginUser().getNickname());
+        smsbDatasetsPushRecordMapper.insert(pushRecord);
+        return pushRecord;
+    }
+
     private boolean upload2Dify(SmsbDifyDatasetsVo datasetsVo,String filePath) {
         // 根据
         // 2、 调用dify接口,将文件上传至dify

+ 7 - 0
smsb-modules/smsb-device/src/main/resources/mapper/device/SmsbDatasetsProductRelMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.inspur.device.mapper.SmsbDatasetsProductRelMapper">
+
+</mapper>

+ 7 - 0
smsb-modules/smsb-device/src/main/resources/mapper/device/SmsbDatasetsPushRecordMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.inspur.device.mapper.SmsbDatasetsPushRecordMapper">
+
+</mapper>

+ 11 - 0
smsb-modules/smsb-device/src/main/resources/mapper/device/SmsbDifyDatasetsProductMapper.xml

@@ -9,4 +9,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </select>
+
+    <select id="selectVoListByRIdAndDid" resultType="com.inspur.device.domain.vo.SmsbDifyDatasetsProductVo">
+        SELECT
+            sddp.*
+        FROM
+            smsb_datasets_product_rel sdpr
+        LEFT JOIN smsb_dify_datasets_product sddp ON sdpr.product_id = sddp.id
+        WHERE
+            sdpr.datasets_id = #{datasetsId}
+          AND sdpr.record_id = #{recordId}
+    </select>
 </mapper>

+ 1 - 0
smsb-plus-ui/src/api/smsb/device/datasets.ts

@@ -1,6 +1,7 @@
 import request from '@/utils/request';
 import { AxiosPromise } from 'axios';
 import { DifyDatasetsVO, DifyDatasetsForm, DifyDatasetsQuery } from '@/api/smsb/device/datasets_type';
+import {DifyDatasetsProductVO} from "@/api/smsb/device/difyDatasetsProduct/types";
 
 /**
  * 查询知识库管理列表

+ 63 - 0
smsb-plus-ui/src/api/smsb/device/datasetsPushRecord/api.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { DatasetsPushRecordVO, DatasetsPushRecordForm, DatasetsPushRecordQuery } from '@/api/smsb/device/datasetsPushRecord/types';
+
+/**
+ * 查询知识库下发记录列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listDatasetsPushRecord = (query?: DatasetsPushRecordQuery): AxiosPromise<DatasetsPushRecordVO[]> => {
+  return request({
+    url: '/device/datasetsPushRecord/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询知识库下发记录详细
+ * @param id
+ */
+export const getDatasetsPushRecord = (id: string | number): AxiosPromise<DatasetsPushRecordVO> => {
+  return request({
+    url: '/device/datasetsPushRecord/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增知识库下发记录
+ * @param data
+ */
+export const addDatasetsPushRecord = (data: DatasetsPushRecordForm) => {
+  return request({
+    url: '/device/datasetsPushRecord',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改知识库下发记录
+ * @param data
+ */
+export const updateDatasetsPushRecord = (data: DatasetsPushRecordForm) => {
+  return request({
+    url: '/device/datasetsPushRecord',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除知识库下发记录
+ * @param id
+ */
+export const delDatasetsPushRecord = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/device/datasetsPushRecord/' + id,
+    method: 'delete'
+  });
+};

+ 101 - 0
smsb-plus-ui/src/api/smsb/device/datasetsPushRecord/types.ts

@@ -0,0 +1,101 @@
+export interface DatasetsPushRecordVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 知识库ID
+   */
+  datasetsId: string | number;
+
+  /**
+   * 类型 1-问答 2-产品
+   */
+  datasetsType: number;
+
+  /**
+   * 知识库名称
+   */
+  datasetsName: string;
+
+  /**
+   * 条目数量
+   */
+  entryNum: number;
+
+  /**
+   * 创建人名称
+   */
+  createUser: string;
+
+  /**
+   * 创建时间
+   */
+  createTime: string;
+
+}
+
+export interface DatasetsPushRecordForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 知识库ID
+   */
+  datasetsId?: string | number;
+
+  /**
+   * 类型 1-问答 2-产品
+   */
+  datasetsType?: number;
+
+  /**
+   * 知识库名称
+   */
+  datasetsName?: string;
+
+  /**
+   * 条目数量
+   */
+  entryNum?: number;
+
+  /**
+   * 创建人名称
+   */
+  createUser?: string;
+
+}
+
+export interface DatasetsPushRecordQuery extends PageQuery {
+
+  /**
+   * 知识库ID
+   */
+  datasetsId?: string | number;
+
+  /**
+   * 类型 1-问答 2-产品
+   */
+  datasetsType?: number;
+
+  /**
+   * 知识库名称
+   */
+  datasetsName?: string;
+
+  /**
+   * 创建人名称
+   */
+  createUser?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}
+
+
+

+ 14 - 3
smsb-plus-ui/src/api/smsb/device/difyDatasetsProduct/index.ts

@@ -1,6 +1,10 @@
 import request from '@/utils/request';
-import { AxiosPromise } from 'axios';
-import { DifyDatasetsProductVO, DifyDatasetsProductForm, DifyDatasetsProductQuery } from '@/api/smsb/device/difyDatasetsProduct/types';
+import {AxiosPromise} from 'axios';
+import {
+  DifyDatasetsProductForm,
+  DifyDatasetsProductQuery,
+  DifyDatasetsProductVO
+} from '@/api/smsb/device/difyDatasetsProduct/types';
 import {DifyDatasetsQuestionVO} from "@/api/smsb/device/difyDatasetsQuestion_types";
 
 /**
@@ -17,13 +21,20 @@ export const listDifyDatasetsProduct = (query?: DifyDatasetsProductQuery): Axios
   });
 };
 
-export const listAllProduct = (): AxiosPromise<DifyDatasetsQuestionVO[]> => {
+export const listAllProduct = (): AxiosPromise<DifyDatasetsProductVO[]> => {
   return request({
     url: '/device/difyDatasetsProduct/listAll',
     method: 'get'
   });
 };
 
+export const listProductByDatasetsId = (datasetsId: string | number): AxiosPromise<DifyDatasetsProductVO[]> => {
+  return request({
+    url: '/device/difyDatasetsProduct/listByDatasetsId/' + datasetsId,
+    method: 'get'
+  });
+};
+
 /**
  * 查询Dify产品推荐详细
  * @param id

+ 52 - 4
smsb-plus-ui/src/views/smsb/datasets/product.vue

@@ -51,16 +51,25 @@
           <el-table-column label="APP数量" align="center" prop="appCount" width="80"/>
           <el-table-column label="创建时间" align="left" prop="createTime" width="160"/>
           <el-table-column label="更新时间" align="left" prop="updateTime" width="160"/>
-          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100">
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
             <template #default="scope">
               <!--              <el-tooltip content="文件列表" placement="top">
                               <el-button link type="primary" icon="Document" @click="handleToFileList(scope.row)"
                                          v-hasPermi="['device:datasetsFile:list']"></el-button>
                             </el-tooltip>-->
               <el-tooltip content="下发" placement="top">
-                <el-button link type="primary" icon="Download" @click="handlePush(scope.row)"
+                <el-button link type="primary" icon="Position" @click="handlePush(scope.row)"
                            v-hasPermi="['device:datasets:edit']"></el-button>
               </el-tooltip>
+              <el-tooltip content="产品条目" placement="top">
+                <el-button link type="primary" icon="View" @click="handleEntryList(scope.row)"
+                           v-hasPermi="['device:datasets:query']"></el-button>
+              </el-tooltip>
+              <el-tooltip content="刷新" placement="top">
+                <el-button link type="primary" icon="Refresh" @click="handleSync()"
+                           v-hasPermi="['device:datasets:add']">
+                </el-button>
+              </el-tooltip>
               <el-tooltip content="删除" placement="top">
                 <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
                            v-hasPermi="['device:datasets:remove']"></el-button>
@@ -112,6 +121,26 @@
         </div>
       </template>
     </el-dialog>
+    <!-- 产品条目列表 -->
+    <el-dialog :title="viewDialog.title" v-model="viewDialog.visible" width="1200px" append-to-body>
+      <div class="table-content">
+        <el-table v-loading="entryLoading" :data="productList">
+          <el-table-column label="产品名称" align="left" prop="name" width="250" :show-overflow-tooltip="true"/>
+          <el-table-column label="产品简介" align="left" prop="note" :show-overflow-tooltip="true"/>
+          <el-table-column label="产品图片" align="left" width="100">
+            <template #default="scope">
+              <image-preview :src="scope.row.imgUrl" style="width: 40px; height: 40px; cursor: pointer"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="创建人" align="left" prop="createUser" width="100" :show-overflow-tooltip="true"/>
+        </el-table>
+      </div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -120,18 +149,21 @@ import {
   addDifyDatasets,
   delDifyDatasets,
   getDifyDatasets,
-  listDifyDatasets, pushProductEntry,
+  listDifyDatasets,
+  pushProductEntry,
   syncDifyDatasets,
   updateDifyDatasets
 } from '@/api/smsb/device/datasets';
 import {DifyDatasetsForm, DifyDatasetsQuery, DifyDatasetsVO} from '@/api/smsb/device/datasets_type';
-import {listAllProduct} from "@/api/smsb/device/difyDatasetsProduct";
+import {listAllProduct, listProductByDatasetsId} from "@/api/smsb/device/difyDatasetsProduct";
+import {DifyDatasetsProductVO} from "@/api/smsb/device/difyDatasetsProduct/types";
 
 const {proxy} = getCurrentInstance() as ComponentInternalInstance;
 
 const difyDatasetsList = ref<DifyDatasetsVO[]>([]);
 const buttonLoading = ref(false);
 const loading = ref(true);
+const entryLoading = ref(true);
 const showSearch = ref(true);
 const ids = ref<Array<string | number>>([]);
 const single = ref(true);
@@ -139,6 +171,7 @@ const multiple = ref(true);
 const total = ref(0);
 const selectedEntry = ref([]);
 const entryList = ref([]);
+const productList = ref<DifyDatasetsProductVO>([]);
 const queryFormRef = ref<ElFormInstance>();
 const difyDatasetsFormRef = ref<ElFormInstance>();
 const datasetsId = ref<number | string>();
@@ -153,6 +186,11 @@ const pushDialog = reactive<DialogOption>({
   title: ''
 });
 
+const viewDialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
 const initFormData: DifyDatasetsForm = {
   id: undefined,
   name: undefined,
@@ -191,12 +229,22 @@ const getList = async () => {
   total.value = res.total;
   loading.value = false;
 }
+const handleEntryList = async (row?: DifyDatasetsVO) => {
+  entryLoading.value = true;
+  viewDialog.visible = true;
+  viewDialog.title = '产品条目';
+  const datasetsId = row.id;
+  const res = await listProductByDatasetsId(datasetsId);
+  productList.value = res.data;
+  entryLoading.value = false;
+}
 
 /** 取消按钮 */
 const cancel = () => {
   reset();
   dialog.visible = false;
   pushDialog.visible = false;
+  viewDialog.visible = false;
   selectedEntry.value = [];
 }