|
|
|
@ -145,7 +145,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
ocrIdentifyDetail.setMessage(message);
|
|
|
|
|
ocrIdentifyDetail.setOcrTime(new BigDecimal(ocrTime).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
|
|
|
ocrIdentifyDetail.setNluTime(new BigDecimal(nluTime).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
|
|
|
if (semanticResult!=null) {
|
|
|
|
|
if (semanticResult.isEmpty()) {
|
|
|
|
|
ocrIdentifyDetail.setSemanticResult(semanticResult.toJSONString());
|
|
|
|
|
}
|
|
|
|
|
ocrIdentifyDetailService.save(ocrIdentifyDetail);
|
|
|
|
@ -160,20 +160,20 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
Double probability = 0d;
|
|
|
|
|
//用于数据结构化的对象
|
|
|
|
|
List<OcrResultDTO> ocrResultDTOList = new ArrayList<>();
|
|
|
|
|
StringBuffer rMessage = new StringBuffer();
|
|
|
|
|
StringBuilder rMessage = new StringBuilder();
|
|
|
|
|
Map<String, Boolean> fieldRightMap = new LinkedHashMap<>();//存放 字段判断正确map
|
|
|
|
|
//==========================
|
|
|
|
|
//==========================
|
|
|
|
|
checkSemanticFor: for (CheckSemanticModel value : checkSemanticModelMap.values()) {
|
|
|
|
|
for (CheckSemanticModel value : checkSemanticModelMap.values()) {
|
|
|
|
|
String field = value.getField();
|
|
|
|
|
String fieldName = value.getFieldName();//校验的字段名称
|
|
|
|
|
String ruleInfo = value.getRuleInfo();//是否绝对判断 0-绝对判断,1-不绝对判断
|
|
|
|
|
String inputText = value.getInputText();//校验文本 ,ocr识别的文本如果不包含该内容,则算作失败
|
|
|
|
|
List<String> fieldNameList = Arrays.asList(fieldName.split(","));
|
|
|
|
|
text = null;
|
|
|
|
|
boolean b = ArrayOUtils.containsStringList(fieldNameList, semanticResult.keySet().stream().collect(Collectors.toList()));
|
|
|
|
|
//boolean b = ArrayOUtils.containsStringList(fieldNameList, new ArrayList<>(semanticResult.keySet()));
|
|
|
|
|
//查看ocr识别返回的字段名称中是否有当前这个字段名称
|
|
|
|
|
if (b) {
|
|
|
|
|
if (true) {
|
|
|
|
|
//TODO 注意,ocr 识别返回的 字段是多个结果(数组),有一个值匹配上即为正确
|
|
|
|
|
List<JSONObject> ocrArray = new ArrayList<>();
|
|
|
|
|
for (String s : fieldNameList) {
|
|
|
|
@ -183,9 +183,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (ocrArray.size() > 0) {
|
|
|
|
|
ocrArrayFor:
|
|
|
|
|
for (int i = 0; i < ocrArray.size(); i++) {
|
|
|
|
|
JSONObject ocrItem = ocrArray.get(i);
|
|
|
|
|
for (JSONObject ocrItem : ocrArray) {
|
|
|
|
|
text = null;
|
|
|
|
|
text = ocrItem.getString("text");//ocr 识别的文本
|
|
|
|
|
probability = ocrItem.getDouble("probability");//置信度
|
|
|
|
@ -195,54 +193,54 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
if (StringUtils.isBlank(text) || StringUtils.isBlank(inputText)) {
|
|
|
|
|
//没识别值
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数不判断", true,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数不判断", true, ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (text.contains(inputText)) {
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v,"101");
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, "101");
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数不匹配<br>");
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (StringUtils.isBlank(text)) {
|
|
|
|
|
//ocr识别参数为空,不通过
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数未获取到结果<br>");
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false, ruleInfo);
|
|
|
|
|
} else if (StringUtils.isBlank(inputText)) {
|
|
|
|
|
//没有输入值.
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "没有输入值不做匹配", true,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "没有输入值不做匹配", true, ruleInfo);
|
|
|
|
|
} else if ("0".equals(ruleInfo)) {
|
|
|
|
|
//不必校验,有识别到就行,通过
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, ruleInfo);
|
|
|
|
|
} else if (Double.parseDouble(ruleInfo) >= 1 && Double.parseDouble(ruleInfo) <= 99) {
|
|
|
|
|
//在1~99之间,根据精准度匹配
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (v >= Double.parseDouble(ruleInfo)) {
|
|
|
|
|
//准确度 可靠
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
} else if ("100".equals(ruleInfo)) {
|
|
|
|
|
//必定验证参数,必须有值且匹配
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (text.equals(inputText)) {
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -250,16 +248,16 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, 0d, imgPath, value.getFieldName() + "参数未获取到结果", false,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, 0d, imgPath, value.getFieldName() + "参数未获取到结果", false, ruleInfo);
|
|
|
|
|
fieldRightMap.put(field, false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fieldRightMap != null && fieldRightMap.values().size() > 0) {
|
|
|
|
|
if (!fieldRightMap.isEmpty() && CollectionUtils.isNotEmpty(fieldRightMap.values())) {
|
|
|
|
|
if (!fieldRightMap.containsValue(false)) {
|
|
|
|
|
ocrIdentifyDetail.setStatus("1");//全部通过
|
|
|
|
|
} else if (fieldRightMap.containsValue(false) && fieldRightMap.containsValue(true)) {
|
|
|
|
@ -294,22 +292,22 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
JSONObject semanticResponseJson = new JSONObject();
|
|
|
|
|
|
|
|
|
|
//将主任务存到redis.
|
|
|
|
|
StringBuffer task_master = new StringBuffer();
|
|
|
|
|
StringBuilder taskMaster = new StringBuilder();
|
|
|
|
|
for (int i = 0; i < identifyUrlList.size(); i++) {
|
|
|
|
|
taskId = String.format(id + "_" + (i + 1));
|
|
|
|
|
task_master.append(taskId).append(",");
|
|
|
|
|
taskId = id + "_" + (i + 1);
|
|
|
|
|
taskMaster.append(taskId).append(",");
|
|
|
|
|
}
|
|
|
|
|
redisUtil.set("identify_" + id, task_master.toString());
|
|
|
|
|
redisUtil.set("identify_" + id, taskMaster.toString());
|
|
|
|
|
//执行子任务.
|
|
|
|
|
for (int i = 0; i < identifyUrlList.size(); i++) {
|
|
|
|
|
identifyUrl = identifyUrlList.get(i);
|
|
|
|
|
taskId = String.format(id + "_" + (i + 1));
|
|
|
|
|
taskId = id + "_" + (i + 1);
|
|
|
|
|
requestBody.put("taskId", taskId);
|
|
|
|
|
requestBody.put("taskLevel", Integer.valueOf(priority));
|
|
|
|
|
requestBody.put("taskType", "identify");
|
|
|
|
|
requestBody.put("parameter", id + "," + taskId + "," + identifyUrl);
|
|
|
|
|
//发送任务请求 到 redis
|
|
|
|
|
Result result = pushTask(requestBody);
|
|
|
|
|
Result<?> result = pushTask(requestBody);
|
|
|
|
|
log.info("---------------");
|
|
|
|
|
log.info(result.toString());
|
|
|
|
|
/*semanticResponseJson = RestUtil.post(OcrConstant.api_test_identify_url, requestBody);
|
|
|
|
@ -323,56 +321,51 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
public void updateOcrIdentifyStatus(String id, String status) {
|
|
|
|
|
//4.更新主任务状态
|
|
|
|
|
OcrIdentifyDTO ocrIdentifyDTO = this.findById(id);
|
|
|
|
|
OcrRuleCheckDTO ocrRuleCheckVo = ocrIdentifyDTO.getOcrRuleCheckVo();
|
|
|
|
|
LambdaUpdateWrapper<OcrIdentify> updateWrapper = new LambdaUpdateWrapper<OcrIdentify>();
|
|
|
|
|
LambdaUpdateWrapper<OcrIdentify> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
updateWrapper.eq(OcrIdentify::getId, id);
|
|
|
|
|
List<OcrIdentifyDetail> identifyDetailList = ocrIdentifyDetailService.listByIdentifyId(id);
|
|
|
|
|
if (true) {
|
|
|
|
|
if (identifyDetailList != null && identifyDetailList.size() > 0) {
|
|
|
|
|
Map<String, OcrResultDTO> fieldRightMap = new LinkedHashMap<>();
|
|
|
|
|
String tag = null;
|
|
|
|
|
boolean ruleValidation = false;
|
|
|
|
|
/////明细中,如果有字段成功的,则会覆盖其他明细的匹配失败的情况,如果全都是失败的,会获取第一次失败的.
|
|
|
|
|
for (OcrIdentifyDetail ocrIdentifyDetail : identifyDetailList) {
|
|
|
|
|
String dataStructured = ocrIdentifyDetail.getDataStructured();
|
|
|
|
|
if (org.apache.commons.lang.StringUtils.isNotBlank(dataStructured)) {
|
|
|
|
|
JSONArray jsonArray = JSONObject.parseArray(dataStructured);
|
|
|
|
|
List<OcrResultDTO> resultList = jsonArray.toJavaList(OcrResultDTO.class);
|
|
|
|
|
for (OcrResultDTO result : resultList) {
|
|
|
|
|
tag = result.getTag();
|
|
|
|
|
ruleValidation = result.getRuleValidation();
|
|
|
|
|
OcrResultDTO lastResult = fieldRightMap.get(tag);
|
|
|
|
|
if (ruleValidation) {
|
|
|
|
|
fieldRightMap.put(tag, result);
|
|
|
|
|
} else if (lastResult == null || !lastResult.getRuleValidation()) {
|
|
|
|
|
//失败时就是未获取到结果
|
|
|
|
|
result.setFailureReason(result.getTagName() + "未获取到结果");
|
|
|
|
|
fieldRightMap.put(tag, result);
|
|
|
|
|
}
|
|
|
|
|
if (identifyDetailList != null && identifyDetailList.size() > 0) {
|
|
|
|
|
Map<String, OcrResultDTO> fieldRightMap = new LinkedHashMap<>();
|
|
|
|
|
String tag = null;
|
|
|
|
|
boolean ruleValidation = false;
|
|
|
|
|
/////明细中,如果有字段成功的,则会覆盖其他明细的匹配失败的情况,如果全都是失败的,会获取第一次失败的.
|
|
|
|
|
for (OcrIdentifyDetail ocrIdentifyDetail : identifyDetailList) {
|
|
|
|
|
String dataStructured = ocrIdentifyDetail.getDataStructured();
|
|
|
|
|
if (org.apache.commons.lang.StringUtils.isNotBlank(dataStructured)) {
|
|
|
|
|
JSONArray jsonArray = JSONObject.parseArray(dataStructured);
|
|
|
|
|
List<OcrResultDTO> resultList = jsonArray.toJavaList(OcrResultDTO.class);
|
|
|
|
|
for (OcrResultDTO result : resultList) {
|
|
|
|
|
tag = result.getTag();
|
|
|
|
|
ruleValidation = result.getRuleValidation();
|
|
|
|
|
OcrResultDTO lastResult = fieldRightMap.get(tag);
|
|
|
|
|
if (ruleValidation) {
|
|
|
|
|
fieldRightMap.put(tag, result);
|
|
|
|
|
} else if (lastResult == null || !lastResult.getRuleValidation()) {
|
|
|
|
|
//失败时就是未获取到结果
|
|
|
|
|
result.setFailureReason(result.getTagName() + "未获取到结果");
|
|
|
|
|
fieldRightMap.put(tag, result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//如果明细合并一起,都是成功,则主任务 匹配成功, 否则匹配失败
|
|
|
|
|
List<OcrResultDTO> errorResults = fieldRightMap.values().stream().filter(f -> !f.getRuleValidation()).collect(Collectors.toList());
|
|
|
|
|
List<OcrResultDTO> ocrResultDTOS = fieldRightMap.values().stream().collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//TODO 后续考虑需要修正复杂程度. 支持 & + || 一起
|
|
|
|
|
|
|
|
|
|
String errorMsg = errorResults.stream().map(e -> e.getFailureReason()).collect(Collectors.joining(";"));
|
|
|
|
|
}
|
|
|
|
|
//如果明细合并一起,都是成功,则主任务 匹配成功, 否则匹配失败
|
|
|
|
|
List<OcrResultDTO> errorResults = fieldRightMap.values().stream().filter(f -> !f.getRuleValidation()).collect(Collectors.toList());
|
|
|
|
|
List<OcrResultDTO> ocrResultDTOS = new ArrayList<>(fieldRightMap.values());
|
|
|
|
|
//TODO 后续考虑需要修正复杂程度. 支持 & + || 一起
|
|
|
|
|
String errorMsg = errorResults.stream().map(OcrResultDTO::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);
|
|
|
|
|
}
|
|
|
|
|
String taskResultInfo = JSONArray.toJSONString(ocrResultDTOS);
|
|
|
|
|
updateWrapper.set(OcrIdentify::getStatus, "1");
|
|
|
|
|
updateWrapper.set(OcrIdentify::getEndTime, new Date());
|
|
|
|
|
updateWrapper.set(OcrIdentify::getTaskResultInfo, taskResultInfo);
|
|
|
|
|
if (errorResults.size() > 0) {
|
|
|
|
|
//匹配失败.
|
|
|
|
|
updateWrapper.set(OcrIdentify::getErrorMsg, errorMsg);
|
|
|
|
|
updateWrapper.set(OcrIdentify::getTaskResult, 0);
|
|
|
|
|
} else {
|
|
|
|
|
//匹配成功.
|
|
|
|
|
updateWrapper.set(OcrIdentify::getTaskResult, 1);
|
|
|
|
|
}
|
|
|
|
|
String taskResultInfo = JSONArray.toJSONString(ocrResultDTOS);
|
|
|
|
|
updateWrapper.set(OcrIdentify::getStatus, "1");
|
|
|
|
|
updateWrapper.set(OcrIdentify::getEndTime, new Date());
|
|
|
|
|
updateWrapper.set(OcrIdentify::getTaskResultInfo, taskResultInfo);
|
|
|
|
|
}
|
|
|
|
|
super.update(updateWrapper);
|
|
|
|
|
}
|
|
|
|
@ -418,25 +411,14 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
callbackWly(ocrIdentifyId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void mapPutIfTrue(Map map, String key, Boolean flag) {
|
|
|
|
|
if (map.containsKey(key) && (Boolean) map.get(key).equals(true)) {
|
|
|
|
|
} else {
|
|
|
|
|
public static void mapPutIfTrue(Map<String,Boolean> map, String key, Boolean flag) {
|
|
|
|
|
if (!map.containsKey(key) || !map.get(key).equals(true)) {
|
|
|
|
|
map.put(key, flag);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param ocrResultDTOList
|
|
|
|
|
* @param fieldName
|
|
|
|
|
* @param field
|
|
|
|
|
* @param inputText
|
|
|
|
|
* @param ocrText
|
|
|
|
|
* @param ocrPrecisionRate
|
|
|
|
|
* @param imgPath
|
|
|
|
|
* @param failureReason
|
|
|
|
|
* @param ruleValidation
|
|
|
|
|
* @param d
|
|
|
|
|
* @param ruleValidationValue 检查要求
|
|
|
|
|
*/
|
|
|
|
|
public static void ocrResultAdd(List<OcrResultDTO> ocrResultDTOList, String fieldName, String field, String inputText, String ocrText, Double ocrPrecisionRate, String imgPath, String failureReason, Boolean ruleValidation, Double d, String ruleValidationValue) {
|
|
|
|
@ -487,14 +469,6 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将数据 疯转成 OcrResult,追加到 ocrResultList
|
|
|
|
|
*
|
|
|
|
|
* @param ocrResultDTOList
|
|
|
|
|
* @param field
|
|
|
|
|
* @param inputText
|
|
|
|
|
* @param ocrText
|
|
|
|
|
* @param ocrPrecisionRate
|
|
|
|
|
* @param imgPath
|
|
|
|
|
* @param failureReason
|
|
|
|
|
*/
|
|
|
|
|
public static void ocrResultAdd(List<OcrResultDTO> ocrResultDTOList, String fieldName, String field, String inputText, String ocrText, Double ocrPrecisionRate, String imgPath, String failureReason, Boolean ruleValidation, String ruleValidationValue) {
|
|
|
|
|
if (ruleValidation) {
|
|
|
|
@ -509,7 +483,6 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
*
|
|
|
|
|
* @param configRuleMap 1/0 map
|
|
|
|
|
* @param fieldMap 字段含义 map
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public Map<String, CheckSemanticModel> getCheckSemanticModelMap(Map<String, String> configRuleMap, Map<String, String> fieldMap, List<JSONObject> sourceJsonObjects) {
|
|
|
|
|
Map<String, CheckSemanticModel> checkSemanticModelMap = new LinkedHashMap<>();
|
|
|
|
@ -532,7 +505,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//判断 规则检查配置 是不是 isrule=1
|
|
|
|
|
if (configRuleMap.keySet().contains("isrule") && "1".equals((String) configRuleMap.get("isrule"))) {
|
|
|
|
|
if (configRuleMap.containsKey("isrule") && "1".equals((String) configRuleMap.get("isrule"))) {
|
|
|
|
|
//isrule=1
|
|
|
|
|
for (String field : inputMap.keySet()) {
|
|
|
|
|
fieldName = fieldMap.get(field);
|
|
|
|
@ -573,11 +546,11 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
/**
|
|
|
|
|
* 发送任务
|
|
|
|
|
*
|
|
|
|
|
* @param jsonObject
|
|
|
|
|
* @return
|
|
|
|
|
* @param jsonObject 入参
|
|
|
|
|
* @return 返回参数
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Result pushTask(JSONObject jsonObject) {
|
|
|
|
|
public Result<?> pushTask(JSONObject jsonObject) {
|
|
|
|
|
//获取优先级1的任务
|
|
|
|
|
String taskId = jsonObject.getString("taskId");
|
|
|
|
|
String taskType = jsonObject.getString("taskType");
|
|
|
|
@ -597,7 +570,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
if (task_ == null || task_.equals("[]")) {
|
|
|
|
|
//无历史任务
|
|
|
|
|
TaskModel task = new TaskModel(taskId, taskLevel, taskType, "0", parameter);
|
|
|
|
|
List<TaskModel> jsonObjects = Arrays.asList(task);
|
|
|
|
|
List<TaskModel> jsonObjects = Collections.singletonList(task);
|
|
|
|
|
task_ = JSONObject.toJSONString(jsonObjects);
|
|
|
|
|
} else {
|
|
|
|
|
//有历史任务
|
|
|
|
@ -606,7 +579,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
List<TaskModel> taskList = jsonArray.toJavaList(TaskModel.class);
|
|
|
|
|
List<TaskModel> staskList = taskList.stream().filter(t -> t.getTaskId().equals(taskId)).collect(Collectors.toList());
|
|
|
|
|
TaskModel task = null;
|
|
|
|
|
if (staskList == null || staskList.size() == 0) {
|
|
|
|
|
if (CollectionUtils.isEmpty(staskList)) {
|
|
|
|
|
//该任务不存在, 看看 库表里 该任务是否已执行成功了
|
|
|
|
|
String overTask = (String) redisUtil.get("over_task");
|
|
|
|
|
if (org.apache.commons.lang.StringUtils.isNotBlank(overTask) && Arrays.asList(overTask.split(",")).contains(taskId)) {
|
|
|
|
@ -653,8 +626,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
queryWrapper.notIn(OcrIdentify::getId, identifyIdList);
|
|
|
|
|
}
|
|
|
|
|
queryWrapper.eq(OcrIdentify::getNoticeStatus, 0);
|
|
|
|
|
List<OcrIdentify> list = super.list(queryWrapper);
|
|
|
|
|
return list;
|
|
|
|
|
return super.list(queryWrapper);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -667,9 +639,6 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
Date startDataCheckTime = new Date();
|
|
|
|
|
Map<String, Boolean> fieldRightMap = new LinkedHashMap<>();//存放 字段判断正确map
|
|
|
|
|
for (OcrIdentifyDetail ocrIdentifyDetail : identifyDetailList) {
|
|
|
|
|
/*if (i1==1) {
|
|
|
|
|
ocrIdentifyDetail.setSemanticResult("{\"ocr_res\":[[[[1282.0,1576.0],[2764.0,1594.0],[2763.0,1671.0],[1281.0,1653.0]],[\"北京市朝阳区三里屯社区卫生服务中心\",0.9670220613479614]],[[[132.0,2244.0],[1062.0,2214.0],[1069.0,2455.0],[140.0,2485.0]],[\"儿科专家门诊\",0.984556257724762]],[[[117.0,2496.0],[1036.0,2473.0],[1038.0,2577.0],[119.0,2600.0]],[\"Pediatric srecialistclinic\",0.8756008148193359]]],\"其他\":[{\"area\":[[117.0,2496.0],[1036.0,2473.0],[1038.0,2577.0],[119.0,2600.0]],\"end\":26,\"ocrText\":\"Pediatric srecialistclinic\",\"probability\":0.9925054592526585,\"start\":0,\"text\":\"Pediatric srecialistclinic\"}],\"医院名称\":[{\"area\":[[1282.0,1576.0],[2764.0,1594.0],[2763.0,1671.0],[1281.0,1653.0]],\"end\":17,\"ocrText\":\"北京市朝阳区三里屯社区卫生服务中心\",\"probability\":0.9681764264135495,\"start\":0,\"text\":\"北京市朝阳区三里屯社区卫生服务中心\"},{\"area\":[[1282.0,1576.0],[2764.0,1594.0],[2763.0,1671.0],[1281.0,1653.0]],\"end\":17,\"ocrText\":\"北京市朝阳区农光里医院\",\"probability\":0.95,\"start\":0,\"text\":\"北京市朝阳区农光里医院\"}],\"姓名\":[],\"时间\":[],\"科室\":[{\"area\":[[132.0,2244.0],[1062.0,2214.0],[1069.0,2455.0],[140.0,2485.0]],\"end\":6,\"ocrText\":\"儿科专家门诊\",\"probability\":0.9836859327676066,\"start\":0,\"text\":\"儿科专家门诊\"}]}");
|
|
|
|
|
}*/
|
|
|
|
|
i1++;
|
|
|
|
|
String semanticResultJson = ocrIdentifyDetail.getSemanticResult();
|
|
|
|
|
String imgPath = ocrIdentifyDetail.getImageUrl();
|
|
|
|
@ -717,122 +686,118 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
}
|
|
|
|
|
ocrIdentifyDetail.setThumbnailImageUrl(outputImagePath);
|
|
|
|
|
}*/
|
|
|
|
|
//绘制虚线
|
|
|
|
|
if (true) {
|
|
|
|
|
|
|
|
|
|
JSONObject semanticResult2 = semanticResult.getJSONObject("semantic_result");
|
|
|
|
|
String fileUrl = "/data/ocrImage/drawDashed" + imgPath.substring(0, i);
|
|
|
|
|
|
|
|
|
|
//判断新目录是否存在,不存在则新建
|
|
|
|
|
FileOUtils.folderCreate(fileUrl);
|
|
|
|
|
String outputImagePath = fileUrl + imgPath.substring(i + 1, imgPath.length());
|
|
|
|
|
if (semanticResult2!=null) {
|
|
|
|
|
List<List<Point>> resultToPoints = ImageUtils.semanticResultToPoints(semanticResult2);
|
|
|
|
|
if (CollectionUtils.isNotEmpty(resultToPoints)) {
|
|
|
|
|
ImageUtils.drawDashedRectangleOnImages(file.getAbsolutePath(), resultToPoints, outputImagePath);
|
|
|
|
|
imgPath = outputImagePath;
|
|
|
|
|
}
|
|
|
|
|
//============================绘制虚线
|
|
|
|
|
JSONObject semanticResult2 = semanticResult.getJSONObject("semantic_result");
|
|
|
|
|
String fileUrl = "/data/ocrImage/drawDashed" + imgPath.substring(0, i);
|
|
|
|
|
//判断新目录是否存在,不存在则新建
|
|
|
|
|
FileOUtils.folderCreate(fileUrl);
|
|
|
|
|
String outputImagePath = fileUrl + imgPath.substring(i + 1, imgPath.length());
|
|
|
|
|
if (semanticResult2!=null) {
|
|
|
|
|
List<List<Point>> resultToPoints = ImageUtils.semanticResultToPoints(semanticResult2);
|
|
|
|
|
if (CollectionUtils.isNotEmpty(resultToPoints)) {
|
|
|
|
|
ImageUtils.drawDashedRectangleOnImages(file.getAbsolutePath(), resultToPoints, outputImagePath);
|
|
|
|
|
imgPath = outputImagePath;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//============================
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OcrRuleCheckDTO ocrRuleCheckVo = ocrRuleCheckService.findById(simulateChecksVO.getRuleCheckId());
|
|
|
|
|
Map<String, CheckSemanticModel> checkSemanticModelMap = getCheckSemanticModelMap(ocrRuleCheckVo.getConfigRuleMap(), ocrRuleCheckVo.getFieldMap(), sourceJson);
|
|
|
|
|
String text = null;//ocr 识别的文本
|
|
|
|
|
Double probability = 0d;
|
|
|
|
|
StringBuffer rMessage = new StringBuffer();
|
|
|
|
|
StringBuilder rMessage = new StringBuilder();
|
|
|
|
|
//==========================
|
|
|
|
|
checkSemanticFor: for (CheckSemanticModel value : checkSemanticModelMap.values()) {
|
|
|
|
|
for (CheckSemanticModel value : checkSemanticModelMap.values()) {
|
|
|
|
|
String field = value.getField();
|
|
|
|
|
String fieldName = value.getFieldName();//校验的字段名称
|
|
|
|
|
String ruleInfo = value.getRuleInfo();//是否绝对判断 0-绝对判断,1-不绝对判断
|
|
|
|
|
String inputText = value.getInputText();//校验文本 ,ocr识别的文本如果不包含该内容,则算作失败
|
|
|
|
|
List<String> fieldNameList = Arrays.asList(fieldName.split(","));
|
|
|
|
|
text = null;
|
|
|
|
|
boolean b = ArrayOUtils.containsStringList(fieldNameList, semanticResult.getJSONObject("semantic_result").keySet().stream().collect(Collectors.toList()));
|
|
|
|
|
//boolean b = ArrayOUtils.containsStringList(fieldNameList, new ArrayList<>(semanticResult.getJSONObject("semantic_result").keySet()));
|
|
|
|
|
//查看ocr识别返回的字段名称中是否有当前这个字段名称
|
|
|
|
|
if (b) {
|
|
|
|
|
//TODO 注意,ocr 识别返回的 字段是多个结果(数组),有一个值匹配上即为正确
|
|
|
|
|
List<JSONObject> ocrArray = new ArrayList<>();
|
|
|
|
|
for (String s : fieldNameList) {
|
|
|
|
|
JSONArray jsonArray = semanticResult.getJSONObject("semantic_result").getJSONArray(s);
|
|
|
|
|
if (jsonArray != null && jsonArray.size() > 0) {
|
|
|
|
|
ocrArray.addAll(jsonArray.toJavaList(JSONObject.class));
|
|
|
|
|
}
|
|
|
|
|
//TODO 注意,ocr 识别返回的 字段是多个结果(数组),有一个值匹配上即为正确
|
|
|
|
|
List<JSONObject> ocrArray = new ArrayList<>();
|
|
|
|
|
for (String s : fieldNameList) {
|
|
|
|
|
JSONArray jsonArray = semanticResult.getJSONObject("semantic_result").getJSONArray(s);
|
|
|
|
|
if (jsonArray != null && jsonArray.size() > 0) {
|
|
|
|
|
ocrArray.addAll(jsonArray.toJavaList(JSONObject.class));
|
|
|
|
|
}
|
|
|
|
|
if (ocrArray.size() > 0) {
|
|
|
|
|
ocrArrayFor:
|
|
|
|
|
for (int i = 0; i < ocrArray.size(); i++) {
|
|
|
|
|
JSONObject ocrItem = ocrArray.get(i);
|
|
|
|
|
text = null;
|
|
|
|
|
text = ocrItem.getString("text");//ocr 识别的文本
|
|
|
|
|
probability = ocrItem.getDouble("probability");//置信度
|
|
|
|
|
if ("101".equals(ruleInfo)) {
|
|
|
|
|
if (StringUtils.isBlank(text) || StringUtils.isBlank(inputText)) {
|
|
|
|
|
//没识别值
|
|
|
|
|
}
|
|
|
|
|
if (ocrArray.size() > 0) {
|
|
|
|
|
for (JSONObject ocrItem : ocrArray) {
|
|
|
|
|
text = null;
|
|
|
|
|
text = ocrItem.getString("text");//ocr 识别的文本
|
|
|
|
|
probability = ocrItem.getDouble("probability");//置信度
|
|
|
|
|
if ("101".equals(ruleInfo)) {
|
|
|
|
|
if (StringUtils.isBlank(text) || StringUtils.isBlank(inputText)) {
|
|
|
|
|
//没识别值
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数不判断", true, ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (text.contains(inputText)) {
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数不判断", true,ruleInfo);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, "101");
|
|
|
|
|
} else {
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (text.contains(inputText)) {
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v,"101");
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v,ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (StringUtils.isBlank(text)) {
|
|
|
|
|
//ocr识别参数为空,不通过
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数未获取到结果<br>");
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false,ruleInfo);
|
|
|
|
|
} else if (StringUtils.isBlank(inputText)) {
|
|
|
|
|
//没有输入值.
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (StringUtils.isBlank(text)) {
|
|
|
|
|
//ocr识别参数为空,不通过
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false, ruleInfo);
|
|
|
|
|
} else if (StringUtils.isBlank(inputText)) {
|
|
|
|
|
//没有输入值.
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "没有输入值不做匹配", true, ruleInfo);
|
|
|
|
|
} else if ("0".equals(ruleInfo)) {
|
|
|
|
|
//不必校验,有识别到就行,通过
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, ruleInfo);
|
|
|
|
|
} else if (Double.parseDouble(ruleInfo) >= 1 && Double.parseDouble(ruleInfo) <= 99) {
|
|
|
|
|
//在1~99之间,根据精准度匹配
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (v >= Double.parseDouble(ruleInfo)) {
|
|
|
|
|
//准确度 可靠
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "没有输入值不做匹配", true,ruleInfo);
|
|
|
|
|
} else if ("0".equals(ruleInfo)) {
|
|
|
|
|
//不必校验,有识别到就行,通过
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
} else if ("100".equals(ruleInfo)) {
|
|
|
|
|
//必定验证参数,必须有值且匹配
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (text.equals(inputText)) {
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true,ruleInfo);
|
|
|
|
|
} else if (Double.valueOf(ruleInfo) >= 1 && Double.valueOf(ruleInfo) <= 99) {
|
|
|
|
|
//在1~99之间,根据精准度匹配
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (v >= Double.valueOf(ruleInfo)) {
|
|
|
|
|
//准确度 可靠
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v,ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v,ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
} else if ("100".equals(ruleInfo)) {
|
|
|
|
|
//必定验证参数,必须有值且匹配
|
|
|
|
|
double v = StrCharUtil.similarityRatio(inputText, text);
|
|
|
|
|
if (text.equals(inputText)) {
|
|
|
|
|
fieldRightMap.put(field, true);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v,ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v,ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, "", true, v, ruleInfo);
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数不匹配<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, text, probability, imgPath, value.getFieldName() + "参数不匹配", false, v, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数未获取到结果<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false,ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName() + "参数未获取到结果<br>");
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, 0d, imgPath, value.getFieldName() + "参数未获取到结果", false,ruleInfo);
|
|
|
|
|
fieldRightMap.put(field, false);
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
|
|
|
|
|
mapPutIfTrue(fieldRightMap, field, false);
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, probability, imgPath, value.getFieldName() + "参数未获取到结果", false, ruleInfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*if (b) {
|
|
|
|
|
} else {
|
|
|
|
|
rMessage.append(value.getFieldName()).append("参数未获取到结果<br>");
|
|
|
|
|
ocrResultAdd(ocrResultDTOList, value.getFieldName(), field, inputText, null, 0d, imgPath, value.getFieldName() + "参数未获取到结果", false, ruleInfo);
|
|
|
|
|
fieldRightMap.put(field, false);
|
|
|
|
|
}*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Date overDataCheckTime = new Date();
|
|
|
|
@ -842,8 +807,8 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
//OCR和NlU执行时间总和(秒)
|
|
|
|
|
double ocrAndNluTimeSum = identifyDetailList.stream().mapToDouble(i -> (i.getOcrTime() == null ? 0 : i.getOcrTime()) + (i.getNluTime() == null ? 0 : i.getNluTime())).sum();
|
|
|
|
|
//执行时间(毫秒)
|
|
|
|
|
double dataStructuredTime = new BigDecimal(overDataCheckTime.getTime() - startDataCheckTime.getTime()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
|
|
double executionTime = new BigDecimal(ocrAndNluTimeSum+(dataStructuredTime/1000)).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
|
|
double dataStructuredTime = new BigDecimal(overDataCheckTime.getTime() - startDataCheckTime.getTime()).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
|
double executionTime = new BigDecimal(ocrAndNluTimeSum+(dataStructuredTime/1000)).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
|
responseBody.put("dataStructuredTime",dataStructuredTime);
|
|
|
|
|
responseBody.put("allExecutionTime",executionTime);
|
|
|
|
|
|
|
|
|
@ -859,17 +824,17 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
long count = fieldRightMap.values().stream().filter(o->!o).count();
|
|
|
|
|
//long count = ocrResultDTOList.stream().filter(o -> !o.getRuleValidation()).count();
|
|
|
|
|
responseBody.put("taskResult",count>0?0:1);//匹配成功或失败
|
|
|
|
|
List<String> haveRateTagList = ocrResultDTOList.stream().filter(o -> o.getOcrPrecisionRate() > 0).map(OcrResultDTO::getTag).collect(Collectors.toList());
|
|
|
|
|
List<String> haveRateTagList = ocrResultDTOList.stream().filter(o -> o.getTextRate() > 0).map(OcrResultDTO::getTag).collect(Collectors.toList());
|
|
|
|
|
//过滤掉0的值
|
|
|
|
|
ocrResultDTOList = ocrResultDTOList.stream().filter(o->haveRateTagList.contains(o.getTag()) && o.getOcrPrecisionRate()>0).collect(Collectors.toList());
|
|
|
|
|
ocrResultDTOList = ocrResultDTOList.stream().filter(o->haveRateTagList.contains(o.getTag()) && o.getTextRate()>0).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
//获取最小
|
|
|
|
|
Double min = 0d;
|
|
|
|
|
double min = 0d;
|
|
|
|
|
//获取最大
|
|
|
|
|
Double max = 0d;
|
|
|
|
|
double max = 0d;
|
|
|
|
|
if (CollectionUtils.isNotEmpty(ocrResultDTOList)) {
|
|
|
|
|
min = ocrResultDTOList.stream().sorted((a, b) -> a.getTextRate().compareTo(b.getTextRate())).findFirst().get().getTextRate();
|
|
|
|
|
max = ocrResultDTOList.stream().sorted((a, b) -> b.getTextRate().compareTo(a.getTextRate())).findFirst().get().getTextRate();
|
|
|
|
|
min = ocrResultDTOList.stream().mapToDouble(OcrResultDTO::getTextRate).min().getAsDouble();
|
|
|
|
|
max = ocrResultDTOList.stream().mapToDouble(OcrResultDTO::getTextRate).max().getAsDouble();
|
|
|
|
|
}
|
|
|
|
|
responseBody.put("min",min);
|
|
|
|
|
responseBody.put("max",max);
|
|
|
|
@ -889,7 +854,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
log.error("该方法正在执行中");
|
|
|
|
|
}
|
|
|
|
|
List<TaskModel> waitingTaskList = taskList.stream().filter(t -> t.getTaskStatus().equals("0")).collect(Collectors.toList());
|
|
|
|
|
if (waitingTaskList != null) {
|
|
|
|
|
if (CollectionUtils.isNotEmpty(waitingTaskList)) {
|
|
|
|
|
while (waitingTaskList.size() > 0) {
|
|
|
|
|
//取第一个任务
|
|
|
|
|
TaskModel taskModel = waitingTaskList.get(0);
|
|
|
|
@ -910,14 +875,14 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
/**
|
|
|
|
|
* 刷新任务状态
|
|
|
|
|
*
|
|
|
|
|
* @param taskId
|
|
|
|
|
* @param taskId 任务id
|
|
|
|
|
* @param status 状态 1 运行中,2 已结束
|
|
|
|
|
*/
|
|
|
|
|
public void flushTask(String taskId, int status) {
|
|
|
|
|
List<TaskModel> taskList = getTaskList();
|
|
|
|
|
if (taskList != null && taskList.size() > 0) {
|
|
|
|
|
TaskModel taskModel = taskList.stream().filter(t -> t.getTaskId().equals(taskId)).findFirst().get();
|
|
|
|
|
if (taskModel != null) {
|
|
|
|
|
if (taskModel!=null) {
|
|
|
|
|
int taskLevel = taskModel.getTaskLevel();
|
|
|
|
|
String task = (String) redisUtil.get("task_" + taskLevel);
|
|
|
|
|
JSONArray taskJsonArray = JSONObject.parseArray(task);
|
|
|
|
@ -971,7 +936,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
String masterTask = (String) redisUtil.get("identify_" + masterTaskId);
|
|
|
|
|
if (StringUtils.isNotBlank(masterTask)) {
|
|
|
|
|
//主任务中排除当前任务
|
|
|
|
|
String collect = Arrays.asList(masterTask.split(",")).stream().filter(t -> !t.equals(task_id)).collect(Collectors.joining(","));
|
|
|
|
|
String collect = Arrays.stream(masterTask.split(",")).filter(t -> !t.equals(task_id)).collect(Collectors.joining(","));
|
|
|
|
|
if (StringUtils.isBlank(collect)) {
|
|
|
|
|
//如果主任务下的子任务已清空,删除key
|
|
|
|
|
redisUtil.del("identify_" + masterTaskId);
|
|
|
|
@ -984,7 +949,7 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Thread.sleep(2000l);
|
|
|
|
|
Thread.sleep(2000L);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -999,9 +964,8 @@ public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrId
|
|
|
|
|
if (!Arrays.asList(overTaskIds.split(",")).contains(taskModel.getTaskId())) {
|
|
|
|
|
//该任务未执行过
|
|
|
|
|
overTaskIds += "," + taskModel.getTaskId();
|
|
|
|
|
} else {
|
|
|
|
|
//该任务已结束过
|
|
|
|
|
}
|
|
|
|
|
//该任务已结束过
|
|
|
|
|
}
|
|
|
|
|
//存入已执行 redis里
|
|
|
|
|
redisUtil.set("over_task", overTaskIds);
|
|
|
|
|