From 2d4332bfcf3f027bac3ff0d5d4e21e62e9bc0fd7 Mon Sep 17 00:00:00 2001 From: xueqingkun Date: Wed, 16 Oct 2024 11:30:15 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E8=AF=81=E6=8D=AE=E6=94=B9=E9=80=A0?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CaseEvidenceController.java | 84 ++- .../police/domain/EvidenceCategory.java | 1 + .../police/domain/EvidenceFile.java | 7 +- .../police/dto/CaseEvidenceDTO.java | 3 + .../police/dto/CaseEvidenceDetailDTO.java | 28 + .../police/dto/CategoryPromptDTO.java | 46 ++ .../police/dto/DirectoryFileDTO.java | 30 ++ .../police/dto/EvidenceCategoryDTO.java | 47 ++ .../police/dto/EvidenceDirectoryDTO.java | 166 ++++++ .../police/dto/EvidenceFileDTO.java | 35 +- .../police/dto/EvidenceProcessDTO.java | 127 +++++ .../police/dto/EvidenceVerifyDTO.java | 20 + .../police/mapper/EvidenceCategoryMapper.java | 5 + .../mapper/EvidenceDirectoryMapper.java | 4 + .../police/mapper/EvidenceFileMapper.java | 2 + .../police/service/CaseEvidenceService.java | 71 ++- .../service/EvidenceDirectoryService.java | 35 ++ .../police/service/EvidenceFileService.java | 2 + .../service/impl/CaseEvidenceServiceImpl.java | 498 +++++++++++++++++- .../impl/EvidenceCategoryServiceImpl.java | 30 +- .../impl/EvidenceDirectoryServiceImpl.java | 77 +++ .../service/impl/EvidenceFileServiceImpl.java | 5 + .../service/impl/ModelCaseServiceImpl.java | 22 +- .../resources/mapper/CaseEvidenceMapper.xml | 13 +- .../mapper/EvidenceCategoryMapper.xml | 17 + .../mapper/EvidenceDirectoryMapper.xml | 14 + .../resources/mapper/EvidenceFileMapper.xml | 18 + .../demo/FuHsiApplicationTests.java | 35 +- 28 files changed, 1394 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/supervision/police/dto/CategoryPromptDTO.java create mode 100644 src/main/java/com/supervision/police/dto/DirectoryFileDTO.java create mode 100644 src/main/java/com/supervision/police/dto/EvidenceDirectoryDTO.java create mode 100644 src/main/java/com/supervision/police/dto/EvidenceProcessDTO.java create mode 100644 src/main/java/com/supervision/police/dto/EvidenceVerifyDTO.java diff --git a/src/main/java/com/supervision/police/controller/CaseEvidenceController.java b/src/main/java/com/supervision/police/controller/CaseEvidenceController.java index 176740c..7ab0f89 100644 --- a/src/main/java/com/supervision/police/controller/CaseEvidenceController.java +++ b/src/main/java/com/supervision/police/controller/CaseEvidenceController.java @@ -3,11 +3,9 @@ package com.supervision.police.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Assert; import com.supervision.common.domain.R; -import com.supervision.police.dto.EvidenceCategoryDTO; -import com.supervision.police.dto.CaseEvidenceDetailDTO; -import com.supervision.police.dto.EvidenceIdWrapper; +import com.supervision.police.domain.EvidenceDirectory; +import com.supervision.police.dto.*; import com.supervision.police.service.CaseEvidenceService; -import com.supervision.police.dto.CaseEvidenceDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -64,9 +62,85 @@ public class CaseEvidenceController { @Operation(summary = "查询案件证据分类树") @GetMapping("/category/tree") - public R> listCategoryTree(@RequestParam(defaultValue = "1") + public R> listCategoryTree(@RequestParam(name = "caseType",defaultValue = "1") @Parameter(name = "caseType",description = "案件类型") String caseType) { List list = caseEvidenceService.listCategoryTree(caseType); return R.ok(list); } + + + @Operation(summary = "查询案件证据目录树") + @GetMapping("/directory/tree") + public R> listDirectoryTree(@RequestParam("caseId") + @Parameter(name = "caseId",description = "案件id") String caseId) { + + List list = caseEvidenceService.listDirectoryTree(caseId); + return R.ok(list); + } + + @Operation(summary = "更新证据目录信息") + @PostMapping("/directory/update") + public R updateDirectory(@RequestBody EvidenceDirectory evidenceDirectory) { + + Boolean success = caseEvidenceService.updateDirectory(evidenceDirectory); + return R.ok(success); + } + + @Operation(summary = "移动文件到指定目录") + @PostMapping("/directory/file/mv") + public R moveFile(@RequestBody DirectoryFileDTO evidenceFileDTO) { + + Boolean success = caseEvidenceService.moveFile(evidenceFileDTO); + return R.ok(success); + } + + @Operation(summary = "删除证据文件") + @PostMapping("/directory/file/rm") + public R removeFile(@RequestBody DirectoryFileDTO evidenceFileDTO) { + + Boolean success = caseEvidenceService.removeFile(evidenceFileDTO); + return R.ok(success); + } + + @Operation(summary = "删除文件目录") + @PostMapping("/directory/directory/rm") + public R removeDirectory(@RequestBody List directoryIdList) { + + Boolean success = caseEvidenceService.removeDirectory(directoryIdList); + return R.ok(success); + } + + @Operation(summary = "证据识别并提取") + @PostMapping("/ocrAndExtract") + public R ocrAndExtract(@RequestBody List evidenceFileDTOS, @RequestParam(name = "caseId") String caseId) { + + String batchNo = caseEvidenceService.ocrAndExtract(caseId, evidenceFileDTOS); + return R.ok(batchNo); + } + + @Operation(summary = "识别并提取列表") + @GetMapping("/ocrAndExtract/list") + public R> listOcrAndExtract(@RequestParam("caseId") String caseId, + @RequestParam(value = "batchNo",required = false) String batchNo) { + + List list = caseEvidenceService.listOcrAndExtract(caseId,batchNo); + return R.ok(list); + } + + @Operation(summary = "核实证据") + @GetMapping("/caseEvidence/verify") + public R> verifyEvidence(@RequestBody List evidenceVerifyDTOS, + @RequestParam("caseId") String caseId, + @RequestParam(value = "batchNo",required = false) String batchNo) { + caseEvidenceService.verifyEvidence(evidenceVerifyDTOS,caseId,batchNo); + return R.ok(); + } + + @Operation(summary = "查询证据详情-结果以树的方式展示") + @GetMapping("/caseEvidence/details") + public R> evidenceDetails(@RequestParam("caseId") String caseId, + @RequestParam(value = "batchNo",required = false) String batchNo) { + List evidenceDirectoryDTOS = caseEvidenceService.evidenceDetails(caseId,batchNo); + return R.ok(evidenceDirectoryDTOS); + } } diff --git a/src/main/java/com/supervision/police/domain/EvidenceCategory.java b/src/main/java/com/supervision/police/domain/EvidenceCategory.java index 24702cb..b070dee 100644 --- a/src/main/java/com/supervision/police/domain/EvidenceCategory.java +++ b/src/main/java/com/supervision/police/domain/EvidenceCategory.java @@ -39,6 +39,7 @@ public class EvidenceCategory implements Serializable { /** * 图标url */ + @TableField("icon_url") private String iconURl; /** diff --git a/src/main/java/com/supervision/police/domain/EvidenceFile.java b/src/main/java/com/supervision/police/domain/EvidenceFile.java index 73fb8da..c0c2e7a 100644 --- a/src/main/java/com/supervision/police/domain/EvidenceFile.java +++ b/src/main/java/com/supervision/police/domain/EvidenceFile.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -44,6 +43,12 @@ public class EvidenceFile implements Serializable { */ private String directoryId; + + /** + * 批次号 + */ + private String batchNo; + /** * 创建人ID */ diff --git a/src/main/java/com/supervision/police/dto/CaseEvidenceDTO.java b/src/main/java/com/supervision/police/dto/CaseEvidenceDTO.java index 94cc44c..abcc9c8 100644 --- a/src/main/java/com/supervision/police/dto/CaseEvidenceDTO.java +++ b/src/main/java/com/supervision/police/dto/CaseEvidenceDTO.java @@ -48,6 +48,9 @@ public class CaseEvidenceDTO { @Schema(description = "案件证据文件列表") private List evidenceFileList = new ArrayList<>(); + @Schema(description = "目录id") + private String directoryId; + public CaseEvidence toCaseEvidence(){ CaseEvidence caseEvidence = new CaseEvidence(); diff --git a/src/main/java/com/supervision/police/dto/CaseEvidenceDetailDTO.java b/src/main/java/com/supervision/police/dto/CaseEvidenceDetailDTO.java index 97edc2e..b8e9489 100644 --- a/src/main/java/com/supervision/police/dto/CaseEvidenceDetailDTO.java +++ b/src/main/java/com/supervision/police/dto/CaseEvidenceDetailDTO.java @@ -41,6 +41,11 @@ public class CaseEvidenceDetailDTO { @Schema(description = "乙方") private String partyB; + @Schema(description = "案件证据目录id") + private String directoryId; + + private String caseId; + @Schema(description = "案件证据文件信息列表") private List fileList; @@ -51,6 +56,13 @@ public class CaseEvidenceDetailDTO { @Schema(description = "案件证据属性") private Map property= new HashMap<>(); + /** + * 数据更新状态 -1:无需更新 0:删除 1:新增 + */ + private String updateStatus = "-1"; + + private String processStatus; + public CaseEvidenceDetailDTO() { } @@ -88,4 +100,20 @@ public class CaseEvidenceDetailDTO { property.put(fileEvidenceProperty.getPropertyName(),fileEvidenceProperty.getPropertyValue()); } } + + public CaseEvidence toCaseEvidence(){ + + CaseEvidence caseEvidence = new CaseEvidence(); + caseEvidence.setId(this.id); + caseEvidence.setCaseId(this.caseId); + caseEvidence.setEvidenceName(this.evidenceName); + caseEvidence.setEvidenceType(this.evidenceType); + caseEvidence.setDirectoryId(this.directoryId); + caseEvidence.setProvider(this.provider); + caseEvidence.setPartyA(this.partyA); + caseEvidence.setPartyB(this.partyB); + caseEvidence.setProperty(this.property); + return caseEvidence; + + } } diff --git a/src/main/java/com/supervision/police/dto/CategoryPromptDTO.java b/src/main/java/com/supervision/police/dto/CategoryPromptDTO.java new file mode 100644 index 0000000..5de0f6b --- /dev/null +++ b/src/main/java/com/supervision/police/dto/CategoryPromptDTO.java @@ -0,0 +1,46 @@ +package com.supervision.police.dto; + +import lombok.Data; + +@Data +public class CategoryPromptDTO { + /** + * 目录id + */ + private String directoryId; + + /** + * 目录名称 + */ + private String directoryName; + + /** + * 证据分类id + */ + private String categoryId; + + /** + * 证据分类名称 + */ + private String categoryName; + + /** + * 提示id + */ + private String promptId; + + /** + * 提示名称 + */ + private String promptName; + + /** + * 提示类型 + */ + private String promptType; + + /** + * 提示内容 + */ + private String prompt; +} diff --git a/src/main/java/com/supervision/police/dto/DirectoryFileDTO.java b/src/main/java/com/supervision/police/dto/DirectoryFileDTO.java new file mode 100644 index 0000000..9d5135f --- /dev/null +++ b/src/main/java/com/supervision/police/dto/DirectoryFileDTO.java @@ -0,0 +1,30 @@ +package com.supervision.police.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 证据文件DTO + */ +@Data +public class DirectoryFileDTO { + + + /** + * 案件id + */ + private String caseId; + + + /** + * 文件id集合 + */ + private List fileIdList; + + /** + * 证据目录id + */ + private String directoryId; + +} diff --git a/src/main/java/com/supervision/police/dto/EvidenceCategoryDTO.java b/src/main/java/com/supervision/police/dto/EvidenceCategoryDTO.java index 5de5e92..420dfa8 100644 --- a/src/main/java/com/supervision/police/dto/EvidenceCategoryDTO.java +++ b/src/main/java/com/supervision/police/dto/EvidenceCategoryDTO.java @@ -1,5 +1,7 @@ package com.supervision.police.dto; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.supervision.police.domain.EvidenceCategory; import lombok.Data; @@ -32,11 +34,32 @@ public class EvidenceCategoryDTO { */ private String parentId; + /** + * 提示词名称 + */ + private String promptName; + /** * 子级分类 */ private List child; + /** + * 分类层级 + */ + private int level = -1; + + /** + * 分类层级 + */ + private String categoryLevel; + + + /** + * 分类id + */ + private String categoryId; + public EvidenceCategoryDTO() { } @@ -47,4 +70,28 @@ public class EvidenceCategoryDTO { this.parentId = category.getParentId(); this.child = new ArrayList<>(); } + + /** + * 获取分类的层级 + * @param categoryId 分类id + * @param currentLevel 当前层级 + * @return 分类层级 + */ + public int evalLevel(String categoryId, int currentLevel) { + if (StrUtil.isEmpty(categoryId)){ + return -1; + } + if (StrUtil.equals(this.id, categoryId)){ + return currentLevel; + } + if (CollUtil.isNotEmpty(this.child)){ + for (EvidenceCategoryDTO evidenceCategoryDTO : child) { + int level = evidenceCategoryDTO.evalLevel(categoryId, currentLevel + 1); + if (level != -1){ + return level; + } + } + } + return -1; + } } diff --git a/src/main/java/com/supervision/police/dto/EvidenceDirectoryDTO.java b/src/main/java/com/supervision/police/dto/EvidenceDirectoryDTO.java new file mode 100644 index 0000000..c89423f --- /dev/null +++ b/src/main/java/com/supervision/police/dto/EvidenceDirectoryDTO.java @@ -0,0 +1,166 @@ +package com.supervision.police.dto; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.supervision.police.domain.EvidenceDirectory; +import lombok.Data; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 案件证据目录 + */ +@Data +public class EvidenceDirectoryDTO { + + /** + * 目录id + */ + private String id; + + /** + * 目录名 + */ + private String directoryName; + + /** + * 父级目录id + */ + private String parentId; + + /** + * 目录分类 + */ + private String categoryId; + + /** + * 子目录 + */ + private List child; + + + /** + * 文件id,接收前端传入的参数 + */ + private List fileIdList = new ArrayList<>(); + + /** + * 文件信息 + */ + private List fileInfoList = new ArrayList<>(); + + + private int level = -1; + + + public EvidenceDirectoryDTO() { + } + + public EvidenceDirectoryDTO(EvidenceDirectory directory){ + if (directory == null){ + return; + } + this.id = directory.getId(); + this.directoryName = directory.getDirectoryName(); + this.categoryId = directory.getCategoryId(); + this.parentId = directory.getParentId(); + this.child = new ArrayList<>(); + } + + public EvidenceDirectoryDTO findDirectory(String directoryId){ + + if (StrUtil.isEmpty(directoryId)){ + return null; + } + + if (StrUtil.equals(this.id, directoryId)){ + return this; + } + if (CollUtil.isNotEmpty(this.getChild())){ + for (EvidenceDirectoryDTO evidenceDirectoryDTO : this.getChild()) { + EvidenceDirectoryDTO directoryDTO = evidenceDirectoryDTO.findDirectory(directoryId); + if (directoryDTO != null){ + return directoryDTO; + } + } + } + return null; + } + + public List listAllFileId(){ + List fileIdList = new ArrayList<>(); + if (CollUtil.isNotEmpty(this.fileIdList)){ + fileIdList.addAll(this.fileIdList); + } + if (CollUtil.isNotEmpty(this.child)){ + for (EvidenceDirectoryDTO child : this.getChild()) { + fileIdList.addAll(child.listAllFileId()); + } + + } + return fileIdList; + } + + public List listAllDirectory(){ + List directoryList = new ArrayList<>(); + directoryList.add(this); + if (CollUtil.isNotEmpty(this.child)){ + for (EvidenceDirectoryDTO child : this.getChild()) { + directoryList.addAll(child.listAllDirectory()); + } + + } + return directoryList; + } + + public int evalLevel(String id, int currentLevel) { + if (StrUtil.isEmpty(id)){ + return -1; + } + if (StrUtil.equals(this.id, id)){ + return currentLevel; + } + if (CollUtil.isNotEmpty(this.child)){ + for (EvidenceDirectoryDTO evidenceCategoryDTO : child) { + int level = evidenceCategoryDTO.evalLevel(id, currentLevel + 1); + if (level != -1){ + return level; + } + } + } + return -1; + } + + public void appendChildDirectory(){ + if (CollUtil.isNotEmpty(this.child)){ + for (EvidenceDirectoryDTO directoryDTO : child) { + EvidenceFileDTO evidenceFileDTO = new EvidenceFileDTO(); + evidenceFileDTO.setFileId(directoryDTO.getId()); + evidenceFileDTO.setDirectoryId(this.id); + evidenceFileDTO.setDirectoryFlag("1"); + evidenceFileDTO.setFileName(directoryDTO.getDirectoryName()); + this.fileInfoList.add(evidenceFileDTO); + + // 递归子级目录 + directoryDTO.appendChildDirectory(); + } + } + } + + public void appendChildFile(Map> fileMap){ + List evidenceFileDTOS = fileMap.get(this.id); + if (CollUtil.isNotEmpty(evidenceFileDTOS)){ + this.fileInfoList.addAll(evidenceFileDTOS); + }else { + if (CollUtil.isNotEmpty(this.getChild())){ + for (EvidenceDirectoryDTO directoryDTO : this.child) { + directoryDTO.appendChildFile(fileMap); + } + } + } + + } +} diff --git a/src/main/java/com/supervision/police/dto/EvidenceFileDTO.java b/src/main/java/com/supervision/police/dto/EvidenceFileDTO.java index 9694b65..5c83076 100644 --- a/src/main/java/com/supervision/police/dto/EvidenceFileDTO.java +++ b/src/main/java/com/supervision/police/dto/EvidenceFileDTO.java @@ -1,5 +1,6 @@ package com.supervision.police.dto; +import com.supervision.police.domain.CaseEvidence; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -9,7 +10,7 @@ public class EvidenceFileDTO { @Schema(description = "案件证据id") private String evidenceId; - @Schema(description = "文件id集合") + @Schema(description = "文件id") private String fileId; @Schema(description = "文件名称") @@ -18,10 +19,42 @@ public class EvidenceFileDTO { @Schema(description = "文件类型") private String fileType; + @Schema(description = "文件大小") + private int fileSize; + @Schema(description = "文件预览图id") private String drawImgId; @Schema(description = "文件识别内容") private String ocrText; + @Schema(description = "目录id") + private String directoryId; + + @Schema(description = "数据更新状态 -1:无需更新 0:删除 1:新增 2: 更新") + private String updateStatus = "-1"; + + @Schema(description = "排序 升序") + private int rank; + + @Schema(description = "是否是目录文件 0:否 1:是") + private String directoryFlag; + + @Schema(description = "批次号") + private String batchNo; + + + /** + * 案件证据信息 + * 当证据在二级目录时,一个看作一个证据,当证据在三级目录时一个目录看作一个整体的证据 + */ + private CaseEvidence evidenceInfo; + + + /** + * 提示信息 + */ + private CategoryPromptDTO prompt; + + } diff --git a/src/main/java/com/supervision/police/dto/EvidenceProcessDTO.java b/src/main/java/com/supervision/police/dto/EvidenceProcessDTO.java new file mode 100644 index 0000000..ac2bbf7 --- /dev/null +++ b/src/main/java/com/supervision/police/dto/EvidenceProcessDTO.java @@ -0,0 +1,127 @@ +package com.supervision.police.dto; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.unit.DataSizeUtil; +import cn.hutool.core.util.StrUtil; +import com.supervision.police.domain.EvidenceCategory; +import lombok.Data; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 证据处理DTO + */ +@Data +public class EvidenceProcessDTO { + + /** + * 证据id + */ + private String evidenceId; + + + /** + * 证据名称 + */ + private String evidenceName; + + /** + * 附件名称 + */ + private String attachmentName; + + /** + * 模板id + */ + private String templateId; + + + /** + * 模板类型名称 + */ + private String templateName; + + /** + * 证据类型 + */ + private String evidenceType; + + /** + * 证据类型名称 + */ + private String evidenceTypeName; + + + /** + * 附件大小 + */ + private String attachmentSize; + + /** + * 处理状态 + */ + private String status; + + /** + * 目录id + */ + private String directoryId; + + public EvidenceProcessDTO() { + } + + public EvidenceProcessDTO(CaseEvidenceDetailDTO caseEvidence) { + this.evidenceId = caseEvidence.getId(); + this.evidenceName = caseEvidence.getEvidenceName(); + if (CollUtil.isNotEmpty(caseEvidence.getFileList())){ + this.attachmentName = caseEvidence.getFileList() + .stream().map(EvidenceFileDTO::getFileName).collect(Collectors.joining(",")); + Integer sum = caseEvidence.getFileList().stream().map(EvidenceFileDTO::getFileSize).reduce(0, Integer::sum); + this.attachmentSize = DataSizeUtil.format(sum); + } + this.evidenceType = caseEvidence.getEvidenceType(); + this.status = caseEvidence.getProcessStatus(); + } + + + public void setTemplateInfo(List directoryList,List categoryList){ + + if (CollUtil.isEmpty(directoryList)){ + return; + } + + EvidenceDirectoryDTO directory = null; + for (EvidenceDirectoryDTO directoryDTO : directoryList) { + directory = directoryDTO.findDirectory(this.directoryId); + if (null != directory){ + break; + } + } + if (null == directory){ + return; + } + + Map categoryMap = categoryList.stream().collect(Collectors.toMap(EvidenceCategory::getId, v -> v)); + this.templateId = directory.getCategoryId(); + EvidenceCategory category = categoryMap.get(directory.getCategoryId()); + if (null != category){ + this.templateName = category.getCategoryName(); + if (directory.getLevel()== 2){ + this.evidenceTypeName = category.getCategoryName(); + } + if (directory.getLevel() == 3){ + String parentId = category.getParentId(); + if (StrUtil.isNotEmpty(parentId)){ + EvidenceCategory parentCategory = categoryMap.get(parentId); + if (null != parentCategory){ + this.evidenceTypeName = StrUtil.join(" / ", parentCategory.getCategoryName(), category.getCategoryName()); + } + } + this.templateId = directory.getParentId(); + } + } + + } +} diff --git a/src/main/java/com/supervision/police/dto/EvidenceVerifyDTO.java b/src/main/java/com/supervision/police/dto/EvidenceVerifyDTO.java new file mode 100644 index 0000000..22d2f87 --- /dev/null +++ b/src/main/java/com/supervision/police/dto/EvidenceVerifyDTO.java @@ -0,0 +1,20 @@ +package com.supervision.police.dto; + +import lombok.Data; + +import java.util.Map; + +/** + * 证据校验DTO + */ +@Data +public class EvidenceVerifyDTO { + + private String evidenceId; + + private String fileId; + + private String ocrText; + + private Map properties; +} diff --git a/src/main/java/com/supervision/police/mapper/EvidenceCategoryMapper.java b/src/main/java/com/supervision/police/mapper/EvidenceCategoryMapper.java index 80520fc..39217ef 100644 --- a/src/main/java/com/supervision/police/mapper/EvidenceCategoryMapper.java +++ b/src/main/java/com/supervision/police/mapper/EvidenceCategoryMapper.java @@ -2,6 +2,9 @@ package com.supervision.police.mapper; import com.supervision.police.domain.EvidenceCategory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.supervision.police.dto.EvidenceCategoryDTO; + +import java.util.List; /** * @author Administrator @@ -11,6 +14,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface EvidenceCategoryMapper extends BaseMapper { + + List listCategoryDTO(String caseType); } diff --git a/src/main/java/com/supervision/police/mapper/EvidenceDirectoryMapper.java b/src/main/java/com/supervision/police/mapper/EvidenceDirectoryMapper.java index 5fa1160..e9b8571 100644 --- a/src/main/java/com/supervision/police/mapper/EvidenceDirectoryMapper.java +++ b/src/main/java/com/supervision/police/mapper/EvidenceDirectoryMapper.java @@ -2,6 +2,9 @@ package com.supervision.police.mapper; import com.supervision.police.domain.EvidenceDirectory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.supervision.police.dto.CategoryPromptDTO; + +import java.util.List; /** * @author Administrator @@ -11,6 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface EvidenceDirectoryMapper extends BaseMapper { + List listCategoryPrompt(String caseId); } diff --git a/src/main/java/com/supervision/police/mapper/EvidenceFileMapper.java b/src/main/java/com/supervision/police/mapper/EvidenceFileMapper.java index 16ead4c..b4edd06 100644 --- a/src/main/java/com/supervision/police/mapper/EvidenceFileMapper.java +++ b/src/main/java/com/supervision/police/mapper/EvidenceFileMapper.java @@ -15,6 +15,8 @@ import java.util.List; public interface EvidenceFileMapper extends BaseMapper { List listFileInfo(List evidenceIds); + + List listFileInfoByCaseId(String caseId); } diff --git a/src/main/java/com/supervision/police/service/CaseEvidenceService.java b/src/main/java/com/supervision/police/service/CaseEvidenceService.java index e9048e5..ea507dd 100644 --- a/src/main/java/com/supervision/police/service/CaseEvidenceService.java +++ b/src/main/java/com/supervision/police/service/CaseEvidenceService.java @@ -3,9 +3,8 @@ package com.supervision.police.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.supervision.police.domain.CaseEvidence; -import com.supervision.police.dto.EvidenceCategoryDTO; -import com.supervision.police.dto.CaseEvidenceDTO; -import com.supervision.police.dto.CaseEvidenceDetailDTO; +import com.supervision.police.domain.EvidenceDirectory; +import com.supervision.police.dto.*; import java.util.List; @@ -40,6 +39,9 @@ public interface CaseEvidenceService extends IService { */ List queryEvidenceList(String caseId); + + List queryEvidenceList(String caseId,String batchNo); + /** * 分页查询案件证据信息列表 * @param caseId 案件id @@ -58,4 +60,67 @@ public interface CaseEvidenceService extends IService { * @param evidenceId 证据id */ void evidenceAnalysis(String evidenceId); + + /** + * 查询案件证据目录树 + * @param caseId 案件id + * @return + */ + List listDirectoryTree(String caseId); + + /** + * 初始化案件证据目录 + * @param caseId 案件id + * @param caseType 案件类型 + */ + void initCaseEvidenceDirectory(String caseId,String caseType); + + /** + * 更新案件证据目录 + * @param evidenceDirectory 目录信息 + * @return true / false + */ + Boolean updateDirectory(EvidenceDirectory evidenceDirectory); + + /** + * 移动文件到指定目录 + * @param evidenceFileDTO 文件信息 + * @return true / false + */ + Boolean moveFile(DirectoryFileDTO evidenceFileDTO); + + /** + * 删除文件 + * @param evidenceFileDTO 文件信息 + * @return true / false + */ + Boolean removeFile(DirectoryFileDTO evidenceFileDTO); + + /** + * 删除目录 + * @param directoryIdList 目录id集合 + * @return + */ + Boolean removeDirectory(List directoryIdList); + + /** + * 证据识别并提取 + * @param evidenceFileDTOS 文件信息 + */ + String ocrAndExtract(String caseId, List evidenceFileDTOS); + + + String updateCaseEvidence(List caseEvidenceDetailDTOList); + + /** + * 证据识别并提取列表 + * @param caseId 案件id + * @param batchNo 批次号 + * @return + */ + List listOcrAndExtract(String caseId,String batchNo); + + void verifyEvidence(List evidenceVerifyDTOS,String caseId,String batchNo); + + List evidenceDetails(String caseId, String batchNo); } diff --git a/src/main/java/com/supervision/police/service/EvidenceDirectoryService.java b/src/main/java/com/supervision/police/service/EvidenceDirectoryService.java index 2f59621..0d6fd6b 100644 --- a/src/main/java/com/supervision/police/service/EvidenceDirectoryService.java +++ b/src/main/java/com/supervision/police/service/EvidenceDirectoryService.java @@ -2,6 +2,11 @@ package com.supervision.police.service; import com.supervision.police.domain.EvidenceDirectory; import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.police.dto.CategoryPromptDTO; +import com.supervision.police.dto.EvidenceDirectoryDTO; +import com.supervision.police.dto.EvidenceFileDTO; + +import java.util.List; /** * @author Administrator @@ -10,4 +15,34 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface EvidenceDirectoryService extends IService { + /** + * 获取案件目录树 + * @param caseId 案件id + * @return + */ + List listDirectoryTree(String caseId); + + /** + * 获取目录级别信息 + * @param directoryId 目录id + * @param evidenceDirectoryDTOS 案件目录列表 + * @return 目录级别信息 + */ + EvidenceDirectoryDTO findDirectoryById(String directoryId, List evidenceDirectoryDTOS); + + /** + * 追加文件信息 + * @param directoryDTOS 目录信息列表树 + * @param fileInfoList 文件信息列表 + */ + + void appendFile(List directoryDTOS, List fileInfoList); + + + /** + * 获取目录提示词 + * @param caseId 案件id + * @return 目录提示词 + */ + List listCategoryPrompt(String caseId); } diff --git a/src/main/java/com/supervision/police/service/EvidenceFileService.java b/src/main/java/com/supervision/police/service/EvidenceFileService.java index 5b97e0d..4374704 100644 --- a/src/main/java/com/supervision/police/service/EvidenceFileService.java +++ b/src/main/java/com/supervision/police/service/EvidenceFileService.java @@ -16,4 +16,6 @@ public interface EvidenceFileService extends IService { List listFileInfo(List evidenceIds); List listByFileIds(List fileIds); + + List listFileInfoByCaseId(String caseId); } 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 bcbdd62..f51d5a4 100644 --- a/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java @@ -1,11 +1,15 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.supervision.minio.domain.MinioFile; +import com.supervision.minio.service.MinioService; import com.supervision.police.dto.*; import com.supervision.police.service.*; import com.supervision.police.domain.CaseEvidence; @@ -18,11 +22,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @@ -38,6 +44,10 @@ public class CaseEvidenceServiceImpl extends ServiceImpl queryEvidenceList(String caseId, String batchNo) { + List caseEvidenceDetailDTOS = queryEvidenceList(caseId); + if (StrUtil.isNotEmpty(batchNo)){ + for (CaseEvidenceDetailDTO evidenceDetail : caseEvidenceDetailDTOS) { + List filter = evidenceDetail.getFileList().stream().filter(file -> StrUtil.equals(file.getBatchNo(), batchNo)).toList(); + evidenceDetail.setFileList(filter); + } + } + return caseEvidenceDetailDTOS; + } + @Override @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class) public IPage pageListEvidence(String caseId, String evidenceName, Integer pageNum, Integer pageSize) { @@ -196,7 +221,13 @@ public class CaseEvidenceServiceImpl extends ServiceImpl ocrText.append(fileOcrProcess.getOcrText())); + fileOcrProcesses.forEach(fileOcrProcess -> { + if (StrUtil.isNotEmpty(fileOcrProcess.getReviseText())){ + ocrText.append(fileOcrProcess.getReviseText()); + }else { + ocrText.append(fileOcrProcess.getOcrText()); + } + }); llmExtractDto.setText(ocrText.toString()); log.info("标题提取开始。"); long titleStart = System.currentTimeMillis(); @@ -242,4 +273,469 @@ public class CaseEvidenceServiceImpl extends ServiceImpl listDirectoryTree(String caseId) { + Assert.notEmpty(caseId,"案件ID不能为空!"); + List evidenceDirectoryDTOS = evidenceDirectoryService.listDirectoryTree(caseId); + + evidenceDirectoryService.appendFile(evidenceDirectoryDTOS, evidenceFileService.listFileInfoByCaseId(caseId)); + + return evidenceDirectoryDTOS; + } + + @Override + public void initCaseEvidenceDirectory(String caseId, String caseType) { + + List evidenceCategoryDTOS = evidenceCategoryService.listCategoryTree(caseType); + + initCaseEvidenceDirectory(evidenceCategoryDTOS, caseId, null); + } + + @Override + public Boolean updateDirectory(EvidenceDirectory evidenceDirectory) { + + Assert.notEmpty(evidenceDirectory.getId(),"目录ID不能为空!"); + + Assert.notEmpty(evidenceDirectory.getParentId(),"父级目录id不能为空"); + + return evidenceDirectoryService.lambdaUpdate() + .set(EvidenceDirectory::getParentId, evidenceDirectory.getParentId()) + .eq(EvidenceDirectory::getId, evidenceDirectory.getId()).update(); + + } + + @Override + public Boolean moveFile(DirectoryFileDTO evidenceFileDTO) { + + Assert.notEmpty(evidenceFileDTO.getFileIdList(), "文件id不能为空"); + Assert.notEmpty(evidenceFileDTO.getCaseId(), "案件id不能为空"); + Assert.notEmpty(evidenceFileDTO.getDirectoryId(), "目录id不能为空"); + + + return evidenceFileService.lambdaUpdate() + .set(EvidenceFile::getDirectoryId, evidenceFileDTO.getDirectoryId()) + .in(EvidenceFile::getFileId, evidenceFileDTO.getFileIdList()) + .update(); + } + + @Override + public Boolean removeFile(DirectoryFileDTO evidenceFileDTO) { + + Assert.notEmpty(evidenceFileDTO.getFileIdList(), "文件id不能为空"); + Assert.notEmpty(evidenceFileDTO.getCaseId(), "案件id不能为空"); + + return evidenceFileService.lambdaUpdate() + .in(EvidenceFile::getFileId, evidenceFileDTO.getFileIdList()) + .remove(); + } + + @Override + @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class) + public Boolean removeDirectory(List directoryIdList) { + + if (CollUtil.isEmpty(directoryIdList)){ + return false; + } + + boolean success = evidenceDirectoryService.removeBatchByIds(directoryIdList); + + if (success){ + // 删除目录,意味着证据也要被删除 + super.lambdaUpdate().eq(CaseEvidence::getDirectoryId, directoryIdList).remove(); + evidenceFileService.lambdaUpdate().in(EvidenceFile::getDirectoryId, directoryIdList).remove(); + } + return success; + } + + /** + * 提取证据信息 + * 1. 只对证据文件进行新增操作,不删除已有的文件 + * 2. 如果第三级目录下已经存在文件,只新增证据文件,对证据进行ocr识别但不对证据进行重新提取操作 + * @param caseId + * @param evidenceFileDTOS 文件信息 + */ + @Override + @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class) + public String ocrAndExtract(String caseId, List evidenceFileDTOS) { + + List oldEvidences = this.queryEvidenceList(caseId); + List evidenceDirectoryDTOS = listDirectoryTree(caseId); + + List newEvidences = toCaseCaseEvidenceDetailDTO(evidenceFileDTOS, evidenceDirectoryDTOS); + newEvidences.forEach(caseEvidenceDetailDTO -> caseEvidenceDetailDTO.setCaseId(caseId)); + + List operationalEvidence = findChangedEvidence(oldEvidences, newEvidences); + + String batchId = updateCaseEvidence(operationalEvidence); + + + for (CaseEvidenceDetailDTO caseEvidenceDetailDTO : operationalEvidence) { + if (StrUtil.equalsAny(caseEvidenceDetailDTO.getUpdateStatus(),"-1","0")){ + // 只需要识别即可 + fileOcrProcessService.syncSubmitOCR(List.of(caseEvidenceDetailDTO.getId())); + // todo:是否需要提取标题 + } + if (StrUtil.equals(caseEvidenceDetailDTO.getUpdateStatus(),"1")){ + // 需要分析(ocr识别+标题提取) + xxlJobService.executeTaskByJobHandler("evidenceAnalysis", caseEvidenceDetailDTO.getId()); + } + + } + return batchId; + + } + + @Override + @Transactional(transactionManager = "dataSourceTransactionManager",propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) + public String updateCaseEvidence(List caseEvidenceDetailDTOList) { + + String batchNo = DateTime.now().toString("yyyyMMddHHmmss"); + for (CaseEvidenceDetailDTO evidence : caseEvidenceDetailDTOList) { + if (evidence.getUpdateStatus().equals("1")){ + // 新增 + CaseEvidence caseEvidence = evidence.toCaseEvidence(); + this.save(caseEvidence); + for (EvidenceFileDTO evidenceFileDTO : evidence.getFileList()) { + if (evidenceFileDTO.getUpdateStatus().equals("1")){ + // 新增 + EvidenceFile evidenceFile = new EvidenceFile(caseEvidence.getId(), evidenceFileDTO.getFileId()); + evidenceFile.setDirectoryId(evidence.getDirectoryId()); + evidenceFile.setRank(evidenceFileDTO.getRank()); + evidenceFile.setBatchNo(batchNo); + evidenceFileService.save(evidenceFile); + }/*else if (evidenceFileDTO.getUpdateStatus().equals("0")){ + // 删除 + evidenceFileService.lambdaUpdate() + .eq(EvidenceFile::getEvidenceId, evidenceFileDTO.getEvidenceId()) + .eq(EvidenceFile::getFileId, evidenceFileDTO.getFileId()).remove(); + }else if (evidenceFileDTO.getUpdateStatus().equals("2")){ + evidenceFileService.lambdaUpdate() + .set(EvidenceFile::getRank, evidenceFileDTO.getRank()) + .update(); + }*/ + } + + }/*else if (evidence.getUpdateStatus().equals("0")){ + // 删除 + this.removeById(evidence.getId()); + evidenceFileService.lambdaUpdate().eq(EvidenceFile::getEvidenceId, evidence.getId()).remove(); + }*/ + + } + return batchNo; + } + + @Override + public List listOcrAndExtract(String caseId,String batchNo) { + Assert.notEmpty(caseId, "案件id不能为空"); + ModelCase modelCase = modelCaseService.getById(caseId); + Assert.notNull(modelCase, "案件不存在"); + + List caseEvidenceDetailDTOS = this.queryEvidenceList(caseId,batchNo); + + if (CollUtil.isNotEmpty(caseEvidenceDetailDTOS)){ + return new ArrayList<>(); + } + List processDTOList = caseEvidenceDetailDTOS.stream().map(EvidenceProcessDTO::new).collect(Collectors.toList()); + List evidenceDirectoryDTOS = evidenceDirectoryService.listDirectoryTree(caseId); + List categoryList = evidenceCategoryService.lambdaQuery().eq(EvidenceCategory::getCaseType, modelCase.getCaseType()).list(); + + for (EvidenceProcessDTO evidenceProcessDTO : processDTOList) { + evidenceProcessDTO.setTemplateInfo(evidenceDirectoryDTOS, categoryList); + } + return processDTOList; + } + + @Override + public void verifyEvidence(List evidenceVerifyDTOS,String caseId,String batchNo) { + Assert.notEmpty(caseId, "案件id不能为空"); + if (CollUtil.isEmpty(evidenceVerifyDTOS)){ + return; + } + List caseEvidenceDetailDTOS = queryEvidenceList(caseId,batchNo); + Map> evidenceMap = evidenceVerifyDTOS.stream().collect(Collectors.groupingBy(EvidenceVerifyDTO::getEvidenceId)); + for (Map.Entry> entry : evidenceMap.entrySet()) { + String evidenceId = entry.getKey(); + List value = entry.getValue(); + + // 更新证据属性 + this.lambdaUpdate().eq(CaseEvidence::getId, evidenceId).set(CaseEvidence::getProperty, CollUtil.getFirst(value).getProperties()); + + // 修改ocr内容 + for (EvidenceVerifyDTO verifyDTO : value) { + if (StrUtil.isNotEmpty(verifyDTO.getOcrText())){ + fileOcrProcessService.lambdaUpdate() + .eq(FileOcrProcess::getFileId, verifyDTO.getFileId()) + .set(FileOcrProcess::getReviseText, verifyDTO.getOcrText()).update(); + } + } + // 调整顺序 + CaseEvidenceDetailDTO evidenceDetail = findEvidenceDetail(evidenceId, caseEvidenceDetailDTOS); + if (evidenceDetail != null){ + List list = value.stream().map(EvidenceVerifyDTO::getFileId).toList(); + for (EvidenceFileDTO evidenceFileDTO : evidenceDetail.getFileList()) { + evidenceFileDTO.setRank(findRank(list, evidenceFileDTO.getFileId())); + evidenceFileService.lambdaUpdate().eq(EvidenceFile::getFileId, evidenceFileDTO.getFileId()) + .eq(EvidenceFile::getEvidenceId, evidenceFileDTO.getEvidenceId()) + .set(EvidenceFile::getRank, evidenceFileDTO.getRank()).update(); + } + } + + } + } + + @Override + public List evidenceDetails(String caseId, String batchNo) { + List evidenceDirectoryDTOS = listDirectoryTree(caseId); + + List caseEvidenceList = this.lambdaQuery().eq(CaseEvidence::getCaseId, caseId).list(); + List categoryPromptDTOS = evidenceDirectoryService.listCategoryPrompt(caseId); + + Map caseEvidenceMap = caseEvidenceList.stream().collect(Collectors.toMap(CaseEvidence::getId, Function.identity())); + Map categoryPromptMap = categoryPromptDTOS.stream().collect(Collectors.toMap(CategoryPromptDTO::getDirectoryId, Function.identity())); + for (EvidenceDirectoryDTO evidenceDirectoryDTO : evidenceDirectoryDTOS) { + if (CollUtil.isEmpty(evidenceDirectoryDTO.getFileInfoList())){ + continue; + } + for (EvidenceFileDTO evidenceFileDTO : evidenceDirectoryDTO.getFileInfoList()) { + evidenceFileDTO.setPrompt(categoryPromptMap.get(evidenceFileDTO.getDirectoryId())); + evidenceFileDTO.setEvidenceInfo(caseEvidenceMap.get(evidenceFileDTO.getEvidenceId())); + } + } + return evidenceDirectoryDTOS; + } + + + private CaseEvidenceDetailDTO findEvidenceDetail(String evidenceId, List caseEvidenceDetailDTOS) { + for (CaseEvidenceDetailDTO caseEvidenceDetailDTO : caseEvidenceDetailDTOS) { + if (StrUtil.equals(caseEvidenceDetailDTO.getId(), evidenceId)){ + return caseEvidenceDetailDTO; + } + } + return null; + } + + private List toCaseCaseEvidenceDetailDTO(List newDirectoryDTOS, + List evidenceDirectoryDTOS) { + if (CollUtil.isEmpty(newDirectoryDTOS)){ + return new ArrayList<>(); + } + + List fileIdList = newDirectoryDTOS.stream().flatMap(directoryDTO -> directoryDTO.listAllFileId().stream()).toList(); + Map fileMap = minioService.listMinioFile(fileIdList).stream() + .collect(Collectors.toMap(MinioFile::getId, Function.identity())); + + List floatNewDirectoryDTOS = newDirectoryDTOS.stream().flatMap(directoryDTO -> directoryDTO.listAllDirectory().stream()).toList(); + List caseEvidenceDetailDTOS = new ArrayList<>(); + for (EvidenceDirectoryDTO evidenceFile : floatNewDirectoryDTOS) { + + String directoryId = evidenceFile.getId(); + EvidenceDirectoryDTO directory = evidenceDirectoryService.findDirectoryById(directoryId, evidenceDirectoryDTOS); + if (null == directory){ + log.warn("toCaseCaseEvidenceDetailDTO:目录id:{}不存在对应的目录分类信息",directoryId); + continue; + } + + if (directory.getLevel() == 2){ + for (String fileId : evidenceFile.getFileIdList()) { + CaseEvidenceDetailDTO caseEvidenceDetailDTO = new CaseEvidenceDetailDTO(); + if (null != fileMap.get(fileId)){ + // 证据名为文件名 + caseEvidenceDetailDTO.setEvidenceName(fileMap.get(fileId).getFilename()); + } + caseEvidenceDetailDTO.setEvidenceType(directory.getCategoryId()); + caseEvidenceDetailDTO.setDirectoryId(directoryId); + EvidenceFileDTO evidenceFileDTO = new EvidenceFileDTO(); + evidenceFileDTO.setFileId(fileId); + caseEvidenceDetailDTO.setFileList(List.of(evidenceFileDTO)); + caseEvidenceDetailDTOS.add(caseEvidenceDetailDTO); + } + } + if (directory.getLevel() == 3){ + CaseEvidenceDetailDTO caseEvidenceDetailDTO = new CaseEvidenceDetailDTO(); + // 证据名为目录名 + caseEvidenceDetailDTO.setEvidenceName(evidenceFile.getDirectoryName()); + caseEvidenceDetailDTO.setEvidenceType(directory.getCategoryId()); + caseEvidenceDetailDTO.setDirectoryId(directoryId); + List evidenceFileDTOS = new ArrayList<>(); + for (String fileId : evidenceFile.getFileIdList()) { + EvidenceFileDTO evidenceFileDTO = new EvidenceFileDTO(); + evidenceFileDTO.setFileId(fileId); + evidenceFileDTOS.add(evidenceFileDTO); + } + caseEvidenceDetailDTO.setFileList(evidenceFileDTOS); + caseEvidenceDetailDTOS.add(caseEvidenceDetailDTO); + } + } + + return caseEvidenceDetailDTOS; + + } + + /** + * 查找发生改变的证据 + * @param oldEvidenceList 旧证据列表 + * @param newEvidenceFileList 新证据列表 + * @return 发生改变的证据 + */ + private List findChangedEvidence(List oldEvidenceList, + List newEvidenceFileList) { + + List caseEvidence2DTOList = new ArrayList<>(); + + if (CollUtil.isEmpty(oldEvidenceList) && CollUtil.isNotEmpty(newEvidenceFileList)){ + // 数据库中不存在数据,则全部新增 + for (CaseEvidenceDetailDTO evidenceDetailDTO : newEvidenceFileList) { + List fileIds = evidenceDetailDTO.getFileList().stream().map(EvidenceFileDTO::getFileId).toList(); + evidenceDetailDTO.setUpdateStatus("1"); + for (EvidenceFileDTO evidenceFileDTO : evidenceDetailDTO.getFileList()) { + evidenceFileDTO.setUpdateStatus("1"); + evidenceFileDTO.setRank(findRank(fileIds,evidenceFileDTO.getFileId())); + } + } + caseEvidence2DTOList.addAll(newEvidenceFileList); + } + + if (CollUtil.isNotEmpty(oldEvidenceList) && CollUtil.isEmpty(newEvidenceFileList)){ + // 数据库中存在数据,没有新增数据 + for (CaseEvidenceDetailDTO evidenceDetailDTO : oldEvidenceList) { + evidenceDetailDTO.setUpdateStatus("0"); + for (EvidenceFileDTO evidenceFileDTO : evidenceDetailDTO.getFileList()) { + evidenceFileDTO.setUpdateStatus("0"); + } + } + caseEvidence2DTOList.addAll(oldEvidenceList); + } + + + if (CollUtil.isNotEmpty(oldEvidenceList) && CollUtil.isNotEmpty(newEvidenceFileList)){ + // 数据库中和新数据都存在 + for (CaseEvidenceDetailDTO oldEvidence : oldEvidenceList) { + boolean isFind = false; + for (CaseEvidenceDetailDTO newEvidence : newEvidenceFileList) { + if (StrUtil.equals(oldEvidence.getId(),newEvidence.getId())){ + isFind = true; + oldEvidence.setUpdateStatus("-1"); + List oldFileIds = oldEvidence.getFileList().stream().map(EvidenceFileDTO::getFileId).toList(); + List newFileIds = newEvidence.getFileList().stream().map(EvidenceFileDTO::getFileId).toList(); + TupleIdRecord tupleIdRecord = compareFileList(oldFileIds, newFileIds); + + List updateFileList = new ArrayList<>(); + // 新增的文件顺序排在原有文件的后面 + int initOrder = oldFileIds.size() -1; + for (String addFileId : tupleIdRecord.addFileList) { + EvidenceFileDTO evidenceFileDTO = new EvidenceFileDTO(); + evidenceFileDTO.setFileId(addFileId); + evidenceFileDTO.setUpdateStatus("1"); + evidenceFileDTO.setRank(initOrder + findRank(newFileIds, addFileId)); + updateFileList.add(evidenceFileDTO); + } + for (String deleteFileId : tupleIdRecord.deleteFileList) { + EvidenceFileDTO evidenceFileDTO = new EvidenceFileDTO(); + evidenceFileDTO.setFileId(deleteFileId); + evidenceFileDTO.setUpdateStatus("0"); + evidenceFileDTO.setRank(findRank(oldFileIds, deleteFileId)); + updateFileList.add(evidenceFileDTO); + } + + for (String updateFileId : tupleIdRecord.updateFileList) { + EvidenceFileDTO evidenceFileDTO = new EvidenceFileDTO(); + evidenceFileDTO.setFileId(updateFileId); + evidenceFileDTO.setUpdateStatus("2"); + evidenceFileDTO.setRank(findRank(oldFileIds, updateFileId)); + updateFileList.add(evidenceFileDTO); + } + + newEvidence.setFileList(updateFileList); + caseEvidence2DTOList.add(newEvidence); + } + } + if (!isFind){ + oldEvidence.setUpdateStatus("0"); + caseEvidence2DTOList.add(oldEvidence); + } + } + + + for (CaseEvidenceDetailDTO newEvidence : newEvidenceFileList) { + if (StrUtil.isEmpty(newEvidence.getId())){ + newEvidence.setUpdateStatus("1"); + List newFileIds = newEvidence.getFileList().stream().map(EvidenceFileDTO::getFileId).toList(); + for (EvidenceFileDTO evidenceFileDTO : newEvidence.getFileList()) { + evidenceFileDTO.setUpdateStatus("1"); + evidenceFileDTO.setRank(findRank(newFileIds, evidenceFileDTO.getFileId())); + } + caseEvidence2DTOList.add(newEvidence); + } + } + } + + return caseEvidence2DTOList; + } + + private int findRank(List newFileIds,String fileId){ + for (int i = 0; i < newFileIds.size(); i++) { + if (newFileIds.get(i).equals(fileId)){ + return i; + } + } + return -1; + } + + + + + /** + * 初始化案件证据目录 + * @param evidenceCategoryDTOS 证据分类 + * @param caseId 案件id + * @param parentId 父级目录id + */ + private void initCaseEvidenceDirectory(List evidenceCategoryDTOS, String caseId, String parentId) { + for (EvidenceCategoryDTO evidenceCategoryDTO : evidenceCategoryDTOS) { + EvidenceDirectory evidenceDirectory = new EvidenceDirectory(); + evidenceDirectory.setCaseId(caseId); + evidenceDirectory.setDirectoryName(evidenceCategoryDTO.getCategoryName()); + evidenceDirectory.setCategoryId(evidenceCategoryDTO.getId()); + evidenceDirectory.setParentId(parentId); + evidenceDirectoryService.save(evidenceDirectory); + if (CollUtil.isNotEmpty(evidenceCategoryDTO.getChild())) { + initCaseEvidenceDirectory(evidenceCategoryDTO.getChild(), caseId, evidenceDirectory.getId()); + } + } + } + + + + /** + * left 新增 right 删除 + * @param newFileIdList + * @param oldFileIdList + * @return + */ + private TupleIdRecord compareFileList(List newFileIdList, List oldFileIdList) { + List addFileList = new ArrayList<>(); + List deleteFileList = new ArrayList<>(); + List updateFileList = new ArrayList<>(); + + if (CollUtil.isEmpty(oldFileIdList) && CollUtil.isNotEmpty(newFileIdList)){ + addFileList = newFileIdList; + } + + if (CollUtil.isNotEmpty(oldFileIdList) && CollUtil.isEmpty(newFileIdList)){ + deleteFileList = oldFileIdList; + } + + if (CollUtil.isNotEmpty(oldFileIdList) && CollUtil.isNotEmpty(newFileIdList)){ + deleteFileList = oldFileIdList.stream().filter(fileId -> !newFileIdList.contains(fileId)).collect(Collectors.toList()); + addFileList = newFileIdList.stream().filter(fileId -> !oldFileIdList.contains(fileId)).collect(Collectors.toList()); + updateFileList = oldFileIdList.stream().filter(newFileIdList::contains).collect(Collectors.toList()); + } + + return new TupleIdRecord(addFileList,updateFileList, deleteFileList); + } + + + record TupleIdRecord(List addFileList ,List updateFileList, List deleteFileList){} + } diff --git a/src/main/java/com/supervision/police/service/impl/EvidenceCategoryServiceImpl.java b/src/main/java/com/supervision/police/service/impl/EvidenceCategoryServiceImpl.java index 74ed479..e8eb98c 100644 --- a/src/main/java/com/supervision/police/service/impl/EvidenceCategoryServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/EvidenceCategoryServiceImpl.java @@ -24,33 +24,13 @@ public class EvidenceCategoryServiceImpl extends ServiceImpl listCategoryTree(String caseType) { - List categoryList = super.lambdaQuery().eq(EvidenceCategory::getCaseType, caseType).list(); - if (CollUtil.isEmpty(categoryList)){ - return new ArrayList<>(1); - } + List list = super.getBaseMapper().listCategoryDTO(caseType); - List evidenceCategoryDTOS = new ArrayList<>(); - for (EvidenceCategory category : categoryList) { - - if (StrUtil.isEmpty(category.getParentId())){ - EvidenceCategoryDTO categoryDTO = new EvidenceCategoryDTO(category); - for (EvidenceCategory evidenceCategory : categoryList) { - if (StrUtil.equals(categoryDTO.getId(),evidenceCategory.getParentId())){ - categoryDTO.getChild().add(new EvidenceCategoryDTO(evidenceCategory)); - } - } - } - - if (StrUtil.isNotEmpty(category.getParentId())){ - for (EvidenceCategory child : categoryList) { - if (StrUtil.equals(child.getId(),category.getParentId())){ - - } - if (child.getId().equals(category.getParentId())); - } - } + for (EvidenceCategoryDTO categoryDTO : list) { + categoryDTO.setChild(list.stream() + .filter(evidenceCategoryDTO -> StrUtil.equals(categoryDTO.getId(),evidenceCategoryDTO.getParentId())).toList()); } - return null; + return list.stream().filter(categoryDTO -> StrUtil.isEmpty(categoryDTO.getParentId())).toList(); } } diff --git a/src/main/java/com/supervision/police/service/impl/EvidenceDirectoryServiceImpl.java b/src/main/java/com/supervision/police/service/impl/EvidenceDirectoryServiceImpl.java index 51f214a..048cd53 100644 --- a/src/main/java/com/supervision/police/service/impl/EvidenceDirectoryServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/EvidenceDirectoryServiceImpl.java @@ -1,11 +1,21 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.EvidenceDirectory; +import com.supervision.police.dto.CategoryPromptDTO; +import com.supervision.police.dto.EvidenceDirectoryDTO; +import com.supervision.police.dto.EvidenceFileDTO; import com.supervision.police.service.EvidenceDirectoryService; import com.supervision.police.mapper.EvidenceDirectoryMapper; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * @author Administrator * @description 针对表【evidence_directory(证据目录表)】的数据库操作Service实现 @@ -15,6 +25,73 @@ import org.springframework.stereotype.Service; public class EvidenceDirectoryServiceImpl extends ServiceImpl implements EvidenceDirectoryService{ + @Override + public List listDirectoryTree(String caseId) { + List list = super.lambdaQuery().eq(EvidenceDirectory::getCaseId, caseId).list(); + + List directoryDTOS = list.stream().map(EvidenceDirectoryDTO::new).toList(); + + for (EvidenceDirectoryDTO directoryDTO : directoryDTOS) { + directoryDTO.setChild(directoryDTOS.stream() + .filter(item -> StrUtil.equals(directoryDTO.getId(),item.getParentId())).toList()); + } + + List directoryDTOList = directoryDTOS.stream().filter(item -> StrUtil.isEmpty(item.getParentId())).toList(); + + List directoryIds = list.stream().map(EvidenceDirectory::getId).toList(); + for (String directoryId : directoryIds) { + // 设置目录层级 + setDirectoryLevel(directoryId, directoryDTOList); + } + + // 把文件也拼接到目录树中 + return directoryDTOS; + } + + @Override + public EvidenceDirectoryDTO findDirectoryById(String directoryId, + List evidenceDirectoryDTOS) { + + for (EvidenceDirectoryDTO directoryDTO : evidenceDirectoryDTOS) { + EvidenceDirectoryDTO directory = directoryDTO.findDirectory(directoryId); + if (null != directory){ + return directory; + } + } + return null; + } + + @Override + public void appendFile(List directoryDTOS, List fileInfoList) { + + if (CollUtil.isEmpty(directoryDTOS)){ + return; + } + Map> fileMap = fileInfoList.stream().collect(Collectors.groupingBy(EvidenceFileDTO::getDirectoryId)); + for (EvidenceDirectoryDTO directoryDTO : directoryDTOS) { + directoryDTO.appendChildDirectory(); + directoryDTO.appendChildFile(fileMap); + } + + } + + @Override + public List listCategoryPrompt(String caseId) { + Assert.notEmpty(caseId,"案件id不能为空!"); + + return super.getBaseMapper().listCategoryPrompt(caseId); + } + + private void setDirectoryLevel(String directoryId, List directoryDTOList) { + + for (EvidenceDirectoryDTO evidenceDirectoryDTO : directoryDTOList) { + int level = evidenceDirectoryDTO.evalLevel(directoryId, 1); + if (level > 0) { + evidenceDirectoryDTO.setLevel(level); + } + return; + } + } } diff --git a/src/main/java/com/supervision/police/service/impl/EvidenceFileServiceImpl.java b/src/main/java/com/supervision/police/service/impl/EvidenceFileServiceImpl.java index 8d26198..4fddd60 100644 --- a/src/main/java/com/supervision/police/service/impl/EvidenceFileServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/EvidenceFileServiceImpl.java @@ -32,6 +32,11 @@ public class EvidenceFileServiceImpl extends ServiceImpl listFileInfoByCaseId(String caseId) { + return super.getBaseMapper().listFileInfoByCaseId(caseId); + } } 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 7bd2230..bb1a772 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java @@ -70,6 +70,9 @@ public class ModelCaseServiceImpl extends ServiceImpl 0) { return R.okMsg("保存成功"); diff --git a/src/main/resources/mapper/CaseEvidenceMapper.xml b/src/main/resources/mapper/CaseEvidenceMapper.xml index ba71d56..3c0ca65 100644 --- a/src/main/resources/mapper/CaseEvidenceMapper.xml +++ b/src/main/resources/mapper/CaseEvidenceMapper.xml @@ -34,6 +34,7 @@ + @@ -42,17 +43,23 @@ + + + + select + c.id as id, + c.prompt_id as promptId, + c.case_type as caseType, + c.category_name as categoryName, + c.icon_url as iconURL, + c.parent_id as parent_id, + np.name as name + from evidence_category c + left join note_prompt np on c.prompt_id = np.id + + + AND c.case_type = #{id} + + + diff --git a/src/main/resources/mapper/EvidenceDirectoryMapper.xml b/src/main/resources/mapper/EvidenceDirectoryMapper.xml index 04b726b..a6d7b6a 100644 --- a/src/main/resources/mapper/EvidenceDirectoryMapper.xml +++ b/src/main/resources/mapper/EvidenceDirectoryMapper.xml @@ -21,4 +21,18 @@ category_id,parent_id,create_user_id, create_time,update_user_id,update_time + diff --git a/src/main/resources/mapper/EvidenceFileMapper.xml b/src/main/resources/mapper/EvidenceFileMapper.xml index 35f0872..736a7e3 100644 --- a/src/main/resources/mapper/EvidenceFileMapper.xml +++ b/src/main/resources/mapper/EvidenceFileMapper.xml @@ -9,6 +9,7 @@ + @@ -40,4 +41,21 @@ + + diff --git a/src/test/java/com/supervision/demo/FuHsiApplicationTests.java b/src/test/java/com/supervision/demo/FuHsiApplicationTests.java index 63ead25..abc8b75 100644 --- a/src/test/java/com/supervision/demo/FuHsiApplicationTests.java +++ b/src/test/java/com/supervision/demo/FuHsiApplicationTests.java @@ -15,14 +15,13 @@ import com.supervision.demo.controller.ExampleChatController; import com.supervision.police.domain.ModelRecordType; import com.supervision.police.domain.NotePrompt; import com.supervision.police.domain.NoteRecordSplit; +import com.supervision.police.dto.EvidenceDirectoryDTO; import com.supervision.police.dto.RetrieveReqDTO; import com.supervision.police.dto.RetrieveResDTO; import com.supervision.police.service.*; import com.supervision.thread.RecordSplitClassifyTask; -import com.supervision.thread.TripleExtractTask; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.ai.chat.ChatResponse; @@ -283,6 +282,38 @@ public class FuHsiApplicationTests { content, stopWatch.getTotalTimeMillis()); } + @Autowired + private CaseEvidenceService caseEvidenceService; + @Test + public void ocrAndExtractTest() { + EvidenceDirectoryDTO directoryDTO = new EvidenceDirectoryDTO(); + directoryDTO.setId("1845745238182703105"); + directoryDTO.setDirectoryName("书证"); + EvidenceDirectoryDTO directoryDTO1 = new EvidenceDirectoryDTO(); + directoryDTO1.setId("1845745256180461570"); + directoryDTO1.setDirectoryName("合同协议"); + directoryDTO1.setParentId("1845745238182703105"); + directoryDTO1.setFileIdList(List.of("1823958525387853825","1831232334119645185")); + directoryDTO.setChild(List.of(directoryDTO1)); + + EvidenceDirectoryDTO directoryDTO2 = new EvidenceDirectoryDTO(); + directoryDTO2.setId("2222"); + directoryDTO2.setDirectoryName("车辆合同协议"); + directoryDTO2.setParentId("1845745256180461570"); + directoryDTO2.setFileIdList(List.of("1833015941205143554","1833016215680397313","1833016621840019457")); + directoryDTO1.setChild(List.of(directoryDTO2)); + caseEvidenceService.ocrAndExtract("1823955210189000706", List.of(directoryDTO)); + + } + + + @Test + public void initCaseDirectory() { + caseEvidenceService.initCaseEvidenceDirectory("1823955210189000706", "1"); + + System.out.println("222"); + } + @Data @AllArgsConstructor class TripleRecord{