From d15453ec4a2cafe598e8b236372c8086e6c81cc6 Mon Sep 17 00:00:00 2001 From: zhengfangyuan Date: Tue, 26 Jan 2021 16:44:45 +0800 Subject: [PATCH] add ocr --- mallinkAdmin/pom.xml | 10 ++- .../db/migration/V202101260001__ocr.sql | 24 +++++ mallinkCApi/pom.xml | 11 +++ .../iformall/controller/WxOcrController.java | 57 ++++++++++++ mallinkOcr/pom.xml | 1 - .../com/iformall/ocr/FormallTess4jTrain.java | 2 + mallinkService/pom.xml | 8 -- .../domain/po/WxMerchantOcrModel.java | 25 ++++++ .../com/iformall/domain/po/WxOcrModel.java | 28 ++++++ .../mapper/WxMerchantOcrModelMapper.java | 14 +++ .../com/iformall/mapper/WxOcrModelMapper.java | 14 +++ .../com/iformall/service/WxOcrService.java | 30 +++++++ .../service/impl/WxOcrServiceImpl.java | 89 +++++++++++++++++++ .../mapper/WxMerchantOcrModelMapper.xml | 57 ++++++++++++ .../resources/mapper/WxOcrModelMapper.xml | 54 +++++++++++ 15 files changed, 411 insertions(+), 13 deletions(-) create mode 100644 mallinkAdmin/src/main/resources/db/migration/V202101260001__ocr.sql create mode 100644 mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxMerchantOcrModel.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxOcrModel.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxMerchantOcrModelMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxOcrModelMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxOcrService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxOcrServiceImpl.java create mode 100644 mallinkService/src/main/resources/mapper/WxMerchantOcrModelMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxOcrModelMapper.xml diff --git a/mallinkAdmin/pom.xml b/mallinkAdmin/pom.xml index b4e69011d..3b9d17bd9 100644 --- a/mallinkAdmin/pom.xml +++ b/mallinkAdmin/pom.xml @@ -47,13 +47,15 @@ 5.2.4 - + - net.sourceforge.tess4j - tess4j - 4.5.2 + com.iformall + mallinkOcr + 1.0 + + diff --git a/mallinkAdmin/src/main/resources/db/migration/V202101260001__ocr.sql b/mallinkAdmin/src/main/resources/db/migration/V202101260001__ocr.sql new file mode 100644 index 000000000..26c195125 --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V202101260001__ocr.sql @@ -0,0 +1,24 @@ +CREATE TABLE `wx_merchant_ocr_model` ( + `id` bigint(20) NOT NULL, + `merchant_id` bigint(20) NOT NULL COMMENT '商户编号', + `ocr_model_id` bigint(20) NOT NULL COMMENT 'ocr模板编号', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `tenant_id` varchar(5) DEFAULT NULL COMMENT '租户id', + `parent_tenant_id` varchar(5) DEFAULT NULL, + `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `UNIQUE` (`merchant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `wx_ocr_model` ( + `id` bigint(20) NOT NULL, + `lang_code` varchar(20) NOT NULL DEFAULT 'iformallLang' COMMENT '语言定义', + `font_name` varchar(20) NOT NULL COMMENT '字库名称', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `remark` text COMMENT '说明', + `status` tinyint(1) DEFAULT '0' COMMENT '0-有效 1-无效', + PRIMARY KEY (`id`), + UNIQUE KEY `UNIQUE` (`font_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + diff --git a/mallinkCApi/pom.xml b/mallinkCApi/pom.xml index 9c71414ee..a65c4b7e4 100644 --- a/mallinkCApi/pom.xml +++ b/mallinkCApi/pom.xml @@ -16,6 +16,17 @@ com.iformall mallinkService 1.0 + + + com.iformall + mallinkOcr + 1.0 + + + + com.iformall + mallinkOcr + 1.0 diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java new file mode 100644 index 000000000..71826861c --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java @@ -0,0 +1,57 @@ +package com.iformall.controller; + +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxMerchantOcrModel; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.ocr.FormallTess4j; +import com.iformall.service.WxOcrService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author gongbiao + */ +@RestController +@RequestMapping("/api/wxOcr") +@Api(description = "ocr") +public class WxOcrController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxOcrService ocrService; + + + @ApiOperation("分析图片信息") + @GetMapping("/analyImage") + @ApiImplicitParams({ + @ApiImplicitParam(name = "merchantId", value = "商户编号", dataType = "Long", paramType = "query", required = true), + @ApiImplicitParam(name = "imageUrl", value = "小票图片url", dataType = "String", paramType = "query", required = true), + }) + public ResultData analyImage(Long merchantId,String imageUrl) { + TenantEntity tenantEntity = getTenantInfo(); + WxMerchantOcrModel model = ocrService.getMerchantOcrModel(merchantId, tenantEntity.getTenantId(), tenantEntity.getParentTenantId()); + if (null == model) { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "当前商户没有配置OCR模板"); + } + String result; + try { + result = FormallTess4j.ocrNetImgFile(imageUrl); + return new ResultData(result); + } catch (Exception e) { + logger.error("ocr识别失败。",e); + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "ocr识别失败。"+e.getMessage()); + } + + } + + +} diff --git a/mallinkOcr/pom.xml b/mallinkOcr/pom.xml index 110fefed4..e0177547c 100644 --- a/mallinkOcr/pom.xml +++ b/mallinkOcr/pom.xml @@ -38,5 +38,4 @@ - \ No newline at end of file diff --git a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java index 953cef31d..cede78e76 100644 --- a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java +++ b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java @@ -80,6 +80,7 @@ public class FormallTess4jTrain { System.out.println(trainCmdstr); //executeLocalCmd(trainCmdstr, null); + //此处可以批量开始 String extractorCmdstr = "unicharset_extractor "+prefix+".box"; System.out.println(extractorCmdstr); //executeLocalCmd(extractorCmdstr, null); @@ -95,6 +96,7 @@ public class FormallTess4jTrain { String cntrainCmdstr = "cntraining "+prefix+".tr"; System.out.println(cntrainCmdstr); //executeLocalCmd(cntrainCmdstr, null); + //批量结束 //System.out.println("DONE createTrainFiles !"); } diff --git a/mallinkService/pom.xml b/mallinkService/pom.xml index c9a09ec90..8a019e55a 100644 --- a/mallinkService/pom.xml +++ b/mallinkService/pom.xml @@ -35,14 +35,6 @@ mybatis-multi-tenancy 1.0 - - - - com.iformall - mallinkOcr - 1.0 - - \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMerchantOcrModel.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMerchantOcrModel.java new file mode 100644 index 000000000..d98f628c3 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMerchantOcrModel.java @@ -0,0 +1,25 @@ +package com.iformall.domain.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.iformall.domain.po.base.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; + +@TableName(value = "wx_merchant_ocr_model") +@Data +@EqualsAndHashCode(callSuper = true) +public class WxMerchantOcrModel extends TenantEntity { + private static final long serialVersionUID = 1L; + + protected Long id; + @io.swagger.annotations.ApiModelProperty(value="商户编号",name="merchantId") + private Long merchantId; + @io.swagger.annotations.ApiModelProperty(value="ocr模板编号",name="ocrModelId") + private Long ocrModelId; + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") + private Date createTime; + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="updateTime") + private Date updateTime; + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOcrModel.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOcrModel.java new file mode 100644 index 000000000..c407d7390 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOcrModel.java @@ -0,0 +1,28 @@ +package com.iformall.domain.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.iformall.domain.po.base.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; + +@TableName(value = "wx_ocr_model") +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOcrModel extends BaseEntity { + private static final long serialVersionUID = 1L; + + protected Long id; + @io.swagger.annotations.ApiModelProperty(value="语言定义,默认iformallLang",name="langCode") + private String langCode; + @io.swagger.annotations.ApiModelProperty(value="字库名称",name="fontName") + private String fontName; + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") + private Date createTime; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateTime") + private Date updateTime; + @io.swagger.annotations.ApiModelProperty(value="备注",name="remark") + private String remark; + @io.swagger.annotations.ApiModelProperty(value="0-有效 1-无效",name="status") + private Integer status; +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxMerchantOcrModelMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxMerchantOcrModelMapper.java new file mode 100644 index 000000000..51766acda --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxMerchantOcrModelMapper.java @@ -0,0 +1,14 @@ +package com.iformall.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.iformall.domain.po.WxMerchantOcrModel; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WxMerchantOcrModelMapper extends BaseMapper { + + List findList(WxMerchantOcrModel merchantOcrModel); +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxOcrModelMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxOcrModelMapper.java new file mode 100644 index 000000000..d2a5bdbfc --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxOcrModelMapper.java @@ -0,0 +1,14 @@ +package com.iformall.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.iformall.domain.po.WxOcrModel; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WxOcrModelMapper extends BaseMapper { + + List findList(WxOcrModel ocrModel); +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxOcrService.java b/mallinkService/src/main/java/com/iformall/service/WxOcrService.java new file mode 100644 index 000000000..a4366a717 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxOcrService.java @@ -0,0 +1,30 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxActivity; +import com.iformall.domain.po.WxMerchantOcrModel; +import com.iformall.domain.po.WxOcrModel; +import com.iformall.enums.EnumPayWay; + +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author gongbiao + */ +public interface WxOcrService { + + PageInfo listOcrModelAsPage(WxOcrModel record, Integer pageIndex, Integer pageSize); + + WxOcrModel getOcrModelById(Long id); + + ResultData saveOrUpdateOcrModel(WxOcrModel record); + + WxMerchantOcrModel getMerchantOcrModel(Long merchantId,String tenantId,String parentTenantId); + + ResultData saveOrUpdateMerchantOcrModel(WxMerchantOcrModel record); + + ResultData deleteMerchantOcrModel(Long id); +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOcrServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOcrServiceImpl.java new file mode 100644 index 000000000..696dcd800 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOcrServiceImpl.java @@ -0,0 +1,89 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.IdWorker; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxMerchantOcrModel; +import com.iformall.domain.po.WxOcrModel; +import com.iformall.mapper.WxMerchantOcrModelMapper; +import com.iformall.mapper.WxOcrModelMapper; +import com.iformall.service.WxOcrService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.List; + +@Service +public class WxOcrServiceImpl implements WxOcrService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxMerchantOcrModelMapper merchantOcrModelMapper; + @Autowired + WxOcrModelMapper ocrModelMapper; + + @Override + public PageInfo listOcrModelAsPage(WxOcrModel record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> ocrModelMapper.findList(record)); + } + + @Override + public WxOcrModel getOcrModelById(Long id) { + return ocrModelMapper.selectById(id); + } + + @Override + public ResultData saveOrUpdateOcrModel(WxOcrModel record) { + Date date = new Date(); + if (record.getId() == null) { + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + record.setCreateTime(date); + ocrModelMapper.insert(record); + } else { + record.setUpdateTime(date); + ocrModelMapper.updateById(record); + } + return new ResultData(Result.SUCCESS, "操作成功"); + } + + @Override + public WxMerchantOcrModel getMerchantOcrModel(Long merchantId,String tenantId,String parentTenantId) { + WxMerchantOcrModel query = new WxMerchantOcrModel(); + query.setMerchantId(merchantId); + query.setTenantId(tenantId); + query.setParentTenantId(parentTenantId); + List models = merchantOcrModelMapper.findList(query); + if (null == models || models.size() <= 0) { + return null; + } + return models.get(0); + } + + @Override + public ResultData saveOrUpdateMerchantOcrModel(WxMerchantOcrModel record) { + Date date = new Date(); + if (record.getId() == null) { + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + record.setCreateTime(date); + merchantOcrModelMapper.insert(record); + } else { + record.setUpdateTime(date); + merchantOcrModelMapper.updateById(record); + } + return new ResultData(Result.SUCCESS, "操作成功"); + } + + @Override + public ResultData deleteMerchantOcrModel(Long id) { + merchantOcrModelMapper.deleteById(id); + return new ResultData(Result.SUCCESS, "操作成功"); + + } + +} diff --git a/mallinkService/src/main/resources/mapper/WxMerchantOcrModelMapper.xml b/mallinkService/src/main/resources/mapper/WxMerchantOcrModelMapper.xml new file mode 100644 index 000000000..dd7639483 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxMerchantOcrModelMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + id,tenant_id,parent_tenant_id,merchant_id,ocr_model_id,create_time,update_time + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `merchant_id` = #{merchantId} + + + + and `ocr_model_id` = #{ocrModelId} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + \ No newline at end of file diff --git a/mallinkService/src/main/resources/mapper/WxOcrModelMapper.xml b/mallinkService/src/main/resources/mapper/WxOcrModelMapper.xml new file mode 100644 index 000000000..7427ca049 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxOcrModelMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + id,lang_code,font_name,remark,status,create_time,updateTime + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `lang_code` = #{langCode} + + + and `font_name` = #{fontName} + + + + and `status` = #{status} + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + \ No newline at end of file