代码提交

topo_dev
liu 9 months ago
parent 9d04f3dcad
commit d3bd3f59a2

@ -0,0 +1,75 @@
package com.supervision.chat.client;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class CustomMultipartFile implements MultipartFile {
private final String name;
private final String originalFilename;
@Nullable
private final String contentType;
private final byte[] content;
public CustomMultipartFile(String name, @Nullable byte[] content) {
this(name, name, (String)null, (byte[])content);
}
public CustomMultipartFile(String name, InputStream contentStream) throws IOException {
this(name, name, (String)null, (byte[]) FileCopyUtils.copyToByteArray(contentStream));
}
public CustomMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, @Nullable byte[] content) {
Assert.hasLength(name, "Name must not be empty");
this.name = name;
this.originalFilename = originalFilename != null ? originalFilename : "";
this.contentType = contentType;
this.content = content != null ? content : new byte[0];
}
public CustomMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream) throws IOException {
this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));
}
public String getName() {
return this.name;
}
@NonNull
public String getOriginalFilename() {
return this.originalFilename;
}
@Nullable
public String getContentType() {
return this.contentType;
}
public boolean isEmpty() {
return this.content.length == 0;
}
public long getSize() {
return (long)this.content.length;
}
public byte[] getBytes() throws IOException {
return this.content;
}
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(this.content);
}
public void transferTo(File dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(this.content, dest);
}
}

@ -1,6 +1,7 @@
package com.supervision.chat.client; package com.supervision.chat.client;
import com.supervision.chat.client.dto.CreateBaseDTO; import com.supervision.chat.client.dto.CreateBaseDTO;
import com.supervision.chat.client.dto.DeleteFileDTO;
import com.supervision.chat.client.dto.LangChainChatRes; import com.supervision.chat.client.dto.LangChainChatRes;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -14,20 +15,47 @@ import org.springframework.web.service.annotation.PostExchange;
@HttpExchange @HttpExchange
public interface LangChainChatService { public interface LangChainChatService {
/**
*
* @param createBaseDTO
* @return
*/
@PostExchange(url = "create_knowledge_base", contentType = MediaType.APPLICATION_JSON_VALUE) @PostExchange(url = "create_knowledge_base", contentType = MediaType.APPLICATION_JSON_VALUE)
LangChainChatRes chat(@RequestBody CreateBaseDTO createBaseDTO); LangChainChatRes createBase(@RequestBody CreateBaseDTO createBaseDTO);
/**
*
* @param knowledge_base_name
* @param files ,multipartFile
* @param text_splitter_type
* @param to_vector_store true
* @param override false
* @param not_refresh_vs_cache false
* @param chunk_size 250
* @param chunk_overlap 50
* @param zh_title_enhance false
* @param docs {"test.txt":[{"page_content":"custom doc","metadata":{},"type":"Document"}]}
* @return
*/
@PostExchange(url = "upload_docs", contentType = MediaType.MULTIPART_FORM_DATA_VALUE) @PostExchange(url = "upload_docs", contentType = MediaType.MULTIPART_FORM_DATA_VALUE)
void uploadFile(@RequestPart String knowledge_base_name, LangChainChatRes uploadFile(@RequestPart String knowledge_base_name,
@RequestPart Resource files, @RequestPart MultipartFile files,
@RequestPart String to_vector_store, @RequestPart String text_splitter_type,
@RequestPart String override, @RequestPart String to_vector_store,
@RequestPart String not_refresh_vs_cache, @RequestPart String override,
@RequestPart Integer chunk_size, @RequestPart String not_refresh_vs_cache,
@RequestPart Integer chunk_overlap, @RequestPart Integer chunk_size,
@RequestPart String zh_title_enhance, @RequestPart Integer chunk_overlap,
@RequestPart String text_splitter_type, @RequestPart String zh_title_enhance,
@RequestPart String docs); @RequestPart String docs);
/**
*
* @param deleteFileDTO
* @return
*/
@PostExchange(url = "delete_docs", contentType = MediaType.APPLICATION_JSON_VALUE)
LangChainChatRes deleteFile(@RequestBody DeleteFileDTO deleteFileDTO);
} }

@ -0,0 +1,29 @@
package com.supervision.chat.client.dto;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class DeleteFileDTO {
private String knowledge_base_name;
private List<String> file_names;
private Boolean delete_content = false;
private Boolean not_refresh_vs_cache = false;
public static DeleteFileDTO create(String knowledge_base_name, String file_name) {
DeleteFileDTO deleteFileDTO = new DeleteFileDTO();
deleteFileDTO.setKnowledge_base_name(knowledge_base_name);
List<String> file_names = new ArrayList<>();
file_names.add(file_name);
deleteFileDTO.setFile_names(file_names);
return deleteFileDTO;
}
}

@ -9,5 +9,5 @@ public class LangChainChatRes {
private String msg; private String msg;
private String data; private Object data;
} }

@ -1,14 +1,22 @@
package com.supervision.chat.controller; package com.supervision.chat.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.supervision.chat.client.CustomMultipartFile;
import com.supervision.chat.client.LangChainChatService; import com.supervision.chat.client.LangChainChatService;
import com.supervision.chat.client.dto.CreateBaseDTO; import com.supervision.chat.client.dto.CreateBaseDTO;
import com.supervision.chat.client.dto.DeleteFileDTO;
import com.supervision.chat.client.dto.LangChainChatRes; import com.supervision.chat.client.dto.LangChainChatRes;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.service.annotation.PostExchange; import org.springframework.web.service.annotation.PostExchange;
import java.io.IOException;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@Slf4j @Slf4j
@ -20,11 +28,33 @@ public class TestController {
private final LangChainChatService langChainChatClient; private final LangChainChatService langChainChatClient;
@GetMapping("test") @GetMapping("test")
public void test(){ public void test() {
CreateBaseDTO createBaseDTO = new CreateBaseDTO(); CreateBaseDTO createBaseDTO = new CreateBaseDTO();
createBaseDTO.setKnowledge_base_name("11111111"); createBaseDTO.setKnowledge_base_name("11111111");
LangChainChatRes chat = langChainChatClient.chat(createBaseDTO); LangChainChatRes chat = langChainChatClient.createBase(createBaseDTO);
log.info(JSONUtil.toJsonStr(chat)); log.info(JSONUtil.toJsonStr(chat));
} }
@PostMapping("uploadFile")
public void testUploadFile(@RequestPart("file") MultipartFile file) throws IOException {
CustomMultipartFile mockMultipartFile = new CustomMultipartFile(file.getOriginalFilename(), file.getInputStream());
LangChainChatRes langChainChatRes = langChainChatClient.uploadFile("11111111",
mockMultipartFile,
"问讯笔录",
"true",
"false",
"false",
250,
50,
"false",
"{\"test.txt\":[{\"page_content\":\"custom doc\",\"metadata\":{},\"type\":\"Document\"}]}");
log.info(JSONUtil.toJsonStr(langChainChatRes));
}
@GetMapping("deleteFile")
public void testDeleteFile(String knowledgeBaseName, String fileName) {
LangChainChatRes langChainChatRes = langChainChatClient.deleteFile(DeleteFileDTO.create(knowledgeBaseName, fileName));
log.info(JSONUtil.toJsonStr(langChainChatRes));
}
} }

