ruoyi-admin/src/main/resources/mcp-server.json
@@ -5,7 +5,7 @@ "args": [ "-y", "@modelcontextprotocol/server-filesystem", "D:\\software" "D:\\test" ] }, "search1api": { ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeFragment.java
@@ -45,7 +45,7 @@ /** * çæ®µç´¢å¼ä¸æ */ private Long idx; private Integer idx; /** * ææ¡£å 容 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeInfoUploadBo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package org.ruoyi.domain.bo; import lombok.Data; import org.springframework.web.multipart.MultipartFile; /** * @author ageer */ @Data public class KnowledgeInfoUploadBo { private String kid; private MultipartFile file; } ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeAttachService.java
@@ -5,6 +5,7 @@ import org.ruoyi.domain.vo.KnowledgeAttachVo; import org.ruoyi.core.page.TableDataInfo; import org.ruoyi.core.page.PageQuery; import org.springframework.web.multipart.MultipartFile; import java.util.Collection; import java.util.List; @@ -46,4 +47,17 @@ * æ ¡éªå¹¶æ¹éå é¤ç¥è¯åºéä»¶ä¿¡æ¯ */ Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); /** * å é¤ç¥è¯éä»¶ */ void removeKnowledgeAttach(String docId); /** * ç¿»è¯æä»¶ * * @param file æä»¶ * @param targetLanguage ç®æ è¯é³ */ String translationByFile(MultipartFile file, String targetLanguage); } ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java
@@ -2,6 +2,7 @@ import org.ruoyi.domain.bo.KnowledgeInfoBo; import org.ruoyi.domain.bo.KnowledgeInfoUploadBo; import org.ruoyi.domain.vo.KnowledgeInfoVo; import org.ruoyi.core.page.TableDataInfo; import org.ruoyi.core.page.PageQuery; @@ -46,4 +47,19 @@ * æ ¡éªå¹¶æ¹éå é¤ç¥è¯åºä¿¡æ¯ */ Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); /** * æ°å¢ç¥è¯åº */ void saveOne(KnowledgeInfoBo bo); /** * å é¤ç¥è¯åº */ void removeKnowledge(String id); /** * ä¸ä¼ éä»¶ */ void upload(KnowledgeInfoUploadBo bo); } ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeAttachServiceImpl.java
@@ -9,13 +9,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.ruoyi.domain.vo.KnowledgeAttachVo; import org.ruoyi.mapper.KnowledgeFragmentMapper; import org.springframework.stereotype.Service; import org.ruoyi.domain.bo.KnowledgeAttachBo; import org.ruoyi.domain.KnowledgeAttach; import org.ruoyi.mapper.KnowledgeAttachMapper; import org.ruoyi.service.IKnowledgeAttachService; import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Collection; @@ -31,6 +34,7 @@ public class KnowledgeAttachServiceImpl implements IKnowledgeAttachService { private final KnowledgeAttachMapper baseMapper; private final KnowledgeFragmentMapper fragmentMapper; /** * æ¥è¯¢ç¥è¯åºéä»¶ @@ -111,4 +115,64 @@ } 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 String translationByFile(MultipartFile file, String targetLanguage) { /*String fileName = file.getOriginalFilename(); String docType = fileName.substring(fileName.lastIndexOf(".")+1); String content = ""; ResourceLoader resourceLoader = resourceLoaderFactory.getLoaderByFileType(docType); try { content = resourceLoader.getContent(file.getInputStream()); } catch (IOException e) { throw new BaseException("该æä»¶ç±»åæä¸æ¯æï¼"); } // ç¿»è¯æ¨¡ååºå®ä¸ºgpt-4o-mini String model = "gpt-4o-mini"; ChatMessageBo chatMessageBo = new ChatMessageBo(); chatMessageBo.setUserId(getUserId()); chatMessageBo.setModelName(model); chatMessageBo.setContent(content); chatMessageBo.setDeductCost(0.01); chatMessageBo.setTotalTokens(0); OpenAiStreamClient openAiStreamClient = chatConfig.getOpenAiStreamClient(); List<Message> messageList = new ArrayList<>(); Message sysMessage = Message.builder().role(Message.Role.SYSTEM).content("ä½ æ¯ä¸ä½ç²¾éåå½è¯è¨çç¿»è¯å¤§å¸\n" + "\n" + "请å°ç¨æ·è¾å ¥è¯è¯ç¿»è¯æ{" + targetLanguage + "}\n" + "\n" + "==示ä¾è¾åº==\n" + "**åæ** : <è¿éæ¾ç¤ºè¦ç¿»è¯çåæä¿¡æ¯>\n" + "**ç¿»è¯** : <è¿éæ¾ç¤ºç¿»è¯ä¹åçç»æ>\n" + "**æ»ç»** : <è¿éæ¯å¯¹å ³é®ä¿¡æ¯ä¸ä¸ªæ»ç»>\n" + "**æåçå ³é®ä¿¡æ¯** : <è¿éè¿åå ³é®ä¿¡æ¯>\n" + "==示ä¾ç»æ==\n" + "\n" + "注æï¼è¯·ä¸¥æ ¼æç¤ºä¾è¿è¡è¾åºï¼è¿åmarkdownæ ¼å¼").build(); messageList.add(sysMessage); Message message = Message.builder().role(Message.Role.USER).content(content).build(); messageList.add(message); ChatCompletionResponse chatCompletionResponse = null; try { ChatCompletion chatCompletion = ChatCompletion .builder() .messages(messageList) .model(model) .stream(false) .build(); chatCompletionResponse = openAiStreamClient.chatCompletion(chatCompletion); }catch (Exception e) { throw new BaseException("è°ç¨å¤§æ¨¡å失败ï¼è¯·æ£æ¥å¯é¥æ¯å¦æ£ç¡®ï¼"); } return chatCompletionResponse.getChoices().get(0).getMessage().getContent().toString();*/ return "æ¥å£å¼åä¸!"; } } ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/KnowledgeInfoServiceImpl.java
ÎļþÒÑɾ³ý ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/IChatConfigService.java
@@ -46,4 +46,10 @@ * æ ¡éªå¹¶æ¹éå é¤é 置信æ¯ä¿¡æ¯ */ Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); /** * æ¥è¯¢ç³»ç»åæ° */ List<ChatConfigVo> getSysConfigValue(String category); } ruoyi-modules-api/ruoyi-system-api/src/main/java/org/ruoyi/system/service/impl/ChatConfigServiceImpl.java
@@ -129,4 +129,18 @@ return baseMapper.deleteBatchIds(ids) > 0; } /** * æ ¹æ®é 置类ååé ç½®keyè·åå¼ * * @param category * @return */ @Override public List<ChatConfigVo> getSysConfigValue(String category) { ChatConfigBo bo = new ChatConfigBo(); bo.setCategory(category); LambdaQueryWrapper<ChatConfig> lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/chat/ChatConfigController.java
@@ -6,6 +6,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; import org.ruoyi.common.core.service.ConfigService; import org.ruoyi.common.excel.utils.ExcelUtil; import org.ruoyi.common.idempotent.annotation.RepeatSubmit; import org.ruoyi.core.page.TableDataInfo; @@ -31,10 +32,13 @@ @Validated @RequiredArgsConstructor @RestController @RequestMapping("/system/chatConfig") @RequestMapping("/chat/config") public class ChatConfigController extends BaseController { private final IChatConfigService chatConfigService; private final ConfigService configService; /** * æ¥è¯¢é 置信æ¯å表 @@ -102,4 +106,24 @@ @PathVariable Long[] ids) { return toAjax(chatConfigService.deleteWithValidByIds(List.of(ids), true)); } /** * æ ¹æ®åæ°é®åæ¥è¯¢ç³»ç»åæ°å¼ * * @param configKey åæ°Key */ @GetMapping(value = "/configKey/{configKey}") public R<String> getConfigKey(@PathVariable String configKey) { return R.ok(configService.getConfigValue("sys",configKey)); } /** * æ¥è¯¢ç³»ç»åæ° * */ @GetMapping(value = "/sysConfigKey") public R<List<ChatConfigVo>> getSysConfigKey() { return R.ok(chatConfigService.getSysConfigValue("sys")); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/chat/ChatStoreController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package org.ruoyi.chat.controller.chat; import lombok.RequiredArgsConstructor; import org.ruoyi.common.core.domain.R; import org.ruoyi.common.web.core.BaseController; import org.ruoyi.domain.bo.ChatAppStoreBo; import org.ruoyi.domain.vo.ChatAppStoreVo; import org.ruoyi.service.IChatAppStoreService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * åºç¨ååº * * @author Lion Li * @date 2024-03-19 */ @RequiredArgsConstructor @RestController @RequestMapping("/system/store") public class ChatStoreController extends BaseController { private final IChatAppStoreService appStoreService; /** * åºç¨ååº */ @GetMapping("/appList") public R<List<ChatAppStoreVo>> appList(ChatAppStoreBo bo) { return R.ok(appStoreService.queryList(bo)); } /** * æ¶èåºç¨ */ @PostMapping("/copyApp") public R<String> copyApp() { return R.ok(); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,154 @@ package org.ruoyi.chat.controller.knowledge; import cn.dev33.satoken.stp.StpUtil; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.ruoyi.common.core.domain.R; import org.ruoyi.common.core.validate.AddGroup; import org.ruoyi.common.excel.utils.ExcelUtil; import org.ruoyi.common.log.annotation.Log; import org.ruoyi.common.log.enums.BusinessType; import org.ruoyi.common.satoken.utils.LoginHelper; import org.ruoyi.common.web.core.BaseController; import org.ruoyi.core.page.PageQuery; import org.ruoyi.core.page.TableDataInfo; import org.ruoyi.domain.bo.KnowledgeAttachBo; import org.ruoyi.domain.bo.KnowledgeFragmentBo; import org.ruoyi.domain.bo.KnowledgeInfoBo; import org.ruoyi.domain.bo.KnowledgeInfoUploadBo; import org.ruoyi.domain.vo.KnowledgeAttachVo; import org.ruoyi.domain.vo.KnowledgeFragmentVo; import org.ruoyi.domain.vo.KnowledgeInfoVo; import org.ruoyi.service.IKnowledgeAttachService; import org.ruoyi.service.IKnowledgeFragmentService; import org.ruoyi.service.IKnowledgeInfoService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; /** * @author ageer */ @Validated @RequiredArgsConstructor @RestController @RequestMapping("/knowledge") public class KnowledgeController extends BaseController { private final IKnowledgeInfoService knowledgeInfoService; private final IKnowledgeAttachService attachService; private final IKnowledgeFragmentService fragmentService; /** * æ ¹æ®ç¨æ·ä¿¡æ¯æ¥è¯¢æ¬å°ç¥è¯åº */ @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) { 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); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
@@ -20,6 +20,7 @@ @Service @Slf4j public class OpenAIServiceImpl implements IChatService { @Autowired private OpenAiStreamClient openAiStreamClient; ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,232 @@ package org.ruoyi.chat.service.knowledge; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.ruoyi.chain.loader.ResourceLoader; import org.ruoyi.chain.loader.ResourceLoaderFactory; import org.ruoyi.common.core.domain.model.LoginUser; import org.ruoyi.common.core.utils.MapstructUtils; import org.ruoyi.common.core.utils.StringUtils; import org.ruoyi.common.satoken.utils.LoginHelper; import org.ruoyi.core.page.PageQuery; import org.ruoyi.core.page.TableDataInfo; import org.ruoyi.domain.KnowledgeAttach; import org.ruoyi.domain.KnowledgeFragment; import org.ruoyi.domain.KnowledgeInfo; import org.ruoyi.domain.bo.KnowledgeInfoBo; import org.ruoyi.domain.bo.KnowledgeInfoUploadBo; import org.ruoyi.domain.vo.KnowledgeInfoVo; import org.ruoyi.mapper.KnowledgeAttachMapper; import org.ruoyi.mapper.KnowledgeFragmentMapper; import org.ruoyi.mapper.KnowledgeInfoMapper; import org.ruoyi.service.EmbeddingService; import org.ruoyi.service.IKnowledgeInfoService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.*; /** * ç¥è¯åºServiceä¸å¡å±å¤ç * * @author ageerle * @date 2025-04-08 */ @RequiredArgsConstructor @Service public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService { private final KnowledgeInfoMapper baseMapper; private final EmbeddingService embeddingService; private final ResourceLoaderFactory resourceLoaderFactory; private final KnowledgeFragmentMapper fragmentMapper; private final KnowledgeAttachMapper attachMapper; /** * æ¥è¯¢ç¥è¯åº */ @Override public KnowledgeInfoVo queryById(Long id){ return baseMapper.selectVoById(id); } /** * æ¥è¯¢ç¥è¯åºå表 */ @Override public TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery) { LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo); Page<KnowledgeInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } /** * æ¥è¯¢ç¥è¯åºå表 */ @Override public List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo) { LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } private LambdaQueryWrapper<KnowledgeInfo> buildQueryWrapper(KnowledgeInfoBo bo) { Map<String, Object> params = bo.getParams(); LambdaQueryWrapper<KnowledgeInfo> lqw = Wrappers.lambdaQuery(); lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeInfo::getKid, bo.getKid()); lqw.eq(bo.getUid() != null, KnowledgeInfo::getUid, bo.getUid()); lqw.like(StringUtils.isNotBlank(bo.getKname()), KnowledgeInfo::getKname, bo.getKname()); lqw.eq(bo.getShare() != null, KnowledgeInfo::getShare, bo.getShare()); lqw.eq(StringUtils.isNotBlank(bo.getDescription()), KnowledgeInfo::getDescription, bo.getDescription()); lqw.eq(StringUtils.isNotBlank(bo.getKnowledgeSeparator()), KnowledgeInfo::getKnowledgeSeparator, bo.getKnowledgeSeparator()); lqw.eq(StringUtils.isNotBlank(bo.getQuestionSeparator()), KnowledgeInfo::getQuestionSeparator, bo.getQuestionSeparator()); lqw.eq(bo.getOverlapChar() != null, KnowledgeInfo::getOverlapChar, bo.getOverlapChar()); lqw.eq(bo.getRetrieveLimit() != null, KnowledgeInfo::getRetrieveLimit, bo.getRetrieveLimit()); lqw.eq(bo.getTextBlockSize() != null, KnowledgeInfo::getTextBlockSize, bo.getTextBlockSize()); lqw.eq(StringUtils.isNotBlank(bo.getVector()), KnowledgeInfo::getVector, bo.getVector()); lqw.eq(StringUtils.isNotBlank(bo.getVectorModel()), KnowledgeInfo::getVectorModel, bo.getVectorModel()); return lqw; } /** * æ°å¢ç¥è¯åº */ @Override public Boolean insertByBo(KnowledgeInfoBo bo) { KnowledgeInfo add = MapstructUtils.convert(bo, KnowledgeInfo.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); } return flag; } /** * ä¿®æ¹ç¥è¯åº */ @Override public Boolean updateByBo(KnowledgeInfoBo bo) { KnowledgeInfo update = MapstructUtils.convert(bo, KnowledgeInfo.class); validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; } /** * ä¿ååçæ°æ®æ ¡éª */ private void validEntityBeforeSave(KnowledgeInfo entity){ //TODO åä¸äºæ°æ®æ ¡éª,å¦å¯ä¸çº¦æ } /** * æ¹éå é¤ç¥è¯åº */ @Override public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { if(isValid){ //TODO åä¸äºä¸å¡ä¸çæ ¡éª,夿æ¯å¦éè¦æ ¡éª } return baseMapper.deleteBatchIds(ids) > 0; } @Override @Transactional(rollbackFor = Exception.class) public void saveOne(KnowledgeInfoBo bo) { KnowledgeInfo knowledgeInfo = MapstructUtils.convert(bo, KnowledgeInfo.class); if (StringUtils.isBlank(bo.getKid())){ String kid = RandomUtil.randomString(10); if (knowledgeInfo != null) { knowledgeInfo.setKid(kid); knowledgeInfo.setUid(LoginHelper.getLoginUser().getUserId()); } baseMapper.insert(knowledgeInfo); embeddingService.createSchema(String.valueOf(knowledgeInfo.getId())); }else { baseMapper.updateById(knowledgeInfo); } } @Override @Transactional(rollbackFor = Exception.class) public void removeKnowledge(String id) { Map<String,Object> map = new HashMap<>(); map.put("kid",id); List<KnowledgeInfoVo> knowledgeInfoList = baseMapper.selectVoByMap(map); check(knowledgeInfoList); // å é¤åéåºä¿¡æ¯ knowledgeInfoList.forEach(knowledgeInfoVo -> { embeddingService.removeByKid(String.valueOf(knowledgeInfoVo.getId())); }); // å é¤éä»¶åç¥è¯ç段 fragmentMapper.deleteByMap(map); attachMapper.deleteByMap(map); // å é¤ç¥è¯åº baseMapper.deleteByMap(map); } @Override public void upload(KnowledgeInfoUploadBo bo) { storeContent(bo.getFile(), bo.getKid()); } public void storeContent(MultipartFile file, String kid) { String fileName = file.getOriginalFilename(); List<String> chunkList = new ArrayList<>(); KnowledgeAttach knowledgeAttach = new KnowledgeAttach(); knowledgeAttach.setKid(kid); String docId = RandomUtil.randomString(10); knowledgeAttach.setDocId(docId); knowledgeAttach.setDocName(fileName); knowledgeAttach.setDocType(fileName.substring(fileName.lastIndexOf(".")+1)); String content = ""; ResourceLoader resourceLoader = resourceLoaderFactory.getLoaderByFileType(knowledgeAttach.getDocType()); List<String> fids = new ArrayList<>(); try { content = resourceLoader.getContent(file.getInputStream()); chunkList = resourceLoader.getChunkList(content, kid); List<KnowledgeFragment> knowledgeFragmentList = new ArrayList<>(); if (CollUtil.isNotEmpty(chunkList)) { for (int i = 0; i < chunkList.size(); i++) { String fid = RandomUtil.randomString(16); fids.add(fid); KnowledgeFragment knowledgeFragment = new KnowledgeFragment(); knowledgeFragment.setKid(kid); knowledgeFragment.setDocId(docId); knowledgeFragment.setFid(fid); knowledgeFragment.setIdx(i); knowledgeFragment.setContent(chunkList.get(i)); knowledgeFragment.setCreateTime(new Date()); knowledgeFragmentList.add(knowledgeFragment); } } fragmentMapper.insertBatch(knowledgeFragmentList); } catch (IOException e) { e.printStackTrace(); } knowledgeAttach.setContent(content); knowledgeAttach.setCreateTime(new Date()); attachMapper.insert(knowledgeAttach); embeddingService.storeEmbeddings(chunkList,kid,docId,fids); } public void check(List<KnowledgeInfoVo> knowledgeInfoList){ LoginUser loginUser = LoginHelper.getLoginUser(); for (KnowledgeInfoVo knowledgeInfoVo : knowledgeInfoList) { if(!knowledgeInfoVo.getUid().equals(loginUser.getUserId())){ throw new SecurityException("æéä¸è¶³"); } } } }