diff --git a/src/main/java/com/supervision/police/mapper/ConversationMapper.java b/src/main/java/com/supervision/police/mapper/ConversationMapper.java index d5b751b..074e2d9 100644 --- a/src/main/java/com/supervision/police/mapper/ConversationMapper.java +++ b/src/main/java/com/supervision/police/mapper/ConversationMapper.java @@ -1,7 +1,10 @@ package com.supervision.police.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.supervision.police.domain.Conversation; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.supervision.police.vo.ConversationResVo; /** * @author yaxin @@ -11,6 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface ConversationMapper extends BaseMapper { + IPage queryUserConversationList(String userId, Page page); } diff --git a/src/main/java/com/supervision/police/service/ChatService.java b/src/main/java/com/supervision/police/service/ChatService.java index ef3bd1d..a596d0f 100644 --- a/src/main/java/com/supervision/police/service/ChatService.java +++ b/src/main/java/com/supervision/police/service/ChatService.java @@ -1,9 +1,17 @@ package com.supervision.police.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.supervision.police.vo.ChatReqVO; import com.supervision.police.vo.ChatResVO; +import com.supervision.police.vo.ConversationResVo; public interface ChatService { ChatResVO chat(ChatReqVO chatReqVO); ChatResVO chatNew(ChatReqVO chatReqVO); + + + IPage queryConversationInfoList(String conversationId, int page, int size); + + + IPage queryUserConversationList(String userId, int page, int size); } diff --git a/src/main/java/com/supervision/police/service/ConversationService.java b/src/main/java/com/supervision/police/service/ConversationService.java index 0227ff4..73cdade 100644 --- a/src/main/java/com/supervision/police/service/ConversationService.java +++ b/src/main/java/com/supervision/police/service/ConversationService.java @@ -1,7 +1,10 @@ package com.supervision.police.service; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.supervision.police.domain.Conversation; import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.police.vo.ConversationResVo; /** * @author yaxin @@ -10,4 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface ConversationService extends IService { + IPage queryUserConversationList(String userId, Page objectPage); + } diff --git a/src/main/java/com/supervision/police/service/ModelCaseService.java b/src/main/java/com/supervision/police/service/ModelCaseService.java index 13ff506..1109945 100644 --- a/src/main/java/com/supervision/police/service/ModelCaseService.java +++ b/src/main/java/com/supervision/police/service/ModelCaseService.java @@ -58,5 +58,8 @@ public interface ModelCaseService extends IService { */ void migrateRecordKnowledgeBase(); + + List listCaseFileIds(String caseId); + } diff --git a/src/main/java/com/supervision/police/service/NoteRecordService.java b/src/main/java/com/supervision/police/service/NoteRecordService.java index 4832899..4580e14 100644 --- a/src/main/java/com/supervision/police/service/NoteRecordService.java +++ b/src/main/java/com/supervision/police/service/NoteRecordService.java @@ -12,9 +12,5 @@ public interface NoteRecordService extends IService { void uploadFileToLangChainChat(String caseId); - - void uploadRecordFileToDifyKnowledgeBase(String caseId); - - String saveOrUpdRecord(NoteRecord noteRecord); } diff --git a/src/main/java/com/supervision/police/service/impl/ChatServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ChatServiceImpl.java index b5e32e5..1f7cde8 100644 --- a/src/main/java/com/supervision/police/service/impl/ChatServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ChatServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.supervision.chat.client.LangChainChatService; import com.supervision.chat.client.dto.chat.ChatReqDTO; import com.supervision.chat.client.dto.chat.ChatResDTO; @@ -17,6 +18,7 @@ import com.supervision.police.dto.caseScore.CaseScoreDetailDTO; import com.supervision.police.service.*; import com.supervision.police.vo.ChatReqVO; import com.supervision.police.vo.ChatResVO; +import com.supervision.police.vo.ConversationResVo; import com.supervision.police.vo.dify.DifyChatReqVO; import com.supervision.utils.DifyApiUtil; import lombok.RequiredArgsConstructor; @@ -170,6 +172,23 @@ public class ChatServiceImpl implements ChatService { return chatResVO; } + @Override + public IPage queryConversationInfoList(String conversationId, int page, int size) { + Assert.notEmpty(conversationId, "会话id不能为空"); + + IPage qaPage = conversationQaService.lambdaQuery().eq(ConversationQa::getConversationId, conversationId) + .orderBy(true, true, ConversationQa::getQuestionTime).page(Page.of(page, size)); + + return qaPage.convert(ChatResVO::new); + } + + @Override + public IPage queryUserConversationList(String userId, int page, int size) { + Assert.notEmpty(userId, "用户id不能为空"); + + return conversationService.queryUserConversationList(userId, new Page<>(page,size)); + } + /** * 处理指标结果问答 * diff --git a/src/main/java/com/supervision/police/service/impl/ConversationServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ConversationServiceImpl.java index 7378482..4e3fbdc 100644 --- a/src/main/java/com/supervision/police/service/impl/ConversationServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ConversationServiceImpl.java @@ -1,9 +1,12 @@ package com.supervision.police.service.impl; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.Conversation; import com.supervision.police.service.ConversationService; import com.supervision.police.mapper.ConversationMapper; +import com.supervision.police.vo.ConversationResVo; import org.springframework.stereotype.Service; /** @@ -15,6 +18,10 @@ import org.springframework.stereotype.Service; public class ConversationServiceImpl extends ServiceImpl implements ConversationService{ + @Override + public IPage queryUserConversationList(String userId, Page page) { + return super.getBaseMapper().queryUserConversationList(userId, page); + } } diff --git a/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java index 0c2d186..d02c92f 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java @@ -403,7 +403,7 @@ public class ModelCaseServiceImpl extends ServiceImpl>>>>迁移笔录到支持库完成,成功个数:{},失败个数:{},总耗时:{}秒...<<<<<===========",success,allModelCase.size()-success,timer.intervalSecond()); } + @Override + public List listCaseFileIds(String caseId) { + + List noteRecordList = noteRecordService.lambdaQuery().eq(NoteRecord::getCaseId, caseId).list(); + List caseEvidenceDetailDTOS = caseEvidenceService.queryEvidenceList(caseId); + + + List recordFileIds = noteRecordList.stream().map(NoteRecord::getFileIds) + .filter(StrUtil::isNotEmpty).flatMap(fileId -> StrUtil.split(fileId, ",").stream()).collect(Collectors.toList()); + List evidenceFileIds = caseEvidenceDetailDTOS.stream().map(CaseEvidenceDetailDTO::getFileList) + .filter(list -> !CollUtil.isEmpty(list)).flatMap(Collection::stream).map(EvidenceFileDTO::getFileId).toList(); + + recordFileIds.addAll(evidenceFileIds); + return recordFileIds.stream().distinct().toList(); + } + /** * 添加 指标结果附属内容 diff --git a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java index 07e987c..b25ed30 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java @@ -27,7 +27,7 @@ import com.supervision.police.mapper.*; import com.supervision.police.mybatis.RowSqlMapper; import com.supervision.police.service.*; import com.supervision.utils.CalculationUtil; -import com.supervision.utils.IndexRuleUtil; +import com.supervision.utils.DifyApiUtil; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -96,6 +96,11 @@ public class ModelServiceImpl implements ModelService { private final CaseEvidencePropertyService caseEvidencePropertyService; + private final DifyApiUtil difyApiUtil; + + @Autowired + private ModelCaseService modelCaseService; + @Override @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class) public R analyseCase(AnalyseCaseDTO analyseCaseDTO) { @@ -171,7 +176,7 @@ public class ModelServiceImpl implements ModelService { calculateFinalScore(analyseCaseDTO, modelCase, atomicResultMap); caseStatusManageService.whenAnalyseCaseSuccess(analyseCaseDTO.getCaseId(), modelCase.getTotalScore()); // 计算完成之后,把所有的笔录上传到模型 - noteRecordService.uploadRecordFileToDifyKnowledgeBase(analyseCaseDTO.getCaseId()); + difyApiUtil.uploadCaseFileToDifyKnowledgeBase(modelCase, modelCaseService.listCaseFileIds(analyseCaseDTO.getCaseId())); return R.ok(); } @@ -323,7 +328,7 @@ public class ModelServiceImpl implements ModelService { modelCase.setTotalScore(max); log.info("更新案件得分情况。最终得分:{}分(共性+入罪/共性+出罪 取最大值)。入罪:{}分。出罪:{}分。共性:{}分。", max, rz, cz, gx); caseStatusManageService.whenAnalyseCaseSuccess(analyseCaseDTO.getCaseId(), modelCase.getTotalScore()); - noteRecordService.uploadRecordFileToDifyKnowledgeBase(analyseCaseDTO.getCaseId()); + difyApiUtil.uploadCaseFileToDifyKnowledgeBase(modelCase, modelCaseService.listCaseFileIds(caseId)); return R.ok(); } diff --git a/src/main/java/com/supervision/police/service/impl/NoteRecordServiceImpl.java b/src/main/java/com/supervision/police/service/impl/NoteRecordServiceImpl.java index 40cd137..7e8f610 100644 --- a/src/main/java/com/supervision/police/service/impl/NoteRecordServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/NoteRecordServiceImpl.java @@ -106,64 +106,6 @@ public class NoteRecordServiceImpl extends ServiceImpl documents = difyApiUtil.queryDocuments(modelCase.getKnowledgeBaseId()); - Set documentFileIds = documents.stream().map(Document::getFileId).collect(Collectors.toSet()); - - List recordList = this.lambdaQuery().eq(NoteRecord::getCaseId, caseId).list(); - - // 只上传 doc docx、txt、md、pdf 文件,且文件大小不能超过15mb - List allFileIds = recordList.stream().map(NoteRecord::getFileIds).filter(StrUtil::isNotEmpty) - .flatMap(s -> StrUtil.split(s, ",").stream()).collect(Collectors.toList()); - - List minioFiles = minioService.listMinioFile(allFileIds); - List recordFileIds = minioFiles.stream().filter(minioFile -> { - boolean currentFileSize = minioFile.getSize() < 15 * 1024 * 1024; - if (!currentFileSize) { - log.warn("文件大小超过15mb,不进行知识库维护:{}", minioFile.getFilename()); - return false; - } - boolean currentFileType = StrUtil.equalsAny(minioFile.getFileType(), "doc", "docx", "txt", "md", "pdf"); - if (!currentFileType) { - log.warn("文件:{}类型非doc、docx、txt、md、pdf,不进行知识库维护...", minioFile.getFilename()); - return false; - } - return true; - }).map(MinioFile::getId).toList(); - - Map fileMap = minioFiles.stream().collect(Collectors.toMap(MinioFile::getId, target -> target)); - - log.info("案件:{},共有:{}个笔录文件,符合上传要求的文件有:{}",modelCase.getCaseName(), allFileIds.size(), recordFileIds.size()); - for (String recordId : recordFileIds) { - // 把新增的笔录数据添加到到知识库 - if (!documentFileIds.contains(recordId)){ - log.info("案件:{},笔录文件:{},添加到知识库...",modelCase.getCaseName(), fileMap.get(recordId).getFilename()); - difyApiUtil.createDocumentByFile(modelCase.getKnowledgeBaseId(),recordId); - } - } - - - if (CollUtil.isNotEmpty(recordFileIds)){ - for (Document document : documents) { - String fileId = document.getFileId(); - if (StrUtil.isNotEmpty(fileId) && !recordFileIds.contains(fileId)){ - // 删除不在笔录文件列表中的知识库 - log.info("案件:{},笔录文件:{},从知识库中删除...",modelCase.getCaseName(), document.getName()); - difyApiUtil.deleteDocument(modelCase.getKnowledgeBaseId(),document.getId()); - } - } - } - log.info("案件:{}上传笔录文件到知识库完成!",modelCase.getCaseName()); - } - @Override public String saveOrUpdRecord(NoteRecord noteRecord) { diff --git a/src/main/java/com/supervision/police/vo/ChatResVO.java b/src/main/java/com/supervision/police/vo/ChatResVO.java index 607a467..ac50f59 100644 --- a/src/main/java/com/supervision/police/vo/ChatResVO.java +++ b/src/main/java/com/supervision/police/vo/ChatResVO.java @@ -1,8 +1,10 @@ package com.supervision.police.vo; import com.supervision.chat.client.dto.chat.ChatResDTO; +import com.supervision.police.domain.ConversationQa; import lombok.Data; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @@ -10,6 +12,18 @@ import java.util.Objects; @Data public class ChatResVO { + /** + * 问答id + */ + private String id; + + /** + * 问题 + */ + private String question; + + private Date questionTime; + private String answer; private Map answwerMap; private String type; @@ -26,4 +40,16 @@ public class ChatResVO { this.answer = chatResDTO.getAnswer(); this.docs = chatResDTO.getDocs(); } + + public ChatResVO(ConversationQa conversationQa) { + if (null == conversationQa){ + return; + } + this.setId(conversationQa.getId()); + this.setQuestion(conversationQa.getQuestion()); + this.setAnswer(conversationQa.getAnswer()); + this.setType(conversationQa.getType()); + this.setQuestionTime(conversationQa.getQuestionTime()); + this.setIntentType(conversationQa.getIntentType()); + } } diff --git a/src/main/java/com/supervision/police/vo/ConversationResVo.java b/src/main/java/com/supervision/police/vo/ConversationResVo.java new file mode 100644 index 0000000..3fabd31 --- /dev/null +++ b/src/main/java/com/supervision/police/vo/ConversationResVo.java @@ -0,0 +1,33 @@ +package com.supervision.police.vo; + +import lombok.Data; + +@Data +public class ConversationResVo { + + /** + * 会话id + */ + private String conversationId; + + /** + * 案件id + */ + private String caseId; + + /** + * 案件名称 + */ + private String caseName; + + /** + * 案件行为人 + */ + private String caseActor; + + /** + * 案件行为人id + */ + private String caseActorId; + +} diff --git a/src/main/java/com/supervision/utils/DifyApiUtil.java b/src/main/java/com/supervision/utils/DifyApiUtil.java index e6d8640..7fa58e5 100644 --- a/src/main/java/com/supervision/utils/DifyApiUtil.java +++ b/src/main/java/com/supervision/utils/DifyApiUtil.java @@ -10,6 +10,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.supervision.minio.domain.MinioFile; import com.supervision.minio.service.MinioService; +import com.supervision.police.domain.ModelCase; import com.supervision.police.vo.dify.DatasetReqVO; import com.supervision.police.vo.dify.DatasetResVO; import com.supervision.police.vo.dify.DifyChatReqVO; @@ -30,9 +31,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; import static com.supervision.common.constant.DifyConstants.*; @@ -257,6 +257,58 @@ public class DifyApiUtil { return documents; } + public void uploadCaseFileToDifyKnowledgeBase(ModelCase modelCase,List allFileIds) { + + if (StrUtil.isEmpty(modelCase.getKnowledgeBaseId())){ + log.warn("uploadRecordFileToKnowledgeBase:案件:{}案件或者知识库为空,不进行知识库维护!", modelCase.getCaseName()); + return; + } + + List documents = this.queryDocuments(modelCase.getKnowledgeBaseId()); + Set documentFileIds = documents.stream().map(Document::getFileId).collect(Collectors.toSet()); + + + // 只上传 doc docx、txt、md、pdf 文件,且文件大小不能超过15mb + List minioFiles = minioService.listMinioFile(allFileIds); + List recordFileIds = minioFiles.stream().filter(minioFile -> { + boolean currentFileSize = minioFile.getSize() < 15 * 1024 * 1024; + if (!currentFileSize) { + log.warn("文件大小超过15mb,不进行知识库维护:{}", minioFile.getFilename()); + return false; + } + boolean currentFileType = StrUtil.equalsAny(minioFile.getFileType(), "doc", "docx", "txt", "md", "pdf"); + if (!currentFileType) { + log.warn("文件:{}类型非doc、docx、txt、md、pdf,不进行知识库维护...", minioFile.getFilename()); + return false; + } + return true; + }).map(MinioFile::getId).toList(); + + Map fileMap = minioFiles.stream().collect(Collectors.toMap(MinioFile::getId, target -> target)); + + log.info("案件:{},共有:{}个笔录文件,符合上传要求的文件有:{}",modelCase.getCaseName(), allFileIds.size(), recordFileIds.size()); + for (String recordId : recordFileIds) { + // 把新增的笔录数据添加到到知识库 + if (!documentFileIds.contains(recordId)){ + log.info("案件:{},笔录文件:{},添加到知识库...",modelCase.getCaseName(), fileMap.get(recordId).getFilename()); + this.createDocumentByFile(modelCase.getKnowledgeBaseId(),recordId); + } + } + + + if (CollUtil.isNotEmpty(recordFileIds)){ + for (Document document : documents) { + String fileId = document.getFileId(); + if (StrUtil.isNotEmpty(fileId) && !recordFileIds.contains(fileId)){ + // 删除不在笔录文件列表中的知识库 + log.info("案件:{},笔录文件:{},从知识库中删除...",modelCase.getCaseName(), document.getName()); + this.deleteDocument(modelCase.getKnowledgeBaseId(),document.getId()); + } + } + } + log.info("案件:{}上传笔录文件到知识库完成!",modelCase.getCaseName()); + } + /** * 生成文档名称 @@ -265,7 +317,7 @@ public class DifyApiUtil { * @param fileId 文件id * @return 一个完整的文档名: 文件名 + "_" + 文件ID +"." + 后缀 */ - public String generateDocumentName(String fileName, String fileId) { + private String generateDocumentName(String fileName, String fileId) { String[] split = fileName.split("\\."); List nameTrunk = new ArrayList<>(Arrays.asList(split).subList(0, split.length - 1)); @@ -283,7 +335,7 @@ public class DifyApiUtil { * @param documentName 文档名 * @return key:文件名,value:文件id */ - public Pair decodeDocumentName(String documentName) { + private Pair decodeDocumentName(String documentName) { if (StrUtil.isEmpty(documentName)) { return Pair.of(null, null); diff --git a/src/main/resources/mapper/ConversationMapper.xml b/src/main/resources/mapper/ConversationMapper.xml index 0a1fc4d..75d53ec 100644 --- a/src/main/resources/mapper/ConversationMapper.xml +++ b/src/main/resources/mapper/ConversationMapper.xml @@ -19,4 +19,15 @@ case_id,user_id,create_time, update_time +