单张图片识别

segment2.0
linrf 2 years ago
parent cefb8077ed
commit 9c5c87dded

@ -3,8 +3,10 @@ package com.docus.server.controller;
import com.docus.server.common.event.FlowEvent;
import com.docus.server.common.service.IFileUploadService;
import com.docus.server.dto.segmentation.UploadBatchFileRequest;
import com.docus.server.entity.segmentation.OcrFileInfoTest;
import com.docus.server.service.IOcrCutConfigService;
import com.docus.server.service.IOcrCutConfigTestService;
import com.docus.server.service.IOcrFileInfoTestService;
import com.docus.server.service.IPublishEventService;
import com.docus.server.service.impl.CommonService;
import com.docus.server.service.impl.PlatformServiceImpl;
@ -50,6 +52,8 @@ public class FileController {
private CommonService commonService;
@Resource
private IPublishEventService iPublishEventService;
@Resource
private IOcrFileInfoTestService iOcrFileInfoTestService;
@ApiOperation("文件下载")
@GetMapping("/download")
@ -98,6 +102,35 @@ public class FileController {
return result;
}
@ApiOperation("单张文件上传")
@PostMapping("/singleUpload")
@ApiImplicitParams({
@ApiImplicitParam(name = "files", value = "文件", required = true, dataTypeClass = MultipartFile.class)
})
public OcrFileInfoTest singleUpload(@RequestPart("files") MultipartFile[] files, @Validated UploadBatchFileRequest request) throws Exception {
int testData = request.getTestData();
Double height;
Double widthStart;
Double widthEnd;
if (testData == 1) {
OcrCutConfigTestVO ocrCutConfigTestVO = iOcrCutConfigTestService.findAll().get(0);
height = ocrCutConfigTestVO.getHeight();
widthStart = ocrCutConfigTestVO.getWidthStart();
widthEnd = ocrCutConfigTestVO.getWidthEnd();
} else {
OcrCutConfigVO ocrCutConfigVO = iOcrCutConfigService.findAll().get(0);
height = ocrCutConfigVO.getHeight();
widthStart = ocrCutConfigVO.getWidthStart();
widthEnd = ocrCutConfigVO.getWidthEnd();
}
List<UploadFileVO> segmentation = iFileUploadService.uploadFile(files, "singleSegmentation", height, widthStart, widthEnd);
return commonService.getOcr(segmentation.get(0), request);
}
/**
*
*

@ -5,7 +5,9 @@ import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.dto.segmentation.ocrfileinfotest.AddOcrFileInfoTestDTO;
import com.docus.server.dto.segmentation.ocrfileinfotest.DeleteOcrFileInfoTestDTO;
import com.docus.server.dto.segmentation.ocrfileinfotest.EditOcrFileInfoTestDTO;
import com.docus.server.entity.segmentation.OcrFileInfoTest;
import com.docus.server.vo.segmentation.ocrfileinfotest.OcrFileInfoTestVO;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@ -31,6 +33,9 @@ public interface IOcrFileInfoTestService {
*/
List<OcrFileInfoTestVO> findAll();
@Transactional(rollbackFor = Exception.class)
Long saveOrUpdate(AddOcrFileInfoTestDTO files);
/**
*
*
@ -64,4 +69,6 @@ public interface IOcrFileInfoTestService {
PageResult<OcrFileInfoTestVO> search(SearchDTO searchDTO);
void addBatch(List<AddOcrFileInfoTestDTO> files);
OcrFileInfoTest findOneBy(String patientId);
}

@ -32,13 +32,13 @@ public class StartOcrTestHandler {
@TrackRetryListener("START_OCR_TEST")
public List<OcrFileInfoTest> startOcr(String patientId) {
public List<OcrFileInfoTest> startOcr(String patientId) {
boolean isSpecialFile = false;
OcrSpecialResult lastSpecialResul = null;
//根据病案号查询文件列表
List<OcrFileInfoTest> fileInfoTestList = iOcrFileInfoTestDao.findBy("patientId",patientId);
for (OcrFileInfoTest fileInfoTest:fileInfoTestList) {
List<OcrFileInfoTest> fileInfoTestList = iOcrFileInfoTestDao.findBy("patientId", patientId);
for (OcrFileInfoTest fileInfoTest : fileInfoTestList) {
//遍历文件列表 获取ocr识别结果
List<String> ocrTextList = ocrApi.getText(fileInfoTest.getPicCutUrl());
@ -47,12 +47,12 @@ public class StartOcrTestHandler {
fileInfoTest.setOcrStatus(OcrStatusEnum.COMPLETE);
fileInfoTest.setOcrFinishTime(new Date());
//判断上次是否特殊文件开始 需要判断是否特殊文件结尾
if (isSpecialFile){
if (isSpecialFile) {
fileInfoTest.setAssortId(lastSpecialResul.getAssortId());
fileInfoTest.setAssortName(lastSpecialResul.getAssortName());
fileInfoTest.setRuleId(lastSpecialResul.getRuleId());
boolean b = iOcrSpecialRuleTestService.handleSpecialRuleEnd(lastSpecialResul, ocrTextList);
if (b){
if (b) {
//当前分段为特殊分段结尾
isSpecialFile = false;
lastSpecialResul = null;
@ -62,7 +62,7 @@ public class StartOcrTestHandler {
//优先判断是否特殊规则开始
OcrSpecialResult ocrSpecialResult = iOcrSpecialRuleTestService.handleSpecialRule(ocrTextList);
//判断是否属于某个分段
if (ocrSpecialResult!=null){
if (ocrSpecialResult != null) {
fileInfoTest.setAssortId(ocrSpecialResult.getAssortId());
fileInfoTest.setAssortName(ocrSpecialResult.getAssortName());
fileInfoTest.setRuleId(ocrSpecialResult.getRuleId());
@ -75,7 +75,7 @@ public class StartOcrTestHandler {
}
OcrRuleResult ocrRuleResult = iOcrRuleTestService.handleRule(ocrTextList);
//更新文件数据的分段
if (ocrRuleResult!=null){
if (ocrRuleResult != null) {
fileInfoTest.setAssortId(ocrRuleResult.getAssortId());
fileInfoTest.setAssortName(ocrRuleResult.getAssortName());
fileInfoTest.setRuleId(ocrRuleResult.getRuleId());
@ -84,7 +84,7 @@ public class StartOcrTestHandler {
}
}
//更新数据库表
iOcrFileInfoTestDao.updateBatchById(fileInfoTestList,1000);
iOcrFileInfoTestDao.updateBatchById(fileInfoTestList, 1000);
return fileInfoTestList;
}

@ -1,17 +1,24 @@
package com.docus.server.service.impl;
import cn.hutool.core.io.FileUtil;
import com.docus.core.util.Func;
import com.docus.core.util.json.JSON;
import com.docus.server.api.ocr.OcrApi;
import com.docus.server.dto.segmentation.UploadBatchFileRequest;
import com.docus.server.dto.segmentation.ocrbasic.AddOcrBasicDTO;
import com.docus.server.dto.segmentation.ocrbasictest.AddOcrBasicTestDTO;
import com.docus.server.dto.segmentation.ocrfileinfo.AddOcrFileInfoDTO;
import com.docus.server.dto.segmentation.ocrfileinfotest.AddOcrFileInfoTestDTO;
import com.docus.server.dto.segmentation.ocrfileinfotest.DeleteOcrFileInfoTestDTO;
import com.docus.server.entity.segmentation.OcrFileInfoTest;
import com.docus.server.enums.OcrStatusEnum;
import com.docus.server.service.IOcrBasicService;
import com.docus.server.service.IOcrBasicTestService;
import com.docus.server.service.IOcrFileInfoService;
import com.docus.server.service.IOcrFileInfoTestService;
import com.docus.server.service.handler.StartOcrTestHandler;
import com.docus.server.vo.scheduling.management.schcollectorversionfile.UploadFileVO;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -31,6 +38,10 @@ public class CommonService {
private IOcrBasicTestService iOcrBasicTestService;
@Resource
private IOcrFileInfoTestService iOcrFileInfoTestService;
@Resource
private OcrApi ocrApi;
@Resource
private StartOcrTestHandler startOcrTestHandler;
@Transactional(rollbackFor = Exception.class)
public Object add(List<UploadFileVO> segmentation, UploadBatchFileRequest request) {
@ -109,4 +120,60 @@ public class CommonService {
}
}
@Transactional(rollbackFor = Exception.class)
public AddOcrFileInfoTestDTO add(UploadFileVO uploadFileVO, UploadBatchFileRequest request) {
AddOcrFileInfoTestDTO addOcrFileInfoDTO = new AddOcrFileInfoTestDTO();
// addOcrFileInfoDTO.setPatientId(request.getPatientId());
addOcrFileInfoDTO.setFileTitle(uploadFileVO.getFileTitle());
addOcrFileInfoDTO.setPicName(uploadFileVO.getFileName());
addOcrFileInfoDTO.setFileType(2);
addOcrFileInfoDTO.setSerialNumber(UUID.randomUUID().toString().replace("-", ""));
addOcrFileInfoDTO.setPicUrl(uploadFileVO.getSaveFilePath() + uploadFileVO.getFilePath());
addOcrFileInfoDTO.setPicCompressUrl(uploadFileVO.getSaveCompressFilePath() + uploadFileVO.getFilePath());
addOcrFileInfoDTO.setPicCutUrl(uploadFileVO.getSaveCutFilePath() + uploadFileVO.getFilePath());
addOcrFileInfoDTO.setFileSize(uploadFileVO.getFileSize());
addOcrFileInfoDTO.setHeight(uploadFileVO.getHeight());
addOcrFileInfoDTO.setWidth(uploadFileVO.getWidth());
addOcrFileInfoDTO.setX(uploadFileVO.getX());
addOcrFileInfoDTO.setY(uploadFileVO.getY());
addOcrFileInfoDTO.setJsonStr(JSON.toJSON(uploadFileVO.getParams()));
addOcrFileInfoDTO.setOcrStatus(OcrStatusEnum.NO_START);
Long id = iOcrFileInfoTestService.saveOrUpdate(addOcrFileInfoDTO);
addOcrFileInfoDTO.setPatientId(String.valueOf(id));
addOcrFileInfoDTO.setId(id);
return addOcrFileInfoDTO;
}
public OcrFileInfoTest getOcr(UploadFileVO uploadFileVO, UploadBatchFileRequest request) {
//上一份
String patientId = request.getPatientId();
if (Func.isNotBlank(patientId)) {
OcrFileInfoTest ocrFileInfoTest = iOcrFileInfoTestService.findOneBy(patientId);
if (null != ocrFileInfoTest) {
iOcrFileInfoTestService.delete(DeleteOcrFileInfoTestDTO.builder().ids(Lists.newArrayList(ocrFileInfoTest.getId())).build());
FileUtil.del(ocrFileInfoTest.getPicUrl());
FileUtil.del(ocrFileInfoTest.getPicCompressUrl());
FileUtil.del(ocrFileInfoTest.getPicCutUrl());
}
}
//当前
AddOcrFileInfoTestDTO addOcrFileInfoTestDTO = this.add(uploadFileVO, request);
List<OcrFileInfoTest> ocrFileInfoTests = startOcrTestHandler.startOcr(addOcrFileInfoTestDTO.getPatientId());
if (Func.isNotEmpty(ocrFileInfoTests)) {
return ocrFileInfoTests.get(0);
} else {
return null;
}
}
}

@ -72,6 +72,22 @@ public class OcrFileInfoTestServiceImpl implements IOcrFileInfoTestService {
iOcrFileInfoTestDao.saveBatch(ocrFileInfos, 500);
}
@Override
public OcrFileInfoTest findOneBy(String patientId) {
return iOcrFileInfoTestDao.findOneBy("patientId", patientId);
}
@Transactional(rollbackFor = Exception.class)
@Override
public Long saveOrUpdate(AddOcrFileInfoTestDTO files) {
OcrFileInfoTest ocrFileInfos = OcrFileInfoTestConvert.INSTANCE.convertDO(files);
ocrFileInfos.setId(idService.getDateSeq());
ocrFileInfos.setPatientId(String.valueOf(ocrFileInfos.getId()));
iOcrFileInfoTestDao.saveOrUpdate(ocrFileInfos);
return ocrFileInfos.getId();
}
/**
*

@ -8,7 +8,10 @@ import com.docus.server.convert.OcrRuleTestConvert;
import com.docus.server.dto.segmentation.ocrruletest.AddOcrRuleTestDTO;
import com.docus.server.dto.segmentation.ocrruletest.DeleteOcrRuleTestDTO;
import com.docus.server.dto.segmentation.ocrruletest.EditOcrRuleTestDTO;
import com.docus.server.entity.segmentation.*;
import com.docus.server.entity.segmentation.OcrRuleJson;
import com.docus.server.entity.segmentation.OcrRuleResult;
import com.docus.server.entity.segmentation.OcrRuleSecondJson;
import com.docus.server.entity.segmentation.OcrRuleTest;
import com.docus.server.infrastructure.dao.IOcrRuleTestDao;
import com.docus.server.service.IOcrRuleTestService;
import com.docus.server.vo.segmentation.ocrruletest.OcrRuleTestVO;
@ -53,13 +56,13 @@ public class OcrRuleTestServiceImpl implements IOcrRuleTestService {
//判断二级是否启用
if (ocrRuleTest.getIsUseSecond() && Func.isNotEmpty(ocrRuleTest.getJson())) {
List<OcrRuleJson> ocrRuleList = Func.parseJsonArray(ocrRuleTest.getJson(), OcrRuleJson.class)
.stream().sorted(Comparator.comparing(OcrRuleJson::getSort))
.collect(Collectors.toList());
.stream().sorted(Comparator.comparing(OcrRuleJson::getSort))
.collect(Collectors.toList());
for (OcrRuleJson ruleJson : ocrRuleList) {
//匹配二级的关键词列表
assortId = ruleJson.getAssortId();
List<OcrRuleSecondJson> ocrRuleSecondJsonList = ruleJson.getKeyWordList();
for (OcrRuleSecondJson ocrRuleSecondJson:ocrRuleSecondJsonList) {
for (OcrRuleSecondJson ocrRuleSecondJson : ocrRuleSecondJsonList) {
keyWordList = ocrRuleSecondJson.getKeyWord().split("#");
score = ocrRuleSecondJson.getMatchRatio();
for (int j = 0; j < keyWordList.length; j++) {
@ -146,15 +149,15 @@ public class OcrRuleTestServiceImpl implements IOcrRuleTestService {
@Override
public void deleteAndAdd(List<EditOcrRuleTestDTO> editOcrRuleTestDTOList) {
List<OcrRuleTest> ruleTestList = editOcrRuleTestDTOList.stream().map(m->{
List<OcrRuleTest> ruleTestList = editOcrRuleTestDTOList.stream().map(m -> {
OcrRuleTest ocrRuleTest = OcrRuleTestConvert.INSTANCE.convertDO(m);
ocrRuleTest.setId(ocrRuleTest.getId()==null?idService.getDateSeq():ocrRuleTest.getId());
ocrRuleTest.setId(ocrRuleTest.getId() == null ? idService.getDateSeq() : ocrRuleTest.getId());
return ocrRuleTest;
}).collect(Collectors.toList());
String assortId = ruleTestList.get(0).getAssortId();
iOcrRuleTestDao.deleteBy("assortId",assortId);
iOcrRuleTestDao.saveBatch(ruleTestList,1000);
iOcrRuleTestDao.deleteBy("assortId", assortId);
iOcrRuleTestDao.saveBatch(ruleTestList, 1000);
}
/**

Loading…
Cancel
Save