From 295e2108eea7f4ef6ed9e851db067fa59afe0f21 Mon Sep 17 00:00:00 2001 From: "DESKTOP-DDTUS3E\\yaxin" Date: Fri, 29 Nov 2024 09:17:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=81=E6=8D=AE=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E8=81=8A=E5=A4=A9=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CaseEvidenceController.java | 6 + .../police/service/CaseEvidenceService.java | 3 + .../service/impl/CaseEvidenceServiceImpl.java | 170 ++++++++++-------- .../police/service/impl/ChatServiceImpl.java | 3 +- .../com/supervision/police/vo/ChatResVO.java | 2 +- .../supervision/utils/CalculationUtil.java | 29 ++- .../com/supervision/utils/ZipFileUtil.java | 39 ++++ 7 files changed, 172 insertions(+), 80 deletions(-) create mode 100644 src/main/java/com/supervision/utils/ZipFileUtil.java diff --git a/src/main/java/com/supervision/police/controller/CaseEvidenceController.java b/src/main/java/com/supervision/police/controller/CaseEvidenceController.java index ab7d153..20be9dd 100644 --- a/src/main/java/com/supervision/police/controller/CaseEvidenceController.java +++ b/src/main/java/com/supervision/police/controller/CaseEvidenceController.java @@ -12,6 +12,7 @@ import com.supervision.police.vo.VerifyEvidenceReqVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -193,4 +194,9 @@ public class CaseEvidenceController { return R.ok("success"); } + @GetMapping("/downloadEvidence") + public void downloadEvidence(@RequestParam String evidenceId, HttpServletResponse response) { + caseEvidenceService.downloadEvidence(evidenceId, response); + } + } diff --git a/src/main/java/com/supervision/police/service/CaseEvidenceService.java b/src/main/java/com/supervision/police/service/CaseEvidenceService.java index 7c7749a..31ac6ab 100644 --- a/src/main/java/com/supervision/police/service/CaseEvidenceService.java +++ b/src/main/java/com/supervision/police/service/CaseEvidenceService.java @@ -10,6 +10,7 @@ import com.supervision.police.dto.*; import com.supervision.police.vo.EvidenceDirectoryReqVO; import com.supervision.police.vo.VerifyEvidenceReqVO; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -163,4 +164,6 @@ public interface CaseEvidenceService extends IService { void updateEvidenceAppendProcessingNewTransaction(String evidenceId, String status,String appendProcessing); void redoExtractAttributes(String caseId, List caseEvidences); + + void downloadEvidence(String evidenceId, HttpServletResponse response); } diff --git a/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java b/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java index 586f19f..23f481c 100644 --- a/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java @@ -23,6 +23,8 @@ import com.supervision.police.mapper.CaseEvidenceMapper; import com.supervision.police.service.*; import com.supervision.police.vo.EvidenceDirectoryReqVO; import com.supervision.police.vo.VerifyEvidenceReqVO; +import com.supervision.utils.ZipFileUtil; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; 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.Transactional; +import java.io.IOException; +import java.io.InputStream; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; @@ -45,17 +49,11 @@ import java.util.stream.Stream; public class CaseEvidenceServiceImpl extends ServiceImpl implements CaseEvidenceService { private final EvidenceFileService evidenceFileService; - private final ComDictionaryService comDictionaryService; - private final CaseStatusManageService caseStatusManageService; - private final FileOcrProcessService fileOcrProcessService; - private final MinioService minioService; - private final ModelCaseService modelCaseService; - @Autowired private LLMExtractService llmExtractService; @Autowired @@ -79,11 +77,11 @@ public class CaseEvidenceServiceImpl extends ServiceImpl wrappers) { - if (CollUtil.isEmpty(wrappers)){ + if (CollUtil.isEmpty(wrappers)) { return true; } List evidenceIds = wrappers.stream().map(EvidenceIdWrapper::getEvidenceId).toList(); @@ -250,7 +248,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl evidenceCategoryTree = evidenceCategoryService.listCategoryTree(caseType); List evidenceDirectoryTree = evidenceDirectoryService.listDirectoryTree(caseId); - initCaseEvidenceDirectory(evidenceCategoryTree,evidenceDirectoryTree,caseId, null); + initCaseEvidenceDirectory(evidenceCategoryTree, evidenceDirectoryTree, caseId, null); } @Override @@ -495,17 +494,17 @@ public class CaseEvidenceServiceImpl extends ServiceImpl allEvidence, Map catagroyMap, List allFile) { String caseType = modelCase.getCaseType(); String id = modelCase.getId(); @@ -517,28 +516,28 @@ public class CaseEvidenceServiceImpl extends ServiceImpl evidenceList) { List 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(); - if (CollUtil.isNotEmpty(ocrFileDTOList)){ + if (CollUtil.isNotEmpty(ocrFileDTOList)) { // 在已经存在的目录下追加文件,只需要重新及进行ocr识别 log.info("ocrAndExtract:开始只进行文件内容识别..."); Map> evidenceMap = ocrFileDTOList.stream().collect(Collectors.groupingBy(EvidenceFileDTO::getEvidenceId)); @@ -678,17 +677,17 @@ public class CaseEvidenceServiceImpl extends ServiceImpl> entry : evidenceMap.entrySet()) { String evidenceId = entry.getKey(); List value = entry.getValue(); for (EvidenceFileDTO evidenceFileDTO : value) { - fileOcrProcessService.multipleTypeOcrProcess(List.of(evidenceFileDTO.getFileId()),evidenceFileDTO.getFileType()); + fileOcrProcessService.multipleTypeOcrProcess(List.of(evidenceFileDTO.getFileId()), evidenceFileDTO.getFileType()); } 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> map = caseEvidencePropertyService.listEvidenceProperty(categoryId, Collections.singletonList(evidenceId)); - if (CollUtil.isEmpty(map.get(categoryId))){ - caseEvidencePropertyService.saveEvidenceProperty(evidenceId, categoryId,CollUtil.getFirst(value).getProperties()); - }else { - caseEvidencePropertyService.updateEvidenceProperty(evidenceId, categoryId,CollUtil.getFirst(value).getProperties()); + if (CollUtil.isEmpty(map.get(categoryId))) { + caseEvidencePropertyService.saveEvidenceProperty(evidenceId, categoryId, CollUtil.getFirst(value).getProperties()); + } else { + caseEvidencePropertyService.updateEvidenceProperty(evidenceId, categoryId, CollUtil.getFirst(value).getProperties()); } @@ -850,7 +849,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl fileList = evidenceDetail.getFileList(); int initOrder = 0; - if (StrUtil.isNotEmpty(batchNo) && !CollUtil.isNotEmpty(fileList)){ + if (StrUtil.isNotEmpty(batchNo) && !CollUtil.isNotEmpty(fileList)) { // 如果批次不为空,则只对当前批次的文件进行排序 initOrder = fileList.size(); } @@ -913,7 +912,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl categoryPromptDTOS = evidenceDirectoryService.listCategoryPrompt(caseId); - Map caseEvidenceMap = caseEvidenceList.stream().map(CaseEvidenceDTO::new).peek(e->e.setDirectoryNamePathValue(rootDirectory)).collect(Collectors.toMap(CaseEvidenceDTO::getId, Function.identity())); + Map caseEvidenceMap = caseEvidenceList.stream().map(CaseEvidenceDTO::new).peek(e -> e.setDirectoryNamePathValue(rootDirectory)).collect(Collectors.toMap(CaseEvidenceDTO::getId, Function.identity())); Map categoryPromptMap = categoryPromptDTOS.stream().collect(Collectors.toMap(CategoryPromptDTO::getDirectoryId, k -> k, (v1, v2) -> v1)); Iterator iterator = evidenceDirectoryDTOS.iterator(); @@ -936,7 +935,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl> categoryMapEvidence = new HashMap<>(); for (CaseEvidence caseEvidence : caseEvidences) { EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId()); - if (null != directory && StrUtil.isNotEmpty(directory.getCategoryId())){ + if (null != directory && StrUtil.isNotEmpty(directory.getCategoryId())) { List evidenceIds = categoryMapEvidence.getOrDefault(directory.getCategoryId(), new ArrayList<>()); evidenceIds.add(caseEvidence.getId()); categoryMapEvidence.put(directory.getCategoryId(), evidenceIds); @@ -950,15 +949,33 @@ public class CaseEvidenceServiceImpl extends ServiceImpl attributesDtos = map.get(caseEvidence.getId()); // 兼容老数据 - if (CollUtil.isNotEmpty(attributesDtos)){ + if (CollUtil.isNotEmpty(attributesDtos)) { caseEvidence.setProperty(attributesDtos); } } } + @Override + public void downloadEvidence(String evidenceId, HttpServletResponse response) { + List evidenceFileDTOList = evidenceFileService.listFileInfo(List.of(evidenceId)); + Map 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 案件证据列表 */ private void rebuildEvidenceProperties(EvidenceDirectoryDTO rootDirectory, List caseEvidenceList) { @@ -966,33 +983,33 @@ public class CaseEvidenceServiceImpl extends ServiceImpl directoryIdMapCategoryId = caseEvidenceList.stream() .filter(e -> StrUtil.isNotEmpty(e.getDirectoryId()) && null != rootDirectory.findDirectory(e.getDirectoryId())) .map(CaseEvidence::getDirectoryId).distinct().collect( - Collectors.toMap(directoryId -> directoryId,di-> rootDirectory.findDirectory(di).getCategoryId())); + Collectors.toMap(directoryId -> directoryId, di -> rootDirectory.findDirectory(di).getCategoryId())); Map> categoryIdMapExtractAttributes = new HashMap<>(); for (CaseEvidence caseEvidence : caseEvidenceList) { EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId()); - if (null == directory || StrUtil.isEmpty(directory.getCategoryId())){ + if (null == directory || StrUtil.isEmpty(directory.getCategoryId())) { continue; } String categoryId = directory.getCategoryId(); - if (!categoryIdMapExtractAttributes.containsKey(categoryId)){ + if (!categoryIdMapExtractAttributes.containsKey(categoryId)) { categoryIdMapExtractAttributes.put(categoryId, caseEvidencePropertyService.findExtractAttributes(categoryId)); } } for (CaseEvidence caseEvidence : caseEvidenceList) { - if (StrUtil.isEmpty(caseEvidence.getDirectoryId())){ + if (StrUtil.isEmpty(caseEvidence.getDirectoryId())) { continue; } String categoryId = directoryIdMapCategoryId.get(caseEvidence.getDirectoryId()); - if (StrUtil.isEmpty(categoryId)){ + if (StrUtil.isEmpty(categoryId)) { continue; } List merged = mergeExtractAttributes(caseEvidence.getProperty(), categoryIdMapExtractAttributes.get(categoryId)); - if (null != merged){ + if (null != merged) { merged = merged.stream().filter(Objects::nonNull).peek(e -> { if (!checkExtractAttributes(e)) { e.setAttrValue(null); @@ -1006,13 +1023,13 @@ public class CaseEvidenceServiceImpl extends ServiceImpl mergeExtractAttributes(List property, List attributesTemplates) { - if (CollUtil.isEmpty(attributesTemplates) || CollUtil.isEmpty(property)){ + if (CollUtil.isEmpty(attributesTemplates) || CollUtil.isEmpty(property)) { return attributesTemplates; } for (NotePromptExtractAttributesDto attributesTemplate : attributesTemplates) { String attrName = attributesTemplate.getAttrName(); for (NotePromptExtractAttributesDto attributesDto : property) { - if (StrUtil.equals(attributesDto.getAttrName(), attrName)){ + if (StrUtil.equals(attributesDto.getAttrName(), attrName)) { attributesTemplate.setAttrValue(attributesDto.getAttrValue()); break; } @@ -1184,7 +1201,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl evidenceCategoryTree, List evidenceDirectoryTree,String caseId,String parentId) { - if (null == evidenceDirectoryTree){ + private void initCaseEvidenceDirectory(List evidenceCategoryTree, List evidenceDirectoryTree, String caseId, String parentId) { + if (null == evidenceDirectoryTree) { evidenceDirectoryTree = new ArrayList<>(1); } for (EvidenceCategoryDTO evidenceCategoryDTO : evidenceCategoryTree) { List directoryDTOS = evidenceDirectoryTree.stream().filter(evidenceDirectoryDTO -> evidenceDirectoryDTO.getCategoryId().equals(evidenceCategoryDTO.getId())).toList(); - if (CollUtil.isEmpty(directoryDTOS)){ + if (CollUtil.isEmpty(directoryDTOS)) { EvidenceDirectory evidenceDirectory = new EvidenceDirectory(); evidenceDirectory.setCaseId(caseId); evidenceDirectory.setDirectoryName(evidenceCategoryDTO.getCategoryName()); @@ -1346,7 +1364,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl { Map evidenceMap = new HashMap<>(); evidenceMap.put("evidenceName", evidentIndexResultDTO.getEvidenceName()); - evidenceMap.put("evidenceId", evidentIndexResultDTO.getIndexId()); + evidenceMap.put("evidenceId", evidentIndexResultDTO.getEvidenceId()); evidenceList.add(evidenceMap); }); } diff --git a/src/main/java/com/supervision/police/vo/ChatResVO.java b/src/main/java/com/supervision/police/vo/ChatResVO.java index f33728f..87da635 100644 --- a/src/main/java/com/supervision/police/vo/ChatResVO.java +++ b/src/main/java/com/supervision/police/vo/ChatResVO.java @@ -23,7 +23,7 @@ public class ChatResVO { private String question; private Date questionTime; - + private String conversationId; private String answer; private Map answwerMap; private String type; diff --git a/src/main/java/com/supervision/utils/CalculationUtil.java b/src/main/java/com/supervision/utils/CalculationUtil.java index 83b5afb..79ebd98 100644 --- a/src/main/java/com/supervision/utils/CalculationUtil.java +++ b/src/main/java/com/supervision/utils/CalculationUtil.java @@ -52,13 +52,38 @@ public class CalculationUtil { // 初始化SpEL解析器 ExpressionParser parser = new SpelExpressionParser(); 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)); } + /** + * 辅助方法:动态解析操作数类型 + * + * @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; + } + } /** * 计算布尔值集合的逻辑运算结果 diff --git a/src/main/java/com/supervision/utils/ZipFileUtil.java b/src/main/java/com/supervision/utils/ZipFileUtil.java new file mode 100644 index 0000000..6df7a9e --- /dev/null +++ b/src/main/java/com/supervision/utils/ZipFileUtil.java @@ -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 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 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(); + } + } +}