diff --git a/docus-client-interface/src/main/java/com/docus/server/api/segmentation/OcrVersionApi.java b/docus-client-interface/src/main/java/com/docus/server/api/segmentation/OcrVersionApi.java index 61f57d9..bc278fd 100644 --- a/docus-client-interface/src/main/java/com/docus/server/api/segmentation/OcrVersionApi.java +++ b/docus-client-interface/src/main/java/com/docus/server/api/segmentation/OcrVersionApi.java @@ -28,6 +28,7 @@ import java.util.List; @RequestMapping("/ocr/Version") public interface OcrVersionApi { + /** * 按主键查询 * diff --git a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/AddOcrBasicDTO.java b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/AddOcrBasicDTO.java index d1a8a58..c48ae12 100644 --- a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/AddOcrBasicDTO.java +++ b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/AddOcrBasicDTO.java @@ -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; diff --git a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/EditOcrBasicDTO.java b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/EditOcrBasicDTO.java index e144ea0..c48c261 100644 --- a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/EditOcrBasicDTO.java +++ b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasic/EditOcrBasicDTO.java @@ -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; diff --git a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/AddOcrBasicTestDTO.java b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/AddOcrBasicTestDTO.java index 9c7083c..1dfe70e 100644 --- a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/AddOcrBasicTestDTO.java +++ b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/AddOcrBasicTestDTO.java @@ -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; diff --git a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/EditOcrBasicTestDTO.java b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/EditOcrBasicTestDTO.java index ca93363..d673f15 100644 --- a/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/EditOcrBasicTestDTO.java +++ b/docus-client-interface/src/main/java/com/docus/server/dto/segmentation/ocrbasictest/EditOcrBasicTestDTO.java @@ -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; diff --git a/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasic.java b/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasic.java index 3144b3e..fcc509d 100644 --- a/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasic.java +++ b/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasic.java @@ -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") diff --git a/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasicTest.java b/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasicTest.java index 8f870bf..3d23b78 100644 --- a/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasicTest.java +++ b/docus-client-interface/src/main/java/com/docus/server/entity/segmentation/OcrBasicTest.java @@ -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") diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasic/OcrBasicVO.java b/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasic/OcrBasicVO.java index 6e2c657..4a3de22 100644 --- a/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasic/OcrBasicVO.java +++ b/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasic/OcrBasicVO.java @@ -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; diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasictest/OcrBasicTestVO.java b/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasictest/OcrBasicTestVO.java index ce4f61f..42a7751 100644 --- a/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasictest/OcrBasicTestVO.java +++ b/docus-client-interface/src/main/java/com/docus/server/vo/segmentation/ocrbasictest/OcrBasicTestVO.java @@ -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; diff --git a/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/IOcrVersionDao.java b/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/IOcrVersionDao.java index 2d77c90..e5df26c 100644 --- a/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/IOcrVersionDao.java +++ b/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/IOcrVersionDao.java @@ -14,6 +14,14 @@ import java.util.List; * @since 2023-08-29 */ public interface IOcrVersionDao extends IBaseDao { + + /** + * 查询最新的版本号 + * @return + */ + OcrVersion findMaxVersion(); + + /** * 按主键查询 * diff --git a/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/impl/OcrVersionDaoImpl.java b/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/impl/OcrVersionDaoImpl.java index ac32be5..7a9e3c1 100644 --- a/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/impl/OcrVersionDaoImpl.java +++ b/docus-segmentation/src/main/java/com/docus/server/infrastructure/dao/impl/OcrVersionDaoImpl.java @@ -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 implements IOcrVersionDao { + @Override + public OcrVersion findMaxVersion() { + QueryWrapper query =new QueryWrapper<>(); + query.select("max(version) as version"); + return this.baseMapper.selectOne(query); + } + /** * 按主键查询 * @@ -79,13 +87,13 @@ public class OcrVersionDaoImpl extends BaseDaoImpl PageHelper.startPage(searchDTO.getPageNum(), searchDTO.getPageSize()); LambdaQueryWrapper 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 diff --git a/docus-segmentation/src/main/java/com/docus/server/service/IOcrRuleService.java b/docus-segmentation/src/main/java/com/docus/server/service/IOcrRuleService.java index 5b9b7c1..b22ea01 100644 --- a/docus-segmentation/src/main/java/com/docus/server/service/IOcrRuleService.java +++ b/docus-segmentation/src/main/java/com/docus/server/service/IOcrRuleService.java @@ -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 search(SearchDTO searchDTO); + + OcrRuleResult handleRule(List ocrTextList,Integer version); + } diff --git a/docus-segmentation/src/main/java/com/docus/server/service/IOcrSpecialRuleService.java b/docus-segmentation/src/main/java/com/docus/server/service/IOcrSpecialRuleService.java index 90b56bb..8cfc74b 100644 --- a/docus-segmentation/src/main/java/com/docus/server/service/IOcrSpecialRuleService.java +++ b/docus-segmentation/src/main/java/com/docus/server/service/IOcrSpecialRuleService.java @@ -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 search(SearchDTO searchDTO); + + boolean handleSpecialRuleEnd(OcrSpecialResult lastSpecialResul, List ocrTextList); + + OcrSpecialResult handleSpecialRule(List ocrTextList,Integer version); + } diff --git a/docus-segmentation/src/main/java/com/docus/server/service/handler/StartSegmentHandler.java b/docus-segmentation/src/main/java/com/docus/server/service/handler/StartSegmentHandler.java index 739a2c5..8cc447f 100644 --- a/docus-segmentation/src/main/java/com/docus/server/service/handler/StartSegmentHandler.java +++ b/docus-segmentation/src/main/java/com/docus/server/service/handler/StartSegmentHandler.java @@ -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 fileInfoList = iOcrFileInfoDao.findBy("patientId",patientId); + for (OcrFileInfo fileInfo:fileInfoList) { + + //遍历文件列表 获取ocr识别结果 + List 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); } } diff --git a/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrRuleServiceImpl.java b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrRuleServiceImpl.java index 6afee33..0f537af 100644 --- a/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrRuleServiceImpl.java +++ b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrRuleServiceImpl.java @@ -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 ocrTextList,Integer version) { + //查询所有规则列表 + List 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 ocrRuleList = Func.parseJsonArray(ocrRule.getJson(), OcrRuleJson.class) + .stream().sorted(Comparator.comparing(OcrRuleJson::getSort)) + .collect(Collectors.toList()); + for (OcrRuleJson ruleJson : ocrRuleList) { + //匹配二级的关键词列表 + assortId = ruleJson.getAssortId(); + List 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; + } + /** * 新增 * diff --git a/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrSpecialRuleServiceImpl.java b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrSpecialRuleServiceImpl.java index 3d0bcf3..82ddd09 100644 --- a/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrSpecialRuleServiceImpl.java +++ b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrSpecialRuleServiceImpl.java @@ -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 ocrTextList) { + //获取结束条件列表 + List 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 ocrTextList,Integer version) { + // 查询所以的特殊规则列表 + List all = iOcrSpecialRuleDao.findBy("version",version); + //判断是否符合某个条件的开始条件 + for (OcrSpecialRule ocrSpecialRule : all) { + + String assortId = ocrSpecialRule.getAssortId(); + String startJson = ocrSpecialRule.getStartJson(); + String assortName = ocrSpecialRule.getName(); + + List 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; + } + /** * 新增 * diff --git a/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrVersionServiceImpl.java b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrVersionServiceImpl.java index de6d1a7..c18dd3a 100644 --- a/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrVersionServiceImpl.java +++ b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrVersionServiceImpl.java @@ -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 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 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 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 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); } /**