浏览代码

fix ocr

release_toaliyun_real
xiaohanzi 5 年前
父节点
当前提交
79a65606fe
共有 59 个文件被更改,包括 3715 次插入95 次删除
  1. +6
    -4
      mallinkAdmin/pom.xml
  2. +8
    -0
      mallinkAdmin/src/main/java/com/iformall/controller/market/WxActivityController.java
  3. +0
    -0
      mallinkAdmin/src/main/resources/db/migration/V202101140001__memberImport.sql
  4. +1
    -1
      mallinkAdmin/src/main/resources/db/migration/V202101190001__wx_score_rules.sql
  5. +1999
    -0
      mallinkAdmin/src/main/resources/db/migration/V202101210001__wx_c_user_basic_sign.sql
  6. +8
    -0
      mallinkAdmin/src/main/resources/db/migration/V202101250001__user_sign_update_wx_score_rules.sql
  7. +24
    -0
      mallinkAdmin/src/main/resources/db/migration/V202101260001__ocr.sql
  8. +11
    -0
      mallinkCApi/pom.xml
  9. +3
    -0
      mallinkCApi/src/main/java/com/iformall/CApplication.java
  10. +39
    -0
      mallinkCApi/src/main/java/com/iformall/controller/WxActivityController.java
  11. +189
    -0
      mallinkCApi/src/main/java/com/iformall/controller/WxCUserBasicSignController.java
  12. +63
    -0
      mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java
  13. +1
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java
  14. +1
    -0
      mallinkCApi/src/main/resources/application-dev.yml
  15. +1
    -0
      mallinkCApi/src/main/resources/application-prod.yml
  16. +1
    -0
      mallinkCApi/src/main/resources/application-test.yml-bak
  17. +13
    -6
      mallinkOcr/pom.xml
  18. +9
    -10
      mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java
  19. +134
    -0
      mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java
  20. +12
    -1
      mallinkOcr/src/main/resources/Read.txt
  21. 二进制
      mallinkOcr/src/main/resources/tessdata/test1.traineddata
  22. +0
    -8
      mallinkService/pom.xml
  23. +3
    -0
      mallinkService/src/main/java/com/iformall/common/ErrorCode.java
  24. +7
    -0
      mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java
  25. +2
    -2
      mallinkService/src/main/java/com/iformall/domain/po/WxActivity.java
  26. +67
    -0
      mallinkService/src/main/java/com/iformall/domain/po/WxCUserBasicSign.java
  27. +25
    -0
      mallinkService/src/main/java/com/iformall/domain/po/WxMerchantOcrModel.java
  28. +28
    -0
      mallinkService/src/main/java/com/iformall/domain/po/WxOcrModel.java
  29. +5
    -4
      mallinkService/src/main/java/com/iformall/domain/po/WxScoreRules.java
  30. +4
    -0
      mallinkService/src/main/java/com/iformall/domain/po/base/BaseEntity.java
  31. +2
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumActivityStatus.java
  32. +6
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java
  33. +13
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicSignMapper.java
  34. +2
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java
  35. +14
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxMerchantOcrModelMapper.java
  36. +14
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxOcrModelMapper.java
  37. +3
    -0
      mallinkService/src/main/java/com/iformall/service/WxActivityService.java
  38. +31
    -0
      mallinkService/src/main/java/com/iformall/service/WxCUserBasicSignService.java
  39. +1
    -0
      mallinkService/src/main/java/com/iformall/service/WxCreditHistoryService.java
  40. +30
    -0
      mallinkService/src/main/java/com/iformall/service/WxOcrService.java
  41. +64
    -3
      mallinkService/src/main/java/com/iformall/service/impl/WxActivityServiceImpl.java
  42. +243
    -0
      mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicSignServiceImpl.java
  43. +8
    -8
      mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java
  44. +37
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java
  45. +89
    -0
      mallinkService/src/main/java/com/iformall/service/impl/WxOcrServiceImpl.java
  46. +16
    -39
      mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java
  47. +4
    -2
      mallinkService/src/main/java/com/iformall/utils/CreditUtil.java
  48. +15
    -0
      mallinkService/src/main/java/com/iformall/utils/DateUtils.java
  49. +11
    -3
      mallinkService/src/main/resources/mapper/WxActivityMapper.xml
  50. +91
    -0
      mallinkService/src/main/resources/mapper/WxCUserBasicSignMapper.xml
  51. +12
    -0
      mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml
  52. +57
    -0
      mallinkService/src/main/resources/mapper/WxMerchantOcrModelMapper.xml
  53. +54
    -0
      mallinkService/src/main/resources/mapper/WxOcrModelMapper.xml
  54. +7
    -0
      mallinkSysAdmin/pom.xml
  55. +3
    -0
      mallinkSysAdmin/src/main/java/com/iformall/SysApplication.java
  56. +220
    -0
      mallinkSysAdmin/src/main/java/com/iformall/controller/ocr/WxOcrController.java
  57. +1
    -0
      mallinkSysAdmin/src/main/resources/application-dev.yml
  58. +2
    -0
      mallinkSysAdmin/src/main/resources/application-prod.yml
  59. +1
    -0
      mallinkSysAdmin/src/main/resources/application-test.yml-bak

+ 6
- 4
mallinkAdmin/pom.xml 查看文件

@@ -47,13 +47,15 @@
<version>5.2.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<!-- ocr -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.2</version>
<groupId>com.iformall</groupId>
<artifactId>mallinkOcr</artifactId>
<version>1.0</version>
</dependency>


</dependencies>

<build>


+ 8
- 0
mallinkAdmin/src/main/java/com/iformall/controller/market/WxActivityController.java 查看文件

@@ -105,4 +105,12 @@ public class WxActivityController extends BaseController {
return wxActivityService.sendToCampaign(id);
}

@ApiOperation("从宣传页下线")
@PostMapping("offLineCampaign")
@SystemControllerLog(description = "活动-更新状态")
public ResultData offLineCampaign(@RequestBody WxActivity wxActivity) {
logger.debug("[" + getIpAddr() + "] WxActivityController::updateStatus");
return wxActivityService.offLineCampaign(wxActivity);
}

}

mallinkAdmin/src/main/resources/db/migration/V202101400001__memberImport.sql → mallinkAdmin/src/main/resources/db/migration/V202101140001__memberImport.sql 查看文件


mallinkAdmin/src/main/resources/db/migration/V202101900001__wx_score_rules.sql → mallinkAdmin/src/main/resources/db/migration/V202101190001__wx_score_rules.sql 查看文件

@@ -1,5 +1,5 @@
INSERT INTO `mallink`.`wx_score_rules`(`id`, `tenant_id`, `type`, `scale`)
select CEILING(RAND()*90000000000+10000000000),`tenant_id`,4,`scale` from wx_score_rules where type = 2 and scale > 10;

--集团版手动处理,(集团版不存在这类数据,子集团数据与原集团规则相等)
--集团版手动处理,(集团版不存在这类数据,子集团生日倍率数据与原集团规则相等)
--目前集团版(1008-1020-----1028)(1026-1027-----1025)

+ 1999
- 0
mallinkAdmin/src/main/resources/db/migration/V202101210001__wx_c_user_basic_sign.sql
文件差异内容过多而无法显示
查看文件


+ 8
- 0
mallinkAdmin/src/main/resources/db/migration/V202101250001__user_sign_update_wx_score_rules.sql 查看文件

@@ -0,0 +1,8 @@
update wx_score_rules set rules = concat(SUBSTRING(rules,1,char_length(rules)-1),
",{\"id\": 17, \"desc\": \"每日签到\", \"step\": 1, \"limit\": 1, \"score\": 0}",
",{\"id\": 18, \"desc\": \"连续签到7天\", \"step\": 1, \"limit\": 1, \"score\": 0}",
",{\"id\": 19, \"desc\": \"连续签到14天\", \"step\": 1, \"limit\": 1, \"score\": 0}",
",{\"id\": 20, \"desc\": \"连续签到28天\", \"step\": 1, \"limit\": 1, \"score\": 0}",
RIGHT(rules,1)) where type = 2

--type=2 积分规则,每日登陆去掉-- 缓存--缓存--缓存

+ 24
- 0
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;


+ 11
- 0
mallinkCApi/pom.xml 查看文件

@@ -16,6 +16,17 @@
<groupId>com.iformall</groupId>
<artifactId>mallinkService</artifactId>
<version>1.0</version>
</dependency> <!-- ocr -->
<dependency>
<groupId>com.iformall</groupId>
<artifactId>mallinkOcr</artifactId>
<version>1.0</version>
</dependency>
<!-- ocr -->
<dependency>
<groupId>com.iformall</groupId>
<artifactId>mallinkOcr</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>


+ 3
- 0
mallinkCApi/src/main/java/com/iformall/CApplication.java 查看文件

