1. ocr识别功能阶段性提交
parent
bb01706466
commit
3cf5df6def
@ -1,54 +0,0 @@
|
||||
//package com.supervision.config;
|
||||
//
|
||||
//import lombok.extern.slf4j.Slf4j;
|
||||
//import org.springframework.beans.BeansException;
|
||||
//import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||
//import org.springframework.context.annotation.Bean;
|
||||
//import org.springframework.context.annotation.Configuration;
|
||||
//import org.springframework.util.ReflectionUtils;
|
||||
//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
|
||||
//import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
|
||||
//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
|
||||
//
|
||||
//import java.lang.reflect.Field;
|
||||
//import java.util.List;
|
||||
//import java.util.stream.Collectors;
|
||||
//
|
||||
//@Slf4j
|
||||
//@Configuration
|
||||
//public class BeanPostProcessorConfig {
|
||||
//
|
||||
// @Bean
|
||||
// public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
|
||||
// return new BeanPostProcessor() {
|
||||
// @Override
|
||||
// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||
// if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
|
||||
// customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
|
||||
// }
|
||||
// return bean;
|
||||
// }
|
||||
//
|
||||
// private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
|
||||
// List<T> copy = mappings.stream()
|
||||
// .filter(mapping -> mapping.getPatternParser() == null)
|
||||
// .collect(Collectors.toList());
|
||||
// mappings.clear();
|
||||
// mappings.addAll(copy);
|
||||
// }
|
||||
//
|
||||
// @SuppressWarnings("unchecked")
|
||||
// private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
|
||||
// try {
|
||||
// Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
|
||||
// field.setAccessible(true);
|
||||
// return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
|
||||
// } catch (IllegalArgumentException | IllegalAccessException e) {
|
||||
// throw new IllegalStateException(e);
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
//
|
||||
//}
|
||||
//
|
@ -0,0 +1,28 @@
|
||||
package com.supervision.config;
|
||||
|
||||
import com.supervision.police.service.OCRService;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.client.support.RestTemplateAdapter;
|
||||
import org.springframework.web.service.invoker.HttpServiceProxyFactory;
|
||||
import org.springframework.web.util.DefaultUriBuilderFactory;
|
||||
|
||||
@Configuration
|
||||
public class OCRServiceConfig {
|
||||
|
||||
@Value("${ocr.url}")
|
||||
private String ocrUrl;
|
||||
|
||||
@Bean
|
||||
public OCRService ocrService() {
|
||||
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(ocrUrl));
|
||||
|
||||
RestTemplateAdapter adapter = RestTemplateAdapter.create(restTemplate);
|
||||
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
|
||||
return factory.createClient(OCRService.class);
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package com.supervision.police.controller;
|
||||
|
||||
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.OCRTextDTO;
|
||||
import com.supervision.police.dto.RecordFileDTO;
|
||||
import com.supervision.police.service.OCRRecordService;
|
||||
import com.supervision.police.vo.NoteRecordReqVO;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@Slf4j
|
||||
@RequestMapping("/ocr/record")
|
||||
@ApiOperation(value = "OCR笔录接口")
|
||||
@RequiredArgsConstructor
|
||||
public class OCRRecordController {
|
||||
|
||||
private final OCRRecordService ocrRecordService;
|
||||
|
||||
/**
|
||||
* 保存笔录
|
||||
*/
|
||||
@PostMapping("/saveRecord")
|
||||
public R<String> saveRecord(@RequestBody NoteRecordReqVO noteRecordReqVO) {
|
||||
String recordId = ocrRecordService.saveRecord(noteRecordReqVO);
|
||||
return R.ok(recordId);
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/info")
|
||||
public R<NoteRecordDTO> queryRecordInfo(@RequestParam("recordId") String recordId) {
|
||||
NoteRecordDTO noteRecord = ocrRecordService.queryRecordInfo(recordId);
|
||||
return R.ok(noteRecord);
|
||||
}
|
||||
|
||||
@GetMapping("/fileList")
|
||||
public R<List<RecordFileDTO>> queryFileList(@RequestParam("recordId") String recordId) {
|
||||
List<RecordFileDTO> recordFileDTOList = ocrRecordService.queryFileList(recordId);
|
||||
return R.ok(recordFileDTOList);
|
||||
}
|
||||
|
||||
@GetMapping("/reOcr")
|
||||
public R<Boolean> reOcr(@RequestParam("ocrId") String ocrId) {
|
||||
Boolean success = ocrRecordService.reOcr(ocrId);
|
||||
return R.ok(success);
|
||||
}
|
||||
@PostMapping("/reviseOcrText")
|
||||
public R<Boolean> reviseOcrText(@RequestBody List<OCRTextDTO> ocrTextDTOList) {
|
||||
Boolean success = ocrRecordService.reviseOcrText(ocrTextDTOList);
|
||||
return R.ok(success);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package com.supervision.police.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class OCRRecordDTO {
|
||||
|
||||
@Schema(description = "笔录id")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "案件id")
|
||||
private String caseId;
|
||||
|
||||
@Schema(description = "姓名")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "笔录名称/供述材料")
|
||||
private String recordName;
|
||||
|
||||
|
||||
@Schema(description = "询问人")
|
||||
private String lawAsker;
|
||||
|
||||
|
||||
|
||||
@Schema(description = "供述开始时间")
|
||||
private String confessionStartTime;
|
||||
|
||||
|
||||
@Schema(description = " 供述结束时间")
|
||||
private String confessionEndTime;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private List<String> fileIdList;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.supervision.police.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class OCRReqDTO {
|
||||
|
||||
@Schema(description = "文件id")
|
||||
private List<String> file_ids = new ArrayList<>();
|
||||
|
||||
@Schema(description = "文件后缀")
|
||||
private String suffix;
|
||||
public OCRReqDTO() {
|
||||
}
|
||||
|
||||
public OCRReqDTO(List<String> file_ids, String suffix) {
|
||||
this.file_ids = file_ids;
|
||||
this.suffix = suffix;
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.supervision.police.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class OCRTextDTO {
|
||||
|
||||
private String ocrId;
|
||||
|
||||
private String reviseText;
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.supervision.police.service;
|
||||
|
||||
import com.supervision.police.domain.NoteRecord;
|
||||
import com.supervision.police.dto.NoteRecordDTO;
|
||||
import com.supervision.police.dto.OCRTextDTO;
|
||||
import com.supervision.police.dto.RecordFileDTO;
|
||||
import com.supervision.police.vo.NoteRecordReqVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface OCRRecordService {
|
||||
String saveRecord(NoteRecordReqVO noteRecordReqVO);
|
||||
|
||||
NoteRecordDTO queryRecordInfo(String recordId);
|
||||
|
||||
List<RecordFileDTO> queryFileList(String recordId);
|
||||
|
||||
Boolean reviseOcrText(String fileId,String reviseText);
|
||||
|
||||
Boolean reviseOcrText(List<OCRTextDTO> ocrTextDTOList);
|
||||
|
||||
Boolean reOcr(String ocrId);
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.supervision.police.service;
|
||||
|
||||
import com.supervision.police.dto.OCRReqDTO;
|
||||
import com.supervision.police.dto.OCRResDTO;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.service.annotation.HttpExchange;
|
||||
import org.springframework.web.service.annotation.PostExchange;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@HttpExchange
|
||||
public interface OCRService {
|
||||
|
||||
@PostExchange(url = "/ocr", contentType = MediaType.APPLICATION_JSON_VALUE)
|
||||
List<OCRResDTO> ocr(@RequestBody OCRReqDTO ocrReqDTO);
|
||||
}
|
@ -0,0 +1,121 @@
|
||||
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.supervision.minio.domain.MinioFile;
|
||||
import com.supervision.minio.service.MinioService;
|
||||
import com.supervision.police.domain.FileOcrProcess;
|
||||
import com.supervision.police.domain.NoteRecord;
|
||||
import com.supervision.police.dto.NoteRecordDTO;
|
||||
import com.supervision.police.dto.OCRReqDTO;
|
||||
import com.supervision.police.dto.OCRTextDTO;
|
||||
import com.supervision.police.dto.RecordFileDTO;
|
||||
import com.supervision.police.service.*;
|
||||
import com.supervision.police.vo.NoteRecordReqVO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class OCRRecordServiceImpl implements OCRRecordService {
|
||||
|
||||
private final FileOcrProcessService fileOcrProcessService;
|
||||
|
||||
private final NoteRecordService noteRecordService;
|
||||
@Override
|
||||
public String saveRecord(NoteRecordReqVO noteRecordReqVO) {
|
||||
|
||||
noteRecordReqVO.saveValidate();
|
||||
NoteRecord record = noteRecordReqVO.toNoteRecord();
|
||||
String recordId = noteRecordService.saveOrUpdRecord(record);
|
||||
|
||||
if (CollUtil.isEmpty(noteRecordReqVO.getFileIdList())){
|
||||
log.info("uploadRecords:文件内容为空...不进行笔录分析操作...");
|
||||
return recordId;
|
||||
}
|
||||
// 识别文件信息
|
||||
fileOcrProcessService.submitOCR(noteRecordReqVO.getFileIdList());
|
||||
return recordId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NoteRecordDTO queryRecordInfo(String recordId) {
|
||||
NoteRecord noteRecord = new NoteRecord();
|
||||
noteRecord.setId(recordId);
|
||||
List<NoteRecordDTO> noteRecordDTOS = noteRecordService.selectNoteRecordDTOList(noteRecord);
|
||||
if (CollUtil.isEmpty(noteRecordDTOS)){
|
||||
return new NoteRecordDTO();
|
||||
}
|
||||
return CollUtil.getFirst(noteRecordDTOS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RecordFileDTO> queryFileList(String recordId) {
|
||||
|
||||
NoteRecord noteRecord = noteRecordService.getById(recordId);
|
||||
String fileIds = noteRecord.getFileIds();
|
||||
if (StrUtil.isEmpty(fileIds)){
|
||||
log.info("queryFileList:笔录:{}对应的fileIds为空...",recordId);
|
||||
return CollUtil.newArrayList();
|
||||
}
|
||||
List<String> fileIdList = Arrays.stream(fileIds.split(",")).toList();
|
||||
|
||||
List<RecordFileDTO> recordFileDTOS = fileOcrProcessService.queryFileList(fileIdList);
|
||||
recordFileDTOS = sortByIdOrder(fileIdList, recordFileDTOS);
|
||||
recordFileDTOS.forEach(record->{
|
||||
record.formatFileSize();
|
||||
record.setDefaultEvidenceTypeDesc();
|
||||
});
|
||||
|
||||
return recordFileDTOS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean reviseOcrText(String id,String reviseText) {
|
||||
|
||||
Assert.notEmpty(id, "id不能为空");
|
||||
Assert.notEmpty(reviseText, "reviseText不能为空");
|
||||
|
||||
return fileOcrProcessService.lambdaUpdate()
|
||||
.eq(FileOcrProcess::getId, id)
|
||||
.set(FileOcrProcess::getReviseText, reviseText).update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean reviseOcrText(List<OCRTextDTO> ocrTextDTOList) {
|
||||
if (CollUtil.isEmpty(ocrTextDTOList)){
|
||||
return false;
|
||||
}
|
||||
ocrTextDTOList.forEach(ocrTextDTO -> this.reviseOcrText(ocrTextDTO.getOcrId(), ocrTextDTO.getReviseText()));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean reOcr(String ocrId) {
|
||||
FileOcrProcess fileOcrProcess = fileOcrProcessService.getById(ocrId);
|
||||
Assert.notNull(fileOcrProcess, "ocrId:{}对应的ocr信息不存在", ocrId);
|
||||
|
||||
fileOcrProcessService.doOCRTask(CollUtil.newArrayList(fileOcrProcess));
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<RecordFileDTO> sortByIdOrder(List<String> fileIdList,List<RecordFileDTO> recordFileDTOList){
|
||||
|
||||
if (CollUtil.size(fileIdList) < 2 || CollUtil.size(recordFileDTOList) < 2) {
|
||||
return recordFileDTOList;
|
||||
}
|
||||
|
||||
Map<String, RecordFileDTO> recordFileDTOMap = recordFileDTOList.stream()
|
||||
.collect(Collectors.toMap(RecordFileDTO::getFileId,recordFileDTO -> recordFileDTO, (k1, k2) -> k1));
|
||||
return fileIdList.stream().map(recordFileDTOMap::get).filter(Objects::nonNull).collect(Collectors.toList());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue