单张图片识别

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.event.FlowEvent;
import com.docus.server.common.service.IFileUploadService; import com.docus.server.common.service.IFileUploadService;
import com.docus.server.dto.segmentation.UploadBatchFileRequest; 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.IOcrCutConfigService;
import com.docus.server.service.IOcrCutConfigTestService; import com.docus.server.service.IOcrCutConfigTestService;
import com.docus.server.service.IOcrFileInfoTestService;
import com.docus.server.service.IPublishEventService; import com.docus.server.service.IPublishEventService;
import com.docus.server.service.impl.CommonService; import com.docus.server.service.impl.CommonService;
import com.docus.server.service.impl.PlatformServiceImpl; import com.docus.server.service.impl.PlatformServiceImpl;
@ -50,6 +52,8 @@ public class FileController {
private CommonService commonService; private CommonService commonService;
@Resource @Resource
private IPublishEventService iPublishEventService; private IPublishEventService iPublishEventService;
@Resource
private IOcrFileInfoTestService iOcrFileInfoTestService;
@ApiOperation("文件下载") @ApiOperation("文件下载")
@GetMapping("/download") @GetMapping("/download")
@ -98,6 +102,35 @@ public class FileController {
return result; 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.AddOcrFileInfoTestDTO;
import com.docus.server.dto.segmentation.ocrfileinfotest.DeleteOcrFileInfoTestDTO; import com.docus.server.dto.segmentation.ocrfileinfotest.DeleteOcrFileInfoTestDTO;
import com.docus.server.dto.segmentation.ocrfileinfotest.EditOcrFileInfoTestDTO; import com.docus.server.dto.segmentation.ocrfileinfotest.EditOcrFileInfoTestDTO;
import com.docus.server.entity.segmentation.OcrFileInfoTest;
import com.docus.server.vo.segmentation.ocrfileinfotest.OcrFileInfoTestVO; import com.docus.server.vo.segmentation.ocrfileinfotest.OcrFileInfoTestVO;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -31,6 +33,9 @@ public interface IOcrFileInfoTestService {
*/ */
List<OcrFileInfoTestVO> findAll(); List<OcrFileInfoTestVO> findAll();
@Transactional(rollbackFor = Exception.class)
Long saveOrUpdate(AddOcrFileInfoTestDTO files);
/** /**
* *
* *
@ -64,4 +69,6 @@ public interface IOcrFileInfoTestService {
PageResult<OcrFileInfoTestVO> search(SearchDTO searchDTO); PageResult<OcrFileInfoTestVO> search(SearchDTO searchDTO);
void addBatch(List<AddOcrFileInfoTestDTO> files); void addBatch(List<AddOcrFileInfoTestDTO> files);
OcrFileInfoTest findOneBy(String patientId);
} }

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

@ -1,17 +1,24 @@
package com.docus.server.service.impl; 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.core.util.json.JSON;
import com.docus.server.api.ocr.OcrApi;
import com.docus.server.dto.segmentation.UploadBatchFileRequest; import com.docus.server.dto.segmentation.UploadBatchFileRequest;
import com.docus.server.dto.segmentation.ocrbasic.AddOcrBasicDTO; import com.docus.server.dto.segmentation.ocrbasic.AddOcrBasicDTO;
import com.docus.server.dto.segmentation.ocrbasictest.AddOcrBasicTestDTO; import com.docus.server.dto.segmentation.ocrbasictest.AddOcrBasicTestDTO;
import com.docus.server.dto.segmentation.ocrfileinfo.AddOcrFileInfoDTO; import com.docus.server.dto.segmentation.ocrfileinfo.AddOcrFileInfoDTO;
import com.docus.server.dto.segmentation.ocrfileinfotest.AddOcrFileInfoTestDTO; 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.enums.OcrStatusEnum;
import com.docus.server.service.IOcrBasicService; import com.docus.server.service.IOcrBasicService;
import com.docus.server.service.IOcrBasicTestService; import com.docus.server.service.IOcrBasicTestService;
import com.docus.server.service.IOcrFileInfoService; import com.docus.server.service.IOcrFileInfoService;
import com.docus.server.service.IOcrFileInfoTestService; import com.docus.server.service.IOcrFileInfoTestService;
import com.docus.server.service.handler.StartOcrTestHandler;
import com.docus.server.vo.scheduling.management.schcollectorversionfile.UploadFileVO; import com.docus.server.vo.scheduling.management.schcollectorversionfile.UploadFileVO;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -31,6 +38,10 @@ public class CommonService {
private IOcrBasicTestService iOcrBasicTestService; private IOcrBasicTestService iOcrBasicTestService;
@Resource @Resource
private IOcrFileInfoTestService iOcrFileInfoTestService; private IOcrFileInfoTestService iOcrFileInfoTestService;
@Resource
private OcrApi ocrApi;
@Resource
private StartOcrTestHandler startOcrTestHandler;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Object add(List<UploadFileVO> segmentation, UploadBatchFileRequest request) { 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); 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.AddOcrRuleTestDTO;
import com.docus.server.dto.segmentation.ocrruletest.DeleteOcrRuleTestDTO; import com.docus.server.dto.segmentation.ocrruletest.DeleteOcrRuleTestDTO;
import com.docus.server.dto.segmentation.ocrruletest.EditOcrRuleTestDTO; 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.infrastructure.dao.IOcrRuleTestDao;
import com.docus.server.service.IOcrRuleTestService; import com.docus.server.service.IOcrRuleTestService;
import com.docus.server.vo.segmentation.ocrruletest.OcrRuleTestVO; import com.docus.server.vo.segmentation.ocrruletest.OcrRuleTestVO;
@ -53,13 +56,13 @@ public class OcrRuleTestServiceImpl implements IOcrRuleTestService {
//判断二级是否启用 //判断二级是否启用
if (ocrRuleTest.getIsUseSecond() && Func.isNotEmpty(ocrRuleTest.getJson())) { if (ocrRuleTest.getIsUseSecond() && Func.isNotEmpty(ocrRuleTest.getJson())) {
List<OcrRuleJson> ocrRuleList = Func.parseJsonArray(ocrRuleTest.getJson(), OcrRuleJson.class) List<OcrRuleJson> ocrRuleList = Func.parseJsonArray(ocrRuleTest.getJson(), OcrRuleJson.class)
.stream().sorted(Comparator.comparing(OcrRuleJson::getSort)) .stream().sorted(Comparator.comparing(OcrRuleJson::getSort))
.collect(Collectors.toList()); .collect(Collectors.toList());
for (OcrRuleJson ruleJson : ocrRuleList) { for (OcrRuleJson ruleJson : ocrRuleList) {
//匹配二级的关键词列表 //匹配二级的关键词列表
assortId = ruleJson.getAssortId(); assortId = ruleJson.getAssortId();
List<OcrRuleSecondJson> ocrRuleSecondJsonList = ruleJson.getKeyWordList(); List<OcrRuleSecondJson> ocrRuleSecondJsonList = ruleJson.getKeyWordList();
for (OcrRuleSecondJson ocrRuleSecondJson:ocrRuleSecondJsonList) { for (OcrRuleSecondJson ocrRuleSecondJson : ocrRuleSecondJsonList) {
keyWordList = ocrRuleSecondJson.getKeyWord().split("#"); keyWordList = ocrRuleSecondJson.getKeyWord().split("#");
score = ocrRuleSecondJson.getMatchRatio(); score = ocrRuleSecondJson.getMatchRatio();
for (int j = 0; j < keyWordList.length; j++) { for (int j = 0; j < keyWordList.length; j++) {
@ -146,15 +149,15 @@ public class OcrRuleTestServiceImpl implements IOcrRuleTestService {
@Override @Override
public void deleteAndAdd(List<EditOcrRuleTestDTO> editOcrRuleTestDTOList) { 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 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; return ocrRuleTest;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
String assortId = ruleTestList.get(0).getAssortId(); String assortId = ruleTestList.get(0).getAssortId();
iOcrRuleTestDao.deleteBy("assortId",assortId); iOcrRuleTestDao.deleteBy("assortId", assortId);
iOcrRuleTestDao.saveBatch(ruleTestList,1000); iOcrRuleTestDao.saveBatch(ruleTestList, 1000);
} }
/** /**

Loading…
Cancel
Save