证据下载接口,聊天功能优化

jinan_dev
DESKTOP-DDTUS3E\yaxin 7 months ago
parent 92e799e9ae
commit 295e2108ee

@ -12,6 +12,7 @@ import com.supervision.police.vo.VerifyEvidenceReqVO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -193,4 +194,9 @@ public class CaseEvidenceController {
return R.ok("success"); return R.ok("success");
} }
@GetMapping("/downloadEvidence")
public void downloadEvidence(@RequestParam String evidenceId, HttpServletResponse response) {
caseEvidenceService.downloadEvidence(evidenceId, response);
}
} }

@ -10,6 +10,7 @@ import com.supervision.police.dto.*;
import com.supervision.police.vo.EvidenceDirectoryReqVO; import com.supervision.police.vo.EvidenceDirectoryReqVO;
import com.supervision.police.vo.VerifyEvidenceReqVO; import com.supervision.police.vo.VerifyEvidenceReqVO;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -163,4 +164,6 @@ public interface CaseEvidenceService extends IService<CaseEvidence> {
void updateEvidenceAppendProcessingNewTransaction(String evidenceId, String status,String appendProcessing); void updateEvidenceAppendProcessingNewTransaction(String evidenceId, String status,String appendProcessing);
void redoExtractAttributes(String caseId, List<CaseEvidence> caseEvidences); void redoExtractAttributes(String caseId, List<CaseEvidence> caseEvidences);
void downloadEvidence(String evidenceId, HttpServletResponse response);
} }

