diff --git a/src/main/java/com/supervision/minio/client/MinioTemplate.java b/src/main/java/com/supervision/minio/client/MinioTemplate.java index 6c30a48..7ca698e 100644 --- a/src/main/java/com/supervision/minio/client/MinioTemplate.java +++ b/src/main/java/com/supervision/minio/client/MinioTemplate.java @@ -3,12 +3,9 @@ package com.supervision.minio.client; import cn.hutool.core.io.IoUtil; import com.supervision.minio.exception.SysObsException; import io.minio.*; -import io.minio.errors.MinioException; -import io.minio.http.Method; -import io.minio.messages.Bucket; +import io.minio.errors.*; import io.minio.messages.DeleteError; import io.minio.messages.DeleteObject; -import io.minio.messages.Item; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -19,7 +16,6 @@ import java.io.InputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.*; -import java.util.concurrent.TimeUnit; /** * minio 操作Template @@ -97,6 +93,15 @@ public class MinioTemplate { } } + public InputStream getObjectInputStream(String bucketName, String objectName) { + try { + return minioClient.getObject( + GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /** * 下载对象 * diff --git a/src/main/java/com/supervision/minio/service/MinioService.java b/src/main/java/com/supervision/minio/service/MinioService.java index d369e02..b34bd84 100644 --- a/src/main/java/com/supervision/minio/service/MinioService.java +++ b/src/main/java/com/supervision/minio/service/MinioService.java @@ -1,10 +1,13 @@ package com.supervision.minio.service; import com.supervision.common.domain.R; +import com.supervision.minio.domain.MinioFile; import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.InputStream; +import java.util.List; public interface MinioService { @@ -14,4 +17,14 @@ public interface MinioService { R delFile(String fileId); + InputStream getObjectInputStream(String fileId); + + + InputStream getObjectInputStream(MinioFile minioFile); + + MinioFile getMinioFile(String fileId); + + + List listMinioFile(List fileIdList); + } diff --git a/src/main/java/com/supervision/minio/service/impl/MinioServiceImpl.java b/src/main/java/com/supervision/minio/service/impl/MinioServiceImpl.java index a829095..cc7bb2d 100644 --- a/src/main/java/com/supervision/minio/service/impl/MinioServiceImpl.java +++ b/src/main/java/com/supervision/minio/service/impl/MinioServiceImpl.java @@ -1,5 +1,7 @@ package com.supervision.minio.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import com.supervision.common.domain.R; import com.supervision.common.utils.StringUtils; import com.supervision.minio.client.MinioTemplate; @@ -14,9 +16,7 @@ import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; -import java.util.Date; -import java.util.Objects; -import java.util.UUID; +import java.util.*; @Service public class MinioServiceImpl implements MinioService { @@ -64,4 +64,31 @@ public class MinioServiceImpl implements MinioService { return R.ok(); } + @Override + public InputStream getObjectInputStream(String fileId) { + MinioFile minioFile = minioFileMapper.selectById(fileId); + Assert.notNull(minioFile, "文件不存在"); + return minioTemplate.getInputStreamObject(bucketName, minioFile.getId()); + } + + @Override + public InputStream getObjectInputStream(MinioFile minioFile) { + Assert.notNull(minioFile, "文件信息不能为空"); + return this.getObjectInputStream(minioFile.getId()); + } + + @Override + public MinioFile getMinioFile(String fileId) { + Assert.notEmpty(fileId, "文件id不能为空"); + return minioFileMapper.selectById(fileId); + } + + @Override + public List listMinioFile(List fileIdList) { + if (CollUtil.isEmpty(fileIdList)){ + return new ArrayList<>(1); + } + return minioFileMapper.selectBatchIds(fileIdList); + } + } diff --git a/src/main/java/com/supervision/police/controller/RecordController.java b/src/main/java/com/supervision/police/controller/RecordController.java index 3a56ec4..14e3740 100644 --- a/src/main/java/com/supervision/police/controller/RecordController.java +++ b/src/main/java/com/supervision/police/controller/RecordController.java @@ -6,7 +6,7 @@ import com.supervision.police.domain.NotePrompt; import com.supervision.police.domain.NoteRecord; import com.supervision.police.domain.TripleInfo; import com.supervision.police.dto.ListDTO; -import com.supervision.police.dto.NoteRecordReqVo; +import com.supervision.police.dto.NoteRecordDTO; import com.supervision.police.dto.TypeDTO; import com.supervision.police.service.ModelRecordTypeService; import com.supervision.police.service.NoteRecordSplitService; @@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; @@ -107,9 +106,8 @@ public class RecordController { * @return */ @PostMapping("/addOrUpdRecords") - public R uploadRecords(NoteRecordReqVo records, - @RequestPart("file") List fileList) throws IOException { - return R.ok(noteRecordSplitService.uploadRecords(records, fileList)); + public R uploadRecords(@RequestBody NoteRecordDTO records) throws IOException { + return R.ok(noteRecordSplitService.uploadRecords(records)); } /** diff --git a/src/main/java/com/supervision/police/dto/NoteRecordReqVo.java b/src/main/java/com/supervision/police/dto/NoteRecordDTO.java similarity index 81% rename from src/main/java/com/supervision/police/dto/NoteRecordReqVo.java rename to src/main/java/com/supervision/police/dto/NoteRecordDTO.java index a48ccd7..bf661d5 100644 --- a/src/main/java/com/supervision/police/dto/NoteRecordReqVo.java +++ b/src/main/java/com/supervision/police/dto/NoteRecordDTO.java @@ -1,10 +1,13 @@ package com.supervision.police.dto; +import cn.hutool.core.collection.CollUtil; import com.supervision.police.domain.NoteRecord; import lombok.Data; +import java.util.List; + @Data -public class NoteRecordReqVo { +public class NoteRecordDTO { private String id; @@ -19,9 +22,9 @@ public class NoteRecordReqVo { private String recordName; /** - * 笔录文件id + * 笔录文件id集合 */ - private String fileIds; + private List fileIdList; /** * 姓名 @@ -58,7 +61,9 @@ public class NoteRecordReqVo { noteRecord.setId(id); noteRecord.setCaseId(caseId); noteRecord.setRecordName(recordName); - noteRecord.setFileIds(fileIds); + if (CollUtil.isNotEmpty(fileIdList)){ + noteRecord.setFileIds(CollUtil.join(fileIdList, ",")); + } noteRecord.setName(name); noteRecord.setRole(role); noteRecord.setConfessionMaterial(confessionMaterial); diff --git a/src/main/java/com/supervision/police/dto/NoteRecordDetailDTO.java b/src/main/java/com/supervision/police/dto/NoteRecordDetailDTO.java new file mode 100644 index 0000000..2a1cd33 --- /dev/null +++ b/src/main/java/com/supervision/police/dto/NoteRecordDetailDTO.java @@ -0,0 +1,90 @@ +package com.supervision.police.dto; + +import cn.hutool.core.util.StrUtil; +import com.supervision.minio.domain.MinioFile; +import com.supervision.police.domain.NoteRecord; +import lombok.Data; + +import java.util.*; + +@Data +public class NoteRecordDetailDTO { + + private String id; + + /** + * 案件id + */ + private String caseId; + + /** + * 笔录名称 + */ + private String recordName; + + /** + * 笔录文件信息 + */ + private List fileList = new ArrayList<>(); + + /** + * 姓名 + */ + private String name; + + /** + * 角色 + */ + private String role; + + /** + * 供述材料 + */ + private Integer confessionMaterial; + + /** + * 询问人 + */ + private String lawAsker; + + /** + * 供述开始时间 + */ + private String confessionStartTime; + + /** + * 供述结束时间 + */ + private String confessionEndTime; + + private List children = new ArrayList<>(); + + public NoteRecordDetailDTO() { + } + + public NoteRecordDetailDTO(NoteRecord noteRecord, Map fileMap) { + if (Objects.isNull(noteRecord)){ + return; + } + this.id = noteRecord.getId(); + this.caseId = noteRecord.getCaseId(); + this.recordName = noteRecord.getRecordName(); + this.name = noteRecord.getName(); + this.role = noteRecord.getRole(); + this.confessionMaterial = noteRecord.getConfessionMaterial(); + this.lawAsker = noteRecord.getLawAsker(); + this.confessionStartTime = noteRecord.getConfessionStartTime(); + this.confessionEndTime = noteRecord.getConfessionEndTime(); + if (StrUtil.isNotEmpty(noteRecord.getFileIds())){ + this.fileList = Arrays.stream(noteRecord.getFileIds().split(",")).map(fileId->{ + MinioFile minioFile = fileMap.get(fileId); + if (Objects.isNull(minioFile)){ + return null; + } + return new NoteRecordFileDTO(this.id,minioFile); + }).filter(Objects::nonNull).toList(); + }else { + this.fileList = new ArrayList<>(1); + } + } +} diff --git a/src/main/java/com/supervision/police/dto/NoteRecordFileDTO.java b/src/main/java/com/supervision/police/dto/NoteRecordFileDTO.java new file mode 100644 index 0000000..b2bea59 --- /dev/null +++ b/src/main/java/com/supervision/police/dto/NoteRecordFileDTO.java @@ -0,0 +1,36 @@ +package com.supervision.police.dto; + +import com.supervision.minio.domain.MinioFile; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Objects; + +@Data +public class NoteRecordFileDTO { + + @Schema(description = "笔录id") + private String noteRecordId; + + @Schema(description = "文件id集合") + private String fileId; + + @Schema(description = "文件名称") + private String fileName; + + @Schema(description = "文件类型") + private String fileType; + + public NoteRecordFileDTO() { + } + + public NoteRecordFileDTO(String noteRecordId,MinioFile minioFile) { + this.noteRecordId = noteRecordId; + if (Objects.isNull(minioFile)){ + return; + } + this.fileId = minioFile.getId(); + this.fileName = minioFile.getFilename(); + this.fileType = minioFile.getFileType(); + } +} diff --git a/src/main/java/com/supervision/police/service/NoteRecordSplitService.java b/src/main/java/com/supervision/police/service/NoteRecordSplitService.java index f72a05e..88bbc7c 100644 --- a/src/main/java/com/supervision/police/service/NoteRecordSplitService.java +++ b/src/main/java/com/supervision/police/service/NoteRecordSplitService.java @@ -3,16 +3,14 @@ package com.supervision.police.service; import com.baomidou.mybatisplus.extension.service.IService; import com.supervision.police.domain.NoteRecord; import com.supervision.police.domain.NoteRecordSplit; -import com.supervision.police.dto.NoteRecordReqVo; -import org.springframework.web.multipart.MultipartFile; +import com.supervision.police.dto.NoteRecordDTO; import java.io.IOException; -import java.util.List; import java.util.Map; public interface NoteRecordSplitService extends IService { - String uploadRecords(NoteRecordReqVo records, List fileList) throws IOException; + String uploadRecords(NoteRecordDTO records) throws IOException; Map queryRecords(NoteRecord noteRecord, Integer page, Integer size); diff --git a/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java index 6a77f61..44ed5f1 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java @@ -427,6 +427,9 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl ids) { + if (CollUtil.isEmpty(ids)){ + return "成功插入0条信息"; + } List tripleInfos = tripleInfoService.listByIds(ids); int i = 0; for (TripleInfo tripleInfo : tripleInfos) { diff --git a/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java b/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java index b3eea77..0175406 100644 --- a/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java @@ -1,5 +1,6 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -9,11 +10,11 @@ import com.supervision.common.utils.StringUtils; import com.supervision.minio.domain.MinioFile; import com.supervision.minio.mapper.MinioFileMapper; import com.supervision.minio.service.MinioService; -import com.supervision.police.domain.ModelCase; import com.supervision.police.domain.ModelRecordType; import com.supervision.police.domain.NoteRecordSplit; import com.supervision.police.domain.NoteRecord; -import com.supervision.police.dto.NoteRecordReqVo; +import com.supervision.police.dto.NoteRecordDTO; +import com.supervision.police.dto.NoteRecordDetailDTO; import com.supervision.police.mapper.ModelCaseMapper; import com.supervision.police.mapper.NoteRecordSplitMapper; import com.supervision.police.mapper.NoteRecordMapper; @@ -29,11 +30,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.io.InputStream; import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @@ -60,20 +62,9 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl fileList) throws IOException { - //上传文件,获取文件ids - List fileIds = new ArrayList<>(); - for (MultipartFile file : fileList) { - String fileId = minioService.uploadFile(file); - fileIds.add(fileId); - } - if (StringUtils.isNotEmpty(records.getFileIds())) { - records.setFileIds(records.getFileIds() + "," + StringUtils.join(fileIds, ",")); - } else { - records.setFileIds(StringUtils.join(fileIds, ",")); - } + public String uploadRecords(NoteRecordDTO records) throws IOException { //修改案件的行为人、当事人 - if (StringUtils.isNotEmpty(records.getRole()) && !"嫌疑人".equals(records.getRole())) { + /*if (StringUtils.isNotEmpty(records.getRole()) && !"嫌疑人".equals(records.getRole())) { ModelCase modelCase = modelCaseMapper.selectById(records.getCaseId()); //行为人 if ("行为人".equals(records.getRole()) && StringUtils.isEmpty(modelCase.getLawActor())) { @@ -90,8 +81,8 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl allTypeList = modelRecordTypeService.lambdaQuery().list(); - if (i > 0) { + if (i > 0 && CollUtil.isNotEmpty(records.getFileIdList())) { //拆分笔录 - for (MultipartFile file : fileList) { - String context = WordReadUtil.readWord(file); + for (String fileId : records.getFileIdList()) { + MinioFile minioFile = minioService.getMinioFile(fileId); + InputStream inputStream = null; + try { + inputStream = minioService.getObjectInputStream(minioFile); + } catch (Exception e) { + e.printStackTrace(); + log.error("从minio中获取文件失败:{}", e.getMessage()); + continue; + } + String context = WordReadUtil.readWord(inputStream); List qaList = RecordRegexUtil.recordRegex(context, records.getName()); for (QARecordNodeDTO qa : qaList) { try { NoteRecordSplit noteRecord = new NoteRecordSplit(); noteRecord.setCaseId(records.getCaseId()); noteRecord.setNoteRecordsId(records.getId()); - noteRecord.setNoteName(file.getName()); + noteRecord.setNoteName(minioFile.getFilename()); noteRecord.setPersonName(records.getName()); noteRecord.setQuestion(qa.getQuestion()); noteRecord.setAnswer(qa.getAnswer()); @@ -131,30 +131,28 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl queryRecords(NoteRecord noteRecords, Integer page, Integer size) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.like(StringUtils.isNotEmpty(noteRecords.getName()), NoteRecord::getName, noteRecords.getName()) + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(NoteRecord.class) + .like(StringUtils.isNotEmpty(noteRecords.getName()), NoteRecord::getName, noteRecords.getName()) .eq(NoteRecord::getCaseId, noteRecords.getCaseId()) .eq(NoteRecord::getDataStatus, "1"); List list = noteRecordMapper.selectList(wrapper); + List fileIdList = list.stream().map(NoteRecord::getFileIds).filter(StringUtils::isNotEmpty) + .flatMap(s -> Arrays.stream(s.split(","))).distinct().toList(); + + Map fileMap = minioService.listMinioFile(fileIdList).stream().collect(Collectors.toMap(MinioFile::getId, Function.identity())); + // LinkedHashMap 保障顺序 - Map> nameMap = list.stream().filter(item -> StringUtils.isNotBlank(item.getName())) - .collect(Collectors.groupingBy(NoteRecord::getName, LinkedHashMap::new, Collectors.toList())); - List res = new ArrayList<>(); + Map> nameMap = list.stream().filter(item -> StringUtils.isNotBlank(item.getName())).map(item -> new NoteRecordDetailDTO(item, fileMap)) + .collect(Collectors.groupingBy(NoteRecordDetailDTO::getName, LinkedHashMap::new, Collectors.toList())); + List res = new ArrayList<>(); for (String name : nameMap.keySet()) { - NoteRecord noteRecord = new NoteRecord(); - noteRecord.setName(name); - noteRecord.setChildren(nameMap.get(name)); - res.add(noteRecord); - } - List pager = ListUtils.Pager(size, page, res); - for (NoteRecord person : pager) { - for (NoteRecord noteRecord : person.getChildren()) { - String fileIds = noteRecord.getFileIds(); - if (StringUtils.isNotEmpty(fileIds)) { - noteRecord.setConfessionMaterial(fileIds.split(",").length); - } - } + NoteRecordDetailDTO noteRecordDetailDTO = new NoteRecordDetailDTO(); + noteRecordDetailDTO.setName(name); + noteRecordDetailDTO.setChildren(nameMap.get(name)); + noteRecordDetailDTO.setConfessionMaterial(CollUtil.size(noteRecordDetailDTO.getFileList())); + res.add(noteRecordDetailDTO); } + List pager = ListUtils.Pager(size, page, res); return IPages.buildDataMap(pager, res.size()); } diff --git a/src/main/java/com/supervision/springaidemo/util/WordReadUtil.java b/src/main/java/com/supervision/springaidemo/util/WordReadUtil.java index 0914a35..2668c3e 100644 --- a/src/main/java/com/supervision/springaidemo/util/WordReadUtil.java +++ b/src/main/java/com/supervision/springaidemo/util/WordReadUtil.java @@ -54,4 +54,21 @@ public class WordReadUtil { return stringBuilder.toString(); } + public static String readWord(InputStream inputStream) { + StringBuilder stringBuilder = new StringBuilder(); + try (inputStream) { + // 创建 XWPFDocument 对象 + XWPFDocument document = new XWPFDocument(inputStream); + // 获取所有段落 + List paragraphs = document.getParagraphs(); + // 遍历所有段落并打印文本 + for (XWPFParagraph paragraph : paragraphs) { + stringBuilder.append(paragraph.getText()); + } + } catch (Exception e) { + log.error("获取笔录内容失败",e); + } + return stringBuilder.toString(); + } + }