master
周文涛 2 years ago
parent 23b6ed6bcb
commit 61e7a4d50e

@ -0,0 +1,13 @@
package org.jeecg.common.constant;
/**
* @Description ocr
* @Author ZhouWenTao
* @Date 2023/7/19 20:34
*/
public class OcrConstant {
/**
*
*/
public static String ruleCheckSplitChar="&";
}

@ -1,9 +1,16 @@
package org.jeecg.modules.ocr.controller;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.util.RestUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
/**
* @Description
* @Author ZhouWenTao
@ -13,6 +20,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class OcrApiController {
public static final String semanticUrl="http://47.103.213.109:9099/semantic";
/**
* 1. id[]
* POST /semantic
@ -56,4 +64,21 @@ public class OcrApiController {
* }
* message: "成功"
*/
@ApiOperation(value = "请求ocr识别")
@RequestMapping("/push/semantic")
public Result<?> pushSemantic(){
String taskId="1681203097437954049";//任务id
List<String> imagesUrl= Arrays.asList("https://h5.mcnetmart.com/tmp/images/dc_demo1.png");//图片路径
for (String image : imagesUrl) {
JSONObject jsonObject=new JSONObject();
jsonObject.put("taskId",taskId);
jsonObject.put("images",Arrays.asList(image));
//请求 ocr识别即可
JSONObject postResponse = RestUtil.post("", jsonObject);
//获取返回结果
postResponse.getString("");
}
return null;
}
}

@ -105,4 +105,8 @@ public class OcrIdentify implements Serializable {
@ApiModelProperty(value = "识别任务优先级")
@Dict(dicCode = "task_priority")
public String priority;
/**校验数据源*/
@ApiModelProperty(value = "校验数据源")
public String sourceJson;
}

@ -0,0 +1,87 @@
package org.jeecg.modules.ocr.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: ocr
* @Author: jeecg-boot
* @Date: 2023-07-19
* @Version: V1.0
*/
@Data
@TableName("ocr_identify_detail")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="ocr_identify_detail对象", description="ocr识别结果明细")
public class OcrIdentifyDetail implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**ocr识别id*/
@Excel(name = "ocr识别id", width = 15)
@ApiModelProperty(value = "ocr识别id")
private java.lang.String identifyId;
/**识别状态*/
@Excel(name = "识别状态", width = 15)
@ApiModelProperty(value = "识别状态")
private java.lang.String status;
/**图片名称*/
@Excel(name = "图片名称", width = 15)
@ApiModelProperty(value = "图片名称")
private java.lang.String imageName;
/**图片地址*/
@Excel(name = "图片地址", width = 15)
@ApiModelProperty(value = "图片地址")
private java.lang.String imageUrl;
/**识别描述*/
@Excel(name = "识别描述", width = 15)
@ApiModelProperty(value = "识别描述")
private java.lang.String message;
/**语义化结果*/
@Excel(name = "语义化结果", width = 15)
@ApiModelProperty(value = "语义化结果")
private java.lang.String semanticResult;
/**数据结构化*/
@Excel(name = "数据结构化", width = 15)
@ApiModelProperty(value = "数据结构化")
private java.lang.String dataStructured;
/**执行识别时长(秒)*/
@Excel(name = "执行识别时长(秒)", width = 15)
@ApiModelProperty(value = "执行识别时长(秒)")
private java.lang.Double executionTime;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建日期")
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新日期")
private java.util.Date updateTime;
}

@ -0,0 +1,17 @@
package org.jeecg.modules.ocr.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.ocr.entity.OcrIdentifyDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: ocr
* @Author: jeecg-boot
* @Date: 2023-07-19
* @Version: V1.0
*/
public interface OcrIdentifyDetailMapper extends BaseMapper<OcrIdentifyDetail> {
}

@ -2,6 +2,7 @@ package org.jeecg.modules.ocr.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.ocr.entity.OcrIdentify;
import org.jeecg.modules.ocr.vo.OcrIdentifyVo;
/**
* @Description: ocr
@ -11,4 +12,5 @@ import org.jeecg.modules.ocr.entity.OcrIdentify;
*/
public interface OcrIdentifyMapper extends BaseMapper<OcrIdentify> {
OcrIdentifyVo findById(String id);
}

