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