From 3ec4963db1ddf8c0212752e8c2d25597b28f394b Mon Sep 17 00:00:00 2001
From: xueqingkun <xueqingkun@126.com>
Date: Wed, 27 Nov 2024 14:39:30 +0800
Subject: [PATCH 1/3] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E6=A1=88=E4=BB=B6?=
 =?UTF-8?q?=E8=AF=81=E6=8D=AE=E6=96=87=E4=BB=B6=E5=88=B0=E7=9F=A5=E8=AF=86?=
 =?UTF-8?q?=E5=BA=93=E6=96=87=E5=BA=93=202.=20=E6=B7=BB=E5=8A=A0=E5=AF=B9?=
 =?UTF-8?q?=E8=AF=9D=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../police/mapper/ConversationMapper.java     |  4 ++
 .../police/service/ChatService.java           |  8 +++
 .../police/service/ConversationService.java   |  5 ++
 .../police/service/ModelCaseService.java      |  3 +
 .../police/service/NoteRecordService.java     |  4 --
 .../police/service/impl/ChatServiceImpl.java  | 19 ++++++
 .../service/impl/ConversationServiceImpl.java |  7 +++
 .../service/impl/ModelCaseServiceImpl.java    | 18 +++++-
 .../police/service/impl/ModelServiceImpl.java | 11 +++-
 .../service/impl/NoteRecordServiceImpl.java   | 58 -----------------
 .../com/supervision/police/vo/ChatResVO.java  | 26 ++++++++
 .../police/vo/ConversationResVo.java          | 33 ++++++++++
 .../com/supervision/utils/DifyApiUtil.java    | 62 +++++++++++++++++--
 .../resources/mapper/ConversationMapper.xml   | 11 ++++
 14 files changed, 198 insertions(+), 71 deletions(-)
 create mode 100644 src/main/java/com/supervision/police/vo/ConversationResVo.java

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<Conversation> {
 
+    IPage<ConversationResVo> queryUserConversationList(String userId, Page<ConversationResVo> 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<ChatResVO> queryConversationInfoList(String conversationId, int page, int size);
+
+
+    IPage<ConversationResVo> 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<Conversation> {
 
+    IPage<ConversationResVo> queryUserConversationList(String userId, Page<ConversationResVo> 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<ModelCase> {
      */
     void migrateRecordKnowledgeBase();
 
+
+    List<String> 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<NoteRecord> {
 
     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<ChatResVO> queryConversationInfoList(String conversationId, int page, int size) {
+        Assert.notEmpty(conversationId, "会话id不能为空");
+
+        IPage<ConversationQa> 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<ConversationResVo> 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<ConversationMapper, Conversation>
     implements ConversationService{
 
+    @Override
+    public IPage<ConversationResVo> queryUserConversationList(String userId, Page<ConversationResVo> 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<ModelCaseMapper, ModelCase
             return;
         }
         log.info("案件:{} 开始上传笔录到支持库...",modelCase.getCaseName());
-        noteRecordService.uploadRecordFileToDifyKnowledgeBase(caseId);
+        difyApiUtil.uploadCaseFileToDifyKnowledgeBase(modelCase,this.listCaseFileIds(caseId));
         log.info("案件:{} 上传笔录到支持库成功...",modelCase.getCaseName());
 
     }
@@ -433,6 +433,22 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
         log.info("===========>>>>>迁移笔录到支持库完成,成功个数:{},失败个数:{},总耗时:{}秒...<<<<<===========",success,allModelCase.size()-success,timer.intervalSecond());
     }
 
+    @Override
+    public List<String> listCaseFileIds(String caseId) {
+
+        List<NoteRecord> noteRecordList = noteRecordService.lambdaQuery().eq(NoteRecord::getCaseId, caseId).list();
+        List<CaseEvidenceDetailDTO> caseEvidenceDetailDTOS = caseEvidenceService.queryEvidenceList(caseId);
+
+
+        List<String> recordFileIds = noteRecordList.stream().map(NoteRecord::getFileIds)
+                .filter(StrUtil::isNotEmpty).flatMap(fileId -> StrUtil.split(fileId, ",").stream()).collect(Collectors.toList());
+        List<String> 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<NoteRecordMapper, NoteRec
 
     }
 
-    @Override
-    public void uploadRecordFileToDifyKnowledgeBase(String caseId) {
-
-        ModelCase modelCase = modelCaseService.getById(caseId);
-        if (null == modelCase || StrUtil.isEmpty(modelCase.getKnowledgeBaseId())){
-            log.warn("uploadRecordFileToKnowledgeBase:案件:{}案件或者知识库为空,不进行知识库维护!", caseId);
-            return;
-        }
-
-        List<Document> documents = difyApiUtil.queryDocuments(modelCase.getKnowledgeBaseId());
-        Set<String> documentFileIds = documents.stream().map(Document::getFileId).collect(Collectors.toSet());
-
-        List<NoteRecord> recordList = this.lambdaQuery().eq(NoteRecord::getCaseId, caseId).list();
-
-        // 只上传 doc docx、txt、md、pdf 文件,且文件大小不能超过15mb
-        List<String> allFileIds = recordList.stream().map(NoteRecord::getFileIds).filter(StrUtil::isNotEmpty)
-                .flatMap(s -> StrUtil.split(s, ",").stream()).collect(Collectors.toList());
-
-        List<MinioFile> minioFiles = minioService.listMinioFile(allFileIds);
-        List<String> 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<String, MinioFile> 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<String, Object> 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<String> allFileIds) {
+
+        if (StrUtil.isEmpty(modelCase.getKnowledgeBaseId())){
+            log.warn("uploadRecordFileToKnowledgeBase:案件:{}案件或者知识库为空,不进行知识库维护!", modelCase.getCaseName());
+            return;
+        }
+
+        List<Document> documents = this.queryDocuments(modelCase.getKnowledgeBaseId());
+        Set<String> documentFileIds = documents.stream().map(Document::getFileId).collect(Collectors.toSet());
+
+
+        // 只上传 doc docx、txt、md、pdf 文件,且文件大小不能超过15mb
+        List<MinioFile> minioFiles = minioService.listMinioFile(allFileIds);
+        List<String> 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<String, MinioFile> 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<String> 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<String, String> decodeDocumentName(String documentName) {
+    private Pair<String, String> 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
     </sql>
+    <select id="queryUserConversationList" resultType="com.supervision.police.vo.ConversationResVo">
+        select c.id as conversationId,
+               mc.case_name as caseName,
+               mc.id as caseId,
+               cp.id as caseActorId,
+               cp.name as caseActor
+        from conversation c
+                 left join model_case mc on c.case_id = mc.id
+                 left join case_person cp on (c.case_id = cp.case_id and cp.case_actor_flag = 1 and cp.role_code = '1')
+        where c.user_id = #{userId} order by c.create_time desc
+    </select>
 </mapper>

From 120129d55df1173d0043d316ebde71fcfa1e03dc Mon Sep 17 00:00:00 2001
From: xueqingkun <xueqingkun@126.com>
Date: Wed, 27 Nov 2024 14:41:11 +0800
Subject: [PATCH 2/3] 1. merger

---
 src/main/java/com/supervision/police/vo/ChatResVO.java | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/supervision/police/vo/ChatResVO.java b/src/main/java/com/supervision/police/vo/ChatResVO.java
index f90d944..d3812b7 100644
--- a/src/main/java/com/supervision/police/vo/ChatResVO.java
+++ b/src/main/java/com/supervision/police/vo/ChatResVO.java
@@ -1,13 +1,11 @@
 package com.supervision.police.vo;
 
 import com.supervision.chat.client.dto.chat.ChatResDTO;
+import com.supervision.police.domain.ConversationQa;
 import com.supervision.police.vo.dify.KnowledgeBaseSegmentVO;
 import lombok.Data;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 @Data
 public class ChatResVO {

From 2389e70ee2acce0f66fc8e54ed8f80a526fa0a1d Mon Sep 17 00:00:00 2001
From: xueqingkun <xueqingkun@126.com>
Date: Wed, 27 Nov 2024 17:30:32 +0800
Subject: [PATCH 3/3] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E5=AF=B9=E8=AF=9D?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../police/controller/ChatController.java     | 41 +++++++++++++++++--
 .../police/service/ChatService.java           |  5 +++
 .../police/service/impl/ChatServiceImpl.java  | 15 +++++++
 .../com/supervision/police/vo/ChatResVO.java  |  5 +++
 4 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/supervision/police/controller/ChatController.java b/src/main/java/com/supervision/police/controller/ChatController.java
index e40b054..4fa95fa 100644
--- a/src/main/java/com/supervision/police/controller/ChatController.java
+++ b/src/main/java/com/supervision/police/controller/ChatController.java
@@ -1,16 +1,19 @@
 package com.supervision.police.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.supervision.common.domain.R;
 import com.supervision.police.service.ChatService;
 import com.supervision.police.vo.ChatReqVO;
 import com.supervision.police.vo.ChatResVO;
+import com.supervision.police.vo.ConversationResVo;
+import com.supervision.utils.UserUtil;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 @Slf4j
 @RestController
@@ -27,4 +30,34 @@ public class ChatController {
         return R.ok(chatResVO);
     }
 
+    /**
+     * 查询用户会话列表
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/conversation/list")
+    public R<IPage<ConversationResVo>> queryUserConversationList(@RequestParam(defaultValue = "1") @Parameter(name = "pageNum",description = "页码") Integer pageNum,
+                                                                 @RequestParam(defaultValue = "10") @Parameter(name = "pageSize",description = "每页数量") Integer pageSize){
+
+        IPage<ConversationResVo> conversationResVoIPage = chatService.queryUserConversationList(UserUtil.getUser().getId(),pageNum, pageSize);
+
+        return R.ok(conversationResVoIPage);
+    }
+
+    @GetMapping("/conversation/infoList")
+    public R<IPage<ChatResVO>> queryConversationInfoList(@RequestParam String conversationId,
+                                                         @RequestParam(defaultValue = "1") @Parameter(name = "pageNum",description = "页码") Integer pageNum,
+                                                         @RequestParam(defaultValue = "10") @Parameter(name = "pageSize",description = "每页数量") Integer pageSize){
+
+        IPage<ChatResVO> chatResVOIPage = chatService.queryConversationInfoList(conversationId, pageNum, pageSize);
+
+        return R.ok(chatResVOIPage);
+    }
+
+    @PostMapping("/conversation/delete")
+    public R<Boolean> deleteConversation(@RequestBody List<String> conversationIdList) {
+        chatService.deleteConversation(conversationIdList);
+        return R.ok(true);
+    }
 }
diff --git a/src/main/java/com/supervision/police/service/ChatService.java b/src/main/java/com/supervision/police/service/ChatService.java
index a596d0f..158dc9c 100644
--- a/src/main/java/com/supervision/police/service/ChatService.java
+++ b/src/main/java/com/supervision/police/service/ChatService.java
@@ -5,6 +5,8 @@ import com.supervision.police.vo.ChatReqVO;
 import com.supervision.police.vo.ChatResVO;
 import com.supervision.police.vo.ConversationResVo;
 
+import java.util.List;
+
 public interface ChatService {
     ChatResVO chat(ChatReqVO chatReqVO);
     ChatResVO chatNew(ChatReqVO chatReqVO);
@@ -14,4 +16,7 @@ public interface ChatService {
 
 
     IPage<ConversationResVo> queryUserConversationList(String userId, int page, int size);
+
+
+    void deleteConversation(List<String> conversationIdList);
 }
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 462118a..eaaadad 100644
--- a/src/main/java/com/supervision/police/service/impl/ChatServiceImpl.java
+++ b/src/main/java/com/supervision/police/service/impl/ChatServiceImpl.java
@@ -1,5 +1,6 @@
 package com.supervision.police.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
@@ -201,6 +202,20 @@ public class ChatServiceImpl implements ChatService {
         return conversationService.queryUserConversationList(userId, new Page<>(page,size));
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class, transactionManager = "dataSourceTransactionManager")
+    public void deleteConversation(List<String> conversationIdList) {
+        if (CollUtil.isEmpty(conversationIdList)){
+            return;
+        }
+        for (String conversationId : conversationIdList) {
+            boolean success = conversationService.removeById(conversationId);
+            if (success){
+                conversationQaService.lambdaUpdate().eq(ConversationQa::getConversationId, conversationId).remove();
+            }
+        }
+    }
+
     /**
      * 处理指标结果问答
      *
diff --git a/src/main/java/com/supervision/police/vo/ChatResVO.java b/src/main/java/com/supervision/police/vo/ChatResVO.java
index d3812b7..f33728f 100644
--- a/src/main/java/com/supervision/police/vo/ChatResVO.java
+++ b/src/main/java/com/supervision/police/vo/ChatResVO.java
@@ -1,5 +1,7 @@
 package com.supervision.police.vo;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.supervision.chat.client.dto.chat.ChatResDTO;
 import com.supervision.police.domain.ConversationQa;
 import com.supervision.police.vo.dify.KnowledgeBaseSegmentVO;
@@ -47,6 +49,9 @@ public class ChatResVO {
         this.setId(conversationQa.getId());
         this.setQuestion(conversationQa.getQuestion());
         this.setAnswer(conversationQa.getAnswer());
+        if (StrUtil.isNotEmpty(conversationQa.getAnswer())){
+            this.answwerMap = JSONUtil.toBean(conversationQa.getAnswer(), Map.class);
+        }
         this.setType(conversationQa.getType());
         this.setQuestionTime(conversationQa.getQuestionTime());
         this.setIntentType(conversationQa.getIntentType());