@@ -32,6 +32,9 @@ public class CApplication {

@Value("${fm.upload_dir}")
private String uploadDir;
@Value("${fm.ocr_data}")
private String ocrData;

@Bean
public boolean isFmException() {


+ 39
- 0
mallinkCApi/src/main/java/com/iformall/controller/WxActivityController.java 查看文件

@@ -1,20 +1,27 @@
package com.iformall.controller;

import com.github.pagehelper.PageInfo;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxActivity;
import com.iformall.domain.po.base.BaseEntity;
import com.iformall.enums.EnumActivityStatus;
import com.iformall.service.WxActivityService;
import com.iformall.utils.DateUtils;
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.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@@ -30,6 +37,38 @@ public class WxActivityController extends BaseController {
@Autowired
private WxActivityService wxActivityService;

@ApiOperation("分页列表接口")
@GetMapping("list")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData list(@ModelAttribute WxActivity wxActivity, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxActivityController::list");
if (null == wxActivity) wxActivity = new WxActivity();
wxActivity.setStatus(EnumActivityStatus.INJECT_ONLINE.getCode());
wxActivity.updateTenantInfo(getTenantInfo());
wxActivity.setSortColumns(BaseEntity.SortField.ActivityStartTime_DESC,BaseEntity.SortField.Id_DESC);
final PageInfo<WxActivity> page = wxActivityService.listAsPage(wxActivity, pageNum, pageSize);
return new ResultData(page);
}

@ApiOperation("")
@GetMapping("listStatus")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData listStatus(@ModelAttribute WxActivity wxActivity) {
logger.debug("[" + getIpAddr() + "] WxActivityController::list");
if (null == wxActivity) wxActivity = new WxActivity();
wxActivity.setStatus(EnumActivityStatus.INJECT_ONLINE.getCode());
wxActivity.updateTenantInfo(getTenantInfo());
wxActivity.setSortColumns(BaseEntity.SortField.ActivityStartTime_DESC,BaseEntity.SortField.Id_DESC);
if(wxActivity.getStartDate() == null || wxActivity.getEndDate() == null){
wxActivity.setStartDate(DateUtils.getFirstDayForCurrMonth());
wxActivity.setEndDate(DateUtils.getLastDayForMonth(new Date()));
}
return wxActivityService.getListStatus(wxActivity);
}

@ApiOperation("查询活动状态")
@GetMapping("/queryStatus")


+ 189
- 0
mallinkCApi/src/main/java/com/iformall/controller/WxCUserBasicSignController.java 查看文件

@@ -0,0 +1,189 @@
package com.iformall.controller;

import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserBasicSign;
import com.iformall.domain.po.WxCreditHistory;
import com.iformall.enums.EnumScoreType;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxCUserBasicSignService;
import com.iformall.utils.DateUtils;
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.*;

import java.util.Date;
import java.util.Map;

@RestController
@RequestMapping("/api/userSign")
@Api(description = "签到接口")
public class WxCUserBasicSignController extends BaseController {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxCUserBasicSignService wxCUserBasicSignService;

@ApiOperation("用户签到列表")
@GetMapping("list")
@ApiImplicitParams({
@ApiImplicitParam(name="pageNum",value="页数",dataType="int", paramType = "query",required=true),
@ApiImplicitParam(name="pageSize",value="每页条数",dataType="int", paramType = "query",required=true)})
public ResultData list(@ModelAttribute WxCUserBasicSign wxCUserBasicSign, Integer pageNum, Integer pageSize) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::list");
if (null == wxCUserBasicSign){
wxCUserBasicSign = new WxCUserBasicSign();
}
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
// wxCUserBasicSign.updateTenantInfo(getTenantInfo());
wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);
final PageInfo<WxCUserBasicSign> page = wxCUserBasicSignService.listAsPage(wxCUserBasicSign, pageNum, pageSize);
return new ResultData(page);
}

@ApiOperation("")
@GetMapping("listStatus")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData listStatus(@ModelAttribute WxCUserBasicSign wxCUserBasicSign) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::listStatus");
if (null == wxCUserBasicSign){
wxCUserBasicSign = new WxCUserBasicSign();
}
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
// wxCUserBasicSign.updateTenantInfo(getTenantInfo());
wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);

if(wxCUserBasicSign.getStartDate() == null || wxCUserBasicSign.getEndDate() == null){
wxCUserBasicSign.setStartDate(DateUtils.getFirstDayForCurrMonth());
wxCUserBasicSign.setEndDate(DateUtils.getLastDayForMonth(new Date()));
}
return wxCUserBasicSignService.getListStatus(wxCUserBasicSign);
}

@ApiOperation("签到")
@PostMapping("signIn")
@ApiImplicitParams({
@ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)})
public ResultData signIn(@RequestBody WxCUserBasicSign wxCUserBasicSign) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn");
if (null == wxCUserBasicSign){
wxCUserBasicSign = new WxCUserBasicSign();
}
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
// wxCUserBasicSign.updateTenantInfo(getTenantInfo());
wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);

WxCUserBasicSign todaySign = wxCUserBasicSignService.getTodaySignIn(wxCUserBasicSign);
if(todaySign == null){
try {
todaySign = wxCUserBasicSignService.signIn(wxCUserBasicSign);
}catch(Exception e){
return new ResultData(ErrorCode.SYS_SERVER_ERROR);
}
if(todaySign == null){
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR,"type");
}
return new ResultData(todaySign);
}else{
return new ResultData(ErrorCode.MEM_IS_SIGNIN,todaySign);
}

}

@ApiOperation("签到状态")
@GetMapping("signInStatus")
@ApiImplicitParams({
@ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)})
public ResultData signInStatus() {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn");
WxCUserBasicSign wxCUserBasicSign = new WxCUserBasicSign();
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
// wxCUserBasicSign.updateTenantInfo(getTenantInfo());
wxCUserBasicSign.setTenantId(getTenantInfo().getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);
Map<String, Integer> map = wxCUserBasicSignService.getLastSignIn(wxCUserBasicSign);
return new ResultData(map);
}

@ApiOperation("签到领取")
@PostMapping("signInCredit")
@ApiImplicitParams({
@ApiImplicitParam(name = "", value = "", dataType = "", paramType = "", required = true)})
public ResultData signInCredit(@RequestBody WxCreditHistory wxCreditHistory) {
logger.debug("[" + getIpAddr() + "] WxCUserBasicSignController::signIn");
if (null == wxCreditHistory){
wxCreditHistory = new WxCreditHistory();
}
Long memberId;
try {
memberId = getMemberId();
} catch (MallinkException me) {
return new ResultData(ErrorCode.getByCode(me.getErrorCode()));
}
WxCUserBasicSign wxCUserBasicSign = new WxCUserBasicSign();
wxCUserBasicSign.setTenantId(getFinalTenantId());
wxCUserBasicSign.setUserId(memberId);
Map<String, Integer> map = wxCUserBasicSignService.getLastSignIn(wxCUserBasicSign);
int continueMonthSign = map.get("continueMonthSign");//本月连续签到天数
int continueSign = map.get("continueSign");//连续签到天数
int signInSevenDay = map.get("signInSevenDay");//7日连续奖励
int signInFTDay = map.get("signInFTDay");//14日连续奖励
int signInTEDay = map.get("signInTEDay");//28日连续奖励

if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_SEVENDAY.getCode())){
if(continueSign >= 7 && signInSevenDay == 0){
wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_SEVENDAY);
return new ResultData();
}
return new ResultData(ErrorCode.MEM_MONTH_IS_USED);
}else if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_FTDAY.getCode())){
if(continueSign >= 14 && signInFTDay == 0){
wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_FTDAY);
return new ResultData();
}
return new ResultData(ErrorCode.MEM_MONTH_IS_USED);
}else if(wxCreditHistory.getCreditType().equals(EnumScoreType.SIGN_IN_TEDAY.getCode())){
if(continueSign >= 28 && signInTEDay == 0){
wxCUserBasicSignService.signInCreditHistory(wxCUserBasicSign,EnumScoreType.SIGN_IN_TEDAY);
return new ResultData();
}
return new ResultData(ErrorCode.MEM_MONTH_IS_USED);
}else{
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR,"creditType");
}

}

}

+ 63
- 0
mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java 查看文件

@@ -0,0 +1,63 @@
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.WxOcrModel;
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;
@Autowired
private String ocrData;

@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 MerchantModel = ocrService.getMerchantOcrModel(merchantId, tenantEntity.getTenantId(), tenantEntity.getParentTenantId());
if (null == MerchantModel) {
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "当前商户没有配置OCR模板");
}
WxOcrModel ocrModel = ocrService.getOcrModelById(MerchantModel.getOcrModelId());
if (null == ocrModel) {
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "当前商户配置的OCR模板未查询到");
}
String result;
try {
result = FormallTess4j.ocrNetImgFile(ocrData,imageUrl,ocrModel.getFontName());
return new ResultData(result);
} catch (Exception e) {
logger.error("ocr识别失败。",e);
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "ocr识别失败。"+e.getMessage());
}
}


}

+ 1
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxUserGrantController.java 查看文件