@ -14,6 +14,7 @@ import com.supervision.utils.RecordRegexUtil;
import com.supervision.utils.WordReadUtil; import com.supervision.utils.WordReadUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.Generation; import org.springframework.ai.chat.Generation;
@ -92,7 +93,7 @@ public class ExampleChatController {
"""; """;
@GetMapping("exampleChat") @GetMapping("exampleChat")
public void exampleChat() { public void exampleChat() throws JSONException {
File file = FileUtil.file("E:\\jc\\宁夏\\Fw_裴金禄\\裴金禄第一次.docx"); File file = FileUtil.file("E:\\jc\\宁夏\\Fw_裴金禄\\裴金禄第一次.docx");
String context = WordReadUtil.readWord(file.getPath()); String context = WordReadUtil.readWord(file.getPath());
List<QARecordNodeDTO> qaList = RecordRegexUtil.recordRegex(context, "裴金禄"); List<QARecordNodeDTO> qaList = RecordRegexUtil.recordRegex(context, "裴金禄");

@ -11,6 +11,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.chat.client.LangChainChatService;
import com.supervision.chat.client.dto.CreateBaseDTO;
import com.supervision.chat.client.dto.LangChainChatRes;
import com.supervision.common.domain.R; import com.supervision.common.domain.R;
import com.supervision.common.enums.ResultStatusEnum; import com.supervision.common.enums.ResultStatusEnum;
import com.supervision.common.exception.CustomException; import com.supervision.common.exception.CustomException;
@ -57,6 +60,8 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
private final CaseStatusManageService caseStatusManageService; private final CaseStatusManageService caseStatusManageService;
private final LangChainChatService langChainChatService;
/** /**
* *
* *
@ -151,9 +156,16 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
Long num = modelCaseMapper.selectCount(null); Long num = modelCaseMapper.selectCount(null);
modelCase.setIndexNum(Integer.parseInt(num.toString()) + 1); modelCase.setIndexNum(Integer.parseInt(num.toString()) + 1);
i = modelCaseMapper.insert(modelCase); i = modelCaseMapper.insert(modelCase);
// 这里需要调用知识库的接口,去保存知识库
CreateBaseDTO createBaseDTO = new CreateBaseDTO();
createBaseDTO.setKnowledge_base_name(modelCase.getCaseNo());
LangChainChatRes chat = langChainChatService.createBase(createBaseDTO);
log.info("创建知识库:{}", chat);
if (200 != chat.getCode()) {
throw new BusinessException("保存知识库失败");
}
} }
if (i > 0) { if (i > 0) {
// TODO 这里需要调用知识库的接口,去保存知识库
return R.okMsg("保存成功"); return R.okMsg("保存成功");
} else { } else {
return R.fail("保存失败"); return R.fail("保存失败");
@ -161,7 +173,6 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
} }
@Override @Override
public R<?> del(String id) { public R<?> del(String id) {
ModelCase modelCase = modelCaseMapper.selectById(id); ModelCase modelCase = modelCaseMapper.selectById(id);

@ -6,9 +6,14 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.chat.client.CustomMultipartFile;
import com.supervision.chat.client.LangChainChatService;
import com.supervision.chat.client.dto.DeleteFileDTO;
import com.supervision.chat.client.dto.LangChainChatRes;
import com.supervision.common.utils.IPages; import com.supervision.common.utils.IPages;
import com.supervision.common.utils.ListUtils; import com.supervision.common.utils.ListUtils;
import com.supervision.common.utils.StringUtils; import com.supervision.common.utils.StringUtils;
import com.supervision.config.BusinessException;
import com.supervision.minio.domain.MinioFile; import com.supervision.minio.domain.MinioFile;
import com.supervision.minio.mapper.MinioFileMapper; import com.supervision.minio.mapper.MinioFileMapper;
import com.supervision.minio.service.MinioService; import com.supervision.minio.service.MinioService;
@ -25,6 +30,7 @@ import com.supervision.utils.WordReadUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -64,6 +70,8 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl<NoteRecordSplitMappe
private final Neo4jService neo4jService; private final Neo4jService neo4jService;
private final LangChainChatService langChainChatService;
@Override @Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class) @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
@ -108,6 +116,22 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl<NoteRecordSplitMappe
log.error("从minio中获取文件失败:{}", e.getMessage()); log.error("从minio中获取文件失败:{}", e.getMessage());
continue; continue;
} }
// 这里需要把文件传输,传输到知识库中去
CustomMultipartFile mockMultipartFile = new CustomMultipartFile(minioFile.getFilename(),inputStream);
LangChainChatRes langChainChatRes = langChainChatService.uploadFile("11111111",
mockMultipartFile,
"问讯笔录",
"true",
"false",
"false",
250,
50,
"false",
"{\"test.txt\":[{\"page_content\":\"custom doc\",\"metadata\":{},\"type\":\"Document\"}]}");
if (!langChainChatRes.getCode().equals(200)){
log.error("上传文件失败:{}", langChainChatRes.getMsg());
throw new RuntimeException("上传文件失败");
}
String context = WordReadUtil.readWord(inputStream); String context = WordReadUtil.readWord(inputStream);
List<QARecordNodeDTO> qaList = RecordRegexUtil.recordRegex(context, record.getName()); List<QARecordNodeDTO> qaList = RecordRegexUtil.recordRegex(context, record.getName());
List<NoteRecordSplit> splitList = new ArrayList<>(); List<NoteRecordSplit> splitList = new ArrayList<>();
@ -135,6 +159,8 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl<NoteRecordSplitMappe
// 对笔录进行分类,并对笔录进行提取三元组 // 对笔录进行分类,并对笔录进行提取三元组
recordSplitProcessService.process(allTypeList, splitList); recordSplitProcessService.process(allTypeList, splitList);
} }
} }
caseStatusManageService.whenUploadRecord(record.getCaseId()); caseStatusManageService.whenUploadRecord(record.getCaseId());
return "保存成功"; return "保存成功";
@ -254,6 +280,7 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl<NoteRecordSplitMappe
} }
@Override @Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class,noRollbackFor = BusinessException.class)
public void delRecords(String id) { public void delRecords(String id) {
NoteRecord noteRecord = noteRecordMapper.selectById(id); NoteRecord noteRecord = noteRecordMapper.selectById(id);
@ -262,12 +289,20 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl<NoteRecordSplitMappe
// noteRecordMapper.updateById(noteRecord); // noteRecordMapper.updateById(noteRecord);
String fileIds = noteRecord.getFileIds(); String fileIds = noteRecord.getFileIds();
if (StringUtils.isNotEmpty(fileIds)) { if (StringUtils.isNotEmpty(fileIds)) {
//删除文件 //删除文件
for (String fileId : fileIds.split(",")) { for (String fileId : fileIds.split(",")) {
MinioFile minioFile = minioFileMapper.selectById(fileId); MinioFile minioFile = minioFileMapper.selectById(fileId);
// 删除文件
LangChainChatRes langChainChatRes = langChainChatService.deleteFile(DeleteFileDTO.create(noteRecord.getCaseId(), minioFile.getFilename()));
if (!langChainChatRes.getCode().equals(200)){
throw new BusinessException("删除文件:" + minioFile.getFilename() + " 失败!");
}
minioFile.setDataStatus(StringUtils.getUUID()); minioFile.setDataStatus(StringUtils.getUUID());
minioFileMapper.updateById(minioFile); minioFileMapper.updateById(minioFile);
minioService.delFile(fileId); minioService.delFile(fileId);
} }
} }
// 去掉逻辑删除,直接删除 // 去掉逻辑删除,直接删除

Loading…
Cancel
Save