@ -18,4 +18,6 @@ import java.util.Map;
public interface OcrRuleCheckMapper extends BaseMapper<OcrRuleCheck> {
IPage<OcrRuleCheckVo> pageVo(@Param("page")Page<OcrRuleCheck> page,@Param("p") Map<String, Object> params);
OcrRuleCheckVo findById(String id);
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.ocr.mapper.OcrIdentifyDetailMapper">
</mapper>

@ -2,4 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.ocr.mapper.OcrIdentifyMapper">
<select id="findById" resultType="org.jeecg.modules.ocr.vo.OcrIdentifyVo">
SELECT * FROM ocr_identify WHERE id = #{id}
</select>
</mapper>

@ -4,16 +4,21 @@
<select id="pageVo" resultType="org.jeecg.modules.ocr.vo.OcrRuleCheckVo">
SELECT
orc.*,omc.config_name as metadataConfigName
FROM ocr_rule_check orc
LEFT JOIN ocr_metadata_config omc ON omc.id = orc.metadata_config_id
ocr.*,omc.config_name as metadataConfigName
FROM ocr_rule_check ocr
LEFT JOIN ocr_metadata_config omc ON omc.id = ocr.metadata_config_id
WHERE 1=1
<if test="p.configName!=null and p.configName!=''">
orc.config_name like concat('%',#{p.configName},'%')
ocr.config_name like concat('%',#{p.configName},'%')
</if>
<if test="p.configRule!=null and p.configRule!=''">
orc.config_rule like concat('%',#{configRule},'%')
ocr.config_rule like concat('%',#{configRule},'%')
</if>
order by orc.update_time desc
order by ocr.update_time desc
</select>
<select id="findById" resultType="org.jeecg.modules.ocr.vo.OcrRuleCheckVo">
SELECT * FROM ocr_rule_check ocr
WHERE ocr.id = #{id}
</select>
</mapper>

@ -0,0 +1,14 @@
package org.jeecg.modules.ocr.service;
import org.jeecg.modules.ocr.entity.OcrIdentifyDetail;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: ocr
* @Author: jeecg-boot
* @Date: 2023-07-19
* @Version: V1.0
*/
public interface IOcrIdentifyDetailService extends IService<OcrIdentifyDetail> {
}

@ -1,7 +1,9 @@
package org.jeecg.modules.ocr.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.ocr.entity.OcrIdentify;
import org.jeecg.modules.ocr.vo.OcrIdentifyVo;
/**
* @Description: ocr
@ -10,5 +12,10 @@ import org.jeecg.modules.ocr.entity.OcrIdentify;
* @Version: V1.0
*/
public interface IOcrIdentifyService extends IService<OcrIdentify> {
public OcrIdentifyVo findById(String id);
/**
* ocr
* @param responseBody
*/
public void getSemanticInfo(JSONObject responseBody);
}

@ -24,4 +24,6 @@ public interface IOcrRuleCheckService extends IService<OcrRuleCheck> {
void removeById(String id);
IPage<OcrRuleCheckVo> pageVo(Page<OcrRuleCheck> page, OcrRuleCheck ocrRuleCheck);
OcrRuleCheckVo findById(String ruleCheck);
}

@ -0,0 +1,19 @@
package org.jeecg.modules.ocr.service.impl;
import org.jeecg.modules.ocr.entity.OcrIdentifyDetail;
import org.jeecg.modules.ocr.mapper.OcrIdentifyDetailMapper;
import org.jeecg.modules.ocr.service.IOcrIdentifyDetailService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: ocr
* @Author: jeecg-boot
* @Date: 2023-07-19
* @Version: V1.0
*/
@Service
public class OcrIdentifyDetailServiceImpl extends ServiceImpl<OcrIdentifyDetailMapper, OcrIdentifyDetail> implements IOcrIdentifyDetailService {
}

@ -1,11 +1,24 @@
package org.jeecg.modules.ocr.service.impl;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.ocr.entity.OcrIdentify;
import org.jeecg.modules.ocr.entity.OcrIdentifyDetail;
import org.jeecg.modules.ocr.entity.OcrRuleCheck;
import org.jeecg.modules.ocr.mapper.OcrIdentifyMapper;
import org.jeecg.modules.ocr.service.IOcrIdentifyDetailService;
import org.jeecg.modules.ocr.service.IOcrIdentifyService;
import org.jeecg.modules.ocr.service.IOcrRuleCheckDetailService;
import org.jeecg.modules.ocr.service.IOcrRuleCheckService;
import org.jeecg.modules.ocr.vo.OcrIdentifyVo;
import org.jeecg.modules.ocr.vo.OcrRuleCheckVo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource;
import java.util.Map;
/**
* @Description: ocr
* @Author: jeecg-boot
@ -14,5 +27,82 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
*/
@Service
public class OcrIdentifyServiceImpl extends ServiceImpl<OcrIdentifyMapper, OcrIdentify> implements IOcrIdentifyService {
@Resource
IOcrRuleCheckService ocrRuleCheckService;
@Resource
IOcrIdentifyDetailService ocrIdentifyDetailService;
@Resource
IOcrRuleCheckDetailService ocrRuleCheckDetailService;
@Override
public OcrIdentifyVo findById(String id){
OcrIdentifyVo ocrIdentifyVo=baseMapper.findById(id);
if (StringUtils.isNotBlank(ocrIdentifyVo.getSourceJson())) {
ocrIdentifyVo.setSourceJsonObject(JSONObject.parseObject(ocrIdentifyVo.getSourceJson()));
}
//规则检查配置信息
String ruleCheck = ocrIdentifyVo.getRuleCheck();
if (StringUtils.isNotBlank(ruleCheck)) {
OcrRuleCheckVo ocrRuleCheck = ocrRuleCheckService.findById(ocrIdentifyVo.getRuleCheck());
ocrIdentifyVo.setOcrRuleCheckVo(ocrRuleCheck);
}
return ocrIdentifyVo;
}
@Override
public void getSemanticInfo(JSONObject responseBody) {
log.debug("打印 ocr 结果:"+responseBody.toString());
String identifyId = responseBody.getString("identifyId");//任务id
String imgPath = responseBody.getString("img_path");//图片路径
String imgName = null;//图片名称
if (StringUtils.isNotBlank(imgPath)) {
imgName = imgPath.substring(imgPath.lastIndexOf("/"),imgPath.length());
}
String message = responseBody.getString("message");//描述
String taskStatus = responseBody.getString("taskStatus");//任务是否完成
Double executionTime = responseBody.getDouble("execution_time");//执行时长(秒)
JSONObject semanticResult = responseBody.getJSONObject("semantic_result");//语义化结果
// 入库记录
OcrIdentifyDetail ocrIdentifyDetail = new OcrIdentifyDetail();
if (semanticResult!=null) {
ocrIdentifyDetail.setIdentifyId(identifyId);
ocrIdentifyDetail.setImageName(imgName);
ocrIdentifyDetail.setImageUrl(imgPath);
ocrIdentifyDetail.setStatus(taskStatus);
ocrIdentifyDetail.setMessage(message);
ocrIdentifyDetail.setExecutionTime(executionTime);
ocrIdentifyDetail.setSemanticResult(semanticResult.toJSONString());
ocrIdentifyDetailService.save(ocrIdentifyDetail);
}
//===================
String ocrIdentifyDetailId = ocrIdentifyDetail.getId();//明细id
// 进行数据化 结构
if (semanticResult!=null) {
OcrIdentifyVo ocrIdentifyVo = this.findById(identifyId);
OcrRuleCheckVo ocrRuleCheckVo = ocrIdentifyVo.getOcrRuleCheckVo();
// field,1/0
Map<String, String> configRuleMap = ocrRuleCheckVo.getConfigRuleMap();
// field,fieldname
Map<String, String> fieldMap = ocrRuleCheckVo.getFieldMap();
//对参数做匹配
JSONObject sourceJsonObject = ocrIdentifyVo.getSourceJsonObject();
//将 语义化结果 返回的 key 转换成 字段
for (String field : sourceJsonObject.keySet()) {
String fieldName = sourceJsonObject.getString(field);
semanticResultFor: for (String s : semanticResult.keySet()) {
if (fieldName.contains(s)) {
break semanticResultFor;
}
}
}
for (String s : semanticResult.keySet()) {
}
}
//=========================
}
}

@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.constant.OcrConstant;
import org.jeecg.modules.ocr.entity.OcrMetadataConfig;
import org.jeecg.modules.ocr.entity.OcrMetadataConfigDetail;
import org.jeecg.modules.ocr.entity.OcrRuleCheck;
import org.jeecg.modules.ocr.entity.OcrRuleCheckDetail;
import org.jeecg.modules.ocr.mapper.OcrMetadataConfigDetailMapper;
import org.jeecg.modules.ocr.mapper.OcrMetadataConfigMapper;
import org.jeecg.modules.ocr.mapper.OcrRuleCheckMapper;
import org.jeecg.modules.ocr.model.OcrMetadataConfigSaveModel;
import org.jeecg.modules.ocr.model.OcrRuleCheckSaveModel;
@ -33,6 +36,10 @@ import java.util.Map;
public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, OcrRuleCheck> implements IOcrRuleCheckService {
@Resource
IOcrRuleCheckDetailService ocrRuleCheckDetailService;
@Resource
OcrMetadataConfigMapper ocrMetadataConfigMapper;
@Resource
OcrMetadataConfigDetailMapper ocrMetadataConfigDetailMapper;
@Override
public boolean existsByConfigName(String configName, String id) {
LambdaQueryWrapper<OcrRuleCheck> queryWrapper = new LambdaQueryWrapper<>();
@ -111,4 +118,36 @@ public class OcrRuleCheckServiceImpl extends ServiceImpl<OcrRuleCheckMapper, Ocr
Map<String,Object> params=new LinkedHashMap<>();
return baseMapper.pageVo(page,params);
}
@Override
public OcrRuleCheckVo findById(String id) {
OcrRuleCheckVo ocrRuleCheckVo = baseMapper.findById(id);
if (StringUtils.isNotBlank(ocrRuleCheckVo.getConfigRule())) {
String configRule = ocrRuleCheckVo.getConfigRule();
String[] split = configRule.split(OcrConstant.ruleCheckSplitChar);
//将 `配置规则` 转成 map
Map<String,String> configRuleMap=new LinkedHashMap<>();
for (String s : split) {
String[] split1 = s.split("=");
if (split1.length<=1) {
continue;
}
String s1 = split1[0];
String s2 = split1[1];
configRuleMap.put(s1,s2);
}
ocrRuleCheckVo.setConfigRuleMap(configRuleMap);
}
if (StringUtils.isNotBlank(ocrRuleCheckVo.getMetadataConfigId())) {
String metadataConfigId = ocrRuleCheckVo.getMetadataConfigId();
List<OcrMetadataConfigDetail> ocrMetadataConfigDetails = ocrMetadataConfigDetailMapper.selectList(new LambdaQueryWrapper<OcrMetadataConfigDetail>().eq(OcrMetadataConfigDetail::getMetadataConfigId, metadataConfigId));
Map<String,String> fieldMap=new LinkedHashMap<>();
for (OcrMetadataConfigDetail ocrMetadataConfigDetail : ocrMetadataConfigDetails) {
fieldMap.put(ocrMetadataConfigDetail.getFieldName(),ocrMetadataConfigDetail.getGetField());
}
ocrRuleCheckVo.setFieldMap(fieldMap);
}
return ocrRuleCheckVo;
}
}

@ -0,0 +1,20 @@
package org.jeecg.modules.ocr.vo;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.jeecg.modules.ocr.entity.OcrIdentify;
import org.jeecg.modules.ocr.entity.OcrRuleCheck;
/**
* @Description ocr
* @Author ZhouWenTao
* @Date 2023/7/19 18:20
*/
@Data
public class OcrIdentifyVo extends OcrIdentify {
/**规则检查配置*/
public OcrRuleCheckVo ocrRuleCheckVo;
/**校验数据源 json对象*/
public JSONObject sourceJsonObject;
}

@ -15,6 +15,8 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Description:
@ -28,4 +30,8 @@ public class OcrRuleCheckVo extends OcrRuleCheck {
@ApiModelProperty(value = "元数据配置名称")
private String metadataConfigName;
private Map<String,String> configRuleMap=new LinkedHashMap<>();
private Map<String,String> fieldMap=new LinkedHashMap<>();
}

Loading…
Cancel
Save