@ -23,6 +23,8 @@ import com.supervision.police.mapper.CaseEvidenceMapper;
import com.supervision.police.service.*; import com.supervision.police.service.*;
import com.supervision.police.vo.EvidenceDirectoryReqVO; import com.supervision.police.vo.EvidenceDirectoryReqVO;
import com.supervision.police.vo.VerifyEvidenceReqVO; import com.supervision.police.vo.VerifyEvidenceReqVO;
import com.supervision.utils.ZipFileUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext; import org.springframework.aop.framework.AopContext;
@ -32,6 +34,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@ -45,17 +49,11 @@ import java.util.stream.Stream;
public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, CaseEvidence> implements CaseEvidenceService { public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, CaseEvidence> implements CaseEvidenceService {
private final EvidenceFileService evidenceFileService; private final EvidenceFileService evidenceFileService;
private final ComDictionaryService comDictionaryService; private final ComDictionaryService comDictionaryService;
private final CaseStatusManageService caseStatusManageService; private final CaseStatusManageService caseStatusManageService;
private final FileOcrProcessService fileOcrProcessService; private final FileOcrProcessService fileOcrProcessService;
private final MinioService minioService; private final MinioService minioService;
private final ModelCaseService modelCaseService; private final ModelCaseService modelCaseService;
@Autowired @Autowired
private LLMExtractService llmExtractService; private LLMExtractService llmExtractService;
@Autowired @Autowired
@ -79,11 +77,11 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
CaseEvidence caseEvidence = caseEvidenceDTO.toCaseEvidence(); CaseEvidence caseEvidence = caseEvidenceDTO.toCaseEvidence();
super.save(caseEvidence); super.save(caseEvidence);
if (CollUtil.isNotEmpty(caseEvidence.getProperty())){ if (CollUtil.isNotEmpty(caseEvidence.getProperty())) {
// 同时保存证据属性值 // 同时保存证据属性值
EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryService.listDirectoryTree(caseEvidence.getCaseId())); EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryService.listDirectoryTree(caseEvidence.getCaseId()));
EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId()); EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
caseEvidencePropertyService.saveEvidenceProperty(caseEvidence.getId(),directory.getCategoryId(),caseEvidence.getProperty()); caseEvidencePropertyService.saveEvidenceProperty(caseEvidence.getId(), directory.getCategoryId(), caseEvidence.getProperty());
} }
@ -121,11 +119,11 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
// 更新证据属性 // 更新证据属性
EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryService.listDirectoryTree(caseEvidence.getCaseId())); EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryService.listDirectoryTree(caseEvidence.getCaseId()));
EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId()); EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
if (null != directory && StrUtil.isNotEmpty(directory.getCategoryId())){ if (null != directory && StrUtil.isNotEmpty(directory.getCategoryId())) {
if (CollUtil.isNotEmpty(caseEvidence.getProperty())){ if (CollUtil.isNotEmpty(caseEvidence.getProperty())) {
caseEvidencePropertyService.updateEvidenceProperty(caseEvidence.getId(),directory.getCategoryId(),caseEvidence.getProperty()); caseEvidencePropertyService.updateEvidenceProperty(caseEvidence.getId(), directory.getCategoryId(), caseEvidence.getProperty());
}else { } else {
caseEvidencePropertyService.deleteEvidenceProperty(caseEvidence.getId(),directory.getCategoryId()); caseEvidencePropertyService.deleteEvidenceProperty(caseEvidence.getId(), directory.getCategoryId());
} }
} }
@ -178,7 +176,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class) @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public boolean batchDeleteEvidence(List<EvidenceIdWrapper> wrappers) { public boolean batchDeleteEvidence(List<EvidenceIdWrapper> wrappers) {
if (CollUtil.isEmpty(wrappers)){ if (CollUtil.isEmpty(wrappers)) {
return true; return true;
} }
List<String> evidenceIds = wrappers.stream().map(EvidenceIdWrapper::getEvidenceId).toList(); List<String> evidenceIds = wrappers.stream().map(EvidenceIdWrapper::getEvidenceId).toList();
@ -250,7 +248,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
caseEvidenceDetailDTO.setContentTypeValue(recordFileDTOS); caseEvidenceDetailDTO.setContentTypeValue(recordFileDTOS);
EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId()); EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
caseEvidenceDetailDTO.setEvidenceFormatValue(directory); caseEvidenceDetailDTO.setEvidenceFormatValue(directory);
if (null != queryDirectory && queryDirectory.getLevel() == 3 && StrUtil.isNotEmpty(caseEvidence.getFileName())){ if (null != queryDirectory && queryDirectory.getLevel() == 3 && StrUtil.isNotEmpty(caseEvidence.getFileName())) {
caseEvidenceDetailDTO.setEvidenceName(caseEvidence.getFileName().split("\\.")[0]); caseEvidenceDetailDTO.setEvidenceName(caseEvidence.getFileName().split("\\.")[0]);
} }
caseEvidenceDetailDTO.setDirectoryNamePath(StrUtil.join("/", rootDirectory.getDirectoryPath(caseEvidence.getDirectoryId()))); caseEvidenceDetailDTO.setDirectoryNamePath(StrUtil.join("/", rootDirectory.getDirectoryPath(caseEvidence.getDirectoryId())));
@ -370,7 +368,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
caseEvidence.setProcessStatus(EvidenceConstants.PROCESS_STATUS_SUCCESS); caseEvidence.setProcessStatus(EvidenceConstants.PROCESS_STATUS_SUCCESS);
updateById(caseEvidence); updateById(caseEvidence);
} catch (Exception e) { } catch (Exception e) {
log.error("证据:【{}】解析失败。更新证据处理状态为【处理失败】。",evidenceId, e); log.error("证据:【{}】解析失败。更新证据处理状态为【处理失败】。", evidenceId, e);
caseEvidence.setProcessStatus(EvidenceConstants.PROCESS_STATUS_FAILED); caseEvidence.setProcessStatus(EvidenceConstants.PROCESS_STATUS_FAILED);
updateById(caseEvidence); updateById(caseEvidence);
} finally { } finally {
@ -380,20 +378,21 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
/** /**
* *
*
* @param extract * @param extract
* @return * @return
*/ */
private boolean checkExtractAttributes(NotePromptExtractAttributesDto extract){ private boolean checkExtractAttributes(NotePromptExtractAttributesDto extract) {
if (null == extract){ if (null == extract) {
return false; return false;
} }
String attrValueType = extract.getAttrValueType(); String attrValueType = extract.getAttrValueType();
if (StrUtil.equals(attrValueType, IndexRuleConstants.VALUE_TYPE_DATE)){ // 日期 if (StrUtil.equals(attrValueType, IndexRuleConstants.VALUE_TYPE_DATE)) { // 日期
try { try {
new SimpleDateFormat("yyyy-MM-dd").parse(extract.getAttrValue()); new SimpleDateFormat("yyyy-MM-dd").parse(extract.getAttrValue());
return true; return true;
} catch (Exception e) { } catch (Exception e) {
log.error("属性:{},日期:{}格式错误", extract.getAttrName(),extract.getAttrValue(),e); log.error("属性:{},日期:{}格式错误", extract.getAttrName(), extract.getAttrValue(), e);
return false; return false;
} }
} }
@ -462,7 +461,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
List<EvidenceCategoryDTO> evidenceCategoryTree = evidenceCategoryService.listCategoryTree(caseType); List<EvidenceCategoryDTO> evidenceCategoryTree = evidenceCategoryService.listCategoryTree(caseType);
List<EvidenceDirectoryDTO> evidenceDirectoryTree = evidenceDirectoryService.listDirectoryTree(caseId); List<EvidenceDirectoryDTO> evidenceDirectoryTree = evidenceDirectoryService.listDirectoryTree(caseId);
initCaseEvidenceDirectory(evidenceCategoryTree,evidenceDirectoryTree,caseId, null); initCaseEvidenceDirectory(evidenceCategoryTree, evidenceDirectoryTree, caseId, null);
} }
@Override @Override
@ -495,17 +494,17 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
((CaseEvidenceService) AopContext.currentProxy()).doReplaceEvidence(modelCase, allEvidence, catagroyMap, allFile); ((CaseEvidenceService) AopContext.currentProxy()).doReplaceEvidence(modelCase, allEvidence, catagroyMap, allFile);
successCount++; successCount++;
} catch (Exception e) { } catch (Exception e) {
log.error("案件{}的目录初始化失败。案件id:{}", modelCase.getCaseName(), modelCase.getId(),e); log.error("案件{}的目录初始化失败。案件id:{}", modelCase.getCaseName(), modelCase.getId(), e);
errorCount++; errorCount++;
} }
index += 1; index += 1;
log.info("案件【{}】的目录初始化完成。耗时:{}秒,占总体进度:{}%", modelCase.getCaseName(),interval.intervalSecond(modelCase.getId()),index/(list.size()*1.0)*100); log.info("案件【{}】的目录初始化完成。耗时:{}秒,占总体进度:{}%", modelCase.getCaseName(), interval.intervalSecond(modelCase.getId()), index / (list.size() * 1.0) * 100);
} }
log.info("<<<<=======初始化案件的证据目录完成。案件总条数:{},总耗时:{}秒,成功个数:{},失败个数:{}", list.size(),interval.intervalSecond(),successCount,errorCount); log.info("<<<<=======初始化案件的证据目录完成。案件总条数:{},总耗时:{}秒,成功个数:{},失败个数:{}", list.size(), interval.intervalSecond(), successCount, errorCount);
} }
@Transactional(rollbackFor = Exception.class, transactionManager = "dataSourceTransactionManager",propagation = Propagation.REQUIRES_NEW) @Transactional(rollbackFor = Exception.class, transactionManager = "dataSourceTransactionManager", propagation = Propagation.REQUIRES_NEW)
public void doReplaceEvidence(ModelCase modelCase, List<CaseEvidence> allEvidence, Map<String, String> catagroyMap, List<EvidenceFile> allFile) { public void doReplaceEvidence(ModelCase modelCase, List<CaseEvidence> allEvidence, Map<String, String> catagroyMap, List<EvidenceFile> allFile) {
String caseType = modelCase.getCaseType(); String caseType = modelCase.getCaseType();
String id = modelCase.getId(); String id = modelCase.getId();
@ -517,28 +516,28 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
log.info("案件{}证据总数:{}", modelCase.getCaseName(), evidenceList.size()); log.info("案件{}证据总数:{}", modelCase.getCaseName(), evidenceList.size());
for (CaseEvidence caseEvidence : evidenceList) { for (CaseEvidence caseEvidence : evidenceList) {
String directoryId = caseEvidence.getDirectoryId(); String directoryId = caseEvidence.getDirectoryId();
if (StrUtil.isNotEmpty(directoryId)){ if (StrUtil.isNotEmpty(directoryId)) {
log.warn("证据id{},证据名:{}已经存在目录id:{},不进行目录绑定操作",caseEvidence.getId(),caseEvidence.getEvidenceName(),directoryId); log.warn("证据id{},证据名:{}已经存在目录id:{},不进行目录绑定操作", caseEvidence.getId(), caseEvidence.getEvidenceName(), directoryId);
continue; continue;
} }
if (StrUtil.equalsAny(caseEvidence.getEvidenceType(), "3","6")){ if (StrUtil.equalsAny(caseEvidence.getEvidenceType(), "3", "6")) {
log.warn("证据id{},证据名:{},证据类型为【{}】,清除无用数据",caseEvidence.getId(),caseEvidence.getEvidenceName(),caseEvidence.getEvidenceType()); log.warn("证据id{},证据名:{},证据类型为【{}】,清除无用数据", caseEvidence.getId(), caseEvidence.getEvidenceName(), caseEvidence.getEvidenceType());
super.removeById(caseEvidence.getId()); super.removeById(caseEvidence.getId());
continue; continue;
} }
if (!catagroyMap.containsKey(caseEvidence.getEvidenceType())){ if (!catagroyMap.containsKey(caseEvidence.getEvidenceType())) {
log.warn("证据id{},证据名:{},证据类型为【{}】,没有对应的目录,请检查目录配置",caseEvidence.getId(),caseEvidence.getEvidenceName(),caseEvidence.getEvidenceType()); log.warn("证据id{},证据名:{},证据类型为【{}】,没有对应的目录,请检查目录配置", caseEvidence.getId(), caseEvidence.getEvidenceName(), caseEvidence.getEvidenceType());
continue; continue;
} }
if (StrUtil.isEmpty(caseEvidence.getEvidenceType())){ if (StrUtil.isEmpty(caseEvidence.getEvidenceType())) {
log.warn("证据id{},证据名:{},证据类型不能为空,默认为书证",caseEvidence.getId(),caseEvidence.getEvidenceName()); log.warn("证据id{},证据名:{},证据类型不能为空,默认为书证", caseEvidence.getId(), caseEvidence.getEvidenceName());
caseEvidence.setEvidenceType("1"); caseEvidence.setEvidenceType("1");
} }
EvidenceDirectoryDTO topDirectory = findTopDirectory(rootDirectory, catagroyMap.get(caseEvidence.getEvidenceType())); EvidenceDirectoryDTO topDirectory = findTopDirectory(rootDirectory, catagroyMap.get(caseEvidence.getEvidenceType()));
if (null == topDirectory){ if (null == topDirectory) {
log.warn("证据id{},证据名:{},证据类型为【{}】,在根目录下没有对应的目录,请检查目录配置",caseEvidence.getId(),caseEvidence.getEvidenceName(),caseEvidence.getEvidenceType()); log.warn("证据id{},证据名:{},证据类型为【{}】,在根目录下没有对应的目录,请检查目录配置", caseEvidence.getId(), caseEvidence.getEvidenceName(), caseEvidence.getEvidenceType());
continue; continue;
} }
caseEvidence.setDirectoryId(topDirectory.getId()); caseEvidence.setDirectoryId(topDirectory.getId());
@ -550,24 +549,24 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
for (EvidenceFile file : files) { for (EvidenceFile file : files) {
evidenceFileService.updateById(file); evidenceFileService.updateById(file);
MinioFile minioFile = minioFileMap.get(file.getFileId()); MinioFile minioFile = minioFileMap.get(file.getFileId());
if (null == minioFile){ if (null == minioFile) {
log.warn("证据id{},证据名:{}文件id{}不存在minio上传信息", caseEvidence.getId(),caseEvidence.getEvidenceName(),file.getFileId()); log.warn("证据id{},证据名:{}文件id{}不存在minio上传信息", caseEvidence.getId(), caseEvidence.getEvidenceName(), file.getFileId());
continue; continue;
} }
fileOcrProcessService.multipleTypeOcrProcess(List.of(file.getFileId()),minioFile.getFileType()); fileOcrProcessService.multipleTypeOcrProcess(List.of(file.getFileId()), minioFile.getFileType());
} }
} }
} }
private EvidenceDirectoryDTO findTopDirectory(EvidenceDirectoryDTO rootDirectory, String categoryId) { private EvidenceDirectoryDTO findTopDirectory(EvidenceDirectoryDTO rootDirectory, String categoryId) {
if (StrUtil.equals(rootDirectory.getCategoryId(), categoryId)){ if (StrUtil.equals(rootDirectory.getCategoryId(), categoryId)) {
return rootDirectory; return rootDirectory;
} }
if (CollUtil.isNotEmpty(rootDirectory.getChild())){ if (CollUtil.isNotEmpty(rootDirectory.getChild())) {
for (EvidenceDirectoryDTO child : rootDirectory.getChild()) { for (EvidenceDirectoryDTO child : rootDirectory.getChild()) {
EvidenceDirectoryDTO directory = findTopDirectory(child, categoryId); EvidenceDirectoryDTO directory = findTopDirectory(child, categoryId);
if (directory != null){ if (directory != null) {
return directory; return directory;
} }
} }
@ -665,10 +664,10 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
List<EvidenceFileDTO> ocrFileDTOList = evidenceList.stream().filter( List<EvidenceFileDTO> ocrFileDTOList = evidenceList.stream().filter(
// 当前证据下不是所有文件都是新增 // 当前证据下不是所有文件都是新增
evidenceDetail-> !evidenceDetail.getFileList().stream().allMatch(file -> StrUtil.equalsAny(file.getUpdateStatus(), "1", "-1")) evidenceDetail -> !evidenceDetail.getFileList().stream().allMatch(file -> StrUtil.equalsAny(file.getUpdateStatus(), "1", "-1"))
) )
.flatMap(evidenceDetailDTO -> evidenceDetailDTO.getFileList().stream().filter(file -> StrUtil.equals(file.getUpdateStatus(), "1"))).toList(); .flatMap(evidenceDetailDTO -> evidenceDetailDTO.getFileList().stream().filter(file -> StrUtil.equals(file.getUpdateStatus(), "1"))).toList();
if (CollUtil.isNotEmpty(ocrFileDTOList)){ if (CollUtil.isNotEmpty(ocrFileDTOList)) {
// 在已经存在的目录下追加文件只需要重新及进行ocr识别 // 在已经存在的目录下追加文件只需要重新及进行ocr识别
log.info("ocrAndExtract:开始只进行文件内容识别..."); log.info("ocrAndExtract:开始只进行文件内容识别...");
Map<String, List<EvidenceFileDTO>> evidenceMap = ocrFileDTOList.stream().collect(Collectors.groupingBy(EvidenceFileDTO::getEvidenceId)); Map<String, List<EvidenceFileDTO>> evidenceMap = ocrFileDTOList.stream().collect(Collectors.groupingBy(EvidenceFileDTO::getEvidenceId));
@ -678,17 +677,17 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
// 首先统一更新为正在处理 // 首先统一更新为正在处理
CaseEvidence one = this.lambdaQuery().eq(CaseEvidence::getId, evidenceId).one(); CaseEvidence one = this.lambdaQuery().eq(CaseEvidence::getId, evidenceId).one();
updateEvidenceAppendProcessingNewTransaction(evidenceId,one.getProcessStatus(),"1"); updateEvidenceAppendProcessingNewTransaction(evidenceId, one.getProcessStatus(), "1");
} }
for (Map.Entry<String, List<EvidenceFileDTO>> entry : evidenceMap.entrySet()) { for (Map.Entry<String, List<EvidenceFileDTO>> entry : evidenceMap.entrySet()) {
String evidenceId = entry.getKey(); String evidenceId = entry.getKey();
List<EvidenceFileDTO> value = entry.getValue(); List<EvidenceFileDTO> value = entry.getValue();
for (EvidenceFileDTO evidenceFileDTO : value) { for (EvidenceFileDTO evidenceFileDTO : value) {
fileOcrProcessService.multipleTypeOcrProcess(List.of(evidenceFileDTO.getFileId()),evidenceFileDTO.getFileType()); fileOcrProcessService.multipleTypeOcrProcess(List.of(evidenceFileDTO.getFileId()), evidenceFileDTO.getFileType());
} }
log.info("ocrAndExtract:证据:{} 文件内容识别完成", evidenceId); log.info("ocrAndExtract:证据:{} 文件内容识别完成", evidenceId);
updateEvidenceAppendProcessingNewTransaction(evidenceId,EvidenceConstants.PROCESS_STATUS_SUCCESS,"0"); updateEvidenceAppendProcessingNewTransaction(evidenceId, EvidenceConstants.PROCESS_STATUS_SUCCESS, "0");
} }
} }
@ -707,10 +706,10 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
} }
@Override @Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void updateEvidenceAppendProcessingNewTransaction(String evidenceId, String status,String appendProcessing) { public void updateEvidenceAppendProcessingNewTransaction(String evidenceId, String status, String appendProcessing) {
this.lambdaUpdate().eq(CaseEvidence::getId, evidenceId) this.lambdaUpdate().eq(CaseEvidence::getId, evidenceId)
.set(StrUtil.isNotEmpty(status),CaseEvidence::getProcessStatus, status) .set(StrUtil.isNotEmpty(status), CaseEvidence::getProcessStatus, status)
.set(CaseEvidence::getAppendProcessing, appendProcessing) .set(CaseEvidence::getAppendProcessing, appendProcessing)
.set(CaseEvidence::getUpdateTime, LocalDateTime.now()).update(); .set(CaseEvidence::getUpdateTime, LocalDateTime.now()).update();
} }
@ -829,10 +828,10 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
// 同时更新证据属性值 // 同时更新证据属性值
String categoryId = rootDirectory.findDirectory(CollUtil.getFirst(value).getDirectoryId()).getCategoryId(); String categoryId = rootDirectory.findDirectory(CollUtil.getFirst(value).getDirectoryId()).getCategoryId();
Map<String, List<NotePromptExtractAttributesDto>> map = caseEvidencePropertyService.listEvidenceProperty(categoryId, Collections.singletonList(evidenceId)); Map<String, List<NotePromptExtractAttributesDto>> map = caseEvidencePropertyService.listEvidenceProperty(categoryId, Collections.singletonList(evidenceId));
if (CollUtil.isEmpty(map.get(categoryId))){ if (CollUtil.isEmpty(map.get(categoryId))) {
caseEvidencePropertyService.saveEvidenceProperty(evidenceId, categoryId,CollUtil.getFirst(value).getProperties()); caseEvidencePropertyService.saveEvidenceProperty(evidenceId, categoryId, CollUtil.getFirst(value).getProperties());
}else { } else {
caseEvidencePropertyService.updateEvidenceProperty(evidenceId, categoryId,CollUtil.getFirst(value).getProperties()); caseEvidencePropertyService.updateEvidenceProperty(evidenceId, categoryId, CollUtil.getFirst(value).getProperties());
} }
@ -850,7 +849,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
if (evidenceDetail != null) { if (evidenceDetail != null) {
List<EvidenceFileDTO> fileList = evidenceDetail.getFileList(); List<EvidenceFileDTO> fileList = evidenceDetail.getFileList();
int initOrder = 0; int initOrder = 0;
if (StrUtil.isNotEmpty(batchNo) && !CollUtil.isNotEmpty(fileList)){ if (StrUtil.isNotEmpty(batchNo) && !CollUtil.isNotEmpty(fileList)) {
// 如果批次不为空,则只对当前批次的文件进行排序 // 如果批次不为空,则只对当前批次的文件进行排序
initOrder = fileList.size(); initOrder = fileList.size();
} }
@ -913,7 +912,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
rebuildEvidenceProperties(rootDirectory, caseEvidenceList); rebuildEvidenceProperties(rootDirectory, caseEvidenceList);
List<CategoryPromptDTO> categoryPromptDTOS = evidenceDirectoryService.listCategoryPrompt(caseId); List<CategoryPromptDTO> categoryPromptDTOS = evidenceDirectoryService.listCategoryPrompt(caseId);
Map<String, CaseEvidenceDTO> caseEvidenceMap = caseEvidenceList.stream().map(CaseEvidenceDTO::new).peek(e->e.setDirectoryNamePathValue(rootDirectory)).collect(Collectors.toMap(CaseEvidenceDTO::getId, Function.identity())); Map<String, CaseEvidenceDTO> caseEvidenceMap = caseEvidenceList.stream().map(CaseEvidenceDTO::new).peek(e -> e.setDirectoryNamePathValue(rootDirectory)).collect(Collectors.toMap(CaseEvidenceDTO::getId, Function.identity()));
Map<String, CategoryPromptDTO> categoryPromptMap = categoryPromptDTOS.stream().collect(Collectors.toMap(CategoryPromptDTO::getDirectoryId, k -> k, (v1, v2) -> v1)); Map<String, CategoryPromptDTO> categoryPromptMap = categoryPromptDTOS.stream().collect(Collectors.toMap(CategoryPromptDTO::getDirectoryId, k -> k, (v1, v2) -> v1));
Iterator<EvidenceDirectoryDTO> iterator = evidenceDirectoryDTOS.iterator(); Iterator<EvidenceDirectoryDTO> iterator = evidenceDirectoryDTOS.iterator();
@ -936,7 +935,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
Map<String, List<String>> categoryMapEvidence = new HashMap<>(); Map<String, List<String>> categoryMapEvidence = new HashMap<>();
for (CaseEvidence caseEvidence : caseEvidences) { for (CaseEvidence caseEvidence : caseEvidences) {
EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId()); EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
if (null != directory && StrUtil.isNotEmpty(directory.getCategoryId())){ if (null != directory && StrUtil.isNotEmpty(directory.getCategoryId())) {
List<String> evidenceIds = categoryMapEvidence.getOrDefault(directory.getCategoryId(), new ArrayList<>()); List<String> evidenceIds = categoryMapEvidence.getOrDefault(directory.getCategoryId(), new ArrayList<>());
evidenceIds.add(caseEvidence.getId()); evidenceIds.add(caseEvidence.getId());
categoryMapEvidence.put(directory.getCategoryId(), evidenceIds); categoryMapEvidence.put(directory.getCategoryId(), evidenceIds);
@ -950,14 +949,32 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
for (CaseEvidence caseEvidence : caseEvidences) { for (CaseEvidence caseEvidence : caseEvidences) {
List<NotePromptExtractAttributesDto> attributesDtos = map.get(caseEvidence.getId()); List<NotePromptExtractAttributesDto> attributesDtos = map.get(caseEvidence.getId());
// 兼容老数据 // 兼容老数据
if (CollUtil.isNotEmpty(attributesDtos)){ if (CollUtil.isNotEmpty(attributesDtos)) {
caseEvidence.setProperty(attributesDtos); caseEvidence.setProperty(attributesDtos);
} }
} }
} }
@Override
public void downloadEvidence(String evidenceId, HttpServletResponse response) {
List<EvidenceFileDTO> evidenceFileDTOList = evidenceFileService.listFileInfo(List.of(evidenceId));
Map<String, InputStream> fileInputStreamMap = new HashMap<>();
evidenceFileDTOList.forEach(evidenceFileDTO -> {
MinioFile minioFile = minioService.getMinioFile(evidenceFileDTO.getFileId());
if (null != minioFile) {
fileInputStreamMap.put(minioFile.getFilename(), minioService.getObjectInputStream(minioFile));
}
});
try {
ZipFileUtil.createZipAndDownload(response, getById(evidenceId).getEvidenceName(), fileInputStreamMap);
} catch (IOException e) {
log.error("下载证据文件失败", e);
}
}
/** /**
* *
*
* @param rootDirectory * @param rootDirectory
* @param caseEvidenceList * @param caseEvidenceList
*/ */
@ -966,33 +983,33 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
Map<String, String> directoryIdMapCategoryId = caseEvidenceList.stream() Map<String, String> directoryIdMapCategoryId = caseEvidenceList.stream()
.filter(e -> StrUtil.isNotEmpty(e.getDirectoryId()) && null != rootDirectory.findDirectory(e.getDirectoryId())) .filter(e -> StrUtil.isNotEmpty(e.getDirectoryId()) && null != rootDirectory.findDirectory(e.getDirectoryId()))
.map(CaseEvidence::getDirectoryId).distinct().collect( .map(CaseEvidence::getDirectoryId).distinct().collect(
Collectors.toMap(directoryId -> directoryId,di-> rootDirectory.findDirectory(di).getCategoryId())); Collectors.toMap(directoryId -> directoryId, di -> rootDirectory.findDirectory(di).getCategoryId()));
Map<String, List<NotePromptExtractAttributesDto>> categoryIdMapExtractAttributes = new HashMap<>(); Map<String, List<NotePromptExtractAttributesDto>> categoryIdMapExtractAttributes = new HashMap<>();
for (CaseEvidence caseEvidence : caseEvidenceList) { for (CaseEvidence caseEvidence : caseEvidenceList) {
EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId()); EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
if (null == directory || StrUtil.isEmpty(directory.getCategoryId())){ if (null == directory || StrUtil.isEmpty(directory.getCategoryId())) {
continue; continue;
} }
String categoryId = directory.getCategoryId(); String categoryId = directory.getCategoryId();
if (!categoryIdMapExtractAttributes.containsKey(categoryId)){ if (!categoryIdMapExtractAttributes.containsKey(categoryId)) {
categoryIdMapExtractAttributes.put(categoryId, caseEvidencePropertyService.findExtractAttributes(categoryId)); categoryIdMapExtractAttributes.put(categoryId, caseEvidencePropertyService.findExtractAttributes(categoryId));
} }
} }
for (CaseEvidence caseEvidence : caseEvidenceList) { for (CaseEvidence caseEvidence : caseEvidenceList) {
if (StrUtil.isEmpty(caseEvidence.getDirectoryId())){ if (StrUtil.isEmpty(caseEvidence.getDirectoryId())) {
continue; continue;
} }
String categoryId = directoryIdMapCategoryId.get(caseEvidence.getDirectoryId()); String categoryId = directoryIdMapCategoryId.get(caseEvidence.getDirectoryId());
if (StrUtil.isEmpty(categoryId)){ if (StrUtil.isEmpty(categoryId)) {
continue; continue;
} }
List<NotePromptExtractAttributesDto> merged = mergeExtractAttributes(caseEvidence.getProperty(), categoryIdMapExtractAttributes.get(categoryId)); List<NotePromptExtractAttributesDto> merged = mergeExtractAttributes(caseEvidence.getProperty(), categoryIdMapExtractAttributes.get(categoryId));
if (null != merged){ if (null != merged) {
merged = merged.stream().filter(Objects::nonNull).peek(e -> { merged = merged.stream().filter(Objects::nonNull).peek(e -> {
if (!checkExtractAttributes(e)) { if (!checkExtractAttributes(e)) {
e.setAttrValue(null); e.setAttrValue(null);
@ -1006,13 +1023,13 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
} }
private List<NotePromptExtractAttributesDto> mergeExtractAttributes(List<NotePromptExtractAttributesDto> property, List<NotePromptExtractAttributesDto> attributesTemplates) { private List<NotePromptExtractAttributesDto> mergeExtractAttributes(List<NotePromptExtractAttributesDto> property, List<NotePromptExtractAttributesDto> attributesTemplates) {
if (CollUtil.isEmpty(attributesTemplates) || CollUtil.isEmpty(property)){ if (CollUtil.isEmpty(attributesTemplates) || CollUtil.isEmpty(property)) {
return attributesTemplates; return attributesTemplates;
} }
for (NotePromptExtractAttributesDto attributesTemplate : attributesTemplates) { for (NotePromptExtractAttributesDto attributesTemplate : attributesTemplates) {
String attrName = attributesTemplate.getAttrName(); String attrName = attributesTemplate.getAttrName();
for (NotePromptExtractAttributesDto attributesDto : property) { for (NotePromptExtractAttributesDto attributesDto : property) {
if (StrUtil.equals(attributesDto.getAttrName(), attrName)){ if (StrUtil.equals(attributesDto.getAttrName(), attrName)) {
attributesTemplate.setAttrValue(attributesDto.getAttrValue()); attributesTemplate.setAttrValue(attributesDto.getAttrValue());
break; break;
} }
@ -1321,18 +1338,19 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
*/ */
/** /**
* *
*
* @param evidenceCategoryTree * @param evidenceCategoryTree
* @param evidenceDirectoryTree * @param evidenceDirectoryTree
* @param caseId id * @param caseId id
* @param parentId id * @param parentId id
*/ */
private void initCaseEvidenceDirectory(List<EvidenceCategoryDTO> evidenceCategoryTree, List<EvidenceDirectoryDTO> evidenceDirectoryTree,String caseId,String parentId) { private void initCaseEvidenceDirectory(List<EvidenceCategoryDTO> evidenceCategoryTree, List<EvidenceDirectoryDTO> evidenceDirectoryTree, String caseId, String parentId) {
if (null == evidenceDirectoryTree){ if (null == evidenceDirectoryTree) {
evidenceDirectoryTree = new ArrayList<>(1); evidenceDirectoryTree = new ArrayList<>(1);
} }
for (EvidenceCategoryDTO evidenceCategoryDTO : evidenceCategoryTree) { for (EvidenceCategoryDTO evidenceCategoryDTO : evidenceCategoryTree) {
List<EvidenceDirectoryDTO> directoryDTOS = evidenceDirectoryTree.stream().filter(evidenceDirectoryDTO -> evidenceDirectoryDTO.getCategoryId().equals(evidenceCategoryDTO.getId())).toList(); List<EvidenceDirectoryDTO> directoryDTOS = evidenceDirectoryTree.stream().filter(evidenceDirectoryDTO -> evidenceDirectoryDTO.getCategoryId().equals(evidenceCategoryDTO.getId())).toList();
if (CollUtil.isEmpty(directoryDTOS)){ if (CollUtil.isEmpty(directoryDTOS)) {
EvidenceDirectory evidenceDirectory = new EvidenceDirectory(); EvidenceDirectory evidenceDirectory = new EvidenceDirectory();
evidenceDirectory.setCaseId(caseId); evidenceDirectory.setCaseId(caseId);
evidenceDirectory.setDirectoryName(evidenceCategoryDTO.getCategoryName()); evidenceDirectory.setDirectoryName(evidenceCategoryDTO.getCategoryName());
@ -1346,7 +1364,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
EvidenceDirectoryDTO parentDTO = CollUtil.getFirst(directoryDTOS); EvidenceDirectoryDTO parentDTO = CollUtil.getFirst(directoryDTOS);
if (CollUtil.isNotEmpty(evidenceCategoryDTO.getChild())) { if (CollUtil.isNotEmpty(evidenceCategoryDTO.getChild())) {
initCaseEvidenceDirectory(evidenceCategoryDTO.getChild(),parentDTO.getChild(),caseId,parentDTO.getId()); initCaseEvidenceDirectory(evidenceCategoryDTO.getChild(), parentDTO.getChild(), caseId, parentDTO.getId());
} }
} }
} }

@ -193,6 +193,7 @@ public class ChatServiceImpl implements ChatService {
chatResVO.setAnswwerMap(answerMap); chatResVO.setAnswwerMap(answerMap);
chatResVO.setType(type); chatResVO.setType(type);
chatResVO.setIntentType(intentType); chatResVO.setIntentType(intentType);
chatResVO.setConversationId(chatReqVO.getConversationId());
return chatResVO; return chatResVO;
} }
@ -270,7 +271,7 @@ public class ChatServiceImpl implements ChatService {
atomicIndexDTO.getEvidentResultList().forEach(evidentIndexResultDTO -> { atomicIndexDTO.getEvidentResultList().forEach(evidentIndexResultDTO -> {
Map<String, String> evidenceMap = new HashMap<>(); Map<String, String> evidenceMap = new HashMap<>();
evidenceMap.put("evidenceName", evidentIndexResultDTO.getEvidenceName()); evidenceMap.put("evidenceName", evidentIndexResultDTO.getEvidenceName());
evidenceMap.put("evidenceId", evidentIndexResultDTO.getIndexId()); evidenceMap.put("evidenceId", evidentIndexResultDTO.getEvidenceId());
evidenceList.add(evidenceMap); evidenceList.add(evidenceMap);
}); });
} }

@ -23,7 +23,7 @@ public class ChatResVO {
private String question; private String question;
private Date questionTime; private Date questionTime;
private String conversationId;
private String answer; private String answer;
private Map<String, Object> answwerMap; private Map<String, Object> answwerMap;
private String type; private String type;

@ -52,13 +52,38 @@ public class CalculationUtil {
// 初始化SpEL解析器 // 初始化SpEL解析器
ExpressionParser parser = new SpelExpressionParser(); ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(); StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("leftOperand", leftOperand); // 判断并转换变量类型
context.setVariable("rightOperand", rightOperand); Object leftValue = parseOperand(leftOperand);
Object rightValue = parseOperand(rightOperand);
context.setVariable("leftOperand", leftValue);
context.setVariable("rightOperand", rightValue);
// 计算结果 // 计算结果
return Boolean.TRUE.equals(parser.parseExpression(expression).getValue(context, Boolean.class)); return Boolean.TRUE.equals(parser.parseExpression(expression).getValue(context, Boolean.class));
} }
/**
*
*
* @param operand
* @return
*/
private static Object parseOperand(String operand) {
if (operand == null) {
return null;
}
try {
// 尝试解析为数字(支持整数和小数)
if (operand.contains(".")) {
return Double.valueOf(operand);
} else {
return Integer.valueOf(operand);
}
} catch (NumberFormatException e) {
// 如果解析失败,返回原始字符串
return operand;
}
}
/** /**
* *

@ -0,0 +1,39 @@
package com.supervision.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import jakarta.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Slf4j
@Component
public class ZipFileUtil {
public static void createZipAndDownload(HttpServletResponse response, String zipFileName, Map<String, InputStream> fileInputStreamMap) throws IOException {
response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(zipFileName, StandardCharsets.UTF_8) + ".zip");
response.setContentType("application/zip");
try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
ZipOutputStream zipOut = new ZipOutputStream(bos)) {
for (Map.Entry<String, InputStream> entry : fileInputStreamMap.entrySet()) {
InputStream inputStream = entry.getValue();
zipOut.putNextEntry(new ZipEntry(entry.getKey()));
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) >= 0) {
zipOut.write(buffer, 0, length);
}
zipOut.closeEntry();
inputStream.close();
}
zipOut.finish();
}
}
}
Loading…
Cancel
Save