@@ -1014,7 +1014,7 @@ public class WxUserGrantController extends BaseController {
wxCUserBasicInfoService.updateQrCode(wxCUserBasicInfo);
}
}
RedisCacheUtils.cache(objectCommonRedisTemplate, key, qrCode, Constant.S_D_EXPIRE);
RedisCacheUtils.cache(objectCommonRedisTemplate, key, qrCode, 0);

} catch (Exception e) {
logger.error("getUserinfoQrCode error.",e);


+ 1
- 0
mallinkCApi/src/main/resources/application-dev.yml 查看文件

@@ -160,6 +160,7 @@ fm:
deploy: 1
open: true
upload_dir: /home/test/server/uploads/
ocr_data: /home/test/server/ocr_data/

logging:
level:


+ 1
- 0
mallinkCApi/src/main/resources/application-prod.yml 查看文件

@@ -115,6 +115,7 @@ fm:
deploy: 3
open: true
upload_dir: /root/uploads/
ocr_data: /root/ocr_data/

logging:
level:


+ 1
- 0
mallinkCApi/src/main/resources/application-test.yml-bak 查看文件

@@ -93,6 +93,7 @@ fm:
deploy: 2
open: true
upload_dir: /home/ec2-user/server/uploads/
ocr_data: /home/ec2-user/server/ocr_data/

logging:
level:


+ 13
- 6
mallinkOcr/pom.xml 查看文件

@@ -15,20 +15,27 @@
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.1.0</version>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.0</version>
<version>4.4.0</version>
<exclusions>
<exclusion>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
</exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
<exclusion>
<artifactId>jna</artifactId>
<groupId>net.java.dev.jna</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

</project>

+ 9
- 10
mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java 查看文件

@@ -124,16 +124,16 @@ public class FormallTess4j {
}
}
public static String ocrLocalImgFile(String filePath,String dataPath) throws Exception {
File imageFile = new File(filePath);
String result = testDoOCR_File(imageFile,dataPath);
private static String ocrLocalImgFile(String languagePath,String filePath,String fontName) throws Exception {
File imageFile = new File(filePath,fontName);
String result = testDoOCR_File(languagePath,imageFile,fontName);
deletetempFile(imageFile);
return result;
}
public static String ocrNetImgFile(String fileUrl,String dataPath) throws Exception {
public static String ocrNetImgFile(String languagePath,String fileUrl,String fontName) throws Exception {
File imageFile = urlImgToFile(fileUrl);
String result = testDoOCR_File(imageFile,dataPath);
String result = testDoOCR_File(languagePath,imageFile,fontName);
deletetempFile(imageFile);
return result;
}
@@ -143,11 +143,11 @@ public class FormallTess4j {
* 根据图片文件进行识别
* @throws Exception while processing image.
*/
private static String testDoOCR_File(File imageFile,String dataPath) throws Exception {
public static String testDoOCR_File(String languagePath,File imageFile,String fontName) throws Exception {
logger.info("doOCR on a jpg image");
//set language
instance.setDatapath(dataPath);
instance.setLanguage("chi_sim");
instance.setDatapath(languagePath);
instance.setLanguage(fontName);
String result = instance.doOCR(imageFile);
return result;
}
@@ -155,14 +155,13 @@ public class FormallTess4j {
public static void main(String[] args) {
try {
System.out.println(ocrNetImgFile("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.my0832.com%2Fattachments%2Fbbs%2F20140424%2F201442413083356803_740_1186.jpg&refer=http%3A%2F%2Fimg.my0832.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613903848&t=985fc4c6c7b7ee82cb98f97ab5bf1459",testResourcesLanguagePath));
System.out.println(ocrNetImgFile(testResourcesLanguagePath,"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.my0832.com%2Fattachments%2Fbbs%2F20140424%2F201442413083356803_740_1186.jpg&refer=http%3A%2F%2Fimg.my0832.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613903848&t=985fc4c6c7b7ee82cb98f97ab5bf1459","test1"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//
// /**
// * Test of doOCR method, of class Tesseract.


+ 134
- 0
mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java 查看文件

@@ -0,0 +1,134 @@
package com.iformall.ocr;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

/**
* 训练
* @author iformall
*/
public class FormallTess4jTrain {

private static final String newFileFolder = "C:\\Users\\iformall\\Desktop\\newfile";
private static final String huanhangstr = " \n";
private static String getprefix(String lang,String fontName) {
String realFileName = lang+"."+fontName+".exp0";
return realFileName;
}
private static String createBoxFile(String tifFileName,String lang,String fontName) {
String prefix = getprefix(lang,fontName);
String realFileName = prefix+".tif";
if (tifFileName.equals(realFileName)) {
String cmdstr = "tesseract "+tifFileName+" "+prefix+" -l chi_sim batch.nochop makebox";
return cmdstr;
//String result = executeLocalCmd(cmdstr, null);
//System.out.println("Done createBoxFile"+result);
}else {
return "文件必须是.tif";
}
}
private static String createTranFile(String lang,String fontName) {
String prefix = getprefix(lang,fontName);
String realFileName = prefix+".tif";
String trainCmdstr = "tesseract "+realFileName+" "+prefix+" nobatch box.train";
return trainCmdstr;
}
private static String getBoxFont(String lang,String fontName) {
String prefix = getprefix(lang,fontName);
String extractorCmdstr = "unicharset_extractor "+prefix+".box";
return extractorCmdstr;
}
/**
* 第六步,执行完成后生成以下几个文件加前缀
* unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为fontName
* @param lang
* @param fontName
* @return
*/
private static String renameTrainFiles(String fontName) {
StringBuffer sb = new StringBuffer();
String renCmdstr = "REN unicharset "+fontName+".unicharset";
sb.append(renCmdstr).append(huanhangstr);
renCmdstr = "REN inttemp "+fontName+".inttemp";
sb.append(renCmdstr).append(huanhangstr);
renCmdstr = "REN pffmtable "+fontName+".pffmtable";
sb.append(renCmdstr).append(huanhangstr);
renCmdstr = "REN shapetable "+fontName+".shapetable";
sb.append(renCmdstr).append(huanhangstr);
renCmdstr = "REN normproto "+fontName+".normproto";
sb.append(renCmdstr).append(huanhangstr);
return sb.toString();
}
/**
* 第七步:合并5个文件
* @param lang
* @param fontName
* @return
*/
private static String mergeTrainFiles(String fontName) {
String mergeCmdstr = "combine_tessdata "+fontName+".";
return mergeCmdstr;
}
public static String getTrainSteps(String lang,String fontName) {
StringBuffer sb = new StringBuffer("请进入到样本图片文件夹用doc命令执行.").append(huanhangstr);
sb.append("第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式 .命名格式为[lang].[fontName].exp0.tif. 命名:").append(lang).append(".").append(fontName).append(".exp0.tif ").append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第二步,用tif生成box ").append(huanhangstr);
sb.append(createBoxFile(lang+"."+fontName+".exp0.tif", lang, fontName)).append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第三步,用jTessBoxEditor 打开.box文件进行矫正 ").append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第四步:用box文件生成。tr文件 ").append(huanhangstr);
sb.append(createTranFile(lang,fontName)).append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第五步:提取box字符 ").append(huanhangstr);
sb.append(getBoxFont(lang,fontName)).append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("@@@!!!!从此处开始,可以处理多个字库处理。如原来的字库现在做升级,需要把老的字库的。tif,.box,.tr文件重新命名也放到同目录文件夹, ").append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第六步:新建font_properties(没有.txt后缀), 把所有box对应的字体特征加进去。").append(huanhangstr);
sb.append("fontname为字体名称,保持和 图片集文件 .tif 和.box文件的前缀名一致 .<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。 ").append(huanhangstr);
sb.append("如以下内容: ").append(huanhangstr);
sb.append("fontName1 0 0 0 0 0 ").append(huanhangstr);
sb.append("fontName2 0 1 0 0 0 ").append(huanhangstr);
sb.append("fontName3 1 1 0 0 0 ").append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第六步:批量执行系列命令。多个文件在后面累加。 ").append(huanhangstr);
String prefix = getprefix(lang,fontName);
String shapeCmdStr = "shapeclustering -F font_properties -U unicharset "+prefix+".tr [other .tr files...] ";
sb.append(shapeCmdStr).append(huanhangstr);
String mftraingCmdstr = "mftraining -F font_properties -U unicharset -O unicharset "+prefix+".tr [other .tr files...] ";
sb.append(mftraingCmdstr).append(huanhangstr);
String cntrainCmdstr = "cntraining "+prefix+".tr [other .tr files...] ";
sb.append(cntrainCmdstr).append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第七步,执行完成后生成以下几个文件加前缀: unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为[fontName] ").append(huanhangstr);
sb.append(renameTrainFiles(fontName));
sb.append("............ ").append(huanhangstr);
sb.append("第七步:合并5个文件").append(huanhangstr);
sb.append(mergeTrainFiles(fontName)).append(huanhangstr);
sb.append("............ ").append(huanhangstr);
sb.append("第八步:将").append(fontName).append(".traineddata 文件拷贝到后端服务器ocr_data(项目配置fm.ocr_data)目录下。 .tif、。box、。tr文件也需要保留,后面如果这个字库有更新,需要用到这些文件。").append(huanhangstr);
return sb.toString();
}
}

+ 12
- 1
mallinkOcr/src/main/resources/Read.txt 查看文件

@@ -1,3 +1,14 @@
https://www.cnblogs.com/wj-1314/p/9454656.html

https://www.cnblogs.com/pejsidney/p/9487881.html
https://www.cnblogs.com/pejsidney/p/9487881.html


https://digi.bib.uni-mannheim.de/tesseract/

https://blog.csdn.net/qq_40147863/article/details/82290015

https://blog.csdn.net/boonya/article/details/81325997


合并字库 https://www.cnblogs.com/c2soft/articles/10415236.html
完整教程 https://www.cnblogs.com/wpcnblog/p/12850590.html

二进制
mallinkOcr/src/main/resources/tessdata/test1.traineddata 查看文件


+ 0
- 8
mallinkService/pom.xml 查看文件

@@ -35,14 +35,6 @@
<artifactId>mybatis-multi-tenancy</artifactId>
<version>1.0</version>
</dependency>
<!-- ocr -->
<dependency>
<groupId>com.iformall</groupId>
<artifactId>mallinkOcr</artifactId>
<version>1.0</version>
</dependency>
</dependencies>

</project>

+ 3
- 0
mallinkService/src/main/java/com/iformall/common/ErrorCode.java 查看文件

@@ -396,6 +396,8 @@ public enum ErrorCode{
CREDIT_NOT_ENOUGH(13101, "积分不够扣减值"),
USER_NOT_MEMBER(13102, "该用户不是小程序会员"),
OUT_OF_CREDIT(13103, "超出最大积分"),
MEM_IS_SIGNIN(13104, "该用户已签到"),
MEM_MONTH_IS_USED(13105, "该用户本月已领取或未到领取条件"),


/**
@@ -538,6 +540,7 @@ public enum ErrorCode{
ACTIVITY_TIME_ERROR(30005, "活动报名结束时间不能大于活动结束时间"),
ACTIVITY_WAIT_CONFIRMED(30006, "您报名的活动还在审核中"),
ACTIVITY_EXPIRED(30007, "您报名的活动已过期"),
ACTIVITY_SEND_ERROR_NOONLINE(30008, "活动投放到宣传页失败,活动未上线!"),

/**
* 文件上传


+ 7
- 0
mallinkService/src/main/java/com/iformall/config/BaseMyBatisConfiguration.java 查看文件

@@ -76,6 +76,13 @@ public class BaseMyBatisConfiguration {
basicInfoSharding.setRule(EnumShardingRule.HASH.getCode());
shardingList.add(basicInfoSharding);

ShardingSphere basicSignSharding = new ShardingSphere();
basicSignSharding.setColumn("tenant_id");
basicSignSharding.setTableName("wx_c_user_basic_sign");
basicSignSharding.setCount(100);
basicSignSharding.setRule(EnumShardingRule.HASH.getCode());
shardingList.add(basicSignSharding);

ShardingSphere wxbasicChildSharding = new ShardingSphere();
wxbasicChildSharding.setColumn("tenant_id");
wxbasicChildSharding.setTableName("wx_c_user_basic_child");


+ 2
- 2
mallinkService/src/main/java/com/iformall/domain/po/WxActivity.java 查看文件

@@ -72,11 +72,11 @@ public class WxActivity extends TenantEntity {

@TableField(exist = false)
@io.swagger.annotations.ApiModelProperty(value = "开始时间", name = "starttime")
private Date starttime;
private Date startDate;

@TableField(exist = false)
@io.swagger.annotations.ApiModelProperty(value = "结束时间", name = "endtime")
private Date endtime;
private Date endDate;


@TableField(exist = false)


+ 67
- 0
mallinkService/src/main/java/com/iformall/domain/po/WxCUserBasicSign.java 查看文件

@@ -0,0 +1,67 @@
package com.iformall.domain.po;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.iformall.domain.po.base.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.util.Date;

@TableName(value = "wx_c_user_basic_sign")
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class WxCUserBasicSign extends TenantEntity {

@TableField(exist = false)
public static final Integer SIGNIN_TYPE = 1;

protected Long id;

@io.swagger.annotations.ApiModelProperty(value="userId",name="userId")
private Long userId;

@io.swagger.annotations.ApiModelProperty(value="1:签到",name="type")
private Integer type;

@io.swagger.annotations.ApiModelProperty(value="签到时间",name="signinDate")
private Date signinDate;
@io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate")
private Date createDate;
@io.swagger.annotations.ApiModelProperty(value="修改时间",name="updateDate")
private Date updateDate;

@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当月连续签到天数",name="continueMonthSign")
private Integer continueMonthSign;
@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当月累计签到天数",name="countMonthSign")
private Integer countMonthSign;

@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当年连续签到天数",name="continueYearSign")
private Integer continueYearSign;
@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间当年累计签到天数",name="countYearSign")
private Integer countYearSign;

@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间连续签到天数",name="continueSign")
private Integer continueSign;
@io.swagger.annotations.ApiModelProperty(value="截止当前签到时间累计签到天数",name="countSign")
private Integer countSign;

@io.swagger.annotations.ApiModelProperty(value="备注",name="mark")
private String mark;


@TableField(exist = false)
private Date startDate;

@TableField(exist = false)
private Date endDate;

@TableField(exist = false)
private Integer begin;

@TableField(exist = false)
private Integer limit;

}

+ 25
- 0
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;

}

+ 28
- 0
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;
}

+ 5
- 4
mallinkService/src/main/java/com/iformall/domain/po/WxScoreRules.java 查看文件

@@ -48,7 +48,6 @@ public class WxScoreRules extends BaseTenantEntity {
" {\"businessId\":6,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}" +
"]}," +
"{\"id\":3,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"绑定车牌1个\"}," +
"{\"id\":5,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权个人信息\"}," +
"{\"id\":6,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权手机号\"}," +
"{\"id\":7,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}" +
"]";
@@ -56,7 +55,7 @@ public class WxScoreRules extends BaseTenantEntity {
@TableField(exist = false)
private static final String creditDefaultRules =
"[" +
"{\"id\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"每日登陆\"}," +
// "{\"id\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"每日登陆\"}," +
"{\"id\":2,\"childs\":[" +
" {\"businessId\":1,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}," +
" {\"businessId\":2,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}," +
@@ -71,10 +70,12 @@ public class WxScoreRules extends BaseTenantEntity {
" {\"businessId\":6,\"limit\":0,\"step\":1,\"score\":0 ,\"desc\":\"线上交易1元\"}" +
"]}," +
"{\"id\":3,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"绑定车牌1个\"}," +
"{\"id\":5,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权个人信息\"}," +
"{\"id\":6,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"授权手机号\"}," +
"{\"id\":7,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}," +
"{\"id\":8,\"limit\":1,\"step\":1,\"score\":0,\"desc\":\"编辑个人信息\"}" +
"{\"id\": 17, \"desc\": \"每日签到\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"{\"id\": 18, \"desc\": \"连续签到7天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"{\"id\": 19, \"desc\": \"连续签到14天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"{\"id\": 20, \"desc\": \"连续签到28天\", \"step\": 1, \"limit\": 1, \"score\": 0},"+
"]";

@TableField(exist = false)


+ 4
- 0
mallinkService/src/main/java/com/iformall/domain/po/base/BaseEntity.java 查看文件

@@ -205,6 +205,10 @@ public class BaseEntity implements Serializable {

ReportDate_ASC("`report_date` ASC"),
ReportDate_DESC("`report_date` DESC"),

ActivityStartTime_ASC("`activity_start_time` ASC"),
ActivityStartTime_DESC("`activity_start_time` DESC"),

;
private String value;


+ 2
- 1
mallinkService/src/main/java/com/iformall/enums/EnumActivityStatus.java 查看文件

@@ -8,7 +8,8 @@ public enum EnumActivityStatus {

STATUS_THROW_IN(0, "已保存"),
STATUS_TAKE_OFFF(1, "已下线"),
INJECT_CAMPAIGN(2, "已投放"),;
INJECT_CAMPAIGN(2, "已投放"),
INJECT_ONLINE(3, "已上线"),;

public static EnumActivityStatus getEnum(Integer code) {
for (EnumActivityStatus value : values()) {


+ 6
- 1
mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java 查看文件

@@ -20,7 +20,12 @@ public enum EnumScoreType {
ACTIVITY_JOIN(13, "活动报名"),
CLEAN_CREDIT(14, "积分清零计划"),
GAME_LES_CREDIT(15, "游戏消耗积分"),
GAME_ADD_CREDIT(16, "游戏奖励积分"),;
GAME_ADD_CREDIT(16, "游戏奖励积分"),

SIGN_IN_DAY(17, "每日签到"),
SIGN_IN_SEVENDAY(18, "连续签到7天"),
SIGN_IN_FTDAY(19, "连续签到14天"),
SIGN_IN_TEDAY(20, "连续签到28天"),;

public static EnumScoreType getEnum(Integer code) {
for (EnumScoreType value : values()) {


+ 13
- 0
mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicSignMapper.java 查看文件

@@ -0,0 +1,13 @@
package com.iformall.mapper;

import com.iformall.common.CommonMapper;
import com.iformall.domain.po.WxCUserBasicSign;

import java.util.List;

public interface WxCUserBasicSignMapper extends CommonMapper<WxCUserBasicSign, Long> {
List<WxCUserBasicSign> findList(WxCUserBasicSign record);

WxCUserBasicSign getLastSignIn(WxCUserBasicSign record);
}

+ 2
- 0
mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java 查看文件

@@ -41,4 +41,6 @@ public interface WxCreditHistoryMapper extends CommonMapper<WxCreditHistory, Lon
Integer getLesCreditSummary(WxCreditHistory wxCreditHistory);

List<MerchantCreditRankingVo> merchantCreditRanking(WxCreditHistory record);

int monthCount(WxCreditHistory record);
}

+ 14
- 0
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<WxMerchantOcrModel> {

List<WxMerchantOcrModel> findList(WxMerchantOcrModel merchantOcrModel);
}

+ 14
- 0
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<WxOcrModel> {

List<WxOcrModel> findList(WxOcrModel ocrModel);
}

+ 3
- 0
mallinkService/src/main/java/com/iformall/service/WxActivityService.java 查看文件

@@ -46,4 +46,7 @@ public interface WxActivityService {

Integer queryStatus(Long id, Long userId);

ResultData offLineCampaign(WxActivity wxActivity);

ResultData getListStatus(WxActivity wxActivity);
}

+ 31
- 0
mallinkService/src/main/java/com/iformall/service/WxCUserBasicSignService.java 查看文件

@@ -0,0 +1,31 @@
package com.iformall.service;

import com.github.pagehelper.PageInfo;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserBasicSign;
import com.iformall.enums.EnumScoreType;

import java.util.Map;

public interface WxCUserBasicSignService {

/**
* 根据实体查询分页列表
*
* @param record
* @param pageIndex
* @param pageSize
* @return
*/
PageInfo<WxCUserBasicSign> listAsPage(WxCUserBasicSign record, Integer pageIndex, Integer pageSize);

WxCUserBasicSign signIn(WxCUserBasicSign record);

WxCUserBasicSign getTodaySignIn(WxCUserBasicSign record);

Map<String,Integer> getLastSignIn(WxCUserBasicSign record);

void signInCreditHistory(WxCUserBasicSign record, EnumScoreType enumScoreType);

ResultData getListStatus(WxCUserBasicSign wxCUserBasicSign);
}

+ 1
- 0
mallinkService/src/main/java/com/iformall/service/WxCreditHistoryService.java 查看文件

@@ -85,4 +85,5 @@ public interface WxCreditHistoryService {
Integer getLesCreditSummary(WxCreditHistory wxCreditHistory);

PageInfo<MerchantCreditRankingVo> listAsPageMcrv(WxCreditHistory record, Integer pageIndex, Integer pageSize);

}

+ 30
- 0
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<WxOcrModel> 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);
}

+ 64
- 3
mallinkService/src/main/java/com/iformall/service/impl/WxActivityServiceImpl.java 查看文件

@@ -17,6 +17,7 @@ import com.iformall.mapper.WxActivityMapper;
import com.iformall.mapper.WxCampaignMapper;
import com.iformall.service.WxActivityService;
import com.iformall.service.WxCampaignService;
import com.iformall.utils.DateUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,7 +31,7 @@ import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Date;
import java.util.*;

/**
* @author gongbiao
@@ -121,14 +122,20 @@ public class WxActivityServiceImpl implements WxActivityService {
if (activity == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
}
if (wxActivity.getStatus().equals(EnumActivityStatus.INJECT_ONLINE.getCode())
&& activity.getEndTime().before(new Date())) {
return new ResultData(ErrorCode.ACTIVITY_JOIN_TIME_END);
}
wxActivity.setUpdateTime(new Date());
wxActivityMapper.updateById(wxActivity);
if (wxActivity.getStatus().equals(EnumActivityStatus.STATUS_TAKE_OFFF.getCode())) {
WxCampaign campaign = new WxCampaign();
campaign.setProduceId(wxActivity.getId());
WxCampaign wxCampaign = wxCampaignMapper.selectOne(new QueryWrapper(campaign));
wxCampaign.setStatus(EnumCampaignStatus.STATUS_TAKE_OFFF.getCode());
wxCampaignMapper.updateById(wxCampaign);
if(wxCampaign != null){
wxCampaign.setStatus(EnumCampaignStatus.STATUS_TAKE_OFFF.getCode());
wxCampaignMapper.updateById(wxCampaign);
}
}
return new ResultData(Result.SUCCESS, "操作成功");
}
@@ -172,6 +179,9 @@ public class WxActivityServiceImpl implements WxActivityService {
if (wxActivity.getEndTime().before(new Date())) {
return new ResultData(ErrorCode.ACTIVITY_JOIN_TIME_END);
}
if(!wxActivity.getStatus().equals(EnumActivityStatus.INJECT_ONLINE.getCode())){
return new ResultData(ErrorCode.ACTIVITY_SEND_ERROR_NOONLINE);
}
wxActivity.setStatus(EnumActivityStatus.INJECT_CAMPAIGN.getCode());
wxActivity.setUpdateTime(new Date());
wxActivityMapper.updateById(wxActivity);
@@ -233,5 +243,56 @@ public class WxActivityServiceImpl implements WxActivityService {
return EnumActivityEnrollStatus.NORMAL.getCode();
}

@Override
public ResultData offLineCampaign(WxActivity wxActivity) {
WxActivity activity = wxActivityMapper.selectById(wxActivity.getId());
if (activity == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
}
activity.setStatus(EnumActivityStatus.INJECT_ONLINE.getCode());
activity.setUpdateTime(new Date());
wxActivityMapper.updateById(activity);
if (wxActivity.getStatus().equals(EnumActivityStatus.STATUS_TAKE_OFFF.getCode())) {
WxCampaign campaign = new WxCampaign();
campaign.setProduceId(wxActivity.getId());
WxCampaign wxCampaign = wxCampaignMapper.selectOne(new QueryWrapper(campaign));
wxCampaign.setStatus(EnumCampaignStatus.STATUS_TAKE_OFFF.getCode());
wxCampaignMapper.updateById(wxCampaign);
}
return new ResultData(Result.SUCCESS, "操作成功");
}

@Override
public ResultData getListStatus(WxActivity wxActivity) {
List list = new ArrayList();
List<WxActivity> activityList = wxActivityMapper.findList(wxActivity);
if(activityList != null){
for (WxActivity activity:activityList) {

Date start = activity.getActivityStartTime();
Date end = activity.getActivityEndTime();

Calendar dd = Calendar.getInstance();
dd.setTime(start);
while (start.getTime() < end.getTime()) {
Map map = new HashMap<>();
map.put("yyyy", DateUtils.getYear(start));
map.put("mm", DateUtils.getMonth(start));
map.put("dd", DateUtils.getMonthOfDate(start));
list.add(map);
// 天数加上1
dd.add(Calendar.DAY_OF_MONTH, 1);
start = dd.getTime();
}
}
}
if(list.size() > 0){
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
}
return new ResultData(list);
}


}

+ 243
- 0
mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicSignServiceImpl.java 查看文件

@@ -0,0 +1,243 @@
package com.iformall.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.iformall.common.IdWorker;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCUserBasicSign;
import com.iformall.domain.po.WxCreditHistory;
import com.iformall.enums.EnumScoreType;
import com.iformall.enums.EnumUserType;
import com.iformall.mapper.WxCUserBasicSignMapper;
import com.iformall.mapper.WxCreditHistoryMapper;
import com.iformall.service.WxCUserBasicSignService;
import com.iformall.service.WxCreditHistoryService;
import com.iformall.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

import static java.util.Calendar.DAY_OF_MONTH;

@Service
@Slf4j
public class WxCUserBasicSignServiceImpl implements WxCUserBasicSignService {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
WxCUserBasicSignMapper wxCUserBasicSignMapper;

@Autowired
WxCreditHistoryService wxCreditHistoryService;

@Autowired
WxCreditHistoryMapper wxCreditHistoryMapper;

@Override
public PageInfo<WxCUserBasicSign> listAsPage(WxCUserBasicSign record, Integer pageIndex, Integer pageSize) {
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCUserBasicSignMapper.findList(record));
}

@Transactional(rollbackFor = {Exception.class})
@Override
public WxCUserBasicSign signIn(WxCUserBasicSign record) {
if(record.getType() == null){
record.setType(WxCUserBasicSign.SIGNIN_TYPE);
}

final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());

Date today = new Date();
record.setCreateDate(today);
record.setUpdateDate(today);

if(record.getType().equals(WxCUserBasicSign.SIGNIN_TYPE)){
record.setSigninDate(DateUtils.getDateZero(today));
WxCUserBasicSign lastSignIn = wxCUserBasicSignMapper.getLastSignIn(record);
if(lastSignIn == null){

record.setContinueMonthSign(1);
record.setCountMonthSign(1);
record.setContinueYearSign(1);
record.setCountYearSign(1);
record.setContinueSign(1);
record.setCountSign(1);
wxCUserBasicSignMapper.insert(record);
}else{
long daysL = DateUtils.startToEnd(lastSignIn.getSigninDate(), today);
int daysI = new Long(daysL).intValue();
if(daysI == 0){
return lastSignIn;
}

record.setCountSign(lastSignIn.getCountSign() + 1);
if(daysI == 1){
record.setContinueSign(lastSignIn.getContinueSign() + 1);
}else{
record.setContinueSign(1);
}

if(DateUtils.getYear(today) == DateUtils.getYear(lastSignIn.getSigninDate())){
record.setCountYearSign(lastSignIn.getCountYearSign() + 1);
if(daysI == 1){
record.setContinueYearSign(lastSignIn.getContinueYearSign() + 1);
}else{
record.setContinueYearSign(1);
}
if(DateUtils.getMonth(today) == DateUtils.getMonth(lastSignIn.getSigninDate())){
record.setCountMonthSign(lastSignIn.getCountMonthSign() + 1);
if(daysI == 1){
record.setContinueMonthSign(lastSignIn.getContinueMonthSign() + 1);
}else{
record.setContinueMonthSign(1);
}
}else{
record.setCountMonthSign(1);
record.setContinueMonthSign(1);
}
}else{
record.setContinueMonthSign(1);
record.setCountMonthSign(1);
record.setContinueYearSign(1);
record.setCountYearSign(1);
}
wxCUserBasicSignMapper.insert(record);
}
signInCreditHistory(record,EnumScoreType.SIGN_IN_DAY);
continueSignInAddCredit(record);
return record;
}else{
//补签
return null;
}
}

@Override
public WxCUserBasicSign getTodaySignIn(WxCUserBasicSign record) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date today = calendar.getTime();//今天零点
calendar.set(DAY_OF_MONTH,calendar.get(DAY_OF_MONTH) +1);
Date tomorrow =calendar.getTime();//明天零点

record.setStartDate(today);
record.setEndDate(tomorrow);
List<WxCUserBasicSign> list = wxCUserBasicSignMapper.findList(record);
if(list != null && list.size() == 1){
return list.get(0);
}else if(list.size() > 1){
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String todayString = format.format(today);
logger.error("用户签到数据异常{}"+record.getUserId()+"时间{}"+todayString);
return list.get(0);
}
return null;
}

@Override
public Map<String,Integer> getLastSignIn(WxCUserBasicSign record) {
Map<String,Integer> map = new HashMap<>();
WxCUserBasicSign lastSignIn = wxCUserBasicSignMapper.getLastSignIn(record);
if(lastSignIn != null){
long daysL = DateUtils.startToEnd(lastSignIn.getSigninDate(), new Date());
int daysI = new Long(daysL).intValue();
if(daysI <= 1){
map.put("continueSign",lastSignIn.getContinueSign()%28);
}else{
map.put("continueSign",0);
}
}

// if(lastSignIn != null && DateUtils.isSameMonth(lastSignIn.getSigninDate(),new Date())){
// //本月连续签到天数
// map.put("continueMonthSign",lastSignIn.getContinueMonthSign());
// }else{
// map.put("continueMonthSign",0);
// }
WxCreditHistory wxCreditHistory = new WxCreditHistory();
wxCreditHistory.setTenantId(record.getFinalTenantId());
wxCreditHistory.setCUserId(record.getUserId());
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_DAY.getCode());
//每日签到
if(wxCreditHistoryMapper.loginCount(wxCreditHistory) > 0){
map.put("signInDay",1);
}else{
map.put("signInDay",0);
}
//7日连续
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_SEVENDAY.getCode());
if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){
map.put("signInSevenDay",1);
}else{
map.put("signInSevenDay",0);
}
//14日连续
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_FTDAY.getCode());
if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){
map.put("signInFTDay",1);
}else{
map.put("signInFTDay",0);
}
//28日连续
wxCreditHistory.setCreditType(EnumScoreType.SIGN_IN_TEDAY.getCode());
if(wxCreditHistoryMapper.monthCount(wxCreditHistory) > 0 ){
map.put("signInTEDay",1);
}else{
map.put("signInTEDay",0);
}
return map;
}

@Override
public void signInCreditHistory(WxCUserBasicSign record, EnumScoreType enumScoreType){
WxCreditHistory wxCreditHistory = new WxCreditHistory();
wxCreditHistory.setCUserId(record.getUserId());
wxCreditHistory.setTenantId(record.getFinalTenantId());
wxCreditHistory.setCreateDate(new Date());
wxCreditHistory.setCreditType(enumScoreType.getCode());
wxCreditHistory.setChangePurpose(enumScoreType.getMessage());
wxCreditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode());
wxCreditHistory.setOperatorId(record.getUserId());
wxCreditHistoryService.saveOrUpdate(wxCreditHistory,null);
}

@Override
public ResultData getListStatus(WxCUserBasicSign record) {
List list = new ArrayList();
List<WxCUserBasicSign> recordList = wxCUserBasicSignMapper.findList(record);
if(recordList != null){
for (WxCUserBasicSign sign:recordList) {
Map map = new HashMap<>();
map.put("yyyy", DateUtils.getYear(sign.getSigninDate()));
map.put("mm", DateUtils.getMonth(sign.getSigninDate()));
map.put("dd", DateUtils.getMonthOfDate(sign.getSigninDate()));
list.add(map);
}
}
return new ResultData(list);
}

private void continueSignInAddCredit(WxCUserBasicSign record){
int i = record.getContinueSign() % 28;
if(record.getContinueSign() > 0 && i == 0){
signInCreditHistory(record,EnumScoreType.SIGN_IN_TEDAY);
}else if(i == 7){
signInCreditHistory(record,EnumScoreType.SIGN_IN_SEVENDAY);
}else if(i == 14){
signInCreditHistory(record,EnumScoreType.SIGN_IN_FTDAY);
}
}

}

+ 8
- 8
mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java 查看文件

@@ -273,14 +273,14 @@ public class WxCUserServiceImpl implements WxCUserService {
logger.error("c_user 成长值 " + e.getMessage());
}
// 积分
try {
credit = addCredit(user, EnumScoreType.LOGIN);
logger.info("user_id:" + user.getId() + " 登录新增积分:" + credit);
} catch (MallinkException e) {
logger.error("c_user 积分 " + e.getMessage());
} catch (Exception e) {
logger.error("c_user 积分 " + e.getMessage());
}
// try {
// credit = addCredit(user, EnumScoreType.LOGIN);
// logger.info("user_id:" + user.getId() + " 登录新增积分:" + credit);
// } catch (MallinkException e) {
// logger.error("c_user 积分 " + e.getMessage());
// } catch (Exception e) {
// logger.error("c_user 积分 " + e.getMessage());
// }

// 用户登陆后 更新最后一次活跃时间
if (user.getUserId() != null) {


+ 37
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java 查看文件

@@ -391,7 +391,8 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService {
private int creditIncrement(WxCreditHistory record) {
//查找C端用户的成长值
if (record.getCreditType() == EnumScoreType.LOGIN.getCode()) {
return loginAddCredit(record);
// return loginAddCredit(record);//登陆加积分取消
return 0;
}
if (record.getCreditType() == EnumScoreType.BIND_CAR.getCode()) {
return bindCarAddCredit(record);
@@ -430,6 +431,19 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService {
return record.getCreditNum();
}

if (record.getCreditType() == EnumScoreType.SIGN_IN_DAY.getCode()) {
return signinCredit(record);
}
if (record.getCreditType() == EnumScoreType.SIGN_IN_SEVENDAY.getCode()) {
return signinMonthCredit(record,EnumScoreType.SIGN_IN_SEVENDAY);
}
if (record.getCreditType() == EnumScoreType.SIGN_IN_FTDAY.getCode()) {
return signinMonthCredit(record,EnumScoreType.SIGN_IN_FTDAY);
}
if (record.getCreditType() == EnumScoreType.SIGN_IN_TEDAY.getCode()) {
return signinMonthCredit(record,EnumScoreType.SIGN_IN_TEDAY);
}

return 0;
}

@@ -449,6 +463,28 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService {
return wxScoreRules.getRule(EnumScoreType.LOGIN, WxScoreRules.SCORE);
}

private int signinCredit(WxCreditHistory record) {
//如果当天已经登录过则跳过
if (wxCreditHistoryMapper.loginCount(record) > 0) {
return 0;
}
// 1. 获取当前租户下积分的增加规则
WxScoreRules wxScoreRules = wxScoreRulesService.getCreditRules(record.getTenantId());
// 2. 增长的积分
return wxScoreRules.getRule(EnumScoreType.SIGN_IN_DAY, WxScoreRules.SCORE);
}

private int signinMonthCredit(WxCreditHistory record,EnumScoreType enumScoreType) {
//签到周期按月来
// if (wxCreditHistoryMapper.monthCount(record) > 0) {
// return 0;
// }
// 1. 获取当前租户下积分的增加规则
WxScoreRules wxScoreRules = wxScoreRulesService.getCreditRules(record.getTenantId());
// 2. 增长的积分
return wxScoreRules.getRule(enumScoreType, WxScoreRules.SCORE);
}

private int bindCarAddCredit(WxCreditHistory record) {
if (wxCreditHistoryMapper.countList(record) > 0) {
return 0;


+ 89
- 0
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<WxOcrModel> 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<WxMerchantOcrModel> 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, "操作成功");

}

}

+ 16
- 39
mallinkService/src/main/java/com/iformall/service/impl/WxScoreRulesServiceImpl.java 查看文件

@@ -52,50 +52,18 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService {
public void wxScoreRulesInit(String tenantId) {
WxScoreRules wxScoreRules = new WxScoreRules();
wxScoreRules.setTenantId(tenantId);
wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," +
" {\"id\": 2, \"score\": null, \"childs\": " +
"[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," +
" {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]");
wxScoreRules.setRules(WxScoreRules.getCreditDefaultRules());
wxScoreRules.setCreateDate(new Date());
wxScoreRules.setUpdateDate(new Date());
wxScoreRules.setType(2);
wxScoreRules.setClearYear(1);
wxScoreRules.setScale(10);
wxScoreRules.setType(EnumScoreRules.CREDIT.getCode());
wxScoreRules.setCreditLocked(1);
wxScoreRulesMapper.insert(wxScoreRules);
wxScoreRules = new WxScoreRules();
wxScoreRules.setTenantId(tenantId);
wxScoreRules.setRules("[{\"id\": 1, \"desc\": \"每日登陆\", \"step\": 1, \"limit\": 0, \"score\": 0}," +
" {\"id\": 2, \"score\": 0, \"childs\": " +
"[{\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"餐饮\", \"businessId\": 1}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"娱乐\", \"businessId\": 2}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服饰\", \"businessId\": 3}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"亲子\", \"businessId\": 4}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"超市\", \"businessId\": 5}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"美妆\", \"businessId\": 7}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"珠宝\", \"businessId\": 8}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"服务\", \"businessId\": 9}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"家居\", \"businessId\": 10}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"数码家电\", \"businessId\": 11}," +
" {\"desc\": \"线上交易1元\", \"step\": 1, \"limit\": 0, \"score\": 0, \"title\": \"其他\", \"businessId\": 6}]}," +
" {\"id\": 3, \"desc\": \"绑定车牌1个\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 6, \"desc\": \"授权手机号\", \"step\": 1, \"limit\": 1, \"score\": 0}," +
" {\"id\": 7, \"desc\": \"编辑个人信息\", \"step\": 1, \"limit\": 1, \"score\": 0}]");
wxScoreRules.setRules(WxScoreRules.getScoreDefaultRules());
wxScoreRules.setCreateDate(new Date());
wxScoreRules.setUpdateDate(new Date());
wxScoreRules.setType(1);
wxScoreRules.setType(EnumScoreRules.SCORE.getCode());
wxScoreRules.setCreditLocked(0);
wxScoreRulesMapper.insert(wxScoreRules);
}
@@ -145,9 +113,18 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService {
//当成长值或积分规则新增时,将新增的数据一并返回给接口调用端
private String getScoreRulesNew(String scoreRules,EnumScoreRules enumScoreRules){
//getJSONObject(1) 为EnumScoreType.CONSUMPTION(2, "消费")的下标值
JSONArray jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(1).getJSONArray("childs");
String defaultRules = enumScoreRules.equals(EnumScoreRules.SCORE) ? WxScoreRules.getScoreDefaultRules() : WxScoreRules.getCreditDefaultRules();
JSONArray jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(1).getJSONArray("childs");
JSONArray jsonArrayOld = new JSONArray();
JSONArray jsonArrayDefault = new JSONArray();
if(enumScoreRules.equals(EnumScoreRules.SCORE)){
jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(1).getJSONArray("childs");
String defaultRules = WxScoreRules.getScoreDefaultRules();
jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(1).getJSONArray("childs");
}else if(enumScoreRules.equals(EnumScoreRules.CREDIT)){
jsonArrayOld = JSONArray.parseArray(scoreRules).getJSONObject(0).getJSONArray("childs");
String defaultRules = WxScoreRules.getCreditDefaultRules();
jsonArrayDefault = JSONArray.parseArray(defaultRules).getJSONObject(0).getJSONArray("childs");
}

if (jsonArrayOld.size() < jsonArrayDefault.size()) {
JSONArray childsJsonArray = new JSONArray();
JSONObject otherJSONObject = new JSONObject();


+ 4
- 2
mallinkService/src/main/java/com/iformall/utils/CreditUtil.java 查看文件

@@ -104,8 +104,10 @@ public class CreditUtil {
if(Objects.nonNull(wxCUserBasicInfo.getScoreDate())){
int scoreYear = DateUtils.getYear(wxCUserBasicInfo.getScoreDate());
int year = DateUtils.getYear(new Date());
if(scoreYear == year && DateUtils.isBirthdays(wxCUserBasicInfo.getScoreDate())){
birthdayScale = getBirthdayScoreScale(tenantId, wxScoreRulesService);
if(scoreYear == year){
if(DateUtils.isBirthdays(wxCUserBasicInfo.getScoreDate())){
birthdayScale = getBirthdayScoreScale(tenantId, wxScoreRulesService);
}
}else{
if (Objects.nonNull(wxCUserBasicInfo.getBirthdate()) && DateUtils.isBirthdays(wxCUserBasicInfo.getBirthdate())) {
birthdayScale = getBirthdayScoreScale(tenantId,wxScoreRulesService);


+ 15
- 0
mallinkService/src/main/java/com/iformall/utils/DateUtils.java 查看文件

@@ -1362,4 +1362,19 @@ public class DateUtils {
return false;
}

/**
* 获取当前日期零点<br>
*
* @param date
* @return 获取当前日期零点
*/
public static Date getDateZero(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}

}

+ 11
- 3
mallinkService/src/main/resources/mapper/WxActivityMapper.xml 查看文件

@@ -66,9 +66,13 @@
and `type` = #{type}
</if>
<if test=" null != status ">
<if test=" null != status and status != 3">
and `status` = #{status}
</if>

<if test=" null != status and status == 3">
and `status` &gt;= 2 and `status` &lt;= 3
</if>
<if test=" null != createTime ">
and `create_time` = #{createTime}
@@ -85,8 +89,12 @@
and `is_expired` = #{isExpired}
</if>
<if test=" null != starttime and null!=endtime ">
and `create_time` between #{starttime} and #{endtime}
<!-- <if test=" null != startDate and null != endDate ">-->
<!-- and `create_time` between #{starttime} and #{endtime}-->
<!-- </if>-->

<if test=" null != startDate and null != endDate ">
and `activity_start_time` &gt;= #{startDate} and `activity_end_time` &lt; #{endDate}
</if>
<if test=" null != sendMsg ">


+ 91
- 0
mallinkService/src/main/resources/mapper/WxCUserBasicSignMapper.xml 查看文件

@@ -0,0 +1,91 @@
<?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="com.iformall.mapper.WxCUserBasicSignMapper">
<resultMap id="BaseResultMap" type="com.iformall.domain.po.WxCUserBasicSign">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId" />
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId"/>
<result column="user_id" jdbcType="BIGINT" property="userId" />

<result column="type" jdbcType="INTEGER" property="type" />

<result column="signin_date" jdbcType="TIMESTAMP" property="signinDate"/>
<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/>
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/>

<result column="continue_month_sign" jdbcType="INTEGER" property="continueMonthSign" />
<result column="count_month_sign" jdbcType="INTEGER" property="countMonthSign" />

<result column="continue_year_sign" jdbcType="INTEGER" property="continueYearSign" />
<result column="count_year_sign" jdbcType="INTEGER" property="countYearSign" />

<result column="continue_sign" jdbcType="INTEGER" property="continueSign" />
<result column="count_sign" jdbcType="INTEGER" property="countSign" />

<result column="mark" jdbcType="VARCHAR" property="mark" />

</resultMap>

<sql id="allColumns">
`id`,`tenant_id`,`parent_tenant_id`,`user_id`,`type`,`signin_date`,`create_date`,`update_date`,
`continue_month_sign`,`count_month_sign`,`continue_year_sign`,`count_year_sign`,
`continue_sign`,`count_sign`,`mark`
</sql>

<sql id="dynamicWhereConditions">
where 1 = 1
<if test=" null != id ">
and `id` = #{id}
</if>
<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>
<if test=" null != userId ">
and `user_id` = #{userId}
</if>
<if test=" null != type ">
and `type` = #{type}
</if>

<if test=" null != startDate ">
and `signin_date` &gt;= #{startDate}
</if>
<if test=" null != endDate">
and `signin_date` &lt; #{endDate}
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>
order by `signin_date` desc

</sql>

<select id="findList" parameterType="com.iformall.domain.po.WxCUserBasicSign" resultMap="BaseResultMap">
select <include refid="allColumns" />
from wx_c_user_basic_sign
<include refid="dynamicWhereConditions" />
</select>

<select id="getLastSignIn" parameterType="com.iformall.domain.po.WxCUserBasicSign" resultMap="BaseResultMap">
select <include refid="allColumns" />,max(`signin_date`) from wx_c_user_basic_sign
where 1 = 1
<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>
<if test=" null != userId ">
and `user_id` = #{userId}
</if>
group by user_id
</select>

</mapper>

+ 12
- 0
mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml 查看文件

@@ -184,6 +184,18 @@
and DATEDIFF(`create_date`,now())=0
</select>

<select id="monthCount" parameterType="com.iformall.domain.po.WxCreditHistory" resultType="java.lang.Integer">
select COUNT(0) from wx_credit_history
where 1=1
<if test=" null != cUserId ">
and `c_user_id` = #{cUserId}
</if>
<if test=" null != creditType ">
and `credit_type` = #{creditType}
</if>
and DATE_FORMAT(`create_date`,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m');
</select>

<select id="countTodayList" parameterType="com.iformall.domain.po.WxCreditHistory" resultType="java.lang.Integer">
select count(0)
from wx_credit_history


+ 57
- 0
mallinkService/src/main/resources/mapper/WxMerchantOcrModelMapper.xml 查看文件

@@ -0,0 +1,57 @@
<?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="com.iformall.mapper.WxMerchantOcrModelMapper">

<resultMap type="com.iformall.domain.po.WxMerchantOcrModel" id="BaseResultMap">
<result property="id" column="id"/>
<result property="tenantId" column="tenant_id" jdbcType="VARCHAR"/>
<result property="parentTenantId" column="parent_tenant_id" jdbcType="VARCHAR"/>
<result property="merchantId" column="merchant_id" jdbcType="BIGINT"/>
<result property="ocrModelId" column="ocr_model_id" jdbcType="BIGINT"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>

<sql id="allColumns">
id,tenant_id,parent_tenant_id,merchant_id,ocr_model_id,create_time,update_time
</sql>

<sql id="dynamicWhereConditions">
where 1 = 1

<if test=" null != id ">
and `id` = #{id}
</if>

<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>

<if test=" null != merchantId ">
and `merchant_id` = #{merchantId}
</if>

<if test=" null != ocrModelId ">
and `ocr_model_id` = #{ocrModelId}
</if>
<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>
<if test=" null != sortColumns">order by ${sortColumns}</if>
</sql>

<select id="findList" parameterType="com.iformall.domain.po.WxMerchantOcrModel" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from wx_merchant_ocr_model
<include refid="dynamicWhereConditions"/>
</select>

</mapper>

+ 54
- 0
mallinkService/src/main/resources/mapper/WxOcrModelMapper.xml 查看文件

@@ -0,0 +1,54 @@
<?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="com.iformall.mapper.WxOcrModelMapper">

<resultMap type="com.iformall.domain.po.WxOcrModel" id="BaseResultMap">
<result property="id" column="id"/>
<result property="langCode" column="lang_code" jdbcType="VARCHAR"/>
<result property="fontName" column="font_name" jdbcType="VARCHAR"/>
<result property="remark" column="remark" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="INTEGER"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="update_time" column="updateTime" jdbcType="TIMESTAMP"/>
</resultMap>

<sql id="allColumns">
id,lang_code,font_name,remark,status,create_time,updateTime
</sql>

<sql id="dynamicWhereConditions">
where 1 = 1

<if test=" null != id ">
and `id` = #{id}
</if>

<if test=" null != langCode and '' != langCode">
and `lang_code` = #{langCode}
</if>
<if test=" null != fontName and '' != fontName">
and `font_name` = #{fontName}
</if>

<if test=" null != status ">
and `status` = #{status}
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>
<if test=" null != sortColumns">order by ${sortColumns}</if>
</sql>

<select id="findList" parameterType="com.iformall.domain.po.WxOcrModel" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from wx_ocr_model
<include refid="dynamicWhereConditions"/>
</select>

</mapper>

+ 7
- 0
mallinkSysAdmin/pom.xml 查看文件

@@ -39,6 +39,13 @@
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
<version>0.0.9</version>
</dependency>
<!-- ocr -->
<dependency>
<groupId>com.iformall</groupId>
<artifactId>mallinkOcr</artifactId>
<version>1.0</version>
</dependency>
</dependencies>



+ 3
- 0
mallinkSysAdmin/src/main/java/com/iformall/SysApplication.java 查看文件

@@ -34,6 +34,9 @@ public class SysApplication {
@Value("${fm.upload_dir}")
private String uploadDir;

@Value("${fm.ocr_data}")
private String ocrData;
@Bean
public boolean isFmException() {
return fmException;


+ 220
- 0
mallinkSysAdmin/src/main/java/com/iformall/controller/ocr/WxOcrController.java 查看文件

@@ -0,0 +1,220 @@
package com.iformall.controller.ocr;

import com.github.pagehelper.PageInfo;
import com.iformall.annotation.SystemControllerLog;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.controller.base.BaseController;
import com.iformall.domain.po.MallUserInfo;
import com.iformall.domain.po.WxMall;
import com.iformall.domain.po.WxMerchant;
import com.iformall.domain.po.WxMerchantOcrModel;
import com.iformall.domain.po.WxOcrModel;
import com.iformall.domain.po.base.TenantEntity;
import com.iformall.domain.po.base.BaseEntity.SortField;
import com.iformall.enums.EnumFromType;
import com.iformall.enums.EnumRentStartType;
import com.iformall.ocr.FormallTess4j;
import com.iformall.ocr.FormallTess4jTrain;
import com.iformall.service.WxMallService;
import com.iformall.service.WxMerchantService;
import com.iformall.service.WxOcrService;

import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("ocr")
public class WxOcrController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxOcrService ocrService;
@Autowired
private WxMerchantService merchantService;
@Autowired
private String ocrData;

/**
* 模板列表
* @param wxRentContract
* @param pageNum
* @param pageSize
* @return
*/
@GetMapping("/modelList")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
public ResultData modelList(@ModelAttribute WxOcrModel ocrModel, Integer pageNum, Integer pageSize) {
if (null == ocrModel) {
ocrModel = new WxOcrModel();
}
ocrModel.setSortColumns(SortField.Createtime_DESC);
PageInfo<WxOcrModel> page = ocrService.listOcrModelAsPage(ocrModel, pageNum, pageSize);
return new ResultData(page);
}

/**
* 更新模板
* @param wxRentContract
* @return
*/
@PostMapping("updateModel")
public ResultData updateModel(@RequestBody WxOcrModel ocrModel) {
return ocrService.saveOrUpdateOcrModel(ocrModel);
}

/**
* 根据商户查询模板
* @param wxRentContract
* @return
*/
@GetMapping("merchantModel")
@ApiImplicitParams({
@ApiImplicitParam(name = "merchantId", value = "商户编号", dataType = "Long", paramType = "query", required = true)
})
public ResultData merchantModel(Long merchantId) {
WxMerchant merchant = merchantService.getById(merchantId);
if (null == merchant) {
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"商户数据不存在");
}
return new ResultData(ocrService.getMerchantOcrModel(merchantId, merchant.getTenantId(), merchant.getParentTenantId()));
}
/**
* 更新商户模板
* @param wxRentContract
* @return
*/
@PostMapping("updateMerchantModel")
public ResultData updateMerchantModel(@RequestBody WxMerchantOcrModel merchantModel) {
return ocrService.saveOrUpdateMerchantOcrModel(merchantModel);
}
/**
* 删除商户模板
* @param wxRentContract
* @return
*/
@PostMapping("deleteMerchantModel")
public ResultData deleteMerchantModel(@RequestBody WxMerchantOcrModel merchantModel) {
return ocrService.deleteMerchantOcrModel(merchantModel.getId());
}

/**
* 获取训练步骤
* @return
*/
@GetMapping("getTrainSteps")
@ApiImplicitParams({
@ApiImplicitParam(name = "modelId", value = "模板编号", dataType = "Long", paramType = "query", required = true)
})
public ResultData getTrainSteps(Long modelId) {
WxOcrModel model = ocrService.getOcrModelById(modelId);
if (null == model) {
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"ocr模板不存在");
}
return new ResultData(FormallTess4jTrain.getTrainSteps(model.getLangCode(), model.getFontName()));
}
/**
*测试训练结果
* @return
*/
@PostMapping(value = "/testTrain", consumes = "multipart/*", headers = "content-type=multipart/form-data")
public ResultData testTrain(@RequestParam("file") MultipartFile multiReq,@RequestParam("modelId") Long modelId) {
try {
WxOcrModel model = ocrService.getOcrModelById(modelId);
if (null == model) {
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"ocr模板不存在");
}
File file = multipartFileToFile(multiReq);
String result = FormallTess4j.testDoOCR_File(ocrData, file, model.getFontName());
return new ResultData(result);

} catch (Exception e) {
logger.error("testTrain error.",e);
return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR.getCode(),"解析失败。"+e.getMessage());
}
}
private File multipartFileToFile(MultipartFile file) {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
try {
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
} catch (IOException e) {
logger.error("multipartFileToFile error.",e);
}finally {
if (null != ins) {
try {
ins.close();
} catch (IOException e) {
logger.error("multipartFileToFile error.",e);
}
}
}
}
return toFile;
}
private void inputStreamToFile(InputStream ins, File file) {
OutputStream os = null;
try {
os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
logger.error("inputStreamToFile error.",e);
}finally {
if (null != os) {
try {
os.close();
} catch (IOException e) {
logger.error("inputStreamToFile error.",e);
}
}
if (null != ins) {
try {
ins.close();
} catch (IOException e) {
logger.error("inputStreamToFile error.",e);
}
}
}
}



}

+ 1
- 0
mallinkSysAdmin/src/main/resources/application-dev.yml 查看文件

@@ -165,6 +165,7 @@ fm:
deploy: 1
open: true
upload_dir: /home/test/server/uploads/
ocr_data: /home/test/server/ocr_data/

ueditor:
config: config.json


+ 2
- 0
mallinkSysAdmin/src/main/resources/application-prod.yml 查看文件

@@ -122,12 +122,14 @@ fm:
deploy: 3
open: true
upload_dir: /root/uploads/
ocr_data: /root/ocr_data/

ueditor:
config: config.json
unified: true
upload-path: ./upload/
url-prefix: ""

logging:
level:


+ 1
- 0
mallinkSysAdmin/src/main/resources/application-test.yml-bak 查看文件

@@ -100,6 +100,7 @@ fm:
deploy: 2
open: true
upload_dir: /home/ec2-user/server/uploads/
ocr_data: /home/ec2-user/server/ocr_data/

ueditor:
config: config.json


正在加载...
取消
保存