فهرست منبع

提交知识库删除功能

feng 10 ماه پیش
والد
کامیت
b3cb046240

+ 2 - 0
ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java

@@ -19,6 +19,8 @@ public interface VectorStoreService {
 
     void createSchema(String kid,String modelName);
 
+    void removeByDocId( String docId);
+
     void removeById(String id,String modelName);
 
 

+ 83 - 84
ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeAttachServiceImpl.java

@@ -32,101 +32,100 @@ import java.util.Map;
 @Service
 public class KnowledgeAttachServiceImpl implements IKnowledgeAttachService {
 
-  private final KnowledgeAttachMapper baseMapper;
-  private final KnowledgeFragmentMapper fragmentMapper;
+    private final KnowledgeAttachMapper baseMapper;
+    private final KnowledgeFragmentMapper fragmentMapper;
 
 
+    /**
+     * 查询知识库附件
+     */
+    @Override
+    public KnowledgeAttachVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
 
-  /**
-   * 查询知识库附件
-   */
-  @Override
-  public KnowledgeAttachVo queryById(Long id) {
-    return baseMapper.selectVoById(id);
-  }
-
-  /**
-   * 查询知识库附件列表
-   */
-  @Override
-  public TableDataInfo<KnowledgeAttachVo> queryPageList(KnowledgeAttachBo bo, PageQuery pageQuery) {
-    LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
-    Page<KnowledgeAttachVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-    return TableDataInfo.build(result);
-  }
+    /**
+     * 查询知识库附件列表
+     */
+    @Override
+    public TableDataInfo<KnowledgeAttachVo> queryPageList(KnowledgeAttachBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
+        Page<KnowledgeAttachVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
 
-  /**
-   * 查询知识库附件列表
-   */
-  @Override
-  public List<KnowledgeAttachVo> queryList(KnowledgeAttachBo bo) {
-    LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
-    return baseMapper.selectVoList(lqw);
-  }
+    /**
+     * 查询知识库附件列表
+     */
+    @Override
+    public List<KnowledgeAttachVo> queryList(KnowledgeAttachBo bo) {
+        LambdaQueryWrapper<KnowledgeAttach> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
 
-  private LambdaQueryWrapper<KnowledgeAttach> buildQueryWrapper(KnowledgeAttachBo bo) {
-    Map<String, Object> params = bo.getParams();
-    LambdaQueryWrapper<KnowledgeAttach> lqw = Wrappers.lambdaQuery();
-    lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeAttach::getKid, bo.getKid());
-    lqw.eq(StringUtils.isNotBlank(bo.getDocId()), KnowledgeAttach::getDocId, bo.getDocId());
-    lqw.like(StringUtils.isNotBlank(bo.getDocName()), KnowledgeAttach::getDocName, bo.getDocName());
-    lqw.eq(StringUtils.isNotBlank(bo.getDocType()), KnowledgeAttach::getDocType, bo.getDocType());
-    lqw.eq(StringUtils.isNotBlank(bo.getContent()), KnowledgeAttach::getContent, bo.getContent());
-    return lqw;
-  }
+    private LambdaQueryWrapper<KnowledgeAttach> buildQueryWrapper(KnowledgeAttachBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<KnowledgeAttach> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeAttach::getKid, bo.getKid());
+        lqw.eq(StringUtils.isNotBlank(bo.getDocId()), KnowledgeAttach::getDocId, bo.getDocId());
+        lqw.like(StringUtils.isNotBlank(bo.getDocName()), KnowledgeAttach::getDocName, bo.getDocName());
+        lqw.eq(StringUtils.isNotBlank(bo.getDocType()), KnowledgeAttach::getDocType, bo.getDocType());
+        lqw.eq(StringUtils.isNotBlank(bo.getContent()), KnowledgeAttach::getContent, bo.getContent());
+        return lqw;
+    }
 
-  /**
-   * 新增知识库附件
-   */
-  @Override
-  public Boolean insertByBo(KnowledgeAttachBo bo) {
-    KnowledgeAttach add = MapstructUtils.convert(bo, KnowledgeAttach.class);
-    validEntityBeforeSave(add);
-    boolean flag = baseMapper.insert(add) > 0;
-    if (flag) {
-      bo.setId(add.getId());
+    /**
+     * 新增知识库附件
+     */
+    @Override
+    public Boolean insertByBo(KnowledgeAttachBo bo) {
+        KnowledgeAttach add = MapstructUtils.convert(bo, KnowledgeAttach.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
     }
-    return flag;
-  }
 
-  /**
-   * 修改知识库附件
-   */
-  @Override
-  public Boolean updateByBo(KnowledgeAttachBo bo) {
-    KnowledgeAttach update = MapstructUtils.convert(bo, KnowledgeAttach.class);
-    validEntityBeforeSave(update);
-    return baseMapper.updateById(update) > 0;
-  }
+    /**
+     * 修改知识库附件
+     */
+    @Override
+    public Boolean updateByBo(KnowledgeAttachBo bo) {
+        KnowledgeAttach update = MapstructUtils.convert(bo, KnowledgeAttach.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
 
-  /**
-   * 保存前的数据校验
-   */
-  private void validEntityBeforeSave(KnowledgeAttach entity) {
-    //TODO 做一些数据校验,如唯一约束
-  }
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(KnowledgeAttach entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
 
-  /**
-   * 批量删除知识库附件
-   */
-  @Override
-  public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-    if (isValid) {
-      //TODO 做一些业务上的校验,判断是否需要校验
+    /**
+     * 批量删除知识库附件
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
     }
-    return baseMapper.deleteBatchIds(ids) > 0;
-  }
 
-  @Override
-  public void removeKnowledgeAttach(String docId) {
-    Map<String, Object> map = new HashMap<>();
-    map.put("doc_id", docId);
-    baseMapper.deleteByMap(map);
-    fragmentMapper.deleteByMap(map);
-  }
+    @Override
+    public void removeKnowledgeAttach(String docId) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("doc_id", docId);
+        baseMapper.deleteByMap(map);
+        fragmentMapper.deleteByMap(map);
+    }
 
-  @Override
-  public String translationByFile(MultipartFile file, String targetLanguage) {
-    return "接口开发中!";
-  }
+    @Override
+    public String translationByFile(MultipartFile file, String targetLanguage) {
+        return "接口开发中!";
+    }
 }

+ 181 - 18
ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java

@@ -10,19 +10,30 @@ import dev.langchain4j.store.embedding.EmbeddingMatch;
 import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
 import dev.langchain4j.store.embedding.EmbeddingStore;
 import dev.langchain4j.store.embedding.weaviate.WeaviateEmbeddingStore;
+import io.weaviate.client.Config;
+import io.weaviate.client.WeaviateClient;
+import io.weaviate.client.base.Result;
+import io.weaviate.client.v1.data.model.WeaviateObject;
+import io.weaviate.client.v1.schema.model.Property;
+import io.weaviate.client.v1.schema.model.Schema;
+import io.weaviate.client.v1.schema.model.WeaviateClass;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.ruoyi.chain.xinference.XinferenceClient;
 import org.ruoyi.common.core.service.ConfigService;
+import org.ruoyi.domain.bo.KnowledgeAttachBo;
 import org.ruoyi.domain.bo.QueryVectorBo;
 import org.ruoyi.domain.bo.StoreEmbeddingBo;
+import org.ruoyi.domain.vo.KnowledgeAttachVo;
+import org.ruoyi.service.IKnowledgeAttachService;
 import org.ruoyi.service.VectorStoreService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.lang.reflect.Field;
+import java.util.*;
 
 /**
  * 向量库管理
@@ -38,49 +49,162 @@ public class VectorStoreServiceImpl implements VectorStoreService {
 
     private EmbeddingStore<TextSegment> embeddingStore;
 
+    @Autowired
+    private IKnowledgeAttachService knowledgeAttachService;
+
+
+
 
     @Override
     public void createSchema(String kid, String modelName) {
         String protocol = configService.getConfigValue("weaviate", "protocol");
         String host = configService.getConfigValue("weaviate", "host");
         String className = configService.getConfigValue("weaviate", "classname");
+        String fullClassName = className + kid;
+
+        // Initialize Weaviate client
+        WeaviateClient client = new WeaviateClient(new Config(protocol, host));
+
+        // Check if schema exists
+        Result<Schema> existingSchema = client.schema().getter().run();
+        if (existingSchema.hasErrors()) {
+            throw new RuntimeException("Failed to get schema: " + existingSchema.getError().toString());
+        }
+
+        // Check if class exists
+        boolean classExists = existingSchema.getResult().getClasses().stream()
+                .anyMatch(c -> c.getClassName().equals(fullClassName));
+        if (!classExists) {
+            WeaviateClass weaviateClass = WeaviateClass.builder()
+                    .className(fullClassName)
+                    .properties(Arrays.asList(
+                            Property.builder().name("text").dataType(Arrays.asList("text")).build(),
+                            Property.builder().name("indexFilterable").dataType(Arrays.asList("boolean")).build(),
+                            Property.builder().name("indexSearchable").dataType(Arrays.asList("boolean")).build(),
+                            Property.builder().name("docId").dataType(Arrays.asList("string")).build()
+                    ))
+                    .vectorizer("none") // Set to "none" since vectors are provided externally
+                    .build();
+            Schema schema = Schema.builder()
+                    .classes(Collections.singletonList(weaviateClass))
+                    .build();
+            Result<Boolean> result = client.schema().classCreator().withClass(weaviateClass).run();
+        } else {
+            // Check if docId property exists
+            WeaviateClass existingClass = existingSchema.getResult().getClasses().stream()
+                    .filter(c -> c.getClassName().equals(fullClassName))
+                    .findFirst()
+                    .orElse(null);
+            boolean hasDocId = existingClass.getProperties().stream()
+                    .anyMatch(p -> p.getName().equals("docId"));
+            if (!hasDocId) {
+                // Add docId property
+                Property docIdProperty = Property.builder()
+                        .name("docId")
+                        .dataType(Arrays.asList("string"))
+                        .build();
+                Result<Boolean> updateResult = client.schema().propertyCreator()
+                        .withClassName(fullClassName)
+                        .withProperty(docIdProperty)
+                        .run();
+            }
+        }
         embeddingStore = WeaviateEmbeddingStore.builder()
                 .scheme(protocol)
                 .host(host)
-                .objectClass(className+kid)
-                .scheme(protocol)
+                .objectClass(fullClassName)
                 .avoidDups(true)
                 .consistencyLevel("ALL")
                 .build();
     }
-
     @Override
-    public void storeEmbeddings(StoreEmbeddingBo storeEmbeddingBo)  {
-        createSchema(storeEmbeddingBo.getKid(), storeEmbeddingBo.getVectorModelName());
-        EmbeddingModel embeddingModel = getEmbeddingModel(storeEmbeddingBo.getEmbeddingModelName(),
-                storeEmbeddingBo.getApiKey(), storeEmbeddingBo.getBaseUrl());
+    public void storeEmbeddings(StoreEmbeddingBo storeEmbeddingBo) {
+        String protocol = configService.getConfigValue("weaviate", "protocol");
+        String host = configService.getConfigValue("weaviate", "host");
+        String className = configService.getConfigValue("weaviate", "classname");
+        String kid = storeEmbeddingBo.getKid();
+        String fullClassName = className + kid;
+
+        // 初始化 Weaviate 客户端
+        WeaviateClient client = new WeaviateClient(new Config(protocol, host));
+        createSchema(kid, storeEmbeddingBo.getVectorModelName());
+
         List<String> chunkList = storeEmbeddingBo.getChunkList();
+        String docId = storeEmbeddingBo.getDocId();
+        if (docId == null || docId.trim().isEmpty()) {
+            throw new IllegalArgumentException("docId 不能为空");
+        }
 
         XinferenceClient xinferenceClient = new XinferenceClient(storeEmbeddingBo.getBaseUrl());
         String modelName = storeEmbeddingBo.getEmbeddingModelName();
-        if("quentinz/bge-large-zh-v1.5".contains(modelName)){
+        if ("quentinz/bge-large-zh-v1.5".contains(modelName)) {
             modelName = "bge-large-zh-v1.5";
         }
-        for (String text : chunkList) {
+
+        for (int i = 0; i < chunkList.size(); i++) {
+            String text = chunkList.get(i);
+            if (text == null || text.trim().isEmpty()) {
+                System.out.println("跳过空文本: " + i);
+                continue;
+            }
             List<Double> vector;
             try {
                 vector = xinferenceClient.getEmbedding(modelName, text);
             } catch (IOException e) {
-                throw new RuntimeException(e);
+                throw new RuntimeException("生成向量失败: " + e.getMessage(), e);
             }
-            Embedding embedding = new Embedding(toFloatArray(vector));
-            if (text != null && !text.trim().isEmpty()) {
-                TextSegment segment = TextSegment.from(text);
-                embeddingStore.add(embedding, segment);
+
+            // 创建 Weaviate 对象
+            Map<String, Object> properties = new HashMap<>();
+            properties.put("text", text);
+            properties.put("indexFilterable", true);
+            properties.put("indexSearchable", true);
+            properties.put("docId", docId); // 显式设置 docId
+
+            try {
+                Result<WeaviateObject> result = client.data().creator()
+                        .withClassName(fullClassName)
+                        .withProperties(properties)
+                        .withVector(toFloatArray(vector))
+                        .run();
+                if (result.hasErrors()) {
+                    throw new RuntimeException("存储对象失败: " + result.getError().toString());
+                }
+            } catch (Exception e) {
+                throw new RuntimeException("存储向量失败: " + e.getMessage(), e);
             }
         }
     }
 
+//    @Override
+//    public void storeEmbeddings(StoreEmbeddingBo storeEmbeddingBo) {
+//        createSchema(storeEmbeddingBo.getKid(), storeEmbeddingBo.getVectorModelName());
+//        List<String> chunkList = storeEmbeddingBo.getChunkList();
+//        String docId = storeEmbeddingBo.getDocId();
+//        XinferenceClient xinferenceClient = new XinferenceClient(storeEmbeddingBo.getBaseUrl());
+//        String modelName = storeEmbeddingBo.getEmbeddingModelName();
+//        if ("quentinz/bge-large-zh-v1.5".contains(modelName)) {
+//            modelName = "bge-large-zh-v1.5";
+//        }
+//        for (int i = 0; i < chunkList.size(); i++) {
+//            List<Double> vector;
+//            String text = chunkList.get(i);
+//            try {
+//                vector = xinferenceClient.getEmbedding(modelName, text);
+//            } catch (IOException e) {
+//                throw new RuntimeException(e);
+//            }
+//            Metadata metadata = new Metadata();
+//            metadata.put("docId", docId);
+//            Embedding embedding = new Embedding(toFloatArray(vector));
+//            if (text != null && !text.trim().isEmpty()) {
+//                TextSegment segment = TextSegment.from(text,metadata);
+//                final String add = embeddingStore.add(embedding, segment);
+//                System.out.println(add);
+//            }
+//        }
+//    }
+
     @Override
     public List<String> getQueryVector(QueryVectorBo queryVectorBo) {
         createSchema(queryVectorBo.getKid(), queryVectorBo.getVectorModelName());
@@ -132,6 +256,43 @@ public class VectorStoreServiceImpl implements VectorStoreService {
         return null;
     }
 
+    public void removeByDocId(String docId) {
+        KnowledgeAttachBo knowledgeAttachBo = new KnowledgeAttachBo();
+        knowledgeAttachBo.setDocId(docId);
+        List<KnowledgeAttachVo> knowledgeAttachVoList = knowledgeAttachService.queryList(knowledgeAttachBo);
+        String kid = knowledgeAttachVoList.get(0).getKid();
+        createSchema(kid, "");
+
+        try {
+            // 反射拿到私有字段 client
+            Field clientField = embeddingStore.getClass().getDeclaredField("client");
+            clientField.setAccessible(true);
+            Object client = clientField.get(embeddingStore);
+
+            // 反射拿到私有字段 objectClass
+            Field objectClassField = embeddingStore.getClass().getDeclaredField("objectClass");
+            objectClassField.setAccessible(true);
+            String objectClass = (String) objectClassField.get(embeddingStore);
+
+            // 下面需要强转 client 为 io.weaviate.client.WeaviateClient
+            io.weaviate.client.WeaviateClient weaviateClient = (io.weaviate.client.WeaviateClient) client;
+
+            // 构造删除请求
+            weaviateClient.batch()
+                    .objectsBatchDeleter()
+                    .withClassName(objectClass)
+                    .withWhere(io.weaviate.client.v1.filters.WhereFilter.builder()
+                            .path("docId")
+                            .operator("Equal")
+                            .valueText(docId)
+                            .build())
+                    .run();
+
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
 
     @Override
     public void removeById(String id, String modelName) {
@@ -162,6 +323,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
         }
         return embeddingModel;
     }
+
     public static List<Float> toFloatList(List<Double> doubleList) {
         List<Float> floatList = new ArrayList<>(doubleList.size());
         for (Double d : doubleList) {
@@ -169,8 +331,9 @@ public class VectorStoreServiceImpl implements VectorStoreService {
         }
         return floatList;
     }
-    public static float[] toFloatArray(List<Double> doubleList) {
-        float[] floatArray = new float[doubleList.size()];
+
+    public static Float[] toFloatArray(List<Double> doubleList) {
+        Float[] floatArray = new Float[doubleList.size()];
         for (int i = 0; i < doubleList.size(); i++) {
             floatArray[i] = doubleList.get(i).floatValue();
         }

+ 115 - 111
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java

@@ -24,6 +24,7 @@ import org.ruoyi.domain.vo.KnowledgeInfoVo;
 import org.ruoyi.service.IKnowledgeAttachService;
 import org.ruoyi.service.IKnowledgeFragmentService;
 import org.ruoyi.service.IKnowledgeInfoService;
+import org.ruoyi.service.VectorStoreService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -42,120 +43,123 @@ import java.util.List;
 @RequestMapping("/knowledge")
 public class KnowledgeController extends BaseController {
 
-  private final IKnowledgeInfoService knowledgeInfoService;
+    private final IKnowledgeInfoService knowledgeInfoService;
 
-  private final IKnowledgeAttachService attachService;
+    private final IKnowledgeAttachService attachService;
 
-  private final IKnowledgeFragmentService fragmentService;
+    private final IKnowledgeFragmentService fragmentService;
 
-  /**
-   * 根据用户信息查询本地知识库
-   */
-  @GetMapping("/list")
-  public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
-    if (!StpUtil.isLogin()) {
-      throw new SecurityException("请先去登录!");
+    private final VectorStoreService vectorStoreService;
+
+    /**
+     * 根据用户信息查询本地知识库
+     */
+    @GetMapping("/list")
+    public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
+        if (!StpUtil.isLogin()) {
+            throw new SecurityException("请先去登录!");
+        }
+        bo.setUid(LoginHelper.getUserId());
+        return knowledgeInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 新增知识库
+     */
+    @Log(title = "知识库", businessType = BusinessType.INSERT)
+    @PostMapping("/save")
+    public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
+        knowledgeInfoService.saveOne(bo);
+        return R.ok();
+    }
+
+    /**
+     * 删除知识库
+     */
+    @PostMapping("/remove/{id}")
+    public R<String> remove(@PathVariable String id) {
+        knowledgeInfoService.removeKnowledge(id);
+        return R.ok("删除知识库成功!");
+    }
+
+    /**
+     * 修改知识库
+     */
+    @Log(title = "知识库", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public R<Void> edit(@RequestBody KnowledgeInfoBo bo) {
+        return toAjax(knowledgeInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 导出知识库列表
+     */
+    @Log(title = "知识库", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
+        List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "知识库", KnowledgeInfoVo.class, response);
+    }
+
+    /**
+     * 查询知识附件信息
+     */
+    @GetMapping("/detail/{kid}")
+    public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,
+                                                   @PathVariable String kid) {
+        bo.setKid(kid);
+        return attachService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 上传知识库附件
+     */
+    @PostMapping(value = "/attach/upload")
+    public R<String> upload(KnowledgeInfoUploadBo bo) throws Exception {
+        knowledgeInfoService.upload(bo);
+        return R.ok("上传知识库附件成功!");
+    }
+
+    /**
+     * 获取知识库附件详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("attach/info/{id}")
+    public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "主键不能为空")
+                                              @PathVariable Long id) {
+        return R.ok(attachService.queryById(id));
+    }
+
+    /**
+     * 删除知识库附件
+     */
+    @PostMapping("attach/remove/{kid}")
+    public R<Void> removeAttach(@NotEmpty(message = "主键不能为空")
+                                @PathVariable String kid) {
+        vectorStoreService.removeByDocId(kid);
+        attachService.removeKnowledgeAttach(kid);
+        return R.ok();
+    }
+
+
+    /**
+     * 查询知识片段
+     */
+    @GetMapping("/fragment/list/{docId}")
+    public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo,
+                                                           PageQuery pageQuery, @PathVariable String docId) {
+        bo.setDocId(docId);
+        return fragmentService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 上传文件翻译
+     */
+    @PostMapping("/translationByFile")
+    @ResponseBody
+    public String translationByFile(@RequestParam("file") MultipartFile file, String targetLanguage) {
+        return attachService.translationByFile(file, targetLanguage);
     }
-    bo.setUid(LoginHelper.getUserId());
-    return knowledgeInfoService.queryPageList(bo, pageQuery);
-  }
-
-  /**
-   * 新增知识库
-   */
-  @Log(title = "知识库", businessType = BusinessType.INSERT)
-  @PostMapping("/save")
-  public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
-    knowledgeInfoService.saveOne(bo);
-    return R.ok();
-  }
-
-  /**
-   * 删除知识库
-   */
-  @PostMapping("/remove/{id}")
-  public R<String> remove(@PathVariable String id) {
-    knowledgeInfoService.removeKnowledge(id);
-    return R.ok("删除知识库成功!");
-  }
-
-  /**
-   * 修改知识库
-   */
-  @Log(title = "知识库", businessType = BusinessType.UPDATE)
-  @PostMapping("/edit")
-  public R<Void> edit(@RequestBody KnowledgeInfoBo bo) {
-    return toAjax(knowledgeInfoService.updateByBo(bo));
-  }
-
-  /**
-   * 导出知识库列表
-   */
-  @Log(title = "知识库", businessType = BusinessType.EXPORT)
-  @PostMapping("/export")
-  public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
-    List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
-    ExcelUtil.exportExcel(list, "知识库", KnowledgeInfoVo.class, response);
-  }
-
-  /**
-   * 查询知识附件信息
-   */
-  @GetMapping("/detail/{kid}")
-  public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,
-      @PathVariable String kid) {
-    bo.setKid(kid);
-    return attachService.queryPageList(bo, pageQuery);
-  }
-
-  /**
-   * 上传知识库附件
-   */
-  @PostMapping(value = "/attach/upload")
-  public R<String> upload(KnowledgeInfoUploadBo bo) throws Exception {
-    knowledgeInfoService.upload(bo);
-    return R.ok("上传知识库附件成功!");
-  }
-
-  /**
-   * 获取知识库附件详细信息
-   *
-   * @param id 主键
-   */
-  @GetMapping("attach/info/{id}")
-  public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "主键不能为空")
-  @PathVariable Long id) {
-    return R.ok(attachService.queryById(id));
-  }
-
-  /**
-   * 删除知识库附件
-   */
-  @PostMapping("attach/remove/{kid}")
-  public R<Void> removeAttach(@NotEmpty(message = "主键不能为空")
-  @PathVariable String kid) {
-    attachService.removeKnowledgeAttach(kid);
-    return R.ok();
-  }
-
-
-  /**
-   * 查询知识片段
-   */
-  @GetMapping("/fragment/list/{docId}")
-  public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo,
-      PageQuery pageQuery, @PathVariable String docId) {
-    bo.setDocId(docId);
-    return fragmentService.queryPageList(bo, pageQuery);
-  }
-
-  /**
-   * 上传文件翻译
-   */
-  @PostMapping("/translationByFile")
-  @ResponseBody
-  public String translationByFile(@RequestParam("file") MultipartFile file, String targetLanguage) {
-    return attachService.translationByFile(file, targetLanguage);
-  }
 
 }

+ 9 - 8
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/VitalSignsServiceImpl.java

@@ -34,13 +34,13 @@ public class VitalSignsServiceImpl implements VitalSignsService {
         Map<String, Object> queryMap = new HashMap<>();
         queryMap.put("patVisitInfoId", vitalSignsData.get("number"));
         List<Map<String, Object>> medicalRecList = medicalRecSevice.findMedicalRec(queryMap);
-        int i = thinkVitalSignsService.addVitalSigns(vitalSignsData);
-        if(i>= 0){
-            stringBuilder.append("异常体征数据存储成功-》");
-        }else {
-            stringBuilder.append("异常体征数据存储失败。");
-            return stringBuilder.toString();
-        }
+//        int i = thinkVitalSignsService.addVitalSigns(vitalSignsData);
+//        if(i>= 0){
+//            stringBuilder.append("异常体征数据存储成功-》");
+//        }else {
+//            stringBuilder.append("异常体征数据存储失败。");
+//            return stringBuilder.toString();
+//        }
 
 
         // 初始化模型输入参数
@@ -137,7 +137,8 @@ public class VitalSignsServiceImpl implements VitalSignsService {
         promptBuilder.append("二、健康指导:...");
 
         String prompt = promptBuilder.toString();
-
+        System.out.println("================================");
+        System.out.println(prompt);
         // 构造请求体
         Map<String, Object> requestBody = new HashMap<>();
         requestBody.put("model", "qwen3-32B");