From f5cfb278e25f0eb0f08798776a889c99831b38c9 Mon Sep 17 00:00:00 2001 From: zhouwentao <1577701412@qq.com> Date: Wed, 9 Aug 2023 00:22:04 +0800 Subject: [PATCH] updates --- .../jeecg/common/constant/OcrConstant.java | 4 + .../ocr/controller/OcrIdentifyController.java | 4 +- .../ocr/service/IOcrIdentifyService.java | 2 - .../service/impl/OcrIdentifyServiceImpl.java | 143 ++++++++++++------ .../service/impl/OcrRuleCheckServiceImpl.java | 52 +++++-- .../jeecg/modules/ocr/vo/OcrRuleCheckVo.java | 6 +- 6 files changed, 146 insertions(+), 65 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/OcrConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/OcrConstant.java index 8e4cfad..d0b182a 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/OcrConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/OcrConstant.java @@ -13,6 +13,10 @@ public class OcrConstant { */ public static String ruleCheckSplitChar="&"; + public static String ruleCheckOrChar="||"; + + public static String ruleCheckValueRightChar="="; + /** * OCR任务状态 0 识别中,1已识别 */ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/controller/OcrIdentifyController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/controller/OcrIdentifyController.java index 4e9c6d8..1e204db 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/controller/OcrIdentifyController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/controller/OcrIdentifyController.java @@ -1,6 +1,5 @@ package org.jeecg.modules.ocr.controller; -import java.io.File; import java.util.*; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; @@ -107,8 +106,7 @@ public class OcrIdentifyController extends JeecgController queryWrapper = QueryGenerator.initQueryWrapper(ocrIdentify, req.getParameterMap()); if (startTime!=null&&endTime!=null) { - queryWrapper.between("startTime",startTime,endTime); - queryWrapper.between("endTime",startTime,endTime); + queryWrapper.between("startTime",startTime,endTime).or(q->q.between("endTime",startTime,endTime)); } Page page = new Page<>(pageNo, pageSize); Map ocrRuleCheckMap = ocrRuleCheckService.listToMap(null); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/IOcrIdentifyService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/IOcrIdentifyService.java index 3743e73..de74439 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/IOcrIdentifyService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/IOcrIdentifyService.java @@ -42,8 +42,6 @@ public interface IOcrIdentifyService extends IService { void updateOcrIdentifyStatus(String id,String status); - - /** * 发送执行任务计划 * @param jsonObject diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrIdentifyServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrIdentifyServiceImpl.java index e67999e..a7ee51e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrIdentifyServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrIdentifyServiceImpl.java @@ -101,7 +101,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl checkSemanticModelMap = getCheckSemanticModelMap(ocrRuleCheckVo.getConfigRuleMap(), ocrRuleCheckVo.getFieldMap(), ocrIdentifyVo.getSourceJsonObjects()); - //// - String text=null;//ocr 识别的文本, + String text=null;//ocr 识别的文本 Double probability = 0d; //用于数据结构化的对象 List ocrResultList = new ArrayList<>(); - StringBuffer rMessage = new StringBuffer(); Map fieldRightMap = new LinkedHashMap<>();//存放 字段判断正确map //========================== - checkSemanticFor: - for (CheckSemanticModel value : checkSemanticModelMap.values()) { + checkSemanticFor: for (CheckSemanticModel value : checkSemanticModelMap.values()) { String field = value.getField(); String fieldName = value.getFieldName();//校验的字段名称 String ruleInfo = value.getRuleInfo();//是否绝对判断 0-绝对判断,1-不绝对判断 @@ -181,10 +177,17 @@ public class OcrIdentifyServiceImpl extends ServiceImpl 0 && !fieldRightMap.containsValue(false)) { - ocrIdentifyDetail.setStatus("1");//全部通过 - } else { + if (fieldRightMap != null && fieldRightMap.values().size()>0) { + if (!fieldRightMap.containsValue(false)) { + ocrIdentifyDetail.setStatus("1");//全部通过 + } else if(fieldRightMap.containsValue(false) && fieldRightMap.containsValue(true)){ + ocrIdentifyDetail.setStatus("2");//有成功,有失败(部分) + ocrIdentifyDetail.setMessage(rMessage.toString()); + } else{ + ocrIdentifyDetail.setStatus("0");//有失败的 + ocrIdentifyDetail.setMessage(rMessage.toString()); + } + }else{ ocrIdentifyDetail.setStatus("0");//有失败的 ocrIdentifyDetail.setMessage(rMessage.toString()); } @@ -236,15 +239,15 @@ public class OcrIdentifyServiceImpl extends ServiceImpl> configRuleTypeMap = ocrRuleCheckVo.getConfigRuleTypeMap(); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper(); updateWrapper.eq(OcrIdentify::getId, id); - updateWrapper.set(OcrIdentify::getEndTime, new Date()); - updateWrapper.set(OcrIdentify::getStatus, "1"); - /*获取 明细 的成功或失败.*/ List identifyDetailList = ocrIdentifyDetailService.listByIdentifyId(id); if(true) { if (identifyDetailList != null && identifyDetailList.size() > 0) { - Map fieldRightMap = new LinkedHashMap<>(); + Map fieldRightMap = new LinkedHashMap<>(); String tag = null; boolean ruleValidation = false; /////明细中,如果有字段成功的,则会覆盖其他明细的匹配失败的情况,如果全都是失败的,会获取第一次失败的. @@ -252,11 +255,11 @@ public class OcrIdentifyServiceImpl extends ServiceImpl resultList = jsonArray.toJavaList(OcrResult.class); - for (OcrResult result : resultList) { + List resultList = jsonArray.toJavaList(OcrResult2.class); + for (OcrResult2 result : resultList) { tag = result.getTag(); ruleValidation = result.getRuleValidation(); - OcrResult lastResult = fieldRightMap.get(tag); + OcrResult2 lastResult = fieldRightMap.get(tag); if (ruleValidation) { fieldRightMap.put(tag, result); } else if (lastResult == null || !lastResult.getRuleValidation()) { @@ -266,38 +269,55 @@ public class OcrIdentifyServiceImpl extends ServiceImpl errorResults = fieldRightMap.values().stream().filter(f -> !f.getRuleValidation()).collect(Collectors.toList()); - List ocrResults = fieldRightMap.values().stream().collect(Collectors.toList()); - String taskResultInfo = JSONArray.toJSONString(ocrResults); - updateWrapper.set(OcrIdentify::getTaskResultInfo,taskResultInfo); - if (errorResults.size() > 0) { - //匹配失败. - String errorMsg = errorResults.stream().map(e -> e.getFailureReason()).collect(Collectors.joining(";")); + List errorResults = fieldRightMap.values().stream().filter(f -> !f.getRuleValidation()).collect(Collectors.toList()); + List ocrResults = fieldRightMap.values().stream().collect(Collectors.toList()); + + //TODO 后续考虑需要修正复杂程度. 支持 & + || 一起 + + String errorMsg = errorResults.stream().map(e -> e.getFailureReason()).collect(Collectors.joining(";")); + if (configRuleTypeMap.containsKey(OcrConstant.ruleCheckSplitChar)) { + if (errorResults.size() > 0) { + //匹配失败. + updateWrapper.set(OcrIdentify::getErrorMsg, errorMsg); + updateWrapper.set(OcrIdentify::getTaskResult, 0); + } else { + //匹配成功. + updateWrapper.set(OcrIdentify::getTaskResult, 1); + } + }else if (configRuleTypeMap.containsKey(OcrConstant.ruleCheckOrChar)){ + Map fieldMap = configRuleTypeMap.get(OcrConstant.ruleCheckSplitChar); + //获取成功的字段. + List successFields = ocrResults.stream().filter(o -> o.getRuleValidation()).map(c->c.getTag()).collect(Collectors.toList()); + updateWrapper.set(OcrIdentify::getErrorMsg, errorMsg); updateWrapper.set(OcrIdentify::getTaskResult, 0); - } else { - //匹配成功. - updateWrapper.set(OcrIdentify::getTaskResult, 1); + + fieldMapFor: for (String s : fieldMap.keySet()) { + if (successFields.contains(s)) { + updateWrapper.set(OcrIdentify::getTaskResult, 1); + break fieldMapFor; + } + } + } + String taskResultInfo = JSONArray.toJSONString(ocrResults); + updateWrapper.set(OcrIdentify::getTaskResultInfo,taskResultInfo); } } super.update(updateWrapper); - /*System.out.println("已通过一条!");*/ } + @Override @Async public void updateTaskResultInfo(String id){ OcrIdentifyVo ocrIdentifyVo = this.findById(id); - List identifyDetails = ocrIdentifyDetailService.listByIdentifyId(ocrIdentifyVo.getId()); + /*List identifyDetails = ocrIdentifyDetailService.listByIdentifyId(ocrIdentifyVo.getId()); for (OcrIdentifyDetail identifyDetail : identifyDetails) { JSONObject semanticResult = JSONObject.parseObject(identifyDetail.getSemanticResult()); String imgPath = identifyDetail.getImageUrl(); // 进行数据化 结构 if (semanticResult != null) { OcrRuleCheckVo ocrRuleCheckVo = ocrIdentifyVo.getOcrRuleCheckVo(); - if (ocrRuleCheckVo.getConfigName().contains("科室")) { - System.out.println("111"); - } Map checkSemanticModelMap = getCheckSemanticModelMap(ocrRuleCheckVo.getConfigRuleMap(), ocrRuleCheckVo.getFieldMap(), ocrIdentifyVo.getSourceJsonObjects()); //// String text=null;//ocr 识别的文本, @@ -367,17 +387,30 @@ public class OcrIdentifyServiceImpl extends ServiceImpl 0 && !fieldRightMap.containsValue(false)) { - identifyDetail.setStatus("1");//全部通过 - } else { + if (fieldRightMap != null && fieldRightMap.values().size()>0) { + if (!fieldRightMap.containsValue(false)) { + identifyDetail.setStatus("1");//全部通过 + } else if(fieldRightMap.containsValue(false) && fieldRightMap.containsValue(true)){ + identifyDetail.setStatus("2");//有成功,有失败(部分) + identifyDetail.setMessage(rMessage.toString()); + } else{ + identifyDetail.setStatus("0");//有失败的 + identifyDetail.setMessage(rMessage.toString()); + } + }else{ identifyDetail.setStatus("0");//有失败的 identifyDetail.setMessage(rMessage.toString()); } + identifyDetail.setDataStructured(JSONArray.toJSONString(ocrResultList));//数据结构化 ocrIdentifyDetailService.updateById(identifyDetail); } - } + }*/ + //=======规则检查配置 + OcrRuleCheckVo ocrRuleCheckVo = ocrIdentifyVo.getOcrRuleCheckVo(); + Map> configRuleTypeMap = ocrRuleCheckVo.getConfigRuleTypeMap(); + //=================== //4.更新主任务状态 LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper(); updateWrapper.eq(OcrIdentify::getId, id); @@ -408,17 +441,37 @@ public class OcrIdentifyServiceImpl extends ServiceImpl errorResults = fieldRightMap.values().stream().filter(f -> !f.getRuleValidation()).collect(Collectors.toList()); List ocrResults = fieldRightMap.values().stream().collect(Collectors.toList()); - String taskResultInfo = JSONArray.toJSONString(ocrResults); - updateWrapper.set(OcrIdentify::getTaskResultInfo,taskResultInfo); - if (errorResults.size() > 0) { - //匹配失败. - String errorMsg = errorResults.stream().map(e -> e.getFailureReason()).collect(Collectors.joining(";")); + + //TODO 后续考虑需要修正复杂程度. 支持 & + || 一起 + + String errorMsg = errorResults.stream().map(e -> e.getFailureReason()).collect(Collectors.joining(";")); + if (configRuleTypeMap.containsKey(OcrConstant.ruleCheckSplitChar)) { + if (errorResults.size() > 0) { + //匹配失败. + updateWrapper.set(OcrIdentify::getErrorMsg, errorMsg); + updateWrapper.set(OcrIdentify::getTaskResult, 0); + } else { + //匹配成功. + updateWrapper.set(OcrIdentify::getTaskResult, 1); + } + }else if (configRuleTypeMap.containsKey(OcrConstant.ruleCheckOrChar)){ + Map fieldMap = configRuleTypeMap.get(OcrConstant.ruleCheckSplitChar); + //获取成功的字段. + List successFields = ocrResults.stream().filter(o -> o.getRuleValidation()).map(c->c.getTag()).collect(Collectors.toList()); + updateWrapper.set(OcrIdentify::getErrorMsg, errorMsg); updateWrapper.set(OcrIdentify::getTaskResult, 0); - } else { - //匹配成功. - updateWrapper.set(OcrIdentify::getTaskResult, 1); + + fieldMapFor: for (String s : fieldMap.keySet()) { + if (successFields.contains(s)) { + updateWrapper.set(OcrIdentify::getTaskResult, 1); + break fieldMapFor; + } + } + } + String taskResultInfo = JSONArray.toJSONString(ocrResults); + updateWrapper.set(OcrIdentify::getTaskResultInfo,taskResultInfo); } } super.update(updateWrapper); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrRuleCheckServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrRuleCheckServiceImpl.java index 651f804..7d7b25d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrRuleCheckServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ocr/service/impl/OcrRuleCheckServiceImpl.java @@ -129,20 +129,37 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl configRuleMap=new LinkedHashMap<>(); - for (String s : split) { - String[] split1 = s.split("="); - if (split1.length<=1) { - continue; + //TODO {key(&,||):{key(字段):value(1/0)}} + Map> configRuleTypeMap=new LinkedHashMap<>(); + if (configRule.contains(OcrConstant.ruleCheckOrChar)) { + // || + String[] orSplit = configRule.split(OcrConstant.ruleCheckOrChar); + Map configRuleMap=new LinkedHashMap<>(); + String field=null;String fieldValue=null; + for (String s : orSplit) { + configRuleMap=new LinkedHashMap<>(); + String[] split1 = s.split(OcrConstant.ruleCheckValueRightChar); + if (split1.length<=1) { + continue; + } + configRuleMap.put(split1[0],split1[1]); } - String s1 = split1[0]; - String s2 = split1[1]; - configRuleMap.put(s1,s2); + configRuleTypeMap.put(OcrConstant.ruleCheckOrChar,configRuleMap); + }else { + //& + String[] split = configRule.split(OcrConstant.ruleCheckSplitChar); + //将 `配置规则` 转成 map + Map configRuleMap=new LinkedHashMap<>(); + for (String s : split) { + String[] split1 = s.split(OcrConstant.ruleCheckValueRightChar); + if (split1.length<=1) { + continue; + } + configRuleMap.put(split1[0],split1[1]); + } + configRuleTypeMap.put(OcrConstant.ruleCheckSplitChar,configRuleMap); } - ocrRuleCheckVo.setConfigRuleMap(configRuleMap); + ocrRuleCheckVo.setConfigRuleTypeMap(configRuleTypeMap); } if (StringUtils.isNotBlank(ocrRuleCheckVo.getMetadataConfigId())) { String metadataConfigId = ocrRuleCheckVo.getMetadataConfigId(); @@ -155,4 +172,15 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl configRuleMap=new LinkedHashMap<>(); private Map fieldMap=new LinkedHashMap<>(); + + Map> configRuleTypeMap=new LinkedHashMap<>(); }