同步调试环境到现在、使用此版本

segment2.0
zhanglb 2 years ago
parent 9c5c87dded
commit 0ec0ccd7c9

@ -28,6 +28,7 @@ import java.util.List;
@RequestMapping("/ocr/Version")
public interface OcrVersionApi {
/**
*
*

@ -59,7 +59,7 @@ public class AddOcrBasicDTO implements Serializable {
private String disDeptName;
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
private Date ocrFinishTime;

@ -59,7 +59,7 @@ public class EditOcrBasicDTO implements Serializable {
private String disDeptName;
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
private Date ocrFinishTime;

@ -1,5 +1,6 @@
package com.docus.server.dto.segmentation.ocrbasictest;
import com.docus.server.enums.OcrStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
@ -54,7 +55,7 @@ public class AddOcrBasicTestDTO implements Serializable {
private String disDeptName;
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
private Date ocrFinishTime;

@ -59,7 +59,7 @@ public class EditOcrBasicTestDTO implements Serializable {
private String disDeptName;
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
private Date ocrFinishTime;

@ -75,7 +75,7 @@ public class OcrBasic implements Serializable {
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
@TableField("ocr_statue")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
@TableField("ocr_finish_time")

@ -75,7 +75,7 @@ public class OcrBasicTest implements Serializable {
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
@TableField("ocr_statue")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
@TableField("ocr_finish_time")

@ -59,7 +59,7 @@ public class OcrBasicVO implements Serializable {
private String disDeptName;
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
private Date ocrFinishTime;

@ -59,7 +59,7 @@ public class OcrBasicTestVO implements Serializable {
private String disDeptName;
@ApiModelProperty(value = "ocr状态 0未开始 1正在分段 2分段完成")
private Boolean ocrStatue;
private OcrStatusEnum ocrStatue;
@ApiModelProperty(value = "分段完成时间")
private Date ocrFinishTime;

@ -14,6 +14,14 @@ import java.util.List;
* @since 2023-08-29
*/
public interface IOcrVersionDao extends IBaseDao<OcrVersion> {
/**
*
* @return
*/
OcrVersion findMaxVersion();
/**
*
*

@ -1,6 +1,7 @@
package com.docus.server.infrastructure.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.docus.infrastructure.core.db.dao.impl.BaseDaoImpl;
import com.docus.infrastructure.web.request.SearchDTO;
@ -23,6 +24,13 @@ import java.util.List;
@Repository
public class OcrVersionDaoImpl extends BaseDaoImpl<OcrVersionMapper, OcrVersion> implements IOcrVersionDao {
@Override
public OcrVersion findMaxVersion() {
QueryWrapper<OcrVersion> query =new QueryWrapper<>();
query.select("max(version) as version");
return this.baseMapper.selectOne(query);
}
/**
*
*
@ -79,13 +87,13 @@ public class OcrVersionDaoImpl extends BaseDaoImpl<OcrVersionMapper, OcrVersion>
PageHelper.startPage(searchDTO.getPageNum(), searchDTO.getPageSize());
LambdaQueryWrapper<OcrVersion> query = Wrappers.lambdaQuery();
//时间范围默认按createTime
if (searchDTO.getBeginTime() != null) {
query.ge(OcrVersion::getCreateTime, searchDTO.getBeginTime());
}
if (searchDTO.getEndTime() != null) {
Date endTime = searchDTO.getEndTime();
query.le(OcrVersion::getCreateTime, endTime);
}
// if (searchDTO.getBeginTime() != null) {
// query.ge(OcrVersion::getCreateTime, searchDTO.getBeginTime());
// }
// if (searchDTO.getEndTime() != null) {
// Date endTime = searchDTO.getEndTime();
// query.le(OcrVersion::getCreateTime, endTime);
// }
//关键字比较多个列or
//if (!StringUtils.isEmpty(searchDTO.getKeyword())) {
//单个列用like

@ -5,6 +5,7 @@ import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.dto.segmentation.ocrrule.AddOcrRuleDTO;
import com.docus.server.dto.segmentation.ocrrule.DeleteOcrRuleDTO;
import com.docus.server.dto.segmentation.ocrrule.EditOcrRuleDTO;
import com.docus.server.entity.segmentation.OcrRuleResult;
import com.docus.server.vo.segmentation.ocrrule.OcrRuleVO;
import java.util.List;
@ -62,4 +63,7 @@ public interface IOcrRuleService {
* @return
*/
PageResult<OcrRuleVO> search(SearchDTO searchDTO);
OcrRuleResult handleRule(List<String> ocrTextList,Integer version);
}

@ -5,6 +5,7 @@ import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.dto.segmentation.ocrspecialrule.AddOcrSpecialRuleDTO;
import com.docus.server.dto.segmentation.ocrspecialrule.DeleteOcrSpecialRuleDTO;
import com.docus.server.dto.segmentation.ocrspecialrule.EditOcrSpecialRuleDTO;
import com.docus.server.entity.segmentation.OcrSpecialResult;
import com.docus.server.vo.segmentation.ocrspecialrule.OcrSpecialRuleVO;
import java.util.List;
@ -62,4 +63,9 @@ public interface IOcrSpecialRuleService {
* @return
*/
PageResult<OcrSpecialRuleVO> search(SearchDTO searchDTO);
boolean handleSpecialRuleEnd(OcrSpecialResult lastSpecialResul, List<String> ocrTextList);
OcrSpecialResult handleSpecialRule(List<String> ocrTextList,Integer version);
}

@ -1,16 +1,100 @@
package com.docus.server.service.handler;
import com.docus.core.util.Func;
import com.docus.log.annotation.TrackRetryListener;
import com.docus.server.api.ocr.OcrApi;
import com.docus.server.entity.segmentation.OcrFileInfo;
import com.docus.server.entity.segmentation.OcrRuleResult;
import com.docus.server.entity.segmentation.OcrSpecialResult;
import com.docus.server.entity.segmentation.OcrVersion;
import com.docus.server.enums.OcrStatusEnum;
import com.docus.server.infrastructure.dao.IOcrFileInfoDao;
import com.docus.server.infrastructure.dao.IOcrVersionDao;
import com.docus.server.service.IOcrRuleService;
import com.docus.server.service.IOcrSpecialRuleService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
*
*/
@Component
public class StartSegmentHandler {
@Resource
private OcrApi ocrApi;
@Resource
private IOcrFileInfoDao iOcrFileInfoDao;
@Resource
private IOcrSpecialRuleService iOcrSpecialRuleService;
@Resource
private IOcrRuleService iOcrRuleService;
@Resource
private IOcrVersionDao iOcrVersionDao;
@TrackRetryListener("START_SEGMENT")
public void startSegment(String patientId) {
System.out.println(patientId);
boolean isSpecialFile = false;
OcrSpecialResult lastSpecialResul = null;
OcrVersion ocrVersion = iOcrVersionDao.findOneBy("", "");
if (ocrVersion==null){
throw new RuntimeException("当前没有启用的版本号");
}
Integer version = ocrVersion.getVersion();
//根据病案号查询文件列表
List<OcrFileInfo> fileInfoList = iOcrFileInfoDao.findBy("patientId",patientId);
for (OcrFileInfo fileInfo:fileInfoList) {
//遍历文件列表 获取ocr识别结果
List<String> ocrTextList = ocrApi.getText(fileInfo.getPicCutUrl());
fileInfo.setOcrText(Func.toJson(ocrTextList));
fileInfo.setOcrStatus(OcrStatusEnum.COMPLETE);
fileInfo.setOcrFinishTime(new Date());
//判断上次是否特殊文件开始 需要判断是否特殊文件结尾
if (isSpecialFile){
fileInfo.setAssortId(lastSpecialResul.getAssortId());
fileInfo.setAssortName(lastSpecialResul.getAssortName());
fileInfo.setRuleId(lastSpecialResul.getRuleId());
boolean b = iOcrSpecialRuleService.handleSpecialRuleEnd(lastSpecialResul, ocrTextList);
if (b){
//当前分段为特殊分段结尾
isSpecialFile = false;
lastSpecialResul = null;
}
continue;
}
//优先判断是否特殊规则开始
OcrSpecialResult ocrSpecialResult = iOcrSpecialRuleService.handleSpecialRule(ocrTextList,version);
//判断是否属于某个分段
if (ocrSpecialResult!=null){
fileInfo.setAssortId(ocrSpecialResult.getAssortId());
fileInfo.setAssortName(ocrSpecialResult.getAssortName());
fileInfo.setRuleId(ocrSpecialResult.getRuleId());
fileInfo.setHitKey(ocrSpecialResult.getHitKey());
fileInfo.setRate(ocrSpecialResult.getRate());
isSpecialFile = true;
lastSpecialResul = ocrSpecialResult;
continue;
}
OcrRuleResult ocrRuleResult = iOcrRuleService.handleRule(ocrTextList,version);
//更新文件数据的分段
if (ocrRuleResult!=null){
fileInfo.setAssortId(ocrRuleResult.getAssortId());
fileInfo.setAssortName(ocrRuleResult.getAssortName());
fileInfo.setRuleId(ocrRuleResult.getRuleId());
fileInfo.setHitKey(ocrRuleResult.getHitKey());
fileInfo.setRate(ocrRuleResult.getRate());
}
}
//更新数据库表
iOcrFileInfoDao.updateBatchById(fileInfoList,1000);
}
}

@ -1,5 +1,6 @@
package com.docus.server.service.impl;
import com.docus.core.util.Func;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult;
@ -7,7 +8,7 @@ import com.docus.server.convert.OcrRuleConvert;
import com.docus.server.dto.segmentation.ocrrule.AddOcrRuleDTO;
import com.docus.server.dto.segmentation.ocrrule.DeleteOcrRuleDTO;
import com.docus.server.dto.segmentation.ocrrule.EditOcrRuleDTO;
import com.docus.server.entity.segmentation.OcrRule;
import com.docus.server.entity.segmentation.*;
import com.docus.server.infrastructure.dao.IOcrRuleDao;
import com.docus.server.service.IOcrRuleService;
import com.docus.server.vo.segmentation.ocrrule.OcrRuleVO;
@ -15,7 +16,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
*
@ -79,6 +82,68 @@ public class OcrRuleServiceImpl implements IOcrRuleService {
//return result;
}
@Override
public OcrRuleResult handleRule(List<String> ocrTextList,Integer version) {
//查询所有规则列表
List<OcrRule> ocrRules = iOcrRuleDao.findBy("version",version);
//判断是否符合某个条件的开始条件
for (OcrRule ocrRule : ocrRules) {
String assortId = ocrRule.getAssortId();
double score = ocrRule.getMatchRatio();
String[] keyWordList = ocrRule.getKeyWord().split("#");
for (String ocrText : ocrTextList) {
for (int i = 0; i < keyWordList.length; i++) {
String keyWord = keyWordList[i];
if (ocrText.contains(keyWord)) {
double rate = keyWord.length() / (double) ocrText.length() * 100;
//判断是否命中
if (rate >= score) {
//判断二级是否启用
if (ocrRule.getIsUseSecond() && Func.isNotEmpty(ocrRule.getJson())) {
List<OcrRuleJson> ocrRuleList = Func.parseJsonArray(ocrRule.getJson(), OcrRuleJson.class)
.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) {
keyWordList = ocrRuleSecondJson.getKeyWord().split("#");
score = ocrRuleSecondJson.getMatchRatio();
for (int j = 0; j < keyWordList.length; j++) {
keyWord = keyWordList[i];
if (ocrText.contains(keyWord)) {
rate = keyWord.length() / (double) ocrText.length() * 100;
//判断是否命中
if (rate >= score) {
OcrRuleResult ocrRuleResult = new OcrRuleResult();
ocrRuleResult.setRuleId(ocrRule.getId());
ocrRuleResult.setAssortId(assortId);
ocrRuleResult.setHitKey(keyWord);
ocrRuleResult.setRate(rate);
return ocrRuleResult;
}
}
}
}
}
} else {
OcrRuleResult ocrRuleResult = new OcrRuleResult();
ocrRuleResult.setRuleId(ocrRule.getId());
ocrRuleResult.setAssortId(assortId);
ocrRuleResult.setHitKey(keyWord);
ocrRuleResult.setRate(rate);
return ocrRuleResult;
}
}
}
}
}
}
return null;
}
/**
*
*

@ -1,5 +1,6 @@
package com.docus.server.service.impl;
import com.docus.core.util.Func;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult;
@ -7,7 +8,9 @@ import com.docus.server.convert.OcrSpecialRuleConvert;
import com.docus.server.dto.segmentation.ocrspecialrule.AddOcrSpecialRuleDTO;
import com.docus.server.dto.segmentation.ocrspecialrule.DeleteOcrSpecialRuleDTO;
import com.docus.server.dto.segmentation.ocrspecialrule.EditOcrSpecialRuleDTO;
import com.docus.server.entity.segmentation.OcrSpecialResult;
import com.docus.server.entity.segmentation.OcrSpecialRule;
import com.docus.server.entity.segmentation.OcrSpecialRuleJson;
import com.docus.server.infrastructure.dao.IOcrSpecialRuleDao;
import com.docus.server.service.IOcrSpecialRuleService;
import com.docus.server.vo.segmentation.ocrspecialrule.OcrSpecialRuleVO;
@ -79,6 +82,70 @@ public class OcrSpecialRuleServiceImpl implements IOcrSpecialRuleService {
//return result;
}
@Override
public boolean handleSpecialRuleEnd(OcrSpecialResult lastSpecialResul, List<String> ocrTextList) {
//获取结束条件列表
List<OcrSpecialRuleJson> ocrSpecialRuleJsons = Func.parseJsonArray(lastSpecialResul.getEndJson(), OcrSpecialRuleJson.class);
//判断得分占比
for (OcrSpecialRuleJson ocrSpecialRuleJson : ocrSpecialRuleJsons) {
double score = ocrSpecialRuleJson.getScore();
String[] keyWordList = ocrSpecialRuleJson.getKeyWord().split("#");
for (String ocrText : ocrTextList) {
for (int i = 0; i < keyWordList.length; i++) {
String keyWord = keyWordList[i];
if (ocrText.contains(keyWord)){
double rate = keyWord.length() / (double)ocrText.length() * 100;
//判断是否命中
if (rate>=score) {
//返回结束
return true;
}
}
}
}
}
//默认返回没结束
return false;
}
@Override
public OcrSpecialResult handleSpecialRule(List<String> ocrTextList,Integer version) {
// 查询所以的特殊规则列表
List<OcrSpecialRule> all = iOcrSpecialRuleDao.findBy("version",version);
//判断是否符合某个条件的开始条件
for (OcrSpecialRule ocrSpecialRule : all) {
String assortId = ocrSpecialRule.getAssortId();
String startJson = ocrSpecialRule.getStartJson();
String assortName = ocrSpecialRule.getName();
List<OcrSpecialRuleJson> ocrSpecialRuleJsons = Func.parseJsonArray(startJson, OcrSpecialRuleJson.class);
for (OcrSpecialRuleJson ocrSpecialRuleJson : ocrSpecialRuleJsons) {
double score = ocrSpecialRuleJson.getScore();
String[] keyWordList = ocrSpecialRuleJson.getKeyWord().split("#");
for (String ocrText : ocrTextList) {
for (int i = 0; i < keyWordList.length; i++) {
String keyWord = keyWordList[i];
if (ocrText.contains(keyWord)){
double rate = keyWord.length() / (double)ocrText.length() * 100;
//判断是否命中
if (rate>=score) {
OcrSpecialResult ocrSpecialResult = new OcrSpecialResult();
ocrSpecialResult.setAssortId(assortId);
ocrSpecialResult.setAssortName(assortName);
ocrSpecialResult.setRate(rate);
ocrSpecialResult.setHitKey(keyWord);
return ocrSpecialResult;
}
}
}
}
}
}
//默认返回空对象
return null;
}
/**
*
*

@ -1,5 +1,6 @@
package com.docus.server.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult;
@ -7,8 +8,11 @@ import com.docus.server.convert.OcrVersionConvert;
import com.docus.server.dto.segmentation.ocrversion.AddOcrVersionDTO;
import com.docus.server.dto.segmentation.ocrversion.DeleteOcrVersionDTO;
import com.docus.server.dto.segmentation.ocrversion.EditOcrVersionDTO;
import com.docus.server.entity.segmentation.OcrVersion;
import com.docus.server.infrastructure.dao.IOcrVersionDao;
import com.docus.server.entity.segmentation.*;
import com.docus.server.infrastructure.dao.*;
import com.docus.server.service.IOcrRuleService;
import com.docus.server.service.IOcrSpecialRuleService;
import com.docus.server.service.IOcrSpecialRuleTestService;
import com.docus.server.service.IOcrVersionService;
import com.docus.server.vo.segmentation.ocrversion.OcrVersionVO;
import org.springframework.stereotype.Service;
@ -16,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
*
@ -29,6 +34,22 @@ public class OcrVersionServiceImpl implements IOcrVersionService {
private IOcrVersionDao iOcrVersionDao;
@Resource
private IdService idService;
@Resource
private IOcrRuleDao iOcrRuleDao;
@Resource
private IOcrRuleTestDao iOcrRuleTestDao;
@Resource
private IOcrSpecialRuleDao iOcrSpecialRuleDao;
@Resource
private IOcrSpecialRuleTestDao iOcrSpecialRuleTestDao;
@Resource
private IOcrCutConfigDao iOcrCutConfigDao;
@Resource
private IOcrCutConfigTestDao iOcrCutConfigTestDao;
@Resource
private IOcrUrlConfigDao iOcrUrlConfigDao;
@Resource
private IOcrUrlConfigTestDao iOcrUrlConfigTestDao;
/**
*
@ -88,23 +109,40 @@ public class OcrVersionServiceImpl implements IOcrVersionService {
@Override
@Transactional(rollbackFor = Exception.class)
public boolean add(AddOcrVersionDTO addOcrVersionDTO) {
int version = 1;
OcrVersion maxVersion = iOcrVersionDao.findMaxVersion();
if (maxVersion!=null){
version = maxVersion.getVersion()+1;
}
final Integer finalVersion = version;
OcrVersion ocrVersion = OcrVersionConvert.INSTANCE.convertDO(addOcrVersionDTO);
ocrVersion.setId(idService.getDateSeq());
ocrVersion.setVersion(version);
ocrVersion.setIsEnable(true);
List<OcrRule> ocrRuleList = iOcrRuleTestDao.findAll().stream().map(m-> {
m.setVersion(finalVersion);
m.setId(idService.getDateSeq());
OcrRule ocrRule = new OcrRule();
BeanUtil.copyProperties(m,ocrRule);
return ocrRule;
}).collect(Collectors.toList());
List<OcrSpecialRule> ocrSpecialRuleTestDaoAll = iOcrSpecialRuleTestDao.findAll().stream().map(m-> {
m.setVersion(finalVersion);
m.setId(idService.getDateSeq());
OcrSpecialRule ocrSpecialRule = new OcrSpecialRule();
BeanUtil.copyProperties(m,ocrSpecialRule);
return ocrSpecialRule;
}).collect(Collectors.toList());
iOcrRuleDao.saveBatch(ocrRuleList,iOcrRuleDao.DEFAULT_BATCH_SIZE);
iOcrSpecialRuleDao.saveBatch(ocrSpecialRuleTestDaoAll,iOcrSpecialRuleDao.DEFAULT_BATCH_SIZE);
List<OcrVersion> isEnableList = iOcrVersionDao.findBy("isEnable", "1").stream().peek(p-> p.setIsEnable(false)).collect(Collectors.toList());
iOcrVersionDao.updateBatchById(isEnableList,1000);
return iOcrVersionDao.add(ocrVersion);
// String name = addOcrVersionDTO.getName();
//OcrVersion ocrVersion = iOcrVersionDao.findOneBy("name", name);
//if (Func.notNull(ocrVersion)) {
// throw new ApiException(ExceptionCode.ParamIllegal.getCode(), "正式数据版本号管理已经存在");
// }
// OcrVersion ocrVersion =OcrVersionConvert.INSTANCE.convertDO(addOcrVersionDTO);
// ocrVersion.setId(idService.getDateSeq());
// return iOcrVersionDao.add(schCollector);
}
/**
@ -116,19 +154,14 @@ public class OcrVersionServiceImpl implements IOcrVersionService {
@Override
@Transactional(rollbackFor = Exception.class)
public boolean edit(EditOcrVersionDTO editOcrVersionDTO) {
OcrVersion ocrVersion = OcrVersionConvert.INSTANCE.convertDO(editOcrVersionDTO);
return iOcrVersionDao.edit(ocrVersion);
// Long id = editOcrVersionDTO.getId();
// OcrVersion ocrVersion = iOcrVersionDao.findById(id);
//之前启用的全部变成不起用
List<OcrVersion> isEnableList = iOcrVersionDao.findBy("isEnable", "1").stream().peek(p-> p.setIsEnable(false)).collect(Collectors.toList());
iOcrVersionDao.updateBatchById(isEnableList,1000);
// if (Func.isNull(ocrVersion)) {
// throw new ApiException(ExceptionCode.ParamIllegal.getCode(), "正式数据版本号管理,无法更新!");
// }
OcrVersion ocrVersion = OcrVersionConvert.INSTANCE.convertDO(editOcrVersionDTO);
return iOcrVersionDao.edit(ocrVersion);
// ocrVersion.setUpdateTime(LocalDateTime.now());
// return iOcrVersionDao.edit(ocrVersion);
}
/**

Loading…
Cancel
Save