1. 添加证据ocr识别功能

topo_dev
xueqingkun 8 months ago
parent 18871ba6f9
commit d255edf489

@ -3,11 +3,13 @@ package com.supervision;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync @EnableAsync
@EnableScheduling @EnableScheduling
@EnableAspectJAutoProxy(exposeProxy = true)
@MapperScan(basePackages = {"com.supervision.**.mapper"}) @MapperScan(basePackages = {"com.supervision.**.mapper"})
@SpringBootApplication(scanBasePackages = {"com.supervision.**"}) @SpringBootApplication(scanBasePackages = {"com.supervision.**"})
public class FuHsiApplication { public class FuHsiApplication {

@ -10,7 +10,21 @@ import java.util.Map;
@Getter @Getter
public enum EvidencePropertyName { public enum EvidencePropertyName {
TITLE("title", "标题", "String"); TITLE("title", "标题", "String"),
//提供人
PROVIDER("provider", "提供人", "String"),
//受害人
VICTIM("victim", "受害人", "String"),
// 合同标的物
CONTRACT_SUBJECT("contractSubject", "合同标的物", "String"),
//合同签订时间
CONTRACT_SIGN_TIME("contractSignTime", "合同签订时间", "String"),
//金额
AMOUNT("amount", "金额", "String"),
//证据结果
EVIDENCE_RESULT("evidenceResult", "证据结果", "String"),
//其他说明
OTHER_DESC("otherDesc", "其他说明", "String");
private final String name; private final String name;

@ -28,7 +28,7 @@ public class OCREvidenceController {
} }
@PostMapping("/fileList") @PostMapping("/queryFileList")
public R<List<EvidenceFileOCRDTO>> queryFileList(@RequestBody List<String> fileIdList) { public R<List<EvidenceFileOCRDTO>> queryFileList(@RequestBody List<String> fileIdList) {
List<EvidenceFileOCRDTO> evidenceFileOCRDTOList = ocrEvidenceService.queryFileList(fileIdList); List<EvidenceFileOCRDTO> evidenceFileOCRDTOList = ocrEvidenceService.queryFileList(fileIdList);
return R.ok(evidenceFileOCRDTOList); return R.ok(evidenceFileOCRDTOList);

@ -1,8 +1,6 @@
package com.supervision.police.controller; package com.supervision.police.controller;
import com.supervision.common.domain.R; import com.supervision.common.domain.R;
import com.supervision.police.domain.FileOcrProcess;
import com.supervision.police.domain.NoteRecord;
import com.supervision.police.dto.NoteRecordDTO; import com.supervision.police.dto.NoteRecordDTO;
import com.supervision.police.dto.OCRTextDTO; import com.supervision.police.dto.OCRTextDTO;
import com.supervision.police.dto.RecordFileDTO; import com.supervision.police.dto.RecordFileDTO;
@ -50,7 +48,7 @@ public class OCRRecordController {
* @param recordId * @param recordId
* @return * @return
*/ */
@GetMapping("/fileList") @GetMapping("/queryFileList")
public R<List<RecordFileDTO>> queryFileList(@RequestParam("recordId") String recordId) { public R<List<RecordFileDTO>> queryFileList(@RequestParam("recordId") String recordId) {
List<RecordFileDTO> recordFileDTOList = ocrRecordService.queryFileList(recordId); List<RecordFileDTO> recordFileDTOList = ocrRecordService.queryFileList(recordId);
return R.ok(recordFileDTOList); return R.ok(recordFileDTOList);

@ -59,6 +59,7 @@ public class EvidenceFileOCRDTO {
caseEvidenceDTO.setEvidenceName(this.evidenceName); caseEvidenceDTO.setEvidenceName(this.evidenceName);
caseEvidenceDTO.setEvidenceType(this.evidenceType); caseEvidenceDTO.setEvidenceType(this.evidenceType);
caseEvidenceDTO.setId(this.evidenceId); caseEvidenceDTO.setId(this.evidenceId);
caseEvidenceDTO.setFileIdList(CollUtil.newArrayList(this.fileId));
return caseEvidenceDTO; return caseEvidenceDTO;
} }
} }

@ -62,7 +62,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
Assert.notEmpty(caseEvidenceDTO.getCaseId(),"案件id不能为空"); Assert.notEmpty(caseEvidenceDTO.getCaseId(),"案件id不能为空");
Assert.notEmpty(caseEvidenceDTO.getEvidenceName(),"证据名称不能为空"); Assert.notEmpty(caseEvidenceDTO.getEvidenceName(),"证据名称不能为空");
Assert.notEmpty(caseEvidenceDTO.getEvidenceType(),"证据类型不能为空"); Assert.notEmpty(caseEvidenceDTO.getEvidenceType(),"证据类型不能为空");
Assert.notEmpty(caseEvidenceDTO.getProvider(),"证据提供人不能为空"); //Assert.notEmpty(caseEvidenceDTO.getProvider(),"证据提供人不能为空");
Assert.notEmpty(caseEvidenceDTO.getFileIdList(),"文件id不能为空"); Assert.notEmpty(caseEvidenceDTO.getFileIdList(),"文件id不能为空");
} }

@ -18,6 +18,7 @@ import com.supervision.police.service.NoteRecordService;
import com.supervision.police.service.OCRService; import com.supervision.police.service.OCRService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -50,8 +51,7 @@ public class FileOcrProcessServiceImpl extends ServiceImpl<FileOcrProcessMapper,
@Override @Override
@Transactional(transactionManager = "dataSourceTransactionManager",rollbackFor = Exception.class) @Transactional(transactionManager = "dataSourceTransactionManager",rollbackFor = Exception.class)
public List<FileOcrProcess> asyncSubmitOCR(List<String> fileIdList) { public List<FileOcrProcess> asyncSubmitOCR(List<String> fileIdList) {
return submitOCR(fileIdList, ((FileOcrProcessService) AopContext.currentProxy())::asyncDoOCRTask);
return submitOCR(fileIdList, this::asyncDoOCRTask);
} }
@Override @Override

@ -12,6 +12,7 @@ import com.supervision.police.dto.*;
import com.supervision.police.service.*; import com.supervision.police.service.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -39,7 +40,7 @@ public class OCREvidenceServiceImpl implements OCREvidenceService {
public Boolean submitOrcTask(String fileId) { public Boolean submitOrcTask(String fileId) {
Assert.notEmpty(fileId, "文件id不能为空"); Assert.notEmpty(fileId, "文件id不能为空");
asyncDoOrcTask(null, fileId); ((OCREvidenceService)AopContext.currentProxy()).asyncDoOrcTask(null, fileId);
return true; return true;
} }
@ -59,7 +60,12 @@ public class OCREvidenceServiceImpl implements OCREvidenceService {
for (FileOcrProcess fileOcrProcess : fileOcrProcesses) { for (FileOcrProcess fileOcrProcess : fileOcrProcesses) {
// 调用提取属性接口 // 调用提取属性接口
log.info("subOrcTask:文件id:{} 识别结果:{}", fileId, JSONUtil.toJsonStr(fileOcrProcess)); fileOcrProcess = ocrProcessService.getById(fileOcrProcess.getId());
if (StrUtil.isEmpty(fileOcrProcess.getOcrText())){
log.warn("subOrcTask:文件id:{}, 对应的ocrText属性为空跳过属性识别...", fileId);
continue;
}
log.debug("subOrcTask:远程接口retrieve开始识别文本...{}", fileOcrProcess.getOcrText());
RetrieveResDTO retrieve = ocrService.retrieve(new RetrieveReqDTO(fileOcrProcess.getOcrText())); RetrieveResDTO retrieve = ocrService.retrieve(new RetrieveReqDTO(fileOcrProcess.getOcrText()));
log.info("subOrcTask:文件id:{} 识别结果:{}", fileId, JSONUtil.toJsonStr(retrieve)); log.info("subOrcTask:文件id:{} 识别结果:{}", fileId, JSONUtil.toJsonStr(retrieve));
@ -75,6 +81,8 @@ public class OCREvidenceServiceImpl implements OCREvidenceService {
evidenceFileService.save(new EvidenceFile(evidenceId,fileId)); evidenceFileService.save(new EvidenceFile(evidenceId,fileId));
} }
}else {
log.warn("subOrcTask:文件id:{} 识别结果为空", fileId);
} }
} }
} }
@ -96,7 +104,9 @@ public class OCREvidenceServiceImpl implements OCREvidenceService {
fileEvidencePropertyService.removeByEvidenceAndFileId(evidenceId,fileId); fileEvidencePropertyService.removeByEvidenceAndFileId(evidenceId,fileId);
List<FileEvidenceProperty> fileEvidence = toFileEvidence(evidenceId, fileId, propertyMap); List<FileEvidenceProperty> fileEvidence = toFileEvidence(evidenceId, fileId, propertyMap);
fileEvidencePropertyService.saveBatch(fileEvidence); for (FileEvidenceProperty property : fileEvidence) {
fileEvidencePropertyService.save(property);
}
return fileEvidence; return fileEvidence;
} }
@ -133,7 +143,7 @@ public class OCREvidenceServiceImpl implements OCREvidenceService {
evidenceFileService.save(new EvidenceFile(evidenceId, evidenceFileOCRDTO.getFileId())); evidenceFileService.save(new EvidenceFile(evidenceId, evidenceFileOCRDTO.getFileId()));
// 保存证据属性 // 保存证据属性
List<FileEvidenceProperty> evidencePropertyList = saveEvidenceProperty(evidenceFileOCRDTO.getEvidenceId(), List<FileEvidenceProperty> evidencePropertyList = saveEvidenceProperty(evidenceId,
evidenceFileOCRDTO.getFileId(), evidenceFileOCRDTO.getProperty()); evidenceFileOCRDTO.getFileId(), evidenceFileOCRDTO.getProperty());
if (CollUtil.isEmpty(evidencePropertyList)){ if (CollUtil.isEmpty(evidencePropertyList)){

@ -125,6 +125,8 @@ public class OCRRecordServiceImpl implements OCRRecordService {
List<String> fileIdList = Arrays.stream(noteRecord.getFileIds().split(",")).toList(); List<String> fileIdList = Arrays.stream(noteRecord.getFileIds().split(",")).toList();
List<RecordFileDTO> recordFileDTOS = fileOcrProcessService.queryFileList(fileIdList); List<RecordFileDTO> recordFileDTOS = fileOcrProcessService.queryFileList(fileIdList);
recordFileDTOS = recordFileDTOS.stream()
.filter(file->StrUtil.isAllNotEmpty(file.getOcrText(),file.getReviseText())).toList();
if (CollUtil.isEmpty(recordFileDTOS)){ if (CollUtil.isEmpty(recordFileDTOS)){
log.info("submitRecordTask:笔录:{}对应的笔录文件为空...",recordId); log.info("submitRecordTask:笔录:{}对应的笔录文件为空...",recordId);
return false; return false;

@ -74,6 +74,6 @@ langChain-chat:
url: http://113.128.242.110:7861 url: http://113.128.242.110:7861
ocr: ocr:
url: http://192.168.10.42:8000/ url: http://192.168.10.137:8866/
pool: pool:
max-size: 20 max-size: 20

Loading…
Cancel
Save